a
    ñ»j-I  ã                   @   s¨  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZmZmZ e d¡Ze d¡ZeefZdZeedƒs”dd	„ e_d
eddddfdd„Zdd„ Zdd„ ZdDdd„Zdd„ Zdd„ Zdd„ Zdd„ ZeZdd „ Zd!d"„ Z dEd#d$„Z!d%d&„ Z"d'd(„ Z#dFd)d*„Z$d+d,„ Z%d-e%_&d.d/„ Z'd-e'_&d0d1„ Z(d2d3„ Z)d4d5„ Z*d6d7„ Z+G d8d9„ d9e,ƒZ-d:d;„ Z.d<d=„ Z/dGd?d@„Z0dAdB„ Z1e2dCk�r¤ddl3Z3e3 4¡  dS )Hz6Utility functions and classes used by nose internally.é    N)Ú	ClassTypeÚTypeTypeÚisgeneratorÚnosez^[A-Za-z_][A-Za-z0-9_.]*$zE(?:\.svn)|(?:[^.]+\.py[co])|(?:.*~)|(?:.*\$py\.class)|(?:__pycache__)Ú
getargspecc                 C   s   t  | ¡d d… S )Né   )ÚinspectÚgetfullargspec©Úfunc© r   ú/E:\soccer\ml_env\Lib\site-packages\nose/util.pyÚ<lambda>   ó    r   Ú z|-- z|   z`-- z    c              	   C   s   d  t| |||||ƒ¡S )NÚ
)ÚjoinÚ_ls_tree_lines)Údir_pathÚskip_patternÚindentÚbranch_indentÚlast_indentÚlast_branch_indentr   r   r   Úls_tree   s    úr   c                 #   s
  ˆdkrt  ¡ ‰t  ˆ¡}| ¡  g g  }}|D ]>}	t ˆ|	¡rBq0t j t j ˆ|	¡¡rd| 	|	¡ q0| 	|	¡ q0t
t dd„ |D ƒdd„ |D ƒ¡ƒ}
‡ ‡‡‡‡‡fdd„}|
d d… D ]"\}	}||	|ˆˆ ƒD ]
}|V  qÌq¶|
�r|
d \}	}||	|ˆˆƒD ]
}|V  qúd S )Nr   c                 S   s   g | ]}|d f‘qS )Fr   ©Ú.0Únamer   r   r   Ú
<listcomp>5   r   z"_ls_tree_lines.<locals>.<listcomp>c                 S   s   g | ]}|d f‘qS )Tr   r   r   r   r   r   5   r   c                 3   s^   |s||  V  nJt j ˆ| ¡}t j |¡sZ||  V  t|ˆˆˆ ˆˆƒ}|D ]}|| V  qJd S ©N)ÚosÚpathr   Úislinkr   )r   Úis_dirÚindZ
branch_indr!   ZsubtreeÚx©r   r   r   r   r   r   r   r   Úls_entry8   s    
þz _ls_tree_lines.<locals>.ls_entryéÿÿÿÿ)r    ÚgetcwdÚlistdirÚsortÚreÚmatchr!   Úisdirr   ÚappendÚlistÚ	itertoolsÚchain)r   r   r   r   r   r   ÚnamesÚdirsÚnondirsr   Úentriesr'   r#   Úliner   r&   r   r   %   s,    

ÿ
r   c                 C   sJ   t j | ¡s.t j t j t j t  ¡ | ¡¡¡} | d u sBt j | ¡sFd S | S r   )r    r!   ÚisabsÚnormpathÚabspathr   r)   r.   )r!   r   r   r   ÚabsdirM   s    ÿr;   c                 C   s  | }|d u rt  ¡ }t|ttfƒrJ|D ]}t| |ƒ}|d ur&|  S q&d S t j | ¡stt j t j 	t j 
|| ¡¡¡} | d u sˆt j | ¡s¶|t  ¡ kr¶t j t j 	t j 
t  ¡ |¡¡¡} | d u sÊt j | ¡sÎd S t j | ¡rút j 
| d¡}t j |¡rø|S nt j | ¡�r| S d S )Nú__init__.py)r    r)   Ú
isinstancer0   ÚtupleÚabsfiler!   r8   r9   r:   r   Úexistsr.   Úisfile)r!   ÚwhereÚorigZ
maybe_pathZ	maybe_absÚinitr   r   r   r?   W   s2    

ÿr?   c                    s   t ‡ fdd„|D ƒƒS )Nc                 3   s   | ]}ˆ |ƒV  qd S r   r   )r   Úitem©Ú	predicater   r   Ú	<genexpr>t   r   zanyp.<locals>.<genexpr>)Úany)rG   Úiterabler   rF   r   Úanyps   s    rK   c                 C   s:   t j | ¡p8t j | ¡p8|  d¡p8t t j | ¡d ¡ S )zŽA name is file-like if it is a path that exists, or it has a
    directory part, or it ends in .py, or it isn't a legal python
    identifier.ú.pyr   )r    r!   r@   ÚdirnameÚendswithÚident_rer-   Úsplitext)r   r   r   r   Ú	file_likew   s    
ÿþýrQ   c                 C   sF   z| j W S  ty@   z| jjW  Y S  ty:   Y Y dS 0 Y n0 dS )zmGet the line number of a function. First looks for
    compat_co_firstlineno, then func_code.co_first_lineno.r(   N)Zcompat_co_firstlinenoÚAttributeErrorÚ__code__Úco_firstlinenor
   r   r   r   Úfunc_lineno�   s    rU   c                 C   s   t | ƒ}|tv pt|t ƒS r   )ÚtypeÚclass_typesÚ
issubclass)ÚobjÚobj_typer   r   r   Úisclass�   s    r[   c                 C   sr   t j | ¡rnt j | ¡}t |¡rndD ] }t j t j | |¡¡r& dS q&tj	 
d¡rnt j t j | d¡¡rndS dS )zÈIs this path a package directory?
    >>> ispackage('nose')
    True
    >>> ispackage('unit_tests')
    False
    >>> ispackage('nose/plugins')
    True
    >>> ispackage('nose/loader.py')
    False )r<   z__init__.pycz__init__.pyoTÚjavaz__init__$py.classF)r    r!   r.   ÚbasenamerO   r-   rA   r   ÚsysÚplatformÚ
startswith)r!   ÚendrD   r   r   r   Ú	ispackage•   s    

ÿrb   c                 C   s   t | ƒtu S )zúIs this a property?
    >>> class Foo:
    ...     def got(self):
    ...         return 2
    ...     def get(self):
    ...         return 1
    ...     get = property(get)
    >>> isproperty(Foo.got)
    False
    >>> isproperty(Foo.get)
    True )rV   Úproperty©rY   r   r   r   Ú
isproperty­   s    re   c                 C   s\   |du rt  ¡ }t j |t j |  d¡¡¡}t j |d ¡r@|S |d }t j |¡rX|S dS )z‹Find the python source file for a package, relative to a
    particular directory (defaults to current working directory if not
    given).NÚ.z/__init__.pyrL   )r    r)   r!   r   ÚsepÚsplitr@   )ÚpackageZ
relativeTor!   Úfilenamer   r   r   Úgetfilename¼   s    rk   c                 C   sº   t | ƒ}tj |¡s| d¡s*t|ƒs*dS tj tj |¡¡\}}|dkrPg }n|g}tj tj |¡d ¡\}}|r¨ttj 	||¡ƒr¨| 
|¡ nq¨tj |¡\}}qr| ¡  d 	|¡S )aƒ  Find the full dotted package name for a given python source file
    name. Returns None if the file is not a python source file.

    >>> getpackage('foo.py')
    'foo'
    >>> getpackage('biff/baf.py')
    'baf'
    >>> getpackage('nose/util.py')
    'nose.util'

    Works for directories too.

    >>> getpackage('nose')
    'nose'
    >>> getpackage('nose/plugins')
    'nose.plugins'

    And __init__ files stuck onto directories

    >>> getpackage('nose/plugins/__init__.py')
    'nose.plugins'

    Absolute paths also work.

    >>> path = os.path.abspath(os.path.join('nose', 'plugins'))
    >>> getpackage(path)
    'nose.plugins' rL   NÚ__init__r   rf   )Úsrcr    r!   r.   rN   rb   rP   r]   rh   r   r/   Úreverse)rj   Zsrc_fileÚbaseÚextZ	mod_partsr!   Úpartr   r   r   Ú
getpackageË   s(    
ÿþýrr   c                 C   sR   t | ƒd }d| d }dd| | d| f }dt |ƒ }|dkrN|d|  }|S )z¢Draw a 70-char-wide divider, with label in the middle.
    >>> ln('hello there')
    '---------------------------- hello there -----------------------------'
    é   éF   z%s %s %sú-r   )Úlen)ÚlabelZ	label_lenÚchunkÚoutÚpadr   r   r   Úlný   s    r{   c                 C   s    |   d¡}|dd… }|du rr|rfz"t d| ¡ td |¡ƒ}W qfW q tyb   |d= |s^‚ Y q0 q|dd… }|}t d|| ||¡ |D ]}t||ƒ}qŒ|S )a3  Resolve a dotted name to a module and its parts. This is stolen
    wholesale from unittest.TestLoader.loadTestByName.
    >>> resolve_name('nose.util') #doctest: +ELLIPSIS
    <module 'nose.util' from...>
    >>> resolve_name('nose.util.resolve_name') #doctest: +ELLIPSIS
    <function resolve_name at...> rf   Nz__import__ %sr(   é   zresolve: %s, %s, %s, %s)rh   ÚlogÚdebugÚ
__import__r   ÚImportErrorÚgetattr)r   ÚmoduleÚpartsZ
parts_copyrY   rq   r   r   r   Úresolve_name  s$    

r„   c                 C   s:  t jj}| }d}d| vr8t| ƒr.|| ƒddfS d| dfS t j | ¡\}}|sÌz$|  d¡\}}t|ƒrn| d }}W nX tyÈ   |  d¡}t|d ƒdkr¶d |dd… ¡|d  }}ntd| f ƒ‚Y n0 n6|sÖ| }n,d|v rî| d¡\}}n|}t j ||g¡}|�r,t|ƒ�r ||ƒd|fS d||fS n
dd|fS dS )a+  Split a test name into a 3-tuple containing file, module, and callable
    names, any of which (but not all) may be blank.
    Test names are in the form:
    file_or_module:callable
    Either side of the : may be dotted. To change the splitting behavior, you
    can alter nose.util.split_test_re.Nú:r   r|   r(   zaTest name '%s' could not be parsed. Please format test names as path:callable or module:callable.)	r    r!   r9   rQ   rh   Ú
ValueErrorrv   r   rg   )ÚtestZnormZfile_or_modÚfnÚheadÚtailrƒ   Z	file_partr   r   r   Úsplit_test_name&  s>    

þ
r‹   Fc                 C   sâ  t | dƒr|  ¡ S t| ƒ}d } }}|tjkrVt| ddƒ}t| ddƒ}t|ƒ||fS |tjksrt|tƒsr|tkrÊt| ddƒ}|dur°t	j
| }t|ddƒ}|dur°tj |¡}t| ddƒ}t|ƒ||fS |tjk�rt| jjƒ}t|d ƒ|d d|d	 | jf fS t| tjƒ�rªt | d
ƒ�s,t | dƒ�rXzt| jƒW S  t�yV   t| jƒ Y S 0 t| jƒ}z
| j}W n t�y†   | j}Y n0 t|d ƒ|d d|d	 |f fS t | dƒ�rÎ| jjdv�rÎt| jƒS td| |f ƒ‚dS )zaFind the test address for a test, which may be a module, filename,
    class, method or function.ÚaddressNÚ__file__Ú__name__Ú
__module__r   r|   z%s.%srs   Ú_FunctionTestCase__testFuncÚ	_testFuncÚ	__class__)Ú__builtin__ÚbuiltinszI don't know what %s is (%s))ÚhasattrrŒ   rV   ÚtypesÚ
ModuleTyper�   rm   ÚFunctionTyperX   r^   Úmodulesr    r!   r:   Ú
MethodTypeÚtest_addressÚ__self__r’   rŽ   r=   ÚunittestZTestCaser�   rR   r‘   Z_TestCase__testMethodNameZ_testMethodNamer�   Ú	TypeError)r‡   ÚtÚfiler‚   ÚcallÚmZcls_adrÚmethod_namer   r   r   r›   W  sb    

ÿþý
ÿÿþ

ÿ
ÿ
r›   c              	   C   sæ   |D ]Ü}t | |dƒ}|durt| tjƒrÈt|tjƒrHt |¡\}}}}n\t|ƒr`t |¡s`|j	}z t |¡\}}}}| 
d¡ W n" ty¢   td|| f ƒ‚Y n0 t|ƒrÈt d| || ¡ || ƒ  S t d| |¡ |ƒ   S qdS )zÆGiven a list of possible method names, try to run them with the
    provided object. Keep going until something works. Used to run
    setup/teardown methods for module, package, and function tests.Nr   zaAttribute %s of %r is not a python function. Only functions or callables may be used as fixtures.zcall fixture %s.%s(%s)zcall fixture %s.%s)r�   r=   r–   r—   r˜   r   r   ÚcallableÚismethodÚ__call__Úpoprž   rv   r}   r~   )rY   r3   r   r   ÚargsÚvarargsÚvarkwÚdefaultsr   r   r   Útry_runŽ  s2    ÿþÿ
ýr¬   c                 C   sb   | du r| S t j d¡r8|  d¡r8d | dd… df¡S tj | ¡\}}|dv r^d |df¡S | S )z’Find the python source file for a .pyc, .pyo or $py.class file on
    jython. Returns the filename provided if it is not a python source
    file.Nr\   z	$py.classrf   i÷ÿÿÿÚpy)z.pycz.pyorL   )r^   r_   r`   rN   r   r    r!   rP   )rj   ro   rp   r   r   r   rm   ²  s    rm   c                    s   ‡ fdd„}|S )a�  Sort key function factory that puts items that match a
    regular expression last.
    >>> from nose.config import Config
    >>> from nose.pyversion import sort_list
    >>> c = Config()
    >>> regex = c.testMatch
    >>> entries = ['.', '..', 'a_test', 'src', 'lib', 'test', 'foo.py']
    >>> sort_list(entries, regex_last_key(regex))
    >>> entries
    ['.', '..', 'foo.py', 'lib', 'src', 'a_test', 'test'] c                    s   ˆ   | ¡rd| fS d| fS )Nr|   r   )Úsearchrd   ©Úregexr   r   ÚkË  s    
