
    1~h@                     T   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	m
Z
 ddlmZ ddlZddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ  G d de      Z G d d      Zej4                  d        Zd Zd Z G d d      Z G d de      Z G d de      Z  G d de      Z!y)z8Coverage controllers for use by pytest-cov and nose-cov.    N)StringIO)Path)CoverageDatafilename_suffix   )CentralCovContextWarning)DistCovError)cleanupc                       e Zd Zy)BrokenCovConfigErrorN)__name__
__module____qualname__     Z/var/www/peopleoo.sandbox-dev.co.uk/venv/lib/python3.12/site-packages/pytest_cov/engine.pyr   r      s    r   r   c                       e Zd Zed        Zy)	_NullFilec                      y Nr   )vs    r   writez_NullFile.write   s    r   N)r   r   r   staticmethodr   r   r   r   r   r      s     r   r   c              #      K   t        | |      }	 t        | |t        j                  |             d  t        | ||       y # t        | ||       w xY wwr   )getattrsetattrcopy)objattrbackups      r   _backupr"   !   sG     S$F#T499V,-T6"T6"s   A$A AAAc                 B     t        j                          fd       }|S )Nc                    	 t        j                         }t        j                  | j
                         	  | g|i ||t        j                  |       S S # t        $ r d }Y Qw xY w# |t        j                  |       w w xY wr   )r   cwdOSErroroschdirtopdir)selfargskwargsoriginal_cwdmeths       r   ensure_topdir_wrapperz-_ensure_topdir.<locals>.ensure_topdir_wrapper,   s    	 88:L
 		'.t.v.'& (  	   L	  '& (s   A A, A)(A),B)	functoolswraps)r.   r/   s   ` r   _ensure_topdirr2   +   s&    __T' ' ! r   c                 "    t        d       d|  S )NT.r   )names    r   _data_suffixr6   >   s    d#$AdV,,r   c                       e Zd ZdZddZej                  d        Zed        Z	ed        Z
ed        Zed        Zed	        Zed
        Zed        Zy)CovControllerz0Base class for different plugin implementations.Nc                 "   || _         || _        || _        || _        || _        || _        || _        d| _        d| _        d| _	        t               | _        g | _        t        j                  t        j                                | _        d| _        y)z8Get some common config used by multiple derived classes.N)
cov_source
cov_report
cov_config
cov_append
cov_branchconfignodeidcovcombining_cov	data_fileset
node_descsfailed_workersr'   fspathr   r%   r)   is_collocated)r*   r:   r;   r<   r=   r>   r?   r@   s           r   __init__zCovController.__init__E   sx    $$$$$!% ii
+!r   c              #      K   t        j                         }t        j                  | j                         d  t        j                  |       y wr   )r   r%   r'   r(   r)   )r*   r-   s     r   ensure_topdirzCovController.ensure_topdirW   s0     xxz

s   AAc                 X    | j                   j                          | j                          y r   )rA   stop	unset_envr*   s    r   pausezCovController.pause^   s    r   c                 X    | j                   j                          | j                          y r   )rA   startset_envrO   s    r   resumezCovController.resumec   s    r   c                    | j                   "t        j                  t        j                  d<   n:t        j                  j	                  | j                         t        j                  d<   t        | j                        }|j                         r5t        j                  |j                               t        j                  d<   n!t        j                  t        j                  d<   t        j                  j                  | j                  j                  j                        t        j                  d<   | j                  rdt        j                  d<   yy)zPPut info about coverage into the env so that subprocesses can activate coverage.NCOV_CORE_SOURCECOV_CORE_CONFIGCOV_CORE_DATAFILEenabledCOV_CORE_BRANCH)r:   r'   pathsepenvironjoinr   r<   existsrG   resolvepathabspathrA   r?   rC   r>   )r*   config_files     r   rS   zCovController.set_envh   s     ??",.JJBJJ(),.JJOODOO,LBJJ()4??+,.IIk6I6I6K,LBJJ(),.JJBJJ()*,''//$((//:S:S*T

