U
    Zh                     @  sn  U d dl mZ d dlZd dlZd dlZd dlmZmZmZmZ d dl	m
Z d dlmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZ 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ddZdddddZejfZde d< ej!dkreejfZdddd d!Z"ed"d#dddd$d%Z#dd&dd'd(d)Z$dd*dd+d&d,dd-d.d/Z%dS )0    )annotationsN)AnyTypeVarIterablecast)abc)TypeIsRequired	Annotatedget_args
get_origin   )	lru_cache   )InheritsGeneric)is_uniontypebool)typreturnc                 C  s   t | tkS N)r   r
   r    r   9/tmp/pip-unpacked-wheel-693nel7n/openai/_utils/_typing.pyis_annotated_type   s    r   c                 C  s   t | p
| tkS r   )r   listr   r   r   r   is_list_type   s    r   c                 C  s   t | p
| }|tkp|tjkS )z)If the given type is `typing.Iterable[T]`)r   r   _c_abc)r   originr   r   r   is_iterable_type   s    r   c                 C  s   t t| S r   )	_is_unionr   r   r   r   r   is_union_type#   s    r!   c                 C  s   t | tkS r   )r   r	   r   r   r   r   is_required_type'   s    r"   c                 C  s   t | tkS r   )r   r   r   r   r   r   
is_typevar+   s    r#   z1tuple[type[typing_extensions.TypeAliasType], ...]_TYPE_ALIAS_TYPES)      r   z'TypeIs[typing_extensions.TypeAliasType])tpr   c                C  s
   t | tS )zReturn whether the provided argument is an instance of `TypeAliasType`.

    ```python
    type Int = int
    is_type_alias_type(Int)
    # > True
    Str = TypeAliasType("Str", str)
    is_type_alias_type(Str)
    # > True
    ```
    )
isinstancer$   )r'   r   r   r   is_type_alias_type6   s    r)   i  )maxsizec                 C  s*   t | st| r&tttt| d S | S )Nr   )r"   r   strip_annotated_typer   r   r   r   r   r   r   r+   F   s    r+   int)r   indexr   c              
   C  sX   t | }ztt|| W S  tk
rR } ztd|  d| d|W 5 d }~X Y nX d S )NzExpected type z" to have a type argument at index z but it did not)r   r   r   
IndexErrorRuntimeError)r   r-   argserrr   r   r   extract_type_argN   s
    r2   )failure_messageztuple[type, ...]z
str | None)r   generic_basesr-   r3   r   c                C  s   t tt| p| }||kr$t| |S t|trd}|jD ]}|j|kr8|} qPq8|dkrntd| d| dt||}t	|rt| |S |S t|pd| d|  dS )a  Given a type like `Foo[T]`, returns the generic type variable `T`.

    This also handles the case where a concrete subclass is given, e.g.
    ```py
    class MyResponse(Foo[bytes]):
        ...

    extract_type_var(MyResponse, bases=(Foo,), index=0) -> bytes
    ```

    And where a generic subclass is given:
    ```py
    _T = TypeVar('_T')
    class MyResponse(Foo[_T]):
        ...

    extract_type_var(MyResponse[bytes], bases=(Foo,), index=0) -> bytes
    ```
    NzFCould not find the generic base class;
This should never happen;
Does z inherit from one of z ?z/Could not resolve inner type variable at index z for )
r   objectr   r2   r(   r   __orig_bases__
__origin__r/   r#   )r   r4   r-   r3   clsZtarget_base_classbaseZ	extractedr   r   r   extract_type_var_from_baseV   s$    




	
r:   )&
__future__r   systypingZtyping_extensionsr   r   r   r   collectionsr   r   r   r	   r
   r   r   _utilsr   _typesr   _compatr   r    r   r   r   r!   r"   r#   ZTypeAliasTyper$   __annotations__version_infor)   r+   r2   r:   r   r   r   r   <module>   s2    