U
    hf1                     @  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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#erddl$m%Z%m&Z& dddddZ'ddddddZ(dd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%d0d1Z-d2d3d%d4d5Z.dd6d%d7d8Z/d9d:d%d;d<Z0dd=d%d>d?Z1dd@d%dAdBZ2ddCd%dDdEZ3d	d	dFdGdHZ4dIdJdKddLdLdLdMdNdOZ5dLdLdPdQdRZ6ddSdTdUdVZ7edWZ8edXZ9edYdYd%dZd[Z:ed\d]d%d^d[Z:eddd%d_d[Z:d`dd%dad[Z:dLddbdcddZ;dLdedbdfdgZ<dLdhdbdidjZ=ddkdbdldmZ>ddndbdodpZ?ddqdbdrdsZ@dLdLdLdtdudvZAdLdLdLdwdxdyZBdLdzd{d|d}ZCd~dLdLdddZDdLdddZEdddkdSdddZFdddddZGdddddZHdddddZIdS )    )annotationsN)
TYPE_CHECKINGAnyTupleMappingTypeVarCallableIterableSequencecastoverload)Path)datedatetime)	TypeGuard   )NotGiven	FileTypes
NotGivenOrHeadersLike_T_TupleT.)bound	_MappingT
_SequenceT	CallableT)AzureOpenAIAsyncAzureOpenAIzIterable[Iterable[_T]]zlist[_T])treturnc                 C  s   dd | D S )Nc                 S  s   g | ]}|D ]}|qqS  r    ).0Zsublistitemr    r    8/tmp/pip-unpacked-wheel-dms8d3uv/openai/_utils/_utils.py
<listcomp>&   s       zflatten.<locals>.<listcomp>r    )r   r    r    r#   flatten%   s    r%   zMapping[str, object]zSequence[Sequence[str]]zlist[tuple[str, FileTypes]])querypathsr   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    r/   objectzSequence[str]intz
str | None)objr.   r)   r*   r   c          	   
     sn  z }W n t k
r   t| tr.g  Y S ddlm}  d k	sFtt| rg }| D ]4}|| rj d ndd | d tt	|f qV| Y S ||  d  tt	| fg Y S X d7 t
| r8z$tkr| |}n| | }W n tk
r   g  Y S X  d kr| n d| d7  t| d	S t| rj|d
krPg S t fdd| D S g S )Nr   )assert_is_file_content[] )key   []r(   z<array>c                   s,   g | ]$}t | d k	r  d nddqS )Nr4   r(   )r,   r!   r"   r*   r)   r.   r    r#   r$   v   s   z"_extract_items.<locals>.<listcomp>)
IndexError
isinstancer   _filesr3   AssertionErroris_listappendr   r   is_dictlenpopKeyErrorr,   r%   )	r2   r.   r)   r*   r6   r3   r-   entryr"   r    r;   r#   r,   <   sR    





r,   zNotGivenOr[_T]zTypeGuard[_T])r2   r   c                 C  s   t | t S Nr=   r   r2   r    r    r#   is_given   s    rJ   zTypeGuard[tuple[object, ...]]c                 C  s
   t | tS rG   r=   tuplerI   r    r    r#   is_tuple   s    rM   z_TupleT | objectzTypeGuard[_TupleT]c                 C  s
   t | tS rG   rK   rI   r    r    r#   
is_tuple_t   s    rN   zTypeGuard[Sequence[object]]c                 C  s
   t | tS rG   r=   r
   rI   r    r    r#   is_sequence   s    rP   z_SequenceT | objectzTypeGuard[_SequenceT]c                 C  s
   t | tS rG   rO   rI   r    r    r#   is_sequence_t   s    rQ   zTypeGuard[Mapping[str, object]]c                 C  s
   t | tS rG   r=   r   rI   r    r    r#   
is_mapping   s    rS   z_MappingT | objectzTypeGuard[_MappingT]c                 C  s
   t | tS rG   rR   rI   r    r    r#   is_mapping_t   s    rT   zTypeGuard[dict[object, object]]c                 C  s
   t | tS rG   )r=   dictrI   r    r    r#   rB      s    rB   zTypeGuard[list[object]]c                 C  s
   t | tS rG   )r=   listrI   r    r    r#   r@      s    r@   zTypeGuard[Iterable[object]]c                 C  s
   t | tS rG   )r=   r	   rI   r    r    r#   is_iterable   s    rW   )r"   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>   s      z$deepcopy_minimal.<locals>.<dictcomp>c                 S  s   g | ]}t |qS r    rX   )r!   rF   r    r    r#   r$      s     z$deepcopy_minimal.<locals>.<listcomp>)rS   r   r   itemsr@   )r"   r    r    r#   rY      s
    rY   z, or)delimfinalstr)seqr_   r`   r   c                C  sn   t | }|dkrdS |dkr$| d S |dkrH| d  d| d| d  S || d d d| d| d   S )Nr   r5   r7   r    )rC   join)rb   r_   r`   sizer    r    r#   
