|
2 | 2 | from typing import Dict |
3 | 3 | from typing import Hashable |
4 | 4 | from typing import Mapping |
| 5 | +from typing import Type |
| 6 | +from typing import TypeVar |
5 | 7 |
|
6 | 8 | 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 |
12 | 12 |
|
13 | | -from openapi_core.spec.accessors import SpecAccessor |
| 13 | +TSpec = TypeVar("TSpec", bound="Spec") |
14 | 14 |
|
15 | 15 | SPEC_SEPARATOR = "#" |
16 | 16 |
|
17 | 17 |
|
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): |
33 | 19 | @classmethod |
34 | 20 | def create( |
35 | | - cls, |
| 21 | + cls: Type[TSpec], |
36 | 22 | data: Mapping[Hashable, Any], |
37 | 23 | *args: Any, |
38 | 24 | url: str = "", |
39 | 25 | ref_resolver_handlers: Dict[str, Any] = default_handlers, |
40 | 26 | separator: str = SPEC_SEPARATOR, |
41 | | - validator: Validator = openapi_v3_spec_validator, |
42 | | - ) -> "Spec": |
| 27 | + validator: Validator = openapi_v30_spec_validator, |
| 28 | + ) -> TSpec: |
43 | 29 | if validator is not None: |
44 | 30 | validator.validate(data, spec_url=url) |
45 | 31 |
|
46 | 32 | return cls.from_dict( |
47 | 33 | data, |
48 | 34 | *args, |
49 | | - url=url, |
| 35 | + spec_url=url, |
50 | 36 | ref_resolver_handlers=ref_resolver_handlers, |
51 | 37 | separator=separator, |
52 | 38 | ) |
0 commit comments