§ |<ˆj{Vã ó\—UdZddlmZddlZddlmZddlmZddlm Z ddl Z ddl m Z ddl m Z dd lmZmZdd lmZe rdd lmZd d dddddddddœ Zded<ejd¦«Zeddh¦«ZdZdZdZed¦«Zd7d$„Zd8d(„Z d9d*„Z!d:d.„Z"d;d0„Z#Gd1„d2e ¦«Z$dŠ>Ñ Ô Õ 1Õ3CÐDÐ DÐ DØ�4�4ð Eð Œ?ð؈uå�d—i’i‘k”kÔ(Ñ)Ô)€KØ”_Ô*ð ð ˆ Ý �i¥¤Ñ .Ô .ð 'Ø!œˆIݘ)¥g¤lµGÔ4EÐ%FÑGÔGð Ø Ý �i¥¤Ñ .Ô .ð &Ø”>ˆDˆDàÔ%ˆDØ Õ)Ð )Ð )Ø × $Ò $Õ%;Ñ <Ô <ð *å ;Ð.Ð.à�4�4øØ ˆ5óÚbool_opú nodes.BoolOpÚintcóœ—d}| ¦«D]4}t|tj¦«r|t |¦«z }Œ/|dz }Œ5|S)z’Counts the number of boolean expressions in BoolOp `bool_op` (recursive). example: a and (b or c or (d and e)) ==> 5 boolean expressions ré)Ú get_childrenr2r3ÚBoolOpÚ_count_boolean_expressions)rCÚ nb_bool_exprÚ bool_exprs r@rJrJÍs_€ð €LØ×)Ò)Ñ+Ô+ððˆ Ý �i¥¤Ñ 0Ô 0ð Ø Õ6°yÑAÔAÑ AˆLˆLà ˜AÑ ˆLˆLØ ÐrBúnodes.ClassDefcóè—td„| ¦«D¦«¦«}| ¦«D]1}t |j¦«r|jdkr|dz }Œ2|S)Nc3óNK—|] }|j d¦«°dV—Œ!dS©Ú_rGN©r8Ú startswith©Ú.0Úmethods r@ú z*_count_methods_in_class..Üs8èè€ÐXÐX˜F¸F¼Kר—’Ñ!Ô!ˆØ �<Š<‰>Œ>˜_Ð ,Ð ,Ø Ø ˜Ð Ð ðˆLˆLˆLØ �KŠK˜Ñ Ô Ð Ø × Ò ˜f×.Ò.°eÐ.Ñ<Ô<Ñ =Ô =Ð =ð ð >ð >ð >ð >ð >rBúset[nodes.ClassDef]có<—tt||¦«¦«S©N)r/rl)r%r`s r@Ú _get_parentsrp s€õ Õ   Ñ7Ô7Ñ 8Ô 8Ð8rBcó4‡—eZdZdZdZeZddddddœfd d ddd dœfd d ddddœfddddddœfddddddœfddddddœfddddddœfddddddœfd d!ddd"dœfd#d$ddd%dœfd&dddd'dœfd(gd)d*d+dœff ZdWˆfd0„ ZdXd1„Z dYd3„Z e d4d5d6d7¦«dZd:„¦«Z e d6d7¦«dZd;„¦«Z e dd?d@dA¦«d[dC„¦«ZeZe dd?d@¦«d[dD„¦«ZeZd\dG„Zd]dI„Zd^dK„Zd_dM„Ze dNd=¦«d`dP„¦«Zd`dQ„ZdadS„ZeZdbdcdV„ZˆxZS)dÚMisdesignCheckerz²Checker of potential misdesigns. Checks for sign of poor/misdesign: * number of methods, attributes, local variables... * size, complexity of functions, methods Údesignzmax-argsérEzz2Maximum number of arguments for function / method.)ÚdefaultÚtypeÚmetavarÚhelpz max-localséz4Maximum number of locals for function / method body.z max-returnsézz2Maximum number of parents for a class (see R0901).zignored-parents©Úcsvz%zOList of qualified class names to ignore when counting class parents (see R0901)zmax-attributesz5Maximum number of attributes for a class (see R0902).zmin-public-methodséz9Minimum number of public methods for a class (see R0903).zmax-public-methodséz9Maximum number of public methods for a class (see R0904).z max-bool-exprzEMaximum number of boolean expressions in an if statement (see R0916).zexclude-too-few-public-methodsÚ regexp_csvz[,...]zfList of regular expressions of class ancestor names to ignore when counting public methods (see R0903)Úlinterr r'ÚNonecóV•—t¦« |¦«|||dSro)ÚsuperrX)ÚselfrƒÚ __class__s €r@rXzMisdesignChecker.__init__‘s3ø€Ý ‰Œ×Ò˜Ñ Ô Ð Ø Ð Ø Ð@Ø ÐÐÐrBcó¼—|jj ¦«g|_t t ¦«|_g|_|jjj |_ dS)zInitialize visit variables.N) rƒÚstatsÚreset_node_countÚ_returnsrrEÚ _branchesÚ_stmtsÚconfigÚexclude_too_few_public_methodsÚ_exclude_too_few_public_methods)r‡s r@ÚopenzMisdesignChecker.open—sO€à Œ Ô×*Ò*Ñ,Ô,Ð,؈Œ Ý$¥SÑ)Ô)ˆŒØˆŒ à ŒKÔ Ô =ð Ô,Ð,Ð,rBÚamountcód—t|j¦«D]\}}|j|xx|z cc<ŒdSro)Ú enumeraterŽ)r‡r“ÚirQs r@Ú_inc_all_stmtszMisdesignChecker._inc_all_stmts¡sC€Ý˜dœkÑ*Ô*ð %ð %‰DˆAˆqØ ŒK˜ˆNˆNŒN˜fÑ $ˆNˆN‰NˆNð %ð %rBr rrrr%rMcóÖ—t|t |jjj¦«¦«}t |¦«}||jjjkr)| d|||jjjf¬¦«t |j ¦«|jjj kr=| d|t |j ¦«|jjj f¬¦«dSdS)zFCheck size of inheritance hierarchy and number of instance attributes.r ©r%ÚargsrN) rpÚSTDLIB_CLASSES_IGNORE_ANCESTORÚunionrƒr�r`ÚlenÚ max_parentsÚ add_messageÚinstance_attrsÚmax_attributes)r‡r%riÚ nb_parentss r@Úvisit_classdefzMisdesignChecker.visit_classdef¥só€õØ Ý *× 0Ò 0°´Ô1CÔ1SÑ TÔ Tñ ô ˆõ˜‘\”\ˆ Ø ˜œ Ô*Ô6Ò 6Ð 6Ø × Ò Ø$ØØ  $¤+Ô"4Ô"@ÐAð ñ ô ð õ ˆtÔ"Ñ #Ô # d¤kÔ&8Ô&GÒ GÐ GØ × Ò Ø.ØÝ˜$Ô-Ñ.Ô.°´ Ô0BÔ0QÐRð ñ ô ð ð ð ð HÐ GrBcóH‡—td„| ¦«D¦«¦«}||jjjkr)| d|||jjjf¬¦«|jdkrA|jr:| ¦«D]%Štˆfd„|jD¦«¦«rdSŒ&|jdkst|¦«rdSt|¦«}||jjj kr+| d|||jjj f¬¦«dSdS)zCheck number of public methods.c3óNK—|] }|j d¦«°dV—Œ!dSrPrRrTs r@rWz2MisdesignChecker.leave_classdef..ÃsKèè€ð ð Ø°F´K×4JÒ4JÈ3Ñ4OÔ4Oð Ø ð ð ð ð ð ð rBrr™Úclassc3óf•K—|]+}| ‰ ¦«¦«V—Œ,dSro)Úmatchr+)rUÚpatternr=s €r@rWz2MisdesignChecker.leave_classdef..ØsMøèè€ððàð—M’M (§.¢.Ñ"2Ô"2Ñ3Ô3ððððððrBNr) rYr[rƒr�Úmax_public_methodsrŸrvr‘r*ÚanyrAr_Úmin_public_methods)r‡r%Ú my_methodsr^r=s @r@Úleave_classdefzMisdesignChecker.leave_classdefÀs„ø€õð ð Ø ŸNšNÑ,Ô,ð ñ ô ñ ô ˆ 𠘜 Ô*Ô=Ò =Ð =Ø × Ò Ø)ØØ  $¤+Ô"4Ô"GÐHð ñ ô ð ð Œ9˜Ò Ð  DÔ$HÐ Ø ŸNšNÑ,Ô,ð ð �Ýððððà#'Ô#Gðñôñôðð�F�Fð ð Œ9˜Ò Ð Õ#AÀ$Ñ#GÔ#GÐ Ø ˆFõ .¨dÑ3Ô3ˆ Ø ˜œÔ+Ô>Ò >Ð >Ø × Ò Ø(ØØ! 4¤;Ô#5Ô#HÐIð ñ ô ð ð ð ð ?Ð >rBrrrrrzkeyword-arg-before-varargúnodes.FunctionDefcór‡—|j d¦«|jj}|jjjŠ|�}d}‰rt ˆfd„|D¦«¦«}t|¦«|z }||jjjkr6|  d|t|¦«|jjjf¬¦«nd}t|j ¦«|z }d|j vr|dz}||jjj kr)|  d|||jjj f¬¦«|j  d¦«dS) zeCheck function name, docstring, arguments, redefinition, variable names, max locals. rNc3óP•K—|] }‰ |j¦«¯dV—Œ!dS)rGN)r¨r8)rUÚargÚignored_argument_namess €r@rWz5MisdesignChecker.visit_functiondef..sMøèè€ð'ð'ØÐ)?×)EÒ)EÀcÄhÑ)OÔ)Oð'Øð'ð'ð'ð'ð'ð'rBrr™rQrGr) rŒÚappendršrƒr�r³rYr�Úmax_argsrŸr1Ú max_localsrŽ)r‡r%ršÚignored_args_numÚargnumÚlocnumr³s @r@Úvisit_functiondefz"MisdesignChecker.visit_functiondefîsuø€ð Œ ×Ò˜QÑÔÐàŒyŒ~ˆØ!%¤Ô!3Ô!JÐØ Ð Ø Ð Ø%ð Ý#&ð'ð'ð'ð'Ø!%ð'ñ'ô'ñ$ô$Ð õ˜‘Y”YÐ!1Ñ1ˆFؘœ Ô*Ô3Ò3Ð3Ø× Ò Ø(ØÝ˜d™)œ) T¤[Ô%7Ô%@ÐAð!ñôðøð !Ð å�T”[Ñ!Ô!Ð$4Ñ4ˆð �$”+Ð Ð Ø �a‰KˆFà �D”KÔ&Ô1Ò 1Ð 1Ø × Ò Ø!ØØ˜dœkÔ0Ô;Ð<ð ñ ô ð ð Œ ×Ò˜1ÑÔÐÐÐrBcóü—|j ¦«}||jjjkr)| d|||jjjf¬¦«|j|}||jjjkr)| d|||jjjf¬¦«|j ¦«}||jjj kr+| d|||jjj f¬¦«dSdS)zlMost of the work is done here on close: checks for max returns, branch, return in __init__. rr™rrN) rŒrfrƒr�Ú max_returnsrŸr�Ú max_branchesrŽÚmax_statements)r‡r%ÚreturnsÚbranchesÚstmtss r@Úleave_functiondefz"MisdesignChecker.leave_functiondef!s€ð”-×#Ò#Ñ%Ô%ˆØ �T”[Ô'Ô3Ò 3Ð 3Ø × Ò Ø,ØØ˜tœ{Ô1Ô=Ð>ð ñ ô ð ð ”> $Ô'ˆØ �d”kÔ(Ô5Ò 5Ð 5Ø × Ò Ø#ØØ ¤ Ô 2Ô ?Ð@ð ñ ô ð ð ” —’Ñ!Ô!ˆØ �4”;Ô%Ô4Ò 4Ð 4Ø × Ò Ø%ØØ˜Tœ[Ô/Ô>Ð?ð ñ ô ð ð ð ð 5Ð 4rBrQú nodes.ReturncóB—|jsdS|jdxxdz cc<dS)zCount number of returns.NéÿÿÿÿrG)rŒ)r‡rQs r@Ú visit_returnzMisdesignChecker.visit_returnEs5€àŒ}ð Ø ˆFØ Œ �bÐÐÔ˜QÑÐÐÑÐÐrBú nodes.NodeNGcóB—|jr| d¦«dSdS)zXDefault visit method -> increments the statements counter if necessary. rGN)Ú is_statementr—©r‡r%s r@Ú visit_defaultzMisdesignChecker.visit_defaultKs3€ð Ô ð #Ø × Ò  Ñ "Ô "Ð "Ð "Ð "ð #ð #rBúnodes.TryExceptcóœ—t|j¦«}|jr|dz }| ||¦«| |¦«dS©ú Increments the branches counter.rGN)r�ÚhandlersÚorelseÚ _inc_branchr—©r‡r%rÀs r@Úvisit_tryexceptz MisdesignChecker.visit_tryexceptRsT€å�t”}Ñ%Ô%ˆØ Œ;ð Ø ˜‰MˆHØ ×Ò˜˜xÑ(Ô(Ð(Ø ×Ò˜HÑ%Ô%Ð%Ð%Ð%rBúnodes.TryFinallycó\—| |d¦«| d¦«dS)rÏr€N)rÒr—rÊs r@Úvisit_tryfinallyz!MisdesignChecker.visit_tryfinallyZs2€à ×Ò˜˜qÑ!Ô!Ð!Ø ×Ò˜AÑÔÐÐÐrBrúnodes.Ifcó—| |¦«d}|jrBt|j¦«dks%t|jdtj¦«s|dz }| ||¦«| |¦«dS)z?Increments the branches counter and checks boolean expressions.rGrN)Ú_check_boolean_expressionsrÑr�r2r3ÚIfrÒr—rÓs r@Úvisit_ifzMisdesignChecker.visit_if_sŒ€ð ×'Ò'¨Ñ-Ô-Ð-Øˆà Œ;ð Ý �” Ñ Ô ˜qÒ Ð ­ °4´;¸q´>Å7Ä:Ñ(NÔ(NÐ à ˜‰MˆHØ ×Ò˜˜xÑ(Ô(Ð(Ø ×Ò˜HÑ%Ô%Ð%Ð%Ð%rBcóê—|j}t|tj¦«sdSt |¦«}||jjjkr+| d|||jjjf¬¦«dSdS)zvGo through "if" node `node` and count its boolean expressions if the 'if' node test is a BoolOp node. Nrr™) Útestr2r3rIrJrƒr�Ú max_bool_exprrŸ)r‡r%Ú conditionrKs r@rÚz+MisdesignChecker._check_boolean_expressionsls‰€ð”Iˆ ݘ)¥W¤^Ñ4Ô4ð Ø ˆFÝ1°)Ñ<Ô<ˆ Ø ˜$œ+Ô,Ô:Ò :Ð :Ø × Ò Ø.ØØ" D¤KÔ$6Ô$DÐEð ñ ô ð ð ð ð ;Ð :rBú nodes.WhilecóN—d}|jr|dz }| ||¦«dSrÎ)rÑrÒrÓs r@Ú visit_whilezMisdesignChecker.visit_while{s6€àˆØ Œ;ð Ø ˜‰MˆHØ ×Ò˜˜xÑ(Ô(Ð(Ð(Ð(rBrGÚ branchesnumcóT—|j| ¦«xx|z cc<dS)rÏN)r�Úscope)r‡r%räs r@rÒzMisdesignChecker._inc_branch„s.€à Œ�t—z’z‘|”|Ð$Ð$Ô$¨ Ñ3Ð$Ð$Ñ$Ð$Ð$rB©rƒr r'r„)r'r„)r“rEr'r„)r%rMr'r„)r%r¯r'r„)rQrÃr'r„)r%rÇr'r„)r%rÌr'r„)r%rÕr'r„)r%rØr'r„)r%rár'r„)rG)r%rÇrärEr'r„)Ú__name__Ú __module__Ú __qualname__Ú__doc__r8r!ÚmsgsÚoptionsrXr’r—r r£r®rºÚvisit_asyncfunctiondefrÂÚleave_asyncfunctiondefrÆrËrÔr×rÜrÚrãÚ visit_forrÒÚ __classcell__)rˆs@r@rrrrsÙø€€€€€ððð €Dà €Dð àØØ"ØLð  ð ð ð àØØ"ØNð  ð ð ð àØØ"ðð  ð ð ð àØØ"ØNð  ð ð ð àØØ"ØQð  ð ð ð àØØ"ØLð  ð ð ð àØØBØið  ð ð ð àØØ"ðð  ð ð ð !àØØ"ðð  ð ð ð !àØØ"ðð  ð ð ð àØØ"ð)ð  ð ð ð -àØ$Ø5ðEð  ð ð ðSs€Gðjðððððð  ð ð ð ð%ð%ð%ð%ð ÐØØ&Ø Ø!ñ ôð ððñ ôð ð* ÐÐ 8Ð:SÑTÔTð+ð+ð+ñUÔTð+ðZ ÐØ$ØØØØØ#ñ ôð'ð'ð'ñôð'ðR/ÐàÐØ$ØØØØñ ôðððñôðð6/Ðððððð #ð#ð#ð#ð&ð&ð&ð&ððððð  ÐÐ >Ð@SÑTÔTð &ð &ð &ñUÔTð &ð ð ð ð ð)ð)ð)ð)ð€Ið4ð4ð4ð4ð4ð4ð4ð4ð4rBrrrƒr r„cóJ—| t|¦«¦«dSro)Úregister_checkerrr)rƒs r@Úregisterrô‰s%€Ø ×ÒÕ,¨VÑ4Ô4Ñ5Ô5Ð5Ð5Ð5rB)r%r&r'r()rCrDr'rE)r%rMr'rE)r%rMr`rar'rb)r%rMr`rar'rmrç)&rëÚ __future__rÚreÚ collectionsrÚcollections.abcrÚtypingrr3rÚpylint.checkersrÚpylint.checkers.utilsr r Ú pylint.typingr Ú pylint.lintr r!Ú__annotations__Úcompiler\Ú frozensetr:r<r,r-r›rArJr_rlrprrrôr~rBr@úrs8ðð &Ð%Ð%à"Ð"Ð"Ð"Ð"Ð"à € € € Ø#Ð#Ð#Ð#Ð#Ð#Ø$Ð$Ð$Ð$Ð$Ð$Ø Ð Ð Ð Ð Ð à€€€ØÐÐÐÐÐà'Ð'Ð'Ð'Ð'Ð'ØEÐEÐEÐEÐEÐEÐEÐEØ0Ð0Ð0Ð0Ð0Ð0àð%Ø$Ð$Ð$Ð$Ð$Ð$ð ð ð ð ð ð ð ð ð ð ðk:ð:ðð<ð<ð<ñ<ðzˆbŒjÐ+Ñ,Ô,€ Ø"˜ K°Ð#9Ñ:Ô:ÐØ ÐØ'ÐØ%Ðð"+ ðLñN"ôN"Ððbðððð@ ð ð ð ððððð!>ð!>ð!>ð!>ðH9ð9ð9ð9ð w4ðw4ðw4ðw4ðw4�{ñw4ôw4ðw4ðt 6ð6ð6ð6ð6ð6rB