o
    tf	.                     @   s  d dl Z d dl mZ d dlmZ d dlmZmZmZmZm	Z	m
Z
mZmZ ddlmZmZ e
deeef dZe
d	eeef dZd
e	defddZdd Zdee fddZdededefddZ	d4dedededdfddZdedefddZde jd e jd!ed"ed#ed$efd%d&Zde jd e jd!ed"ed#ed'ed$efd(d)Zd*ed+ed,ed e jd-e jdefd.d/Zde jd e jd#ed$eddf
d0d1Zd!ed"ed$efd2d3ZdS )5    N)	Parameter)FunctionType)CallableDictOptionalTupleTypeTypeVarUnionget_type_hints   )get_args	issubtype_WrappedMethod)bound_WrappedMethod2treturnc                 C   s.   t | trdS t| D ]	}t|r dS qdS )a_  Recursively check if `t` or any types contained by `t` is a `TypeVar`.

    Examples where we return `True`: `T`, `Optional[T]`, `Tuple[Optional[T], ...]`, ...
    Examples where we return `False`: `int`, `Optional[str]`, ...

    :param t: Type to evaluate.
    :return: `True` if the input type contains an unbound `TypeVar`, `False` otherwise.
    TF)
isinstancer	   r   _contains_unbound_typevar)r   arg r   \/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/overrides/signature.pyr      s   
r   c                 C   sF   t | rdS |d u rdS t |rdS zt| |W S  ty"   Y dS w )NT)r   r   	TypeError)leftrightr   r   r   
_issubtype"   s   r   c              	   C   s$   zt | W S  ttfy   Y d S w N)r   	NameErrorr   callabler   r   r   _get_type_hints0   s
   
r!   	callable1	callable2c                 C   s>   | j dd }t|dd }|d u rdS |dd }||kS )N.r   
__module__F)r%   splitgetattr)r"   r#   Zmod1Zmod2r   r   r   _is_same_module7   s   r(   Fsuper_callablesub_callable	is_staticc           	      C   s   t | } t |}zt| }W n
 ty   Y dS w t| }t|}t|}|j}t|| }|durP|durPt||| t|||||| t	||||||| t
|||| dS )a  Ensure that the signature of `sub_callable` is compatible with the signature of `super_callable`.

    Guarantees that any call to `super_callable` will work on `sub_callable` by checking the following criteria:

    1. The return type of `sub_callable` is a subtype of the return type of `super_callable`.
    2. All parameters of `super_callable` are present in `sub_callable`, unless `sub_callable`
       declares `*args` or `**kwargs`.
    3. All positional parameters of `super_callable` appear in the same order in `sub_callable`.
    4. All parameters of `super_callable` are a subtype of the corresponding parameters of `sub_callable`.
    5. All required parameters of `sub_callable` are present in `super_callable`, unless `super_callable`
       declares `*args` or `**kwargs`.

    :param super_callable: Function to check compatibility with.
    :param sub_callable: Function to check compatibility of.
    :param is_static: True if staticmethod and should check first argument.
    N)_unbound_funcinspect	signature
ValueErrorr!   __qualname__r(    ensure_return_type_compatibility ensure_all_kwargs_defined_in_sub)ensure_all_positional_args_defined_in_subensure_no_extra_args_in_sub)	r)   r*   r+   	super_sigsuper_type_hintssub_sigsub_type_hintsmethod_nameZsame_main_moduler   r   r   ensure_signature_is_compatibleB   s6   

	r:   r    c                 C   s   t | drt | dr| jS | S )N__self____func__)hasattrr<   r   r   r   r   r,   w   s   r,   r5   r7   r6   r8   check_first_parameterr9   c                 C   sp  t dd |j D }t| j D ]\}\}}	|dkr |s q|	jtjkr'q|	jtjkr.qt	|d|||	s@t
