
#þîh^  ã               @   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 Z d  d l m Z e  j	 d d „  d d „ ƒ Z
 e  j	 d d „  ƒ Z e  j	 d	 d
 „  ƒ Z e  j	 d d „  ƒ Z e  j	 d d „  ƒ Z d d „  Z e  j	 d d „  ƒ Z e  j	 d d „  ƒ Z e  j	 d d „  ƒ Z d S)é    N)ÚFileLockc             C   s   d  S)N© )Údirr   r   ú?/tmp/pip-build-zijwfla7/setuptools/setuptools/tests/contexts.pyÚ<lambda>   s    r   c             k   sM   t  j | �  } t j ƒ  } z |  | ƒ | VWd  |  | ƒ t j | ƒ Xd  S)N)ÚtempfileÚmkdtempÚosÚgetcwdÚshutilÚrmtree)ZcdÚkwargsÚtemp_dirZorig_dirr   r   r   Útempdir   s    
	
r   c              k   s¾   t  d d „  |  Dƒ ƒ } d d „  |  j ƒ  Dƒ } x4 t | ƒ D]& } t j j | d ƒ |  j | ƒ q? Wt j j |  ƒ z	 | VWd x! |  D] } t j j | d ƒ qŒ Wt j j | ƒ Xd S)zj
    In a context, patch the environment with replacements. Pass None values
    to clear the values.
    c             s   s1   |  ]' } | t  j k r | t  j | f Vq d  S)N)r	   Úenviron)Ú.0Úkeyr   r   r   ú	<genexpr>   s    zenvironment.<locals>.<genexpr>c             s   s'   |  ] \ } } | d  k r | Vq d  S)Nr   )r   r   Úvaluer   r   r   r   !   s    N)ÚdictÚitemsÚlistr	   r   ÚpopÚupdate)ÚreplacementsÚsavedÚremover   r   r   r   Úenvironment   s    	r   c              c   s{   t  j }  t  j } t j ƒ  } t  _ t j ƒ  } t  _ z | | f VWd | j d ƒ | j d ƒ |  t  _ | t  _ Xd S)zk
    Redirect stdout/stderr to StringIO objects to prevent console output from
    distutils commands.
    Nr   )ÚsysÚstdoutÚstderrÚioÚStringIOÚseek)Z
old_stdoutZ
old_stderrZ
new_stdoutZ
new_stderrr   r   r   Úquiet0   s    			r$   c              c   s#   t  j }  z	 |  VWd  |  t  _ Xd  S)N)ÚsiteÚENABLE_USER_SITE)r   r   r   r   Úsave_user_site_settingD   s    		r'   c              g   s"   y	 d  VWn |  k
 r Yn Xd  S)Nr   )Zexcsr   r   r   Úsuppress_exceptionsM   s    	r(   c             C   s6   y |  j  d ƒ } Wn t k
 r+ d SYn X| d k S)zO
    Return True if running under xdist and multiple
    workers are used.
    Ú	worker_idFZmaster)ZgetfixturevalueÚ	Exception)Úrequestr)   r   r   r   Ú	multiprocU   s
    	r,   c             c   sm   | j  ƒ  } t |  ƒ r! | j n | } | | } t | j d ƒ ƒ �  | j d d d d ƒ | VWd QRXd S)zCUses a file lock to guarantee only one worker can access a temp dirz.lockÚexist_okTÚparentsN)Zgetbasetempr,   Úparentr   Zwith_suffixÚmkdir)r+   Ztmp_path_factoryÚnameÚbaseZ
shared_dirZ
locked_dirr   r   r   Úsession_locked_tmp_dira   s    
r3   c              c   s_   t  j d d … t  j d d … t  j d d … f }  z	 d VWd |  \ t  _ t  _ t  _ Xd S)zNMake sure ``sys.path``, ``sys.meta_path`` and ``sys.path_hooks`` are preservedN)r   ÚpathÚ	meta_pathÚ
path_hooks)Úprevr   r   r   Ú
save_pathso   s    6	r8   c              c   s5   t  j }  z t  j j ƒ  t  _ d VWd |  t  _ Xd S)z.Make sure initial ``sys.modules`` is preservedN)r   ÚmodulesÚcopy)Zprev_modulesr   r   r   Úsave_sys_modulesz   s
    		r;   )Ú
contextlibr!   r	   r   r%   r   r   Zfilelockr   Úcontextmanagerr   r   r$   r'   r(   r,   r3   r8   r;   r   r   r   r   Ú<module>   s"   	