
    L-PhG                        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	Z	ddl
Z
ddlm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j        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%dS )z8Coverage controllers for use by pytest-cov and nose-cov.    N)StringIO)Path)Union)CoverageDatafilename_suffix   )CentralCovContextWarning)DistCovError)cleanupc                       e Zd ZdS )BrokenCovConfigErrorN)__name__
__module____qualname__     Q/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/pytest_cov/engine.pyr   r      s        Dr   r   c                   $    e Zd Zed             ZdS )	_NullFilec                     d S 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 V  t          | ||           d S # t          | ||           w xY wr   )getattrsetattrcopy)objattrbackups      r   _backupr#   $   so      S$F#T49V,,---T6"""""T6""""s   'A A!c                 F     t          j                    fd            }|S )Nc                    	 t          j                    }n# t          $ r d }Y nw xY wt          j        | j                   	  | g|R i ||t          j        |           S S # |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    	 8::LL 	  	  	   LLL	  		'4.t...v..'&&&& (|'&&&& (s    &&A& &A?)	functoolswraps)r/   r0   s   ` r   _ensure_topdirr3   .   s9    _T' ' ' ' ' ! r   c                 *    t          d           d|  S )NT.r   )names    r   _data_suffixr7   A   s    d##,,d,,,r   c                      e Zd ZdZdej        dedef         dedef         fdZ	e
j        d             Zed             Zed	             Zd
 Zd Zed             Zed             Zed             Zed             Zd Zed             ZdS )CovControllerz0Base class for different plugin implementations.optionsconfigNnodeidc                    |j         | _         |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        || _        || _        d| _        d| _	        d| _
        t                      | _        g | _        t          j        t!          j                              | _        d| _        d| _        dS )z8Get some common config used by multiple derived classes.NF)
cov_source
cov_report
cov_config
cov_append
cov_branchcov_precisionr;   r<   covcombining_cov	data_fileset
node_descsfailed_workersr(   fspathr   r&   r*   is_collocatedstarted)r+   r:   r;   r<   s       r   __init__zCovController.__init__H   s    !,!,!,!,!,$2!%% i

++!r   c              #      K   t          j                    }t          j        | j                   d V  t          j        |           d S r   )r   r&   r(   r)   r*   )r+   r.   s     r   ensure_topdirzCovController.ensure_topdir\   sB      xzz

r   c                 n    d| _         | j                                         |                                  d S NF)rL   rD   stop	unset_envr+   s    r   pausezCovController.pausec   s.    r   c                 n    | j                                          |                                  d| _        d S NT)rD   startset_envrL   rT   s    r   resumezCovController.resumei   s,    r   c                     d| _         d S rW   rL   rT   s    r   rX   zCovController.starto   s    r   c                     d| _         d S rQ   r\   rT   s    r   finishzCovController.finishr   s    r   c                 :   | j         t          j        t          j        d<   n1t          j                            | j                   t          j        d<   t          | j                  }|                                r4t          j        |	                                          t          j        d<   nt          j        t          j        d<   t          j
                            | j        j        j                  t          j        d<   | j        rdt          j        d<   dS dS )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@   existsrJ   resolvepathabspathrD   r;   rF   rB   )r+   config_files     r   rY   zCovController.set_envu   s     ?",.JBJ()),.JOODO,L,LBJ()4?++ 	7,.Ik6I6I6K6K,L,LBJ()),.JBJ()*,'//$(/:S*T*T
