o
    i                     @   s  d dl 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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mZ d d	lmZ eeZd
edefddZdede
jedf fddZde
jeeef ed f fddZ dej!j"dedefddZ#de$dej!j"fddZ%dedededefddZ&dededefd d!Z'd3d#d$Z(d%efd&d'Z)d(edefd)d*Z*d+e
j+e, d,ee-e. d-f de
j/fd.d/Z0d0ed,ee-e. d-f de
j/fd1d2Z1dS )4    wrapsN)sleep)config)PCT_COVERED_KEY)test)CIVISIBILITY_LOG_FILTER_RE)TEST_FRAMEWORKS)
get_loggerpathstart_directoryc                 C   s@   zt jj| |d}W |S  ty   td t j|  Y S w )N)startzlTried to collect relative path but it is using different drive paths on Windows, using absolute path instead)osr   relpath
ValueErrorlogdebugabspath)r   r   relative_path r   X/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/ci_visibility/utils.py&get_relative_or_absolute_path_for_path   s   r   repo_directoryreturnc                 C   s.   zt | }W n
 ty   Y dS w t||S )N )inspectgetfile	TypeErrorr   )test_method_objectr   file_objectr   r   r   $get_source_file_path_for_test_method"   s   
r    NNc              	   C   sH   zt | }W n ttfy   Y dS w |d }|t|d  }||fS )z
    Get the start and end line numbers for a test method.

    Returns:
        Tuple of (start_line, end_line), with None indicating unavailable information
    r!      r   )r   getsourcelinesr   OSErrorlen)r   source_lines_tuple
start_lineend_liner   r   r    get_source_lines_for_test_method+   s   	r)   span	test_namec                 C   s   |s
t d| d S t||}|st d| d S t|\}}|r#|s)t d| | tj| |r9| tj| |rD| tj	| d S d S )NzdTried to collect source start/end lines for test method %s but test method object could not be foundzKTried to collect file path for test %s but it is a built-in Python functionzVTried to collect source start/end lines for test method %s but an exception was raised)
r   r   r    r)   _set_tag_strr   SOURCE_FILE
set_metricSOURCE_START
SOURCE_END)r*   r   r+   r   source_file_pathr'   r(   r   r   r   ,_add_start_end_source_file_path_data_to_span=   s,   
r2   coverage_datac                 C   sL   | rt | vrtd d S | t  }t|tstd d S |tj| d S )NzKTried to add total covered percentage to session span but no data was foundzSTried to add total covered percentage to session span but the format was unexpected)r   r   warning
isinstancefloatr.   r   TEST_LINES_PCT)r3   r*   lines_pct_valuer   r   r   _add_pct_covered_to_spanW   s   


r9   test_module_pathtest_suite_namec                 C   s   d | ||S )Nz{}.{}.{}format)r:   r;   r+   r   r   r   #_generate_fully_qualified_test_nameb   s   r>   c                 C   s   d | |S )Nz{}.{}r<   )r:   r;   r   r   r   %_generate_fully_qualified_module_namef   s   r?   Tc                    s  t jr
td dS t j}| dkrtd| dS td}| r5td t|j	D ]}|
| q,ntd tt t }| fdd	 |td
 z||  ||  W n tyt   td| Y dS w || |t|j|j d|_td dS )a]  Creates a handler with a filter for CIVisibility-specific messages. The also removes the existing
    handlers on the DDTrace logger, to prevent double-logging.

    This is useful for testrunners (currently pytest) that have their own logger.

    NOTE: This should **only** be called from testrunner-level integrations (eg: pytest, unittest).
    zQCIVisibility not taking over ddtrace logger handler because debug mode is enabledNNONEzGCIVisibility not taking over ddtrace logger because level is set to: %sddtracez,CIVisibility removing DDTrace logger handlerz8Keeping DDTrace logger handler, double logging is likelyc                    s   t  | jS N)boolmatchname)recordlogger_name_rer   r   <lambda>   s    z1take_over_logger_stream_handler.<locals>.<lambda>zT[Datadog CI Visibility] %(levelname)-8s %(name)s:%(filename)s:%(lineno)d %(message)szInvalid log level: %sFzlogger setup complete)ddconfig_debug_moder   r   _ci_visibility_log_levelupperlogging	getLoggerlisthandlersremoveHandlerr4   recompiler   StreamHandler	addFiltersetFormatter	FormattersetLevelr   
addHandlerminlevel	propagate)remove_ddtrace_stream_handlersr\   ddtrace_loggerhandlerci_visibility_handlerr   rG   r   take_over_logger_stream_handlerj   s>   





rb   argsc                  G   s   d dd | D S )zCombine URL path segments.

    NOTE: this is custom-built for its current usage in the Test Visibility codebase. Use with care.
    /c                 s   s    | ]
}t |d V  qdS )rd   N)strstrip).0segmentr   r   r   	<genexpr>   s    z#combine_url_path.<locals>.<genexpr>)join)rc   r   r   r   combine_url_path   s   rk   test_frameworkc                 C   s"   t D ]}|j| kr|  S qt jS rB   )r	   valueMANUAL)rl   	frameworkr   r   r   "_get_test_framework_telemetry_name   s
   
rp   after
exceptions.c                    s    fdd}|S )zX
    Decorator to automatically retry a function if it raises specified exceptions.
    c                    s   t   fdd}|S )Nc                     sd    D ](}z
| i |W   S  t y* } zt|s t| W Y d }~qd }~ww | i |S rB   )	Exceptionr5   r   )rc   kwargsdelaye)rq   rr   fr   r   retry_wrapped   s   
zCretry_on_exceptions.<locals>.retry_decorator.<locals>.retry_wrappedr   )rw   rx   rq   rr   )rw   r   retry_decorator   s   z,retry_on_exceptions.<locals>.retry_decoratorr   )rq   rr   rz   r   ry   r   retry_on_exceptions   s   r{   attemptsc                 C   s   t dd t| d D |dS )zy
    Decorator to automatically retry a function if it raises specified exceptions, with exponential backoff delays.
    c                 S   s   g | ]
}t d d| qS )r   gS?)randomuniform)rg   ir   r   r   
<listcomp>   s    z?fibonacci_backoff_with_jitter_on_exceptions.<locals>.<listcomp>r"   ry   )r{   range)r|   rr   r   r   r   +fibonacci_backoff_with_jitter_on_exceptions   s   r   )T)2	functoolsr   r   rN   r   r}   rS   timer   typingtrA   r   rJ   'ddtrace.contrib.internal.coverage.patchr   ddtrace.extr   (ddtrace.internal.ci_visibility.constantsr   2ddtrace.internal.ci_visibility.telemetry.constantsr	   ddtrace.internal.loggerr
   __name__r   re   r   Unionr    tupleintr)   traceSpanr2   dictr9   r>   r?   rb   rk   rp   Iterabler6   typeBaseExceptionCallabler{   r   r   r   r   r   <module>   s`    	


1
