§
    ÷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-tuplez°Only 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-exprz·Emitted 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-assignz’Emitted 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>zÆMax 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Ø× Ò Ø.°TÅið !ñ ô ð ð ð ð	ð 	ðð Ð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Ò6°tÑ<Ô<Ð<Ð<Ð<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   € å�d”i¥¤Ñ,Ô,ð 	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Ò6°tÑ<Ô<Ð<Ð<Ð<ð	=ð 	=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    �rºt          d„ |j        D ¦   «         ¦  «        �r›t          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    rÂt          d
„ |j        D ¦   «         ¦  «        r¦t          |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@°1°j�J�z¥5¤:Ñ.Ô.ð'
ð '
ð '
ð '
ð '
ð '
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ÐV¹6¸3À�4 ™9œ9 c§m¢m¡o¤oÐ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   è è € ð '
ð '
á��:õ �z¥E¤Jµ´Ð#<Ñ=Ô=ð'
ð '
ð '
ð '
ð '
ð '
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Ô/?Ñ@Ô@ð			õ
 Ô3°D´KÔ4FÈÑPÔPð		ð ˆFõ ˆtŒz‰?Œ?˜QÒÑ¥3ð '
ð '
ØDHÄJð'
ñ '
ô '
ñ $
ô $
Ñõ �d¥5¤<Ô0µ#Ð5Ô6ˆIõ ,/©5¬5ˆLØ!%¤ð 0ð 0‘��:Ý!¥%¤*¨jÑ9Ô9�
Ø(Ô.ð 
0ð 
0‘F�C˜Ý!% c¡¤¨C¯MªM©O¬OÐ <�IØ  LÐ0Ð0Ø Ý)¨#™œ�Hå" 8­U¬[Ñ9Ô9ðà$ŸOšOÑ-Ô-°Ò?Ð?à˜˜˜Ø ×$Ò$ YÑ/Ô/Ð/Ð/ð
0ð 79ˆJØ!%¤ð ð ‘��:Ý!¥%¤*¨jÑ9Ô9�
Ø×!Ò!ÝÐVÐVÀZÔEUÐVÑVÔVÑVÔVñô ð ð õ 14°J¸q´MÑ0BÔ0BÐØ",¨Q¨R¨R¤.ð Fð F�Ø!×5Ò5°nÑEÔEÐEÐEØ$ð Ø�à×ÒÐEÈDÐÑQÔQÐQØˆFõ ˆtŒz‰?Œ?˜QÒÐ¥3ð '
ð '
à!%¤ð'
ñ '
ô '
ñ $
ô $
Ðõ
 ˜dœj¨œm¨AÔ.Ô3Ñ4Ô4ˆKØ˜aÒÐØ�Ø!%¤¨A¨B¨B¤ð ð ‘��:Ý�z”Ñ'Ô'¨;Ò6Ð6Ø�F�Fð 7ð "&¤ð ð ‘��:ÝÐRÐRÀ*Ä/ÐRÑRÔRÑRÔRð Ø�F�Fðð ×ÒÐEÈDÐÑQÔQÐQØˆFð% ÐÐÐr5   c                ó  — d}t          |j        t          j        ¦  «        r|j        }nÏt          |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        ¦  «        rÚt                               ||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  € ð (,ˆ	Ý�d”i¥¤Ñ,Ô,ð 	Øœ	ˆIˆIå�t”y¥%¤-Ñ0Ô0ð	à”	” Ò%Ð%Ý˜4œ9Ô,­e¬jÑ9Ô9ð &ð œ	Ô)ˆIˆIå�t”y¥%¤-Ñ0Ô0ð	å˜4œ9œ>­5¬:Ñ6Ô6ð	õ �D”I”MÑ"Ô" aÒ'Ð'àœ	œˆIˆIàˆFð ×,Ò,Ñ.Ô.ˆÝ×:Ò:Ø˜)œ.ñ
ô 
ð 	õ
  ×HÒHØ�i”nñô ð ð �ð ”y×*Ò*Ñ,Ô,×4Ò4Ø”ØI�I”NÐIÐI¨Ô(:×(DÒ(DÑ(FÔ(FÐIÐIÐIØñô ˆHð
 +˜xÐ*Ð*Ð*ˆJà”Ð+Ý˜
‘O”O d¤oÑ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Ñ#RÐVWÒ#WÐ#WØ�5õ �|¥U¤\Ñ2Ô2ð	å�LÔ(Ñ)Ô)¨QÒ.Ð.Ý˜<Ô/°Ô2µEÔ4DÑ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 )z®Return 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  € õ �d”i¥¤Ñ/Ô/ñ 	Ø,0ˆLØ×,Ò,Ñ.Ô.ˆLÝ�4”;ÑÔ 1Ò$Ð$­°D´KÀ´NÅEÄHÑ)MÔ)MÐ$à#œ{¨1œ~��Ý˜L­%¬(Ñ3Ô3ð ,à+�ð Ð(å˜|Ô0µ%´-Ñ@Ô@ð )õ # <Ô#4Ô#9½5¼:ÑFÔFð )ð %Ô)Ô.Ô3°tÒ;Ð;Ý! ,Ô"3µU´ZÑ@Ô@ð <à$Ô)Ô.°$Ò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Ø�X�X�XØØ”[Øœ?Ý$ð ñ ô ð ð ð ð	ð 	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ðð

ð=)ð )€DðX *àØØ"ð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   