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   ).0sublistitemr   r   T/var/www/html/psymed-ai/venv/lib/python3.10/site-packages/anthropic/_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   r3   objobjectr2   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 )Nr:   r,   )r0   r    r"   r.   r-   r2   r   r#   r$   r   s    z"_extract_items.<locals>.<listcomp>)
IndexErroris_given_filesr9   is_listappendr
   r   is_dictlenpopKeyErrorr0   r&   )	r4   r2   r-   r.   r<   r9   r1   entryr"   r   rA   r#   r0   8   sX   r0   _T | NotGiven | OmitTypeGuard[_T]c                 C  s   t | t ot | t S N)
isinstancer   r   r4   r   r   r#   rC         rC   TypeGuard[tuple[object, ...]]c                 C  
   t | tS rN   rO   tuplerP   r   r   r#   is_tuple      
rV   _TupleT | objectTypeGuard[_TupleT]c                 C  rS   rN   rT   rP   r   r   r#   
is_tuple_t   rW   rZ   TypeGuard[Sequence[object]]c                 C  rS   rN   rO   r	   rP   r   r   r#   is_sequence   rW   r]   _SequenceT | objectTypeGuard[_SequenceT]c                 C  rS   rN   r\   rP   r   r   r#   is_sequence_t   rW   r`   TypeGuard[Mapping[str, object]]c                 C  rS   rN   rO   r   rP   r   r   r#   
is_mapping   rW   rc   _MappingT | objectTypeGuard[_MappingT]c                 C  rS   rN   rb   rP   r   r   r#   is_mapping_t   rW   rf   TypeGuard[dict[object, object]]c                 C  rS   rN   )rO   dictrP   r   r   r#   rG      rW   rG   TypeGuard[list[object]]c                 C  rS   rN   )rO   listrP   r   r   r#   rE      rW   rE   TypeGuard[Iterable[object]]c                 C  rS   rN   )rO   r   rP   r   r   r#   is_iterable   rW   rl   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   rm   )r    rK   r   r   r#   r$          z$deepcopy_minimal.<locals>.<listcomp>)rc   r
   r   itemsrE   )r"   r   r   r#   rn      s
   rn   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=   r    )rH   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>argsr5   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 rN   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  rr   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  rr   r   r   r   r   r   r#   r$     rs   zMissing required argument: )set	enumerateaddrB   	TypeError__name__rH   keysallr~   rj   r   )
r   r   i_r<   r   matches
variationsmsgmissing)r   
positionalr   r   r#   wrapper   s@   
z-required_args.<locals>.inner.<locals>.wrapper)r   r5   r   r5   r   r5   )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 rN   r   rP   r   r   r#   strip_not_given%     r   Mapping[_K, _V | NotGiven]dict[_K, _V]c                 C  r   rN   r   rP   r   r   r#   r   )  r   c                 C  r   rN   r   rP   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   )rO   r   r    r<   valuer   r   r#   rq   9  s     z#strip_not_given.<locals>.<dictcomp>)rc   rt   rP   r   r   r#   r   1  s
   valc                 C  s   t | ddS )N
   )base)r7   r   r   r   r#   coerce_integer<  s   r   floatc                 C  s   t | S rN   )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  rQ   r   
int | Nonec                 C     | d u rd S t | S rN   )r   r   r   r   r#   maybe_coerce_integerH     r   float | Nonec                 C  r   rN   )r   r   r   r   r#   maybe_coerce_floatN  r   r   bool | Nonec                 C  r   rN   )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)
startswithrH   )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)endswithrH   )r   r   r   r   r#   removesuffixd  s   
r   r   c                 C  s    t |  }tj| }||fS rN   )r   
read_bytesosr2   basename)r2   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)lowerrf   rt   rO   ry   resub
capitalizer   get
ValueError)r   r   lower_headerro   rp   intercaps_header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)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#   rq     s    zjson_safe.<locals>.<dictcomp>c                 S  rr   r   r   r@   r   r   r#   r$     rs   zjson_safe.<locals>.<listcomp>)
rc   rt   rl   rO   ry   bytes	bytearrayr   r   	isoformat)r   r   r   r#   r     s   r   )r   r   r   r   )r'   r(   r)   r*   r   r+   )
r4   r5   r2   r6   r-   r7   r.   r8   r   r+   )r4   rL   r   rM   )r4   r5   r   rR   )r4   rX   r   rY   )r4   r5   r   r[   )r4   r^   r   r_   )r4   r5   r   ra   )r4   rd   r   re   )r4   r5   r   rg   )r4   r5   r   ri   )r4   r5   r   rk   )r"   r   r   r   )rx   r6   rv   ry   rw   ry   r   ry   )r   ry   r   ry   )r   r6   r   r   )r4   r   r   r   )r4   r   r   r   )r4   r5   r   r5   )r4   r   r   r5   )r   ry   r   r7   )r   ry   r   r   )r   ry   r   r   )r   r8   r   r   )r   r8   r   r   )r   r8   r   r   )r   ry   r   ry   r   ry   )r   ry   r   ry   r   ry   )r2   ry   r   r   )r   r   r   ry   r   ry   )r   ry   )r   r   r   r   )r   r5   r   r5   )D
__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   r   r5   r   ry   r   r   r   r&   r3   r0   rC   rV   rZ   r]   r`   rc   rf   rG   rE   rl   rn   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














