
    Vh.                       d Z ddlmZ ddlmZ ddlZddlZddlZ	ddl
mZmZ ddlmZ ddlmZmZmZmZ ddlmZmZmZ dd	lmZ dd
lmZmZ ddlmZmZ ddl m!Z!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/  e	j`                  d      Z1ddZ2ddZ3 G d de      Z4ddZ5ddZ6ddZ7	 	 	 	 	 	 	 	 ddZ8d dZ9 G d de.      Z:y)!zCombine code coverage files.    )annotationsN   )walk_compile_targetswalk_powershell_targets)read_text_file)ANSIBLE_TEST_TOOLS_ROOTdisplayApplicationErrorraw_command)
ResultTypewrite_json_filewrite_json_test_results)Delegate)data_contextPayloadConfig)DockerConfigRemoteConfig)	HostStateprepare_profiles   )enumerate_python_arcsenumerate_powershell_linesget_collection_path_regexesget_all_coverage_filesget_python_coverage_filesget_python_modulesget_powershell_coverage_filesinitialize_coverageCOVERAGE_OUTPUT_FILE_NAMECOVERAGE_GROUPSCoverageConfigPathCheckerTValueCoverageCombineConfigc                2    t        |       }t        | |       y)z;Patch paths in coverage files and merge into a single file.N)r   combine_coverage_files)args
host_states     `/home/dcms/DCMS/lib/python3.12/site-packages/ansible_test/_internal/commands/coverage/combine.pycommand_coverage_combiner*   D   s    !$'J4,    c           	        | j                   rt        | j                  t        t        f      rt               }|D cg c]M  }t        j                  j                  |      j                  d      d   j                  d      dd ddgk(  sL|O }}|s
t               |D cg c]@  }|t        j                  j                  |t               j                  j                        fB c}dfd}t               j                  |       t!        |	      t#        |       t%        | |      z   }|D ]  }t'        j(                  d
|z  d        |S c c}w c c}w )z:Combine coverage and return a list of the resulting files.=.N   coveragecombinedc                    t        j                  dt              z  d       | j                  }|j	                         y)z0Add the coverage files to the payload file list.z2Including %d exported coverage file(s) in payload.r   	verbosityN)r	   infolenfilesextend)payload_configr8   pairss     r)   coverage_callbackz1combine_coverage_files.<locals>.coverage_callbackV   s6    QTWX]T^^jkl&,,U#r+   )r(   zGenerated combined output: %sr   r4   )r:   r   returnNone)delegate
isinstance
controllerr   r   r   ospathbasenamesplitExportedCoverageDataNotFoundrelpathr   contentrootregister_payload_callbackr   $_command_coverage_combine_powershell _command_coverage_combine_pythonr	   r6   )r'   r(   pathsrC   exported_pathsr<   r;   s         @r)   r&   r&   J   sC   }}dool'CD*,E/4  Jt8H8H8N8T8TUX8YZ\8]8c8cdg8hikjk8lq{  ~H  qI  9Id  JN  J!244\jkTXdBGGOOD,.2H2H2M2MNOkE$ N445FG*--069YZ^`j9kkE J4t;qIJ L- J
 ls   AEE!AEc                  $     e Zd ZdZd fdZ xZS )rF   zDException when no combined coverage data is present yet is required.c                Z    t         |   dt        j                  j                  z         y )NzCoverage data must be exported before processing with the `--docker` or `--remote` option.
Export coverage with `ansible-test coverage combine` using the `--export` option.
The exported files must be in the directory: %s/)super__init__r   COVERAGErelative_path)self	__class__s    r)   rR   z%ExportedCoverageDataNotFound.__init__k   s*    ?AKATATAbAbc	
r+   )r=   r>   __name__
__module____qualname____doc__rR   __classcell__rV   s   @r)   rF   rF   h   s    N
 
r+   rF   c           	        t        | |      }t               }t               }dd}d}t        | t              }t        | ||      }t               \  }	}
|D ]  }|dz  }t        j                  d|t        |      |fz  d       t        | |      }|t        j                  d|z         Ut        ||||	|
      D ]c  \  }}| j                  rt        j                  j!                  |      }||vri ||<   ||   }||vrt#               ||<   ||   j%                  |       e  g }| j                  r-t        j                  j'                  | j                  d      }d	}n>t        j                  j'                  t(        j*                  j                  t,              }d}t/        | |	      }t1        |      D ]  }||   }||z   |z   }| j2                  r|j5                  |      }|D ]3  }|j7                  |      s|j9                  |t;        ||         i       5 | j<                  r!|j9                  t?        d
 |D                     |jA                          |s|jC                  |        |jE                          t1        |      S )zDCombine Python coverage files and return a list of the output files.c                0    | D ci c]  }|dh c}S c c}w )N)r   r    )source_pathsrC   s     r)   _default_stub_valuez=_command_coverage_combine_python.<locals>._default_stub_value{   s    +784vh888s   r   r   [%4d/%4d] %sr0   r4   %Unexpected name for coverage file: %s =coverage.combinedc              3  *   K   | ]  }|d    g f  ywr   Nr`   ).0sources     r)   	<genexpr>z3_command_coverage_combine_python.<locals>.<genexpr>   s     !Hf6!9b/!Hs   )ra   	list[str]r=   zdict[str, set[tuple[int, int]]])#r   r   r   _get_coverage_targetsr   _build_stub_groupsr   r	   r6   r7   get_coverage_groupwarningr   exportrB   rC   rG   setupdatejoinr   rS   r   r"   sortedexplainCoverageData
