o
    hW                     @  s  U d Z ddlmZ ddlZddlZddlmZ ddlm	Z	 ddl
mZmZmZmZmZmZmZ ddlmZ ddlmZ ddlmZmZmZ d	d
lmZ d	dlmZmZmZm Z  d	d
l!mZ d	dl"m#Z# ej$dk roddlm%Z% nddl
m%Z% ej&Z'ej(dWddie j)G dd dZ*ej(dWddie j)G dd dZ+ej(dWddie j)G dd dZ,ej(dWddie j)G dd dZ-erG dd de%Z.G dd de%Z/G dd de%Z0ee/ej1e.ej2f Z3ee0ej4f Z5ee6eeef e7eef ee f Z8de9d < ed!e3e8Z:ed"e5e8Z;ed#d#d$dXd.d/Z<ed#d0dYd3d/Z<ed4 Z=de9d5< d6dd$dZd8d/Z<ed9Z>ed:dd;Z?G d<d= d=ej@e%e? ZAG d>d? d?e%e> ZBG d@dA dAe%e> ZCG dBdC dCe%ZDG dDdE dEe%ZEee>ge>f ZF	 ee>ejGge>f ZH	 eeCe> eBe> f ZIeeEeDf ZJeeHe> eFe> f ZKed[dGdHZLed\dKdHZLed]dNdHZLd^dQdHZLedRZMereeMd#f ZNnej(dWi e j)G dSdT dTZNereeMd#f ZOdS ej(dWi e j)G dUdV dVZOdS )_zBThis module contains related classes and functions for validation.    )annotationsN)partialmethod)FunctionType)TYPE_CHECKINGAnyCallableTypeVarUnioncastoverload)core_schema)	AnnotatedLiteral	TypeAlias   )GetCoreSchemaHandler)_core_metadata_decorators	_generics_internal_dataclass)PydanticUserError)      )ProtocolfrozenTc                   @  $   e Zd ZU dZded< dd
dZdS )AfterValidatora8  Usage docs: https://docs.pydantic.dev/2.5/concepts/validators/#annotated-validators

    A metadata class that indicates that a validation should be applied **after** the inner validation logic.

    Attributes:
        func: The validator function.

    Example:
        ```py
        from typing_extensions import Annotated

        from pydantic import AfterValidator, BaseModel, ValidationError

        MyInt = Annotated[int, AfterValidator(lambda v: v + 1)]

        class Model(BaseModel):
            a: MyInt

        print(Model(a=1).a)
        #> 2

        try:
            Model(a='a')
        except ValidationError as e:
            print(e.json(indent=2))
            '''
            [
              {
                "type": "int_parsing",
                "loc": [
                  "a"
                ],
                "msg": "Input should be a valid integer, unable to parse string as an integer",
                "input": "a",
                "url": "https://errors.pydantic.dev/2/v/int_parsing"
              }
            ]
            '''
        ```
    Kcore_schema.NoInfoValidatorFunction | core_schema.WithInfoValidatorFunctionfuncsource_typer   handler_GetCoreSchemaHandlerreturncore_schema.CoreSchemac                 C  T   ||}t | jd}|rttj| j}tj|||jdS ttj| j}tj||dS )Nafterschema
field_namer'   )	_inspect_validatorr   r
   r   WithInfoValidatorFunction"with_info_after_validator_functionr(   NoInfoValidatorFunction no_info_after_validator_functionselfr   r    r'   info_argr    r2   T/var/www/html/ai/venv/lib/python3.10/site-packages/pydantic/functional_validators.py__get_pydantic_core_schema__I      z+AfterValidator.__get_pydantic_core_schema__Nr   r   r    r!   r"   r#   __name__
