ó
    àÅŸgž)  ã                   óD  • S r SSKJr  SSKrSSKrSSKrSSKJr   SSKrSSKJ	r	  Sr " S S	\5      r " S
 S\5      r " S S\5      r " S S\5      r " S S\5      rSS jrSS jrS rSS jr\S:X  a  \" \R0                  SS 5        gg! \
 a    SSKJrJ	r	   Nxf = f)zŠMeager code path measurement tool.
Ned Batchelder
http://nedbatchelder.com/blog/200803/python_code_complexity_microtool.html
MIT License.
é    )Úwith_statementN)Údefaultdict)Úiter_child_nodes)Úastr   z0.7.0c                   ó0   • \ rS rSrSrS rS rS rS rSr	g)	Ú
ASTVisitoré   z'Performs a depth-first walk of the AST.c                 ó    • S U l         0 U l        g ©N)ÚnodeÚ_cache©Úselfs    ÚG/var/www/blue/EV-Temp_rev04/venv/lib/python3.13/site-packages/mccabe.pyÚ__init__ÚASTVisitor.__init__   s   € ØˆŒ	Øˆ�ó    c                 óN   • [        U5       H  nU R                  " U/UQ76   M     g r   )r   Údispatch)r   r   ÚargsÚchilds       r   ÚdefaultÚASTVisitor.default   s"   € Ü% dÖ+ˆEØ�MŠM˜%Ð' $Õ'ò ,r   c                 óð   • Xl         UR                  nU R                  R                  U5      nUc>  UR                  n[        U R                  SU-   U R                  5      nX@R                  U'   U" U/UQ76 $ )NÚvisit)r   Ú	__class__r   ÚgetÚ__name__ÚgetattrÚvisitorr   )r   r   r   ÚklassÚmethÚ	classNames         r   r   ÚASTVisitor.dispatch!   sg   € ØŒ	Ø—‘ˆØ�{‰{�‰˜uÓ%ˆØ‰<ØŸ™ˆIÜ˜4Ÿ<™<¨°9Ñ)<¸d¿l¹lÓKˆDØ!%�K‰K˜ÑÙ�DÐ ˜4Ò Ð r   c                 óX   • X l         U R                  Ul        U R                  " U/UQ76   g)z&Do preorder walk of tree using visitorN)r    r   r   )r   Útreer    r   s       r   ÚpreorderÚASTVisitor.preorder+   s#   € àŒØŸ™ˆŒØ�Š�dÐ"˜TÔ"r   )r   r   r    N)
r   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r   r   r'   Ú__static_attributes__© r   r   r   r      s   † Ù1òò(ò!õ#r   r   c                   ó*   • \ rS rSrSS jrS rS rSrg)ÚPathNodeé2   c                 ó   • Xl         X l        g r   )ÚnameÚlook)r   r3   r4   s      r   r   ÚPathNode.__init__3   s   € ØŒ	Ø�	r   c                 ój   • [        SU R                  U R                  U R                  5       4-  5        g )Nznode [shape=%s,label="%s"] %d;)Úprintr4   r3   Údot_idr   s    r   Úto_dotÚPathNode.to_dot7   s,   € ÜÐ.Ø�I‰I�t—y‘y $§+¡+£-ð21ñ 1õ 	2r   c                 ó   • [        U 5      $ r   )Úidr   s    r   r8   ÚPathNode.dot_id;   s   € Ü�$‹xˆr   )r4   r3   N)Úcircle)r   r)   r*   r+   r   r9   r8   r-   r.   r   r   r0   r0   2   s   † ôò2õr   r0   c                   ó0   • \ rS rSrSS jrS rS rS rSrg)	Ú	PathGraphé?   c                 ó\   • Xl         X l        X0l        X@l        [	        [
        5      U l        g r   )r3   ÚentityÚlinenoÚcolumnr   ÚlistÚnodes)r   r3   rC   rD   rE   s        r   r   ÚPathGraph.__init__@   s"   € ØŒ	ØŒØŒØŒÜ ¤Ó&ˆ�
