U
    	f~1                     @  sV  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mZmZ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 ej rdZ!de"d< dZ#de"d< ddl$m%Z% e&e'e(e)e*e+e,ej-eeeej.eee/j0e1j0hZ2de"d< e3e4e5e6e7e	e
ehZ8de"d< dddddZ9ddddddZ:ddddd d!Z;dd"d#d$d%Z<d&dd'd(d)Z=ed*Z>d+d+d+d,d-d.Z?d/dd0d1d2d3Z@ed4ZAe)d5d6d7d8d9d:d;ZBG d<d= d=ejCZDej rd&d4d4d>d?d@ZEnG dAd@ d@ZEedBZFdBdBdCdDdEZGeH ZIdFdFddGdHdIZJejKdJdKG dLdM dMZLdS )NzBucket 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)zip_longest)BuiltinFunctionTypeCodeTypeFunctionTypeGeneratorType
LambdaType
ModuleType)AnyMappingTypeVar)	TypeAlias	TypeGuard   )_repr_typing_extraz3typing.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vreturnc                 C  s   t | ttttttfS N)
isinstancelisttupleset	frozensetr   r   r    r(   \/var/www/html/apigroqsegura/apigroq/lib/python3.8/site-packages/pydantic/_internal/_utils.pysequence_like?   s    r*   z(type[Any] | tuple[type[Any], ...] | None)oclass_or_tupler    c                 C  s(   zt | |W S  tk
r"   Y dS X d S NF)r"   	TypeError)r+   r,   r(   r(   r)   lenient_isinstanceC   s    r/   )clsr,   r    c                 C  sD   zt | tot| |W S  tk
r>   t | tjr8Y dS  Y nX d S r-   )r"   type
issubclassr.   r   WithArgsTypes)r0   r,   r(   r(   r)   lenient_issubclassJ   s    r4   zTypeGuard[type[BaseModel]])r0   r    c                 C  s   ddl m} t| |o| |k	S )zReturns true if cls is a _proper_ subclass of BaseModel, and provides proper type-checking,
    unlike raw calls to lenient_issubclass.
    r   r   )mainr   r4   )r0   r   r(   r(   r)   is_model_classS   s    r6   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)r8   r(   r(   r)   is_valid_identifier\   s    r<   KeyTypezdict[KeyType, Any])mappingupdating_mappingsr    c                 G  sd   |   }|D ]R}| D ]D\}}||krTt|| trTt|trTt|| |||< q|||< qq|S r!   )copyitemsr"   dictdeep_update)r>   r?   Zupdated_mappingZupdating_mappingkr   r(   r(   r)   rC   g   s     rC   zdict[Any, Any]None)r>   updater    c                 K  s   |  dd | D  d S )Nc                 S  s   i | ]\}}|d k	r||qS r!   r(   ).0rD   r   r(   r(   r)   
<dictcomp>s   s       z#update_not_none.<locals>.<dictcomp>)rF   rA   )r>   rF   r(   r(   r)   update_not_noner   s    rI   T)name_factoryzlist[T] | tuple[T, ...]ztyping.Callable[[T], str]zlist[T])
input_listrK   r    c                C  sJ   g }g }| D ]8}||}||k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)rL   rK   resultZresult_namesr   Zv_namer(   r(   r)   unique_listy   s    	
rP   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.)_itemsZ_typer   z$AbstractSetIntStr | MappingIntStrAnyrE   )valuerA   r    c                 C  s2   |  |}t|ttfr(| |t|}|| _d S r!   )_coerce_itemsr"   r#   r$   _normalize_indexeslenrR   )selfrS   rA   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_truerR   getrW   rY   r(   r(   r)   is_excluded   s    zValueItems.is_excludedc                 C  s
   || j kS )z`Check if value is contained in self._items.

        :param item: key or index of value
        rR   r\   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)rR   r[   rZ   )rW   r`   rY   r(   r(   r)   for_element   s    zValueItems.for_elementr   intzdict[int | str, Any])rA   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   .)rA   r"   typingr   AbstractSetrZ   r.   	__class___coerce_valuerb   merger[   range
