3
;p_$                 @   s   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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 G d	d
 d
eZG dd dZG dd deZdS )    N)DistutilsErrorDistutilsOptionError)log)
TestLoader)	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-install-ofl94hr3/setuptools/setuptools/command/test.pyr      s    
zScanningLoader.__init__Nc             C   s   || j krdS | j j| g }|jtj| | t|drH|j|j  t|drxpt|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`W t|d
kr| j|S |d S d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)N)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   r.   r   r   r   r   <   s    zNonDataProperty.__init__Nc             C   s   |d kr| S | j |S )N)r.   )r   objZobjtyper   r   r   __get__?   s    zNonDataProperty.__get__)N)r#   r+   r,   r   r0   r   r   r   r   r-   ;   s   r-   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 f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_optionsQ   s    ztest.initialize_optionsc             C   s   | j r| jrd}t|| j d krD| jd kr8| jj | _ n| jd | _ | jd kr^t| jdd | _| jd krnd| _| jd krt| jdd | _d S )Nz1You may specify a module or a suite, but not bothz.test_suiter=   z&setuptools.command.test:ScanningLoaderr>   )r;   r<   r   distributionr=   getattrr>   )r   msgr   r   r   finalize_optionsW   s    




ztest.finalize_optionsc             C   s   t | j S )N)list
_test_args)r   r   r   r   	test_argsj   s    ztest.test_argsc             c   s6   | j  rtjdkrdV  | jr$dV  | j r2| j V  d S )N      Zdiscoverz	--verbose)rG   rH   )r;   sysversion_infoverbose)r   r   r   r   rE   n   s    ztest._test_argsc          	   C   s   | j   |  W dQ R X dS )zI
        Backward compatibility for project_on_sys_path context.
        N)project_on_sys_path)r   funcr   r   r   with_project_on_sys_pathv   s    
ztest.with_project_on_sys_pathc       	      c   sJ  t | jdd}|rp| 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
 }zbt|j}tjjd| tj  td
d  td|j|jf  | j|g d V  W d Q R X W d |tjd d < tj	j  tj	j| tj  X d S )Nuse_2to3Fbuild_pyr   )Zinplace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)rA   r@   reinitialize_commandrun_commandget_finalized_commandr   	build_librI   pathmodulescopyrR   insertr	   r   r   r   egg_nameZegg_versionpaths_on_pythonpathclearupdate)	r   Zinclude_distsZ	with_2to3Zbpy_cmdZ
build_pathZei_cmdold_pathZold_modulesZproject_pathr   r   r   rL   }   s8    









ztest.project_on_sys_pathc             c   s   t  }tjjd|}tjjdd}zBtjjt| }td||g}tjj|}|r\|tjd< dV  W d||kr~tjjdd n
|tjd< X d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   filterpop)pathsZnothingZorig_pythonpathZcurrent_pythonpathprefixZto_joinnew_pathr   r   r   r`      s    


ztest.paths_on_pythonpathc             C   sD   | 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   s0   | ](\}}|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)rU   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r>| j d|  d S | j d|  tt	j
d|}| j|" | j  | j  W d Q R X W d Q R X d 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   WARNry   r@   rj   _argvdry_runmapoperator
attrgetterr`   rL   	run_tests)r   Zinstalled_distscmdrm   r   r   r   run   s    
ztest.runc             C   s   t | jddr|| jjdd }|tkr|g }|tjkr>|j| |d7 }x"tjD ]}|j|rN|j| qNW t	t
tjj| tjd d | j| j| j| j| jdd}|jj sd|j }| j|tj t|d S )NrO   Fr   r   )Z
testLoaderZ
testRunnerexitzTest failed: %s)rA   r@   r;   splitr
   rI   r\   r    rq   rD   r   __delitem__unittestmainr~   _resolve_as_epr=   r>   resultZwasSuccessfulr|   r   ERRORr   )r   r&   Zdel_modulesnamer1   rB   r   r   r   r      s(    






ztest.run_testsc             C   s   dg| j  S )Nr   )rF   )r   r   r   r   r~     s    z
test._argvc             C   s$   | dkrdS t 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)r2   r3   r4   )r5   r6   r7   )r8   r9   r:   )r#   r+   r,   __doc__descriptionuser_optionsr?   rC   r-   rF   rE   rN   
contextlibcontextmanagerrL   staticmethodr`   ry   r   r   propertyr~   r   r   r   r   r   r1   E   s(    -r1   )rf   r   rI   r   rw   r   distutils.errorsr   r   	distutilsr   r   pkg_resourcesr   r   r   r	   r
   r   r   r   r   
setuptoolsr   rP   r   r   r-   r1   r   r   r   r   <module>   s   ,)
