o
    i                     @   sN  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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 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- d dl%m.Z/ d dl%m0Z1 d dl%m2Z2 d dl%m3Z4 d d l%m5Z6 d d!l%m7Z7 d d"l8m9Z9 d d#l8m:Z: d d$l8m;Z; d d%l8m<Z< d d&l8m=Z= d d'l8m>Z> d d(l?m@Z@ d d)l?mAZA d d*l?mBZB d d+l?mCZC d d,lDmEZE d d-lFmGZG d d.lHmIZI d d/lJmKZL eGeMZNd aOePd0eQd0ejRd1d2d3eIejRd4d5d3d6 d7eSfd8d9ZTd7eQeSeSf fd:d;ZUd<d= ZVd>d? ZWd@ejXfdAdBZYdCdD ZZd7e[fdEdFZ\d7e[fdGdHZ]d7e[fdIdJZ^dKe_dLeSdMeSd7e[fdNdOZ`d7e[fdPdQZadRejbjcdSejbjcfdTdUZddVejbjcfdWdXZedYejffdZd[Zgd\d] Zhd7e[fd^d_Zid7eejbjcdf fd`daZjdbejfd7eSfdcddZkd7eSfdedfZld7eejbjcdf fdgdhZmdieSd7eejbjcdf fdjdkZndleSd7eejbjcdf fdmdnZodoejbjcdpeSfdqdrZpd7eSfdsdtZqd7eSfdudvZrdoe_d7eSfdwdxZsd7eSfdydzZtd7eSfd{d|Zud}eSdMeSd7eSfd~dZvdeSd7eSfddZwdeSd7eSfddZxdeSd7eSfddZydVejbjcfddZzdeSfddZ{dejfdKe_d7e[fddZ|deQd7e[fddZ}d7e[fddZ~dejfd7e[fddZdd Zd7e[fddZdeSdeSd7eSfddZdedeQdeQfddZdeQdeQfddZdLeSdeSdRejbjcdejbjcfddZdVejbjcfddZdd Zdd Zdd ZddpeSdeeS deeS fddZdeSfddZdejfdKe_deQfddZdejfdKe_deQfddZdejfdKe_deQfddZdejfdKe_deQfddZdKe_deQfddZddĄ ZddƄ ZdKe_deQfddȄZdKe_deQfddʄZdejdKe_deQfdd̄Zd7ejbjcfdd΄Zd7ejbjcfddЄZd7ejbjcfdd҄Zdejbjcd7ejbjcfddԄZdejbjcfddׄZddل ZdejdKe_deQfddۄZdejfdKe_deQfdd݄ZdS )    N)Optional)Unionconfig)	SPAN_KIND)get_coverage_data)patch)run_coverage_report)unpatch)$_is_coverage_invoked_by_coverage_run)_is_coverage_patched)COMPONENT_VALUE)	FRAMEWORK)KIND)MODULE_OPERATION_NAME)SESSION_OPERATION_NAME)SUITE_OPERATION_NAME)	SpanTypestest)RUNTIME_VERSION)_get_runtime_and_os_metadata)CIVisibility)
EVENT_TYPE)ITR_CORRELATION_ID_TAG_NAME)ITR_UNSKIPPABLE_REASON)	MODULE_ID)MODULE_TYPE)
SESSION_ID)SESSION_TYPE)SKIPPED_BY_ITR_REASON)SUITE_ID)
SUITE_TYPE)TEST)_module_has_dd_coverage_enabled)_report_coverage_to_span)_start_coverage)_stop_coverage)_switch_coverage_context)is_coverage_available)_add_pct_covered_to_span),_add_start_end_source_file_path_data_to_span)#_generate_fully_qualified_test_name)&get_relative_or_absolute_path_for_path)	COMPONENT)
get_logger)asbool)unwrapunittestDD_UNITTEST_OPERATION_NAMEzunittest.test)default&DD_CIVISIBILITY_UNITTEST_STRICT_NAMINGT)_default_serviceoperation_namestrict_namingreturnc                   C   s   dS N  r<   r<   r<   [/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/unittest/patch.pyget_versionF   s   r>   c                   C   s   ddiS )Nr2   *r<   r<   r<   r<   r=   _supported_versionsJ   s   r@   c                   C   s*   t   tjrd S tjtjjd t  d S )Nr   )_initialize_unittest_data_CIVisibilityenabledenableddtracer   r2   !_check_if_code_coverage_availabler<   r<   r<   r=   _enable_unittest_if_not_startedN   s
   
