
(h%                 @   sM  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 d  d l	 m
 Z
 d  d l m Z d  d l m Z d  d l m Z m Z d  d l m Z m Z m Z m Z m Z m Z m Z m Z m Z d  d l m Z d	 d
 l m Z e Z  Gd d   d e  Z! Gd d   d  Z" Gd d   d e  Z# d S)    N)DistutilsErrorDistutilsOptionError)log)
TestLoader)six)mapfilter)	resource_listdirresource_existsnormalize_pathworking_set_namespace_packagesevaluate_markeradd_activation_listenerrequire
EntryPoint)Command   )_unique_everseenc               @   s+   e  Z d  Z d d   Z d d d  Z d S)ScanningLoaderc             C   s   t  j |   t   |  _ d  S)N)r   __init__set_visited)self r   =/tmp/pip-build-kmztzv_d/setuptools/setuptools/command/test.pyr      s    zScanningLoader.__init__Nc             C   s7  | |  j  k r d S|  j  j |  g  } | j t j |  |   t | d  rd | j | j    t | d  rx t | j d  D] } | j	 d  r | d k r | j d | d d  } n- t
 | j | d	  r | j d | } n q | j |  j |   q Wt |  d
 k r+|  j |  S| d Sd S)a  Return a suite of all tests cases contained in the given module

        If the module is a package, load tests from all the modules in it.
        If the module has an ``additional_tests`` function, call it and add
        the return value to the tests.
        Nadditional_tests__path__ z.pyz__init__.py.   z/__init__.pyr   r   )r   addappendr   loadTestsFromModulehasattrr   r	   __name__endswithr
   ZloadTestsFromNamelenZ
suiteClass)r   modulepatterntestsfile	submoduler   r   r   r$      s$    z"ScanningLoader.loadTestsFromModule)r&   
__module____qualname__r   r$   r   r   r   r   r      s   r   c               @   s+   e  Z d  Z d d   Z d d d  Z d S)NonDataPropertyc             C   s   | |  _  d  S)N)fget)r   r1   r   r   r   r   A   s    zNonDataProperty.__init__Nc             C   s   | d  k r |  S|  j  |  S)N)r1   )r   objZobjtyper   r   r   __get__D   s    zNonDataProperty.__get__)r&   r.   r/   r   r3   r   r   r   r   r0   @   s   r0   c               @   s   e  Z d  Z d Z d Z d% d& d' g Z d d   Z d d   Z e d d    Z	 d d   Z
 d d   Z e j g  d d   Z e e j d d     Z e d d    Z d d   Z d d   Z e d  d!    Z e d" d#    Z d$ S)(testz.Command to run unit tests after in-place buildz0run unit tests after in-place build (deprecated)test-module=m$Run 'test_suite' in specified moduletest-suite=s9Run single test, case or suite (e.g. 'module.test_suite')test-runner=rTest runner to usec             C   s(   d  |  _  d  |  _ d  |  _ d  |  _ d  S)N)
test_suitetest_moduletest_loadertest_runner)r   r   r   r   initialize_optionsV   s    			ztest.initialize_optionsc             C   s   |  j  r$ |  j r$ d } t |   |  j  d  k rd |  j d  k rT |  j j  |  _  n |  j d |  _  |  j d  k r t |  j d d   |  _ |  j d  k r d |  _ |  j d  k r t |  j d d   |  _ d  S)Nz1You may specify a module or a suite, but not bothz.test_suiter@   z&setuptools.command.test:ScanningLoaderrA   )r>   r?   r   distributionr@   getattrrA   )r   msgr   r   r   finalize_options\   s    	ztest.finalize_optionsc             C   s   t  |  j    S)N)list
_test_args)r   r   r   r   	test_argso   s    ztest.test_argsc             c   sA   |  j  r t j d k r d V|  j r, d V|  j  r= |  j  Vd  S)N      Zdiscoverz	--verbose)rJ   rK   )r>   sysversion_infoverbose)r   r   r   r   rH   s   s    		ztest._test_argsc          	   C   s   |  j     |   Wd QRXd S)zI
        Backward compatibility for project_on_sys_path context.
        N)project_on_sys_path)r   funcr   r   r   with_project_on_sys_path{   s    ztest.with_project_on_sys_pathc       	      c   s  t  j o t |  j d d  } | r |  j d d d |  j d  |  j d  } t | j  } |  j d d | |  j d  |  j d d d |  j d  n- |  j d  |  j d d d	 |  j d  |  j d  } t	 j
 d  d   } t	 j j   } zy t | j  } t	 j
 j d |  t j   t d
 d    t d | j | j f  |  j | g  
 d  VWd  QRXWd  | t	 j
 d  d   <t	 j j   t	 j j |  t j   Xd  S)Nuse_2to3Fbuild_pyZinplacer   egg_infoegg_base	build_extr   c             S   s
   |  j    S)N)activate)distr   r   r   <lambda>   s    z*test.project_on_sys_path.<locals>.<lambda>z%s==%s)r   PY2rD   rC   reinitialize_commandrun_commandget_finalized_commandr   	build_librL   pathmodulescopyrU   insertr   r   r   r   egg_nameZegg_versionpaths_on_pythonpathclearupdate)	r   Zinclude_distsZ	with_2to3Zbpy_cmdZ
