
    V:i	C                        d Z ddlZddlmc m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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" 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)Path)Union)CoverageData)filename_suffix   )CentralCovContextWarning)DistCovErrorc                       e Zd ZdS )BrokenCovConfigErrorN)__name__
__module____qualname__     N/root/projects/butler/venv/lib64/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,   r-   s   ` r   _ensure_topdirr0   ,   s9    _T' ' ' ' ' ! 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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_precisionr4   r5   covcombining_cov	data_fileset
node_descsfailed_workersr%   fspathr   r#   r'   is_collocatedstarted)r(   r3   r4   r5   s       r   __init__zCovController.__init__B   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_topdirV   sB      xzz

r   c                 F    d| _         | j                                         d S NF)rE   r=   stopr(   s    r   pausezCovController.pause]   s    r   c                 F    | j                                          d| _        d S NT)r=   startrE   rL   s    r   resumezCovController.resumeb   s    r   c                     d| _         d S rO   rE   rL   s    r   rP   zCovController.startg   s    r   c                     d| _         d S rJ   rS   rL   s    r   finishzCovController.finishj   s    r   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_descm   s3     (..x9P9I9PR^_a`a_aRb9cdddr   c                  F    t          j        d          \  } }| dk     rd} | S )N)P      )fallback(   r]   )shutilget_terminal_size)width_s     r   	get_widthzCovController.get_widths   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

)	hasattrrg   re   sysrY   maxlenrstripr   )r(   streamstxt	fullwidthNfilllines           r   rg   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                 2    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  t9          |                              d!          5 }	 j                            d|	d "          }ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   |                    d#| d           d$ j         v r j         d$         }t           j        d          5  t9          |                              d%          5 }	 j                            d|	d "          }ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   |                    d&| d           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.Nr4   T)show_missingignore_errorsfiler   rd   z
coverage:  coveragerj   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   )r8   ).0xr(   s     r   	<genexpr>z(CovController.summary.<locals>.<genexpr>   s*      FFqDO#FFFFFFr   )termterm-missingr   )rx   ry   rz   	precisionzskip-coveredskip_coveredannotate)ry   	directory)ry   rz   z)Coverage annotated source written to dir z1Coverage annotated source written next to source
htmlzCoverage HTML written to dir xml)ry   outfilezCoverage XML written to file jsonz!Coverage JSON written to file %s
markdownw)ry   rz   output_formatz.Coverage Markdown information written to file zmarkdown-appendaz/Coverage Markdown information appended to file lcovzCoverage LCOV written to file r   ) r8   r    r=   reportr   rn   rA   rg   joinsortedrB   r   gatewayidanyr<   
isinstancedictvaluesupdater   html_reportr4   html_dir
xml_report
xml_outputjson_reportjson_outputr   openlcov_reportlcov_output)
r(   rp   total	node_descnoder3   r   annotate_diroutputoutput_files
   `         r   summaryzCovController.summary   sm
     	^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{||| ((_Z0F8,, l l&\\&&s++ l{ HOO$[`jOkkEl l l l l l l l l l l l l l ll l l l l l l l l l l l l l l LLT&TTTUUU //_%67F8,, l l&\\&&s++ l{ HOO$[`jOkkEl l l l l l l l l l l l l l ll l l l l l l l l l l l l l l LLU6UUUVVV 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#TS=1T=T	TT	TTT##WV0$W0V4	4W7V4	8WWW>Y  Y$'Y$)r   r   r   __doc__argparse	Namespacer   objectstrrF   
contextlibcontextmanagerrH   r0   rM   rQ   rP   rU   r   r[   re   rg   r   r   r   r   r2   r2   ?   s7       :: 2 E$,<O Y^_ceh_hYi    (      ^   ^     e e \e
   \  4 e e ^e e er   r2   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                 X   t          j        | j        | j        d| j                  | _        | j        j        j        dk    r%d}t          j	        t          |          d           t          j        | j        | j        t          d           dt          j                            | j        j        j                  | j                  | _        | j        s| j                                         | j                                         t)                                                       d S )	NTsourcebranchdata_suffixconfig_filetest_functionzDetected dynamic_context=test_function in coverage configuration. This is unnecessary as this plugin provides the more complete --cov-context option.r   )