rG   c                   C   sV   t tdsi t_dtjvri tjd< dtjvri tjd< dtjvr)t tjd< d S d S )N_unittest_datasuitesmodulesunskippable_tests)hasattrrB   rH   setr<   r<   r<   r=   rA   V   s   





rA   tracerc                 C   s
   | t _dS )z0Manually sets the tracer instance to `unittest.`N)r2   _datadog_tracer)rN   r<   r<   r=   _set_tracera      
rP   c                   C   s,   t jjrt std dt j_d S d S d S )NzCI Visibility code coverage tracking is enabled, but the `coverage` package is not installed. To use code coverage tracking, please install `coverage` from https://pypi.org/project/coverage/F)rB   	_instance_collect_coverage_enabledr)   logwarningr<   r<   r<   r=   rF   f   s   rF   c                 C   s   t jjot|  S N)rB   rR   rS   _is_skipped_testtest_objectr<   r<   r=   _is_test_coverage_enabledo   s   rZ   c                 C   s:   t | | jd}t| jdr| jjpt|do|jpt| S )Nr;   __unittest_skip__)getattr_testMethodNamerL   	__class__r[   _is_skipped_by_itr)rY   
testMethodr<   r<   r=   rW   s   s   rW   c                 C   s   t | do| jS )N_dd_itr_skip)rL   ra   rX   r<   r<   r=   r_   |   s   r_   argstest_module_suite_path	test_namec                 C   s    t | otj||ot| S rV   )lenrB   rR   _should_skip_pathrW   )rb   rc   rd   rY   r<   r<   r=   _should_be_skipped_by_itr   s
   rg   c                 C   s<   t | }t| }t| }t|||}ttdo|tjd v S )NrH   rK   )$_extract_suite_name_from_test_method_extract_test_method_name_extract_module_file_pathr,   rL   rB   rH   )rY   test_suite_namerd   test_module_pathtest_module_suite_namer<   r<   r=   _is_marked_as_unskippable   s   
rn   test_module_spantest_session_spanc                 C   sX   t d7 a | jtj  d7  < | tjd | tjd |tjd |tjd d S )N   true)_global_skipped_elements_metricsr   ITR_TEST_SKIPPING_COUNT_set_tag_strITR_TEST_SKIPPING_TESTS_SKIPPEDITR_DD_CI_ITR_TESTS_SKIPPED)ro   rp   r<   r<   r=   %_update_skipped_elements_and_set_tags   s   ry   spanc                 C   
   || _ dS )z/Store datadog span at `unittest` test instance.N)_datadog_span)itemrz   r<   r<   r=   _store_test_span   rQ   r~   rY   c                 C   sL   t | dr t | jdr"| jjD ]}t|jrt|rt|d qdS dS dS )z^Store module identifier at `unittest` module instance, this is useful to classify event types.r   _testsmoduleN)rL   r   r   re    _extract_module_name_from_module_set_identifier)rY   r   r<   r<   r=   _store_module_identifier   s   
r   c                 C   s:   t | dr| jD ]}t|jrt|rt|d qdS dS )z\Store suite identifier at `unittest` suite instance, this is useful to classify event types.r   suiteN)rL   r   re   r   r   )r   r   r<   r<   r=   _store_suite_identifier   s   


r   c                 C   s6   t | tjkst| drtjjjr| jdsdS dS )Nr]   r   FT)	typer2   	TestSuiterL   rE   r   r8   r]   
startswithr}   r<   r<   r=   _is_test   s   
r   c                 C   s   t | dd S )Nr|   r\   r   r<   r<   r=   _extract_span      r   sessionc                 C   s   t | dsdS t| ddS )NprogNamezpython -m unittestr;   )rL   r\   )r   r<   r<   r=   "_extract_command_name_from_session   s   
r   c                 C   s   t | ddS )z2Extract test method name from `unittest` instance.r]   r;   r   rX   r<   r<   r=   ri      s   ri   c                   C   s   t tdd S )N_datadog_session_span)r\   rB   r<   r<   r<   r=   _extract_session_span   r   r   module_identifierc                 C   0   t tdr| tjd v rtjd |  dS d S )NrH   rJ   module_spanrL   rB   rH   get)r   r<   r<   r=   _extract_module_span      r   suite_identifierc                 C   r   )NrH   rI   
suite_spanr   )r   r<   r<   r=   _extract_suite_span   r   r   r}   statusc                 C   sB   |  tj}|r|tjjjks|tjjjkrdS | tj| dS )zR
    Sets the status for each Span implementing the test FAIL logic override.
    N)get_tagr   STATUSStatusSKIPvalueFAILrv   )r}   r   existing_statusr<   r<   r=   _update_status_item   s
    r   c                 C   s   t | }t|ddS )N__name__r;   )r   r\   )r}   	item_typer<   r<   r=   rh      s   rh   c                 C   s   t | r	t| jS dS r:   )r   r   