__module____qualname____doc____annotations__r4   r2   r2   r2   r3   r      s   
 )r   c                   @  r   )BeforeValidatora  Usage docs: https://docs.pydantic.dev/2.5/concepts/validators/#annotated-validators

    A metadata class that indicates that a validation should be applied **before** the inner validation logic.

    Attributes:
        func: The validator function.

    Example:
        ```py
        from typing_extensions import Annotated

        from pydantic import BaseModel, BeforeValidator

        MyInt = Annotated[int, BeforeValidator(lambda v: v + 1)]

        class Model(BaseModel):
            a: MyInt

        print(Model(a=1).a)
        #> 2

        try:
            Model(a='a')
        except TypeError as e:
            print(e)
            #> can only concatenate str (not "int") to str
        ```
    r   r   r   r   r    r!   r"   r#   c                 C  r$   )Nbeforer&   r)   )	r*   r   r
   r   r+   #with_info_before_validator_functionr(   r-   !no_info_before_validator_functionr/   r2   r2   r3   r4   u   r5   z,BeforeValidator.__get_pydantic_core_schema__Nr6   r7   r2   r2   r2   r3   r=   T   s   
 r=   c                   @  r   )PlainValidatora;  Usage docs: https://docs.pydantic.dev/2.5/concepts/validators/#annotated-validators

    A metadata class that indicates that a validation should be applied **instead** of the inner validation logic.

    Attributes:
        func: The validator function.

    Example:
        ```py
        from typing_extensions import Annotated

        from pydantic import BaseModel, PlainValidator

        MyInt = Annotated[int, PlainValidator(lambda v: int(v) + 1)]

        class Model(BaseModel):
            a: MyInt

        print(Model(a='1').a)
        #> 2
        ```
    r   r   r   r   r    r!   r"   r#   c                 C  sF   t | jd}|rttj| j}tj||jdS ttj| j}t|S )Nplain)r(   )	r*   r   r
   r   r+   "with_info_plain_validator_functionr(   r-    no_info_plain_validator_function)r0   r   r    r1   r   r2   r2   r3   r4      s   
z+PlainValidator.__get_pydantic_core_schema__Nr6   r7   r2   r2   r2   r3   rA      s   
 rA   c                   @  r   )WrapValidatora  Usage docs: https://docs.pydantic.dev/2.5/concepts/validators/#annotated-validators

    A metadata class that indicates that a validation should be applied **around** the inner validation logic.

    Attributes:
        func: The validator function.

    ```py
    from datetime import datetime

    from typing_extensions import Annotated

    from pydantic import BaseModel, ValidationError, WrapValidator

    def validate_timestamp(v, handler):
        if v == 'now':
            # we don't want to bother with further validation, just return the new value
            return datetime.now()
        try:
            return handler(v)
        except ValidationError:
            # validation failed, in this case we want to return a default value
            return datetime(2000, 1, 1)

    MyTimestamp = Annotated[datetime, WrapValidator(validate_timestamp)]

    class Model(BaseModel):
        a: MyTimestamp

    print(Model(a='now').a)
    #> 2032-01-02 03:04:05.000006
    print(Model(a='invalid').a)
    #> 2000-01-01 00:00:00
    ```
    zScore_schema.NoInfoWrapValidatorFunction | core_schema.WithInfoWrapValidatorFunctionr   r   r   r    r!   r"   r#   c                 C  r$   )Nwrapr&   r)   )	r*   r   r
   r   WithInfoWrapValidatorFunction!with_info_wrap_validator_functionr(   NoInfoWrapValidatorFunctionno_info_wrap_validator_functionr/   r2   r2   r3   r4      r5   z*WrapValidator.__get_pydantic_core_schema__Nr6   r7   r2   r2   r2   r3   rE      s   
 $rE   c                   @  s   e Zd ZdddZdS )	_OnlyValueValidatorClsMethod!_OnlyValueValidatorClsMethod__clsr   #_OnlyValueValidatorClsMethod__valuer"   c                 C     d S Nr2   )r0   rL   rM   r2   r2   r3   __call__      z%_OnlyValueValidatorClsMethod.__call__N)rL   r   rM   r   r"   r   r8   r9   r:   rP   r2   r2   r2   r3   rK          rK   c                   @  s   e Zd Zd