stacklevel.combiner   r   r   r?   r   )r|   Coverager7   r;   r9   r=   r4   dynamic_contextwarningswarnr   r   r%   pathabspathr?   r>   r:   eraserP   super)r(   message	__class__s     r   rP   zCentral.start  s   $??	
 
 
 8?*o==f  M27;;JJJJ%.??*400:::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   rU   r=   rK   saver>   loadcombiner[   rl   rY   rZ   rA   add)r(   r   r   s     r   rU   zCentral.finish   s     	%&&s|S5EFF	I&&&&&r   )r   r   r   r   r0   rP   rU   __classcell__r   s   @r   r   r      sm        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                 f   t          j        | j        | j        d| j                  | _        | j        j        j        dk    rt          d          d| j        _	        d| j        _
        d| j        _        t          j        | j        | j        t          d           dt          j                            | j        j        j                  | j                  | _        | j        s| j                                         | j                                         | j        g| j        j        j        d<   d S )	NTr   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.Fr   r   r   )r|   r   r7   r;   r9   r=   r4   r   r	   _warn_no_data_warn_unimported_source_warn_preimported_sourcer   r%   r   r   r?   r>   r:   r   rP   r'   pathsrL   s    r   rP   zDistMaster.start4  s   $??	
 
 
 8?*o==B  
 "'+0(,1)%.??*400:::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>X  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_nodeQ  s[     	#)#5#7#7%)[*X*XAQAW*X*X*X 	
 	
 	
 	
 	
r   c                 X   t          |di           }d|vr| j                            |           dS d|v rdt          j                    t          j                    t          j        dd          |d         fz  }t          |          }|
                    |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 )suffixcov_worker_pathr   )r   rB   appendr   r   r%   getpidrandomrandintr   loadsr=   r4   r   r   _rinfor[   rY   rZ   rA   r   )	r(   r   errorr   r   cov_datar   rinfor   s	            r   testnodedownzDistMaster.testnodedown\  s.   
 ~r22v--&&t,,,F &&)"$$	q&))+,	- K $"  H NN6"34555+,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)r=   rK   r   r>   r   r   rL   s    r   rU   zDistMaster.finish|  sb    
 	%r   N)	r   r   r   r   r0   rP   r   r   rU   r   r   r   r   r   1  sm        008 8 ^88	
 	
 	
' ' '@ 	 	 ^	 	 	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          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        d| 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   Tr   F)r   r   r4   r   r'   rD   r7   r9   r   r|   r   r;   r=   r   rP   r   )r(   r   r   r   s    @@r   rP   zDistWorker.start  s      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 $??	
 
 
 ,1(r   c                    t                                                       | j                                         | j        r/| j                                         | j        | j        j        d<   dS | j        	                                 | j                                         | j        
                                                                }| j        j                            | j        | j        |d           dS )z8Stop coverage and send relevant info back to the master.r   )r   r   r   N)r   rU   r=   rK   rD   r   r5   r4   r   r   get_datadumpsr   r'   )r(   datar   s     r   rU   zDistWorker.finish  s     	 	 HMMOOO >B[DK$%9:::HHMMOOO 8$$&&,,..DK$++'+{*.+'+     r   c                     dS )z&Only the master reports so do nothing.Nr   )r(   rp   s     r   r   zDistWorker.summary  s      r   )	r   r   r   r   r0   rP   rU   r   r   r   s   @r   r   r     s}        11    ^8     ^B5 5 5 5 5 5 5r   r   )'r   builtins@py_builtins_pytest.assertion.rewrite	assertionrewrite
@pytest_arr   r   r   r.   r%   r   ra   r   rl   r   pathlibr   typingr   r|   coverage.datar   coverage.sqldatar   r{   r   r	   	Exceptionr   r   r   r    r0   r2   r   r   r   r   r   r   <module>r     sG   > >                        				    



               & & & & & & , , , , , , & & & & & &      	 	 	 	 	9 	 	 	        # # #! ! !&} } } } } } } }@/' /' /' /' /'m /' /' /'dU U U U U U U UpC5 C5 C5 C5 C5 C5 C5 C5 C5 C5r   