
    yIfx5                        d dl m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 d dlmZmZ d dlmZ erd dlmZ ej        d	k    rd d
lmZ nd d
lmZ  G d de          ZddZdS )    )annotationsN)TYPE_CHECKINGTupleTypecast)nodes)BaseCheckerutils)only_required_for_messages
safe_infer)	INFERENCE)PyLinter)   
   )	TypeGuardc            	         e Zd ZdZdZddddddd	d
ifdddd	d
ifdZddddddffZd3dZ ed          d4d            Z	 ed          d5d            Z
 ed          d6d             Z ed          d7d"            Z ed#          d8d%            Zd5d&Zd8d'Zed9d-            Zed:d/            Z ed          d;d1            Zd2S )<CodeStyleCheckeram  Checkers that can improve code consistency.

    As such they don't necessarily provide a performance benefit and
    are often times opinionated.

    Before adding another checker here, consider this:
    1. Does the checker provide a clear benefit,
       i.e. detect a common issue or improve performance
       => it should probably be part of the core checker classes
    2. Is it something that would improve code consistency,
       maybe because it's slightly better with regard to performance
       and therefore preferred => this is the right place
    3. Everything else should go into another extension
    
code_style)z<Consider using namedtuple or dataclass for dictionary values&consider-using-namedtuple-or-dataclasszUEmitted when dictionary values can be replaced by namedtuples or dataclass instances.)z0Consider using an in-place tuple instead of listconsider-using-tuplezOnly for style consistency! Emitted where an in-place defined ``list`` can be replaced by a ``tuple``. Due to optimizations by CPython, there is no performance benefit from it.)zUse '%s' insteadconsider-using-assignment-exprzEmitted when an if assignment is directly followed by an if statement and both can be combined by using an assignment expression ``:=``. Requires Python 3.8 and ``py-version >= 3.8``.z+Use '%s' to do an augmented assign directlyconsider-using-augmented-assignzEmitted when an assignment is referring to the object that it is assigning to. This can be changed to be an augmented assign.
Disabled by default!default_enabledFz8Prefer 'typing.NamedTuple' over 'collections.namedtuple'prefer-typing-namedtuplez'typing.NamedTuple' uses the well-known 'class' keyword with type-hints for readability (it's also faster as it avoids an internal exec call).
Disabled by default!)R6101R6102R6103R6104R6105zmax-line-length-suggestionsintr   z<int>zMax line length for which to sill emit suggestions. Used to prevent optional suggestions which would get split by a code formatter (e.g., black). Will default to the setting for ``max-line-length``.)typedefaultmetavarhelpreturnNonec                    | j         j        j        }|dk    | _        |dk    | _        | j         j        j        p| j         j        j        | _        d S )N)r      )r      )linterconfig
py_version
_py36_plus
_py38_plusmax_line_length_suggestionsmax_line_length_max_length)selfr,   s     P/var/www/piapp/venv/lib/python3.11/site-packages/pylint/extensions/code_style.pyopenzCodeStyleChecker.opene   sP    ['2
$.$.K: 2{!1 	    node
nodes.Callc                    | j         rMt          |j                  }|r9|                                dk    r#|                     d|t
                     d S d S d S d S )Nzcollections.namedtupler   )r6   
confidence)r-   r   funcqnameadd_messager   )r2   r6   calleds      r3   
visit_callzCodeStyleChecker.visit_calln   s~    ? 		**F &,,..,DDD  .Ti !     	 	 DDr5   r   
nodes.Dictc                0    |                      |           d S N))_check_dict_consider_namedtuple_dataclassr2   r6   s     r3   
visit_dictzCodeStyleChecker.visit_dictw   s    66t<<<<<r5   r   	nodes.Forc                    t          |j        t          j                  r|                     d|j                   d S d S Nr   r6   
isinstanceiterr   Listr<   rC   s     r3   	visit_forzCodeStyleChecker.visit_for{   G    di,, 	E3$)DDDDD	E 	Er5   nodes.Comprehensionc                    t          |j        t          j                  r|                     d|j                   d S d S rG   rI   rC   s     r3   visit_comprehensionz$CodeStyleChecker.visit_comprehension   rN   r5   r   nodes.Ifc                B    | j         r|                     |           d S d S rA   )r.   %_check_consider_using_assignment_exprrC   s     r3   visit_ifzCodeStyleChecker.visit_if   s0    ? 	=66t<<<<<	= 	=r5   c                   t          |j        t          j        t          j        f          r$t          |j        j        t          j                  sdt          |j        t          j                  rCt          |j        j        t          j                  rt          j	        |j        j        d          sdS t          |j                  dk    rt          d |j        D                       rt          t          t          j                 t           f         }t#                      }|j        D ]\  }}t%          t          j        |          }|j        D ]\  }}t)          |          |                                f}||v r-t-          |          }t          |t          j                  r|                                dk    s  dS |                    |           g }	|j        D ]P\  }}t%          t          j        |          }|	                    t7          d |j        D                                  Qt#          |	d                   }
|	dd         D ]}|
                    |           |
