Skip to content

Commit 0b869a7

Browse files
authored
Merge pull request #91 from hlobit/master
Repair default and $ref issue
2 parents 5521114 + 0144b5b commit 0b869a7

File tree

4 files changed

+64
-12
lines changed

4 files changed

+64
-12
lines changed

openapi_spec_validator/validators.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
import string
33

44
from jsonschema.validators import RefResolver
5+
from openapi_schema_validator import OAS30Validator, oas30_format_checker
56
from six import iteritems
67

78
from openapi_spec_validator.exceptions import (
89
ParameterDuplicateError, ExtraParametersError, UnresolvableParameterError,
910
OpenAPIValidationError, DuplicateOperationIDError,
1011
)
1112
from openapi_spec_validator.decorators import ValidationErrorWrapper
12-
from openapi_spec_validator.factories import Draft4ExtendedValidatorFactory
1313
from openapi_spec_validator.managers import ResolverManager
1414

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

151151
def _iter_value_errors(self, schema, value):
152-
resolver = RefResolver.from_schema(schema)
153-
validator = Draft4ExtendedValidatorFactory.from_resolver(resolver)
154-
for err in validator(schema, resolver=resolver).iter_errors(value):
155-
yield err
152+
return ValueValidator(self.dereferencer).iter_errors(schema, value)
156153

157154

158155
class PathsValidator(object):
@@ -327,10 +324,23 @@ def iter_errors(self, parameter):
327324
yield err
328325

329326
def _iter_value_errors(self, schema, value):
330-
resolver = RefResolver.from_schema(schema)
331-
validator = Draft4ExtendedValidatorFactory.from_resolver(resolver)
332-
for err in validator(schema, resolver=resolver).iter_errors(value):
333-
yield err
327+
return ValueValidator(self.dereferencer).iter_errors(schema, value)
334328

335329
def _iter_schema_errors(self, schema):
336330
return SchemaValidator(self.dereferencer).iter_errors(schema)
331+
332+
333+
class ValueValidator(object):
334+
335+
def __init__(self, dereferencer):
336+
self.dereferencer = dereferencer
337+
338+
@wraps_errors
339+
def iter_errors(self, schema, value):
340+
validator = OAS30Validator(
341+
schema,
342+
resolver=self.dereferencer.resolver_manager.resolver,
343+
format_checker=oas30_format_checker,
344+
)
345+
for err in validator.iter_errors(value):
346+
yield err

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
jsonschema
2+
openapi-schema-validator
23
PyYAML==4.2b4
34
six==1.12.0
45
requests

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ setup_requires =
2626
setuptools
2727
install_requires =
2828
jsonschema
29+
openapi-schema-validator
2930
PyYAML>=5.1
3031
six
3132
pathlib2; python_version<"3.0"

tests/integration/test_validators.py

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ def test_default_value_wrong_type(self, validator):
235235
assert len(errors_list) == 1
236236
assert errors_list[0].__class__ == OpenAPIValidationError
237237
assert errors_list[0].message == (
238-
"'invaldtype' is not of type 'integer'"
238+
"'invaldtype' is not of type integer"
239239
)
240240

241241
def test_parameter_default_value_wrong_type(self, validator):
@@ -270,7 +270,7 @@ def test_parameter_default_value_wrong_type(self, validator):
270270
assert len(errors_list) == 1
271271
assert errors_list[0].__class__ == OpenAPIValidationError
272272
assert errors_list[0].message == (
273-
"'invaldtype' is not of type 'integer'"
273+
"'invaldtype' is not of type integer"
274274
)
275275

276276
def test_parameter_default_value_wrong_type_swagger(self,
@@ -309,5 +309,45 @@ def test_parameter_default_value_wrong_type_swagger(self,
309309
assert len(errors_list) == 1
310310
assert errors_list[0].__class__ == OpenAPIValidationError
311311
assert errors_list[0].message == (
312-
"'invaldtype' is not of type 'integer'"
312+
"'invaldtype' is not of type integer"
313313
)
314+
315+
def test_parameter_default_value_with_reference(self, validator):
316+
spec = {
317+
'openapi': '3.0.0',
318+
'info': {
319+
'title': 'Test Api',
320+
'version': '0.0.1',
321+
},
322+
'paths': {
323+
'/test/': {
324+
'get': {
325+
'responses': {},
326+
'parameters': [
327+
{
328+
'name': 'param1',
329+
'in': 'query',
330+
'schema': {
331+
'allOf': [{
332+
'$ref': '#/components/schemas/type',
333+
}],
334+
'default': 1,
335+
},
336+
},
337+
],
338+
},
339+
},
340+
},
341+
'components': {
342+
'schemas': {
343+
'type': {
344+
'type': 'integer',
345+
}
346+
},
347+
},
348+
}
349+
350+
errors = validator.iter_errors(spec)
351+
352+
errors_list = list(errors)
353+
assert errors_list == []

0 commit comments

Comments
 (0)