U
    ~fh1                     @  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 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&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d0d&d1d2Z0d3d4d&d5d6Z1dd7d&d8d9Z2d:d;d&d<d=Z3dd>d&d?d@Z4ddAd&dBdCZ5ddDd&dEdFZ6d
d
dGdHdIZ7dJdKdLddMdMdMdNdOdPZ8dMdMdQdRdSZ9ddTdUdVdWZ:edXZ;edYZ<edZdZd&d[d\Z=ed]d^d&d_d\Z=eddd&d`d\Z=dadd&dbd\Z=dMddcdddeZ>dMdfdcdgdhZ?dMdidcdjdkZ@d dldcdmdnZAd dodcdpdqZBd drdcdsdtZCdMdMdMdudvdwZDdMdMdMdxdydzZEdMd{d|d}d~ZFddMdMdddZGdMdddZHdddldTdddZIdddddZJdddddZKdddddZLdS )    )annotationsN)
TYPE_CHECKING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)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-rjiviquo/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    r1   objectzSequence[str]intz
str | None)objr0   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 )Nr6   r*   )r.   r#   r$   r,   r+   r0   r"   r%   r&   w   s   z"_extract_items.<locals>.<listcomp>)
IndexError
isinstancer   _filesr5   AssertionErroris_listappendr   r   is_dictlenpopKeyErrorr.   r'   )	r4   r0   r+   r,   r8   r5   r/   entryr$   r"   r=   r%   r.   =   sR    





r.   zNotGivenOr[_T]zTypeGuard[_T])r4   r!   c                 C  s   t | t S Nr?   r   r4   r"   r"   r%   is_given   s    rL   zTypeGuard[tuple[object, ...]]c                 C  s
   t | tS rI   r?   tuplerK   r"   r"   r%   is_tuple   s    rO   z_TupleT | objectzTypeGuard[_TupleT]c                 C  s
   t | tS rI   rM   rK   r"   r"   r%   
is_tuple_t   s    rP   zTypeGuard[Sequence[object]]c                 C  s
   t | tS rI   r?   r
   rK   r"   r"   r%   is_sequence   s    rR   z_SequenceT | objectzTypeGuard[_SequenceT]c                 C  s
   t | tS rI   rQ   rK   r"   r"   r%   is_sequence_t   s    rS   zTypeGuard[Mapping[str, object]]c                 C  s
   t | tS rI   r?   r   rK   r"   r"   r%   
is_mapping   s    rU   z_MappingT | objectzTypeGuard[_MappingT]c                 C  s
   t | tS rI   rT   rK   r"   r"   r%   is_mapping_t   s    rV   zTypeGuard[dict[object, object]]c                 C  s
   t | tS rI   )r?   dictrK   r"   r"   r%   rD      s    rD   zTypeGuard[list[object]]c                 C  s
   t | tS rI   )r?   listrK   r"   r"   r%   rB      s    rB   zTypeGuard[Iterable[object]]c                 C  s
   t | tS rI   )r?   r	   rK   r"   r"   r%   is_iterable   s    rY   )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"   rZ   )r#   rH   r"   r"   r%   r&      s     z$deepcopy_minimal.<locals>.<listcomp>)rU   r   r   itemsrB   )r$   r"   r"   r%   r[      s
    r[   z, or)delimfinalstr)seqra   rb   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   r7   r9   r    )rE   join)rd   ra   rb   sizer"   r"   r%   
human_join   s    ri   )stringr!   c                 C  s   d|  dS )zOAdd single quotation marks around the given string. Does *not* do any escaping.'r"   )rj   r"   r"   r%   quote   s    rl   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>r2   )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 rI   r"   )r#   rs   Zgiven_paramsr"   r%   	<genexpr>  s     z@required_args.<locals>.inner.<locals>.wrapper.<locals>.<genexpr>r9   c                 S  s*   g | ]"}d t dd |D dd d qS )(c                 S  s   g | ]}t |qS r"   rl   r#   argr"   r"   r%   r&     s     zLrequired_args.<locals>.inner.<locals>.wrapper.<locals>.<listcomp>.<listcomp>and)rb   ))ri   )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"   ry   rz   r"   r"   r%   r&     s     zMissing required argument: )set	enumerateaddr>   	TypeError__name__rE   keysallri   rA   rX   rl   )
rt   ru   i_r8   r~   matchesZ
variationsmsgmissing)rn   
positionalrm   rv   r%   wrapper   s8    
z-required_args.<locals>.inner.<locals>.wrapper)inspect	signature
parametersr_   	functoolswraps)rn   paramsr   rm   )rn   r   r%   inner   s    
#zrequired_args.<locals>.innerr"   )rm   r   r"   r   r%   required_args   s    2r   _K_VNonec                 C  s   d S rI   r"   rK   r"   r"   r%   strip_not_given*  s    r   zMapping[_K, _V | NotGiven]zdict[_K, _V]c                 C  s   d S rI   r"   rK   r"   r"   r%   r   .  s    c                 C  s   d S rI   r"   rK   r"   r"   r%   r   2  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"   rJ   r#   r8   valuer"   r"   r%   r^   >  s     
  z#strip_not_given.<locals>.<dictcomp>)rU   r_   rK   r"   r"   r%   r   6  s
    )valr!   c                 C  s   t | ddS )N
   )base)r3   r   r"   r"   r%   coerce_integerA  s    r   floatc                 C  s   t | S rI   )r   r   r"   r"   r%   coerce_floatE  s    r   boolc                 C  s   | dkp| dkp| dkS )Ntrue1onr"   r   r"   r"   r%   coerce_booleanI  s    r   z
int | Nonec                 C  s   | d krd S t | S rI   )r   r   r"   r"   r%   maybe_coerce_integerM  s    r   zfloat | Nonec                 C  s   | d krd S t | S rI   )r   r   r"   r"   r%   maybe_coerce_floatS  s    r   zbool | Nonec                 C  s   | d krd S t | S rI   )r   r   r"   r"   r%   maybe_coerce_booleanY  s    r   )rj   prefixr!   c                 C  s   |  |r| t|d S | S )zXRemove a prefix from a string.

    Backport of `str.removeprefix` for Python < 3.9
    N)
startswithrE   )rj   r   r"   r"   r%   removeprefix_  s    
r   )rj   suffixr!   c                 C  s    |  |r| dt|  S | S )zXRemove a suffix from a string.

    Backport of `str.removesuffix` for Python < 3.9
    N)endswithrE   )rj   r   r"   r"   r%   removesuffixi  s    
r   r   )r0   r!   c                 C  s    t |  }tj| }||fS rI   )r   
read_bytesosr0   basename)r0   contents	file_namer"   r"   r%   file_from_paths  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 )Nr9   r   )groupupper)patr"   r"   r%   <lambda>      z%get_required_header.<locals>.<lambda>zCould not find z header)lowerrV   r_   r?   rc   resub
capitalizer   get
ValueError)r   r   Zlower_headerr\   r]   Zintercaps_headerZnormalized_headerr   r"   r"   r%   get_required_headery  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>)
rU   r_   rY   r?   rc   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   )M
__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   _compatr   r   r   r2   r   rc   r   r   r   r   r   r   r'   r1   r.   rL   rO   rP   rR   rS   rU   rV   rD   rB   rY   r[   ri   rl   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r%   <module>   sv   0IK


