o
    g4                     @  s6  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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mZmZmZmZmZ dd
lmZ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& ej'rdZ(de)d< dZ*de)d< ddl+m,Z, e-e.e/e0e1e2e3e$j4eeeej5eee6j7e8j7hZ9de)d< e:e;e<e=e>e	e
ehZ?de)d< d[ddZ@d\d!d"ZAd]d&d'ZBd^d)d*ZCd_d,d-ZDd`d0d1ZEed2ZFdad6d7ZGdbd;d<ZHed=ZIe0d>dcdDdEZJG dFdG dGe#jKZLej'rdddKdLZMnG dMdL dLZMedNZNdedPdQZOeP ZQdfdUdVZRejSdWdXG dYdZ dZZTdS )gzBucket 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)deepcopy)cached_property)	Parameter)zip_longest)BuiltinFunctionTypeCodeTypeFunctionTypeGeneratorType
LambdaType
ModuleType)AnyCallableMappingTypeVar)	TypeAlias	TypeGuard   )_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_COLLECTIONSparamr   returnboolc                 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&   P/var/www/visachat/venv/lib/python3.10/site-packages/pydantic/_internal/_utils.pycan_be_positionalC   s   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_likeV   s   r1   oclass_or_tuple(type[Any] | tuple[type[Any], ...] | Nonec                 C  s"   zt | |W S  ty   Y dS w NF)r+   	TypeError)r2   r3   r&   r&   r'   lenient_isinstanceZ   s
   r7   clsc                 C  s:   zt | to
t| |W S  ty   t | tjrY dS  w r5   )r+   type
issubclassr6   r   WithArgsTypes)r8   r3   r&   r&   r'   lenient_issubclassa   s   r<   TypeGuard[type[BaseModel]]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<   )r8   r   r&   r&   r'   is_model_classj   s   r>   
identifierstrc                 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)r?   r&   r&   r'   is_valid_identifiers   s   rD   KeyTypemappingdict[KeyType, Any]updating_mappingsc                 G  sd   |   }|D ])}| D ]"\}}||v r*t|| tr*t|tr*t|| |||< q|||< qq|S r*   )copyitemsr+   dictdeep_update)rF   rH   updated_mappingupdating_mappingkr)   r&   r&   r'   rL   ~   s    
rL   dict[Any, Any]updateNonec                 K  s   |  dd | D  d S )Nc                 S  s   i | ]\}}|d ur||qS r*   r&   ).0rO   r)   r&   r&   r'   
<dictcomp>   s    z#update_not_none.<locals>.<dictcomp>)rQ   rJ   )rF   rQ   r&   r&   r'   update_not_none   s   rU   T)name_factory
input_listlist[T] | tuple[T, ...]rW   typing.Callable[[T], str]list[T]c                C  sJ   g }g }| D ]}||}||vr| | | | 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)rX   rW   resultresult_namesr)   v_namer&   r&   r'   unique_list   s   	
ra   c                   @  s   e Zd ZdZdZd-d	d
Zd.ddZd.ddZd/ddZd0ddZ	e
d1d2d d!Zed3d"d#Ze
d4d$d%Zed5d'd(Zd6d*d+Zd,S )7
ValueItemszOClass for more convenient calculation of excluded or included fields on values.)_items_typevaluer   rJ   $AbstractSetIntStr | MappingIntStrAnyr!   rR   c                 C  s2   |  |}t|ttfr| |t|}|| _d S r*   )_coerce_itemsr+   r,   r-   _normalize_indexeslenrc   )selfre   rJ   r&   r&   r'   __init__   s   

zValueItems.__init__itemr"   c                 C  s   |  | j|S )zWCheck if item is fully excluded.

        :param item: key or index of a value
        )is_truerc   getrj   rl   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
        rc   ro   r&   r&   r'   is_included   s   
zValueItems.is_includede	int | str+AbstractSetIntStr | MappingIntStrAny | Nonec                 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)rc   rn   rm   )rj   rs   rl   r&   r&   r'   for_element   s   zValueItems.for_elementr   v_lengthintdict[int | str, Any]c           	      C  s
  i }d}|  D ]H\}}t|tjs(t|tjs(| |s(td| d|j |dkr2| |}qt|t	s;td|dk rC|| n|}| 
|||||< q|sU|S | |rit|D ]}||d q^|S t|D ]}||i }| |s| 
||||< qm|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   .)rJ   r+   typingr   AbstractSetrm   r6   	__class___coerce_valuerx   mergern   range
setdefault)	rj   rJ   rw   normalized_items	all_itemsir)   normalized_inormalized_itemr&   r&   r'   rh      s4   	"