r   c                 ó^   • U R                   U   R                  U5        / U R                   U'   g r   )rG   Úappend)r   Ún1Ún2s      r   ÚconnectÚPathGraph.connectG   s%   € Ø�
‰
�2‰×Ñ˜bÔ!àˆ�
‰
�2Šr   c                 ó,  • [        S5        U R                   H  nUR                  5         M     U R                  R                  5        H=  u  pU H2  n[        UR	                  5       < SUR	                  5       < S35        M4     M?     [        S5        g )Nz
subgraph {z -- Ú;Ú})r7   rG   r9   Úitemsr8   )r   r   ÚnextsÚnexts       r   r9   ÚPathGraph.to_dotL   sf   € ÜˆlÔØ—J”JˆDØ�K‰KŽMñ àŸ:™:×+Ñ+Ö-‰KˆDÛ�Ü T§[¡[¦]°D·K±K¶MÐBÖCó ñ .ô 	ˆc�
r   c                 ó¼   • [        U R                  R                  5        Vs/ sH  n[        U5      PM     sn5      n[        U R                  5      nX#-
  S-   $ s  snf )z2Return the McCabe complexity for the graph.
V-E+2
é   )ÚsumrG   ÚvaluesÚlen)r   ÚnÚ	num_edgesÚ	num_nodess       r   Ú
complexityÚPathGraph.complexityU   sP   € ô ¨¯©×):Ñ):Ô)<Ó=Ñ)< Aœ˜QžÑ)<Ñ=Ó>ˆ	Ü˜Ÿ
™
“Oˆ	ØÑ$ qÑ(Ð(ùò >s   ¢A)rE   rC   rD   r3   rG   N)r   )	r   r)   r*   r+   r   rM   r9   r^   r-   r.   r   r   r@   r@   ?   s   † ô'òò
õ)r   r@   c                   óœ   ^ • \ rS rSrSrU 4S jrS rS rS r\r	S r
S rS	 rU 4S
 jrS r\=r=rrS rSS jrS rS r\rS r\rSrU =r$ )ÚPathGraphingAstVisitoré^   zOA visitor for a parsed Abstract Syntax Tree which finds executable
