Spaces:
Paused
Paused
| """ | |
| typing.Protocol classes for jsonschema interfaces. | |
| """ | |
| # for reference material on Protocols, see | |
| # https://www.python.org/dev/peps/pep-0544/ | |
| from __future__ import annotations | |
| from typing import ( | |
| TYPE_CHECKING, | |
| Any, | |
| ClassVar, | |
| Iterable, | |
| Protocol, | |
| runtime_checkable, | |
| ) | |
| # in order for Sphinx to resolve references accurately from type annotations, | |
| # it needs to see names like `jsonschema.TypeChecker` | |
| # therefore, only import at type-checking time (to avoid circular references), | |
| # but use `jsonschema` for any types which will otherwise not be resolvable | |
| if TYPE_CHECKING: | |
| from collections.abc import Mapping | |
| import referencing.jsonschema | |
| from jsonschema import _typing | |
| from jsonschema.exceptions import ValidationError | |
| import jsonschema | |
| import jsonschema.validators | |
| # For code authors working on the validator protocol, these are the three | |
| # use-cases which should be kept in mind: | |
| # | |
| # 1. As a protocol class, it can be used in type annotations to describe the | |
| # available methods and attributes of a validator | |
| # 2. It is the source of autodoc for the validator documentation | |
| # 3. It is runtime_checkable, meaning that it can be used in isinstance() | |
| # checks. | |
| # | |
| # Since protocols are not base classes, isinstance() checking is limited in | |
| # its capabilities. See docs on runtime_checkable for detail | |
| class Validator(Protocol): | |
| """ | |
| The protocol to which all validator classes adhere. | |
| Arguments: | |
| schema: | |
| The schema that the validator object will validate with. | |
| It is assumed to be valid, and providing | |
| an invalid schema can lead to undefined behavior. See | |
| `Validator.check_schema` to validate a schema first. | |
| registry: | |
| a schema registry that will be used for looking up JSON references | |
| resolver: | |
| a resolver that will be used to resolve :kw:`$ref` | |
| properties (JSON references). If unprovided, one will be created. | |
| .. deprecated:: v4.18.0 | |
| `RefResolver <_RefResolver>` has been deprecated in favor of | |
| `referencing`, and with it, this argument. | |
| format_checker: | |
| if provided, a checker which will be used to assert about | |
| :kw:`format` properties present in the schema. If unprovided, | |
| *no* format validation is done, and the presence of format | |
| within schemas is strictly informational. Certain formats | |
| require additional packages to be installed in order to assert | |
| against instances. Ensure you've installed `jsonschema` with | |
| its `extra (optional) dependencies <index:extras>` when | |
| invoking ``pip``. | |
| .. deprecated:: v4.12.0 | |
| Subclassing validator classes now explicitly warns this is not part of | |
| their public API. | |
| """ | |
| #: An object representing the validator's meta schema (the schema that | |
| #: describes valid schemas in the given version). | |
| META_SCHEMA: ClassVar[Mapping] | |
| #: A mapping of validation keywords (`str`\s) to functions that | |
| #: validate the keyword with that name. For more information see | |
| #: `creating-validators`. | |
| VALIDATORS: ClassVar[Mapping] | |
| #: A `jsonschema.TypeChecker` that will be used when validating | |
| #: :kw:`type` keywords in JSON schemas. | |
| TYPE_CHECKER: ClassVar[jsonschema.TypeChecker] | |
| #: A `jsonschema.FormatChecker` that will be used when validating | |
| #: :kw:`format` keywords in JSON schemas. | |
| FORMAT_CHECKER: ClassVar[jsonschema.FormatChecker] | |
| #: A function which given a schema returns its ID. | |
| ID_OF: _typing.id_of | |
| #: The schema that will be used to validate instances | |
| schema: Mapping | bool | |
| def __init__( | |
| self, | |
| schema: Mapping | bool, | |
| registry: referencing.jsonschema.SchemaRegistry, | |
| format_checker: jsonschema.FormatChecker | None = None, | |
| ) -> None: | |
| ... | |
| def check_schema(cls, schema: Mapping | bool) -> None: | |
| """ | |
| Validate the given schema against the validator's `META_SCHEMA`. | |
| Raises: | |
| `jsonschema.exceptions.SchemaError`: | |
| if the schema is invalid | |
| """ | |
| def is_type(self, instance: Any, type: str) -> bool: | |
| """ | |
| Check if the instance is of the given (JSON Schema) type. | |
| Arguments: | |
| instance: | |
| the value to check | |
| type: | |
| the name of a known (JSON Schema) type | |
| Returns: | |
| whether the instance is of the given type | |
| Raises: | |
| `jsonschema.exceptions.UnknownType`: | |
| if ``type`` is not a known type | |
| """ | |
| def is_valid(self, instance: Any) -> bool: | |
| """ | |
| Check if the instance is valid under the current `schema`. | |
| Returns: | |
| whether the instance is valid or not | |
| >>> schema = {"maxItems" : 2} | |
| >>> Draft202012Validator(schema).is_valid([2, 3, 4]) | |
| False | |
| """ | |
| def iter_errors(self, instance: Any) -> Iterable[ValidationError]: | |
| r""" | |
| Lazily yield each of the validation errors in the given instance. | |
| >>> schema = { | |
| ... "type" : "array", | |
| ... "items" : {"enum" : [1, 2, 3]}, | |
| ... "maxItems" : 2, | |
| ... } | |
| >>> v = Draft202012Validator(schema) | |
| >>> for error in sorted(v.iter_errors([2, 3, 4]), key=str): | |
| ... print(error.message) | |
| 4 is not one of [1, 2, 3] | |
| [2, 3, 4] is too long | |
| .. deprecated:: v4.0.0 | |
| Calling this function with a second schema argument is deprecated. | |
| Use `Validator.evolve` instead. | |
| """ | |
| def validate(self, instance: Any) -> None: | |
| """ | |
| Check if the instance is valid under the current `schema`. | |
| Raises: | |
| `jsonschema.exceptions.ValidationError`: | |
| if the instance is invalid | |
| >>> schema = {"maxItems" : 2} | |
| >>> Draft202012Validator(schema).validate([2, 3, 4]) | |
| Traceback (most recent call last): | |
| ... | |
| ValidationError: [2, 3, 4] is too long | |
| """ | |
| def evolve(self, **kwargs) -> Validator: | |
| """ | |
| Create a new validator like this one, but with given changes. | |
| Preserves all other attributes, so can be used to e.g. create a | |
| validator with a different schema but with the same :kw:`$ref` | |
| resolution behavior. | |
| >>> validator = Draft202012Validator({}) | |
| >>> validator.evolve(schema={"type": "number"}) | |
| Draft202012Validator(schema={'type': 'number'}, format_checker=None) | |
| The returned object satisfies the validator protocol, but may not | |
| be of the same concrete class! In particular this occurs | |
| when a :kw:`$ref` occurs to a schema with a different | |
| :kw:`$schema` than this one (i.e. for a different draft). | |
| >>> validator.evolve( | |
| ... schema={"$schema": Draft7Validator.META_SCHEMA["$id"]} | |
| ... ) | |
| Draft7Validator(schema=..., format_checker=None) | |
| """ | |