-
-
Notifications
You must be signed in to change notification settings - Fork 39
Expand file tree
/
Copy path__init__.py
More file actions
98 lines (74 loc) · 3.1 KB
/
__init__.py
File metadata and controls
98 lines (74 loc) · 3.1 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
from contextvars import ContextVar
from typing import TYPE_CHECKING, Optional
import httpx
from openapi_pydantic import OpenAPI
from ..log import logger
if TYPE_CHECKING:
from ..config import Override
from ..source import Source
# parser context
_override_config: ContextVar["Override"] = ContextVar("override_config")
_schemas: ContextVar[dict[httpx.URL, "SchemaData"]] = ContextVar("schemas")
def get_override_config() -> "Override":
return _override_config.get()
def get_schemas() -> dict[httpx.URL, "SchemaData"]:
return _schemas.get()
def get_schema(ref: httpx.URL) -> Optional["SchemaData"]:
return _schemas.get().get(ref)
def add_schema(ref: httpx.URL, schema: "SchemaData"):
if ref in _schemas.get():
raise ValueError(f"Duplicate schema {ref}")
_schemas.get()[ref] = schema
from .data import EndpointData as EndpointData
from .data import ModelGroup as ModelGroup
from .data import OpenAPIData as OpenAPIData
from .data import WebhookData as WebhookData
from .endpoints import parse_endpoint
from .models import parse_models
from .schemas import ModelSchema, SchemaData, parse_schema
from .utils import fix_reserved_words as fix_reserved_words
from .utils import kebab_case as kebab_case
from .utils import merge_inplace
from .utils import pascal_case as pascal_case
from .utils import sanitize as sanitize
from .utils import snake_case as snake_case
from .webhooks import parse_webhook
def parse_openapi_spec(source: "Source", override: "Override") -> OpenAPIData:
source = source.get_root()
# apply schema overrides first to make sure json pointer is correct
for path, new_schema in override.schema_overrides.items():
ref = str(httpx.URL(fragment=path))
logger.info(f"Applying schema override for {ref!r}")
merge_inplace(source.resolve_ref(ref), new_schema)
_ot = _override_config.set(override)
_st = _schemas.set({})
try:
openapi = OpenAPI.model_validate(source.root)
# pre-cache /components/schemas first
if openapi.components and openapi.components.schemas:
schemas_source = source / "components" / "schemas"
for name in openapi.components.schemas:
schema_source = schemas_source / name
parse_schema(schema_source, name)
# load endpoints
endpoints: list[EndpointData] = []
if openapi.paths:
for path in openapi.paths:
endpoints.extend(parse_endpoint(source / "paths" / path, path))
# load webhooks
webhooks: list[WebhookData] = []
if openapi.webhooks:
for webhook in openapi.webhooks:
if webhook_data := parse_webhook(source / "webhooks" / webhook):
webhooks.append(webhook_data)
# load models
models = [
schema
for schema in get_schemas().values()
if isinstance(schema, ModelSchema)
]
groups = parse_models(models)
return OpenAPIData(model_groups=groups, endpoints=endpoints, webhooks=webhooks)
finally:
_override_config.reset(_ot)
_schemas.reset(_st)