o
    i/                     @  sv  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	m
Z
mZmZmZmZmZ d dlmZ d dlmZmZ d dlmZ d dlZddlmZmZmZmZ e
d	Ze
d
eedf dZe
de	eef dZ e
dee dZ!e
dedef dZ"dddZ#dddZ$dd%d&Z%dd)d*Z&dd,d-Z'dd0d1Z(dd3d4Z)dd7d8Z*dd:d;Z+dd>d?Z,ddAdBZ-ddDdEZ.ddGdHZ/ddJdKZ0dLdMdNddSdTZ1ddVdWZ2ddZd[Z3e
d\Z4e
d]Z5edd_d`Z6eddcd`Z6edddd`Z6ddfd`Z6ddhdiZ7ddkdlZ8ddndoZ9ddqdrZ:ddtduZ;ddwdxZ<ddzd{Z=dd}d~Z>dddZ?dddZ@dddZAdddddZBdddZCdS )    )annotationsN)	AnyTupleMappingTypeVarCallableIterableSequencecastoverload)Path)datedatetime)	TypeGuard   )OmitNotGiven	FileTypesHeadersLike_T_TupleT.)bound	_MappingT
_SequenceT	CallableTtIterable[Iterable[_T]]returnlist[_T]c                 C  s   dd | D S )Nc                 S  s   g | ]	}|D ]}|qqS  r   ).0Zsublistitemr   r   L/home/kim/smarthome/.venv/lib/python3.10/site-packages/groq/_utils/_utils.py
<listcomp>"       zflatten.<locals>.<listcomp>r   )r   r   r   r"   flatten!   s   r%   queryMapping[str, object]pathsSequence[Sequence[str]]list[tuple[str, FileTypes]]c             	   C  s(   g }|D ]}| t| |ddd q|S )zRecursively extract files from the given dictionary based on specified paths.

    A path may look like this ['foo', 'files', '<array>', 'data'].

    Note: this mutates the given dictionary.
    r   Nindexflattened_key)extend_extract_items)r&   r(   filespathr   r   r"   extract_files%   s   r2   objobjectr1   Sequence[str]r,   intr-   
str | Nonec          	   
     s^  z }W nR t yX   t| sg  Y S ddlm}  d us!J t| rHg }| D ]}|| r3 d ndd | d tt|f q)| Y S ||  d  tt| fg Y S w d7 t| rzt	krn| 
|}n| | }W n ty~   g  Y S w  d u r| n d| d7  t| d	S t| r|d
krg S t fdd| D S g S )Nr   )assert_is_file_content[] )key   []r+   z<array>c                   s,   g | ]}t | d ur d nddqS )Nr9   r+   )r/   r    r!   r-   r,   r1   r   r"   r#   r   s    z"_extract_items.<locals>.<listcomp>)
IndexErroris_given_filesr8   is_listappendr
   r   is_dictlenpopKeyErrorr/   r%   )	r3   r1   r,   r-   r;   r8   r0   entryr!   r   r@   r"   r/   8   sX   r/   _T | NotGiven | OmitTypeGuard[_T]c                 C  s   t | t ot | t S N)
isinstancer   r   r3   r   r   r"   rB         rB   TypeGuard[tuple[object, ...]]c                 C  
   t | tS rM   rN   tuplerO   r   r   r"   is_tuple      
rU   _TupleT | objectTypeGuard[_TupleT]c                 C  rR   rM   rS   rO   r   r   r"   
is_tuple_t   rV   rY   TypeGuard[Sequence[object]]c                 C  rR   rM   rN   r	   rO   r   r   r"   is_sequence   rV   r\   _SequenceT | objectTypeGuard[_SequenceT]c                 C  rR   rM   r[   rO   r   r   r"   is_sequence_t   rV   r_   TypeGuard[Mapping[str, object]]c                 C  rR   rM   rN   r   rO   r   r   r"   
is_mapping   rV   rb   _MappingT | objectTypeGuard[_MappingT]c                 C  rR   rM   ra   rO   r   r   r"   is_mapping_t   rV   re   TypeGuard[dict[object, object]]c                 C  rR   rM   )rN   dictrO   r   r   r"   rF      rV   rF   TypeGuard[list[object]]c                 C  rR   rM   )rN   listrO   r   r   r"   rD      rV   rD   TypeGuard[Iterable[object]]c                 C  rR   rM   )rN   r   rO   r   r   r"   is_iterable   rV   rk   r!   c                 C  s@   t | rttdd |  D S t| rttdd | D S | S )zMinimal reimplementation of copy.deepcopy() that will only copy certain object types:

    - mappings, e.g. `dict`
    - list

    This is done for performance reasons.
    c                 S  s   i | ]	\}}|t |qS r   deepcopy_minimal)r    kvr   r   r"   
