Server : LiteSpeed System : Linux in-mum-web1112.main-hosting.eu 4.18.0-553.34.1.lve.el8.x86_64 #1 SMP Thu Jan 9 16:30:32 UTC 2025 x86_64 User : u451330669 ( 451330669) PHP Version : 8.2.27 Disable Function : NONE Directory : /opt/alt/python311/lib/python3.11/site-packages/jsons/ |
"""
PRIVATE MODULE: do not import (from) it directly.
This module contains functionality for validating objects.
"""
from typing import Union, Sequence, Callable
from jsons._cache import cached
from jsons._common_impl import StateHolder, get_class_name
from jsons._lizers_impl import _get_lizer
from jsons.exceptions import ValidationError
def set_validator(
func: Callable[[object], bool],
cls: Union[type, Sequence[type]],
*,
fork_inst: type = StateHolder) -> None:
"""
Set a validator function for the given ``cls``. The function should accept
an instance of the type it should validate and must return ``False`` or
raise any exception in case of a validation failure.
:param func: the function that takes an instance of type ``cls`` and
returns a bool (``True`` if the validation was successful).
:param cls: the type or types that ``func`` is able to validate.
:param fork_inst: if given, it uses this fork of ``JsonSerializable``.
:return: None.
"""
if isinstance(cls, Sequence):
for cls_ in cls:
set_validator(func, cls=cls_, fork_inst=fork_inst)
else:
cls_name = get_class_name(cls, fully_qualified=True)
fork_inst._validators[cls_name.lower()] = func
fork_inst._classes_validators.append(cls)
@cached
def get_validator(
cls: type,
fork_inst: type = StateHolder) -> callable:
"""
Return the validator function that would be used for the given ``cls``.
:param cls: the type for which a deserializer is to be returned.
:param fork_inst: if given, it uses this fork of ``JsonSerializable``.
:return: a validator function.
"""
return _get_lizer(cls, fork_inst._validators,
fork_inst._classes_validators, fork_inst)
def validate(
obj: object,
cls: type,
fork_inst: type = StateHolder) -> None:
"""
Validate the given ``obj`` with the validator that was registered for
``cls``. Raises a ``ValidationError`` if the validation failed.
:param obj: the object that is to be validated.
:param cls: the type of which the validator function was registered.
:param fork_inst: if given, it uses this fork of ``JsonSerializable``.
:return: None.
"""
validator = get_validator(cls, fork_inst)
result = True
msg = 'Validation failed.'
if validator:
try:
result = validator(obj)
except Exception as err:
if err.args:
msg = err.args[0]
result = False
if not result:
raise ValidationError(msg)