
    c                        d Z ddlmZ ddlmZ ddlmZ ddl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,Checks for magic values instead of literals.    )annotations)match)TYPE_CHECKING)nodes)BaseCheckerutils)HIGH)PyLinterc                       e Zd ZdZdZddiZddddd	d
ffZd fdZddZd dZ	d!dZ
d"dZed#d            Z ej        d          d!d            Z xZS )$MagicValueCheckerz$Checks for constants in comparisons.zmagic-valueR2004)z;Consider using a named constant or an enum instead of '%s'.magic-value-comparisonzUsing named constants instead of magic values helps improve readability and maintainability of your code, try to avoid them in comparisons.zvalid-magic-values)r       __main__csvz<argument names>zList of valid magic values that `magic-value-compare` will not detect. Supports integers, floats, negative numbers, for empty string enter ``''``, for backslash values just use one backslash e.g \n.)defaulttypemetavarhelplinterr
   returnNonec                Z    t                                          |           d| _        dS )zInitialize checker instance.r    N)super__init__valid_magic_vals)selfr   	__class__s     =lib/python3.11/site-packages/pylint/extensions/magic_value.pyr   zMagicValueChecker.__init__0   s,    '''9;    c                                                       r1t           fd j        j        j        D                        _        d S  j        j        j         _        d S )Nc              3  B   K   | ]}                     |          V  d S N)_parse_rcfile_magic_numbers).0valuer!   s     r#   	<genexpr>z)MagicValueChecker.open.<locals>.<genexpr>8   sE       * * 0077* * * * * *r$   )_magic_vals_ext_configuredtupler   configvalid_magic_valuesr    r!   s   `r#   openzMagicValueChecker.open5   sv    **,, 	J$) * * * *![/B* * * % %D!!!
 %)K$6$ID!!!r$   boolc                L    t          | j        j        j        t                     S r'   )
isinstancer   r.   r/   r-   r0   s    r#   r,   z,MagicValueChecker._magic_vals_ext_configured?   s    dk0CUKKKKr$   nodenodes.Comparec                   g }d}d}|j         }|                    t          |t          j                             |j        d         d         }|                    t          |t          j                             t          |          rdS d}||         r|                     |          r|j        }n$||         r|                     |          r|j        }| | 	                    d||t                     dS dS )z
        Magic values in any side of the comparison should be avoided,
        Detects comparisons that `comparison-of-constants` core checker cannot detect.
        r   r   Nr   )r5   args
confidence)leftappendr4   r   Constopsall_is_magic_valuer*   add_messager	   )r!   r5   const_operandsLEFT_OPERANDRIGHT_OPERANDleft_operandright_operandoperand_values           r#   _check_constants_comparisonz-MagicValueChecker._check_constants_comparisonB   s   
 yju{CCDDDAjDDEEE~ 	F,' 	0D,@,@,N,N 	0(.MMM* 	0t/C/CM/R/R 	0)/M 	(#	      	 	r$   nodes.Constc                H    t          j        |           o|j        | j        vS r'   )r   is_singleton_constr*   r    r!   r5   s     r#   r?   z!MagicValueChecker._is_magic_valueb   s*    ,T222 
Jt45	
r$   
parsed_valstrfloat | strc                    |                                                      d          } |                     d          r|                     d          r
| dd         S t	          d|           }|rt          |           n| S )Nunicode_escape'r   r   z[-+]?\d+(\.0*)?$)encodedecode
startswithendswithregex_matchfloat)rL   	is_numbers     r#   r(   z-MagicValueChecker._parse_rcfile_magic_numbersg   s    &&((//0@AA
  %% 	$**=*=c*B*B 	$ad## 3Z@@	$-=uZ   :=r$   zmagic-comparisonc                0    |                      |           d S r'   )rG   rK   s     r#   visit_comparezMagicValueChecker.visit_compareq   s    ((.....r$   r   r
   r   r   )r   r   )r   r2   )r5   r6   r   r   )r5   rH   r   r2   )rL   rM   r   rN   )__name__
__module____qualname____doc__namemsgsoptionsr   r1   r,   rG   r?   staticmethodr(   r   only_required_for_messagesrZ   __classcell__)r"   s   @r#   r   r      s)       ..D 
D !5-H	 
	
G< < < < < <
J J J JL L L L   @
 
 
 

 > > > \> &U%&899/ / / :9/ / / / /r$   r   r   r
   r   r   c                J    |                      t          |                      d S r'   )register_checkerr   r   s    r#   registerrh   v   s%    
-f5566666r$   Nr[   )r_   
__future__r   rer   rV   typingr   astroidr   pylint.checkersr   r   pylint.interfacesr	   pylint.lintr
   r   rh   r   r$   r#   <module>rp      s   
 3 2 " " " " " " # # # # # #                   . . . . . . . . " " " " " " %$$$$$$^/ ^/ ^/ ^/ ^/ ^/ ^/ ^/B7 7 7 7 7 7r$   