zregex_last_key.<locals>.kr   )r°   r±   r   r¯   r   Úregex_last_keyÀ  s    r²   c                 C   s^   | du rdS z|   g ¡ | W S  ty.   Y n0 zt d| ¡W S  tyX   t| ƒ Y S 0 dS )ar  Convert a value that may be a list or a (possibly comma-separated)
    string into a list. The exception: None is returned as None, not [None].
    >>> tolist(["one", "two"])
    ['one', 'two']
    >>> tolist("hello")
    ['hello']
    >>> tolist("separate,values, with, commas,  spaces , are    ,ok")
    ['separate', 'values', 'with', 'commas', 'spaces', 'are', 'ok'] Nz\s*,\s*)ÚextendrR   r,   rh   rž   r0   )Úvalr   r   r   ÚtolistÒ  s    	
rµ   c                       sŠ   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡ fdd„Zdd	„ Z‡ fd
d„Z‡ fdd„Z	dd„ Z
dd„ Zd‡ fdd„	Z‡ fdd„Zdd„ Z‡  ZS )ÚodictzqSimple ordered dict implementation, based on:
    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747 c                    s    g | _ tt| ƒj|i |¤Ž d S r   )Ú_keysÚsuperr¶   rl   )ÚselfÚargÚkw©r’   r   r   rl   ë  s    zodict.__init__c                    s    t t| ƒ |¡ | j |¡ d S r   )r¸   r¶   Ú__delitem__r·   Úremove)r¹   Úkeyr¼   r   r   r½   ï  s    zodict.__delitem__c                    s,   t t| ƒ ||¡ || jvr(| j |¡ d S r   )r¸   r¶   Ú__setitem__r·   r/   )r¹   r¿   rE   r¼   r   r   rÀ   ó  s    