&'??,5BJJ() r   c                  D   t         j                  j                  dd       t         j                  j                  dd       t         j                  j                  dd       t         j                  j                  dd       t         j                  j                  dd       y)zRemove coverage info from env.rV   NrW   rX   rZ   COV_CORE_CONTEXT)r'   r\   popr   r   r   rN   zCovController.unset_envy   sc     	

($/


($/


*D1


($/


)40r   c                 F    dj                  |  dj                   |dd        S )z"Return a description of this node.zplatform {}, python {}z{}.{}.{}-{}-{}N   )format)platformversion_infos     r   get_node_desczCovController.get_node_desc   s0     (..x9P9I9P9PR^_a`aRb9cddr   c                     t        | d      r| j                  ||       y t        dt        |      z
  d      }|dz  }|dz  }||z   d| d|||z   z   d}| j	                  |       y )NsepD       
)hasattrrm   maxlenr   )streamstxt	sep_totalsep_len	sep_extraouts          r   rm   zCovController.sep   st    65!JJq#Vc#h.3I1nG!AI[M3%qg	.A)B(C2FCLLr   c                     d} j                   sBt         j                  d      5   j                  j                  ddt              cddd       S t         j                        dk(  r0 j                  |dddj                   j                                nA j                  |dd	       t         j                        D ]  } j                  |d
|          j                  r] j                  |dd       |j                  d        j                  D ]*  }|j                  |j                  j                   d       , t         fddD              rd j                   v xs dd|d}t         j                   t               xr d j                   j#                         v }|j%                  d|xs di       t         j                  d      5    j                  j                  d!i |}ddd       d j                   v r j                   d   }t         j                  d      5   j                  j'                  d|       ddd       t         j                  d      5   j                  j                  dt              }ddd       |r|j                  d| d       n|j                  d       d j                   v r j                   d   }t         j                  d      5   j                  j)                  d|      }ddd       |j                  d|  j                  j*                  j,                  n| d       d j                   v r j                   d   }t         j                  d      5   j                  j/                  d|      }ddd       |j                  d|  j                  j*                  j0                  n| d       d j                   v r j                   d   }t         j                  d      5   j                  j3                  d|      }ddd       |j                  d|  j                  j*                  j4                  n|z         d j                   v r j                   d   }t         j                  d      5   j                  j7                  d|        j                  j                  dt              }ddd       |j                  d |  j                  j*                  j8                  n| d       |S # 1 sw Y   xY w# 1 sw Y   ;xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   GxY w# 1 sw Y   xY w# 1 sw Y   AxY w# 1 sw Y   xY w)"zProduce coverage reports.Nr?   T)show_missingignore_errorsfiler   -z
coverage:  coveragerp   zcoverage: failed workerszlThe following workers failed to return coverage data, ensure that pytest-cov is installed on these workers.
rq   c              3   :   K   | ]  }|j                   v   y wr   )r;   ).0xr*   s     r   	<genexpr>z(CovController.summary.<locals>.<genexpr>   s     FqDOO#Fs   )termterm-missingr   zskip-coveredskip_coveredannotate)r~   	directory)r~   r   z)Coverage annotated source written to dir z1Coverage annotated source written next to source
htmlzCoverage HTML written to dir xml)r~   outfilezCoverage XML written to file jsonz!Coverage JSON written to file %s
lcovzCoverage LCOV written to file r   )r;   r"   rA   reportr   rt   rE   rm   r]   sortedrF   r   gatewayidany
isinstancedictvaluesupdater   html_reportr?   html_dir
xml_report
xml_outputjson_reportjson_outputlcov_reportlcov_output)	r*   ru   total	node_descnodeoptionsr   annotate_diroutputs	   `        r   summaryzCovController.summary   s    8, ^xxDS\]^ ^ t1$HHVSJrwwt/G.H"IJHHVS*-#DOO4 6	56 HHVS"<=LL  I  J++ 50345 F-EFF!/4??!B Kt!%G
 &doot<kSWSbSbSiSiSkAkLNNNL,@DAB8, 3'2'23 (??:6L8, N!!!MN
 8, LdKLHVXYZQR T__$__V,F8, S,,46,RSLL8U[Uc9Q9Qio8pprst DOO#__U+F8, P++$+OPLL8W]We9S9Skq8rrtuv T__$__V,F8, Q,,4,PQLL=`f`nA\A\tz{| T__$__V,F8, L$$4$H dKL LL9Y_Yg$((//:U:Ums9ttvwx_^ ^63 3N N
L LS SP PQ QL Ls_   "TT)+T6'"U-U=UU*?U7T&)T36U UUU'*U47V )NN)r   r   r   __doc__rI   
contextlibcontextmanagerrK   r2   rP   rT   rS   r   rN   rk   rm   r   r   r   r   r8   r8   B   s    :"$       6 6  1 1 e e
   T Tr   r8   c                   0    e Zd ZdZed        Zed        Zy)Centralz)Implementation for centralised operation.c                    t                t        j                  | j                  | j                  t        d      | j                        | _        | j                  j                  j                  dk(  r"d}t        j                  t        |      d       t        j                  | j                  | j                  t        d      t        j                  j                  | j                  j                  j                         | j                        | _        | j$                  s| j                  j'                          | j                  j)                          | j+                          y )	Ncsourcebranchdata_suffixrb   test_functionzDetected dynamic_context=test_function in coverage configuration. This is unnecessary as this plugin provides the more complete --cov-context option.r   )
stacklevelccr   r   r   rC   rb   )r   r   Coverager:   r>   r6   r<   rA   r?   dynamic_contextwarningswarnr	   r'   r`   ra   rC   rB   r=   eraserR   rS   )r*   messages     r   rR   zCentral.start   s    	$$????$S)	
 88??**o=f  MM27;J%..????$T*ggoodhhoo&?&?@
 HHNNr   c                    | j                          | j                  j                          | j                  j                          | j                  | _        | j                  j                          | j                  j                          | j                  j                          | j                  t        j                  t        j                        }| j                  j                  |       y)zSStop coverage, save data to file and set the list of coverage objects to report on.N)rN   rA   rM   saverB   loadcombinerk   sysri   rj   rE   add)r*   r   s     r   finishzCentral.finish  s     	%%&&s||S5E5EF	I&r   N)r   r   r   r   r2   rR   r   r   r   r   r   r      s+    3 < ' 'r   r   c                   <    e Zd ZdZed        Zd Zd Zed        Zy)
