a
    h;                     @  s  U 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	Z	ddl
mZ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 dd
lmZmZmZmZmZmZ ddlmZ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l-m.Z. ej/r6dZ0de1d< dZ2de1d< ddl3m4Z4 e5e6e7e8e9e:e;e,j<eeee	j=eee>j?e@j?hZAde1d< eBeCeDeEeFeeehZGde1d< dddddZHd dd!d"d#ZId d$dd%d&d'ZJd d dd(d)d*ZKd d+d,d-d.ZLd/dd0d1d2ZMe"d3ZNd4d4d4d5d6d7ZOd8d d9d:d;d<ZPe"d=ZQe8d>d?d@dAdBdCdDZRG dEdF dFe+jSZTej/rdd/dGd=dHdIdJZUnG dKdJ dJZUe"dLZVdLdLdMdNdOZWeX ZYdPdPddQdRdSZZej[dTdUG dVdW dWZ\e"dXdYdZZ]e"d[Z^G d\d] d]e!e]e^f Z_dS )^zBucket of reusable internal utilities.

This should be reduced as much as possible with functions only used in one place, moved to that place.
    )annotationsN)OrderedDictdefaultdictdeque)Mapping)deepcopy)cached_property)	Parameter)zip_longest)BuiltinFunctionTypeCodeTypeFunctionTypeGeneratorType
LambdaType
ModuleType)AnyCallableGenericTypeVaroverload)	TypeAlias	TypeGuard
deprecated)PydanticDeprecatedSince211   )_repr_typing_extra)import_cached_base_modelz3typing.Mapping[int, Any] | typing.Mapping[str, Any]r   MappingIntStrAnyz1typing.AbstractSet[int] | typing.AbstractSet[str]AbstractSetIntStr   )	BaseModelzset[type[Any]]IMMUTABLE_NON_COLLECTIONS_TYPESBUILTIN_COLLECTIONSr	   bool)paramreturnc                 C  s   | j tjtjfv S )aZ  Return whether the parameter accepts a positional argument.

    ```python {test="skip" lint="skip"}
    def func(a, /, b, *, c):
        pass

    params = inspect.signature(func).parameters
    can_be_positional(params['a'])
    #> True
    can_be_positional(params['b'])
    #> True
    can_be_positional(params['c'])
    #> False
    ```
    )kindr	   POSITIONAL_ONLYPOSITIONAL_OR_KEYWORD)r%    r*   U/var/www/html/assistant/venv/lib/python3.9/site-packages/pydantic/_internal/_utils.pycan_be_positionalH   s    r,   r   vr&   c                 C  s   t | ttttttfS N)
isinstancelisttupleset	frozensetr   r   r.   r*   r*   r+   sequence_like[   s    r6   z(type[Any] | tuple[type[Any], ...] | None)oclass_or_tupler&   c                 C  s&   zt | |W S  ty    Y dS 0 d S NF)r0   	TypeError)r7   r8   r*   r*   r+   lenient_isinstance_   s    r;   )clsr8   r&   c                 C  sB   zt | tot| |W S  ty<   t | tjr6Y dS  Y n0 d S r9   )r0   type
issubclassr:   r   ZWithArgsTypes)r<   r8   r*   r*   r+   lenient_issubclassf   s    r?   zTypeGuard[type[BaseModel]])r<   r&   c                 C  s   t  }t| |o| |uS )zReturns true if cls is a _proper_ subclass of BaseModel, and provides proper type-checking,
    unlike raw calls to lenient_issubclass.
    )r   r?   )r<   r!   r*   r*   r+   is_model_classo   s    r@   str)
identifierr&   c                 C  s   |   ot|  S )zChecks that a string is a valid identifier and not a Python keyword.
    :param identifier: The identifier to test.
    :return: True if the identifier is valid.
    )isidentifierkeyword	iskeyword)rB   r*   r*   r+   is_valid_identifierx   s    rF   KeyTypezdict[KeyType, Any])mappingupdating_mappingsr&   c                 G  sd   |   }|D ]R}| D ]D\}}||v rTt|| trTt|trTt|| |||< q|||< qq|S r/   )copyitemsr0   dictdeep_update)rH   rI   Zupdated_mappingZupdating_mappingkr.   r*   r*   r+   rM      s     rM   zdict[Any, Any]None)rH   updater&   c                 K  s   |  dd | D  d S )Nc                 S  s   i | ]\}}|d ur||qS r/   r*   ).0rN   r.   r*   r*   r+   
<dictcomp>       z#update_not_none.<locals>.<dictcomp>)rP   rK   )rH   rP   r*   r*   r+   update_not_none   s    rT   T)name_factoryzlist[T] | tuple[T, ...]ztyping.Callable[[T], str]zlist[T])
input_listrV   r&   c                C  sJ   g }g }| D ]8}||}||vr6| | | | q||||< q|S )zMake a list unique while maintaining order.
    We update the list if another one with the same name is set
    (e.g. model validator overridden in subclass).
    )appendindex)rW   rV   resultZresult_namesr.   Zv_namer*   r*   r+   unique_list   s    	
