o
    i                     @   s"  d Z ddlZddl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ZddlmZ ddlmZ eeZeeZdeddfddZG dd dZejdej eddf fddZ!dd Z"dd Z#e de$dej%e& fddZdS )z
API for code coverage collection for use by ddtrace.testing.

The rest of ddtrace.testing should only use the interface exposed in this file to set up code coverage and get
coverage data.
    N)Path)get_coverage_percentage)patch)run_coverage_report)unpatch)$_is_coverage_invoked_by_coverage_run)_is_coverage_patched)ModuleCodeCollector)CoverageLines)catch_and_log_exceptionsworkspace_pathreturnc                 C   s"   t jjjj| gdd t  d S )NT)include_pathscollect_import_time_coverage)ddtraceinternalcoverage	installerinstallr	   start_coverage)r    r   `/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/testing/internal/tracer_api/coverage.pyinstall_coverage   s   r   c                   @   s6   e Zd ZdddZdedejeee	f  fddZ
dS )	CoverageDatar   Nc                 C   s
   d | _ d S N)_covered_lines)selfr   r   r   __init__%   s   
zCoverageData.__init__relative_toc              	   c   sb    | j sd S | j  D ]#\}}z	t||}W n	 ty!   Y qw d| }|| fV  qd S )N/)r   itemsr   r   
ValueErrorto_bytes)r   r   absolute_pathcovered_linesrelative_pathpath_strr   r   r   get_coverage_bitmaps(   s   
z!CoverageData.get_coverage_bitmaps)r   N)__name__
__module____qualname__r   r   tIterabletuplestrbytesr'   r   r   r   r   r   $   s    
$r   c                  c   sF    t  } t }|V  |  |_W d    d S 1 sw   Y  d S r   )r	   CollectInContextr   get_covered_linesr   )coverage_collectorcoverage_datar   r   r   coverage_collection6   s   
"r4   c                   C   
   t   dS )zJ
    Patch coverage.py to obtain coverage percentage from pytest-cov.
    N)patch_coverager   r   r   r   install_coverage_percentage>      
r7   c                   C   r5   )z'
    Undo patching of coverage.py.
    N)unpatch_coverager   r   r   r   uninstall_coverage_percentageE   r8   r:   pytest_cov_statusc                 C   st   | st  rt rt  t }|du rtd dS t|ttfs0t	dt
|jt
|j| dS td| t|S )a  
    Retrieve coverage percentage collected during a pytest-cov test session, if available.

    This retrieves the coverage percentage from coverage.py patching, coverage report upload,
    or generates a report if using 'coverage run' without pytest-cov.
    Nz5Unable to retrieve coverage data for the session spanzDUnexpected format for total covered percentage: type=%s.%s, value=%rzCode coverage: %s%%)r   r   r   _get_coverage_percentagelogdebug
isinstancefloatintwarningtyper)   r(   )r;   lines_pct_valuer   r   r   r   L   s    	
r   )'__doc__
contextlibloggingpathlibr   typingr+   'ddtrace.contrib.internal.coverage.patchr   r<   r   r6   r   r   r9   'ddtrace.contrib.internal.coverage.utilsr   r   ddtrace.internal.coverage.coder	   #ddtrace.internal.coverage.installerr   /ddtrace.internal.test_visibility.coverage_linesr
    ddtrace.testing.internal.loggingr   	getLoggerr(   r=   r   r   contextmanager	Generatorr4   r7   r:   boolOptionalr@   r   r   r   r   <module>   s2    

