bg{V \UdZddlmZddlZddlmZddlmZddlm Z ddl Z ddl m Z ddl m Z dd lmZmZdd lmZe rdd lmZd d ddddddddd Zded<ejdZeddhZdZdZdZedZd7d$Zd8d(Z d9d*Z!d:d.Z"d;d0Z#Gd1d2e Z$d>   13CD D D44 E ?udiikk())K_*   i . . '!I)glG4E%FGG   i . . &>DD%D ) ) )  $ $%; < < *;..44 5bool_op nodes.BoolOpintcd}|D]4}t|tjr|t |z }/|dz }5|S)zCounts 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_childrenr2r3BoolOp_count_boolean_expressions)rC nb_bool_expr bool_exprs r@rJrJs_ L))++ i 0 0  6yAA ALL A LL rBnodes.ClassDefctd|D}|D]1}t|jr|jdkr|dz }2|S)Nc3NK|] }|jddV!dS_rGNr8 startswith.0methods r@ z*_count_methods_in_class..s8XXFFK!! <<>>_ , ,   LLL KK      f..e.<< = = =  > > > > >rBset[nodes.ClassDef]c<tt||SN)r/rl)r%r`s r@ _get_parentsrp s  77 8 88rBc4eZdZdZdZeZddddddfd d ddd dfd d ddddfddddddfddddddfddddddfddddddfddddddfd d!ddd"dfd#d$ddd%dfd&dddd'dfd(gd)d*d+dff ZdWfd0 ZdXd1Z dYd3Z e d4d5d6d7dZd:Z e d6d7dZd;Z e dd?d@dAd[dCZeZe dd?d@d[dDZeZd\dGZd]dIZd^dKZd_dMZe dNd=d`dPZd`dQZdadSZeZdbdcdVZxZS)dMisdesignCheckerzChecker of potential misdesigns. Checks for sign of poor/misdesign: * number of methods, attributes, local variables... * size, complexity of functions, methods designzmax-argsrEzz2Maximum number of arguments for function / method.)defaulttypemetavarhelpz max-localsz4Maximum number of locals for function / method body.z max-returnszz2Maximum number of parents for a class (see R0901).zignored-parentscsvz%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-methodsz9Minimum number of public methods for a class (see R0903).zmax-public-methodsz9Maximum 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'NonecVt||||dSro)superrX)selfr __class__s r@rXzMisdesignChecker.__init__s3       @ rBc|jjg|_t t |_g|_|jjj |_ dS)zInitialize visit variables.N) rstatsreset_node_count_returnsrrE _branches_stmtsconfigexclude_too_few_public_methods_exclude_too_few_public_methods)rs r@openzMisdesignChecker.opensO **,,, $S)) K  = ,,,rBamountcdt|jD]\}}|j|xx|z cc<dSro) enumerater)rrirQs r@_inc_all_stmtszMisdesignChecker._inc_all_stmtssCdk** % %DAq KNNNf $NNNN % %rBr rrrr%rMct|t|jjj}t |}||jjjkr)|d|||jjjft |j |jjj kr=|d|t |j |jjj fdSdS)zFCheck size of inheritance hierarchy and number of instance attributes.r r%argsrN) rpSTDLIB_CLASSES_IGNORE_ANCESTORunionrrr`len max_parents add_messageinstance_attrsmax_attributes)rr%ri nb_parentss r@visit_classdefzMisdesignChecker.visit_classdefs  * 0 01C1S T T  \\  *6 6 6   $ $+"4"@A     t" # #dk&8&G G G   .$-.. 0B0QR       H GrBcHtd|D}||jjjkr)|d|||jjjf|jdkrA|jr:|D]%tfd|jDrdS&|jdkst|rdSt|}||jjj kr+|d|||jjj fdSdS)zCheck number of public methods.c3NK|] }|jddV!dSrPrRrTs r@rWz2MisdesignChecker.leave_classdef..sK  FK4J4J34O4O       rBrrclassc3fK|]+}|V,dSro)matchr+)rUpatternr=s r@rWz2MisdesignChecker.leave_classdef..sMMM(.."2"233rBNr) rYr[rrmax_public_methodsrrvrr*anyrAr_min_public_methods)rr% my_methodsr^r=s @r@leave_classdefzMisdesignChecker.leave_classdefs   NN,,       *= = =   ) $+"4"GH     9  D$H  NN,,  #'#GFF  9  #A$#G#G  F .d33 +> > >   (!4;#5#HI       ? >rBrrrrrzkeyword-arg-before-varargnodes.FunctionDefcr|jd|jj}|jjj|}d}rt fd|D}t||z }||jjjkr6| d|t||jjjfnd}t|j |z }d|j vr|dz}||jjj kr)| d|||jjj f|j ddS) zeCheck function name, docstring, arguments, redefinition, variable names, max locals. rNc3PK|] }|jdV!dS)rGN)rr8)rUargignored_argument_namess r@rWz5MisdesignChecker.visit_functiondef..sM'')?)E)Ech)O)O'''''''rBrrrQrGr) rappendrrrrrYrmax_argsrr1 max_localsr)rr%rignored_args_numargnumlocnumrs @r@visit_functiondefz"MisdesignChecker.visit_functiondefsu Qy~!%!3!J   % #&''''!%'''$$ YY!11F *333  (d))T[%7%@A! ! T[!!$44 $+   aKF DK&1 1 1   !dk0;<     1rBc|j}||jjjkr)|d|||jjjf|j|}||jjjkr)|d|||jjjf|j}||jjj kr+|d|||jjj fdSdS)zlMost of the work is done here on close: checks for max returns, branch, return in __init__. rrrrN) rrfrr max_returnsrr max_branchesrmax_statements)rr%returnsbranchesstmtss r@leave_functiondefz"MisdesignChecker.leave_functiondef!s-##%% T['3 3 3   ,t{1=>     >$' dk(5 5 5   # 2 ?@      !! 4;%4 4 4   %T[/>?       5 4rBrQ nodes.ReturncB|jsdS|jdxxdz cc<dS)zCount number of returns.NrG)r)rrQs r@ visit_returnzMisdesignChecker.visit_returnEs5}  F bQrB nodes.NodeNGcB|jr|ddSdS)zXDefault visit method -> increments the statements counter if necessary. rGN) is_statementrrr%s r@ visit_defaultzMisdesignChecker.visit_defaultKs3   #    " " " " " # #rBnodes.TryExceptct|j}|jr|dz }|||||dS Increments the branches counter.rGN)rhandlersorelse _inc_branchrrr%rs r@visit_tryexceptz MisdesignChecker.visit_tryexceptRsTt}%% ;  MH x((( H%%%%%rBnodes.TryFinallyc\||d|ddS)rrN)rrrs r@visit_tryfinallyz!MisdesignChecker.visit_tryfinallyZs2 q!!! ArBrnodes.Ifc||d}|jrBt|jdks%t|jdtjs|dz }|||||dS)z?Increments the branches counter and checks boolean expressions.rGrN)_check_boolean_expressionsrrr2r3Ifrrrs r@visit_ifzMisdesignChecker.visit_if_s ''--- ;    q 4;q>7:(N(N MH x((( H%%%%%rBc|j}t|tjsdSt |}||jjjkr+|d|||jjjfdSdS)zvGo through "if" node `node` and count its boolean expressions if the 'if' node test is a BoolOp node. Nrr) testr2r3rIrJrr max_bool_exprr)rr% conditionrKs r@rz+MisdesignChecker._check_boolean_expressionslsI )W^44  F1)<< $+,: : :   ."DK$6$DE       ; :rB nodes.WhilecNd}|jr|dz }|||dSr)rrrs r@ visit_whilezMisdesignChecker.visit_while{s6 ;  MH x(((((rBrG branchesnumcT|j|xx|z cc<dS)rN)rscope)rr%rs r@rzMisdesignChecker._inc_branchs. tzz||$$$ 3$$$$$rBrr r'r)r'r)rrEr'r)r%rMr'r)r%rr'r)rQrr'r)r%rr'r)r%rr'r)r%rr'r)r%rr'r)r%rr'r)rG)r%rrrEr'r)__name__ __module__ __qualname____doc__r8r!msgsoptionsrXrrr rrrvisit_asyncfunctiondefrleave_asyncfunctiondefrrrrrrr visit_forr __classcell__)rs@r@rrrrs D D "L     "N     "     "N     "Q     "L     Bi     "     !"     !"     ")     -$5E    SsGj     %%%% & !    *  8:STT+++UT+Z $# ''''R/$ 6/ ####&&&&   >@STT & & &UT &    ))))I444444444rBrrrr rcJ|t|dSro)register_checkerrr)rs r@registerrs% ,V4455555rB)r%r&r'r()rCrDr'rE)r%rMr'rE)r%rMr`rar'rb)r%rMr`rar'rmr)&r __future__rre collectionsrcollections.abcrtypingrr3rpylint.checkersrpylint.checkers.utilsr r pylint.typingr pylint.lintr r!__annotations__compiler\ frozensetr:r<r,r-rrArJr_rlrprrrr~rBr@rs8 &%%"""""" ######$$$$$$ ''''''EEEEEEEE000000%$$$$$$          k::<<<<zbj+,, "K#9:: '%"+LN"N"b@    !>!>!>!>H9999 w4w4w4w4w4{w4w4w4t 666666rB