ó
…¾^Yc           @   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 m Z d d l m	 Z	 d e
 f d „  ƒ  YZ d e f d	 „  ƒ  YZ d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   s8   Coverage controllers for use by pytest-cov and nose-cov.iÿÿÿÿN(   t   CoverageDatai   (   t   StringIOt   CovControllerc           B   s\   e  Z d  Z d d d „ Z d „  Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z	 d „  Z
 RS(   s0   Base class for different plugin implementations.c         C   sp   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ d |  _ t	 ƒ  |  _
 g  |  _ t j ƒ  |  _ d S(   s8   Get some common config used by multiple derived classes.N(   t
   cov_sourcet
   cov_reportt
   cov_configt
   cov_appendt
   cov_brancht   configt   nodeidt   Nonet   covt   sett
   node_descst   failed_slavest   ost   getcwdt   topdir(   t   selfR   R   R   R   R   R   R	   (    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyt   __init__   s    									c         C   s¾   |  j  d k r d t j d <n t j j |  j  ƒ t j d <t j j |  j ƒ } t j j	 | ƒ rr | t j d <n d t j d <t j j |  j
 j j ƒ t j d <|  j rº d t j d <n  d S(   sP   Put info about coverage into the env so that subprocesses can activate coverage.t    t   COV_CORE_SOURCEt   COV_CORE_CONFIGt   COV_CORE_DATAFILEt   enabledt   COV_CORE_BRANCHN(   R   R
   R   t   environt   pathsept   joint   patht   abspathR   t   existsR   R   t	   data_fileR   (   R   t   config_file(    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyt   set_env    s    "	c           C   sP   t  j j d d ƒ t  j j d d ƒ t  j j d d ƒ t  j j d d ƒ d S(   s   Remove coverage info from env.R   R   R   R   N(   R   R   t   popR
   (    (    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyt	   unset_env/   s    c         C   s   d |  d | d  f S(   s"   Return a description of this node.s   platform %s, python %ss   %s.%s.%s-%s-%si   (    (   t   platformt   version_info(    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyt   get_node_desc7   s    c         C   s   t  |  d ƒ r" |  j | | ƒ nY t d t | ƒ d ƒ } | d } | d } d | | | | | | f } |  j | ƒ d  S(   Nt   sepiF   i   s	   %s %s %s
iD   (   t   hasattrR(   t   maxt   lent   write(   t   streamt   st   txtt	   sep_totalt   sep_lent	   sep_extrat   out(    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyR(   =   s    

c   	         s  d } ˆ  j  sR t t j d ƒ , } ˆ  j j d t d t d | ƒ } | SWd QXn  t ˆ  j ƒ d k r ˆ  j	 | d d	 d
 j
 ˆ  j ƒ ƒ nD ˆ  j	 | d d ƒ x. t ˆ  j ƒ D] } ˆ  j	 | d d | ƒ q° Wt ‡  f d †  d d g Dƒ ƒ r˜i d ˆ  j  k pd d 6t d 6| d 6} t ˆ  j  t ƒ oAd ˆ  j  j ƒ  k } t t d ƒ rƒt j d d k rƒ| j i | pxd d 6ƒ n  ˆ  j j |   } n  d ˆ  j  k rˆ  j  d } ˆ  j j d t d | ƒ ˆ  j j d t d t ƒ  ƒ } | r| j d | ƒ q| j d ƒ n  d ˆ  j  k rcˆ  j j d t d ˆ  j  d ƒ } | j d ˆ  j j j ƒ n  d ˆ  j  k r±ˆ  j j d t d ˆ  j  d ƒ } | j d ˆ  j j j ƒ n  ˆ  j rˆ  j	 | d d ƒ | j d ƒ x+ ˆ  j D] } | j d  | j j ƒ qäWn  | S(!   s   Produce coverage reports.i    t   wt   show_missingt   ignore_errorst   fileNi   t   -s   coverage: %sR   t   coveraget    s   %sc         3   s   |  ] } | ˆ  j  k Vq d  S(   N(   R   (   t   .0t   x(   R   (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pys	   <genexpr>Z   s    t   terms   term-missings   skip-coveredR&   i   t   skip_coveredt   annotatet	   directorys,   Coverage annotated source written to dir %s
s1   Coverage annotated source written next to source
t   htmls    Coverage HTML written to dir %s
t   xmlt   outfiles    Coverage XML written to file %s
s   coverage: failed slavessj   The following slaves failed to return coverage data, ensure that pytest-cov is installed on these slaves.
s   %s
(    R   t   openR   t   devnullR   t   reportt   TrueR+   R   R(   R   t   sortedt   anyR
   t
   isinstancet   dictt   valuesR)   R9   R&   t   updateR?   R   R,   t   html_reportR   t   html_dirt
   xml_reportt
   xml_outputR   t   gatewayt   id(	   R   R-   t   totalt   nullt	   node_desct   optionsR>   t   annotate_dirt   node(    (   R   s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyt   summaryH   sL    	!&"
'"""	N(   t   __name__t
   __module__t   __doc__R
   R   R"   t   staticmethodR$   R'   R(   RZ   (    (    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyR      s   	t   Centralc           B   s    e  Z d  Z d „  Z d „  Z RS(   s)   Implementation for centralised operation.c         C   sk   t  j  d |  j d |  j d |  j ƒ |  _ |  j rC |  j j ƒ  n |  j j ƒ  |  j j ƒ  |  j	 ƒ  d S(   s4   Erase any previous coverage data and start coverage.t   sourcet   branchR!   N(
   R9   R   R   R   R   R   t   loadt   eraset   startR"   (   R   (    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyRd   ‰   s    		c         C   s]   |  j  ƒ  |  j j ƒ  |  j j ƒ  |  j j ƒ  |  j t j t j ƒ } |  j	 j
 | ƒ d S(   sS   Stop coverage, save data to file and set the list of coverage objects to report on.N(   R$   R   t   stopt   combinet   saveR'   t   sysR%   R&   R   t   add(   R   RV   (    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyt   finish–   s    
(   R[   R\   R]   Rd   Rj   (    (    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyR_   †   s   	t
   DistMasterc           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s&   Implementation for distributed master.c         C   s´   |  j  r: t j j |  j  ƒ r: |  j j j j |  j  ƒ n  t j d |  j	 d |  j
 d |  j  ƒ |  _ |  j r} |  j j ƒ  n |  j j ƒ  |  j j ƒ  |  j g |  j j j d <d S(   s/   Ensure coverage rc file rsynced if appropriate.R`   Ra   R!   N(   R   R   R   R   R   t   optiont   rsyncdirt   appendR9   R   R   R   R   Rb   Rc   Rd   R   t   paths(   R   (    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyRd   ¤   s    		c         C   sS   t  j ƒ  | j d <|  j | j d <g  | j j D] } t | ƒ ^ q0 | j d <d S(   sE   Slaves need to know if they are collocated and what files have moved.t   cov_master_hostt   cov_master_topdirt   cov_master_rsync_rootsN(   t   sockett   gethostnamet
   slaveinputR   t   nodemanagert   rootst   str(   R   RY   t   root(    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyt   configure_node´   s    c   	   	   C   s  t  | d ƒ o d | j k s2 |  j j | ƒ d Sd | j k rUd t j ƒ  t j ƒ  t j	 d d ƒ | j d f } t
 j
 d |  j d	 |  j d
 | d |  j ƒ } | j ƒ  t  |  j j d ƒ rø t ƒ  } | j t | j d ƒ ƒ | j j | ƒ n | j d \ | j _ | j _ | j ƒ  | j ƒ  | j d } |  j j j d j | ƒ n  | j j ƒ  } |  j | j | j ƒ } |  j  j! | ƒ d S(   s"   Collect data file name from slave.t   slaveoutputt   cov_slave_node_idNt   cov_slave_datas   %s.%s.%06d.%si    i?B R`   Ra   t   data_suffixR!   t   read_fileobjt   cov_slave_path("   R)   R{   R   Rn   Rs   Rt   R   t   getpidt   randomt   randintR9   R   R   R   Rd   R   t   dataR    R   R   RM   t   linest   arcsRe   Rg   R   Ro   RR   t   _rinfoR'   R%   R&   R   Ri   (	   R   RY   t   errorR~   R   R„   R   t   rinfoRV   (    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyt   testnodedown»   s2    	
	

c         C   s+   |  j  j ƒ  |  j  j ƒ  |  j  j ƒ  d S(   sJ   Combines coverage data and sets the list of coverage objects to report on.N(   R   Re   Rf   Rg   (   R   (    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyRj   â   s    (   R[   R\   R]   Rd   Rz   RŠ   Rj   (    (    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyRk   ¡   s
   			't	   DistSlavec           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   s&   Implementation for distributed slaves.c      	   C   s  t  j ƒ  |  j j d k o2 |  j |  j j d k |  _ |  j s  |  j j d } |  j } g  |  j D] } | j | | ƒ ^ qd |  _ |  j j | | ƒ |  _ n  t	 j	 d |  j d |  j
 d t d |  j ƒ |  _ |  j ré |  j j ƒ  n |  j j ƒ  |  j j ƒ  |  j ƒ  d S(   sH   Determine what data file and suffix to contribute to and start coverage.Rp   Rq   R`   Ra   R~   R!   N(   Rs   Rt   R   Ru   R   t   is_collocatedR   t   replaceR   R9   R   RG   R   R   Rb   Rc   Rd   R"   (   R   t   master_topdirt   slave_topdirR`   (    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyRd   î   s"    		(		c         C   sù   |  j  ƒ  |  j j ƒ  |  j rC |  j j ƒ  |  j |  j j d <n² |  j j ƒ  |  j j ƒ  |  j	 |  j j d <|  j |  j j d <t
 |  j j d ƒ rÍ t ƒ  } |  j j j | ƒ | j ƒ  |  j j d <n( |  j j j |  j j j f |  j j d <d S(   s8   Stop coverage and send relevant info back to the master.R|   R€   t   write_fileobjR}   N(   R$   R   Re   RŒ   Rg   R	   R   R{   Rf   R   R)   R„   R   R   t   getvalueR…   R†   (   R   t   buff(    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyRj   	  s    
		c         C   s   d S(   s&   Only the master reports so do nothing.N(    (   R   R-   (    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyRZ   (  s    (   R[   R\   R]   Rd   Rj   RZ   (    (    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyR‹   ë   s   		(   R]   R   R‚   Rs   Rh   R9   t   coverage.dataR    t   compatR   t   objectR   R_   Rk   R‹   (    (    (    s5   /tmp/pip-build-hU8Cw8/pytest-cov/pytest_cov/engine.pyt   <module>   s   xJ