<dictcomp>   r$   z$deepcopy_minimal.<locals>.<dictcomp>c                 S     g | ]}t |qS r   rl   )r    rJ   r   r   r"   r#          z$deepcopy_minimal.<locals>.<listcomp>)rb   r
   r   itemsrD   )r!   r   r   r"   rm      s
   rm   z, or)delimfinalseqru   strrv   c                C  sn   t | }|dkr
dS |dkr| d S |dkr$| d  d| d| d  S || d d d| d| d   S )Nr   r:   r<   r    )rG   join)rw   ru   rv   sizer   r   r"   
human_join   s   &r}   stringc                 C  s   d|  dS )zOAdd single quotation marks around the given string. Does *not* do any escaping.'r   )r~   r   r   r"   quote   s   r   variants Callable[[CallableT], CallableT]c                    s   d fdd}|S )a4  Decorator to enforce a given set of arguments or variants of arguments are passed to the decorated function.

    Useful for enforcing runtime validation of overloaded functions.

    Example usage:
    ```py
    @overload
    def foo(*, a: str) -> str: ...


    @overload
    def foo(*, b: bool) -> str: ...


    # This enforces the same constraints that a static type checker would
    # i.e. that either a or b must be passed to the function
    @required_args(["a"], ["b"])
    def foo(*, a: str | None = None, b: bool | None = None) -> str: ...
    ```
    funcr   r   c                   s>   t  j}dd | D t d	 fdd}|S )
Nc                 S  s&   g | ]\}}|j |j|jhv r|qS r   )kindPOSITIONAL_ONLYPOSITIONAL_OR_KEYWORD)r    nameparamr   r   r"   r#      s    z0required_args.<locals>.inner.<locals>.<listcomp>argsr4   kwargsr   c            
        sH  t   t| D ]'\}}z	 |  W q ty.   tj dt dt|  dd w | D ]} | q3D ]}t fdd|D }|rN nOq=tdkrht	dd D }d	| d
}t|tdkspJ t
t d   }	t|	dkrdt	dd |	D  }t|dt|	d  }t|| i |S )Nz	() takes z argument(s) but z were givenc                 3  s    | ]}| v V  qd S rM   r   )r    r   Zgiven_paramsr   r"   	<genexpr>  s    z@required_args.<locals>.inner.<locals>.wrapper.<locals>.<genexpr>r<   c                 S  s*   g | ]}d t dd |D dd d qS )(c                 S  rq   r   r   r    argr   r   r"   r#     rr   zLrequired_args.<locals>.inner.<locals>.wrapper.<locals>.<listcomp>.<listcomp>and)rv   ))r}   )r    variantr   r   r"   r#     s   * zArequired_args.<locals>.inner.<locals>.wrapper.<locals>.<listcomp>z,Missing required arguments; Expected either z arguments to be givenr   zMissing required arguments: c                 S  rq   r   r   r   r   r   r"   r#     rr   zMissing required argument: )set	enumerateaddrA   	TypeError__name__rG   keysallr}   ri   r   )
r   r   i_r;   r   matchesZ
variationsmsgmissing)r   
positionalr   r   r"   wrapper   s@   
z-required_args.<locals>.inner.<locals>.wrapper)r   r4   r   r4   r   r4   )inspect	signature
parametersrs   	functoolswraps)r   paramsr   r   )r   r   r"   inner   s   
#zrequired_args.<locals>.innerN)r   r   r   r   r   )r   r   r   r   r"   required_args   s   2r   _K_VNonec                 C     d S rM   r   rO   r   r   r"   strip_not_given%     r   Mapping[_K, _V | NotGiven]dict[_K, _V]c                 C  r   rM   r   rO   r   r   r"   r   )  r   c                 C  r   rM   r   rO   r   r   r"   r   -  r   object | Nonec                 C  s*   | du rdS t | s| S dd |  D S )zHRemove all top-level keys where their values are instances of `NotGiven`Nc                 S  s    i | ]\}}t |ts||qS r   )rN   r   r    r;   valuer   r   r"   rp   9  s     z#strip_not_given.<locals>.<dictcomp>)rb   rs   rO   r   r   r"   r   1  s
   valc                 C  s   t | ddS )N
   )base)r6   r   r   r   r"   coerce_integer<  s   r   floatc                 C  s   t | S rM   )r   r   r   r   r"   coerce_float@  s   r   boolc                 C  s   | dkp| dkp| dkS )Ntrue1onr   r   r   r   r"   coerce_booleanD  rP   r   
