
    sgK                        d dl mZmZmZ d dlmZmZmZmZm	Z	 d dl
m
Z
 d dlZd dlZd dlZd dlmZ d dlmZ deiZ e e ee      d    ee            Z ee      sJ  e eee            Z eed      Z eed	      Zd
ZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ% ejL                  d      Z' ejL                  d      Z( ejL                  d      Z) ejL                  d      Z* ejL                  d      Z+ ejL                  d      Z, ejL                  d      Z- ejL                  d      Z.d  Z/d! Z0 e1       d"fd#Z2 e1       dfd$Z3 G d% d&ejh                        Z5 e5       Z6d' Z7d( Z8d) Z9d* Z:d+ Z;d, Z<d- Z=d. Z>d/ Z?y)0    )walkseppardir)splitjoinabspathexistsisfile)globN)raises_test_this_file_encodingr   binexamplesz/File contains trailing whitespace: %s, line %s.z.File contains an implicit import: %s, line %s.z2File contains tabs instead of spaces: %s, line %s.z:File contains carriage returns at end of line: %s, line %sz+File contains string exception: %s, line %sz,File contains generic exception: %s, line %sz:File contains old-style raise statement: %s, line %s, "%s"z-File does not end with a newline: %s, line %sz/File ends with more than 1 newline: %s, line %sz6Function should start with 'test_' or '_': %s, line %sz.This is a duplicate test function: %s, line %sz3File contains assignments to self/cls: %s, line %s.z&File contains '.func is': %s, line %s.z+File contains bare expression: %s, line %s.z(^\s*(>>> )?(\.\.\. )?from .* import .*\*z9^\s*(>>> )?(\.\.\. )?raise(\s+(\'|\")|\s*(\(\s*)+(\'|\"))z=^\s*(>>> )?(\.\.\. )?raise(\s+Exception|\s*(\(\s*)+Exception)z1^\s*(>>> )?(\.\.\. )?raise((\s*\(\s*)|\s+)\w+\s*,z$^def\s+(?!(_|test))[^(]*\(\s*\)\s*:$z^def\s+test_.*:$z.*[/\\]test_.*\.py$z\.\s*func\s+isc                     t        |       t        | j                               z
  }| ||dz    dvr| d| }n6| |dz   d }| d| |dt        |      t        |j                               z
   z   }|j                         |k(   S )z{Returns True if there are tabs in the leading whitespace of a line,
    including the whitespace of docstring code samples.   )z...z>>>N)lenlstrip
expandtabs)snchecksmores       X/var/www/html/venv/lib/python3.12/site-packages/sympy/testing/tests/test_code_quality.pytab_in_leadingr   7   s     	AQXXZ AQq1u:'"1!a%&	"1?s5zC,??@@  "e+,,    c                 x   t        j                  |       j                  D cg c]  }t        |t         j                        s|! }}g }|D ]d  }|j                  D ]Q  }t        |t         j
                        st        d |j                  D              r<|j                  dk(  rL|j                  j                  sc|j                  j                  d   j                  t        j                  |      D ]  }t        |t         j                        s|j                  D ]  }t        |t         j                        r!|j                  k(  r|j!                  |       >t        |t         j"                        sYt        fd|j$                  D              sx|j!                  |         T g |S c c}w )zReturns a list of "bad" assignments: if there are instances
    of assigning to the first argument of the class method (except
    for staticmethod's).
    c              3   n   K   | ]-  }t        |t        j                        r|j                  d k(   / yw)staticmethodN
isinstanceastNameid).0ds     r   	<genexpr>z(find_self_assignments.<locals>.<genexpr>O   s0      I
1chh0G 44>) Is   35__new__r   c              3   p   K   | ]-  }t        |t        j                        r|j                  k(   / y wNr    )r%   q	first_args     r   r'   z(find_self_assignments.<locals>.<genexpr>^   s/      ">%/388%< #$$$)"3 ">s   36)r"   parsebodyr!   ClassDefFunctionDefanydecorator_listnameargsargr   Assigntargetsr#   r$   appendTupleelts)r   r   tbadcmar,   s          @r   find_self_assignmentsr@   C   sZ   
 IIaL%%EqAs||)DEAE