zValueItems._normalize_indexesFbaseoverride	intersectc                   s   |  |    du r S |  s du rS | r&|r$ S S |r;fdd D  fddD  }nt  fddD  }i }|D ]}| j |||d}|durd|||< qL|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                      g | ]}| v r|qS r&   r&   rS   rO   )r   r&   r'   
<listcomp>      z$ValueItems.merge.<locals>.<listcomp>c                   r   r&   r&   r   r   r&   r'   r     r   c                   s   g | ]}| vr|qS r&   r&   r   r   r&   r'   r   	  r   )r   )r~   rm   r,   r   rn   )r8   r   r   r   
merge_keysmergedrO   merged_itemr&   )r   r   r'   r      s$   


&zValueItems.mergec                 C  sH   t | tjr		 | S t | tjrt| d} | S t| dd}td| )N.r}   z???z!Unexpected type of exclude value )r+   r{   r   r|   rK   fromkeysgetattrr6   )rJ   
class_namer&   r&   r'   rg     s   zValueItems._coerce_itemsc                 C  s    |d u s	|  |r|S | |S r*   )rm   rg   )r8   re   r&   r&   r'   r~     s   
zValueItems._coerce_valuer)   c                 C  s   | du p| du S )NT.r&   r0   r&   r&   r'   rm   $  s   zValueItems.is_true_repr.ReprArgsc                 C  s   d | j fgS r*   rq   rj   r&   r&   r'   __repr_args__(     zValueItems.__repr_args__N)re   r   rJ   rf   r!   rR   )rl   r   r!   r"   )rs   rt   r!   ru   )rJ   r   rw   rx   r!   ry   )F)r   r   r   r   r   r"   r!   r   )rJ   rf   r!   r   )re   r   r!   r   r)   r   r!   r"   )r!   r   )__name__
__module____qualname____doc__	__slots__rk   rp   rr   rv   rh   classmethodr   staticmethodrg   r~   rm   r   r&   r&   r&   r'   rb      s"    




%%
rb   name	get_valueCallable[[], T]c                 C  s   d S r*   r&   r   r   r&   r&   r'   LazyClassAttribute.  s    r   c                   @  s2   e Zd ZdZddd	ZedddZ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.
        r   r@   r   Callable[[], Any]r!   rR   c                 C  s   || _ || _d S r*   r   )rj   r   r   r&   r&   r'   rk   8  s   
zLazyClassAttribute.__init__r   c                 C  s   |   S r*   )r   r   r&   r&   r'   re   <  s   zLazyClassAttribute.valueinstanceowner	type[Any]c                 C  s&   |d u r| j S t| jd|jd)Nz attribute of z is class-only)re   AttributeErrorr   r   )rj   r   r   r&   r&   r'   __get__@  s   zLazyClassAttribute.__get__N)r   r@   r   r   r!   rR   )r!   r   )r   r   r   r   r!   rR   )r   r   r   r   rk   r   re   r   r&   r&   r&   r'   r   2  s    
Objobjc              
   C  sj   | j }|tv r	| S z| s|tv r!|tu r| W S |  W S W t| S W t| S  tttfy4   Y t| S w )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.
    )	r}   r   r   r-   rI   r6   
ValueErrorRuntimeErrorr   )r   obj_typer&   r&   r'   smart_deepcopyI  s   r   lefttyping.Iterable[Any]rightc                 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   	left_item
right_itemr&   r&   r'   all_identical_  s
   	r   T)frozenc                   @  s<   e Zd ZU dZdZded< dd	d
ZejrdddZ	dS 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   keyr@   r!   r   c                C  s   | j |tS r*   )r   rn   r   rj   r   r&   r&   r'   __getitem__{  s   zSafeGetItemProxy.__getitem__r"   c                C  s   | j |S r*   )r   __contains__r   r&   r&   r'   r     r   zSafeGetItemProxy.__contains__N)r   r@   r!   r   )r   r@   r!   r"   )
r   r   r   r   r   __annotations__r   r{   TYPE_CHECKINGr   r&   r&   r&   r'   r   n  s   
 
r   )r    r   r!   r"   r   )r2   r   r3   r4   r!   r"   )r8   r   r3   r   r!   r"   )r8   r   r!   r=   )r?   r@   r!   r"   )rF   rG   rH   rG   r!   rG   )rF   rP   rQ   r   r!   rR   )rX   rY   rW   rZ   r!   r[   )r   r@   r   r   r!   rV   )r   r   r!   r   )r   r   r   r   r!   r"   )Ur   
__future__r   _annotationsdataclassesrB   r{   weakrefcollectionsr   r   r   rI   r   	functoolsr   inspectr   	itertoolsr	   typesr
   r   r   r   r   r   r   r   r   r   typing_extensionsr   r    r   r   _import_utilsr   r   r   r   r   mainr   rx   floatcomplexr@   r"   bytesr9   NoneTyperefNotImplementedr}   Ellipsisr   r,   r.   r-   r/   rK   r   r(   r1   r7   r<   r>   rD   rE   rL   rU   rV   ra   Representationrb   r   r   r   objectr   r   	dataclassr   r&   r&   r&   r'   <module>   s     




	
	

 


