o
    h!j                     @  sP  d Z ddlmZ ddlZddlZddlZddlmZ ddl	m
Z
 ddlmZ ddlmZmZmZmZ ddlZddlmZmZ dd	lmZmZ d
dlmZmZ d
dlmZ d
dlmZmZ ddlmZ ddl m!Z!m"Z"m#Z# ddl$m%Z%m&Z&m'Z' ddl(m)Z)m*Z* ddl+m,Z,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z; ej<rddl=m>Z> d
dl?m@ZA d
dl?mBZBmCZC d
dlDmEZE neZFeG ZAeGjHZIG dd deJZKedeAfd G d!d" d"eZLd\d)d*ZMd]d0d1ZNd^d7d8ZOd_d9d:ZPd`d@dAZQdddBdadJdKZRdbdQdRZSG dSdT dTZTdcdVdWZUdcdXdYZVdddZd[ZWdS )ez"Private logic for creating models.    )annotationsN)ABCMeta)partial)FunctionType)AnyCallableGenericMapping)PydanticUndefinedSchemaSerializer)dataclass_transform
deprecated   )PydanticUndefinedAnnotationPydanticUserError)create_schema_validator)GenericBeforeBaseModelWarningPydanticDeprecatedSince20   )ConfigWrapper)DecoratorInfosPydanticDescriptorProxyget_attribute_from_bases)collect_model_fieldsis_valid_field_nameis_valid_privateattr_name)GenerateSchemagenerate_pydantic_signature)PydanticGenericMetadataget_model_typevars_map)
MockValSerset_model_mocks)CallbackGetCoreSchemaHandler)get_cls_types_namespaceis_annotatedis_classvarparent_frame_namespace)ClassAttribute)ValidateCallWrapper)	Signature)Field)	FieldInfoModelPrivateAttr	BaseModelc                      s"   e Zd ZdZd
 fdd	Z  ZS )_ModelNamespaceDictz{A dictionary subclass that intercepts attribute setting on model classes and
    warns about overriding of decorators.
    kstrvobjectreturnNonec                   sL   |  |d }|r||urt|trtd| d|jj d t ||S )N`z"` overrides an existing Pydantic `z` decorator)	get
isinstancer   warningswarndecorator_infodecorator_reprsuper__setitem__)selfr0   r2   existing	__class__ \/var/www/html/ai/venv/lib/python3.10/site-packages/pydantic/_internal/_model_construction.pyr>   2   s   z_ModelNamespaceDict.__setitem__)r0   r1   r2   r3   r4   r5   )__name__
__module____qualname____doc__r>   __classcell__rC   rC   rA   rD   r/   -   s    r/   T)kw_only_defaultfield_specifiersc                      sz   e Zd Z			d'd( fddZejsd)ddZed*ddZd+ fddZ	e
d,d d!Zeed"ed#d-d%d&Z  ZS ).ModelMetaclassNTcls_namer1   basestuple[type[Any], ...]	namespacedict[str, Any]__pydantic_generic_metadata__PydanticGenericMetadata | None#__pydantic_reset_parent_namespace__bool_create_model_module
str | Nonekwargsr   r4   typec                   s  |rY|  |\}}	}
t|||}|j|d< t||j|	|}|r:t||  dur6d) fd	d
}||d< nt|d< |	|d< i |
||d< |jrNt	|| t
 j| |||fi |}ddlm} |j}t|v r{|t||k r{tjtddd t|jdd |_|j|ju rdnd|_t||_|r||_not|di ddt|ddprrtfddD stfddD  }d dd |D }d| d}d | d!}t|vrd d"d |D |g }|d#|j! d$| d%7 }t"|ddd&|_d|_#|$ D ]\}}|%|| q|r&t&t' |_(t|d'd}t)|t*r6t+|}t,||}t-|||| t.|||d||d( t