zodict.__setitem__c                 C   s    dd  dd„ t|  ¡ ƒD ƒ¡ S )Nz{%s}z, c                 S   s   g | ]\}}d ||f ‘qS )z%r: %rr   )r   r±   Úvr   r   r   r   ú  r   z!odict.__str__.<locals>.<listcomp>)r   r0   Úitems©r¹   r   r   r   Ú__str__ø  s    ÿzodict.__str__c                    s   t t| ƒ ¡  g | _d S r   )r¸   r¶   Úclearr·   rÃ   r¼   r   r   rÅ   ý  s    zodict.clearc                    s"   t t| ƒ ¡ }| jd d … |_|S r   )r¸   r¶   Úcopyr·   )r¹   Údr¼   r   r   rÆ     s    z
odict.copyc                 C   s   t t| jt |  ¡ ƒƒƒS r   )r0   Úzipr·   ÚvaluesrÃ   r   r   r   rÂ     s    zodict.itemsc                 C   s   | j d d … S r   )r·   rÃ   r   r   r   Úkeys	  s    z
odict.keysNc                    s,   t t| ƒ ||¡}|| jvr(| j |¡ |S r   )r¸   r¶   Ú
setdefaultr·   r/   )r¹   r¿   ÚfailobjrE   r¼   r   r   rË     s    
zodict.setdefaultc                    s<   t t| ƒ |¡ t| ¡ ƒD ]}|| jvr| j |¡ qd S r   )r¸   r¶   Úupdater0   rÊ   r·   r/   )r¹   Údictr¿   r¼   r   r   rÍ     s    
zodict.updatec                 C   s   t t| j| jƒƒS r   )r0   ÚmapÚgetr·   rÃ   r   r   r   rÉ     s    zodict.values)N)rŽ   r�   Ú__qualname__Ú__doc__rl   r½   rÀ   rÄ   rÅ   rÆ   rÂ   rÊ   rË   rÍ   rÉ   Ú__classcell__r   r   r¼   r   r¶   è  s   r¶   c                    sD   ddl m} tˆ ƒr"‡ fdd„}n‡ fdd„}|ˆ ƒ|ƒ}||_|S )a¾  Make a function imported from module A appear as if it is located
    in module B.
    >>> from pprint import pprint
    >>> pprint.__module__
    'pprint'
    >>> pp = transplant_func(pprint, __name__)
    >>> pp.__module__
    'nose.util'

    The original function is not modified.
    >>> pprint.__module__
    'pprint'

    Calling the transplanted function calls the original.
    >>> pp([1, 2])
    [1, 2]
    >>> pprint([1,2])
    [1, 2] r   )Úmake_decoratorc                  ?   s   ˆ | i |¤ŽE d H  d S r   r   ©rº   r»   r
   r   r   Únewfunc2  s    z transplant_func.<locals>.newfuncc                     s   ˆ | i |¤ŽS r   r   rÕ   r
   r   r   rÖ   5  s    )Z
