Skip to content

Commit 202c5b6

Browse files
committed
Switch to jsonschema-spec
1 parent 6a2f478 commit 202c5b6

20 files changed

+92
-148
lines changed

openapi_core/spec/accessors.py

-32
This file was deleted.

openapi_core/spec/paths.py

+11-25
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,37 @@
22
from typing import Dict
33
from typing import Hashable
44
from typing import Mapping
5+
from typing import Type
6+
from typing import TypeVar
57

68
from jsonschema.protocols import Validator
7-
from jsonschema.validators import RefResolver
8-
from openapi_spec_validator import default_handlers
9-
from openapi_spec_validator import openapi_v3_spec_validator
10-
from openapi_spec_validator.validators import Dereferencer
11-
from pathable.paths import AccessorPath
9+
from jsonschema_spec import Spec as JsonschemaSpec
10+
from jsonschema_spec import default_handlers
11+
from openapi_spec_validator import openapi_v30_spec_validator
1212

13-
from openapi_core.spec.accessors import SpecAccessor
13+
TSpec = TypeVar("TSpec", bound="Spec")
1414

1515
SPEC_SEPARATOR = "#"
1616

1717

18-
class Spec(AccessorPath):
19-
@classmethod
20-
def from_dict(
21-
cls,
22-
data: Mapping[Hashable, Any],
23-
*args: Any,
24-
url: str = "",
25-
ref_resolver_handlers: Dict[str, Any] = default_handlers,
26-
separator: str = SPEC_SEPARATOR,
27-
) -> "Spec":
28-
ref_resolver = RefResolver(url, data, handlers=ref_resolver_handlers)
29-
dereferencer = Dereferencer(ref_resolver)
30-
accessor = SpecAccessor(data, dereferencer)
31-
return cls(accessor, *args, separator=separator)
32-
18+
class Spec(JsonschemaSpec):
3319
@classmethod
3420
def create(
35-
cls,
21+
cls: Type[TSpec],
3622
data: Mapping[Hashable, Any],
3723
*args: Any,
3824
url: str = "",
3925
ref_resolver_handlers: Dict[str, Any] = default_handlers,
4026
separator: str = SPEC_SEPARATOR,
41-
validator: Validator = openapi_v3_spec_validator,
42-
) -> "Spec":
27+
validator: Validator = openapi_v30_spec_validator,
28+
) -> TSpec:
4329
if validator is not None:
4430
validator.validate(data, spec_url=url)
4531

4632
return cls.from_dict(
4733
data,
4834
*args,
49-
url=url,
35+
spec_url=url,
5036
ref_resolver_handlers=ref_resolver_handlers,
5137
separator=separator,
5238
)

openapi_core/spec/shortcuts.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@
44
from typing import Hashable
55
from typing import Mapping
66

7-
from jsonschema.validators import RefResolver
8-
from openapi_spec_validator import default_handlers
9-
from openapi_spec_validator import openapi_v3_spec_validator
10-
from openapi_spec_validator.validators import Dereferencer
7+
from jsonschema_spec import default_handlers
8+
from openapi_spec_validator import openapi_v30_spec_validator
119

1210
from openapi_core.spec.paths import Spec
1311

@@ -20,7 +18,7 @@ def create_spec(
2018
) -> Spec:
2119
validator = None
2220
if validate_spec:
23-
validator = openapi_v3_spec_validator
21+
validator = openapi_v30_spec_validator
2422