sdS |                     d|	           dS t          |j                  dk    rt          d
 |j        D                       rt          |j        d         d         j                  }|dk    rdS |j        dd         D ] \  }}t          |j                  |k    r dS !|j        D ]&\  }}t          d |j        D                       r dS '|                     d|	           dS dS dS )zFCheck if dictionary values can be replaced by Namedtuple or Dataclass.FinalN   c              3  P   K   | ]!\  }}t          |t          j                  V  "d S rA   rJ   r   Dict.0_
dict_values      r3   	<genexpr>zMCodeStyleChecker._check_dict_consider_namedtuple_dataclass.<locals>.<genexpr>   sC       '
 '
3@1jJz5:..'
 '
 '
 '
 '
 '
r5   zbuiltins.strc              3  b   K   | ]*\  }}t          |          |                                fV  +d S rA   )r!   	as_string)r]   keyr^   s      r3   r`   zMCodeStyleChecker._check_dict_consider_namedtuple_dataclass.<locals>.<genexpr>   s9      VV63499cmmoo6VVVVVVr5   r   r   rH   c              3  h   K   | ]-\  }}t          |t          j        t          j        f          V  .d S rA   )rJ   r   rL   r   r\   s      r3   r`   zMCodeStyleChecker._check_dict_consider_namedtuple_dataclass.<locals>.<genexpr>   sM       '
 '
: zEJ#<=='
 '
 '
 '
 '
 '