check_pathadd_arcslistalldictwriteappendreport)r'   r(   r1   modulescoverage_filesrb   countersourcesgroupscollection_search_recollection_sub_recoverage_filegroupfilenamearcsarc_dataoutput_filessuffixpath_checkeroutput_fileupdateds                        r)   rL   rL   s   sf   "44H "G.0N9 G#D*>?Gg/BCF.I.K++' ,1^wN0C]&SS_`a"47=OOCmST3M8WVjl}~ 	,NHd{{77??84F" "ue}Hx'%(U"X%%d+	,,0 L{{T[["5%Z%8%8%=%=?XYt%9:L -%=#e+f4<<''4  	CH**84hXh-?(@AB		C 88T!H!HHI,--0 ,r+   c                0   t               }dd}d}t        | t              }t        | ||      }t	               \  }}|D ]  }|dz  }t        j                  d|t        |      |fz  d       t        | |      }	|	t        j                  d|z         Ut        |||      D ]|  \  }
}| j                  rt        j                  j                  |
      }
|	|vri ||	<   ||	   }|
|vri ||
<   ||
   }|j                         D ]  \  }}|j!                  |d      |z   ||<    ~  g }t#        |       t%        |      D ]:  }	t'        fd||	   j                         D              }| j(                  r0|D cg c]  \  }}||vs| }}}|j+                   ||             | j,                  rr| j                  rMt        j                  j/                  | j                  |	d	z         }t1        ||d
       |j3                  |       t4        |	z   dz   }t7        t8        j:                  ||d
       |j3                  t        j                  j/                  t8        j:                  j                  |             = j=                          t%        |      S c c}}w )zHCombine PowerShell coverage files and return a list of the output files.c                    dt         j                  j                  t        d      g}|j	                  |        t        j                  t        |d      d         }t        d |D              S )Npwshzcoverage_stub.ps1T)capturer   c              3  P   K   | ]  }|d    t        d |d   D              f   yw)Pathc              3  $   K   | ]  }|d f 
 ywrh   r`   )ri   lines     r)   rk   z^_command_coverage_combine_powershell.<locals>._default_stub_value.<locals>.<genexpr>.<genexpr>   s     $F4dAY$Fs   LinesN)r|   )ri   ds     r)   rk   zT_command_coverage_combine_powershell.<locals>._default_stub_value.<locals>.<genexpr>   s(     WAQvY$F1W:$F FGWs   $&)	rB   rC   rt   r   r9   jsonloadsr   r|   )ra   cmdstubss      r)   rb   zA_command_coverage_combine_powershell.<locals>._default_stub_value   sU    rww||$;=PQR

< 

