Skip to content

Commit 1388f78

Browse files
committed
Spec document jsonschema dialect cache
1 parent eedd017 commit 1388f78

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

openapi_spec_validator/validation/keywords.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ class OpenAPIV31SchemaValidator(SchemaValidator):
248248

249249
def __init__(self, registry: "KeywordValidatorRegistry"):
250250
super().__init__(registry)
251+
self._default_jsonschema_dialect_id: str | None = None
251252
self._validator_classes_by_dialect: dict[
252253
str, type[Validator] | None
253254
] = {}
@@ -283,14 +284,18 @@ def _get_schema_dialect_id(
283284
)
284285
dialect_id = dialect_value
285286
else:
286-
jsonschema_dialect_id = self._get_jsonschema_dialect_id(schema)
287+
jsonschema_dialect_id = (
288+
self._get_default_jsonschema_dialect_id(schema)
289+
)
287290
schema_to_check = {
288291
**schema_to_check,
289292
"$schema": jsonschema_dialect_id,
290293
}
291294
dialect_id = jsonschema_dialect_id
292295
else:
293-
jsonschema_dialect_id = self._get_jsonschema_dialect_id(schema)
296+
jsonschema_dialect_id = self._get_default_jsonschema_dialect_id(
297+
schema
298+
)
294299
schema_to_check = schema_value
295300
dialect_id = jsonschema_dialect_id
296301

@@ -312,14 +317,19 @@ def _get_validator_class_for_dialect(
312317
self._validator_classes_by_dialect[dialect_id] = validator_cls
313318
return validator_cls
314319

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
320+
def _get_default_jsonschema_dialect_id(self, schema: SchemaPath) -> str:
321+
if self._default_jsonschema_dialect_id is not None:
322+
return self._default_jsonschema_dialect_id
323+
324+
spec_root = self._get_spec_root(schema)
325+
dialect_id = (spec_root / "jsonSchemaDialect").read_str(
326+
default=OAS31_BASE_DIALECT_URI
327+
)
328+
329+
self._default_jsonschema_dialect_id = dialect_id
330+
return dialect_id
321331

322-
def _get_schema_root(self, schema: SchemaPath) -> SchemaPath:
332+
def _get_spec_root(self, schema: SchemaPath) -> SchemaPath:
323333
# jsonschema-path currently has no public API for root traversal.
324334
return schema._clone_with_parts(())
325335

0 commit comments

Comments
 (0)