__module__r   r<   r<   r=   r      s   
r   c                 C   s   | d S )zZ
    Given a tuple of type [test_class, str], it returns the test failure/skip reason
    rq   r<   r   r<   r<   r=   _extract_test_reason   s   r   c                 C   s   t jt| jS rV   )ospathbasenameinspectgetfiler^   r   r<   r<   r=   _extract_test_file_name      r   c                 C   sJ   t | r#zt| j}W n ty   td Y dS w t|t	 S dS )NzFTried to collect module file path but it is a built-in Python functionr;   )
r   r   r   r^   	TypeErrorrT   debugr-   r   getcwd)r}   test_module_objectr<   r<   r=   rj      s   rj   
suite_namec                 C      d | |S Nz{}.{}format)r   rd   r<   r<   r=   _generate_test_resource  r   r   
test_suitec                 C   
   d | S Nz{}r   )r   r<   r<   r=   _generate_suite_resource     
r   test_modulec                 C   r   r   r   )r   r<   r<   r=   _generate_module_resource  r   r   test_commandc                 C   r   r   r   r   r<   r<   r=   _generate_session_resource  r   r   c                 C   sX   |  tjd |  tjt |  tjd |  tjd |  tjd |  tjd d S )Nrr   false)	rv   r   ITR_TEST_SKIPPING_ENABLEDITR_TEST_SKIPPING_TYPEr#   rw   rx   ITR_FORCED_RUNITR_UNSKIPPABLErz   r<   r<   r=   _set_test_skipping_tags_to_span  s   r   namec                 C   r{   )zA
    Adds an event type classification to a `unittest` test.
    N)_datadog_object)r}   r   r<   r<   r=   r   %     
r   instancec                 C   s   | o
t | tjjo
|S rV   )
isinstancer2   runnerTextTestResult)r   rb   r<   r<   r=   _is_valid_result,  s   r   kwargsc                 C   s
   t |  S )zT
    Validates that kwargs is empty to ensure that `unittest` is running a test
    )re   )r   r<   r<   r=   _is_valid_test_call0  r   r   c                 C   s   t | jdkpt | jdkS )zR
    Validates that the mocked function is an actual function from `unittest`
    methodinstancemethod)r   r   )funcr<   r<   r=   _is_valid_module_suite_call7  s   r   c                 C   s   t | dpt tdotjdkS )Nr   _datadog_entryclirL   rB   r   )r   r<   r<   r=   _is_invoked_by_cli>  s   