r[   c                   @  s   e Zd ZdZdZddddddZdd	d
ddZdd	d
ddZdddddZddddddZ	e
d,ddd	ddddZeddddd Ze
ddd!d"d#Zedd	d$d%d&Zd'd(d)d*Zd+S )-
ValueItemszOClass for more convenient calculation of excluded or included fields on values.)_items_typer   z$AbstractSetIntStr | MappingIntStrAnyrO   )valuerK   r&   c                 C  s2   |  |}t|ttfr(| |t|}|| _d S r/   )_coerce_itemsr0   r1   r2   _normalize_indexeslenr]   )selfr_   rK   r*   r*   r+   __init__   s    
zValueItems.__init__r$   )itemr&   c                 C  s   |  | j|S )zWCheck if item is fully excluded.

        :param item: key or index of a value
        )is_truer]   getrc   re   r*   r*   r+   is_excluded   s    zValueItems.is_excludedc                 C  s
   || j v S )z`Check if value is contained in self._items.

        :param item: key or index of value
        r]   rh   r*   r*   r+   is_included   s    zValueItems.is_includedz	int | strz+AbstractSetIntStr | MappingIntStrAny | None)er&   c                 C  s   | j |}| |s|S dS )z:param e: key or index of element on value
        :return: raw values for element if self._items is dict and contain needed element
        N)r]   rg   rf   )rc   rl   re   r*   r*   r+   for_element   s    zValueItems.for_elementr   intzdict[int | str, Any])rK   v_lengthr&   c           	      C  s
  i }d}|  D ]\}}t|tjsPt|tjsP| |sPtd| d|j |dkrd| |}qt|t	svtd|dk r|| n|}| 
|||||< q|s|S | |rt|D ]}||d q|S t|D ]*}||i }| |s| 
||||< q|S )a]  :param items: dict or set of indexes which will be normalized
        :param v_length: length of sequence indexes of which will be

        >>> self._normalize_indexes({0: True, -2: True, -1: True}, 4)
        {0: True, 2: True, 3: True}
        >>> self._normalize_indexes({'__all__': True}, 4)
        {0: True, 1: True, 2: True, 3: True}
        Nz,Unexpected type of exclude value for index "z" __all__zExcluding fields from a sequence of sub-models or dicts must be performed index-wise: expected integer keys or keyword "__all__"r   .)rK   r0   typingr   AbstractSetrf   r:   	__class___coerce_valuern   mergerg   range
setdefault)	rc   rK   ro   Znormalized_itemsZ	all_itemsir.   Znormalized_inormalized_itemr*   r*   r+   ra      s2    	"



zValueItems._normalize_indexesF)baseoverride	intersectr&   c                   s   |  |    du r  S |  s2 du r6S | rL|rH S S |rvfdd D  fddD  }nt  fddD  }i }|D ]0}| j |||d}|dur|||< q|S )aH  Merge a `base` item with an `override` item.

        Both `base` and `override` are converted to dictionaries if possible.
        Sets are converted to dictionaries with the sets entries as keys and
        Ellipsis as values.

        Each key-value pair existing in `base` is merged with `override`,
        while the rest of the key-value pairs are updated recursively with this function.

        Merging takes place based on the "union" of keys if `intersect` is
        set to `False` (default) and on the intersection of keys if
        `intersect` is set to `True`.
        Nc                   s   g | ]}| v r|qS r*   r*   rQ   rN   )r{   r*   r+   
<listcomp>  rS   z$ValueItems.merge.<locals>.<listcomp>c                   s   g | ]}| v r|qS r*   r*   r}   rz   r*   r+   r~     rS   c                   s   g | ]}| vr|qS r*   r*   r}   r   r*   r+   r~     rS   )r|   )rt   rf   r1   ru   rg   )r<   rz   r{   r|   Z
merge_keysmergedrN   Zmerged_itemr*   )rz   r{   r+   ru      s"    


&
zValueItems.merge)rK   r&   c                 C  sF   t | tjrn4t | tjr(t| d} nt| dd}td| | S )N.rs   z???z!Unexpected type of exclude value )r0   rq   r   rr   rL   fromkeysgetattrr:   )rK   
class_namer*   r*   r+   r`     s    zValueItems._coerce_items)r_   r&   c                 C  s    |d u s|  |r|S | |S r/   )rf   r`   )r<   r_   r*   r*   r+   rt   #  s    zValueItems._coerce_valuer-   c                 C  s   | du p| du S )NT.r*   r5   r*   r*   r+   rf   )  s    zValueItems.is_truez_repr.ReprArgsr&   c                 C  s   d | j fgS r/   rj   rc   r*   r*   r+   __repr_args__-  s    zValueItems.__repr_args__N)F)__name__
__module____qualname____doc__	__slots__rd   ri   rk   rm   ra   classmethodru   staticmethodr`   rt   rf   r   r*   r*   r*   r+   r\      s    %%
r\   zCallable[[], T]name	get_valuer&   c                 C  s   d S r/   r*   r   r   r*   r*   r+   LazyClassAttribute3  rS   r   c                   @  sF   e Zd ZdZddddddZedd	d
dZddddddZdS )r   zA descriptor exposing an attribute only accessible on a class (hidden from instances).

        The attribute is lazily computed and cached during the first access.
        rA   zCallable[[], Any]rO   r   c                 C  s   || _ || _d S r/   r   )rc   r   r   r*   r*   r+   rd   =  s    zLazyClassAttribute.__init__r   r   c                 C  s   |   S r/   )r   r   r*   r*   r+   r_   A  s    zLazyClassAttribute.valuez	type[Any])instanceownerr&   c                 C  s*   |d u r| j S t| jd|jdd S )Nz attribute of z is class-only)r_   AttributeErrorr   r   )rc   r   r   r*   r*   r+   __get__E  s    zLazyClassAttribute.__get__N)r   r   r   r   rd   r   r_   r   r*   r*   r*   r+   r   7  s
   Obj)objr&   c              
   C  sZ   | j }|tv r| S z&| s6|tv r6|tu r,| n|  W S W n tttfyP   Y n0 t| S )zReturn type as is for immutable built-in types
    Use obj.copy() for built-in empty collections
    Use copy.deepcopy() for non-empty collections and unknown objects.
    )	rs   r"   r#   r2   rJ   r:   
