-
-
Notifications
You must be signed in to change notification settings - Fork 72
Expand file tree
/
Copy pathvalidators.py
More file actions
179 lines (157 loc) · 6.55 KB
/
validators.py
File metadata and controls
179 lines (157 loc) · 6.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
"""OpenAPI spec validator validation validators module."""
import logging
import warnings
from collections.abc import Iterator
from collections.abc import Mapping
from functools import lru_cache
from typing import cast
from jsonschema.exceptions import ValidationError
from jsonschema.protocols import Validator
from jsonschema_path.handlers import default_handlers
from jsonschema_path.paths import SchemaPath
from openapi_spec_validator.schemas import openapi_v2_schema_validator
from openapi_spec_validator.schemas import openapi_v30_schema_validator
from openapi_spec_validator.schemas import openapi_v31_schema_validator
from openapi_spec_validator.schemas import openapi_v32_schema_validator
from openapi_spec_validator.schemas.types import AnySchema
from openapi_spec_validator.settings import OpenAPISpecValidatorSettings
from openapi_spec_validator.validation import keywords
from openapi_spec_validator.validation.decorators import unwraps_iter
from openapi_spec_validator.validation.decorators import wraps_cached_iter
from openapi_spec_validator.validation.decorators import wraps_errors
from openapi_spec_validator.validation.registries import (
KeywordValidatorRegistry,
)
log = logging.getLogger(__name__)
class SpecValidator:
resolver_handlers = default_handlers
keyword_validators: Mapping[str, type[keywords.KeywordValidator]] = {
"__root__": keywords.RootValidator,
}
root_keywords: list[str] = []
schema_validator: Validator = NotImplemented
def __init__(
self,
schema: AnySchema,
base_uri: str = "",
spec_url: str | None = None,
) -> None:
if spec_url is not None:
warnings.warn(
"spec_url parameter is deprecated. " "Use base_uri instead.",
DeprecationWarning,
)
base_uri = spec_url
self.base_uri = base_uri
if isinstance(schema, SchemaPath):
self.schema_path = schema
self.schema = schema.read_value()
else:
settings = OpenAPISpecValidatorSettings()
self.schema = schema
self.schema_path = SchemaPath.from_dict(
self.schema,
base_uri=self.base_uri,
handlers=self.resolver_handlers,
resolved_cache_maxsize=settings.resolved_cache_maxsize,
)
self.keyword_validators_registry = KeywordValidatorRegistry(
self.keyword_validators
)
def validate(self) -> None:
for err in self.iter_errors():
raise err
def is_valid(self) -> bool:
error = next(self.iter_errors(), None)
return error is None
@property
def root_validator(self) -> keywords.RootValidator:
return cast(
keywords.RootValidator,
self.keyword_validators_registry["__root__"],
)
@unwraps_iter
@lru_cache(maxsize=None)
@wraps_cached_iter
@wraps_errors
def iter_errors(self) -> Iterator[ValidationError]:
yield from self.schema_validator.iter_errors(self.schema)
yield from self.root_validator(self.schema_path)
class OpenAPIV2SpecValidator(SpecValidator):
schema_validator = openapi_v2_schema_validator
keyword_validators = {
"__root__": keywords.RootValidator,
"components": keywords.ComponentsValidator,
"default": keywords.OpenAPIV30ValueValidator,
"operation": keywords.OperationValidator,
"parameter": keywords.OpenAPIV2ParameterValidator,
"parameters": keywords.ParametersValidator,
"paths": keywords.PathsValidator,
"path": keywords.PathValidator,
"response": keywords.OpenAPIV2ResponseValidator,
"responses": keywords.ResponsesValidator,
"schema": keywords.OpenAPIV30SchemaValidator,
"schemas": keywords.SchemasValidator,
"tags": keywords.TagsValidator,
}
root_keywords = ["paths", "components"]
class OpenAPIV30SpecValidator(SpecValidator):
schema_validator = openapi_v30_schema_validator
keyword_validators = {
"__root__": keywords.RootValidator,
"components": keywords.ComponentsValidator,
"content": keywords.ContentValidator,
"default": keywords.OpenAPIV30ValueValidator,
"mediaType": keywords.MediaTypeValidator,
"operation": keywords.OperationValidator,
"parameter": keywords.ParameterValidator,
"parameters": keywords.ParametersValidator,
"paths": keywords.PathsValidator,
"path": keywords.PathValidator,
"response": keywords.OpenAPIV3ResponseValidator,
"responses": keywords.ResponsesValidator,
"schema": keywords.OpenAPIV30SchemaValidator,
"schemas": keywords.SchemasValidator,
"tags": keywords.TagsValidator,
}
root_keywords = ["paths", "components"]
class OpenAPIV31SpecValidator(SpecValidator):
schema_validator = openapi_v31_schema_validator
keyword_validators = {
"__root__": keywords.RootValidator,
"components": keywords.ComponentsValidator,
"content": keywords.ContentValidator,
"default": keywords.OpenAPIV31ValueValidator,
"mediaType": keywords.MediaTypeValidator,
"operation": keywords.OperationValidator,
"parameter": keywords.ParameterValidator,
"parameters": keywords.ParametersValidator,
"paths": keywords.PathsValidator,
"path": keywords.PathValidator,
"response": keywords.OpenAPIV3ResponseValidator,
"responses": keywords.ResponsesValidator,
"schema": keywords.OpenAPIV31SchemaValidator,
"schemas": keywords.SchemasValidator,
"tags": keywords.TagsValidator,
}
root_keywords = ["paths", "components"]
class OpenAPIV32SpecValidator(SpecValidator):
schema_validator = openapi_v32_schema_validator
keyword_validators = {
"__root__": keywords.RootValidator,
"components": keywords.ComponentsValidator,
"content": keywords.ContentValidator,
"default": keywords.OpenAPIV32ValueValidator,
"mediaType": keywords.MediaTypeValidator,
"operation": keywords.OperationValidator,
"parameter": keywords.ParameterValidator,
"parameters": keywords.ParametersValidator,
"paths": keywords.PathsValidator,
"path": keywords.OpenAPIV32PathValidator,
"response": keywords.OpenAPIV3ResponseValidator,
"responses": keywords.ResponsesValidator,
"schema": keywords.OpenAPIV32SchemaValidator,
"schemas": keywords.SchemasValidator,
"tags": keywords.OpenAPIV32TagsValidator,
}
root_keywords = ["paths", "components"]