C * 	*Aa1 I,,I Ivv"66;;A**IXXa[ *a,YY *%a2qtty7HJJqM(CII6! ">QVV "> >JJqM**	**. J5 	Fs   F7F7z*.pyc           	      r    | syt        |       D ]&  \  }}}t        t        t        ||            ||       ( y)z
    Checks all files in the directory tree (with base_path as starting point)
    with the file_check function provided, skipping files that contain
    any of the strings in the set provided by exclusions.
    N)r   check_filesr   r   )	base_path
file_check
exclusionspatternrootdirsfiless          r   check_directory_treerJ   e   s>     !)_ GdEDdG,-z:FGr   c                     | sy| D ]O  t              rt              st        fd|D              r/|t        j                  |      sH |       Q y)z
    Checks all files with the file_check function provided, skipping files
    that contain any of the strings in the set provided by exclusions.
    Nc              3   &   K   | ]  }|v  
 y wr*    )r%   exfnames     r   r'   zcheck_files.<locals>.<genexpr>{   s     0rrU{0s   )r	   r
   r1   rematch)rI   rD   rE   rF   rO   s       @r   rB   rB   q   sU    
  e}F5M0Z00?bhhw6ur   c                       e Zd ZdZd Zd Zy)_Visita  return the line number corresponding to the
    line on which a bare expression appears if it is a binary op
    or a comparison that is not in a with block.

    EXAMPLES
    ========

    >>> import ast
    >>> class _Visit(ast.NodeVisitor):
    ...     def visit_Expr(self, node):
    ...         if isinstance(node.value, (ast.BinOp, ast.Compare)):
    ...             print(node.lineno)
    ...     def visit_With(self, node):
    ...         pass  # no checking there
    ...
    >>> code='''x = 1    # line 1
    ... for i in range(3):
    ...     x == 2       # <-- 3
    ... if x == 2:
    ...     x == 3       # <-- 5
    ...     x + 1        # <-- 6
    ...     x = 1
    ...     if x == 1:
    ...         print(1)
    ... while x != 1:
    ...     x == 1       # <-- 11
    ... with raises(TypeError):
    ...     c == 1
    ...     raise TypeError
    ... assert x == 1
    ... '''
    >>> _Visit().visit(ast.parse(code))
    3
    5
    6
    11
    c                     t        |j                  t        j                  t        j                  f      rJ t
        d|j                  fz         y )N )r!   valuer"   BinOpComparemessage_bare_exprlinenoselfnodes     r   