statements.
c                 óf   >• [         [        U ]  5         SU l        0 U l        U R                  5         g )NÚ )Úsuperra   r   Ú	classnameÚgraphsÚreset)r   r   s    €r   r   ÚPathGraphingAstVisitor.__init__c   s(   ø€ ÜÔ$ dÑ4Ô6ØˆŒØˆŒØ�
‰
�r   c                 ó    • S U l         S U l        g r   )ÚgraphÚtailr   s    r   rh   ÚPathGraphingAstVisitor.reseti   s   € ØˆŒ
Øˆ�	r   c                 ó8   • U H  nU R                  U5        M     g r   )r   )r   Ú	node_listr   s      r   Údispatch_listÚ$PathGraphingAstVisitor.dispatch_listm   s   € ÛˆDØ�M‰M˜$Öò r   c                 óü  • U R                   (       a  U R                   < UR                  < 3nOUR                  nSUR                  UR                  U4-  nU R                  b„  U R                  U5      nX@l        U R                  UR                  5        [        SSS9nU R                  R                  U R                  U5        U R                  R                  XE5        XPl        g [        X2UR                  UR                  5      U l        [        U5      nX@l        U R                  UR                  5        U R                  U R                  U R                   < UR                  < 3'   U R                  5         g )Nz	%d:%d: %rrd   Úpoint©r4   )rf   r3   rD   Ú
col_offsetrk   ÚappendPathNoderl   rp   Úbodyr0   rM   r@   rg   rh   )r   r   rC   r3   ÚpathnodeÚbottoms         r   ÚvisitFunctionDefÚ'PathGraphingAstVisitor.visitFunctionDefq   s	  € à�>�>Ø#Ÿ~›~¨t¯y«yÐ9‰Fà—Y‘YˆFà˜dŸk™k¨4¯?©?¸FÐCÑCˆà�:‰:Ñ!à×*Ñ*¨4Ó0ˆHØ ŒIØ×Ñ˜tŸy™yÔ)Ü˜b wÑ/ˆFØ�J‰J×Ñ˜tŸy™y¨&Ô1Ø�J‰J×Ñ˜xÔ0Ø�Iä" 4°·±¸d¿o¹oÓNˆDŒJÜ “~ˆHØ ŒIØ×Ñ˜tŸy™yÔ)Ø@DÇ
Á
ˆD�K‰K $§.£.°$·)³)Ð<Ñ=Ø�J‰J�Lr   c                 ó¢   • U R                   nU =R                   UR                  S-   -  sl         U R                  UR                  5        X l         g )NÚ.)rf   r3   rp   rw   )r   r   Úold_classnames      r   ÚvisitClassDefÚ$PathGraphingAstVisitor.visitClassDef�   s8   € ØŸ™ˆØ�Š˜$Ÿ)™) c™/Ñ)�Ø×Ñ˜4Ÿ9™9Ô%Ø&�r   c                 ó˜   • U R                   (       d  g [        U5      nU R                  R                  U R                   U5        X l         U$ r   )rl   r0   rk   rM   )r   r3   rx   s      r   rv   Ú%PathGraphingAstVisitor.appendPathNode“   s7   € Ø�y�yØÜ˜D“>ˆØ�
‰
×Ñ˜4Ÿ9™9 hÔ/ØŒ	Øˆr   c                 óh   • UR                   c  SnOUR                   nSU-  nU R                  U5        g )Nr   zStmt %d)rD   rv   )r   r   rD   r3   s       r   ÚvisitSimpleStatementÚ+PathGraphingAstVisitor.visitSimpleStatement›   s2   € Ø�;‰;ÑØ‰Fà—[‘[ˆFØ˜6Ñ!ˆØ×Ñ˜DÕ!r   c                 ó’   >• [        U[        R                  5      (       a  U R                  U5        g [        [
        U ]  " U/UQ76   g r   )Ú
isinstancer   Ústmtr„   re   ra   r   )r   r   r   r   s      €r   r   ÚPathGraphingAstVisitor.default£   s7   ø€ Ü�dœCŸH™H×%Ñ%Ø×%Ñ% dÕ+äÔ(¨$Ò7¸ÐD¸tÔDr   c                 óD   • SUR                   -  nU R                  X5        g )NzLoop %d©rD   Ú	_subgraph©r   r   r3   s      r   Ú	visitLoopÚ PathGraphingAstVisitor.visitLoop©   s   € Ø˜4Ÿ;™;Ñ&ˆØ�‰�tÕ"r   c                 óD   • SUR                   -  nU R                  X5        g )NzIf %dr‹   r�   s      r   ÚvisitIfÚPathGraphingAstVisitor.visitIf¯   s   € Ø˜Ÿ™Ñ$ˆØ�‰�tÕ"r   c                 ó^  • U R                   c}  [        X"UR                  UR                  5      U l         [	        U5      nU R                  XU5        U R                   U R                  U R                  < U< 3'   U R                  5         gU R                  U5      nU R                  XU5        g)z?create the subgraphs representing any `if` and `for` statementsN)
rk   r@   rD   ru   r0   Ú_subgraph_parserg   rf   rh   rv   )r   r   r3   Úextra_blocksrx   s        r   rŒ   Ú PathGraphingAstVisitor._subgraph³   s�   € à�:‰:Ñä" 4¨t¯{©{¸D¿O¹OÓLˆDŒJÜ “~ˆHØ× Ñ  °Ô>Ø;?¿:¹:ˆD�K‰K $§.£.²$Ð7Ñ8Ø�J‰J�Là×*Ñ*¨4Ó0ˆHØ× Ñ  °Õ>r   c                 ó@  • / nX l         U R                  UR                  5        UR                  U R                   5        U H?  nX l         U R                  UR                  5        UR                  U R                   5        MA     UR                  (       a=  X l         U R                  UR                  5        UR                  U R                   5        OUR                  U5        U(       a5  [        SSS9nU H  nU R                  R                  Xv5        M      X`l         gg)z@parse the body and any `else` block of `if` and `for` statementsrd   rs   rt   N)rl   rp   rw   rJ   Úorelser0   rk   rM   )r   r   rx   r•   Ú
loose_endsÚextrary   Úles           r   r”   Ú&PathGraphingAstVisitor._subgraph_parseÀ   sØ   € àˆ
ØŒ	Ø×Ñ˜4Ÿ9™9Ô%Ø×Ñ˜$Ÿ)™)Ô$Û!ˆEØ ŒIØ×Ñ˜uŸz™zÔ*Ø×Ñ˜dŸi™iÖ(ñ "ð �;�;Ø ŒIØ×Ñ˜tŸ{™{Ô+Ø×Ñ˜dŸi™iÕ(à×Ñ˜hÔ'ÞÜ˜b wÑ/ˆFÛ �Ø—
‘
×"Ñ" 2Ö.ñ !à�Ið	 r   c                 óV   • SUR                   -  nU R                  XUR                  S9  g )NzTryExcept %d)r•   )rD   rŒ   Úhandlersr�   s      r   ÚvisitTryExceptÚ%PathGraphingAstVisitor.visitTryExceptÖ   s$   € Ø §¡Ñ+ˆØ�‰�t°·±ˆÒ>r   c                 óz   • SUR                   -  nU R                  U5        U R                  UR                  5        g )NzWith %d)rD   rv   rp   rw   r�   s      r   Ú	visitWithÚ PathGraphingAstVisitor.visitWithÜ   s0   € Ø˜4Ÿ;™;Ñ&ˆØ×Ñ˜DÔ!Ø×Ñ˜4Ÿ9™9Õ%r   )rf   rk   rg   rl   )r.   )r   r)   r*   r+   r,   r   rh   rp   rz   ÚvisitAsyncFunctionDefr   rv   r„   r   rŽ   ÚvisitAsyncForÚvisitForÚ
visitWhiler‘   rŒ   r”   rŸ   ÚvisitTryr¢   ÚvisitAsyncWithr-   Ú__classcell__)r   s   @r   ra   ra   ^   sv   ø† ñõòò òð4 -Ðò'òò"õEò#ð -6Ð5€MÐ5�H˜zò#ô?òò,?ð €Hò&ð
 †Nr   ra   c                   óX   • \ rS rSrSrSr\rSrSr	Sr
