
    yIf+                        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 )z8Check for imports on private external modules and names.    )annotations)Path)TYPE_CHECKING)nodes)BaseCheckerutils)HIGH)PyLinterc                      e Zd ZdZddiZd'dZ ej        d          d(d            Z ej        d          d)d            Z	d*dZ
ed+d            Zd,dZd-dZd.dZd/dZed0d#            Zed1d%            Zd&S )2PrivateImportCheckerimport-private-nameC2701)zImported private %s (%s)r   zUsed when a private module or object prefixed with _ is imported. PEP8 guidance on Naming Conventions states that public attributes with leading underscores should be considered private.linterr
   returnNonec                L    t          j        | |           i | _        d| _        d S )NF)r   __init__all_used_type_annotationspopulated_annotations)selfr   s     T/var/www/piapp/venv/lib/python3.11/site-packages/pylint/extensions/private_import.pyr   zPrivateImportChecker.__init__!   s-    T6*** ;=&%*"""    nodenodes.Importc                J   t          j        |          rd S d |j        D             }|                     |          }|                     ||          }|rNt          |          dk    rdnd}d                    |          }|                     d|||ft                     d S d S )Nc                    g | ]
}|d          S r    ).0names     r   
<listcomp>z5PrivateImportChecker.visit_import.<locals>.<listcomp>,   s    000Ta000r      modulesmodule, r   r   args
confidence)	r   in_type_checking_blocknames_get_private_imports_get_type_annotation_nameslenjoinadd_messager	   )r   r   r*   private_namesimported_identifierprivate_name_strings         r   visit_importz!PrivateImportChecker.visit_import(   s    '-- 	F00TZ00011%8877mLL 	/2=/A/AA/E/E))8"&))M":":%)+>?	      	 	r   nodes.ImportFromc                B   t          j        |          rd S |                     ||j                  rd S d |j        D             }|                     ||          }|sd S |                     |j        g          }|                     ||          }|r(|                     d|d|d         ft                     d S |                     |          }|rNt          |          dk    rdnd}d	
                    |          }|                     d|||ft                     d S d S )
Nc                    g | ]
}|d          S r   r   )r   ns     r   r!   z9PrivateImportChecker.visit_importfrom.<locals>.<listcomp>A   s    ***!1***r   r   r$   r   r&   r"   objectsobjectr%   )r   r)   same_root_dirmodnamer*   r,   r+   r/   r	   r-   r.   )r   r   r*   r0   private_module_importsr1   r2   s          r   visit_importfromz%PrivateImportChecker.visit_importfrom9   sy   '-- 	FdDL11 	F**tz*** 77eDD 	F "&!:!:DL>!J!J!%!@!@("
 "
 " 	% 6q 9:	     F11-@@ 	/2=/A/AA/E/E))8"&))M":":%)+>?	      	 	r   r*   	list[str]c                       fd|D             S )zDReturns the private names from input names by a simple string check.c                >    g | ]}                     |          |S r   )_name_is_private)r   r    r   s     r   r!   z=PrivateImportChecker._get_private_imports.<locals>.<listcomp>e   s,    FFF$*?*?*E*EFFFFr   r   )r   r*   s   ` r   r+   z)PrivateImportChecker._get_private_importsc   s    FFFFFFFFr   r    strboolc                    t          |           o8| d         dk    o,t          |           dk    p| d         dk    p| dd         dk    S )zReturns true if the name exists, starts with `_`, and if len(name) > 4
        it is not a dunder, i.e. it does not begin and end with two underscores.
        r   _   r"   N__)rC   r-   )r    s    r   rA   z%PrivateImportChecker._name_is_privateg   sU     JJ HQ3HTaF47c>FT"##Y$5F	
r   nodes.Import | nodes.ImportFromc                     |r; j         s4                     |                                 j                   d _          fd|D             S )zmRemoves from names any names that are used as type annotations with no other
        illegal usages.
        Tc                R    g | ]#}|j         vs|j         v j         |         !|$S r   )r   )r   r7   r   s     r   r!   zCPrivateImportChecker._get_type_annotation_names.<locals>.<listcomp>|   sQ     
 
 
666T3336q9 4	  433r   )r   _populate_type_annotationsrootr   )r   r   r*   s   `  r   r,   z/PrivateImportChecker._get_type_annotation_namesr   sk      	.3 	.++DIIKK9WXXX)-D&
 
 
 

 
 
 	
r   nodes.LocalsDictNodeNGr   dict[str, bool]c                   |j         D ]_}d}g }|j         |         D ].}t          |t          j                  rt          |j        t          j        t          j        f          r|j        }t          |t          j                  r6|                    |           |                     |j        j	        |          }n/t          |t          j                  r|                    |           t          |t          j
                  r|                     ||           t          |t          j                  r|                     ||           0||                     ||          ||<   adS )zAdds to `all_used_type_annotations` all names ever used as a type annotation
        in the node's (nested) scopes and whether they are only used as annotation.
        N)locals
isinstancer   
AssignNameparent	AnnAssignAssignappend%_populate_type_annotations_annotation
annotationFunctionDef#_populate_type_annotations_functionLocalsDictNodeNGrL   _assignments_call_private_name)r   r   r   r    private_namename_assignments
usage_nodeassign_parents           r   rL   z/PrivateImportChecker._populate_type_annotations   s    K 	 	DL  ""k$/  
j%*:;; 
?
%'FA A 
? %/$5M!-AA ?(//>>>'+'Q'Q&-8:S( ( $M5<@@ ?(//>>>j%*;<< <<"$=   j%*@AA 33"$=   ' 778H,WW *,7;	 	r   nodes.FunctionDefc                    |j         r1|j         j        r%|j         j        D ]}|                     ||           |j        r|                     |j        |           dS dS )zAdds all names used as type annotation in the arguments and return type of
        the function node into the dict `all_used_type_annotations`.
        N)r'   r   rX   returns)r   r   r   rY   s       r   r[   z8PrivateImportChecker._populate_type_annotations_function   s     9 	. 	"i3  
:: 9    < 	667    	 	r   5nodes.Attribute | nodes.Subscript | nodes.Name | None
str | Nonec                x   t          |t          j                  r|j        |vrd||j        <   |j        S t          |t          j                  r6|                     |j        |           |                     |j        |          S t          |t          j                  r|                     |j	        |          S dS )zHandles the possibility of an annotation either being a Name, i.e. just type,
        or a Subscript e.g. `Optional[type]` or an Attribute, e.g. `pylint.lint.linter`.
        TN)
rR   r   Namer    	SubscriptrX   slicevalue	Attributeexpr)r   r   r   s      r   rX   z:PrivateImportChecker._populate_type_annotations_annotation   s     dEJ'' 	DI=V,V,V37%di09dEO,, 	66
5   ==
5   dEO,, 	 ==	4   tr   assignments$list[nodes.AnnAssign | nodes.Assign]r^   c                   t          d | D                       rdS | D ]<}d}t          |j        t          j                  r|j        j        }nRt          |j        t          j                  r|j        }n+t          |j        t          j                  r|j        j        }|st          |t          j        t          j        f          rht          |t          j                  r|j        }t          |t          j                  s|j	        }t          |t          j        t          j        f          ht          |t          j                  r|j        |k    r dS >dS )z@Returns True if no assignments involve accessing `private_name`.c              3  &   K   | ]}|j          V  d S N)rk   )r   
assignments     r   	<genexpr>zFPrivateImportChecker._assignments_call_private_name.<locals>.<genexpr>   s(      BB
:##BBBBBBr   FNT)
allrR   rk   r   Callfuncrl   rh   r    rm   )rn   r^   rs   current_attributes       r   r]   z3PrivateImportChecker._assignments_call_private_name   s^   
 BBkBBBBB 	 5% 	 	J $**EJ77 :$.$4$9!!J,eo>> :$.$4!!J,ej99 :$.$4$9!$ .%*0MNN ?/<< ?(9(>%!"3UZ@@ ?(9(>%	 .%*0MNN ? ,ej99%*l::uutr   import_mod_namec                    |sdS | j         rdS |                    d          d         }|t          |                                 j                  j        j        v S )zGDoes the node's file's path contain the base name of `import_mod_name`?T.r   )levelsplitr   rM   filerT   parts)r   ry   base_import_packages      r   r:   z"PrivateImportChecker.same_root_dir   s]    
  	4: 	4-33C88;"d499;;+;&<&<&C&IIIr   Nr   r
   r   r   )r   r   r   r   )r   r4   r   r   )r*   r>   r   r>   )r    rB   r   rC   )r   rI   r*   r>   r   r>   )r   rN   r   rO   r   r   )r   rb   r   rO   r   r   )r   re   r   rO   r   rf   )rn   ro   r^   rB   r   rC   )r   rI   ry   rB   r   rC   )__name__
__module____qualname__r    msgsr   r   only_required_for_messagesr3   r=   r+   staticmethodrA   r,   rL   r[   rX   r]   r:   r   r   r   r   r      sj        D 
D+ + + + &U%&;<<   =<  &U%&;<<' ' ' =<'RG G G G 
 
 
 \

 
 
 
(% % % %N       8    \< J J J \J J Jr   r   r   r
   r   r   c                J    |                      t          |                      d S rr   )register_checkerr   )r   s    r   registerr     s%    
08899999r   Nr   )__doc__
__future__r   pathlibr   typingr   astroidr   pylint.checkersr   r   pylint.interfacesr	   pylint.lint.pylinterr
   r   r   r   r   r   <module>r      s   
 ? > " " " " " "                         . . . . . . . . " " " " " " .------oJ oJ oJ oJ oJ; oJ oJ oJd: : : : : :r   