r   c                 C   s   t | drt| | jd S d S )Nr]   )rL   r\   r]   rX   r<   r<   r=   _extract_test_method_objectF  s   
r   c                   C   s   t tdo	tjdkS )Nr   TextTestRunnerr   r<   r<   r<   r=   _is_invoked_by_text_test_runnerL  r   r   rl   rk   c                 C   r   r   r   )rl   rk   r<   r<   r=   _generate_module_suite_pathP  r   r   test_objectsseen_suitesseen_modulesc                 C   s   t | dsdS | D ]D}t|st||| q	t|}t|}t||}||vr.ddd||< ||vrCddd||< || d  d7  < || d  d7  < q	dS )	ze
    Discovers suites and modules and initializes the seen_suites and seen_modules dictionaries.
    __iter__Nr   )r   remaining_suites)r   remaining_testsr   rq   r   )rL   r   _populate_suites_and_modulesrj   rh   r   )r   r   r   rY   rl   rk   rc   r<   r<   r=   r   T  s(   



r   c                 C   sX   |   D ]}|d }|r|jst| q|  D ]}|d }|r'|js't| qt`dS )zQ
    Forces all suite and module spans to finish and updates their statuses.
    r   r   N)valuesfinished_finish_spanrB   rH   )r   r   r   test_suite_spanr   ro   r<   r<   r=   $_finish_remaining_suites_and_modulesq  s   

r   r   c                 C   sl   t jd |  }t jd | }|d  d8  < |d dkr(|d  d8  < t| |d dkr4t| dS dS )zx
    Updates the remaining test suite and test counter and finishes spans when these have finished their execution.
    rI   rJ   r   rq   r   r   N)rB   rH   r   )rc   rl   ro   r   
suite_dictmodules_dictr<   r<   r=   $_update_remaining_suites_and_modules  s   	r   c                 C   s   t  r| tjt d S d S rV   )rB   test_skipping_enabled
set_metricr   ru   rs   r   r<   r<   r=    _update_test_skipping_count_span  s   r   c                 C   s,   t | dkr
t| S |rd|v r|d S dS )N   reasonr;   )re   r   rb   r   r<   r<   r=   _extract_skip_if_reason  s
   r   c                  C   s   t tdds	tjrdS t  dt_tj} | tdt | tdt	 | tdt	 | tdt
 | td	t | td
t | tdt | tdt | tdt | tdt | tdt dS )z6
    Patch the instrumented methods from unittest
    _datadog_patchFNTzTextTestResult.addSuccesszTextTestResult.addFailurezTextTestResult.addErrorzTextTestResult.addSkipz!TextTestResult.addExpectedFailurez#TextTestResult.addUnexpectedSuccessskipIfzTestCase.runzTestSuite.runzTextTestRunner.runzTestProgram.runTests)r\   r2   rB   rC   rA   r   wraptwrap_function_wrapperadd_success_test_wrapperadd_failure_test_wrapperadd_skip_test_wrapperadd_xfail_test_wrapperadd_xpass_test_wrapperskip_if_decoratorhandle_test_wrapper collect_text_test_runner_sessionhandle_text_test_runner_wrapperhandle_cli_run)_wr<   r<   r=   r     s    r   c                   C   s   t tddsdS ttjd ttjd ttjd ttjd ttjd ttjd	 ttd
 ttjd ttjd ttjd ttjd dt_t	
  dS )z9
    Undo patched instrumented methods from unittest
    r   FN
addSuccess
addFailureaddErroraddSkipaddExpectedFailureaddUnexpectedSuccessr   runrunTests)r\   r2   _ur   r   TestCaser   TestProgramr   rB   disabler<   r<   r<   r=   r
     s   
r
   exc_infoskip_reasonc                 C   sl   t | }|std|  d S |tj| |r$||d |d |d  |tjjj	kr4|tj
| d S d S )NzATried setting test result for test but could not find span for %sr   rq   r   )r   rT   r   rv   r   r   set_exc_infor   r   r   SKIP_REASON)	test_itemr   r  r  rz   r<   r<   r=   _set_test_span_status  s   r  resultc                 C   s   t | }|std|  dS |tj| |tj}|tjj	j
krH|tjjj
kr5|tjtjjj
 dS |tjjj
krJ|tjtjjj
 dS dS dS )zH
    Sets `test.result` and `test.status` to a XFAIL or XPASS test.
    zSTried setting test result for an xpass or xfail test but could not find span for %sN)r   rT   r   rv   r   RESULTr   r   r   XFAILr   PASSr   )r  r  rz   r   r<   r<   r=   _set_test_xpass_xfail_result  s   r  c                 C   .   t ||rt|d tjjjd | |i |S )Nr   )r  r   )r   r  r   r   r  r   r   r   rb   r   r<   r<   r=   r        
r   c                 C   4   t ||rt|d t|tjjjd | |i |S )Nr   )r  r  r   )r   r  r   r   r   r   r   r  r<   r<   r=   r        
r   c                 C   r  Nr   )r  r  )r   r  r   r   r  r   r  r<   r<   r=   r     r   r   c                 C   r!  )Nr   r  r  r   )r   r  r   r   r   r   r   r  r<   r<   r=   r     r"  r   c                 C   r  r#  )r   r  r   r   XPASSr   r  r<   r<   r=   r     r   r   c                 C   sR   | j }t| dd  d }t| jjt }t|||}t	j
d | | S )N.r   rq   rK   )r   strsplitr-   __code__co_filenamer   r   r,   rB   rH   add)objrd   rk   rl   rm   r<   r<   r=   _mark_test_as_unskippable  s   r-  c                 C   s   | d du ot | |tkS )Nr   F)r   r   r   r<   r<   r=   _using_unskippable_decorator  s   r.  c                 C   s   t ||rtS | |i |S rV   )r.  r-  r  r<   r<   r=   r    s   
r  c                 C   s  t |rbt|rbttdrbt|}t|}t|}t||}t|}t	|}	|	du rA|tj
d v rAt|}	|	tj
d | d< |du r[|tj
d v r[t|}tj
d | }
||
d< |	r_|sltd| | |i |S t||}tj}t }t|||}t rttjjv r|ttjjt  t|r|tjd |	tjd |tjd d	tj|d
 |}t||||rt|r|tj d |	tj d |tj d nt!|	| d|_"|tj#d |tj$t% t&|r|d
 }|j'|d |j(|t%d t)|t%tj*j+j,d |j-|d nt.|r-t/t0dds't1|t0_2t3t0j2| | |i |}t4||5tj6 t.|rIt7t0j2|| W d   n	1 sTw   Y  t8|||	| |S | |i |S )zH
    Creates module and suite spans for `unittest` test executions.
    rH   NrJ   r   rI   r   z/Suite and/or module span not found for test: %srr   z{}/{}r   Tr   )r   r   r$  )silent_mode)9r   r   rL   rB   ri   rh   rj   r   r   r   rH   _start_test_module_span_start_test_suite_spanrT   r   _start_test_spanr   r   r   r,   r   r   rR   	_itr_metarv   rn   r   r   r   r   splitextrg   r   ry   ra   ITR_SKIPPEDr  r    r_   	startTestr
  r  r   r   r   stopTestrZ   r$   r2   r&   _dd_coverager(   r   r   r   r%   r   )r   r   rb   r   rd   rk   rl   rc   r   ro   r   rz   rp   root_directoryfqn_test(test_module_suite_path_without_extensionr  r<   r<   r=   r  %  s    





/r  c                 C   sh   t | s| |i |S t  t r+tjd }tjd }t|j|| | |i |}|S | |i |}|S )z_
    Discovers test suites and tests for the current `unittest` `TextTestRunner` execution
    rI   rJ   )r   rA   r   rB   rH   r   r   )r   r   rb   r   r   r   r  r<   r<   r=   r  p  s   

r  c                 C   s  t tdtjj}t| }t|}|jttjj	t
j|d}|tt |tt|j |tt |tt |tj| |tjt |tjt t  |tjt
j |tjtjjradnd tjj|d t  rtt!| n|tj"d t#|  t$ rt%  |S )zb
    Starts a test session span and sets the required tags for a `unittest` session instance.
    rO   )service	span_typeresourcerr   r   r   )&r\   r2   rB   rR   rN   r   r   tracer   _servicer   r#   rv   _EVENT_TYPE_SESSION_TYPE_SESSION_IDr'  span_idr.   r   r   r   r   COMMANDr   FRAMEWORK_VERSIONr   r   	TEST_TYPEITR_TEST_CODE_COVERAGE_ENABLEDrS   set_test_session_namer   r   r   r   r   patch_coverage)r   rN   r   resource_namerp   r<   r<   r=   _start_test_session_span  s:   
rL  c                 C   sF  t tdtjj}t }t| }t|}|jt	tjj
tjd||d}|tt |tt|j |tt|j |tt |tt |tj|tj |tjt |tjt t  |tjtj |tj | |tj!t"|  |tj#tjj$rdnd t% rt&| |'tj(d n|tj)d t*|  |S )z`
    Starts a test module span and sets the required tags for a `unittest` module instance.
    rO   T)r<  r=  activatechild_ofr>  rr   r   r   )+r\   r2   rB   rR   rN   r   r   r   _start_spanr   r@  r   r#   rv   rA  _MODULE_TYPErC  r'  rD  