r5   c              3  J   K   | ]}t          |t          j                  V  d S rA   rZ   )r]   entrys     r3   r`   zMCodeStyleChecker._check_dict_consider_namedtuple_dataclass.<locals>.<genexpr>   s.      RRz%44RRRRRRr5   )rJ   parentr   Assign	AnnAssignModuletarget
AssignNamer
   is_assign_name_annotated_withlenitemsallr   r   NodeNGstrsetr   r[   r!   rb   r   Constpytypeaddappendtupleintersection_updater<   elts)r2   r6   	KeyTupleTkeys_checkedr^   r_   rc   	key_tupleinferred
key_tupleskeys_intersectionsub_key_tupleslist_lengths                r3   rB   z:CodeStyleChecker._check_dict_consider_namedtuple_dataclass   s    t{U\5?$CDD		4;-u|<<		 $+u77		 4;-u/?@@			
 3DK4FPP		 F tz??Q3 '
 '
DHJ'
 '
 '
 $
 $
 d5<0#56I ,/55L!% 0 0:!%*j99
(. 
0 
0FC!%cCMMOO <I L00 )#H"8U[99$OO--?? $$Y////
0 79J!%  :!%*j99
!!VVZEUVVVVV    14JqM0B0B",QRR. F F!55nEEEE$ EDQQQF tz??Q3 '
 '
!%'
 '
 '
 $
 $

 djmA.344Ka!%ABB  :z'';66FF 7 "&  :RR*/RRRRR FF EDQQQF% r5   c                   d}t          |j        t          j                  r|j        }nt          |j        t          j                  rA|j        j        dk    r1t          |j        j        t          j                  r|j        j        }not          |j        t          j                  rNt          |j        j        t          j                  r*t          |j        j
                  dk    r|j        j        }ndS |                                }t                              ||j                  rt                              ||j                  rdS |j                                                            |j        d|j         d|j                                         dd          }d| d}|j         t          |          |j        z   | j        k    st          |          | j        k    rdS |                     d	||f
           dS dS )aY  Check if an assignment expression (walrus operator) can be used.

        For example if an assignment is directly followed by an if statement:
        >>> x = 2
        >>> if x:
        >>>     ...

        Can be replaced by:
        >>> if (x := 2):
        >>>     ...

        Note: Assignment expressions were added in Python 3.8
        NnotrX   (z := )zif :r   )r6   args)rJ   testr   NameUnaryOpopoperandCompareleftrn   opsprevious_siblingr   _check_prev_sibling_to_if_stmtname(_check_ignore_assignment_expr_suggestionrb   replacevalue
col_offsetr1   r<   )r2   r6   	node_nameprev_siblingtest_str
suggestions         r3   rT   z6CodeStyleChecker._check_consider_using_assignment_expr   s    (,	di,, 		IIty%-00		%%49,ej99 & 	)IIty%-00	49>5:66	 DIM""a''	IIF ,,..::).
 
 	
  HHin    y**,,44IINII(:(D(D(F(FIII H
 +x***J+
OOdo58HHHz??T%5550 ]      3	 	r5   r   nodes.NodeNG | Noner   
str | None)TypeGuard[nodes.Assign | nodes.AnnAssign]c                   | | j         | j        z
  dk    rdS t          | t          j                  rUt          | j                  dk    r=t          | j        d         t          j                  r| j        d         j        |k    rdS t          | t          j	                  r1t          | j
        t          j                  r| j
        j        |k    rdS dS )z}Check if previous sibling is an assignment with the same name.

        Ignore statements which span multiple lines.
        Nr   FrX   T)tolineno
fromlinenorJ   r   rh   rn   targetsrl   r   ri   rk   )r   r   s     r3   r   z/CodeStyleChecker._check_prev_sibling_to_if_stmt  s     <#8<;R#RVW#W#W5 |U\22	L())Q..</2E4DEE /$Q',444|U_55	<.0@AA	 #(D004ur5   boolc                V   t          | j        t          j                  rd}|                                 }t          | j                  dk    r3t          | j        d         t          j                  r| j        d         }nt          |t          j                  r|}|t          |j        t          j                  r9t          |j        j        t          j	                  r|j        j        j
        |k    s/t          |j        t          j	                  r|j        j
        |k    rdS dS )zReturn True if suggestion for assignment expr should be ignored.

        E.g., in cases where a match statement would be a better fit
        (multiple conditions).
        NrX   r   TF)rJ   r   r   r   next_siblingrn   orelseIfr   r   r   )r6   r   next_if_noder   s       r3   r   z9CodeStyleChecker._check_ignore_assignment_expr_suggestion/  s    di// 	,0L,,..L4;1$$DKNEH)M)M$#{1~L%(33 ,+ (|0%-@@ ) #<#4#95:FF ) %).3t;;!,"3UZ@@ <$).$66 tur5   nodes.Assignc                    t          j        |          \  }}|r/|                     d| d||j        |j        t
                     d S d S )Nr   =)r   r6   liner   r9   )r
   is_augmented_assignr<   linenor   r   )r2   r6   is_augr   s       r3   visit_assignzCodeStyleChecker.visit_assignO  sk    .t44
 	1XXX[?$      	 	r5   N)r%   r&   )r6   r7   r%   r&   )r6   r?   r%   r&   )r6   rE   r%   r&   )r6   rO   r%   r&   )r6   rR   r%   r&   )r   r   r   r   r%   r   )r6   rR   r   r   r%   r   )r6   r   r%   r&   )__name__
__module____qualname____doc__r   msgsoptionsr4   r   r>   rD   rM   rQ   rU   rB   rT   staticmethodr   r   r    r5   r3   r   r      sG         D



 :-# "5	
 G&#
 "5

=) )DX *"K
 
	
G"
 
 
 
   :;;   <;   HII= = = JI=   677E E E 87E   677E E E 87E   @AA= = = BA=F F F FPA A A AF    \2    \>   ABB
 
 
 CB
 
 
r5   r   r*   r   r%   r&   c                J    |                      t          |                      d S rA   )register_checkerr   )r*   s    r3   registerr   ]  s%    
,V4455555r5   )r*   r   r%   r&   )
__future__r   systypingr   r   r   r   astroidr   pylint.checkersr	   r
   pylint.checkers.utilsr   r   pylint.interfacesr   pylint.lintr   version_infor   typing_extensionsr   r   r   r5   r3   <module>r      s:  
 # " " " " " 



 3 3 3 3 3 3 3 3 3 3 3 3       . . . . . . . . H H H H H H H H ' ' ' ' ' ' %$$$$$$w       ++++++A A A A A{ A A AH
6 6 6 6 6 6r5   