human_join   s    rg   )stringr   c                 C  s   d|  dS )zOAdd single quotation marks around the given string. Does *not* do any escaping.'r    )rh   r    r    r#   quote   s    rj   z Callable[[CallableT], CallableT])variantsr   c                    s   dd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: ...
    ```
    r   )funcr   c                   sF   t  j}dd | D t dddd fdd}|S )Nc                 S  s&   g | ]\}}|j |j|jhkr|qS r    )kindPOSITIONAL_ONLYPOSITIONAL_OR_KEYWORD)r!   nameparamr    r    r#   r$      s   z0required_args.<locals>.inner.<locals>.<listcomp>r0   )argskwargsr   c            
        sD  t   t| D ]V\}}z |  W q tk
rb   tj dt dt|  dd Y qX q| D ]} | qnD ]$}t fdd|D }|r q:qtdkrt	dd D }d	| d
}n^tdkst
tt d   }	t|	dkr dt	dd |	D  }ndt|	d  }t|| |S )Nz	() takes z argument(s) but z were givenc                 3  s   | ]}| kV  qd S rG   r    )r!   rq   Zgiven_paramsr    r#   	<genexpr>  s     z@required_args.<locals>.inner.<locals>.wrapper.<locals>.<genexpr>r7   c                 S  s*   g | ]"}d t dd |D dd d qS )(c                 S  s   g | ]}t |qS r    rj   r!   argr    r    r#   r$     s     zLrequired_args.<locals>.inner.<locals>.wrapper.<locals>.<listcomp>.<listcomp>and)r`   ))rg   )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  s   g | ]}t |qS r    rw   rx   r    r    r#   r$     s     zMissing required argument: )set	enumerateaddr<   	TypeError__name__rC   keysallrg   r?   rV   rj   )
rr   rs   i_r6   r|   matchesZ
variationsmsgmissing)rl   
positionalrk   rt   r#   wrapper   s8    
z-required_args.<locals>.inner.<locals>.wrapper)inspect	signature
parametersr]   	functoolswraps)rl   paramsr   rk   )rl   r   r#   inner   s    
#zrequired_args.<locals>.innerr    )rk   r   r    r   r#   required_args   s    2r   _K_VNonec                 C  s   d S rG   r    rI   r    r    r#   strip_not_given)  s    r   zMapping[_K, _V | NotGiven]zdict[_K, _V]c                 C  s   d S rG   r    rI   r    r    r#   r   -  s    c                 C  s   d S rG   r    rI   r    r    r#   r   1  s    zobject | Nonec                 C  s*   | dk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    rH   r!   r6   valuer    r    r#   r\   =  s     
  z#strip_not_given.<locals>.<dictcomp>)rS   r]   rI   r    r    r#   r   5  s
    )valr   c                 C  s   t | ddS )N
   )base)r1   r   r    r    r#   coerce_integer@  s    r   floatc                 C  s   t | S rG   )r   r   r    r    r#   coerce_floatD  s    r   boolc                 C  s   | dkp| dkp| dkS )Ntrue1onr    r   r    r    r#   coerce_booleanH  s    r   z
int | Nonec                 C  s   | d krd S t | S rG   )r   r   r    r    r#   maybe_coerce_integerL  s    r   zfloat | Nonec                 C  s   | d krd S t | S rG   )r   r   r    r    r#   maybe_coerce_floatR  s    r   zbool | Nonec                 C  s   | d krd S t | S rG   )r   r   r    r    r#   maybe_coerce_booleanX  s    r   )rh   prefixr   c                 C  s   |  |r| t|d S | S )zXRemove a prefix from a string.

    Backport of `str.removeprefix` for Python < 3.9
    N)
startswithrC   )rh   r   r    r    r#   removeprefix^  s    
r   )rh   suffixr   c                 C  s    |  |r| dt|  S | S )zXRemove a suffix from a string.

    Backport of `str.removesuffix` for Python < 3.9
    N)endswithrC   )rh   r   r    r    r#   removesuffixh  s    
r   r   )r.   r   c                 C  s    t |  }tj| }||fS rG   )r   
read_bytesosr.   basename)r.   contents	file_namer    r    r#   file_from_pathr  s    r   r   )headersheaderr   c                 C  s   |  }t| r@|  D ]&\}}|  |krt|tr|  S qtddd | }||| |fD ]}| 	|}|rf|  S qft
d| dd S )Nz([^\w])(\w)c                 S  s   |  d|  d  S )Nr7   r   )groupupper)patr    r    r#   <lambda>      z%get_required_header.<locals>.<lambda>zCould not find z header)lowerrT   r]   r=   ra   resub
capitalizer   get
ValueError)r   r   Zlower_headerrZ   r[   Zintercaps_headerZnormalized_headerr   r    r    r#   get_required_headerx  s    


r   )r   c                   C  s&   z
t  W S  tk
r    Y dS X d S )Nfalse)sniffioZcurrent_async_library	Exceptionr    r    r    r#   get_async_library  s    
r      maxsize)r   r   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   )datar   c                 C  sZ   t | rdd |  D S t| r@t| tttfs@dd | D S t| ttfrV| 	 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#   r\     s      zjson_safe.<locals>.<dictcomp>c                 S  s   g | ]}t |qS r    r   r:   r    r    r#   r$     s     zjson_safe.<locals>.<listcomp>)
rS   r]   rW   r=   ra   bytes	bytearrayr   r   	isoformat)r   r    r    r#   r     s    r   zTypeGuard[AzureOpenAI])clientr   c                 C  s   ddl m} t| |S )Nr   )r   )	lib.azurer   r=   )r   r   r    r    r#   is_azure_client  s    r   zTypeGuard[AsyncAzureOpenAI]c                 C  s   ddl m} t| |S )Nr   )r   )r   r   r=   )r   r   r    r    r#   is_async_azure_client  s    r   )J
__future__r   r   r   r   r   typingr   r   r   r   r   r   r	   r
   r   r   pathlibr   r   r   Ztyping_extensionsr   r   _typesr   r   r   r   r   r0   r   ra   r   r   r   r   r   r   r%   r/   r,   rJ   rM   rN   rP   rQ   rS   rT   rB   r@   rW   rY   rg   rj   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r    r    r#   <module>   st   0IK


