From 70325f638001c615909978381bb48ad3d924dafd Mon Sep 17 00:00:00 2001 From: p1c2u Date: Thu, 1 Sep 2022 10:42:08 +0100 Subject: [PATCH] schemas and validation refactor --- openapi_spec_validator/__init__.py | 37 ++-------------- openapi_spec_validator/__main__.py | 2 +- openapi_spec_validator/schemas/__init__.py | 11 +++++ .../{schemas.py => schemas/utils.py} | 4 +- openapi_spec_validator/validation/__init__.py | 44 +++++++++++++++++++ .../{ => validation}/decorators.py | 2 +- .../{ => validation}/exceptions.py | 0 .../{ => validation}/validators.py | 11 ++--- tests/integration/test_errors.py | 2 +- tests/integration/test_shortcuts.py | 2 +- tests/integration/test_validators.py | 2 +- 11 files changed, 72 insertions(+), 45 deletions(-) create mode 100644 openapi_spec_validator/schemas/__init__.py rename openapi_spec_validator/{schemas.py => schemas/utils.py} (84%) create mode 100644 openapi_spec_validator/validation/__init__.py rename openapi_spec_validator/{ => validation}/decorators.py (91%) rename openapi_spec_validator/{ => validation}/exceptions.py (100%) rename openapi_spec_validator/{ => validation}/validators.py (95%) diff --git a/openapi_spec_validator/__init__.py b/openapi_spec_validator/__init__.py index 403121c..aaf4a3a 100644 --- a/openapi_spec_validator/__init__.py +++ b/openapi_spec_validator/__init__.py @@ -1,15 +1,13 @@ # -*- coding: utf-8 -*- -from jsonschema.validators import Draft202012Validator -from jsonschema.validators import Draft4Validator from jsonschema_spec.handlers import default_handlers -from openapi_schema_validator.validators import OAS30Validator -from openapi_schema_validator.validators import OAS31Validator from openapi_spec_validator.shortcuts import ( validate_spec_factory, validate_spec_url_factory, ) -from openapi_spec_validator.schemas import get_openapi_schema -from openapi_spec_validator.validators import SpecValidator +from openapi_spec_validator.validation import openapi_v2_spec_validator +from openapi_spec_validator.validation import openapi_v3_spec_validator +from openapi_spec_validator.validation import openapi_v30_spec_validator +from openapi_spec_validator.validation import openapi_v31_spec_validator __author__ = 'Artur Maciag' __email__ = 'maciag.artur@gmail.com' @@ -34,30 +32,6 @@ 'validate_spec_url', ] -# v2.0 spec -schema_v2, _ = get_openapi_schema('2.0') -openapi_v2_schema_validator = Draft4Validator(schema_v2) -openapi_v2_spec_validator = SpecValidator( - openapi_v2_schema_validator, OAS30Validator, - resolver_handlers=default_handlers, -) - -# v3.0 spec -schema_v30, _ = get_openapi_schema('3.0') -openapi_v30_schema_validator = Draft4Validator(schema_v30) -openapi_v30_spec_validator = SpecValidator( - openapi_v30_schema_validator, OAS30Validator, - resolver_handlers=default_handlers, -) - -# v3.1 spec -schema_v31, _ = get_openapi_schema('3.1') -openapi_v31_schema_validator = Draft202012Validator(schema_v31) -openapi_v31_spec_validator = SpecValidator( - openapi_v31_schema_validator, OAS31Validator, - resolver_handlers=default_handlers, -) - # shortcuts validate_v2_spec = validate_spec_factory(openapi_v2_spec_validator.validate) validate_v2_spec_url = validate_spec_url_factory( @@ -67,14 +41,11 @@ validate_v30_spec_url = validate_spec_url_factory( openapi_v30_spec_validator.validate, default_handlers) - validate_v31_spec = validate_spec_factory(openapi_v31_spec_validator.validate) validate_v31_spec_url = validate_spec_url_factory( openapi_v31_spec_validator.validate, default_handlers) # aliases to the latest v3 version -schema_v3 = schema_v31 -openapi_v3_spec_validator = openapi_v31_spec_validator validate_v3_spec = validate_v31_spec validate_v3_spec_url = validate_v31_spec_url diff --git a/openapi_spec_validator/__main__.py b/openapi_spec_validator/__main__.py index 9ef3478..0fa2cc5 100644 --- a/openapi_spec_validator/__main__.py +++ b/openapi_spec_validator/__main__.py @@ -9,7 +9,7 @@ openapi_v30_spec_validator, openapi_v31_spec_validator, ) -from openapi_spec_validator.exceptions import ValidationError +from openapi_spec_validator.validation.exceptions import ValidationError from openapi_spec_validator.readers import read_from_stdin, read_from_filename logger = logging.getLogger(__name__) diff --git a/openapi_spec_validator/schemas/__init__.py b/openapi_spec_validator/schemas/__init__.py new file mode 100644 index 0000000..8858b78 --- /dev/null +++ b/openapi_spec_validator/schemas/__init__.py @@ -0,0 +1,11 @@ +"""OpenAIP spec validator schemas module.""" +from openapi_spec_validator.schemas.utils import get_schema + +__all__ = ["schema_v2", "schema_v3", "schema_v30", "schema_v31"] + +schema_v2, _ = get_schema('2.0') +schema_v30, _ = get_schema('3.0') +schema_v31, _ = get_schema('3.1') + +# alias to the latest v3 version +schema_v3 = schema_v31 diff --git a/openapi_spec_validator/schemas.py b/openapi_spec_validator/schemas/utils.py similarity index 84% rename from openapi_spec_validator/schemas.py rename to openapi_spec_validator/schemas/utils.py index 025da2e..d7666de 100644 --- a/openapi_spec_validator/schemas.py +++ b/openapi_spec_validator/schemas/utils.py @@ -1,4 +1,4 @@ -"""OpenAIP spec validator schemas module.""" +"""OpenAIP spec validator schemas utils module.""" from os import path import importlib_resources @@ -6,7 +6,7 @@ from jsonschema_spec.readers import FilePathReader -def get_openapi_schema(version): +def get_schema(version): schema_path = 'resources/schemas/v{0}/schema.json'.format(version) ref = importlib_resources.files('openapi_spec_validator') / schema_path with importlib_resources.as_file(ref) as resource_path: diff --git a/openapi_spec_validator/validation/__init__.py b/openapi_spec_validator/validation/__init__.py new file mode 100644 index 0000000..13bc218 --- /dev/null +++ b/openapi_spec_validator/validation/__init__.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +from jsonschema.validators import Draft202012Validator +from jsonschema.validators import Draft4Validator +from jsonschema_spec.handlers import default_handlers +from openapi_schema_validator import oas30_format_checker +from openapi_schema_validator import oas31_format_checker +from openapi_schema_validator.validators import OAS30Validator +from openapi_schema_validator.validators import OAS31Validator + +from openapi_spec_validator.schemas import schema_v2 +from openapi_spec_validator.schemas import schema_v30 +from openapi_spec_validator.schemas import schema_v31 +from openapi_spec_validator.validation.validators import SpecValidator + +__all__ = [ + 'openapi_v2_spec_validator', + 'openapi_v3_spec_validator', + 'openapi_v30_spec_validator', + 'openapi_v31_spec_validator', +] + +# v2.0 spec +openapi_v2_schema_validator = Draft4Validator(schema_v2) +openapi_v2_spec_validator = SpecValidator( + openapi_v2_schema_validator, OAS30Validator, oas30_format_checker, + resolver_handlers=default_handlers, +) + +# v3.0 spec +openapi_v30_schema_validator = Draft4Validator(schema_v30) +openapi_v30_spec_validator = SpecValidator( + openapi_v30_schema_validator, OAS30Validator, oas30_format_checker, + resolver_handlers=default_handlers, +) + +# v3.1 spec +openapi_v31_schema_validator = Draft202012Validator(schema_v31) +openapi_v31_spec_validator = SpecValidator( + openapi_v31_schema_validator, OAS31Validator, oas31_format_checker, + resolver_handlers=default_handlers, +) + +# alias to the latest v3 version +openapi_v3_spec_validator = openapi_v31_spec_validator diff --git a/openapi_spec_validator/decorators.py b/openapi_spec_validator/validation/decorators.py similarity index 91% rename from openapi_spec_validator/decorators.py rename to openapi_spec_validator/validation/decorators.py index 14f163f..3f4744a 100644 --- a/openapi_spec_validator/decorators.py +++ b/openapi_spec_validator/validation/decorators.py @@ -1,4 +1,4 @@ -"""OpenAPI spec validator decorators module.""" +"""OpenAPI spec validator validation decorators module.""" from functools import wraps import logging diff --git a/openapi_spec_validator/exceptions.py b/openapi_spec_validator/validation/exceptions.py similarity index 100% rename from openapi_spec_validator/exceptions.py rename to openapi_spec_validator/validation/exceptions.py diff --git a/openapi_spec_validator/validators.py b/openapi_spec_validator/validation/validators.py similarity index 95% rename from openapi_spec_validator/validators.py rename to openapi_spec_validator/validation/validators.py index 56f857c..5b3cde1 100644 --- a/openapi_spec_validator/validators.py +++ b/openapi_spec_validator/validation/validators.py @@ -1,16 +1,16 @@ +"""OpenAPI spec validator validation validators module.""" import logging import string from jsonschema.validators import RefResolver from jsonschema_spec.accessors import SpecAccessor from jsonschema_spec.paths import Spec -from openapi_schema_validator import OAS31Validator, oas31_format_checker -from openapi_spec_validator.exceptions import ( +from openapi_spec_validator.validation.exceptions import ( ParameterDuplicateError, ExtraParametersError, UnresolvableParameterError, OpenAPIValidationError, DuplicateOperationIDError, ) -from openapi_spec_validator.decorators import ValidationErrorWrapper +from openapi_spec_validator.validation.decorators import ValidationErrorWrapper log = logging.getLogger(__name__) @@ -27,9 +27,10 @@ class SpecValidator(object): 'get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace', ] - def __init__(self, schema_validator, value_validator_class, resolver_handlers=None): + def __init__(self, schema_validator, value_validator_class, value_validator_format_checker, resolver_handlers=None): self.schema_validator = schema_validator self.value_validator_class = value_validator_class + self.value_validator_format_checker = value_validator_format_checker self.resolver_handlers = resolver_handlers self.operation_ids_registry = None @@ -141,7 +142,7 @@ def _iter_value_errors(self, schema, value): validator = self.value_validator_class( content, resolver=self.resolver, - format_checker=oas31_format_checker, + format_checker=self.value_validator_format_checker, ) yield from validator.iter_errors(value) diff --git a/tests/integration/test_errors.py b/tests/integration/test_errors.py index 03d3ef2..0841aa8 100644 --- a/tests/integration/test_errors.py +++ b/tests/integration/test_errors.py @@ -1,4 +1,4 @@ -from openapi_spec_validator.exceptions import ( +from openapi_spec_validator.validation.exceptions import ( ExtraParametersError, UnresolvableParameterError, OpenAPIValidationError, DuplicateOperationIDError, ) diff --git a/tests/integration/test_shortcuts.py b/tests/integration/test_shortcuts.py index 9f8b07f..d5aa085 100644 --- a/tests/integration/test_shortcuts.py +++ b/tests/integration/test_shortcuts.py @@ -7,7 +7,7 @@ openapi_v2_spec_validator, openapi_v30_spec_validator, validate_v30_spec_url, validate_v30_spec, ) -from openapi_spec_validator.exceptions import OpenAPIValidationError +from openapi_spec_validator.validation.exceptions import OpenAPIValidationError class TestLocalOpenAPIv20Validator: diff --git a/tests/integration/test_validators.py b/tests/integration/test_validators.py index 6e95b3d..4cee021 100644 --- a/tests/integration/test_validators.py +++ b/tests/integration/test_validators.py @@ -1,6 +1,6 @@ import pytest -from openapi_spec_validator.exceptions import OpenAPIValidationError +from openapi_spec_validator.validation.exceptions import OpenAPIValidationError class TestLocalOpenAPIv30Validator: