Skip to content

Commit

Permalink
Merge pull request #91 from hlobit/master
Browse files Browse the repository at this point in the history
Repair default and $ref issue
  • Loading branch information
p1c2u committed Feb 19, 2021
2 parents 5521114 + 0144b5b commit 0b869a7
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 12 deletions.
28 changes: 19 additions & 9 deletions openapi_spec_validator/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
import string

from jsonschema.validators import RefResolver
from openapi_schema_validator import OAS30Validator, oas30_format_checker
from six import iteritems

from openapi_spec_validator.exceptions import (
ParameterDuplicateError, ExtraParametersError, UnresolvableParameterError,
OpenAPIValidationError, DuplicateOperationIDError,
)
from openapi_spec_validator.decorators import ValidationErrorWrapper
from openapi_spec_validator.factories import Draft4ExtendedValidatorFactory
from openapi_spec_validator.managers import ResolverManager

log = logging.getLogger(__name__)
Expand Down Expand Up @@ -149,10 +149,7 @@ def iter_errors(self, schema, require_properties=True):
yield err

def _iter_value_errors(self, schema, value):
resolver = RefResolver.from_schema(schema)
validator = Draft4ExtendedValidatorFactory.from_resolver(resolver)
for err in validator(schema, resolver=resolver).iter_errors(value):
yield err
return ValueValidator(self.dereferencer).iter_errors(schema, value)


class PathsValidator(object):
Expand Down Expand Up @@ -327,10 +324,23 @@ def iter_errors(self, parameter):
yield err

def _iter_value_errors(self, schema, value):
resolver = RefResolver.from_schema(schema)
validator = Draft4ExtendedValidatorFactory.from_resolver(resolver)
for err in validator(schema, resolver=resolver).iter_errors(value):
yield err
return ValueValidator(self.dereferencer).iter_errors(schema, value)

def _iter_schema_errors(self, schema):
return SchemaValidator(self.dereferencer).iter_errors(schema)


class ValueValidator(object):

def __init__(self, dereferencer):
self.dereferencer = dereferencer

@wraps_errors
def iter_errors(self, schema, value):
validator = OAS30Validator(
schema,
resolver=self.dereferencer.resolver_manager.resolver,
format_checker=oas30_format_checker,
)
for err in validator.iter_errors(value):
yield err
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
jsonschema
openapi-schema-validator
PyYAML==4.2b4
six==1.12.0
requests
1 change: 1 addition & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ setup_requires =
setuptools
install_requires =
jsonschema
openapi-schema-validator
PyYAML>=5.1
six
pathlib2; python_version<"3.0"
Expand Down
46 changes: 43 additions & 3 deletions tests/integration/test_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ def test_default_value_wrong_type(self, validator):
assert len(errors_list) == 1
assert errors_list[0].__class__ == OpenAPIValidationError
assert errors_list[0].message == (
"'invaldtype' is not of type 'integer'"
"'invaldtype' is not of type integer"
)

def test_parameter_default_value_wrong_type(self, validator):
Expand Down Expand Up @@ -270,7 +270,7 @@ def test_parameter_default_value_wrong_type(self, validator):
assert len(errors_list) == 1
assert errors_list[0].__class__ == OpenAPIValidationError
assert errors_list[0].message == (
"'invaldtype' is not of type 'integer'"
"'invaldtype' is not of type integer"
)

def test_parameter_default_value_wrong_type_swagger(self,
Expand Down Expand Up @@ -309,5 +309,45 @@ def test_parameter_default_value_wrong_type_swagger(self,
assert len(errors_list) == 1
assert errors_list[0].__class__ == OpenAPIValidationError
assert errors_list[0].message == (
"'invaldtype' is not of type 'integer'"
"'invaldtype' is not of type integer"
)

def test_parameter_default_value_with_reference(self, validator):
spec = {
'openapi': '3.0.0',
'info': {
'title': 'Test Api',
'version': '0.0.1',
},
'paths': {
'/test/': {
'get': {
'responses': {},
'parameters': [
{
'name': 'param1',
'in': 'query',
'schema': {
'allOf': [{
'$ref': '#/components/schemas/type',
}],
'default': 1,
},
},
],
},
},
},
'components': {
'schemas': {
'type': {
'type': 'integer',
}
},
},
}

errors = validator.iter_errors(spec)

errors_list = list(errors)
assert errors_list == []

0 comments on commit 0b869a7

Please sign in to comment.