o
    8VaH                     @   s  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sLJ 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$e%dZ&e%dZ'e%dZ(e%dZ)e%dZ*e%dZ+e%dZ,e%dZ-dd  Z.d!d" Z/e0 d#fd$d%Z1e0 dfd&d'Z2d(d) Z3d*d+ Z4d,d- Z5d.d/ Z6d0d1 Z7d2d3 Z8d4d5 Z9d6d7 Z:dS )8    )walkseppardir)splitjoinabspathexistsisfile)globN)raises_test_this_file_encodingr   binZ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(^\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                 C   s|   t | t |   }| ||d  dvr| d| }n| |d d }| d| |dt |t |    }| |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checkZsmore r   G/usr/lib/python3/dist-packages/sympy/testing/tests/test_code_quality.pytab_in_leading6   s   (r   c                    s   dd t | jD }g }|D ]h}|jD ]b}t|t jsqtdd |jD r(q|jdkr.q|jjs3q|jjd j	 t 
|D ]6}t|t jru|jD ]*}t|t jr]|j kr]|| qJt|t jrtt fdd|jD rt|| qJq?qq|S )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                 S   s   g | ]
}t |tjr|qS r   )
isinstanceastZClassDef).0r   r   r   r   
<listcomp>G   s    z)find_self_assignments.<locals>.<listcomp>c                 s   s&    | ]}t |tjr|jd kV  qdS )staticmethodNr   r   Nameid)r   dr   r   r   	<genexpr>N   s    z(find_self_assignments.<locals>.<genexpr>__new__r   c                 3   s&    | ]}t |tjr|j kV  qd S Nr   )r   qZ	first_argr   r   r"   ]   s    
)r   parsebodyr   ZFunctionDefanydecorator_listnameargsargr   ZAssigntargetsr   r    appendZTupleelts)r   tZbadcr   mar   r&   r   find_self_assignmentsB   s8   



r5   z*.pyc                 C   s6   | sdS t | D ]\}}}ttt|||| qdS )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filesr   r   r   check_directory_treed   s
   r>   c                    s\   | sdS | D ]% t  rt sqt fdd|D rq|du s't| r+|  qdS )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   s    | ]}| v V  qd S r$   r   )r   exfnamer   r   r"   z   s    zcheck_files.<locals>.<genexpr>)r   r	   r)   rematch)r=   r8   r9   r:   r   r@   r   r6   p   s   r6   c                     s   fdd}  fdddd dD }dt  d	t  d
t  dt  dt  h}dt  dt  dt  dt  dt  dt  dt  dt  dt  dt  dt  dt  dt  dt  dt  dt  dt  dt  dt  d t  h t||  tt| h d!d" tt| | tt| | d#S )$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
    c                    sr   t | dd} | | W d    n1 sw   Y  t | dd}t| | W d    d S 1 s2w   Y  d S )Nutf8)encoding)openr   )rA   	test_file)test_this_filer   r   test   s   "ztest_files.<locals>.testc                    s  d }d}t  }t|D ]\}}t rLt|r#J t |d f t|rL|d7 }||dd  dd 	  t
||krLJ t |d f |dsV|dr`J t |d f |droJ t |d f t|r}J t |d f t|rJ t |d f t|rJ t |d f t|rtt fd	d
sJ t |d f t|rt sJ t |d f t|}|d urJ t |d |df q|d ur|dkr|dkrJ t |d f |ds
J t  |d f d S d S )Nr   F   r   (z 
z	
z
c                    s   |  v S r$   r   )r?   r@   r   r   <lambda>   s    z4test_files.<locals>.test_this_file.<locals>.<lambda>   
)!set	enumeratetest_file_rerC   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)rA   rG   lineteststest_setidxresult)import_excluder@   r   rH      sR   


 





z"test_files.<locals>.test_this_filec                 S   s   g | ]}t t|qS r   )r   TOP_PATH)r   filer   r   r   r      s    ztest_files.<locals>.<listcomp>)z	isympy.pyzbuild.pyzsetup.pyzsetupegg.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.pyz&%(sep)sutilities%(sep)sbenchmarking.py>   .sh.pyc~*N)sepdr6   r>   BIN_PATH
SYMPY_PATHEXAMPLES_PATH)rI   Ztop_level_filesZexcluder   )rq   rH   r   
test_files   sD   ,

 r|   c                 C   s   t ddd |  S )Nr   
    )randomZrandint)r2   r   r   r   _with_space   s   r   c                  C   s   g d} g d}g d}g d}| D ])}t t|d u s!J |tt|d u s.J |tt|d u s;J |q|D ]}t t|d usMJ |q>|D ]}tt|d us_J |qP|D ]}tt|d usqJ |qbd S )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_   rg   )candidates_okZstr_candidates_failZgen_candidates_failZold_candidates_failr2   r   r   r   'test_raise_statement_regular_expression   s   r   c                  C   s\   g d} g d}| D ]}t t|d u sJ |q
|D ]}t t|d us+J |qd S )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 *)ra   r]   r   r   candidates_failr2   r   r   r   (test_implicit_imports_regular_expression>  s   r   c                  C   sT   g d} g d}| D ]}t |d u sJ |q
|D ]}t |d us'J |qd S )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():
)rR   r]   r   r   r   r   test_test_suite_defs]  s   r   c                  C   sT   g d} ddg}d}dd }| D ]
}|||ksJ q|D ]
}|||ks'J qd S )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                 S   sz   d}t  }t|  D ]/\}}t|r:|d7 }||dd  dd   t||kr:dt	d|d f f  S qdS )Nr   rJ   r   rK   Fr   r   )
rO   rP   
splitlinesrT   rC   rU   r   rV   r   rW   )rs   rm   rn   ro   rl   r   r   r   r   {  s   
 z'test_test_duplicate_defs.<locals>.checkr   )r   r   okr   r2   r   r   r   test_test_duplicate_defsp  s   
r   c                  C   sH   g d} g d}| D ]
}t |g ksJ q
|D ]
}t |g ks!J qd S )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
)r5   r   r   r   r   test_find_self_assignments  s   r   c                      s  dgdgd dgt t fdd d ddgt t fdd d ddgt t fd	d d dgt  d dgt t fd
d d ddgt  d ddgt t fdd d dgt t fdd d dgt t fdd d ddgt  d ddgt  d dgt  d S )NZfooZbarabcu   αc                         t  S r$   r   r   rA   rG   Zunicode_strict_whitelistZunicode_whitelistr   r   rL         z,test_test_unicode_encoding.<locals>.<lambda>z# coding=utf-8c                      r   r$   r   r   r   r   r   rL     r   c                      r   r$   r   r   r   r   r   rL     r   c                      r   r$   r   r   r   r   r   rL     r   c                      r   r$   r   r   r   r   r   rL     r   c                      r   r$   r   r   r   r   r   rL     r   c                      r   r$   r   r   r   r   r   rL     r   )r   AssertionErrorr   r   r   r   r   test_test_unicode_encoding  s`   r   );osr   r   r   os.pathr   r   r   r   r	   r
   rB   r   r   Zsympy.testing.pytestr   Zsympy.testing.quality_unicoder   rx   __file__rz   rr   ry   r{   rY   rd   r[   rZ   r^   r`   rh   rk   rj   rS   rW   Zmessage_self_assignmentsrf   compilera   r\   r_   rg   rR   rT   rQ   re   r   r5   rO   r>   r6   r|   r   r   r   r   r   r   r   r   r   r   r   <module>   sf   







"vC