Skip to content

Commit 68ed0ae

Browse files
committed
Spec document jsonschema dialect cache
1 parent eedd017 commit 68ed0ae

File tree

1 file changed

+19
-11
lines changed

1 file changed

+19
-11
lines changed

openapi_spec_validator/validation/keywords.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -244,10 +244,9 @@ def __call__(
244244

245245

246246
class OpenAPIV31SchemaValidator(SchemaValidator):
247-
default_jsonschema_dialect_id = OAS31_BASE_DIALECT_URI
248-
249247
def __init__(self, registry: "KeywordValidatorRegistry"):
250248
super().__init__(registry)
249+
self._default_jsonschema_dialect_id: str | None = None
251250
self._validator_classes_by_dialect: dict[
252251
str, type[Validator] | None
253252
] = {}
@@ -283,14 +282,18 @@ def _get_schema_dialect_id(
283282
)
284283
dialect_id = dialect_value
285284
else:
286-
jsonschema_dialect_id = self._get_jsonschema_dialect_id(schema)
285+
jsonschema_dialect_id = (
286+
self._get_default_jsonschema_dialect_id(schema)
287+
)
287288
schema_to_check = {
288289
**schema_to_check,
289290
"$schema": jsonschema_dialect_id,
290291
}
291292
dialect_id = jsonschema_dialect_id
292293
else:
293-
jsonschema_dialect_id = self._get_jsonschema_dialect_id(schema)
294+
jsonschema_dialect_id = self._get_default_jsonschema_dialect_id(
295+
schema
296+
)
294297
schema_to_check = schema_value
295298
dialect_id = jsonschema_dialect_id
296299

@@ -312,14 +315,19 @@ def _get_validator_class_for_dialect(
312315
self._validator_classes_by_dialect[dialect_id] = validator_cls
313316
return validator_cls
314317

315-
def _get_jsonschema_dialect_id(self, schema: SchemaPath) -> str:
316-
schema_root = self._get_schema_root(schema)
317-
try:
318-
return (schema_root // "jsonSchemaDialect").read_str()
319-
except KeyError:
320-
return self.default_jsonschema_dialect_id
318+
def _get_default_jsonschema_dialect_id(self, schema: SchemaPath) -> str:
319+
if self._default_jsonschema_dialect_id is not None:
320+
return self._default_jsonschema_dialect_id
321+
322+
spec_root = self._get_spec_root(schema)
323+
dialect_id = (spec_root / "jsonSchemaDialect").read_str(
324+
default=OAS31_BASE_DIALECT_URI
325+
)
326+
327+
self._default_jsonschema_dialect_id = dialect_id
328+
return dialect_id
321329

322-
def _get_schema_root(self, schema: SchemaPath) -> SchemaPath:
330+
def _get_spec_root(self, schema: SchemaPath) -> SchemaPath:
323331
# jsonschema-path currently has no public API for root traversal.
324332
return schema._clone_with_parts(())
325333

0 commit comments

Comments
 (0)