||j/di | |S t
 j| |||fi |S )*a  Metaclass for creating Pydantic models.

        Args:
            cls_name: The name of the class to be created.
            bases: The base classes of the class to be created.
            namespace: The attribute dictionary of the class to be created.
            __pydantic_generic_metadata__: Metadata for generic models.
            __pydantic_reset_parent_namespace__: Reset parent namespace.
            _create_model_module: The module of the class to be created, if created by `create_model`.
            **kwargs: Catch-all for any other keyword arguments.

        Returns:
            The new class created by the metaclass.
        model_configNr?   r.   _ModelMetaclass__contextr   r4   r5   c                   s   t | |  | | dS )zWe need to both initialize private attributes and call the user-defined model_post_init
                        method.
                        N)init_private_attributes)r?   r[   )original_model_post_initrC   rD   wrapped_model_post_initd   s   
z7ModelMetaclass.__new__.<locals>.wrapped_model_post_initmodel_post_init__class_vars____private_attributes__r   r-   zClasses should inherit from `BaseModel` before generic classes (e.g. `typing.Generic[T]`) for pydantic generics to work properly.)
stacklevel__pydantic_base_init__FrR   
parametersrC   __parameters__c                 3  s    | ]}| v V  qd S NrC   .0x)rd   rC   rD   	<genexpr>   s    z)ModelMetaclass.__new__.<locals>.<genexpr>c                 3  s    | ]	}| vr|V  qd S rf   rC   rg   )parent_parametersrC   rD   rj      s    z, c                 S  s   g | ]}t |qS rC   )r1   rg   rC   rC   rD   
<listcomp>   s    z*ModelMetaclass.__new__.<locals>.<listcomp>ztyping.Generic[]zJAll parameters must be present on typing.Generic; you should inherit from .c                 S  s   g | ]}|j qS rC   )rE   rg   rC   rC   rD   rl      s    z- Note: `typing.Generic` must go last: `class (z): ...`))originargsrd   __pydantic_parent_namespace__)raise_errorstypes_namespacecreate_model_module)r?   r.   r[   r   r4   r5   )0_collect_bases_datar   	for_modelconfig_dictinspect_namespaceignored_typesget_model_post_initr\   frozenset_default_hash_funcr=   __new__mainr.   __mro__r   indexr9   r:   r   getattr__init____pydantic_custom_init__r_   __pydantic_post_init__r   build__pydantic_decorators__rR   r7   alltuplejoinrE   	TypeError__pydantic_complete__items__set_name__build_lenient_weakvaluedictr&   rr   r8   dictunpack_lenient_weakvaluedictr#   set_model_fieldscomplete_model_class__pydantic_init_subclass__)mcsrM   rN   rP   rR   rT   rV   rX   base_field_names
class_varsbase_private_attributesconfig_wrapperprivate_attributesr^   clsr.   mrocombined_parametersparameters_strgeneric_type_labelerror_message	bases_strnameobjparent_namespacert   rA   )r]   rd   rk   rD   r~   <   s   




