123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- """
- 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
- @runtime_checkable
- 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:
- ...
- @classmethod
- 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)
- """
|