|
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