o
    h.                     @  s  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 dd	l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*dd1d2Z+dd4d5Z,dd8d9Z-dd;d<Z.dd?d@Z/ddBdCZ0ddEdFZ1ddHdIZ2ddKdLZ3dMdNdOddTdUZ4ddWdXZ5dd[d\Z6e
d]Z7e
d^Z8edd`daZ9eddddaZ9eddedaZ9ddgdaZ9ddidjZ:ddldmZ;ddodpZ<ddrdsZ=ddudvZ>ddxdyZ?dd{d|Z@dd~dZAdddZBdddZCdddZDdddddZEdddZFdS )    )annotationsN)	AnyTupleMappingTypeVarCallableIterableSequencecastoverload)Path)datedatetime)	TypeGuard   )NotGiven	FileTypes
NotGivenOrHeadersLike)
parse_dateparse_datetime_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!   ).0sublistitemr!   r!   f/var/www/html/construction_image-detection-poc/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   r5   objobjectr4   Sequence[str]r/   intr0   
str | Nonec                  s  z }W n, t y2   t| trg  Y S ddlm} ||  d  d us(J  tt| fg Y S w d7 t| rpztkrH| 	|}n| | }W n t
yX   g  Y S w  d u r`| n d| d7  t| dS t| r|dkrzg 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 )Nz[]r.   )r2   r"   r$   r0   r/   r4   r!   r%   r&   k   s    z"_extract_items.<locals>.<listcomp>)
IndexError
isinstancer   _filesr;   r
   r   is_dictlenpopKeyErrorr2   is_listr(   )r6   r4   r/   r0   r<   r;   r$   r!   rA   r%   r2   9   sL   
r2   NotGivenOr[_T]TypeGuard[_T]c                 C  s   t | t S NrC   r   r6   r!   r!   r%   is_givenz      rO   TypeGuard[tuple[object, ...]]c                 C  
   t | tS rL   rC   tuplerN   r!   r!   r%   is_tuple      
rU   _TupleT | objectTypeGuard[_TupleT]c                 C  rR   rL   rS   rN   r!   r!   r%   
is_tuple_t   rV   rY   TypeGuard[Sequence[object]]c                 C  rR   rL   rC   r	   rN   r!   r!   r%   is_sequence   rV   r\   _SequenceT | objectTypeGuard[_SequenceT]c                 C  rR   rL   r[   rN   r!   r!   r%   is_sequence_t   rV   r_   TypeGuard[Mapping[str, object]]c                 C  rR   rL   rC   r   rN   r!   r!   r%   
is_mapping   rV   rb   _MappingT | objectTypeGuard[_MappingT]c                 C  rR   rL   ra   rN   r!   r!   r%   is_mapping_t   rV   re   TypeGuard[dict[object, object]]c                 C  rR   rL   )rC   dictrN   r!   r!   r%   rE      rV   rE   TypeGuard[list[object]]c                 C  rR   rL   )rC   listrN   r!   r!   r%   rI      rV   rI   TypeGuard[Iterable[object]]c                 C  rR   rL   )rC   r   rN   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"   entryr!   r!   r%   r&          z$deepcopy_minimal.<locals>.<listcomp>)rb   r
   r   itemsrI   )r$   r!   r!   r%   rm      s
   rm   z, or)delimfinalseqrv   strrw   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    )rF   join)rx   rv   rw   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>argsr7   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 rL   r!   )r"   r   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&     rs   zLrequired_args.<locals>.inner.<locals>.wrapper.<locals>.<listcomp>.<listcomp>and)rw   ))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&     rs   zMissing required argument: )set	enumerateaddrB   	TypeError__name__rF   keysallr   ri   r   )
r   r   i_r<   r   matches
variationsmsgmissing)r   
positionalr   r   r%   wrapper   s@   
z-required_args.<locals>.inner.<locals>.wrapper)r   r7   r   r7   r   r7   )inspect	signature
parametersrt   	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 rL   r!   rN   r!   r!   r%   strip_not_given     r   Mapping[_K, _V | NotGiven]dict[_K, _V]c                 C  r   rL   r!   rN   r!   r!   r%   r   "  r   c                 C  r   rL   r!   rN   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!   rM   r"   r<   valuer!   r!   r%   rp   2  s     z#strip_not_given.<locals>.<dictcomp>)rb   rt   rN   r!   r!   r%   r   *  s
   valc                 C  s   t | ddS )N
   )base)r9   r   r!   r!   r%   coerce_integer5  rP   r   floatc                 C  s   t | S rL   )r   r   r!   r!   r%   coerce_float9  s   r   boolc                 C  s   | dkp| dkp| dkS )Ntrue1onr!   r   r!   r!   r%   coerce_boolean=  s   r   
int | Nonec                 C     | d u rd S t | S rL   )r   r   r!   r!   r%   maybe_coerce_integerA     r   float | Nonec                 C  r   rL   )r   r   r!   r!   r%   maybe_coerce_floatG  r   r   bool | Nonec                 C  r   rL   )r   r   r!   r!   r%   maybe_coerce_booleanM  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)
startswithrF   )r   r   r!   r!   r%   removeprefixS  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)endswithrF   )r   r   r!   r!   r%   removesuffix]  s   
r   r   c                 C  s    t |  }tj| }||fS rL   )r   
read_bytesosr4   basename)r4   contents	file_namer!   r!   r%   file_from_pathg  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>v  s    z%get_required_header.<locals>.<lambda>zCould not find z header)lowerre   rt   rC   ry   resub
capitalizer   get
ValueError)r   r   lower_headerrn   ro   intercaps_headernormalized_headerr   r!   r!   r%   get_required_headerm  s   
r   c                   C  s    zt  W S  ty   Y dS w )Nfalse)sniffio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&     rs   zjson_safe.<locals>.<listcomp>)
rb   rt   rk   rC   ry   bytes	bytearrayr   r   	isoformat)r   r!   r!   r%   r     s   r   )r   r   r   r    )r)   r*   r+   r,   r   r-   )
r6   r7   r4   r8   r/   r9   r0   r:   r   r-   )r6   rJ   r   rK   )r6   r7   r   rQ   )r6   rW   r   rX   )r6   r7   r   rZ   )r6   r]   r   r^   )r6   r7   r   r`   )r6   rc   r   rd   )r6   r7   r   rf   )r6   r7   r   rh   )r6   r7   r   rj   )r$   r   r   r   )rx   r8   rv   ry   rw   ry   r   ry   )r   ry   r   ry   )r   r8   r   r   )r6   r   r   r   )r6   r   r   r   )r6   r7   r   r7   )r6   r   r   r7   )r   ry   r   r9   )r   ry   r   r   )r   ry   r   r   )r   r:   r   r   )r   r:   r   r   )r   r:   r   r   )r   ry   r   ry   r   ry   )r   ry   r   ry   r   ry   )r4   ry   r   r   )r   r   r   ry   r   ry   )r   ry   )r   r   r   r   )r   r7   r   r7   )G
__future__r   r   r   r   r   typingr   r   r   r   r   r   r	   r
   r   pathlibr   r   r   typing_extensionsr   r   _typesr   r   r   r   _compatr   r   r   r7   r   ry   r   r   r   r(   r5   r2   rO   rU   rY   r\   r_   rb   re   rE   rI   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>   sp    ,



A











K