ddZd	S )_V2ValidatorClsMethod_V2ValidatorClsMethod__clsr   "_V2ValidatorClsMethod__input_value_V2ValidatorClsMethod__info_core_schema.ValidationInfor"   c                 C  rN   rO   r2   )r0   rU   rV   rW   r2   r2   r3   rP      rQ   z_V2ValidatorClsMethod.__call__N)rU   r   rV   r   rW   rX   r"   r   rR   r2   r2   r2   r3   rT      rS   rT   c                   @  s   e Zd Zdd	d
ZdS )_V2WrapValidatorClsMethod_V2WrapValidatorClsMethod__clsr   &_V2WrapValidatorClsMethod__input_value$_V2WrapValidatorClsMethod__validator)_core_schema.ValidatorFunctionWrapHandler_V2WrapValidatorClsMethod__inforX   r"   c                 C  rN   rO   r2   )r0   rZ   r[   r\   r^   r2   r2   r3   rP         z"_V2WrapValidatorClsMethod.__call__N)
rZ   r   r[   r   r\   r]   r^   rX   r"   r   rR   r2   r2   r2   r3   rY      rS   rY   r   _PartialClsOrStaticMethod"_V2BeforeAfterOrPlainValidatorType_V2WrapValidatorType.)modecheck_fields__fieldstrfieldsrc   #Literal['before', 'after', 'plain']rd   bool | Noner"   RCallable[[_V2BeforeAfterOrPlainValidatorType], _V2BeforeAfterOrPlainValidatorType]c                G  rN   rO   r2   re   rc   rd   rg   r2   r2   r3   field_validator  r_   rl   )rd   Literal['wrap']6Callable[[_V2WrapValidatorType], _V2WrapValidatorType]c                G  rN   rO   r2   rk   r2   r2   r3   rl     r_   )r>   r%   rF   rB   FieldValidatorModesr%   Callable[[Any], Any]c                  sV   t | trtddd| gR tdd D s tdddd fdd}|S )a<  Usage docs: https://docs.pydantic.dev/2.5/concepts/validators/#field-validators

    Decorate methods on the class indicating that they should be used to validate fields.

    Example usage:
    ```py
    from typing import Any

    from pydantic import (
        BaseModel,
        ValidationError,
        field_validator,
    )

    class Model(BaseModel):
        a: str

        @field_validator('a')
        @classmethod
        def ensure_foobar(cls, v: Any):
            if 'foobar' not in v:
                raise ValueError('"foobar" not found in a')
            return v

    print(repr(Model(a='this is foobar good')))
    #> Model(a='this is foobar good')

    try:
        Model(a='snap')
    except ValidationError as exc_info:
        print(exc_info)
        '''
        1 validation error for Model
        a
          Value error, "foobar" not found in a [type=value_error, input_value='snap', input_type=str]
        '''
    ```

    For more in depth examples, see [Field Validators](../concepts/validators.md#field-validators).

    Args:
        __field: The first field the `field_validator` should be called on; this is separate
            from `fields` to ensure an error is raised if you don't pass at least one.
        *fields: Additional field(s) the `field_validator` should be called on.
        mode: Specifies whether to validate the fields before or after validation.
        check_fields: Whether to check that the fields actually exist on the model.

    Returns:
        A decorator that can be used to decorate a function to be used as a field_validator.

    Raises:
        PydanticUserError:
            - If `@field_validator` is used bare (with no fields).
            - If the args passed to `@field_validator` as fields are not strings.
            - If `@field_validator` applied to instance methods.
    z`@field_validator` should be used with fields and keyword arguments, not bare. E.g. usage should be `@validator('<field_name>', ...)`zvalidator-no-fieldscodec                 s  s    | ]}t |tV  qd S rO   )
isinstancerf   ).0fieldr2   r2   r3   	<genexpr>^  s    z"field_validator.<locals>.<genexpr>z`@field_validator` fields should be passed as separate string args. E.g. usage should be `@validator('<field_name_1>', '<field_name_2>', ...)`zvalidator-invalid-fieldsfHCallable[..., Any] | staticmethod[Any, Any] | classmethod[Any, Any, Any]r"   (_decorators.PydanticDescriptorProxy[Any]c                   s<   t | rtdddt | } t j d}t | |S )Nz8`@field_validator` cannot be applied to instance methodszvalidator-instance-methodrq   )rg   rc   rd   )r   is_instance_method_from_sigr   %ensure_classmethod_based_on_signatureFieldValidatorDecoratorInfoPydanticDescriptorProxyrw   dec_inford   rg   rc   r2   r3   dece  s   