ValueErrorRuntimeErrorr   )r   Zobj_typer*   r*   r+   smart_deepcopyN  s    r   ztyping.Iterable[Any])leftrightr&   c                 C  s*   t | |tdD ]\}}||ur dS qdS )a  Check that the items of `left` are the same objects as those in `right`.

    >>> a, b = object(), object()
    >>> all_identical([a, b, a], [a, b, a])
    True
    >>> all_identical([a, b, [a]], [a, b, [a]])  # new list object, while "equal" is not "identical"
    False
    )	fillvalueFT)r
   	_SENTINEL)r   r   Z	left_itemZ
right_itemr*   r*   r+   all_identicald  s    	r   T)frozenc                   @  sD   e Zd ZU dZdZded< ddddd	Zejr@dd
dddZ	dS )SafeGetItemProxyzWrapper redirecting `__getitem__` to `get` with a sentinel value as default

    This makes is safe to use in `operator.itemgetter` when some keys may be missing
    )wrappedzMapping[str, Any]r   rA   r   )keyr&   c                C  s   | j |tS r/   )r   rg   r   rc   r   r*   r*   r+   __getitem__  s    zSafeGetItemProxy.__getitem__r$   c                C  s   | j |S r/   )r   __contains__r   r*   r*   r+   r     s    zSafeGetItemProxy.__contains__N)
r   r   r   r   r   __annotations__r   rq   TYPE_CHECKINGr   r*   r*   r*   r+   r   s  s   
r   _ModelTr!   )bound_RTc                   @  sj   e Zd ZdZdddddZedddd	d
dZeeddddddd	ddZdddd	ddZdS )deprecated_instance_propertya  A decorator exposing the decorated class method as a property, with a warning on instance access.

    This decorator takes a class method defined on the `BaseModel` class and transforms it into
    an attribute. The attribute can be accessed on both the class and instances of the class. If accessed
    via an instance, a deprecation warning is emitted stating that instance access will be removed in V3.
    zCallable[[type[_ModelT]], _RT]rO   )fgetr&   c                C  s
   || _ d S r/   )r   )rc   r   r*   r*   r+   rd     s    z%deprecated_instance_property.__init__ztype[_ModelT]r   )r   objtyper&   c                 C  s   d S r/   r*   rc   r   r   r*   r*   r+   r     s    z$deprecated_instance_property.__get__zAccessing this attribute on the instance is deprecated, and will be removed in Pydantic V3. Instead, you should access this attribute from the model class.N)categoryr   c                 C  s   d S r/   r*   r   r*   r*   r+   r     s    z_ModelT | Nonec                 C  sL   |d ur<t jdkr| jjn| jjj}tjd|dtdd | j|| S )N)   
   zAccessing the zi attribute on the instance is deprecated. Instead, you should access this attribute from the model class.r    )r   
stacklevel)	sysversion_infor   r   __func__warningswarnr   r   )rc   r   r   	attr_namer*   r*   r+   r     s    
)r   r   r   r   rd   r   r   r   r*   r*   r*   r+   r     s   r   )`r   
__future__r   Z_annotationsZdataclassesrD   r   rq   r   weakrefcollectionsr   r   r   collections.abcr   rJ   r   	functoolsr   inspectr	   	itertoolsr
   typesr   r   r   r   r   r   r   r   r   r   r   Ztyping_extensionsr   r   r   Zpydanticr    r   r   Z_import_utilsr   r   r   r   r   mainr!   rn   floatcomplexrA   r$   bytesr=   ZNoneTyperefNotImplementedrs   Ellipsisr"   r1   r3   r2   r4   rL   r#   r,   r6   r;   r?   r@   rF   rG   rM   rT   rU   r[   ZRepresentationr\   r   r   r   objectr   r   Z	dataclassr   r   r   r   r*   r*   r*   r+   <module>   s    		 
