o
    i"                     @   sz  U d dl m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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 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 d dlmZ d dlmZ eeZi Z e!e"e!e"e"f f e#d< eej$%ddZ&zd dl'm(Z( d dl'm)Z* e*dkrdndZ+W n e,y   dZ(dZ+Y nw dd Z-dd Z.d e"fd!d"Z/d#d$ Z0d>d&e1d'e1fd(d)Z2d>d*e(d&e1d'e1fd+d,Z3	d?d*e(d-e"d.ee fd/d0Z4	d?d*e(d1e
j5j6d e"d.ee fd2d3Z7d4ee8 d'e9e:e8e8e8e8e8f  fd5d6Z;d7e(d8ee" d'e!e"e9e:e8e8e8e8e8f  f fd9d:Z<d?d7e(d e"d;ee" d'e"fd<d=Z=dS )@    )groupbyN)Path)Iterable)Optional)Union)COVERAGE_TAG_NAME)TEST_FRAMEWORKS)COVERAGE_LIBRARY)record_code_coverage_empty)record_code_coverage_error)record_code_coverage_files)record_code_coverage_finished)record_code_coverage_started)&get_relative_or_absolute_path_for_path)ModuleCodeCollector)
get_logger)asbool#_global_relative_file_paths_for_cov_DD_USE_INTERNAL_COVERAGEfalseCoverage)version_info)      _executeexecute c                   C   s   t d uS Nr    r   r   [/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/ci_visibility/coverage.pyis_coverage_available*   s   r!   c                 C   s0   d | gddgd}t di |}|dd |S )NFz*/site-packages/*)	data_filesourceconfig_fileomitzrun:parallelTr   )r   
set_option)root_dircoverage_kwargs
cov_objectr   r   r    _initialize_coverage.   s   r*   r'   c                 C   sj   t r+t }ddlm} zt| }W n ty"   tt }Y nw t	|d| |S t
| }|  |S )Nr   )extract_workspace_path_workspace_path)USE_DD_COVERAGEr   CollectInContextddtrace.ext.gitr+   r   
ValueErrorosgetcwdsetattrr*   start)r'   	collectorr+   workspace_pathcoverager   r   r    _start_coverage<   s   r8   c                 C   s0   t rd S t| r| j  | j  | `d S d S r   )r-   _module_has_dd_coverage_enabled_dd_coveragestoperase)moduler   r   r    _stop_coverageP   s   

r>   Fsilent_modereturnc                 C   s.   t rt| dS t| ds|std dS dS )Nr:   z'Datadog Coverage has not been initiatedFT)r-   hasattrlogwarning)r=   r?   r   r   r    r9   Z   s   


r9   coverage_datac                 C   s,   | j rt| j jdkr|std dS dS )Nr   z,No coverage collector or data found for itemFT)
_collectorlendatarB   rC   )rD   r?   r   r   r    _coverage_has_valid_datae   s
   
rH   known_test_name	frameworkc              
   C   s   t tj| trt| tjr|   d S t| ddsd S | j	j
  z| | W d S  tyE } zt  t| W Y d }~d S d }~ww )NT)r?   )r   r	   
COVERAGEPYr-   
isinstancer   r.   	__enter__rH   rE   rG   clearswitch_contextRuntimeErrorr   rB   rC   )rD   rI   rJ   errr   r   r    _switch_coverage_contextm   s   rR   spanc                 C   s   t r5t| tjr3t| dtd}tj|dd}|sd S |tt	
d|i ttj| | d d d  d S t|j}t| sCt  d S ttj| |tt| || | jj  d S )Nr,   /T)include_importedfiles)r-   rL   r   r.   getattrr   report_seen_lines_set_tag_strr   jsondumpsr   r	   rK   __exit__strtrace_idrH   r   build_payloadrE   rG   rN   )rD   rS   r'   rJ   r6   rV   span_idr   r   r    _report_coverage_to_span   s.   

ra   linesc                 C   s\   g }t tt| dd D ]\}}t|}|d d }|d d }||d|ddf q|S )z3Extract the relevant report data for a single file.c                 S   s   | d | d  S )N   r   r   )xr   r   r    <lambda>   s    zsegments.<locals>.<lambda>r   rc   )r   	enumeratesortedlistappend)rb   	_segments_keyggroupr4   endr   r   r    segments   s   rp   r7   contextc                 C   s,   | j r| j js	i S dd t| j j D S )Nc                 S   s0   i | ]\}}|t |trt| nt|qS r   )rL   dictrp   keys).0kvr   r   r    
<dictcomp>   s    z_lines.<locals>.<dictcomp>)rE   rG   ri   items)r7   rq   r   r   r    _lines   s
   ry   test_idc                 C   s   t |}|tvri t|< g }t| | D ]-\}}|t| vr(t||t| |< |r7|t| | |d q|dt| | i qt|dkrLt  tt| t	
d|iS )a  
    Generate a CI Visibility coverage payload, formatted as follows:

    "files": [
        {
            "filename": <String>,
            "segments": [
                [Int, Int, Int, Int, Int],  # noqa:F401
            ]
        },
        ...
    ]

    For each segment of code for which there is coverage, there are always five integer values:
        The first number indicates the start line of the code block (index starting in 1)
        The second number indicates the start column of the code block (index starting in 1). Use value -1 if the
            column is unknown.
        The third number indicates the end line of the code block
        The fourth number indicates the end column of the code block
        The fifth number indicates the number of executions of the block
            If the number is >0 then it indicates the number of executions
            If the number is -1 then it indicates that the number of executions are unknown

    :param coverage: Coverage object containing coverage data
    :param root_dir: the directory relative to which paths to covered files should be resolved
    :param test_id: a unique identifier for the current test run
    )filenamerp   r{   r   rV   )r]   r   ry   rx   r   rj   rF   r
   r   rZ   r[   )r7   r'   rz   root_dir_str
files_datar{   rb   r   r   r    r_      s$   r_   )Fr   )>	itertoolsr   rZ   r1   pathlibr   typingr   r   r   ddtrace(ddtrace.internal.ci_visibility.constantsr   2ddtrace.internal.ci_visibility.telemetry.constantsr   1ddtrace.internal.ci_visibility.telemetry.coverager	   r
   r   r   r   r   $ddtrace.internal.ci_visibility.utilsr   ddtrace.internal.coverage.coder   ddtrace.internal.loggerr   ddtrace.internal.utils.formatsr   __name__rB   r   rr   r]   __annotations__environgetr-   r7   r   r   coverage_versionEXECUTE_ATTRImportErrorr!   r*   r8   r>   boolr9   rH   rR   traceSpanra   intri   tuplerp   ry   r_   r   r   r   r    <module>   st    
	

(!4$
