
    c~                        d Z ddlmZ ddlmZ ddlZddlmZmZmZ ddl	m
Z
mZ ddlmZ erddlmZ  G d	 d
e
          ZddZdS )z#Variables checkers for Python code.    )annotations)TYPE_CHECKINGN)	argumentsbasesnodes)BaseCheckerutils)	INFERENCE)PyLinterc                      e Zd ZdZdZddddddifd	Zd
dddddffZ ej        dd          dd            Z	ddZ
ddZdS )MethodArgsCheckerzpBaseChecker for method_args.

    Checks for
    * missing-timeout
    * positional-only-arguments-expected
    method_args)zTMissing timeout argument for method '%s' can cause your program to hang indefinitelymissing-timeoutzUsed when a method needs a 'timeout' parameter in order to avoid waiting for a long time. If no timeout is specified explicitly the default value is used. For example for 'requests' the program will never time out (i.e. hang indefinitely).zI`%s()` got some positional-only arguments passed as keyword arguments: %s"positional-only-arguments-expectedzEmitted when positional-only arguments have been passed as keyword arguments. Remove the keywords for the affected arguments in the function call.
minversion)      )W3101E3102ztimeout-methods)zrequests.api.deletezrequests.api.getzrequests.api.headzrequests.api.optionszrequests.api.patchzrequests.api.postzrequests.api.putzrequests.api.requestcsvz<comma separated list>zzList of qualified names (i.e., library.method) which require a timeout parameter e.g. 'requests.api.get,requests.api.post')defaulttypemetavarhelpr   node
nodes.CallreturnNonec                Z    |                      |           |                     |           d S N)_check_missing_timeout)_check_positional_only_arguments_expected)selfr   s     ;lib/python3.11/site-packages/pylint/checkers/method_args.py
visit_callzMethodArgsChecker.visit_callE   s2     	##D)))66t<<<<<    c                ,   t          j        |j                  }t          j                            |          }|r|                                st          |t          j	        t          j
        t          j        f          r|                                | j        j        j        v rmd |j        D             }|                    |j                   d|vr@|                     d||j                                        ft,                     dS dS dS dS dS dS )zCheck if the call needs a timeout parameter based on package.func_name
        configured in config.timeout_methods.

        Package uses inferred node in order to know the package imported.
        c                    g | ]	}|j         
S  arg).0keywords     r$   
<listcomp>z<MethodArgsChecker._check_missing_timeout.<locals>.<listcomp>\   s     J J J J J Jr&   timeoutr   r   args
confidenceN)r	   
safe_inferfuncr   CallSite	from_callhas_invalid_keywords
isinstancer   FunctionDefClassDefr   UnboundMethodqnamelinterconfigtimeout_methodskeywordsextendkeyword_argumentsadd_message	as_stringr
   )r#   r   inferred	call_siterB   s        r$   r!   z(MethodArgsChecker._check_missing_timeoutL   sE    #DI..&0066		2244	 5,ene>QR 	   DK$6$FF	 !K JDM J J J$$Y%@AAA 11   %)--//1(	 !     	 	 	 	 	 	 	 	 r&   c           	     2   t          j        |j                  }t          |t          j        t          j        f          r-|j        }t          |t          j        t          j        f          -t          |t          j	                  r|j
        j        sdS d |j
        j        D             fd|j        D             }|sdS |                     d||j                                        d                    d |D                       ft                      dS )z~Check if positional only arguments have been passed as keyword arguments by
        inspecting its method definition.
        Nc                    g | ]	}|j         
S r)   )name)r,   as     r$   r.   zOMethodArgsChecker._check_positional_only_arguments_expected.<locals>.<listcomp>r   s    CCCqAFCCCr&   c                0    g | ]}|j         v |j         S r)   r*   )r,   kpos_argss     r$   r.   zOMethodArgsChecker._check_positional_only_arguments_expected.<locals>.<listcomp>s   s'    AAAqu/@AquAAAr&   r   z, c              3  "   K   | ]
}d | d V  dS )'Nr)   )r,   rL   s     r$   	<genexpr>zNMethodArgsChecker._check_positional_only_arguments_expected.<locals>.<genexpr>z   s*      2I2I8q8882I2I2I2I2I2Ir&   r0   )r	   r3   r4   r8   astroidBoundMethodr;   _proxiedr   r9   r1   posonlyargsr@   rC   rD   joinr
   )r#   r   inferred_funckwsrM   s       @r$   r"   z;MethodArgsChecker._check_positional_only_arguments_expectedf   s)    (33)<g>S(TUU 	3)2M )<g>S(TUU 	3 }u'8::	".	 FCCM$6$BCCCAAAAdmAAA 	F0)%%''2I2IS2I2I2I)I)IJ 	 	 	
 	
 	
 	
 	
r&   N)r   r   r   r   )__name__
__module____qualname____doc__rI   msgsoptionsr	   only_required_for_messagesr%   r!   r"   r)   r&   r$   r   r      s          D
 X0S6"
 D& 	 3< 	
G, &U%? = = = =   4
 
 
 
 
 
r&   r   r=   r   r   r   c                J    |                      t          |                      d S r    )register_checkerr   )r=   s    r$   registerra      s%    
-f5566666r&   )r=   r   r   r   )r[   
__future__r   typingr   rQ   r   r   r   pylint.checkersr   r	   pylint.interfacesr
   pylint.lintr   r   ra   r)   r&   r$   <module>rg      s   
 * ) " " " " " "              + + + + + + + + + + . . . . . . . . ' ' ' ' ' ' %$$$$$$g
 g
 g
 g
 g
 g
 g
 g
T7 7 7 7 7 7r&   