Skip to content

Commit eeff41a

Browse files
committed
Validator accept any schema
1 parent e450e39 commit eeff41a

File tree

5 files changed

+30
-19
lines changed

5 files changed

+30
-19
lines changed
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from typing import Union
2+
3+
from jsonschema_path.paths import SchemaPath
4+
from jsonschema_path.typing import Schema
5+
6+
AnySchema = Union[Schema, SchemaPath]

openapi_spec_validator/validation/validators.py

+13-13
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from openapi_spec_validator.schemas import openapi_v2_schema_validator
1919
from openapi_spec_validator.schemas import openapi_v30_schema_validator
2020
from openapi_spec_validator.schemas import openapi_v31_schema_validator
21+
from openapi_spec_validator.schemas.types import AnySchema
2122
from openapi_spec_validator.validation import keywords
2223
from openapi_spec_validator.validation.decorators import unwraps_iter
2324
from openapi_spec_validator.validation.decorators import wraps_cached_iter
@@ -39,11 +40,10 @@ class SpecValidator:
3940

4041
def __init__(
4142
self,
42-
schema: Schema,
43+
schema: AnySchema,
4344
base_uri: str = "",
4445
spec_url: Optional[str] = None,
4546
) -> None:
46-
self.schema = schema
4747
if spec_url is not None:
4848
warnings.warn(
4949
"spec_url parameter is deprecated. " "Use base_uri instead.",
@@ -52,11 +52,16 @@ def __init__(
5252
base_uri = spec_url
5353
self.base_uri = base_uri
5454

55-
self.spec = SchemaPath.from_dict(
56-
self.schema,
57-
base_uri=self.base_uri,
58-
handlers=self.resolver_handlers,
59-
)
55+
if isinstance(schema, SchemaPath):
56+
self.schema_path = schema
57+
self.schema = schema.contents()
58+
else:
59+
self.schema = schema
60+
self.schema_path = SchemaPath.from_dict(
61+
self.schema,
62+
base_uri=self.base_uri,
63+
handlers=self.resolver_handlers,
64+
)
6065

6166
self.keyword_validators_registry = KeywordValidatorRegistry(
6267
self.keyword_validators
@@ -84,12 +89,7 @@ def root_validator(self) -> keywords.RootValidator:
8489
def iter_errors(self) -> Iterator[ValidationError]:
8590
yield from self.schema_validator.iter_errors(self.schema)
8691

87-
spec = SchemaPath.from_dict(
88-
self.schema,
89-
base_uri=self.base_uri,
90-
handlers=self.resolver_handlers,
91-
)
92-
yield from self.root_validator(spec)
92+
yield from self.root_validator(self.schema_path)
9393

9494

9595
class OpenAPIV2SpecValidator(SpecValidator):

poetry.lock

+4-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ jsonschema = "^4.18.0"
5656
openapi-schema-validator = "^0.6.0"
5757
python = "^3.8.0"
5858
importlib-resources = {version = ">=5.8,<7.0", python = "<3.9" }
59-
jsonschema-path = "^0.3.0"
59+
jsonschema-path = "^0.3.1"
6060
lazy-object-proxy = "^1.7.1"
6161

6262
[tool.poetry.extras]

tests/integration/validation/test_validators.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import pytest
22
from referencing.exceptions import Unresolvable
33

4+
from jsonschema_path import SchemaPath
45
from openapi_spec_validator import OpenAPIV2SpecValidator
56
from openapi_spec_validator import OpenAPIV30SpecValidator
67
from openapi_spec_validator import OpenAPIV31SpecValidator
@@ -23,7 +24,11 @@ def test_valid(self, factory, spec_file):
2324
spec_path = self.local_test_suite_file_path(spec_file)
2425
spec = factory.spec_from_file(spec_path)
2526
spec_url = factory.spec_file_url(spec_path)
26-
validator = OpenAPIV2SpecValidator(spec, base_uri=spec_url)
27+
schema_path = SchemaPath.from_dict(
28+
spec,
29+
base_uri=spec_url,
30+
)
31+
validator = OpenAPIV2SpecValidator(schema_path)
2732

2833
validator.validate()
2934

0 commit comments

Comments
 (0)