1from typing import Any
2
3from jsonschema.validators import validates
4
5from openapi_schema_validator._specifications import (
6 REGISTRY as OPENAPI_SPECIFICATIONS,
7)
8
9__all__ = [
10 "OAS31_BASE_DIALECT_ID",
11 "OAS31_BASE_DIALECT_METASCHEMA",
12 "OAS32_BASE_DIALECT_ID",
13 "OAS32_BASE_DIALECT_METASCHEMA",
14 "register_openapi_dialect",
15]
16
17OAS31_BASE_DIALECT_ID = "https://spec.openapis.org/oas/3.1/dialect/base"
18OAS31_BASE_DIALECT_METASCHEMA = OPENAPI_SPECIFICATIONS.contents(
19 OAS31_BASE_DIALECT_ID,
20)
21OAS32_BASE_DIALECT_ID = "https://spec.openapis.org/oas/3.2/dialect/2025-09-17"
22OAS32_BASE_DIALECT_METASCHEMA = OPENAPI_SPECIFICATIONS.contents(
23 OAS32_BASE_DIALECT_ID,
24)
25
26_REGISTERED_VALIDATORS: dict[tuple[str, str], Any] = {}
27
28
29def register_openapi_dialect(
30 *,
31 validator: Any,
32 dialect_id: str,
33 version_name: str,
34 metaschema: Any,
35) -> Any:
36 key = (dialect_id, version_name)
37 registered_validator = _REGISTERED_VALIDATORS.get(key)
38
39 if registered_validator is validator:
40 return validator
41 if registered_validator is not None:
42 return registered_validator
43
44 validator.META_SCHEMA = metaschema
45 validator = validates(version_name)(validator)
46 _REGISTERED_VALIDATORS[key] = validator
47 return validator