setdefault)	rW   rA   rc   Znormalized_itemsZ	all_itemsir   Znormalized_iZnormalized_itemr(   r(   r)   rU      s2    	"



zValueItems._normalize_indexesF)baseoverride	intersectr    c                   s   |  |    dkr  S |  s2 dk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k	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 | ]}| kr|qS r(   r(   rG   rD   )rn   r(   r)   
<listcomp>   s      z$ValueItems.merge.<locals>.<listcomp>c                   s   g | ]}| kr|qS r(   r(   rp   rm   r(   r)   rq      s      c                   s   g | ]}| kr|qS r(   r(   rp   rr   r(   r)   rq      s      )ro   )rh   rZ   r#   ri   r[   )r0   rm   rn   ro   Z
merge_keysZmergedrD   Zmerged_itemr(   )rm   rn   r)   ri      s"    


&
zValueItems.merge)rA   r    c                 C  sF   t | tjrn4t | tjr(t| d} nt| dd}td| | S )N.rg   z???z!Unexpected type of exclude value )r"   re   r   rf   rB   fromkeysgetattrr.   )rA   
class_namer(   r(   r)   rT      s    zValueItems._coerce_items)rS   r    c                 C  s    |d ks|  |r|S | |S r!   )rZ   rT   )r0   rS   r(   r(   r)   rh     s    zValueItems._coerce_valuer   c                 C  s   | dkp| dkS )NT.r(   r'   r(   r(   r)   rZ     s    zValueItems.is_truez_repr.ReprArgs)r    c                 C  s   d | j fgS r!   r^   )rW   r(   r(   r)   __repr_args__  s    zValueItems.__repr_args__N)F)__name__
__module____qualname____doc__	__slots__rX   r]   r_   ra   rU   classmethodri   staticmethodrT   rh   rZ   rv   r(   r(   r(   r)   rQ      s    %%
rQ   namerS   r    c                 C  s   d S r!   r(   r   rS   r(   r(   r)   ClassAttribute  s    r   c                   @  s8   e Zd ZdZdZddddddZdd	dd
ddZdS )r   z(Hide class attribute from its instances.r   r7   r   rE   r~   c                 C  s   || _ || _d S r!   r   )rW   r   rS   r(   r(   r)   rX   !  s    zClassAttribute.__init__z	type[Any])instanceownerr    c                 C  s*   |d kr| j S t| jd|jdd S )Nz attribute of z is class-only)rS   AttributeErrorr   rw   )rW   r   r   r(   r(   r)   __get__%  s    zClassAttribute.__get__N)rw   rx   ry   rz   r{   rX   r   r(   r(   r(   r)   r     s   Obj)objr    c              
   C  s\   | j }|tkr| S z&| s6|tkr6|tkr,| n|  W S W n tttfk
rR   Y nX 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.
    )	rg   r   r   r$   r@   r.   
ValueErrorRuntimeErrorr   )r   obj_typer(   r(   r)   smart_deepcopy.  s    r   ztyping.Iterable[Any])leftrightr    c                 C  s*   t | |tdD ]\}}||k	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   r7   r   )_SafeGetItemProxy__keyr    c                 C  s   | j |tS r!   )r   r[   r   rW   r   r(   r(   r)   __getitem__`  s    zSafeGetItemProxy.__getitem__r   c                 C  s   | j |S r!   )r   __contains__r   r(   r(   r)   r   i  s    zSafeGetItemProxy.__contains__N)
rw   rx   ry   rz   r{   __annotations__r   re   TYPE_CHECKINGr   r(   r(   r(   r)   r   S  s   
r   )Mrz   
__future__r   _annotationsdataclassesr:   re   weakrefcollectionsr   r   r   r@   r   	itertoolsr   typesr   r	   r
   r   r   r   r   r   r   typing_extensionsr   r    r   r   r   r   r   r   r5   r   rb   floatcomplexr7   r   bytesr1   NoneTyperefNotImplementedrg   Ellipsisr   r#   r%   r$   r&   rB   r   r*   r/   r4   r6   r<   r=   rC   rI   rJ   rP   RepresentationrQ   r   r   r   objectr   r   	dataclassr   r(   r(   r(   r)   <module>   s    		 
