|
7 | 7 | from openapi_spec_validator.exceptions import (
|
8 | 8 | ParameterDuplicateError, ExtraParametersError, UnresolvableParameterError,
|
9 | 9 | )
|
| 10 | +from openapi_spec_validator.factories import Draft4ExtendedValidatorFactory |
10 | 11 | from openapi_spec_validator.managers import ResolverManager
|
11 | 12 |
|
12 | 13 | log = logging.getLogger(__name__)
|
@@ -99,10 +100,10 @@ def __init__(self, dereferencer):
|
99 | 100 | def iter_errors(self, schemas):
|
100 | 101 | schemas_deref = self.dereferencer.dereference(schemas)
|
101 | 102 | for name, schema in iteritems(schemas_deref):
|
102 |
| - for err in self._iter_schem_errors(schema): |
| 103 | + for err in self._iter_schema_errors(schema): |
103 | 104 | yield err
|
104 | 105 |
|
105 |
| - def _iter_schem_errors(self, schema): |
| 106 | + def _iter_schema_errors(self, schema): |
106 | 107 | return SchemaValidator(self.dereferencer).iter_errors(schema)
|
107 | 108 |
|
108 | 109 |
|
@@ -132,6 +133,19 @@ def iter_errors(self, schema, require_properties=True):
|
132 | 133 | )
|
133 | 134 | )
|
134 | 135 |
|
| 136 | + if 'default' in schema_deref: |
| 137 | + default = schema_deref['default'] |
| 138 | + nullable = schema_deref.get('nullable', False) |
| 139 | + if default is not None or nullable is not True: |
| 140 | + for err in self._iter_value_errors(schema_deref, default): |
| 141 | + yield err |
| 142 | + |
| 143 | + def _iter_value_errors(self, schema, value): |
| 144 | + resolver = RefResolver.from_schema(schema) |
| 145 | + validator = Draft4ExtendedValidatorFactory.from_resolver(resolver) |
| 146 | + for err in validator(schema, resolver=resolver).iter_errors(value): |
| 147 | + yield err |
| 148 | + |
135 | 149 |
|
136 | 150 | class PathsValidator(object):
|
137 | 151 |
|
@@ -245,9 +259,31 @@ def iter_errors(self, parameters):
|
245 | 259 | seen = set()
|
246 | 260 | for parameter in parameters:
|
247 | 261 | parameter_deref = self.dereferencer.dereference(parameter)
|
| 262 | + for err in self._iter_parameter_errors(parameter_deref): |
| 263 | + yield err |
| 264 | + |
248 | 265 | key = (parameter_deref['name'], parameter_deref['in'])
|
249 | 266 | if key in seen:
|
250 | 267 | yield ParameterDuplicateError(
|
251 | 268 | "Duplicate parameter `{0}`".format(parameter_deref['name'])
|
252 | 269 | )
|
253 | 270 | seen.add(key)
|
| 271 | + |
| 272 | + def _iter_parameter_errors(self, parameter): |
| 273 | + return ParameterValidator(self.dereferencer).iter_errors(parameter) |
| 274 | + |
| 275 | + |
| 276 | +class ParameterValidator(object): |
| 277 | + |
| 278 | + def __init__(self, dereferencer): |
| 279 | + self.dereferencer = dereferencer |
| 280 | + |
| 281 | + def iter_errors(self, parameter): |
| 282 | + if 'schema' in parameter: |
| 283 | + schema = parameter['schema'] |
| 284 | + schema_deref = self.dereferencer.dereference(schema) |
| 285 | + for err in self._iter_schema_errors(schema_deref): |
| 286 | + yield err |
| 287 | + |
| 288 | + def _iter_schema_errors(self, schema): |
| 289 | + return SchemaValidator(self.dereferencer).iter_errors(schema) |
0 commit comments