bg+dZddlmZddlmZddlmZddlmZddl m Z m Z ddl m Z erddlmZGd d e ZddZdS)z8Check for imports on private external modules and names.) annotations)Path) TYPE_CHECKING)nodes) BaseCheckerutils)HIGH)PyLinterceZdZdZddiZd'dZejdd(d Zejdd)d Z d*dZ e d+dZ d,dZ d-dZd.dZd/dZe d0d#Ze d1d%Zd&S)2PrivateImportCheckerimport-private-nameC2701)zImported 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 returnNonecLtj||i|_d|_dS)NF)r__init__all_used_type_annotationspopulated_annotations)selfrs q/builddir/build/BUILD/cloudlinux-venv-1.0.7/venv/lib/python3.11/site-packages/pylint/extensions/private_import.pyrzPrivateImportChecker.__init__!s-T6***;=&%*"""node nodes.ImportcJtj|rdSd|jD}||}|||}|rNt |dkrdnd}d|}|d|||ftdSdS)Ncg|] }|d Sr).0names r z5PrivateImportChecker.visit_import..,s000Ta000rmodulesmodule, r rargs confidence) rin_type_checking_blocknames_get_private_imports_get_type_annotation_nameslenjoin add_messager )rrr* private_namesimported_identifierprivate_name_strings r visit_importz!PrivateImportChecker.visit_import(s  ' - -  F00TZ00011%88 77mLL  /2=/A/AA/E/E))8 "&))M":":    %)+>?        rnodes.ImportFromcBtj|rdS|||jrdSd|jD}|||}|sdS||jg}|||}|r(|d|d|dftdS||}|rNt|dkrdnd}d |}|d|||ftdSdS) Ncg|] }|d Srr)rns rr!z9PrivateImportChecker.visit_importfrom..As***!1***rr r$rr&r"objectsobjectr%) rr) same_root_dirmodnamer*r,r+r/r r-r.)rrr*r0private_module_importsr1r2s rvisit_importfromz%PrivateImportChecker.visit_importfrom9sy  ' - -  F   dDL 1 1  F**tz***77eDD   F"&!:!:DL>!J!J!%!@!@ (" "  "    % 6q 9:     F11-@@  /2=/A/AA/E/E))8 "&))M":":    %)+>?        rr* list[str]c fd|DS)zDReturns the private names from input names by a simple string check.c>g|]}||Sr)_name_is_private)rr rs rr!z=PrivateImportChecker._get_private_imports..es,FFF$*?*?*E*EFFFFrr)rr*s` rr+z)PrivateImportChecker._get_private_importscsFFFFFFFFrr strboolct|o8|ddko,t|dkp|ddkp |dddkS)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__)rCr-)r s rrAz%PrivateImportChecker._name_is_privategsU JJ HQ3 HTaF47c>FT"##Y$5F rnodes.Import | nodes.ImportFromc|r;js4|jd_fd|DS)zmRemoves from names any names that are used as type annotations with no other illegal usages. TcRg|]#}|jvs|jvj|!|$Sr)r)rr7rs rr!zCPrivateImportChecker._get_type_annotation_names..|sQ   666T3336q94 433r)r_populate_type_annotationsrootr)rrr*s` rr,z/PrivateImportChecker._get_type_annotation_namesrsk  .3 .  + +DIIKK9W X X X)-D &        rnodes.LocalsDictNodeNGrdict[str, bool]c|jD]_}d}g}|j|D].}t|tjrt|jtjtjfr|j}t|tjr6||||jj |}n/t|tjr||t|tj r| ||t|tj r| ||0||||||<adS)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 AssignNameparent AnnAssignAssignappend%_populate_type_annotations_annotation annotation FunctionDef#_populate_type_annotations_functionLocalsDictNodeNGrL_assignments_call_private_name)rrrr private_namename_assignments usage_node assign_parents rrLz/PrivateImportChecker._populate_type_annotationss K X XDL " "k$/   j%*:;; ? %'FAA ?%/$5M!-AA?(// >>>'+'Q'Q&-8:S(( $M5<@@?(// >>>j%*;<<<<"$=j%*@AA33"$='778H,WW* ; X Xrnodes.FunctionDefc|jr1|jjr%|jjD]}||||jr||j|dSdS)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'rrXreturns)rrrrYs rr[z8PrivateImportChecker._populate_type_annotations_functions 9 . "i3   :: 9 <   6 6 7       r5nodes.Attribute | nodes.Subscript | nodes.Name | None str | Nonecxt|tjr|j|vrd||j<|jSt|tjr6||j|||j|St|tjr||j |SdS)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) rRrNamer SubscriptrXslicevalue Attributeexpr)rrrs rrXz:PrivateImportChecker._populate_type_annotations_annotations dEJ ' ' DI=V,V,V37 %di 09  dEO , ,   6 6 5   == 5  dEO , , == 4 tr assignments$list[nodes.AnnAssign | nodes.Assign]r^ctd|DrdS|D]<}d}t|jtjr |jj}nRt|jtjr|j}n+t|jtjr |jj}|st|tjtjfrht|tjr|j}t|tjs|j }t|tjtjfht|tjr|j|krdS>dS)z@Returns True if no assignments involve accessing `private_name`.c3&K|] }|j V dSN)rk)r assignments r zFPrivateImportChecker._assignments_call_private_name..s(BB :##BBBBBBrFNT) allrRrkrCallfuncrlrhr rm)rnr^rscurrent_attributes rr]z3PrivateImportChecker._assignments_call_private_names^ BBkBBB B B 5%  J $ **EJ77 :$.$4$9!!J,eo>> :$.$4!!J,ej99 :$.$4$9!$ .%*0MNN ?/<<?(9(>%!"3UZ@@?(9(>% .%*0MNN ? ,ej99 %*l::uutrimport_mod_namec|sdS|jrdS|dd}|t|jjjvS)zGDoes the node's file's path contain the base name of `import_mod_name`?T.r)levelsplitrrMfilerTparts)rrybase_import_packages rr:z"PrivateImportChecker.same_root_dirs]  4 : 4-33C88;"d499;;+;&<&<&C&IIIrNrr rr)rrrr)rr4rr)r*r>rr>)r rBrrC)rrIr*r>rr>)rrNrrOrr)rrbrrOrr)rrerrOrrf)rnror^rBrrC)rrIryrBrrC)__name__ __module__ __qualname__r msgsrronly_required_for_messagesr3r=r+ staticmethodrAr,rLr[rXr]r:rrrr r sn D  D++++&U%&;<<=< &U%&;<<'''=<'RGGGG   \     (%X%X%X%XN 8\< J J J\ J J Jrr rr rrcJ|t|dSrr)register_checkerr )rs rregisterrs% 08899999rNr)__doc__ __future__rpathlibrtypingrastroidrpylint.checkersrrpylint.interfacesr pylint.lint.pylinterr r rrrrrs ?>"""""" ........"""""".------oJoJoJoJoJ;oJoJoJd::::::r