nose.toolsrÔ   r   r�   )r   r‚   rÔ   rÖ   r   r
   r   Útransplant_func  s    r×   c                 C   s"   G dd„ d| ƒ}||_ | j|_|S )a7  Make a class appear to reside in `module`,
    rather than the module in which it is actually defined.
    >>> from nose.failure import Failure
    >>> Failure.__module__
    'nose.failure'
    >>> Nf = transplant_class(Failure, __name__)
    >>> Nf.__module__
    'nose.util'
    >>> Nf.__name__
    'Failure' c                   @   s   e Zd ZdS )ztransplant_class.<locals>.CN)rŽ   r�   rÑ   r   r   r   r   ÚCH  s   rØ   )r�   rŽ   )Úclsr‚   rØ   r   r   r   Útransplant_class=  s    rÚ   úutf-8c                    sV   z
t | ƒW S  tyP   t| tƒr>d ‡ fdd„| D ƒ¡ Y S t | ƒ ˆ ¡ Y S 0 d S )Nú c                    s   g | ]}t |ˆ ƒ‘qS r   )Úsafe_str)r   rº   ©Úencodingr   r   r   U  r   zsafe_str.<locals>.<listcomp>)ÚstrÚUnicodeEncodeErrorr=   Ú	Exceptionr   Úencode)r´   rß   r   rÞ   r   rÝ   P  s    

rÝ   c                 C   s6   t j | ¡sdS t  | ¡}t|jtjtjB tjB @ ƒS )NF)	r    r!   r@   ÚstatÚboolÚst_modeÚS_IXUSRÚS_IXGRPÚS_IXOTH)r    Ústr   r   r   Úis_executableY  s    
rë   Ú__main__)N)N)N)rÛ   )5rÒ   r   r1   Úloggingrä   r    r,   r^   r–   r�   Znose.pyversionr   r   r   Ú	getLoggerr}   ÚcompilerO   rW   r   r•   r   r   r   r;   r?   rK   rQ   rU   r[   Zis_generatorrb   re   rk   rr   r{   r„   r‹   Z__test__r›   r¬   rm   r²   rµ   rÎ   r¶   r×   rÚ   rÝ   rë   rŽ   ÚdoctestÚtestmodr   r   r   r   Ú<module>   sh   

ÿ

ý
(



2
.4$4!
	