zfield_validator.<locals>.decN)rw   rx   r"   ry   )rs   r   r   all)re   rc   rd   rg   r   r2   r   r3   rl     s   
>
_ModelType_ModelTypeCo)	covariantc                   @  s   e Zd ZdZ	ddd	d
ZdS )ModelWrapValidatorHandlerz[@model_validator decorated function handler argument type. This is used when `mode='wrap'`.Ninput_valuer   outer_locationstr | int | Noner"   r   c                 C  rN   rO   r2   )r0   r   r   r2   r2   r3   rP   }  s   z"ModelWrapValidatorHandler.__call__rO   )r   r   r   r   r"   r   r8   r9   r:   r;   rP   r2   r2   r2   r3   r   z  s    r   c                   @  s   e Zd ZdZdd
dZdS )ModelWrapValidatorWithoutInfozA @model_validator decorated function signature.
    This is used when `mode='wrap'` and the function does not have info argument.
    clstype[_ModelType]%_ModelWrapValidatorWithoutInfo__valuer   '_ModelWrapValidatorWithoutInfo__handler%ModelWrapValidatorHandler[_ModelType]r"   r   c                 C  rN   rO   r2   )r0   r   r   r   r2   r2   r3   rP        	z&ModelWrapValidatorWithoutInfo.__call__N)r   r   r   r   r   r   r"   r   r   r2   r2   r2   r3   r         r   c                   @  s   e Zd ZdZdddZdS )ModelWrapValidatorzQA @model_validator decorated function signature. This is used when `mode='wrap'`.r   r   _ModelWrapValidator__valuer   _ModelWrapValidator__handlerr   _ModelWrapValidator__inforX   r"   r   c                 C  rN   rO   r2   )r0   r   r   r   r   r2   r2   r3   rP     s   
zModelWrapValidator.__call__N)
r   r   r   r   r   r   r   rX   r"   r   r   r2   r2   r2   r3   r         r   c                   @  s   e Zd ZdZd	ddZdS )
ModelBeforeValidatorWithoutInfozA @model_validator decorated function signature.
    This is used when `mode='before'` and the function does not have info argument.
    r   r   '_ModelBeforeValidatorWithoutInfo__valuer"   c                 C  rN   rO   r2   )r0   r   r   r2   r2   r3   rP     s   z(ModelBeforeValidatorWithoutInfo.__call__N)r   r   r   r   r"   r   r   r2   r2   r2   r3   r     r   r   c                   @  s   e Zd ZdZddd	Zd
S )ModelBeforeValidatorzUA `@model_validator` decorated function signature. This is used when `mode='before'`.r   r   _ModelBeforeValidator__value_ModelBeforeValidator__inforX   r"   c                 C  rN   rO   r2   )r0   r   r   r   r2   r2   r3   rP     r   zModelBeforeValidator.__call__N)r   r   r   r   r   rX   r"   r   r   r2   r2   r2   r3   r     r   r   |Callable[[_AnyModelWrapValidator[_ModelType]], _decorators.PydanticDescriptorProxy[_decorators.ModelValidatorDecoratorInfo]]c                 C  rN   rO   r2   rc   r2   r2   r3   model_validator  r_   r   Literal['before']qCallable[[_AnyModeBeforeValidator], _decorators.PydanticDescriptorProxy[_decorators.ModelValidatorDecoratorInfo]]c                 C  rN   rO   r2   r   r2   r2   r3   r     s   Literal['after']}Callable[[_AnyModelAfterValidator[_ModelType]], _decorators.PydanticDescriptorProxy[_decorators.ModelValidatorDecoratorInfo]]c                 C  rN   rO   r2   r   r2   r2   r3   r     r_   "Literal['wrap', 'before', 'after']r   c                   s   d fdd}|S )	a  Usage docs: https://docs.pydantic.dev/2.5/concepts/validators/#model-validators

    Decorate model methods for validation purposes.

    Example usage:
    ```py
    from typing import Optional

    from pydantic import BaseModel, ValidationError, model_validator

    class Square(BaseModel):
    width: float
    height: float

    @model_validator(mode='after')
    def verify_square(self) -> 'Rectangle':
        if self.width != self.height:
            raise ValueError('width and height do not match')
        return self

    s = Square(width=1, height=1)
    print(repr(s))
    #> Square(width=1.0, height=1.0)

    try:
        Square(width=1, height=2)
    except ValidationError as e:
        print(e)
        '''
        1 validation error for Square
        __root__
          width and height do not match (type=value_error)
        '''
    ```

    For more in depth examples, see [Model Validators](../concepts/validators.md#model-validators).

    Args:
        mode: A required string literal that specifies the validation mode.
            It can be one of the following: 'wrap', 'before', or 'after'.

    Returns:
        A decorator that can be used to decorate a function to be used as a model validator.
    rw   r   r"   ry   c                   s"   t | } t j d}t | |S )Nr   )r   r{   ModelValidatorDecoratorInfor}   r~   r   r2   r3   r     s   