| d| d||jv r|	jtjkrt|j |}
|j| }|	j|jkrz|	jtjkrl|jtjkszt
| d| d|	j d||
kr|	jtjkrt
| d| d	| d||v r||v rt|| || st
d| d
| d|	j d|j d	qd S )Nc                 s       | ]	}|j tjkV  qd S r   kindr   VAR_KEYWORD.0pr   r   r   	<genexpr>       
z3ensure_all_kwargs_defined_in_sub.<locals>.<genexpr>r   T: `z` is not present.
` is not ``z` is not parameter at index `: z must be a supertype of `
` but is `)any
parametersvalues	enumerateitemsrA   r   VAR_POSITIONALPOSITIONAL_ONLYis_param_defined_in_subr   rB   listkeysindexKEYWORD_ONLYPOSITIONAL_OR_KEYWORDr   
annotation)r5   r7   r6   r8   r>   r9   sub_has_var_kwargsZsuper_indexnamesuper_param	sub_index	sub_paramr   r   r   r2   }   sD   

 r2   is_same_main_modulec                 C   s  dd |j  D }dd | j  D }tdd |D }	tdd |D }
|	s7t|t|k r7t| dd}t|D ]\}}|dkrH|sHq=|| t|krv|jtjkrWq=|jtj	krd|j
tjkrdq=|jtjkrkq=t| d	|j d
|jtjkr d S |||  }|jtjkr|d8 }|jtjkr|	st| d	|j dq=|j|jkr|jtj	kr|jtjks|jtj	kr|
st| d	|j d|j d|j d|j|v s|rt||jd ||jd std| d|j d|j d|j d	q=d S )Nc                 S   "   g | ]}|j tjtjfvr|qS r   rA   r   rX   rB   rD   vr   r   r   
<listcomp>   
    z=ensure_all_positional_args_defined_in_sub.<locals>.<listcomp>c                 S   ra   r   rb   rc   r   r   r   re      rf   c                 s   r?   r   rA   r   rR   rC   r   r   r   rF      rG   z<ensure_all_positional_args_defined_in_sub.<locals>.<genexpr>c                 s   r?   r   rg   rC   r   r   r   rF      rG   z: parameter list too shortr   rH   z8` positionally required in subclass but not in supertyper   z` must be presentrI   z
` and is `rJ   rK   z$ overriding must be a supertype of `rL   )rN   rO   rM   lenr   rP   rA   r   rR   rS   defaultemptyrY   r\   r   getrZ   )r5   r7   r6   r8   r>   r`   r9   Zsub_parameter_valuesZsuper_parameter_valuessub_has_var_argsZsuper_has_var_argsZsuper_shiftrW   r_   r]   r   r   r   r3      sp   	 "r3   r\   rl   r[   r]   c                 C   s^   | |j v p.|jtjko|p.|jtjko|p.|jtjko|p.|jtjko&|o&|p.|jtjko.|S r   )rN   rA   r   rR   rB   rS   rY   rX   )r\   rl   r[   r7   r]   r   r   r   rT      s   
	rT   c           
      C   s   | j  }tdd |D }tdd |D }t|j  D ]\\}\}}	|	jtjkr;t||kr;t	|| jtjkr;q|| j vrz|	j
tjkrz|	jtjkrz|	jtjkrz|	jtjkrZ|sz|	jtjkrb|sz|	jtjkrj|sz|dksp|rzt| d| dqd S )Nc                 s   r?   r   rg   rC   r   r   r   rF         z.ensure_no_extra_args_in_sub.<locals>.<genexpr>c                 s   r?   r   r@   rC   r   r   r   rF     rm   r   rH   z` is not a valid parameter.)rN   rO   rM   rP   rQ   rA   r   rS   rh   rU   ri   rj   rR   rB   rX   rY   r   )
r5   r7   r>   r9   Zsuper_paramsZsuper_var_argsZsuper_var_kwargsr^   r\   r_   r   r   r   r4   
  s&   

r4   c                 C   sL   |  dd }| dd }t||s"|d ur$t| d| d| dd S d S )Nr   z: return type `z` is not a `z`.)rk   r   r   )r6   r8   r9   Zsuper_returnZ
sub_returnr   r   r   r1   )  s   r1   )F) r-   r   typesr   typingr   r   r   r   r   r	   r
   r   Ztyping_utilsr   r   r   r   boolr   r   r!   r(   r:   r,   	Signaturestrr2   r3   rT   r4   r1   r   r   r   r   <module>   s    (
5
-
K