build_pathZei_cmdZold_pathZold_modulesZproject_pathr   r   r   rO      s:    
ztest.project_on_sys_pathc             c   s   t    } t j j d |  } t j j d d  } z[ t j j t |    } t d | | g  } t j j |  } | r | t j d <d VWd | | k r t j j d d  n | t j d <Xd S)z
        Add the indicated paths to the head of the PYTHONPATH environment
        variable so that subprocesses will also see the packages at
        these paths.

        Do this in a context that restores the value on exit.
        
PYTHONPATHr   N)	objectosenvirongetpathsepjoinr   r   pop)pathsZnothingZorig_pythonpathZcurrent_pythonpathprefixZto_joinnew_pathr   r   r   rd      s    
		ztest.paths_on_pythonpathc             C   sb   |  j  |  j  } |  j  |  j p$ g   } |  j  d d   |  j j   D  } t j | | |  S)z
        Install the requirements indicated by self.distribution and
        return an iterable of the dists that were built.
        c             s   s@   |  ]6 \ } } | j  d   r t | d d   r | Vq d S):r   N)
startswithr   ).0kvr   r   r   	<genexpr>   s    	z%test.install_dists.<locals>.<genexpr>)Zfetch_build_eggsZinstall_requiresZtests_requireZextras_requireitems	itertoolschain)rX   Zir_dZtr_dZer_dr   r   r   install_dists   s
    ztest.install_distsc             C   s   |  j  d t j  |  j |  j  } d j |  j  } |  j rU |  j  d |  d  S|  j  d |  t t	 j
 d  |  } |  j |  # |  j    |  j   Wd  QRXWd  QRXd  S)NzWARNING: Testing via this command is deprecated and will be removed in a future version. Users looking for a generic test entry point independent of test runner are encouraged to use tox. zskipping "%s" (dry run)zrunning "%s"location)announcer   WARNr{   rC   rm   _argvdry_runr   operator
attrgetterrd   rO   	run_tests)r   Zinstalled_distscmdro   r   r   r   run   s    
	ztest.runc          
   C   s7  t  j r t |  j d d  r |  j j d  d } | t k r g  } | t j k rc | j	 |  | d 7} x- t j D]" } | j
 |  rw | j	 |  qw Wt t t j j |   t j d  d  |  j d |  j |  j  d |  j |  j  d d } | j j   s3d | j } |  j | t j  t |   d  S)	NrR   Fr   r   Z
testLoaderZ
testRunnerexitzTest failed: %s)r   rZ   rD   rC   r>   splitr   rL   r`   r#   rs   rG   r   __delitem__unittestmainr   _resolve_as_epr@   rA   resultZwasSuccessfulr~   r   ERRORr   )r   r)   Zdel_modulesnamer4   rE   r   r   r   r      s(    
	ztest.run_testsc             C   s   d g |  j  S)Nr   )rI   )r   r   r   r   r     s    z
test._argvc             C   s0   |  d k r d St  j d |   } | j     S)zu
        Load the indicated attribute value, called, as a as if it were
        specified as an entry point.
        Nzx=)r   parseresolve)valparsedr   r   r   r     s    ztest._resolve_as_epN)r5   r6   r7   )r8   r9   r:   )r;   r<   r=   )r&   r.   r/   __doc__descriptionuser_optionsrB   rF   r0   rI   rH   rQ   
contextlibcontextmanagerrO   staticmethodrd   r{   r   r   propertyr   r   r   r   r   r   r4   J   s(    	.r4   )$ri   r   rL   r   ry   r   Zdistutils.errorsr   r   	distutilsr   r   Zsetuptools.externr   Zsetuptools.extern.six.movesr   r   pkg_resourcesr	   r
   r   r   r   r   r   r   r   
setuptoolsr   rS   r   typeZ__metaclass__r   r0   r4   r   r   r   r   <module>   s"   @)