2523
return Spec.create(
2624
spec_dict,

openapi_core/unmarshalling/schemas/factories.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def get_formatter(
105105
return default_formatters.get(type_format)
106106

107107
def get_validator(self, schema: Spec) -> Validator:
108-
resolver = schema.accessor.dereferencer.resolver_manager.resolver # type: ignore
108+
resolver = schema.accessor.resolver # type: ignore
109109
custom_format_checks = {
110110
name: formatter.validate
111111
for name, formatter in self.custom_formatters.items()

openapi_core/unmarshalling/schemas/unmarshallers.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
from typing import Optional
88

99
from isodate.isodatetime import parse_datetime
10+
from jsonschema._types import is_array
11+
from jsonschema._types import is_bool
12+
from jsonschema._types import is_integer
13+
from jsonschema._types import is_number
14+
from jsonschema._types import is_object
1015
from jsonschema.protocols import Validator
1116
from openapi_schema_validator._format import oas30_format_checker
12-
from openapi_schema_validator._types import is_array
13-
from openapi_schema_validator._types import is_bool
14-
from openapi_schema_validator._types import is_integer
15-
from openapi_schema_validator._types import is_number
16-
from openapi_schema_validator._types import is_object
1717
from openapi_schema_validator._types import is_string
1818

1919
from openapi_core.extensions.models.factories import ModelFactory

poetry.lock

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

pyproject.toml

+3-4
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ module = [
2020
"isodate.*",
2121
"jsonschema.*",
2222
"more_itertools.*",
23-
"openapi_spec_validator.*",
24-
"openapi_schema_validator.*",
2523
"parse.*",
2624
"requests.*",
2725
"werkzeug.*",
@@ -60,11 +58,12 @@ flask = {version = "*", optional = true}
6058
isodate = "*"
6159
more-itertools = "*"
6260
parse = "*"
63-
openapi-schema-validator = "^0.2.0"
64-
openapi-spec-validator = "^0.4.0"
61+
openapi-schema-validator = "^0.3.0"
62+
openapi-spec-validator = "^0.5.0"
6563
requests = {version = "*", optional = true}
6664
werkzeug = "*"
6765
typing-extensions = "^4.3.0"
66+
jsonschema-spec = "^0.1.1"
6867

6968
[tool.poetry.extras]
7069
django = ["django"]

tests/integration/conftest.py

+13-4
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,27 @@
22
from urllib import request
33

44
import pytest
5-
from openapi_spec_validator.schemas import read_yaml_file
5+
from openapi_spec_validator.readers import read_from_filename
66
from yaml import safe_load
77

8+
from openapi_core.spec import Spec
89

9-
def spec_from_file(spec_file):
10+
11+
def content_from_file(spec_file):
1012
directory = path.abspath(path.dirname(__file__))
1113
path_full = path.join(directory, spec_file)
12-
return read_yaml_file(path_full)
14+
return read_from_filename(path_full)
15+
16+
17+
def spec_from_file(spec_file):
18+
spec_dict, spec_url = content_from_file(spec_file)
19+
return Spec.create(spec_dict, url=spec_url)
1320

1421

1522
def spec_from_url(spec_url):
1623
content = request.urlopen(spec_url)
17-
return safe_load(content)
24+
spec_dict = safe_load(content)
25+
return Spec.create(spec_dict, url=spec_url)
1826

1927

2028
class Factory(dict):
@@ -25,6 +33,7 @@ class Factory(dict):
2533
@pytest.fixture(scope="session")
2634
def factory():
2735
return Factory(
36+
content_from_file=content_from_file,
2837
spec_from_file=spec_from_file,
2938
spec_from_url=spec_from_url,
3039
)

tests/integration/contrib/flask/test_flask_decorator.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from flask import make_response
55

66
from openapi_core.contrib.flask.decorators import FlaskOpenAPIViewDecorator
7-
from openapi_core.spec import Spec
87
from openapi_core.validation.request.datatypes import Parameters
98

109

@@ -15,7 +14,7 @@ class TestFlaskOpenAPIDecorator:
1514
@pytest.fixture
1615
def spec(self, factory):
1716
specfile = "contrib/flask/data/v3.0/flask_factory.yaml"
18-
return Spec.create(factory.spec_from_file(specfile))
17+
return factory.spec_from_file(specfile)
1918

2019
@pytest.fixture
2120
def decorator(self, spec):

tests/integration/contrib/flask/test_flask_views.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from flask import make_response
55

66
from openapi_core.contrib.flask.views import FlaskOpenAPIView
7-
from openapi_core.spec import Spec
87

98

109
class TestFlaskOpenAPIView:
@@ -14,7 +13,7 @@ class TestFlaskOpenAPIView:
1413
@pytest.fixture
1514
def spec(self, factory):
1615
specfile = "contrib/flask/data/v3.0/flask_factory.yaml"
17-
return Spec.create(factory.spec_from_file(specfile))
16+
return factory.spec_from_file(specfile)
1817

1918
@pytest.fixture
2019
def app(self):

tests/integration/contrib/requests/test_requests_validation.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
from openapi_core.contrib.requests import RequestsOpenAPIRequest
66
from openapi_core.contrib.requests import RequestsOpenAPIResponse
7-
from openapi_core.spec import Spec
87
from openapi_core.validation.request import openapi_request_validator
98
from openapi_core.validation.response import openapi_response_validator
109

@@ -13,7 +12,7 @@ class TestRequestsOpenAPIValidation:
1312
@pytest.fixture
1413
def spec(self, factory):
1514
specfile = "contrib/requests/data/v3.0/requests_factory.yaml"
16-
return Spec.create(factory.spec_from_file(specfile))
15+
return factory.spec_from_file(specfile)
1716

1817
@responses.activate
1918
def test_response_validator_path_pattern(self, spec):

0 commit comments

Comments
 (0)