_MODULE_IDr.   r   r   r   r   rE  r   r   rF  r   r   rG  MODULEMODULE_PATHrj   rH  rS   r   r   r   ru   r   r   )r   rN   rp   test_module_namerK  ro   r<   r<   r=   r0    sB   r0  c                 C   s$  t tdtjj}t| }t|}t| }t|}|j	t
tjjtj|d|d}|tt |t|t |tt|j |tt|j |tt |tt |tj|tj |tjt |tjt t   |tj!tj |tj"| |tj#|tj# |tj$| |S )z^
    Starts a test suite span and sets the required tags for a `unittest` suite instance.
    rO   T)r<  r=  rN  rM  r>  )%r\   r2   rB   rR   rN   rj   r   rh   r   rO  r   r@  r   r#   rv   rA  _SUITE_TYPErC  r   	_SUITE_IDr'  rD  rQ  r.   r   r   r   r   rE  r   rF  r   r   rG  SUITErR  rS  )r   rN   rl   ro   rk   rK  r   r<   r<   r=   r1    s6   r1  c                 C   s  t tdtjj}t| }t| }t| }t||}|j	t
jjjtjj|tj|dd}|ttj |t|t |t|t |t|t |tt |tt |tj|tj |tjt |tjt t  |tj tj |tj!| |tj"| |tj#|tj# |tj$|tj$ |tj%tj&j'j( |tj)| tj*t+| |d t,|||t-.  t/| | |S )zX
    Starts a test  span and sets the required tags for a `unittest` test instance.
    rO   T)r<  r>  r=  rN  rM  r   )0r\   r2   rB   rR   rN   ri   r   rh   r   rO  rE   r   r7   r@  r   r#   rv   rA  rC  r   rQ  rV  r.   r   r   r   r   rE  r   rF  r   r   TYPENAMErW  rR  rS  r   r   r   r   CLASS_HIERARCHYset_codeowners_ofr   r+   r   r   r~   )r   r   rN   rd   test_method_objectrk   rK  rz   r<   r<   r=   r2    sB   