visit_Exprz_Visit.visit_Expr   s;    djj399ckk":;>*b$++->>>4 <r   c                      y r*   rM   r[   s     r   
visit_Withz_Visit.visit_With   s    r   N)__name__
__module____qualname____doc__r^   r`   rM   r   r   rS   rS      s    $J?r   rS   c                 n   t        j                  |       }	 t        j                  |       y# t        $ r~}|j
                  sJ |j
                  d   }|j                  t        j                  dd      d         sJ t        |j                  dd      d   j                  d            cY d}~S d}~ww xY w)z]return None or else 0-based line number of code on which
    a bare expression appeared.
    r   :    .N)r"   r-   BareExprvisitAssertionErrorr4   
startswithrY   r   intrsplitrstrip)codetreemsgs      r   line_with_bare_exprrt      s     99T?D6t 6xxxhhqk~~/55c1=a@AAA3::c1%a(//455	6s   - 	B4A3B/)B4/B4c                  l   fd} fddD cg c]  }t        t        |       }}dt        z  dt        z  dt        z  dt        z  dt        z  h}d	t        z  d
t        z  dt        z  dt        z  dt        z  dt        z  dt        z  dt        z  dt        z  dt        z  dt        z  dt        z  dt        z  dt        z  dt        z  dt        z  dt        z  dt        z  dt        z  ht        ||        t	        t
        | h dd       t	        t        | |       t	        t        | |       yc c}w )a  
    This test tests all files in SymPy and checks that:
      o no lines contains a trailing whitespace
      o no lines end with 

      o no line uses tabs instead of spaces
      o that the file ends with a single newline
      o there are no general or string exceptions
      o there are no old style raise statements
      o name of arg-less test suite functions start with _ or test_
      o no duplicate function names that start with test_
      o no assignments to self variable in class methods
      o no lines contain ".func is" except in the test suite
      o there is no do-nothing expression like `a == b` or `x + 1`
    c                     t        | d      5 } | |       d d d        t        | d      5 }t        | |       d d d        y # 1 sw Y   ,xY w# 1 sw Y   y xY w)Nutf8)encoding)openr   )rO   	test_filetest_this_files     r   testztest_files.<locals>.test   s^    %&) 	-Y5),	-%&) 	7Y$UI6	7 	7	- 	-	7 	7s   
AAAAc                     d }|j                         }|j                  d       t         vr n j                  t        d      d   }|j	                  d      rt        |      }|J t         |dz   fz         d }d}t               }t        |      D ]  \  }}t        j                         rt        j                  |      rJ t         |dz   fz         t        j                  |      rZ|dz  }|j                  |dd  j                  d      d   j!                                t#        |      |k7  rJ t$         |dz   fz         |j'                  d      rJ t(         |dz   fz         |j'                  d      rJ t*         |dz   fz         t-        |      rJ t.         |dz   fz         t0        j3                  |      rJ t4         |dz   fz         t6        j3                  |      rJ t8         |dz   fz         t:        j3                  |      r+t=        t?         fd		            sJ t@         |dz   fz         tB        j3                  |      r(t        j3                         sJ tD         |dz   fz         tF        j3                  |      }|J tH         |dz   |jK                  d
      fz          |B|dk(  r|dkD  rJ tL         |dz   fz         |j'                  d      sJ tN         |dz   fz         y y )Nr   rg   test_r   ()z 
z	
z
c                     | v S r*   rM   )rN   rO   s    r   <lambda>z4test_files.<locals>.test_this_file.<locals>.<lambda>   s    rU{ r      
)(readseekr   ro   rm   rt   rY   set	enumeratetest_file_rerQ   test_suite_def_remessage_test_suite_deftest_ok_def_readdr   stripr   message_duplicate_testendswithmessage_spacemessage_carriager   message_tabsstr_raise_researchmessage_str_raisegen_raise_remessage_gen_raiseimplicit_test_relistfiltermessage_implicit
func_is_remessage_func_isold_raise_remessage_old_raisegroupmessage_multi_eofmessage_eof)
rO   rz   idxrq   pylineteststest_setresultimport_excludes
   `        r   r{   z"test_files.<locals>.test_this_file   s   ~~q&UELLa,@,D==!%d+C?>+ucAg.>>>55"9- 	5IC!!%($**40K"8E37;K"KK5!''-QJELLab!4Q!7!=!=!?@8}-O&<sQw?O&OOu}}_->mucAg.>>>u}}V$A.%q1AAAud#=leS1W-===u""4(B/5#'2BBBu""4(B/5#'2BBBu ''-V$:NKLA.%q1AAAu  &|/B/B5/I@oa0@@@u!((.F!5/37FLLO35 5 5u9	5> t|aB/5#'2BBBu]]4(<kUC!G,<<<u ) r   )z	isympy.pyzbuild.pyzsetup.pyzL%(sep)ssympy%(sep)sparsing%(sep)sautolev%(sep)s_antlr%(sep)sautolevparser.pyzK%(sep)ssympy%(sep)sparsing%(sep)sautolev%(sep)s_antlr%(sep)sautolevlexer.pyzN%(sep)ssympy%(sep)sparsing%(sep)sautolev%(sep)s_antlr%(sep)sautolevlistener.pyzH%(sep)ssympy%(sep)sparsing%(sep)slatex%(sep)s_antlr%(sep)slatexparser.pyzG%(sep)ssympy%(sep)sparsing%(sep)slatex%(sep)s_antlr%(sep)slatexlexer.pyz%(sep)ssympy%(sep)s__init__.pyz%(sep)svector%(sep)s__init__.pyz"%(sep)smechanics%(sep)s__init__.pyz %(sep)squantum%(sep)s__init__.pyz%(sep)spolys%(sep)s__init__.pyz,%(sep)spolys%(sep)sdomains%(sep)s__init__.pyz#%(sep)sinteractive%(sep)ssession.pyz%(sep)sisympy.pyz%(sep)sbin%(sep)ssympy_time.pyz$%(sep)sbin%(sep)ssympy_time_cache.pyz&%(sep)sparsing%(sep)ssympy_tokenize.pyz'%(sep)splotting%(sep)spygletplot%(sep)sz)%(sep)sbin%(sep)stest_external_imports.pyz*%(sep)sbin%(sep)stest_submodule_imports.pyz"%(sep)sutilities%(sep)sruntests.pyz %(sep)sutilities%(sep)spytest.pyz"%(sep)sutilities%(sep)srandtest.pyz"%(sep)sutilities%(sep)stmpfiles.pyz)%(sep)sutilities%(sep)squality_unicode.py>   .sh.mjs.pyc~*N)r   TOP_PATHsepdrB   rJ   BIN_PATH
