o
    fz                     @  s  d Z ddlmZ ddlZddl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%m&Z& ddl'm(Z(m)Z)m*Z* ddl+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z: ddl;m<Z<m=Z= ddl>m?Z? ej@rd
dlAmBZC d
dlAmDZDmEZE d
dlAmFZG d
dlHmIZI neZJeK ZCeK ZGeKjLZMG dd deNZOed eCeGfd!G d"d# d#e
ZPd\d*d+ZQd]d1d2ZRd^d8d9ZSd_d<d=ZTd`d>d?ZUdadCdDZVd ddEdbdMdNZWdcdOdPZXG dQdR dRZYG dSdT dTZZdddVdWZ[dddXdYZ\dedZd[Z]dS )fz"Private logic for creating models.    )annotationsN)ABCMeta)partial)FunctionType)AnyCallableGenericNoReturn)PydanticUndefinedSchemaSerializer)dataclass_transform
deprecated   )PydanticUndefinedAnnotationPydanticUserError)create_schema_validator)GenericBeforeBaseModelWarningPydanticDeprecatedSince20   )ConfigWrapper)DecoratorInfosPydanticDescriptorProxyget_attribute_from_basesunwrap_wrapped_function)collect_model_fieldsis_valid_field_nameis_valid_privateattr_name)GenerateSchema)PydanticGenericMetadataget_model_typevars_map)set_model_mocks)CallbackGetCoreSchemaHandler)generate_pydantic_signature)get_cls_types_namespaceis_annotatedis_classvarparent_frame_namespace)ClassAttributeSafeGetItemProxy)ValidateCallWrapper)Field)	FieldInfoModelPrivateAttr)PrivateAttr	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__)selfr1   r3   existing	__class__ ^/var/www/NoticeGen/venv/lib/python3.10/site-packages/pydantic/_internal/_model_construction.pyr?   6   s   z_ModelNamespaceDict.__setitem__)r1   r2   r3   r4   r5   r6   )__name__
__module____qualname____doc__r?   __classcell__rD   rD   rB   rE   r0   1   s    r0   T)kw_only_defaultfield_specifiersc                      s   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"dd#d0d%d&Zd1 fd(d)Z  ZS )2ModelMetaclassNTcls_namer2   basestuple[type[Any], ...]	namespacedict[str, Any]__pydantic_generic_metadata__PydanticGenericMetadata | None#__pydantic_reset_parent_namespace__bool_create_model_module
str | Nonekwargsr   r5   typec                   sZ  |r|  |\}}	}
t|||}|j|d< t||j|	|}|s#|
r<t||  dur8d2 fd	d
}||d< nt|d< |	|d< i |
||d< t j	| |||fi |}ddl
m} |j}t|v ru|t||k rutjtddd t|jdd |_|j|ju rdnd|_t||_|r||_nt|di ddt|ddpr,r,tfddD s,ddlm} tfddD }|v r|vrd dd |D }|j! d| d |j! d!| d"}t"|| }d d#d |D }d$| d%}d&| d'}t|vr(d d(d |D |g }|d)|j! d*| d+7 }t"|ddd,|_d|_#|$ D ]\}}|%|| q:|rOt&t' |_(t|d-d}t)|t*r_t+|}t,||}t-|||| |j.ryd.|vryt/|| t0|||d||d/ d0d1 |jj1$ D |_2t3| t||j4di | |S t j	| |||fi |S )3a  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/   contextr   r5   r6   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_initrD   rE   wrapped_model_post_inith   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__FrS   
parametersrD   __parameters__c                 3  s    | ]}| v V  qd S NrD   .0x)rf   rD   rE   	<genexpr>   s    z)ModelMetaclass.__new__.<locals>.<genexpr>)RootModelRootTypec                 3  s    | ]	}| vr|V  qd S rh   rD   ri   )parent_parametersrD   rE   rl      s    z, c                 S     g | ]}|j qS rD   rF   ri   rD   rD   rE   
<listcomp>       z*ModelMetaclass.__new__.<locals>.<listcomp>zS is a subclass of `RootModel`, but does not include the generic type identifier(s) zL in its parameters. You should parametrize RootModel directly, e.g., `class z(RootModel[z	]): ...`.c                 S  s   g | ]}t |qS rD   )r2   ri   rD   rD   rE   rq      s    ztyping.Generic[]zJAll parameters must be present on typing.Generic; you should inherit from .c                 S  ro   rD   rp   ri   rD   rD   rE   rq      rr   z- Note: `typing.Generic` must go last: `class (z): ...`))originargsrf   __pydantic_parent_namespace____hash__)raise_errorstypes_namespacecreate_model_modulec                 S  s   i | ]\}}||j qS rD   )info)rj   r1   r3   rD   rD   rE   
<dictcomp>   s    z*ModelMetaclass.__new__.<locals>.<dictcomp>r@   r/   r\   r   r5   r6   )5_collect_bases_datar   	for_modelconfig_dictinspect_namespaceignored_typesget_model_post_initr]   r>   __new__mainr/   __mro__r   indexr:   r;   r   getattr__init____pydantic_custom_init__r`   __pydantic_post_init__r   build__pydantic_decorators__rS   r8   all
root_modelrm   tuplejoinrF   	TypeError__pydantic_complete__items__set_name__build_lenient_weakvaluedictr&   rx   r9   dictunpack_lenient_weakvaluedictr#   set_model_fieldsfrozenset_default_hash_funccomplete_model_classcomputed_fieldsmodel_computed_fieldsset_deprecated_descriptors__pydantic_init_subclass__)mcsrN   rO   rQ   rS   rU   rW   rY   base_field_names
class_varsbase_private_attributesconfig_wrapperprivate_attributesr_   clsr/   mrorm   missing_parametersparameters_strerror_messagecombined_parametersgeneric_type_label	bases_strnameobjparent_namespacer{   rB   )r^   rf   rn   rE   r   @   s   



