From d230b673783fafae2ebbcbf658f753f53599a54e Mon Sep 17 00:00:00 2001 From: p1c2u Date: Tue, 25 Jul 2023 20:22:47 +0100 Subject: [PATCH 1/2] Allow to validate multiple files --- openapi_spec_validator/__main__.py | 85 +++++++++++++++++------------- 1 file changed, 49 insertions(+), 36 deletions(-) diff --git a/openapi_spec_validator/__main__.py b/openapi_spec_validator/__main__.py index 25aecf6..54aae77 100644 --- a/openapi_spec_validator/__main__.py +++ b/openapi_spec_validator/__main__.py @@ -21,11 +21,18 @@ ) +def print_ok(filename: str) -> None: + print(f"{filename}: OK") + + +def print_error(filename: str, exc: Exception) -> None: + print(f"{filename}: Error: {exc}") + + def print_validationerror( - exc: ValidationError, errors: str = "best-match" + filename: str, exc: ValidationError, errors: str = "best-match" ) -> None: - print("# Validation Error\n") - print(exc) + print(f"{filename}: Validation Error: {exc}") if exc.cause: print("\n# Cause\n") print(exc.cause) @@ -46,7 +53,11 @@ def print_validationerror( def main(args: Optional[Sequence[str]] = None) -> None: parser = ArgumentParser() - parser.add_argument("filename", help="Absolute or relative path to file") + parser.add_argument( + "file", + nargs="+", + help="Validate specified file(s).", + ) parser.add_argument( "--errors", choices=("best-match", "all"), @@ -63,38 +74,40 @@ def main(args: Optional[Sequence[str]] = None) -> None: ) args_parsed = parser.parse_args(args) - # choose source - reader = read_from_filename - if args_parsed.filename in ["-", "/-"]: - reader = read_from_stdin - - # read source - try: - spec, spec_url = reader(args_parsed.filename) - except Exception as exc: - print(exc) - sys.exit(1) - - # choose the validator - validators = { - "2.0": openapi_v2_spec_validator, - "3.0.0": openapi_v30_spec_validator, - "3.1.0": openapi_v31_spec_validator, - "detect": openapi_spec_validator_proxy, - } - validator = validators[args_parsed.schema] - - # validate - try: - validator.validate(spec, spec_url=spec_url) - except ValidationError as exc: - print_validationerror(exc, args_parsed.errors) - sys.exit(1) - except Exception as exc: - print(exc) - sys.exit(2) - else: - print("OK") + for filename in args_parsed.file: + # choose source + reader = read_from_filename + if filename in ["-", "/-"]: + filename = "stdin" + reader = read_from_stdin + + # read source + try: + spec, spec_url = reader(filename) + except Exception as exc: + print(exc) + sys.exit(1) + + # choose the validator + validators = { + "2.0": openapi_v2_spec_validator, + "3.0.0": openapi_v30_spec_validator, + "3.1.0": openapi_v31_spec_validator, + "detect": openapi_spec_validator_proxy, + } + validator = validators[args_parsed.schema] + + # validate + try: + validator.validate(spec, spec_url=spec_url) + except ValidationError as exc: + print_validationerror(filename, exc, args_parsed.errors) + sys.exit(1) + except Exception as exc: + print_error(filename, exc) + sys.exit(2) + else: + print_ok(filename) if __name__ == "__main__": From d0489ecc0384c58fa3781ccabd8d8ab35eb32cb4 Mon Sep 17 00:00:00 2001 From: p1c2u Date: Tue, 25 Jul 2023 20:24:15 +0100 Subject: [PATCH 2/2] Deprecate minor schema versions as arguments --- openapi_spec_validator/__main__.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/openapi_spec_validator/__main__.py b/openapi_spec_validator/__main__.py index 54aae77..cbba8ad 100644 --- a/openapi_spec_validator/__main__.py +++ b/openapi_spec_validator/__main__.py @@ -67,10 +67,11 @@ def main(args: Optional[Sequence[str]] = None) -> None: ) parser.add_argument( "--schema", - help="OpenAPI schema (default: detect)", type=str, - choices=["2.0", "3.0.0", "3.1.0", "detect"], + choices=["detect", "2.0", "3.0", "3.1", "3.0.0", "3.1.0"], default="detect", + metavar="{detect,2.0,3.0,3.1}", + help="OpenAPI schema version (default: detect).", ) args_parsed = parser.parse_args(args) @@ -90,10 +91,13 @@ def main(args: Optional[Sequence[str]] = None) -> None: # choose the validator validators = { + "detect": openapi_spec_validator_proxy, "2.0": openapi_v2_spec_validator, + "3.0": openapi_v30_spec_validator, + "3.1": openapi_v31_spec_validator, + # backward compatibility "3.0.0": openapi_v30_spec_validator, "3.1.0": openapi_v31_spec_validator, - "detect": openapi_spec_validator_proxy, } validator = validators[args_parsed.schema]