zmodel_validator.<locals>.decN)rw   r   r"   ry   r2   )rc   r   r2   r   r3   r     s   1AnyTypec                   @  s2   e Zd ZdZedddZedddZejZdS )
InstanceOfu  Generic type for annotating a type that is an instance of a given class.

        Example:
            ```py
            from pydantic import BaseModel, InstanceOf

            class Foo:
                ...

            class Bar(BaseModel):
                foo: InstanceOf[Foo]

            Bar(foo=Foo())
            try:
                Bar(foo=42)
            except ValidationError as e:
                print(e)
                """
                [
                │   {
                │   │   'type': 'is_instance_of',
                │   │   'loc': ('foo',),
                │   │   'msg': 'Input should be an instance of Foo',
                │   │   'input': 42,
                │   │   'ctx': {'class': 'Foo'},
                │   │   'url': 'https://errors.pydantic.dev/0.38.0/v/is_instance_of'
                │   }
                ]
                """
            ```
        itemr   r"   c                 C  s   t ||  f S rO   )r   r   r   r2   r2   r3   __class_getitem__Q  s   zInstanceOf.__class_getitem__sourcer   r    r   r#   c                 C  sh   ddl m} tt|p|}z||}W n |y!   | Y S w tjdd |d|d< tj||dS )Nr   )PydanticSchemaGenerationErrorc                 S     || S rO   r2   vhr2   r2   r3   <lambda>e      z9InstanceOf.__get_pydantic_core_schema__.<locals>.<lambda>functionr'   serialization)python_schemajson_schema)pydanticr   r   is_instance_schemar   
get_origin#wrap_serializer_function_ser_schemajson_or_python_schema)r   r   r    r   instance_of_schemaoriginal_schemar2   r2   r3   r4   U  s   
z'InstanceOf.__get_pydantic_core_schema__N)r   r   r"   r   r   r   r    r   r"   r#   )	r8   r9   r:   r;   classmethodr   r4   object__hash__r2   r2   r2   r3   r   /  s     
r   c                   @  s.   e Zd ZdZdddZedddZejZdS )SkipValidationa  If this is applied as an annotation (e.g., via `x: Annotated[int, SkipValidation]`), validation will be
            skipped. You can also use `SkipValidation[int]` as a shorthand for `Annotated[int, SkipValidation]`.

        This can be useful if you want to use a type annotation for documentation/IDE/type-checking purposes,
        and know that it is safe to skip validation for one or more of the fields.

        Because this converts the validation schema to `any_schema`, subsequent annotation-applied transformations
        may not have the expected effects. Therefore, when used, this annotation should generally be the final
        annotation applied to a type.
        r   r   r"   c                 C  s   t |t f S rO   )r   r   r   r2   r2   r3   r   }  s   z SkipValidation.__class_getitem__r   r    r   r#   c                   s:   || t j fddgd}tj|tjdd  ddS )Nc                   s   | S rO   r2   )_cr   r   r2   r3   r     r   z=SkipValidation.__get_pydantic_core_schema__.<locals>.<lambda>)js_annotation_functionsc                 S  r   rO   r2   r   r2   r2   r3   r     r   r   )metadatar   )r   build_metadata_dictr   
any_schemar   )r   r   r    r   r2   r   r3   r4     s   z+SkipValidation.__get_pydantic_core_schema__N)r   r   r"   r   r   )	r8   r9   r:   r;   r   r   r4   r   r   r2   r2   r2   r3   r   p  s    


r   r2   )
re   rf   rg   rf   rc   rh   rd   ri   r"   rj   )
re   rf   rg   rf   rc   rm   rd   ri   r"   rn   )
re   rf   rg   rf   rc   ro   rd   ri   r"   rp   )rc   rm   r"   r   )rc   r   r"   r   )rc   r   r"   r   )rc   r   r"   r   )Pr;   
__future__r   _annotationsdataclassessys	functoolsr   typesr   typingr   r   r   r   r	   r
   r   pydantic_corer   _core_schematyping_extensionsr   r   r    r   r!   	_internalr   r   r   r   annotated_handlerserrorsr   version_infor   inspect_validatorr*   	dataclass
slots_truer   r=   rA   rE   rK   rT   rY   r+   r-   _V2ValidatorrG   _V2WrapValidatorr   staticmethodr`   r<   ra   rb   rl   ro   r   r   ValidatorFunctionWrapHandlerr   r   r   r   r   ModelAfterValidatorWithoutInfoValidationInfoModelAfterValidator_AnyModelWrapValidator_AnyModeBeforeValidator_AnyModelAfterValidatorr   r   r   r   r2   r2   r2   r3   <module>   s    $
7+$2
,		]		
	:<