&'? 	6,5BJ()))	6 	6r   c                  F   t           j                            dd           t           j                            dd           t           j                            dd           t           j                            dd           t           j                            dd           dS )zRemove coverage info from env.r`   Nra   rb   rd   COV_CORE_CONTEXT)r(   rf   popr   r   r   rS   zCovController.unset_env   s}     	
($///

($///

*D111

($///

)400000r   c                 N    d                     |  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   s3     (..x9P9I9PR^_a`a_aRb9cdddr   c                  F    t          j        d          \  } }| dk     rd} | S )N)P      )fallback(   rw   )shutilget_terminal_size)width_s     r   	get_widthzCovController.get_width   s.     +X>>>q2::Er   c                    t          |d          r|                    ||           d S |                                 }t          j        dk    r|dz  }t          |t          |          z
  dz
  dt          |          z  z  d          }||z  }| d| d| }t          |          t          |                                          z   |k    r||                                z  }|dz  }|                    |           d S )Nsepwin32r	       z

)	hasattrr   r   sysrs   maxlenrstripr   )r+   streamstxt	fullwidthNfilllines           r   r   zCovController.sep   s   65!! 	JJq#((I |w&&
 Q	YS)A-1s1vv:>BBAq5D))S))4))D 4yy3qxxzz??*i77

"FNDLLr   c                 f
    d} j         sOt           j        d          5   j                            ddt                    cddd           S # 1 swxY w Y   t           j                  dk    r3                     |ddd                     j                              nF                     |dd	           t           j                  D ]}                     |d
|             j
        rX                     |dd           |                    d            j
        D ]$}|                    |j        j         d           %t           fddD                       rd j         v pdd| j        d}t!           j         t"                    od j                                         v }|                    d|pdi           t           j        d          5    j        j        d"i |}ddd           n# 1 swxY w Y   d j         v rՉ j         d         }t           j        d          5   j                            d|           ddd           n# 1 swxY w Y   t           j        d          5   j                            dt                    }ddd           n# 1 swxY w Y   |r|                    d| d           n|                    d           d j         v r j         d         }t           j        d          5   j                            d|          }ddd           n# 1 swxY w Y   |                    d| j        j        j        n| d           d j         v r j         d         }t           j        d          5   j                            d|          }ddd           n# 1 swxY w Y   |                    d| j        j        j        n| d           d j         v r j         d         }t           j        d          5   j                            d|          }ddd           n# 1 swxY w Y   |                    d| j        j        j        n|z             d  j         v r j         d          }t           j        d          5   j                            d|            j                            dt                    }ddd           n# 1 swxY w Y   |                    d!| j        j        j        n| d           |S )#zProduce coverage reports.Nr;   T)show_missingignore_errorsfiler	   r~   z
coverage:  coverager   zcoverage: failed workerszlThe following workers failed to return coverage data, ensure that pytest-cov is installed on these workers.

c              3   *   K   | ]}|j         v V  d S r   )r?   ).0xr+   s     r   	<genexpr>z(CovController.summary.<locals>.<genexpr>   s*      FFqDO#FFFFFFr   )termterm-missingr   )r   r   r   	precisionz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#   rD   reportr   r   rH   r   rg   sortedrI   r   gatewayidanyrC   
isinstancedictvaluesupdater   html_reportr;   html_dir
xml_report
xml_outputjson_reportjson_outputlcov_reportlcov_output)	r+   r   total	node_descnoder:   r   annotate_diroutputs	   `        r   summaryzCovController.summary   s     	^8,, ^ ^xDS\]]^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ t1$$HHVS"Irwwt/G/G"I"IJJJJHHVS*---#DO44 6 6	n5555  	5HHVS"<===LL  I  J  J  J+ 5 53334444 FFFF-EFFFFF 
	3!/4?!B Kt!%!/	 G &dot<<kSWSbSiSiSkSkAkLNNNL,@DABBB8,, 3 3'22'223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 ((?:6L8,, N N!!!MMMN N N N N N N N N N N N N N N
 8,, L LdKKL L L L L L L L L L L L L L L SYYYYZZZZQRRR T_$$_V,F8,, S S,,46,RRS S S S S S S S S S S S S S SLLsU[Uc9Q9Qiosssttt DO##_U+F8,, P P++$+OOP P P P P P P P P P P P P P PLLuW]We9S9Skquuuvvv T_$$_V,F8,, Q Q,,4,PPQ Q Q Q Q Q Q Q Q Q Q Q Q Q QLL=`f`nA\A\tz{||| T_$$_V,F8,, L L$$4$HHH dKKL L L L L L L L L L L L L L L LLwY_Yg$(/:U:Umswwwxxxs   "AAAG<<H H 2II"I;"J))J-0J-L99L= L=OOO&QQQ0>S::S>S>)r   r   r   __doc__argparse	Namespacer   objectstrrM   
contextlibcontextmanagerrO   r3   rU   rZ   rX   r^   rY   r   rS   ru   r   r   r   r   r   r   r9   r9   E   sm       :: 2 E$,<O Y^_ceh_hYi    (      ^
   ^
     6 6 ^6  1 1 \1 e e \e
   \  4 U U ^U U Ur   r9   c                   L     e Zd ZdZe fd            Ze fd            Z xZS )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        s| j                                         | j                                         |                                  t-                                                       d S )	Ncsourcebranchdata_suffixrl   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   rF   rl   )r   r   Coverager>   rB   r7   r@   rD   r;   dynamic_contextwarningswarnr
   r(   rj   rk   rF   rE   rA   eraserX   rY   super)r+   message	__class__s     r   rX   zCentral.start  s   			$??$S))	
 
 
 8?*o==f  M27;;JJJJ%.??$T**goodho&?@@
 
 
  	HNNr   c                 
   t                                                       |                                  | j                                         | j                                         | j        | _        | j                                         | j                                         | j                                         | 	                    t          j        t          j                  }| j                            |           dS )zSStop coverage, save data to file and set the list of coverage objects to report on.N)r   r^   rS   rD   rR   saverE   loadcombineru   r   rs   rt   rH   add)r+   r   r   s     r   r^   zCentral.finish5  s     	%&&s|S5EFF	I&&&&&r   )r   r   r   r   r3   rX   r^   __classcell__r   s   @r   r   r     sn        33    ^@ ' ' ' ' ^' ' ' ' 'r   r   c                   J    e Zd ZdZed             Zd Zd Zed             ZdS )