DistMasterz&Implementation for distributed master.c                 B   t                t        j                  | j                  | j                  t        d      | j                        | _        | j                  j                  j                  dk(  rt        d      d| j                  _        d| j                  _        d| j                  _        t        j                  | j                  | j                  t        d      t        j                  j!                  | j                  j                  j"                        | j                        | _        | j&                  s| j                  j)                          | j                  j+                          | j,                  g| j                  j                  j.                  d<   y )	Nmr   r   zDetected dynamic_context=test_function in coverage configuration. This is known to cause issues when using xdist, see: https://github.com/pytest-dev/pytest-cov/issues/604
It is recommended to use --cov-context instead.Fmcr   r   )r   r   r   r:   r>   r6   r<   rA   r?   r   r
   _warn_no_data_warn_unimported_source_warn_preimported_sourcer'   r`   ra   rC   rB   r=   r   rR   r)   pathsrO   s    r   rR   zDistMaster.start!  s   	$$????$S)	
 88??**o=B 
 "'+0(,1)%..????$T*ggoodhhoo&?&?@
 HHNN+/;;-h'r   c           
          |j                   j                  t        j                         | j                  |j
                  j                  D cg c]  }t        |       c}d       yc c}w )zFWorkers need to know if they are collocated and what files have moved.)cov_master_hostcov_master_topdircov_master_rsync_rootsN)workerinputr   socketgethostnamer)   nodemanagerrootsstr)r*   r   roots      r   configure_nodezDistMaster.configure_node@  sT     	#)#5#5#7%)[[AEAQAQAWAW*X3t9*X	
 +Ys   A(c                    t        |di       }d|vr| j                  j                  |       yd|v rxdt        j                         t        j                         t        j                  dd      |d   fz  }t        j                  | j                  | j                  || j                        }|j                          t        j                  d	k  rCt!               }|j#                  t%        |d                |j&                  j)                  |       n@t!        d
