diff --git a/doc/source/cli/cli.rst b/doc/source/cli/cli.rst index a02aa935..6c9a0ca9 100644 --- a/doc/source/cli/cli.rst +++ b/doc/source/cli/cli.rst @@ -337,6 +337,12 @@ Name of site. Where to output. +**-v/--validate** (Optional). Default is True. + +Whether to pre-validate documents using built-in schema validation. +Skips over externally registered DataSchema documents to avoid +false positives. + :: ./pegleg render site_name diff --git a/pegleg/cli.py b/pegleg/cli.py index 30d940da..61f1fe19 100644 --- a/pegleg/cli.py +++ b/pegleg/cli.py @@ -313,9 +313,19 @@ def show(*, output_stream, site_name): default=sys.stdout, show_default=True, help='Where to output.') +@click.option( + '-v', + '--validate', + 'validate', + is_flag=True, + default=True, + show_default=True, + help='Whether to pre-validate documents using built-in schema validation. ' + 'Skips over externally registered DataSchema documents to avoid ' + 'false positives.') @SITE_REPOSITORY_ARGUMENT -def render(*, output_stream, site_name): - engine.site.render(site_name, output_stream) +def render(*, output_stream, site_name, validate): + engine.site.render(site_name, output_stream, validate) @site.command('lint', help='Lint a given site in a repository') diff --git a/pegleg/engine/site.py b/pegleg/engine/site.py index 390ea50d..075cc98b 100644 --- a/pegleg/engine/site.py +++ b/pegleg/engine/site.py @@ -83,14 +83,14 @@ def collect(site_name, save_location): _collect_to_stdout(site_name) -def render(site_name, output_stream): +def render(site_name, output_stream, validate): documents = [] for filename in util.definition.site_files(site_name): with open(filename) as f: documents.extend(list(yaml.safe_load_all(f))) rendered_documents, errors = util.deckhand.deckhand_render( - documents=documents) + documents=documents, validate=validate) err_msg = '' if errors: for err in errors: diff --git a/pegleg/engine/util/deckhand.py b/pegleg/engine/util/deckhand.py index 8fb244fc..3e239c9b 100644 --- a/pegleg/engine/util/deckhand.py +++ b/pegleg/engine/util/deckhand.py @@ -13,6 +13,7 @@ # limitations under the License. +from deckhand.engine import document_validation from deckhand.engine import layering from deckhand import errors as dh_errors @@ -43,7 +44,7 @@ def load_schemas_from_docs(documents): def deckhand_render(documents=None, fail_on_missing_sub_src=False, - validate=False): + validate=True): documents = documents or [] errors = [] rendered_documents = [] @@ -57,6 +58,17 @@ def deckhand_render(documents=None, fail_on_missing_sub_src=fail_on_missing_sub_src, validate=validate) rendered_documents = [dict(d) for d in deckhand_eng.render()] + if validate: + validator = document_validation.DocumentValidation( + rendered_documents) + results = validator.validate_all() + for result in results: + if result['errors']: + errors.append( + (DECKHAND_RENDER_EXCEPTION, + 'During rendering Deckhand was unable to validate ' + 'the following document, details: %s.' % ( + result['errors']))) except dh_errors.DeckhandException as e: errors.append( (DECKHAND_RENDER_EXCEPTION,