S r\S 5       r\S	 5       rS
 rSrg)ÚMcCabeCheckeréä   z%McCabe cyclomatic complexity checker.ÚmccabeÚC901zC901 %r is too complex (%d)éÿÿÿÿc                 ó   • Xl         g r   ©r&   )r   r&   Úfilenames      r   r   ÚMcCabeChecker.__init__ì   s   € Ø�	r   c                 ó
  • SnSS[         SSS.n[        USS 5      n[        U[        5      (       a@  UR	                  S5        UR
                  " U40 UD6  UR                  R                  S	5        g UR
                  " U40 UD6  g )
Nz--max-complexityr°   ÚstorezMcCabe complexity thresholdÚTrue)r   ÚactionÚtypeÚhelpÚparse_from_configÚconfig_optionsr»   zmax-complexity)Úintr   r‡   rF   ÚpopÚ
add_optionr¼   rJ   )ÚclsÚparserÚflagÚkwargsÚconfig_optss        r   Úadd_optionsÚMcCabeChecker.add_optionsï   sƒ   € à!ˆàØÜØ1Ø!'ñ
ˆô ˜fÐ&6¸Ó=ˆÜ�k¤4×(Ñ(à�J‰JÐ*Ô+Ø×Ò˜dÑ- fÒ-Ø×!Ñ!×(Ñ(Ð)9Õ:à×Ò˜dÑ- fÓ-r   c                 ó8   • [        UR                  5      U l        g r   )r½   Úmax_complexity)rÀ   Úoptionss     r   Úparse_optionsÚMcCabeChecker.parse_options  s   € ä  ×!7Ñ!7Ó8ˆÕr   c              #   ó˜  #   • U R                   S:  a  g [        5       nUR                  U R                  U5        UR                  R                  5        Hq  nUR                  5       U R                   :”  d  M#  U R                  UR                  UR                  5       4-  nUR                  UR                  U[        U 5      4v •  Ms     g 7f)Nr   )rÈ   ra   r'   r&   rg   rY   r^   Ú_error_tmplrC   rD   rE   r¹   )r   r    rk   Útexts       r   ÚrunÚMcCabeChecker.run  s�   é € Ø×Ñ Ó"ØÜ(Ó*ˆØ×Ñ˜Ÿ™ GÔ,Ø—^‘^×*Ñ*Ö,ˆEØ×ÑÓ! D×$7Ñ$7Õ7Ø×'Ñ'¨5¯<©<¸×9IÑ9IÓ9KÐ*LÑL�Ø—l‘l E§L¡L°$¼¸T»
ÐBÔBò -ùs   ‚A1C
Á7AC
r²   N)r   r)   r*   r+   r,   r3   Ú__version__ÚversionÚ_coderÍ   rÈ   r   ÚclassmethodrÅ   rÊ   rÏ   r-   r.   r   r   r¬   r¬   ä   sQ   † Ù/Ø€DØ€GØ€EØ/€KØ€Nòð ñ.ó ð.ð$ ñ9ó ð9õCr   r¬   c                 óÐ  •  [        XS[        R                  5      n/ nU[        l	        [        X25      R                  5        H  u  pgp‰UR                  SX&U4-  5        M     [        U5      S:X  a  g[        SR                  U5      5        [        U5      $ ! [         aC    [        R
                  " 5       S   n[        R                  R                  SU< SU< S35         gf = f)NÚexecé   zUnable to parse z: Ú
r   z%s:%d:1: %s)Úcompiler   ÚPyCF_ONLY_ASTÚSyntaxErrorÚsysÚexc_infoÚstderrÚwriter¬   rÈ   rÏ   rJ   rZ   r7   Újoin)
ÚcodeÚ	thresholdr³   r&   ÚeÚcomplxrD   ÚoffsetrÎ   Úchecks
             r   Úget_code_complexityrç     sÅ   € ðÜ�t v¬s×/@Ñ/@ÓAˆð €FØ#,„MÔ Ü'4°TÓ'D×'HÑ'HÖ'JÑ#ˆ˜Ø�‰�m x¸Ð&>Ñ>Ö?ñ (Kô ˆ6ƒ{�aÓØÜ	ˆ$�)‰)�FÓ
ÔÜˆv‹;Ðøô ó Ü�LŠL‹N˜1ÑˆÜ�
‰
×Ò³xÃÐCÔDÙðús   ‚B ÂA
C%Ã$C%c                 ó,   • [        U 5      n[        X!U S9$ )z"Returns the complexity of a module)r³   )Ú_readrç   )Úmodule_pathrâ   rá   s      r   Úget_module_complexityrë   $  s   € ä�Ó€DÜ˜t¸ÑEÐEr   c                 óŒ  • S[         R                  s=:  a  S:  a)  O  O&[        U S5       nUR                  5       sS S S 5        $ S[         R                  s=::  a  S:  aa  O  g   [        U S5       n[        R
                  " UR                  5      u  p#S S S 5        [        U SWS9 nUR                  5       sS S S 5        $ g ! , (       d  f       g = f! , (       d  f       NE= f! [        [        [        4 a9    [        U SS9 nUR                  5       sS S S 5        s $ ! , (       d  f        N’= ff = f! , (       d  f       g = f)	N)rW   é   )é   r   ÚrU)é   r   Úrbzlatin-1)ÚencodingÚr)
rÜ   Úversion_infoÚopenÚreadÚtokenizeÚdetect_encodingÚreadlineÚLookupErrorrÛ   ÚUnicodeError)r³   Úfrò   Ú_s       r   ré   ré   *  sî   € Ø”× Ñ Õ) 6Ö)Ü�(˜DÔ! QØ—6‘6“8÷ "Ñ!à	”3×#Ñ#Õ	, fÖ	,Ø#ð	 Ü�h Ô%¨Ü (× 8Ò 8¸¿¹Ó D‘�÷ &ô �(˜C¨(Ò3°qØ—6‘6“8÷ 4Ñ3ð 
-÷ "Õ!ú÷
 &Õ%ûäœ[¬,Ð7ó 	 ä�h¨Ò3°qØ—v‘v“x÷ 4×3×3Ò3úð	 ú÷ 4Õ3ús_   «CÁ%C$ Á1#CÂC$ Â'D5Ã
CÃ
C!ÃC$ Ã!C$ Ã$D2ÄDÄ
D2Ä
D.	Ä)D2Ä.D2Ä5
Ec           	      ó:  • U c  [         R                  SS  n [        R                  " 5       nUR	                  SSSSSS9  UR	                  SS	S
SSSS9  UR                  U 5      u  p#[        US   5      n[        XCS   S[        R                  5      n[        5       nUR                  XV5        UR                  (       ay  [        S5        UR                  R                  5        HD  nUR                   (       a   UR#                  5       UR                   :¼  d  M4  UR%                  5         MF     [        S5        g UR                  R                  5        HG  nUR#                  5       UR                   :¼  d  M#  [        UR&                  UR#                  5       5        MI     g )Nr×   z-dz--dotÚdotzoutput a graphviz dot fileÚ
store_true)Údestrº   r¸   z-mz--minrâ   zminimum complexity for outputr½   )r  rº   r¹   r   r   rÖ   zgraph {rQ   )rÜ   ÚargvÚoptparseÚOptionParserr¿   Ú
parse_argsré   rÙ   r   rÚ   ra   r'   rÿ   r7   rg   rY   râ   r^   r9   r3   )r  ÚoparrÉ   r   rá   r&   r    rk   s           r   Úmainr  ;  sJ  € Ø�|Ü�x‰x˜˜ˆ|ˆÜ× Ò Ó"€DØ‡O�O�D˜'¨Ø5¸lð ñ Là‡O�O�D˜'¨Ø8¸uØð ñ ð —O‘O DÓ)�M€Gä��a‘‹>€DÜ�4˜a™ &¬#×*;Ñ*;Ó<€DÜ$Ó&€GØ×Ñ�TÔ#à‡{‡{ÜˆiÔØ—^‘^×*Ñ*Ö,ˆEØ×%×%Ø×$Ñ$Ó&¨'×*;Ñ*;Õ;Ø—‘–ñ -ô 	ˆc�
à—^‘^×*Ñ*Ö,ˆEØ×ÑÓ! W×%6Ñ%6Õ6Ü�e—j‘j %×"2Ñ"2Ó"4Ö5ò -r   Ú__main__r×   )é   Ústdin)r	  r   )r,   Ú
__future__r   r  rÜ   r÷   Úcollectionsr   r   r   ÚImportErrorÚflake8.utilrÑ   Úobjectr   r0   r@   ra   r¬   rç   rë   ré   r  r   r  r.   r   r   Ú<module>r     s½   ðñõ
 &ã Û 
Û å #ð2ÛÝ$ð €ô#�ô #ô8
ˆvô 
ô)�ô )ô>C˜Zô CôL*C�Fô *CôZô&Fòô"6ð< ˆzÓÙˆ�‰�!�"ˆÕð øðS
 ó 2ß1Ñ1ð2ús   œ
B ÂBÂB