int | Nonec                 C     | d u rd S t | S rM   )r   r   r   r   r"   maybe_coerce_integerH     r   float | Nonec                 C  r   rM   )r   r   r   r   r"   maybe_coerce_floatN  r   r   bool | Nonec                 C  r   rM   )r   r   r   r   r"   maybe_coerce_booleanT  r   r   prefixc                 C  s   |  |r| t|d S | S )zXRemove a prefix from a string.

    Backport of `str.removeprefix` for Python < 3.9
    N)
startswithrG   )r~   r   r   r   r"   removeprefixZ  s   
r   suffixc                 C  s    |  |r| dt|  S | S )zXRemove a suffix from a string.

    Backport of `str.removesuffix` for Python < 3.9
    N)endswithrG   )r~   r   r   r   r"   removesuffixd  s   
r   r   c                 C  s    t |  }tj| }||fS rM   )r   
read_bytesosr1   basename)r1   contents	file_namer   r   r"   file_from_pathn  s   r   headersr   headerc                 C  s   |  }t| r |  D ]\}}|  |krt|tr|  S qtddd | }||| |fD ]}| 	|}|r@|  S q3t
d| d)Nz([^\w])(\w)c                 S  s   |  d|  d  S )Nr<   r   )groupupper)patr   r   r"   <lambda>}  s    z%get_required_header.<locals>.<lambda>zCould not find z header)lowerre   rs   rN   rx   resub
capitalizer   get
ValueError)r   r   Zlower_headerrn   ro   Zintercaps_headerZnormalized_headerr   r   r   r"   get_required_headert  s   
r   c                   C  s    zt  W S  ty   Y dS w )Nfalse)sniffioZcurrent_async_library	Exceptionr   r   r   r"   get_async_library  s
   
r      maxsizer   c                 C  s   t j| d}tt|S )zmA version of functools.lru_cache that retains the type signature
    for the wrapped function arguments.
    r   )r   	lru_cacher
   r   )r   r   r   r   r"   r     s   
r   datac                 C  sZ   t | rdd |  D S t| r t| tttfs dd | D S t| ttfr+| 	 S | S )zvTranslates a mapping / sequence recursively in the same fashion
    as `pydantic` v2's `model_dump(mode="json")`.
    c                 S  s   i | ]\}}t |t |qS r   	json_safer   r   r   r"   rp     s    zjson_safe.<locals>.<dictcomp>c                 S  rq   r   r   r?   r   r   r"   r#     rr   zjson_safe.<locals>.<listcomp>)
rb   rs   rk   rN   rx   bytes	bytearrayr   r   	isoformat)r   r   r   r"   r     s   r   )r   r   r   r   )r&   r'   r(   r)   r   r*   )
r3   r4   r1   r5   r,   r6   r-   r7   r   r*   )r3   rK   r   rL   )r3   r4   r   rQ   )r3   rW   r   rX   )r3   r4   r   rZ   )r3   r]   r   r^   )r3   r4   r   r`   )r3   rc   r   rd   )r3   r4   r   rf   )r3   r4   r   rh   )r3   r4   r   rj   )r!   r   r   r   )rw   r5   ru   rx   rv   rx   r   rx   )r~   rx   r   rx   )r   r5   r   r   )r3   r   r   r   )r3   r   r   r   )r3   r4   r   r4   )r3   r   r   r4   )r   rx   r   r6   )r   rx   r   r   )r   rx   r   r   )r   r7   r   r   )r   r7   r   r   )r   r7   r   r   )r~   rx   r   rx   r   rx   )r~   rx   r   rx   r   rx   )r1   rx   r   r   )r   r   r   rx   r   rx   )r   rx   )r   r   r   r   )r   r4   r   r4   )D
__future__r   r   r   r   r   typingr   r   r   r   r   r   r	   r
   r   pathlibr   r   r   Ztyping_extensionsr   r   _typesr   r   r   r   r   r4   r   rx   r   r   r   r%   r2   r/   rB   rU   rY   r\   r_   rb   re   rF   rD   rk   rm   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   <module>   sn    ,



I











K