$


zModelMetaclass.__new__itemc                 C  s(   | j d}|r||v r|| S t|)zNThis is necessary to keep attribute access working for class attribute access.rb   )__dict__r8   AttributeError)r@   r   r   rD   rD   rE   __getattr__   s   zModelMetaclass.__getattr__rw   dict[str, object]c                 O  s   t  S rh   )r0   )r   rw   rY   rD   rD   rE   __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
        __pydantic_validator__)hasattrr>   __instancecheck__)r@   r   rB   rD   rE   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   keysra   rb   )rO   r/   field_namesr   r   baserD   rD   rE   r      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   )r:   r;   r   r   r@   rD   rD   rE   
__fields__	  s   zModelMetaclass.__fields__	list[str]c                   s$   t t  }d|v r|d |S )Nr   )listr>   __dir__remove)r@   
attributesrB   rD   rE   r     s   
zModelMetaclass.__dir__)NTN)rN   r2   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r   r5   rZ   )r   r2   r5   r   )rw   r   rY   r   r5   r   )r   r   r5   rV   )rO   rP   r5   r   )r5   r   )r5   r   )rF   rG   rH   r   typingTYPE_CHECKINGr   classmethodr   r   staticmethodr   propertyr   r   r   rJ   rD   rD   rB   rE   rM   >   s"     &

rM   r@   r/   r\   r   r5   r6   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   rb   r   get_defaultr
   object_setattr)r@   r\   pydantic_privater   private_attrdefaultrD   rD   rE   r]     s   	r]   rQ   rR   rO   rP   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`   )rQ   rO   r/   r`   rD   rD   rE   r   *  s   

r   r   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s8|
dkr9q,t
|trR|j| d krRd	| v rR|j| d	 rRq,t
||s]|jjd
krc|	|
 q,t
| r|
drutd|
dt|
rt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 ]O\}}t|rQ||vrQ||	vrQt|sQ||vrQt|ddd
krQt|rLt|^}}t fdd |D d}|durL|||< 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,   r-   __annotations____root__zUTo define root models, use `pydantic.RootModel` rather than a field called '__root__'r[   __pydantic_extra__rG   rH   	functools__zXPrivate attributes must not use dunder names; use a single underscore prefix instead of rt   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 rh   )r9   )rj   r3   r,   rD   rE   rl     s    z$inspect_namespace.<locals>.<genexpr>)fieldsr+   r,   r-   default_ignored_typesr8   r   r   r   r   r9   rZ   rG   rH   
startswithrC   add	NameErrorr   lstripr   r%   r   r   r$   typing_extensionsget_argsnext)rQ   r   r   r   r+   r-   all_ignored_typesr   raw_annotationsignored_namesvar_namevaluesuggested_nameann_nameann_typer   metadatar   rD   r   rE   r   6  s   












r   r   type[BaseModel]c                 C  s@   t |d}t| }|d tjhv st|dd |jkr|| _d S d S )Nry   __code__)r   make_hash_funcr4   ry   r   r   )r   rO   base_hash_funcnew_hash_funcrD   rD   rE   r     s
   
 
r   c                   s0   | j rtj| j   ndd  d	 fdd}|S )
Nc                 S  s   dS )Nr   rD   )r   rD   rD   rE   <lambda>  s    z make_hash_func.<locals>.<lambda>r@   r   r5   intc                   s6   zt  | jW S  ty   t  t| j Y S w rh   )hashr   KeyErrorr(   r   getterrD   rE   	hash_func  s
   z!make_hash_func.<locals>.hash_func)r@   r   r5   r  )r   operator
itemgetterr   )r   r  rD   r  rE   r     s   
r   r   r   r{   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   ra   r   rb   popr   r
   setattr)	r   rO   r   r{   r	  r   r   r1   r   rD   rD   rE   r     s   r   )rz   r|   rN   r2   rz   rV   dict[str, Any] | Noner|   rX   c             
   C  s6  t | }t|||}tt|jdd|dd}|jr%d|jv r%t| | dS z| | |}	W n! t	yN }
 z|r8 t| |d|
