Skip to content

Commit

Permalink
python-openapi/openapi-core#296: Implements OpenAPI 3.1 spec validator
Browse files Browse the repository at this point in the history
  • Loading branch information
nezhar committed Nov 3, 2021
1 parent 27ee7cf commit 79f5ed8
Show file tree
Hide file tree
Showing 11 changed files with 1,476 additions and 29 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/python-test.yml
Expand Up @@ -13,7 +13,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
python-version: [2.7, 3.5, 3.6, 3.7, 3.8, 3.9]
python-version: [3.7, 3.8, 3.9]
os: [windows-latest, ubuntu-latest]
fail-fast: false
steps:
Expand Down
37 changes: 31 additions & 6 deletions openapi_spec_validator/__init__.py
Expand Up @@ -4,7 +4,8 @@
)
from openapi_spec_validator.handlers import UrlHandler, FileObjectHandler
from openapi_spec_validator.schemas import get_openapi_schema
from openapi_spec_validator.factories import JSONSpecValidatorFactory
from openapi_spec_validator.factories import \
Draft202012JSONSpecValidatorFactory, Draft4JSONSpecValidatorFactory
from openapi_spec_validator.validators import SpecValidator

__author__ = 'Artur Maciag'
Expand All @@ -14,9 +15,15 @@
__license__ = 'Apache License, Version 2.0'

__all__ = [
'openapi_v2_spec_validator', 'openapi_v3_spec_validator',
'validate_v2_spec', 'validate_v3_spec', 'validate_spec',
'validate_v2_spec_url', 'validate_v3_spec_url', 'validate_spec_url',
'openapi_v2_spec_validator',
'openapi_v3_spec_validator',
'openapi_v31_spec_validator',
'validate_v2_spec',
'validate_v3_spec',
'validate_spec',
'validate_v2_spec_url',
'validate_v3_spec_url',
'validate_spec_url',
]

file_object_handler = FileObjectHandler()
Expand All @@ -30,7 +37,7 @@

# v2.0 spec
schema_v2, schema_v2_url = get_openapi_schema('2.0')
openapi_v2_validator_factory = JSONSpecValidatorFactory(
openapi_v2_validator_factory = Draft4JSONSpecValidatorFactory(
schema_v2, schema_v2_url,
resolver_handlers=default_handlers,
)
Expand All @@ -41,7 +48,7 @@

# v3.0 spec
schema_v3, schema_v3_url = get_openapi_schema('3.0')
openapi_v3_validator_factory = JSONSpecValidatorFactory(
openapi_v3_validator_factory = Draft4JSONSpecValidatorFactory(
schema_v3, schema_v3_url,
resolver_handlers=default_handlers,
)
Expand All @@ -50,6 +57,18 @@
resolver_handlers=default_handlers,
)

# v3.1 spec
schema_v31, schema_v31_url = get_openapi_schema('3.1')
openapi_v31_validator_factory = Draft202012JSONSpecValidatorFactory(
schema_v31, schema_v31_url,
resolver_handlers=default_handlers,
)
openapi_v31_spec_validator = SpecValidator(
openapi_v31_validator_factory,
resolver_handlers=default_handlers,
)


# shortcuts
validate_v2_spec = validate_spec_factory(openapi_v2_spec_validator.validate)
validate_v2_spec_url = validate_spec_url_factory(
Expand All @@ -59,6 +78,12 @@
validate_v3_spec_url = validate_spec_url_factory(
openapi_v3_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 version
validate_spec = validate_v3_spec
validate_spec_url = validate_v3_spec_url
33 changes: 29 additions & 4 deletions openapi_spec_validator/factories.py
@@ -1,6 +1,7 @@
"""OpenAPI spec validator factories module."""
from jsonschema import validators
from jsonschema.validators import Draft4Validator, RefResolver
from jsonschema.validators import Draft4Validator, RefResolver, \
Draft202012Validator

from openapi_spec_validator.generators import (
SpecValidatorsGeneratorFactory,
Expand Down Expand Up @@ -28,16 +29,15 @@ def _get_spec_validators(cls, spec_resolver):
return dict(list(generator))


class JSONSpecValidatorFactory:
class BaseJSONSpecValidatorFactory:
"""
Json documents validator factory against a json schema.
:param schema: schema for validation.
:param schema_url: schema base uri.
"""

schema_validator_class = Draft4Validator
spec_validator_factory = Draft4ExtendedValidatorFactory
schema_validator_class = None

def __init__(self, schema, schema_url='', resolver_handlers=None):
self.schema = schema
Expand All @@ -46,6 +46,17 @@ def __init__(self, schema, schema_url='', resolver_handlers=None):

self.schema_validator_class.check_schema(self.schema)


class Draft4JSONSpecValidatorFactory(BaseJSONSpecValidatorFactory):
"""
Json documents validator factory that uses Draft4Validator
:param schema: schema for validation.
:param schema_url: schema base uri.
"""
schema_validator_class = Draft4Validator
spec_validator_factory = Draft4ExtendedValidatorFactory

@property
def schema_resolver(self):
return self._get_resolver(self.schema_url, self.schema)
Expand All @@ -67,3 +78,17 @@ def create(self, spec_resolver):
def _get_resolver(self, base_uri, referrer):
return RefResolver(
base_uri, referrer, handlers=self.resolver_handlers)


class Draft202012JSONSpecValidatorFactory(BaseJSONSpecValidatorFactory):
"""
Json documents validator factory that uses Draft202012Validator
:param schema: schema for validation.
:param schema_url: schema base uri.
"""

schema_validator_class = Draft202012Validator

def create(self, spec_resolver):
return self.schema_validator_class(self.schema)
5 changes: 1 addition & 4 deletions openapi_spec_validator/readers.py
@@ -1,8 +1,5 @@
import os
try:
import pathlib
except ImportError:
import pathlib2 as pathlib
import pathlib
import sys

from openapi_spec_validator import all_urls_handler, file_object_handler
Expand Down

0 comments on commit 79f5ed8

Please sign in to comment.