
    e                        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y)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helpc                4    t         |   |       d| _        y)zInitialize checker instance.linter N)super__init__valid_magic_vals)selfr   	__class__s     ?/usr/lib/python3/dist-packages/pylint/extensions/magic_value.pyr   zMagicValueChecker.__init__0   s    '9;    c                      j                         r8t         fd j                  j                  j                  D               _        y  j                  j                  j                   _        y )Nc              3  @   K   | ]  }j                  |        y wN)_parse_rcfile_magic_numbers).0valuer   s     r!   	<genexpr>z)MagicValueChecker.open.<locals>.<genexpr>8   s$      * 007*s   )_magic_vals_ext_configuredtupler   configvalid_magic_valuesr   r   s   `r!   openzMagicValueChecker.open5   sS    **,$) *![[//BB* %D!
 %)KK$6$6$I$ID!r"   c                `    t        | j                  j                  j                  t               S r%   )
isinstancer   r,   r-   r+   r.   s    r!   r*   z,MagicValueChecker._magic_vals_ext_configured?   s"    dkk00CCUKKKr"   c                   g }d}d}|j                   }|j                  t        |t        j                               |j
                  d   d   }|j                  t        |t        j                               t        |      ryd}||   r"| j                  |      r|j                         }n&||   r!| j                  |      r|j                         }|| j                  d||t               yy)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   )nodeargs
confidence)leftappendr1   r   Constopsall_is_magic_value	as_stringadd_messager	   )r   r3   const_operandsLEFT_OPERANDRIGHT_OPERANDleft_operandright_operandoperand_values           r!   _check_constants_comparisonz-MagicValueChecker._check_constants_comparisonB   s    
 yyju{{CDAjDE~,'D,@,@,N(224MM*t/C/CM/R)335M$(#	   %r"   c                b    t        j                  |       xr |j                  | j                  vS r%   )r   is_singleton_constr(   r   r   r3   s     r!   r;   z!MagicValueChecker._is_magic_valueb   s/    ,,T22 
JJt445	
r"   c                    | j                         j                  d      } | j                  d      r| j                  d      r| dd S t	        d|       }|rt        |       S | S )Nunicode_escape'r   r   z[-+]?\d+(\.0*)?$)encodedecode
startswithendswithregex_matchfloat)
parsed_val	is_numbers     r!   r&   z-MagicValueChecker._parse_rcfile_magic_numbersg   sc    &&(//0@A
  %**=*=c*Ba## 3Z@	$-uZ =:=r"   zmagic-comparisonc                &    | j                  |       y r%   )rD   rG   s     r!   visit_comparezMagicValueChecker.visit_compareq   s    ((.r"   r   r
   returnNone)rV   rW   )rV   bool)r3   znodes.ComparerV   rW   )r3   znodes.ConstrV   rX   )rQ   strrV   zfloat | str)__name__
__module____qualname____doc__namemsgsoptionsr   r/   r*   rD   r;   staticmethodr&   r   only_required_for_messagesrT   __classcell__)r    s   @r!   r   r      s    .D 
D !5-H	
	
G<
JL@

 > > &U%%&89/ :/r"   r   c                8    | j                  t        |              y r%   )register_checkerr   r   s    r!   registerrf   v   s    
-f56r"   NrU   )r]   
__future__r   rer   rO   typingr   astroidr   pylint.checkersr   r   pylint.interfacesr	   pylint.lintr
   r   rf   r   r"   r!   <module>rn      s6   
 3 " #    . "$^/ ^/B7r"   