j
 d W Y d}
~
dS d}
~
ww || }z||	}	W n |jyk   t| | Y dS w |	| _t|	| |pv| j| j|r|dnd	||j| _t|	|| _d
| _tdt| j| j|d| _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_modemodelr7   Ncreate_modelr/   T__signature__)initr   r   )r   r   r!   r   generate_schemadefer_buildexperimental_defer_build_moder    __get_pydantic_core_schema__r   r   core_configclean_schemaCollectedInvalid__pydantic_core_schema__r   rG   rH   plugin_settingsr   r   __pydantic_serializer__r   r'   r"   r   r   r  )r   rN   r   rz   r{   r|   r	  
gen_schemahandlerschemaer  rD   rD   rE   r     s^   



	r   c                 C  s   | j  D ]\}}|j }dur t|}|| | t| || q| j D ]%\}}|j }durKtt|j	dsKt||j	}|| | t| || q&dS )z8Set data descriptors on the class for deprecated fields.N__deprecated__)
r   r   deprecation_message_DeprecatedFieldDescriptorr   r  r   r   r   wrapped_property)r   field
field_infomsgdesccomputed_field_inforD   rD   rE   r   <  s   r   c                   @  sF   e Zd ZU dZded< ddd
dZdddZddddZd ddZdS )!r$  aM  Data descriptor used to emit a runtime deprecation warning before accessing a deprecated field.

    Attributes:
        msg: The deprecation message to be emitted.
        wrapped_property: The property instance if the deprecated field is a computed field, or `None`.
        field_name: The name of the field being deprecated.
    r2   
field_nameNr(  r%  property | Noner5   r6   c                 C  s   || _ || _d S rh   )r(  r%  )r@   r(  r%  rD   rD   rE   r   Z  s   
z#_DeprecatedFieldDescriptor.__init__r   r   r   c                 C  s
   || _ d S rh   )r+  )r@   r   r   rD   rD   rE   r   ^     
z'_DeprecatedFieldDescriptor.__set_name__r   BaseModel | Noneobj_typetype[BaseModel] | Noner   c                 C  sJ   |d u r	t | jtj| jtjdd | jd ur| j||S |j	| j S )Nr   rc   )
r   r+  r:   r;   r(  builtinsDeprecationWarningr%  __get__r   )r@   r   r/  rD   rD   rE   r3  a  s   

z"_DeprecatedFieldDescriptor.__get__r   r	   c                 C  s
   t | jrh   )r   r+  )r@   r   r   rD   rD   rE   __set__n  r-  z"_DeprecatedFieldDescriptor.__set__rh   )r(  r2   r%  r,  r5   r6   )r   r   r   r2   r5   r6   )r   r.  r/  r0  r5   r   )r   r   r   r   r5   r	   )	rF   rG   rH   rI   r   r   r   r3  r4  rD   rD   rD   rE   r$  O  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 rh   )_wrweakrefref)r@   r   rD   rD   rE   r     s   
z_PydanticWeakRef.__init__r5   c                 C  s   | j d u rd S |   S rh   )r6  r   rD   rD   rE   __call__  s   
z_PydanticWeakRef.__call__4tuple[Callable, tuple[weakref.ReferenceType | None]]c                 C  s   t |  ffS rh   )r5  r   rD   rD   rE   
__reduce__  s   z_PydanticWeakRef.__reduce__N)r   r   )r5   r   )r5   r:  )rF   rG   rH   rI   r   r9  r;  rD   rD   rD   rE   r5  r  s
    

r5  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   r5  r   )r<  resultr1   r3   proxyrD   rD   rE   r     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   r9   r5  )r<  r=  r1   r3   rD   rD   rE   r     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?  rD   rD   rE   r     s   r   r   )rQ   rR   rO   rP   r5   r   )
rQ   rR   r   rP   r   r   r   r   r5   r   )r   r   rO   rP   r5   r6   )r   r   r5   r   )
r   r   rO   rP   r   r   r{   rR   r5   r6   )r   r   rN   r2   r   r   rz   rV   r{   r  r|   rX   r5   rV   )r   r   r5   r6   )r<  r  r5   r  )r5   rP   )^rI   
__future__r   _annotationsr1  r  r   r:   r7  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   r   _fieldsr   r   r   _generate_schemar   	_genericsr   r   _mock_val_serr    _schema_generation_sharedr!   
_signaturer"   _typing_extrar#   r$   r%   r&   _utilsr'   r(   _validate_callr)   r   r   r*   PydanticModelFieldr+   r,   r-   PydanticModelPrivateAttrr   r/   r2  r4   __setattr__r   r   r0   rM   r]   r   r   r   r   r   r   r   r$  r5  r   r   r   rD   rD   rD   rE   <module>   sp     
Z


v

#
U#
#