;sD9!<=WQVWWWr+   r   r   rc   r0   r4   rd   c              3  P   K   | ]  \  }}j                  |      s||f  y w)N)rx   )ri   r   datar   s      r)   rk   z7_command_coverage_combine_powershell.<locals>.<genexpr>   s)     .(D]i]t]tu}]~h-s   &	&rf   F)	formattedz-powershell)ra   rl   r=   zdict[str, dict[int, int]])r   rm   r   rn   r   r	   r6   r7   ro   rp   r   rq   rB   rC   rG   itemsgetr"   ru   r|   r{   rs   rv   rt   r   r~   r   r   r   rS   r   )r'   r   rb   r   r   r   r   r   r   r   r   hitscoverage_datafile_coverageline_no	hit_countr   rj   _source_line_countmissing_sourcesr   r   s                        @r)   rK   rK      s   24NX G#D*ABGg/BCF.I.K++' S1^wN0C]&SS_`a"47=OOCmST8H\^op 	SNHd{{77??84F" "u"5MM},*,h')(3M&*jjl S")6):):7A)F)Rg&S	SS6 Lt$L UF5MDWDWDY88HOo*D&2DSYanSnvoOo  !4_!EF||{{ ggll4;;@T8TU]eL##K03e;mKK#J$7$7m_deZ-@-@-E-E{ ST%U( ,% ps   3J Jc                2   g }| j                   s| j                  r| |d      D ]`  }t        j                  j	                  |j                        }t        t        |      j                               }|j                  ||f       b |j                          |S )zzReturn a list of files to cover and the number of lines in each file, using the given function as the source of the files.F)include_symlinks)
r{   stubrB   rC   abspathr7   r   
splitlinesr~   sort)r'   	walk_funcr   targettarget_pathtarget_liness         r)   rm   rm     sy    Gxx499  7 	8F''//&++6K~k:EEGHLNNK67	8 	Nr+   c                    i }| j                   rkg }|g}d}d}|D ]6  \  }}	|j                  |       ||	z  }||kD  s"d}g }|j                  |       8 t        |      D ]  \  }
}|s	 ||      |d|
dz   z  <    |S )z
    Split the given list of sources with line counts into groups, maintaining a maximum line count for each group.
    Each group consists of a dictionary of sources and default coverage stubs generated by the provided default_stub_value function.
    i  r   z
=stub-%02dr   )r   r~   	enumerate)r'   r   default_stub_valuer   
stub_groupstub_groupsstub_line_limitstub_line_countrj   source_line_count
stub_indexs              r)   rn   rn   !  s     Fyy "
!l )0 	/%F%f%00O0"#
"":.	/ '0&< 	U"J
6H6TF<:>23		U Mr+   c                   t         j                  j                  |      j                  dd      }t	        |      dk7  s|d   j                  d      syt        |d   |d   |d   |d	   
      }t        |d	         }d}t        D ]A  }|| j                  v r|d||   z  z  }| j                  s*|d|j                  |d      z  z  }C | j                  r|j                  d      }|S )zeReturn the name of the coverage group for the specified coverage file, or None if no group was found.r-         z	coverage.Nr   r   r0   r   )commandr   environmentversion)r   re   z=%svarious)rB   rC   rD   rE   r7   
startswithr|   r    group_byrq   r   lstrip)r'   r   partsnamesexport_namesr   parts          r)   ro   ro   D  s    GG]+11#q9E
5zQeAh11+>aQx!Ha	E aL E ?4== UU4[((E[[U\--dI>>>E	? {{S!Lr+   c                  $     e Zd ZdZd fdZ xZS )r$   z/Configuration for the coverage combine command.c                   t         |   |       |j                  rt        |j                        n	t               | _        |j                  | _        |j
                  | _        d|v r|j                  | _        y d| _        y )Nrq   F)rQ   rR   r   	frozensetr{   r   rq   )rU   r'   rV   s     r)   rR   zCoverageCombineConfig.__init__g  s\    DHMM	$--(@W`Wb))	 +3d*:4;;r+   )r'   zt.Anyr=   r>   rW   r]   s   @r)   r$   r$   d  s    9F Fr+   )r'   r$   r=   r>   )r'   r$   r(   r   r=   rl   )r'   r$   r=   rl   )r'   r$   r   z
c.Callabler=   list[tuple[str, int]])r'   r$   r   r   r   z*c.Callable[[list[str]], dict[str, TValue]]r=   zdict[str, dict[str, TValue]])r'   r$   r   strr=   zt.Optional[str]);r[   
__future__r   collections.abcabccrB   r   typingtr   r   r   ior   utilr   r	   r
   r   util_commonr   r   r   executorr   r   r   r   host_configsr   r   provisioningr   r   re   r   r   r   r   r   r   r   r   r   r    r!   r"   TypeVarr#   r*   r&   rF   rL   rK   rm   rn   ro   r$   r`   r+   r)   <module>r      s    " "  	  
  


    
8	-<
#3 
N bG T& 
 "  C  "	 F@FN Fr+   