r2  current_spanc                 C   sJ   |  tj}| j}|r|rt|| n|s| tjtjjj	 | 
  dS )z@
    Finishes active span and populates span status upwards
    N)r   r   r   _parentr   rv   rW  r   r   r   finish)r]  current_statusparent_spanr<   r<   r=   r   (  s   r   c                   C   sl   t tjd tjd  ttj tjjrttrt	t t
 r/t r/t  tt tj t  ttj d S )NrI   rJ   )r   rB   rH   r   r   rR   rS   r$   r2   r'   r   r   r	   r*   r   unpatch_coverager   r<   r<   r<   r=   _finish_test_session_span5  s   
rc  c           	   
   C   s   t |r*t  |jjD ]}|jD ]}t|tjd tjd  qqt|}dt_|t_	z
| |i |}W |S  t
yP } ztjrJtj	rJttdrJt  |d}~ww )zk
    Creates session span and discovers test suites and tests for the current `unittest` CLI execution
    rI   rJ   r   rH   N)r   rG   r   r   r   rB   rH   rL  r   r   
SystemExitrC   rL   rc  )	r   r   rb   r   parent_moduler   rp   r  er<   r<   r=   r  C  s(   
r  c              
   C   s   t |r| |i |S t  dt_ttds!t|t_dt_dt_t jd7  _z	| |i |}W n  t	yQ } zt jd7  _tjtjkrKt
  t`|d}~ww t jd7  _tjtjkrdt
  t`|S )zX
    Creates session span if unittest is called through the `TextTestRunner` method
    r   r   r   rq   N)r   rG   rB   r   rL   rL  r   _datadog_expected_sessions_datadog_finished_sessionsrd  rc  )r   r   rb   r   r  rf  r<   r<   r=   r  ]  s0   

r  )NN)r   r   typingr   r   r2   r   rE   r   ddtrace.constantsr   'ddtrace.contrib.internal.coverage.patchr   r   rJ  r	   r
   rb  'ddtrace.contrib.internal.coverage.utilsr   r   +ddtrace.contrib.internal.unittest.constantsr   r   r   r   r   r   ddtrace.extr   r   ddtrace.ext.cir   r   ddtrace.internal.ci_visibilityr   rB   (ddtrace.internal.ci_visibility.constantsr   rA  r   r   r   rQ  r   rP  r   rC  r   rB  r    r!   rV  r"   rU  r#   'ddtrace.internal.ci_visibility.coverager$   r%   r&   r'   r(   r)   $ddtrace.internal.ci_visibility.utilsr*   r+   r,   r-   ddtrace.internal.constantsr.   ddtrace.internal.loggerr/   ddtrace.internal.utils.formatsr0   ddtrace.internal.utils.wrappersr1   r  r   rT   rs   _adddictgetenvr'  r>   r@   rG   rA   rN   rP   rF   boolrZ   rW   r_   tuplerg   rn   r?  Spanry   r~   r   r   r   r   r   r   ri   r   r   r   r   rh   r   r   r   rj   r   r   r   r   r   r   r   r   r   r   r   r   r   listr   r   r   r   r   r  r  r   r   r   r   r   r-  r.  r  r  r   r  rL  r0  r1  r2  r   rc  r  r  r  r<   r<   r<   r=   <module>   s   
		
	
 	K)+$-