Skip to content

Commit 7690a47

Browse files
committed
Use openapi-spec-validator spec version finder
1 parent 0f5ac8e commit 7690a47

File tree

2 files changed

+20
-24
lines changed

2 files changed

+20
-24
lines changed

Diff for: openapi_core/shortcuts.py

+17-7
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@
55
from typing import Union
66

77
from jsonschema_path import SchemaPath
8+
from openapi_spec_validator.versions import consts as versions
9+
from openapi_spec_validator.versions.datatypes import SpecVersion
10+
from openapi_spec_validator.versions.exceptions import OpenAPIVersionNotFound
11+
from openapi_spec_validator.versions.shortcuts import get_spec_version
812

913
from openapi_core.exceptions import SpecError
10-
from openapi_core.finders import SpecClasses
11-
from openapi_core.finders import SpecFinder
12-
from openapi_core.finders import SpecVersion
1314
from openapi_core.protocols import Request
1415
from openapi_core.protocols import Response
1516
from openapi_core.protocols import WebhookRequest
1617
from openapi_core.spec import Spec
18+
from openapi_core.types import SpecClasses
1719
from openapi_core.unmarshalling.request import V30RequestUnmarshaller
1820
from openapi_core.unmarshalling.request import V31RequestUnmarshaller
1921
from openapi_core.unmarshalling.request import V31WebhookRequestUnmarshaller
@@ -63,8 +65,8 @@
6365

6466
AnyRequest = Union[Request, WebhookRequest]
6567

66-
SPECS: Dict[SpecVersion, SpecClasses] = {
67-
SpecVersion("openapi", "3.0"): SpecClasses(
68+
SPEC2CLASSES: Dict[SpecVersion, SpecClasses] = {
69+
versions.OPENAPIV30: SpecClasses(
6870
V30RequestValidator,
6971
V30ResponseValidator,
7072
None,
@@ -74,7 +76,7 @@
7476
None,
7577
None,
7678
),
77-
SpecVersion("openapi", "3.1"): SpecClasses(
79+
versions.OPENAPIV31: SpecClasses(
7880
V31RequestValidator,
7981
V31ResponseValidator,
8082
V31WebhookRequestValidator,
@@ -88,7 +90,15 @@
8890

8991

9092
def get_classes(spec: SchemaPath) -> SpecClasses:
91-
return SpecFinder(SPECS).get_classes(spec)
93+
try:
94+
spec_version = get_spec_version(spec.contents())
95+
# backward compatibility
96+
except OpenAPIVersionNotFound:
97+
raise SpecError("Spec schema version not detected")
98+
try:
99+
return SPEC2CLASSES[spec_version]
100+
except KeyError:
101+
raise SpecError("Spec schema version not supported")
92102

93103

94104
def unmarshal_apicall_request(

Diff for: openapi_core/finders.py renamed to openapi_core/types.py

+3-17
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from dataclasses import dataclass
12
from typing import Mapping
23
from typing import NamedTuple
34
from typing import Optional
@@ -21,12 +22,8 @@
2122
from openapi_core.validation.validators import BaseValidator
2223

2324

24-
class SpecVersion(NamedTuple):
25-
name: str
26-
version: str
27-
28-
29-
class SpecClasses(NamedTuple):
25+
@dataclass
26+
class SpecClasses:
3027
request_validator_cls: RequestValidatorType
3128
response_validator_cls: ResponseValidatorType
3229
webhook_request_validator_cls: Optional[WebhookRequestValidatorType]
@@ -37,14 +34,3 @@ class SpecClasses(NamedTuple):
3734
webhook_response_unmarshaller_cls: Optional[
3835
WebhookResponseUnmarshallerType
3936
]
40-
41-
42-
class SpecFinder:
43-
def __init__(self, specs: Mapping[SpecVersion, SpecClasses]) -> None:
44-
self.specs = specs
45-
46-
def get_classes(self, spec: SchemaPath) -> SpecClasses:
47-
for v, classes in self.specs.items():
48-
if v.name in spec and spec[v.name].startswith(v.version):
49-
return classes
50-
raise SpecError("Spec schema version not detected")

0 commit comments

Comments
 (0)