$
zModelMetaclass.__new__itemc                 C  s`   | j d}|r||v r|| S |dkr,t| dd}t|tr,| }|dur,t| dS t|)zNThis is necessary to keep attribute access working for class attribute access.ra   __pydantic_core_schema____pydantic_validator__N)__dict__r7   r   r8   r    rebuildAttributeError)r?   r   r   maybe_mock_validatorrebuilt_validatorrC   rC   rD   __getattr__   s   

zModelMetaclass.__getattr__rq   Mapping[str, object]c                 O  s   t  S rf   )r/   )r   rq   rX   rC   rC   rD   __prepare__   s   zModelMetaclass.__prepare__instancec                   s   t |do
t |S )zsAvoid calling ABC _abc_subclasscheck unless we're pretty sure.

        See #3829 and python/cpython#92810
        r   )hasattrr=   __instancecheck__)r?   r   rA   rC   rD   r      s   z ModelMetaclass.__instancecheck__6tuple[set[str], set[str], dict[str, ModelPrivateAttr]]c                 C  sp   ddl m} t }t }i }| D ]"}t||r2||ur2|t|di   ||j ||j q|||fS )Nr   r-   model_fields)	r   r.   set
issubclassupdater   keysr`   ra   )rN   r.   field_namesr   r   baserC   rC   rD   rv      s   
z"ModelMetaclass._collect_bases_dataEThe `__fields__` attribute is deprecated, use `model_fields` instead.)categorydict[str, FieldInfo]c                 C  s   t dt | jS )Nr   )r9   r:   DeprecationWarningr   r?   rC   rC   rD   
__fields__   s   zModelMetaclass.__fields__)NTN)rM   r1   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   r   r4   rY   )r   r1   r4   r   )rq   r   rX   r   r4   r   )r   r   r4   rU   )rN   rO   r4   r   )r4   r   )rE   rF   rG   r~   typingTYPE_CHECKINGr   classmethodr   r   staticmethodrv   propertyr   r   r   rI   rC   rC   rA   rD   rL   :   s$     
rL   r?   r.   	__contextr   r4   r5   c                 C  sT   t | dddu r(i }| j D ]\}}| }|tur|||< qt| d| dS dS )a  This function is meant to behave like a BaseModel method to initialise private attributes.

    It takes context as an argument since that's what pydantic-core passes when calling it.

    Args:
        self: The BaseModel instance.
        __context: The context.
    __pydantic_private__N)r   ra   r   get_defaultr
   object_setattr)r?   r   pydantic_privater   private_attrdefaultrC   rC   rD   r\      s   	r\   rP   rQ   rN   rO   Callable[..., Any] | Nonec                 C  s8   d| v r| d S ddl m} t|d}||jur|S dS )zaGet the `model_post_init` method from the namespace or the class bases, or `None` if not defined.r_   r   r-   N)r   r.   r   r_   )rP   rN   r.   r_   rC   rC   rD   r{     s   

r{   rz   base_class_varsset[str]base_class_fieldsdict[str, ModelPrivateAttr]c              	     s  ddl m}m m} |t  }i }| di }d|v sd| v r#tdt }	t| 	 D ]\}
}|
dkr5q,t
|trJ|j| d krJ|j| d rJq,t
||sU|jjd	kr[|	|
 q,t
| r|
d
rmtd|
dt|
r~tdd|
 d|
d|||
< | |
= q,t
||rt|
s|
dpd}td|d|
d|
d
rq,t|
r|
|vst||
 s||d||
< | |
= q,|
|v rq,|
|vr|
|v rtd|
dddt
||rtd|
dddtd|
 d|d|
 dddq,|	 D ]M\}}t|rH||vrH||	vrHt|sH||vrHt|ddd	krHt|rCt|^}}t fdd|D d}|durC|||< q| ||< q|S ) a  Iterate over the namespace and:
    * gather private attributes
    * check for items which look like fields but are not (e.g. have no annotation) and warn.

    Args:
        namespace: The attribute dictionary of the class to be created.
        ignored_types: A tuple of ignore types.
        base_class_vars: A set of base class class variables.
        base_class_fields: A set of base class fields.

    Returns:
        A dict contains private attributes info.

    Raises:
        TypeError: If there is a `__root__` field in model.
        NameError: If private attribute name is invalid.
        PydanticUserError:
            - If a field does not have a type annotation.
            - If a field on base class was overridden by a non-annotated attribute.
    r   )r+   r,   PrivateAttr__annotations____root__zUTo define root models, use `pydantic.RootModel` rather than a field called '__root__'rZ   rF   rG   	functools__zXPrivate attributes must not use dunder names; use a single underscore prefix instead of rn   zJPrivate attributes must not use valid field names; use sunder names, e.g. _z instead of my_fieldz>Fields must not use names with leading underscores; e.g., use )r   zField z defined on a base class was overridden by a non-annotated attribute. All field definitions, including overrides, require a type annotation.zmodel-field-overridden)codez requires a type annotationzmodel-field-missing-annotationz)A non-annotated attribute was detected: `z = z3`. All model fields require a type annotation; if `z` is not meant to be a field, you may be able to resolve this error by annotating it as a `ClassVar` or updating `model_config['ignored_types']`.Nc                 3  s    | ]
}t | r|V  qd S rf   )r8   )rh   r2   r,   rC   rD   rj     s    z$inspect_namespace.<locals>.<genexpr>)fieldsr+   r,   r   default_ignored_typesr7   r   r   listr   r8   rY   rF   rG   
startswithrB   add	NameErrorr   lstripr   r%   r   r   r$   typing_extensionsget_argsnext)rP   rz   r   r   r+   r   all_ignored_typesr   raw_annotationsignored_namesvar_namevaluesuggested_nameann_nameann_typer   metadatar   rC   r   rD   ry     s   