SYMPY_PATHEXAMPLES_PATH)r|   filetop_level_filesexcluder   r{   s       @@r   
test_filesr      sC    71=j9 tHd+ O  	WY]]UX\\X[__RUYYQTXXG 	)4/ 	*D0,t3*T1(4/6=-4T!(4/.50471D83d:4t;,t3*T1,t3,t33d:;N> &4)EsKT73g6as   D1c                 :    t        j                  dd      dz  | z   S )Nr   
   rh   )randomrandint)r=   s    r   _with_spacer   =  s    >>!R $q((r   c                     g d} g d}g d}g d}| D ]q  }t         j                  t        |            J |       t        j                  t        |            J |       t        j                  t        |            lJ |        |D ]'  }t         j                  t        |            "J |        |D ]'  }t        j                  t        |            "J |        |D ]'  }t        j                  t        |            "J |        y )N)z#some text # raise Exception, 'text'z2raise ValueError('text') # raise Exception, 'text'raise ValueError('text')zraise ValueErrorr   zraise ValueError('text') #,zB'"""This function will raise ValueError, except when it doesn't"""zraise (ValueError('text'))zraise 'exception'zraise 'Exception'zraise "exception"zraise "Exception"zraise 'ValueError')z1raise Exception('text') # raise Exception, 'text'raise Exception('text')zraise Exceptionr   zraise Exception('text') #,raise Exception, 'text'1raise Exception, 'text' # raise Exception('text')1raise Exception, 'text' # raise Exception, 'text'>>> raise Exception, 'text'5>>> raise Exception, 'text' # raise Exception('text')5>>> raise Exception, 'text' # raise Exception, 'text')r   r   r   r   r   r   zraise ValueError, 'text'z2raise ValueError, 'text' # raise Exception('text')z2raise ValueError, 'text' # raise Exception, 'text'z>>> raise ValueError, 'text'z6>>> raise ValueError, 'text' # raise Exception('text')z6>>> raise ValueError, 'text' # raise Exception, 'text'zraise(ValueError,zraise (ValueError,zraise( ValueError,zraise ( ValueError,zraise(ValueError ,zraise (ValueError ,zraise( ValueError ,zraise ( ValueError ,)r   r   r   r   r   )candidates_okstr_candidates_failgen_candidates_failold_candidates_failr=   s        r   'test_raise_statement_regular_expressionr   B  s'   
