a
    y{Jh^1                     @  s  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mZ ddlm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 erddlmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" d>dddddddZ#G dd deZ$ddddd Z%e	dd!d"d#d$d%Z&dd&d'd(d)dd*d+d,d-d.Z'd/ddd0d1d2Z(dd&d3dd*d4d5d6d7Z)d8dd9d:d;Z*d8dd9d<d=Z+dS )?zmPrivate logic related to fields (the `Field()` function and `FieldInfo` class), and arguments to `Annotated`.    )annotationsN)copy)	lru_cache)TYPE_CHECKINGAny)PydanticUndefined   )_typing_extra)ConfigWrapper)Representation)get_cls_type_hints_lenientget_type_hintsis_classvaris_finalvarBaseMetadata   	FieldInfo	BaseModel)StandardDataclass)DecoratorInfosFr   zdict[str, Any] | Noneboolzdict[str, Any])objlocalnsinclude_extrasreturnc                 C  sH   t | dd}d}|r8ztj| j}W n ty6   Y n0 t| |||dS )a  Gets type hints for an object by inferring the global namespace.

    It uses the `typing.get_type_hints`, The only thing that we do here is fetching
    global namespace from `obj.__module__` if it is not `None`.

    Args:
        obj: The object to get its type hints.
        localns: The local namespaces.
        include_extras: Whether to recursively include annotation metadata.

    Returns:
        The object type hints.
    
__module__N)globalnsr   r   )getattrsysmodules__dict__KeyErrorr   )r   r   r   module_namer    r&   L/var/www/shaz/venv/lib/python3.9/site-packages/pydantic/_internal/_fields.pyget_type_hints_infer_globalns   s    r(   c                   @  s   e Zd ZdZdZdS )PydanticMetadataz0Base class for annotation markers like `Strict`.r&   N)__name__r   __qualname____doc__	__slots__r&   r&   r&   r'   r)   8   s   r)   r   )metadatar   c                  K  s
   t  | S )zCreate a new `_PydanticGeneralMetadata` class with the given metadata.

    Args:
        **metadata: The metadata to add.

    Returns:
        The new `_PydanticGeneralMetadata` class.
    )_general_metadata_clsr.   r&   r&   r'   pydantic_general_metadata>   s    	r1   )maxsizeztype[BaseMetadata])r   c                  C  s"   ddl m}  G dd dt| }|S )zCDo it this way to avoid importing `annotated_types` at import time.r   r   c                   @  s   e Zd ZdZddddZdS )z7_general_metadata_cls.<locals>._PydanticGeneralMetadataz,Pydantic general metadata like `max_digits`.r   r0   c                 S  s
   || _ d S N)r#   )selfr.   r&   r&   r'   __init__R   s    z@_general_metadata_cls.<locals>._PydanticGeneralMetadata.__init__N)r*   r   r+   r,   r5   r&   r&   r&   r'   _PydanticGeneralMetadataO   s   r6   )annotated_typesr   r)   )r   r6   r&   r&   r'   r/   J   s    r/   )typevars_mapztype[BaseModel]ztuple[type[Any], ...]r
   zdict[Any, Any] | Nonez%tuple[dict[str, FieldInfo], set[str]])clsbasesconfig_wrappertypes_namespacer8   r   c                  s  ddl m} t| |}| jdi }i }t }	| D ]\ }
 dkrJq6|jD ]} |rP|D ]P}t	| rbddl
m} t||r |jv sbtd  dt|  d| d	qbt fd
d|jD }td  d| d| dt qPt|
r|	  q6t|
t|  tr$|	  q6t s0q6| jrR dkrRtd dt| di d}|D ]n}dd t|rt |ndD }t	| rh||u rqh |v rqhtd  d|j dt qhzt|  t}|tu rtW nz typ    |v r||
}nPi }| jddd D ]}| t|di  q0 |v rbt!|  }n
||
}Y n20 |"|
|}zt#|   W n ty   Y n0 | jd } |j$v rt%d|| < q6|r|& D ]}|'|| q||	fS )a[  Collect the fields of a nascent pydantic model.

    Also collect the names of any ClassVars present in the type hints.

    The returned value is a tuple of two items: the fields dict, and the set of ClassVar names.

    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_map: A dictionary mapping type variables to their concrete types.

    Returns:
        A tuple contains fields and class variables.

    Raises:
        NameError:
            - If there is a conflict between a field name and protected namespaces.
            - If there is a field other than `root` in `RootModel`.
            - If a field shadows an attribute in the parent model.
    r   r   __annotations__Zmodel_configr   zField "z" conflicts with member z of protected namespace "z".c                 3  s   | ]}  |s|V  qd S r3   