ry   c                 C  s>   d| v rd S t |d}|d tjhv rddd}|| d< d S d S )	N__hash__r?   r   r4   intc                 S  s   t | jt t| j  S rf   )hashrB   r   r   valuesr   rC   rC   rD   	hash_func  s   z(set_default_hash_func.<locals>.hash_func)r?   r   r4   r   )r   r3   r   )rP   rN   base_hash_funcr   rC   rC   rD   r}     s   

r}   r   type[BaseModel]r   r   rt   c           	      C  sl   t | }t| ||||d\}}|| _| j| |D ]}| j|d}|dur3|jtur3t	| ||j qdS )a.  Collect and set `cls.model_fields` and `cls.__class_vars__`.

    Args:
        cls: BaseModel or dataclass.
        bases: Parents of the class, generally `cls.__bases__`.
        config_wrapper: The config wrapper instance.
        types_namespace: Optional extra namespace to look for types in.
    )typevars_mapN)
r   r   r   r`   r   ra   popr   r
   setattr)	r   rN   r   rt   r   r   r   r0   r   rC   rC   rD   r     s   r   )rs   ru   rM   r1   rs   rU   dict[str, Any] | Noneru   rW   c             
   C  s*  t | }t|||}tt|jdd|dd}|jr t| | dS z| | |}	W n! tyI }
 z|r3 t| |d|
j	 d W Y d}
~
dS d}
~
ww |
| }z||	}	W n |jyf   t| | Y dS w |	| _t|	| |pq| j| j|rwdnd||j| _t|	|| _d	| _td
t| j| j|| _d	S )a  Finish building a model class.

    This logic must be called after class has been created since validation functions must be bound
    and `get_type_hints` requires a class object.

    Args:
        cls: BaseModel or dataclass.
        cls_name: The model or dataclass name.
        config_wrapper: The config wrapper instance.
        raise_errors: Whether to raise errors.
        types_namespace: Optional extra namespace to look for types in.
        create_model_module: The module of the class to be created, if created by `create_model`.

    Returns:
        `True` if the model is successfully completed, else `False`.

    Raises:
        PydanticUndefinedAnnotation: If `PydanticUndefinedAnnotation` occurs in`__get_pydantic_core_schema__`
            and `raise_errors=True`.
    F)from_dunder_get_core_schemaunpack)ref_moder6   Ncreate_modelr.   T__signature__)r   r   r"   r   generate_schemadefer_buildr!   __get_pydantic_core_schema__r   r   core_configclean_schemaCollectedInvalidr   r   rF   rG   plugin_settingsr   r   __pydantic_serializer__r   r'   generate_model_signaturer   r   r   )r   rM   r   rs   rt   ru   r   
gen_schemahandlerschemaer  rC   rC   rD   r     s\   



	r   initCallable[..., None]r   r   r)   c                 C  s   t | ||S )zGenerate signature for model based on its fields.

    Args:
        init: The class init.
        fields: The model fields.
        config_wrapper: The config wrapper instance.

    Returns:
        The model signature.
    )r   )r  r   r   rC   rC   rD   r    s   r  c                   @  s.   e Zd ZdZdddZdddZdd
dZdS )_PydanticWeakRefa  Wrapper for `weakref.ref` that enables `pickle` serialization.

    Cloudpickle fails to serialize `weakref.ref` objects due to an arcane error related
    to abstract base classes (`abc.ABC`). This class works around the issue by wrapping
    `weakref.ref` instead of subclassing it.

    See https://github.com/pydantic/pydantic/issues/6763 for context.

    Semantics:
        - If not pickled, behaves the same as a `weakref.ref`.
        - If pickled along with the referenced object, the same `weakref.ref` behavior
          will be maintained between them after unpickling.
        - If pickled without the referenced object, after unpickling the underlying
          reference will be cleared (`__call__` will always return `None`).
    r   r   c                 C  s"   |d u r	d | _ d S t|| _ d S rf   )_wrweakrefref)r?   r   rC   rC   rD   r   1  s   
z_PydanticWeakRef.__init__r4   c                 C  s   | j d u rd S |   S rf   )r  r   rC   rC   rD   __call__9  s   
z_PydanticWeakRef.__call__4tuple[Callable, tuple[weakref.ReferenceType | None]]c                 C  s   t |  ffS rf   )r  r   rC   rC   rD   
__reduce__?  s   z_PydanticWeakRef.__reduce__N)r   r   )r4   r   )r4   r  )rE   rF   rG   rH   r   r  r  rC   rC   rC   rD   r     s
    

r  dc              	   C  sR   | du rdS i }|   D ]\}}zt|}W n ty!   |}Y nw |||< q|S )aX  Takes an input dictionary, and produces a new value that (invertibly) replaces the values with weakrefs.

    We can't just use a WeakValueDictionary because many types (including int, str, etc.) can't be stored as values
    in a WeakValueDictionary.

    The `unpack_lenient_weakvaluedict` function can be used to reverse this operation.
    N)r   r  r   )r  resultr0   r2   proxyrC   rC   rD   r   C  s   
r   c                 C  sP   | du rdS i }|   D ]\}}t|tr!| }|dur |||< q|||< q|S )zAInverts the transform performed by `build_lenient_weakvaluedict`.N)r   r8   r  )r  r  r0   r2   rC   rC   rD   r   W  s   

r   c                  C  s   ddl m}  ttttt| tfS )Nr   ComputedFieldInfo)r   r  r   r   r   r   r   r(   r  rC   rC   rD   r   g  s   r   )r?   r.   r   r   r4   r5   )rP   rQ   rN   rO   r4   r   )
rP   rQ   rz   rO   r   r   r   r   r4   r   )rP   rQ   rN   rO   r4   r5   )
r   r   rN   rO   r   r   rt   rQ   r4   r5   )r   r   rM   r1   r   r   rs   rU   rt   r   ru   rW   r4   rU   )r  r  r   r   r   r   r4   r)   )r  r   r4   r   )r4   rO   )XrH   
__future__r   _annotationsr   r9   r  abcr   r   r   typesr   r   r   r   r	   r   pydantic_corer
   r   r   r   errorsr   r   plugin._schema_validatorr   r   r   _configr   _decoratorsr   r   r   _fieldsr   r   r   _generate_schemar   r   	_genericsr   r   _mock_val_serr    r!   _schema_generation_sharedr"   _typing_extrar#   r$   r%   r&   _utilsr'   _validate_callr(   r   inspectr)   r   r*   PydanticModelFieldr+   r,   r   r.   r   r3   __setattr__r   r   r/   rL   r\   r{   ry   r}   r   r   r  r  r   r   r   rC   rC   rC   rD   <module>   sd     
B


u
#
T
#