d      }|j+                  |d          |j-                         j)                  |       |j/                          |j1                          |d   }| j2                  j4                  j6                  d   j                  |       |j8                  j;                         }| j=                  |j>                  |j                        }	| j@                  jC                  |	       y)z#Collect data file name from worker.workeroutputcov_worker_node_idNcov_worker_dataz%s.%s.%06d.%sr   i?B r   rg   r   Tzshould-not-exist)no_disksuffixcov_worker_pathr   )"r   rF   appendr   r   r'   getpidrandomrandintr   r   r:   r>   r<   rR   rj   r   read_fileobjr   datar   loadsget_datarM   r   rA   r?   r   r   _rinfork   ri   rE   r   )
r*   r   errorr   r   rA   r   r`   rinfor   s
             r   testnodedownzDistMaster.testnodedownK  s   
 ~r2v-&&t, &)""$		q&)+,	- K ##4??4??`ky}  zI  zI  JCIIK$$v-#~!!(62C+D"EF%#D9KL

6"345%%d+HHJHHJ+,DHHOO!!(+2248 ##%&&u~~u7I7IJ	I&r   c                 *   | j                   j                          | j                   j                          | j                  | _         | j                   j	                          | j                   j                          | j                   j                          y)zJCombines coverage data and sets the list of coverage objects to report on.N)rA   rM   r   rB   r   r   rO   s    r   r   zDistMaster.finishs  sU    
 	%%r   N)	r   r   r   r   r2   rR   r   r   r   r   r   r   r   r     s6    08 8<	
&'P 	 	r   r   c                   6    e Zd ZdZed        Zed        Zd Zy)
DistWorkerz'Implementation for distributed workers.c                    t                t        j                         | j                  j                  d   k(  xr& | j
                  | j                  j                  d   k(  | _        | j                  s| j                  j                  d   }| j
                  }| j                  /| j                  D cg c]  }|j                  ||       c}| _        | j                  j                  ||      | _	        t        j                  | j                  | j                  t        d| j                         | j                        | _        | j                  j!                          | j#                          y c c}w )Nr   r   wr   )r   r   r   r?   r   r)   rH   r:   replacer<   r   r   r>   r6   r@   rA   rR   rS   )r*   master_topdirworker_topdirr   s       r   rR   zDistWorker.start  s   	  DKK$;$;<M$NN Lt{{667JKK 	 !! KK334GHM KKM*^b^m^m"nTZ6>>-#O"n"oo55m]SDO $$????$q%67	
 	 #os   1E0c                    | j                          | j                  j                          | j                  r>| j                  j	                          | j
                  | j                  j                  d<   y| j                  j                          | j                  j	                          t        j                  dk  r@t               }| j                  j                  j                  |       |j                         }n(| j                  j                         j!                         }| j                  j                  j#                  | j$                  | j
                  |d       y)z8Stop coverage and send relevant info back to the master.r   r   )r   r   r   N)rN   rA   rM   rH   r   r@   r?   r   r   r   rj   r   r   write_fileobjgetvaluer   dumpsr   r)   )r*   buffr   s      r   r   zDistWorker.finish  s     	 HHMMO >B[[DKK$$%9:HHHHMMO $$v-z++D1}}xx((*002KK$$++'+{{*.++'+r   c                      y)z&Only the master reports so do nothing.Nr   )r*   ru   s     r   r   zDistWorker.summary  s    r   N)r   r   r   r   r2   rR   r   r   r   r   r   r   r     s1    1 6 # #J5r   r   )"r   r   r   r0   r'   r   r   r   r   ior   pathlibr   r   coverage.datar   coverage.sqldatar   r   r	   r
   embedr   	Exceptionr   r   r   r"   r2   r6   r8   r   r   r   r   r   r   <module>r     s    >    	   
     & , &  	9 	  # #!&-f fR0'm 0'f_ _DF5 F5r   