startswith).0xann_namer&   r'   	<genexpr>   s   z'collect_model_fields.<locals>.<genexpr>z)" has conflict with protected namespace "z_".

You may be able to resolve this warning by setting `model_config['protected_namespaces'] = z`.rootzUnexpected field with name z4; only 'root' is allowed as a field of a `RootModel`Z__pydantic_generic_metadata__originc                 S  s   h | ]
}|j qS r&   name)r@   fieldr&   r&   r'   	<setcomp>   s   z'collect_model_fields.<locals>.<setcomp>r&   zField name "z"" shadows an attribute in parent "z"; Nmodel_fieldsZ__pydantic_decorators__z0you can't override a field with a computed field)(fieldsr   r   r#   getsetitemsZprotected_namespacesr?   hasattrmainr   
issubclassrL   	NameErrorr    tuplewarningswarnUserWarningr   add_is_finalvar_with_default_valr   is_valid_field_nameZ__pydantic_root_model__dataclassesis_dataclassr+   AttributeErrorZfrom_annotation	__bases__updater   from_annotated_attributedelattrZcomputed_fields
ValueErrorvaluesapply_typevars_map)r9   r:   r;   r<   r8   r   Z
type_hintsr   rM   Z
class_varsann_typeZprotected_namespacebr   Zvalid_namespacesZgeneric_originbasedataclass_fieldsdefault
field_infoZmodel_fields_lookuprA   Z
decoratorsrI   r&   rB   r'   collect_model_fieldsX   s    















rl   z	type[Any])type_valr   c                 C  sN   ddl m} t| sdS |tu r$dS t||rF|jtu rF|jd u rFdS dS d S )Nr   r   FT)rM   r   r   r   
isinstancerj   default_factory)rm   rn   r   r&   r&   r'   rZ      s    rZ   ztype[StandardDataclass]zdict[str, FieldInfo])r9   r<   r8   r   c                C  s   ddl m} i }| j}tt| }| D ]\}}t|j||}	t	|	rLq*|j
sl|jtjkrl|jtjkrlq*t|j|r|jjrq*||	|j}
n||	|}
|
||< |
jtur*tt| ||
|r*t| ||
j q*|r| D ]}||| q|S )a  Collect the fields of a dataclass.

    Args:
        cls: dataclass.
        types_namespace: Optional extra namespace to look for types in.
        typevars_map: A dictionary mapping type variables to their concrete types.

    Returns:
        The dataclass fields.
    r   r   )rM   r   __dataclass_fields__dictvarsrP   r	   Zeval_type_lenienttyper   initrj   r\   MISSINGrp   ro   Zinit_varra   r   r    setattrrd   re   )r9   r<   r8   r   rM   ri   Zcls_localnsrC   Zdataclass_fieldrf   rk   rI   r&   r&   r'   collect_dataclass_fields   s6    

rx   str)rH   r   c                 C  s   |  d S )N_r>   rG   r&   r&   r'   r[   -  s    r[   c                 C  s   |  do|  d S )Nrz   __r>   rG   r&   r&   r'   is_valid_privateattr_name1  s    r|   )NF),r,   
__future__r   Z_annotationsr\   r!   rV   r   	functoolsr   typingr   r   Zpydantic_corer    r	   _configr
   _reprr   r   r   r   r   r7   r   rM   r   rR   r   Z_dataclassesr   Z_decoratorsr   r(   r)   r1   r/   rl   rZ   rx   r[   r|   r&   r&   r&   r'   <module>   sB      5