DistMasterz&Implementation for distributed master.c                    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        s| j                                         | j                                         | j        g| j        j        j        d<   d S )	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>   rB   r7   r@   rD   r;   r   r   _warn_no_data_warn_unimported_source_warn_preimported_sourcer(   rj   rk   rF   rE   rA   r   rX   r*   pathsrT   s    r   rX   zDistMaster.startJ  s!   			$??$S))	
 
 
 8?*o==B  
 "'+0(,1)%.??$T**goodho&?@@
 
 
  	HNN+/;-h'''r   c                     |j                             t          j                    | j        d |j        j        D             d           dS )zFWorkers need to know if they are collocated and what files have moved.c                 ,    g | ]}t          |          S r   )r   )r   roots     r   
<listcomp>z-DistMaster.configure_node.<locals>.<listcomp>p  s    *X*X*X3t99*X*X*Xr   )cov_master_hostcov_master_topdircov_master_rsync_rootsN)workerinputr   socketgethostnamer*   nodemanagerroots)r+   r   s     r   configure_nodezDistMaster.configure_nodei  s[     	#)#5#7#7%)[*X*XAQAW*X*X*X 	
 	
 	
 	
 	
r   c                 2   t          |di           }d|vr| j                            |           dS d|v rdt          j                    t          j                    t          j        dd          |d         fz  }t          j
        | j        | j        || j                  }|                                 t          j        d	k     rQt!                      }|                    t%          |d                              |j                            |           nSt!          d
d          }|                    |d                    |                                                    |           |                                 |                                 |d         }| j        j        j        d                             |           |j                                        }|                     |j        |j                  }	| j         !                    |	           dS )z#Collect data file name from worker.workeroutputcov_worker_node_idNcov_worker_dataz%s.%s.%06d.%sr   i?B r   rq   r   Tzshould-not-exist)no_disksuffixcov_worker_pathr   )"r   rI   appendr   r   r(   getpidrandomrandintr   r   r>   rB   r@   rX   rt   r   read_fileobjr   datar   loadsget_datarR   r   rD   r;   r   r   _rinforu   rs   rH   r   )
r+   r   errorr   r   rD   r  rj   rinfor   s
             r   testnodedownzDistMaster.testnodedownt  s   
 ~r22v--&&t,,,F &&)"$$	q&))+,	- K #4?4?`ky}  zI  J  J  JCIIKKK$v--#~~!!(62C+D"E"EFFF%%%%#D9KLLL

6"34555%%d+++HHJJJHHJJJ+,DHO!(+224888 ##%%&&u~u7IJJ	I&&&&&r   c                    | j                                          | j                                          | j        | _         | j                                          | j                                          | j                                          dS )zJCombines coverage data and sets the list of coverage objects to report on.N)rD   rR   r   rE   r   r   rT   s    r   r^   zDistMaster.finish  sb    
 	%r   N)	r   r   r   r   r3   rX   r   r	  r^   r   r   r   r   r   G  sm        008 8 ^8<	
 	
 	
&' &' &'P 	 	 ^	 	 	r   r   c                   R     e Zd ZdZe fd            Ze fd            Zd Z xZS )
DistWorkerz'Implementation for distributed workers.c                    t                       t          j                    | j        j        d         k    o| j        | j        j        d         k    | _        | j        sY| j        j        d         | j        | j        fd| j        D             | _        | j        	                              | _        t          j        | j        | j        t          d| j                   | j                  | _        d| j        _        | j                                         |                                  t'                                                       d S )Nr   r   c                 <    g | ]}|                               S r   )replace)r   r   master_topdirworker_topdirs     r   r   z$DistWorker.start.<locals>.<listcomp>  s(    "n"n"nTZ6>>-#O#O"n"n"nr   wr   F)r   r   r   r;   r   r*   rK   r>   r@   r  r   r   rB   r7   r<   rD   r   rX   rY   r   )r+   r  r  r   s    @@r   rX   zDistWorker.start  s7   			   DK$;<M$NN Lt{67JKK 	 ! 	T K34GHM KM*"n"n"n"n"n^b^m"n"n"n"o55m]SSDO $??$%6%6%677	
 
 
 ,1(r   c                    t                                                       |                                  | j                                         | j        r/| j                                         | j        | j        j	        d<   dS | j        
                                 | j                                         t          j        dk     rBt                      }| j        j                            |           |                                }n+| j                                                                        }| j        j	                            | j        | j        |d           dS )z8Stop coverage and send relevant info back to the master.r   r   )r   r   r   N)r   r^   rS   rD   rR   rK   r   r<   r;   r   r   r   rt   r   r  write_fileobjgetvaluer  dumpsr   r*   )r+   buffr  r   s      r   r^   zDistWorker.finish  s/    	 	 HMMOOO >B[DK$%9:::HHMMOOO $v--zz++D111}}x((**0022K$++'+{*.+'+     r   c                     dS )z&Only the master reports so do nothing.Nr   )r+   r   s     r   r   zDistWorker.summary  s      r   )	r   r   r   r   r3   rX   r^   r   r   r   s   @r   r  r    s}        11    ^< % % % % ^%N5 5 5 5 5 5 5r   r  )&r   r   r   r   r1   r(   r   r{   r   r   r   ior   pathlibr   typingr   r   coverage.datar   coverage.sqldatar   r   r
   r   embedr   	Exceptionr   r   r   r#   r3   r7   r9   r   r   r  r   r   r   <module>r      s`   > >           				    



                     & & & & & & , , , , , , & & & & & &            	 	 	 	 	9 	 	 	        # # #! ! !&- - -I I I I I I I IX3' 3' 3' 3' 3'm 3' 3' 3'l_ _ _ _ _ _ _ _DK5 K5 K5 K5 K5 K5 K5 K5 K5 K5r   