M.  >"";q>2:=A=:"";q>2:=A=:"";q>2:=A=:> ! B"";q>2>AA>B  B"";q>2>AA>B  B"";q>2>AA>Br   c                      g d} g d}| D ]'  }t         j                  t        |            "J |        |D ]'  }t         j                  t        |            "J |        y )N)zfrom sympy import somethingz>>> from sympy import somethingz%from sympy.somewhere import somethingz)>>> from sympy.somewhere import somethingzimport sympyz>>> import sympyz import sympy.something.somethingz... import sympyz$... import sympy.something.somethingz... from sympy import somethingz)... from sympy.somewhere import somethingz>> from sympy import *z# from sympy import *zsome text # from sympy import *)zfrom sympy import *z>>> from sympy import *zfrom sympy.somewhere import *z!>>> from sympy.somewhere import *z... from sympy import *z!... from sympy.somewhere import *)r   r   r   r   candidates_failr=   s      r   (test_implicit_imports_regular_expressionr     st    M O  B&&{1~6>AA>B F&&{1~6BEAEBFr   c                      g d} g d}| D ]  }t         j                  |      J |        |D ]  }t         j                  |      J |        y )N)z    def foo():
zdef foo(arg):
zdef _foo():
zdef test_foo():
)zdef foo():
zdef foo() :
zdef foo( ):
zdef  foo():
)r   r   r   s      r   test_test_suite_defsr     sh    MO  6 ''*25A526 : ''*6996:r   c                  n    g d} ddg}d}d }| D ]  } ||      |k(  rJ  |D ]  } ||      |k7  rJ  y )N)zdef foo():
def foo():
zdef test():
def test_():
zdef test_():
def test__():
zdef test_():
def test_ ():
zdef test_1():
def  test_1():
Nr   c                 <   d}t               }t        | j                               D ]t  \  }}t        j	                  |      s|dz  }|j                  |dd  j                  d      d   j                                t        |      |k7  sddt        d|dz   fz  fc S  y)Nr   rg   r   r   Fr   r   )
r   r   
splitlinesr   rQ   r   r   r   r   r   )r   r   r   r   r   s        r   r   z'test_test_duplicate_defs.<locals>.check  s    5"4??#45 	NIC##D)
T!"X^^C0399;<x=E) "8GS1W;M"MMM	N r   rM   )r   r   okr   r=   s        r   test_test_duplicate_defsr     sd    M 	()O 
B	  Qx2~~ Qx2~~r   c                  p    g d} g d}| D ]  }t        |      g k(  rJ  |D ]  }t        |      g k7  rJ  y )N)z4class A(object):
    def foo(self, arg): arg = self
z9class A(object):
    def foo(self, arg): self.prop = arg
z?class A(object):
    def foo(self, arg): obj, obj2 = arg, self
zCclass A(object):
    @classmethod
    def bar(cls, arg): arg = cls
z2class A(object):
    def foo(var, arg): arg = var
)z4class A(object):
    def foo(self, arg): self = arg
z>class A(object):
    def foo(self, arg): obj, self = arg, arg
zCclass A(object):
    def foo(self, arg):
        if arg: self = argzCclass A(object):
    @classmethod
    def foo(cls, arg): cls = arg
z2class A(object):
    def foo(var, arg): var = arg
)r@   r   s      r   test_find_self_assignmentsr     sV    MO  .$Q'2---. .$Q'2---.r   c                       dgdgd dgt        t         fd       d dgt                d dgt        t         fd       d dgt                y )Nfoobarabcu   αc                       t               S r*   r   rO   rz   unicode_strict_whitelistunicode_whitelists   r   r   z,test_test_unicode_encoding.<locals>.<lambda>      #;y+-E$G r   c                       t               S r*   r   r   s   r   r   z,test_test_unicode_encoding.<locals>.<lambda>  r   r   )r   rl   r   r   s   @@@@r   test_test_unicode_encodingr     s     %wEI
> G H EIy+-EG EI
> G H EIy+-EGr   )@osr   r   r   os.pathr   r   r   r	   r
   r   rP   r   r"   sympy.testing.pytestr   sympy.testing.quality_unicoder   r   __file__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   message_self_assignmentsr   rY   compiler   r   r   r   r   r   r   r   r   r@   r   rJ   rB   NodeVisitorrS   rj   rt   r   r   r   r   r   r   r   r   rM   r   r   <module>r      s       8 8  	  
 ' B 	s| T%/!,ff=>
j 4
F+,% Xz* BC CO A B R =E Q I P :A 2::IJ rzz@BrzzDFrzzNOBJJFG /0rzz01RZZ)*
	-D <?5& 	G /2eT  *S__ *Z 86{7|)
@BFF>:&6.,Gr   