
    BThDG                     T   d dl Z d dlZd dlZd dl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	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dddZg dZ G d de      Z G d d      ZdSdZ d Z! G d d      Z" ee"e#ee$f      d         Z%e%jL                  d!        Z'e%jL                  d"        Z(dSd#Z)d$ Z*dSd%Z+d& Z,d' Z-dSd(Z.d) Z/ G d* d+      Z0 G d, d-e0      Z1 G d. d/e0      Z2 ejf                  d0      fd1Z4d2 Z5d3 Z6d4 Z7d5 Z8d6 Z9d7 Z:e7e8e9e:d8Z;d9 Z<d: Z=d; Z>d< Z?d= Z@d> ZAd? ZBd@ ZCdTdAZDdB ZEdC ZFdD ZGdE ZH G dF dG      ZIdH ZJdI ZK G dJ dKej                        ZMdL ZNdM ZOdN ZPdO ZQdP ZRdQ ZSdR ZTy)U    N)datetime)timezone)Decimal)partial)basename)dirname)exists)join)split)CalledProcessError)check_output)parse_qs)urlparse   )PY311SecondszMilliseconds (ms)zMicroseconds (us)zNanoseconds (ns)) mun)
minmaxmeanstddevmedianiqropsoutliersrounds
iterationsc                   <     e Zd Z fdZ fdZe fd       Z xZS )SecondsDecimalc                 2    t        t        | 	               S N)floatsuper__str__self	__class__s    h/var/www/catia.catastroantioquia-mas.com/valormas/lib/python3.12/site-packages/pytest_benchmark/utils.py	__float__zSecondsDecimal.__float__   s    UW_&''    c                 J    t        t        t        |                       dS )Ns)format_timer%   r&   r'   r(   s    r+   r'   zSecondsDecimal.__str__"   s"    eEGO$5678::r-   c                      t         |          S r$   )r&   r'   r(   s    r+   	as_stringzSecondsDecimal.as_string%   s    w  r-   )__name__
__module____qualname__r,   r'   propertyr2   __classcell__)r*   s   @r+   r"   r"      s!    (; ! !r-   r"   c                       e Zd Zd Zd Zd Zy)NameWrapperc                     || _         y r$   target)r)   r<   s     r+   __init__zNameWrapper.__init__+   s	    r-   c                     t        | j                  d      r| j                  j                  dz   nd}|t        | j                  d      r| j                  j                  z  }|S t	        | j                        z  }|S )Nr4   .r   r3   )hasattrr<   r4   r3   repr)r)   names     r+   r'   zNameWrapper.__str__.   si    /6t{{L/Qt{{%%+WYZ(H$$_ OSSWS^S^N__r-   c                 "    d| j                   dS )NzNameWrapper()r;   )r)   s    r+   __repr__zNameWrapper.__repr__3   s    dkk_A..r-   N)r3   r4   r5   r=   r'   rE    r-   r+   r9   r9   *   s    
/r-   r9   c                     t        |       }|d   t               g}|d   r|j                  d       dj                  |      S )Niddirtyzuncommited-changes_)get_commit_infoget_current_timeappendr
   )project_nameinfopartss      r+   get_tagrQ   7   s@    <(D$Z)+,EG})*88E?r-   c            	          dj                  t        j                         t        j                         dj	                  t        j
                         d d       t        j                         d         S )Nz{}-{}-{}-{}r?      r   )formatplatformsystempython_implementationr
   python_version_tuplearchitecturerF   r-   r+   get_machine_idrZ   ?   sX    &&(..0!45"	 r-   c                       e Zd Zd Zd Zd Zy)Fallbackc                 .    || _         g | _        || _        y r$   )fallback	functions
exceptions)r)   r^   r`   s      r+   r=   zFallback.__init__I   s     $r-   c                     | j                   D ]  }	  ||i |}|s|c S   | j                  |i |S # | j                  $ r Y 7w xY wr$   )r_   r`   r^   )r)   argskwargsfuncvalues        r+   __call__zFallback.__call__N   sc    NN 		2D!d-f-  L		2 !4==$1&11 ?? s   3AAc                 <    | j                   j                  |       | S r$   )r_   rM   )r)   others     r+   registerzFallback.registerZ   s    e$r-   N)r3   r4   r5   r=   rf   ri   rF   r-   r+   r\   r\   H   s    %

2r-   r\   )r`   c                  <    t        t        j                               S r$   )r   osgetcwdrF   r-   r+   get_project_namerm   _   s    BIIK  r-   c                     t        g dt        j                        } | rgt        g d      }t        |t              r|j                         }t        j                  d|      D cg c]  }|s|	 c}d   }|j                         S y c c}w )N)gitz	rev-parsez	--git-dirstderr)ro   configz--localzremote.origin.urlz[/:\s\\]|\.git)	r   
subprocessSTDOUT
isinstancebytesdecoderer   strip)is_gitproject_addressirN   s       r+   get_project_name_gitr~   d   sz    ;JDUDUVF&'XYou--446O#%88,=#OUaSTUVXY!!##  Vs   %B-Bc                      t        t        j                  d      5 } t        g d|       }d d d        j	                         }|j                  d      d   }|j                         S # 1 sw Y   =xY w)Nw)hgpathdefaultrp   /rs   )openrk   devnullr   rx   r   rz   )r   r|   rN   s      r+   get_project_name_hgr   o   sj    	bjj#	 R'&'@QR%,,.O"((-b1L	R Rs   A''A0c                     d }|st        j                         }|rD||k7  r?t        t        ||             s*|}t	        |      }|r||k7  rt        t        ||             s*t        t        ||             S r$   )rk   rl   r	   r
   r   )rB   r   prevs      r+   in_any_parentr   x   sg    Dyy{
44<tD$/?(@t} 44<tD$/?(@ $tT"##r-   c                 r    t        | j                         t        j                  d      j	                         S )NT)rq   universal_newlines)r   r   rt   ru   rz   )cmds    r+   subprocess_outputr      s'    		J,=,=RVW]]__r-   c           
         d}d}d }d }| xs
 t               } d}	 t        d      rt        d      }|j                  d      }|d   j	                         dk(  rd	}|j                          |d   j	                  d
      }t        d      j	                  d      }t        d      j	                  d      }t        d      }|dk(  rYd}nVt        d      rKt        d      }|d   dk(  rd	}|j	                  d      }t        d      j	                  d      }t        d      }||||| |dS # t        $ rJ}dd d |t        |t              rd|j                   d|j                  dn
t        |      | |dcY d }~S d }~ww xY w)NFunversionedz	(unknown)z.gitz0git describe --dirty --always --long --abbrev=40-rs   rI   Tgz!git show -s --pretty=format:"%cI""z!git show -s --pretty=format:"%aI"zgit rev-parse --abbrev-ref HEADHEADz(detached head)z.hgzhg id --id --debug+z&hg tip --template "{date|rfc3339date}"z	hg branch)rH   timeauthor_timerI   projectbranchunknownzCalledProcessError(, rD   )rH   r   r   rI   errorr   r   )rm   r   r   r   rz   pop	Exceptionrv   r   
returncodeoutputrA   )rN   rI   commitcommit_timer   r   descexcs           r+   rK   rK      s   EFKK5#3#5LF%
 $%WXD::c?DBx~~7*
"X^^C(F+,OPVVWZ[K+,OPVVWZ[K&'HIF*5!$%9:DBx3ZZ_F+,TU[[\_`K&{3F&#
 	
  	
PZ[^`rPs*3>>*:"SZZN!Ly}  B  zC#
 	
	
s   DD# #	E6,?E1+E61E6c                  f    t        j                  t        j                        j	                  d      S )Nz%Y%m%d_%H%M%S)r   nowr   utcstrftimerF   r-   r+   rL   rL      s     <<%..??r-   c                     | r| \  }|S r$   rF   )objre   s     r+   first_or_valuer      s    
Lr-   c                 .   g }	 t        | j                        dz
  }t	        | j                        D ]8  \  }}|s||k(  r||k(  r|j                  dd      d   }|j                  |       : dj                  |      S # t        $ r t        |       cY S w xY w)Nr   r?   r   r   )lenrP   AttributeErrorstr	enumeratersplitrM   r
   )r   
machine_idrP   lastposparts         r+   short_filenamer      s    E4::" tzz* 	Ttz)$;;;sA&q)D 	T 88E?  4ys   A= =BBc                     d| vrt        j                  d      | j                  dd      \  }}|dk(  rdd l}t	        t        ||            S t        |       t        j                  |   }t	        t        ||            S )Nr?   zFValue for --benchmark-timer must be in dotted form. Eg: 'module.attr'.r   pep418r   )	argparseArgumentTypeErrorr   r   r9   getattr
__import__sysmodules)stringmodattrr   s       r+   
load_timerr      ss    
&(()qrrc1%IC
h74.//3kk#73-..r-   c                       e Zd Zd Zd Zy)RegressionCheckc                      || _         || _        y r$   )field	threshold)r)   r   r   s      r+   r=   zRegressionCheck.__init__   s    
"r-   c           	          | j                  ||      }|| j                  kD  r8d| j                  d| j                  j                   d|dd| j                  dS y )NzField z has failed : z.9fz > )computer   r   r*   r3   r)   currentcomparedvals       r+   failszRegressionCheck.fails   sb    ll7H-DJJ>dnn6M6M5NbQTUXPYY\]a]k]klo\pqq  r-   N)r3   r4   r5   r=   r   rF   r-   r+   r   r      s    #rr-   r   c                       e Zd Zd Zy)PercentageRegressionCheckc                 j    || j                      }|st        d      S || j                      |z  dz  dz
  S )Ninfd   )r   r%   r   s       r+   r   z!PercentageRegressionCheck.compute   s;    tzz"<tzz"S(3.44r-   Nr3   r4   r5   r   rF   r-   r+   r   r      s    5r-   r   c                       e Zd Zd Zy)DifferenceRegressionCheckc                 @    || j                      || j                      z
  S r$   )r   )r)   r   r   s      r+   r   z!DifferenceRegressionCheck.compute   s    tzz"Xdjj%999r-   Nr   rF   r-   r+   r   r      s    :r-   r   z|^(?P<field>min|max|mean|median|stddev|iqr):((?P<percentage>[0-9]?[0-9])%|(?P<difference>[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?))$c                     |j                  |       }|rP|j                         }|d   rt        |d   t        |d               S |d   rt	        |d   t        |d               S t        j                  d| d      )N
percentager   
differenceCould not parse value: r?   )match	groupdictr   intr   r%   r   r   )r   rexr   r   s       r+   parse_compare_failr      s}     			&AKKM\?,QwZQ|_9MNN|_,QwZq9OPP

$
$'>vj%J
KKr-   c                     | dk(  ry 	 t        |       }|dk  rt        j                  d| d      d |S # t        $ r t        j                  d| d      d w xY w)Nautor   z . Expected an integer or `auto`.r   zInvalid value: z. Must be greater than 0.)r   
ValueErrorr   r   )r   re   s     r+   parse_cprofile_loopsr   
  sz    	}KE 19,,vjHa-bcimm	  	},,/FvjPp-qrx||	}s	   4 $Ac                     | j                         j                         } | dk(  rt        j                         dk(  S | dv ry| dv ryt	        j
                  d| d      )	Nr   PyPy)offfalsenoF)ontrueyesr   Tr   r?   )lowerrz   rU   rW   r   r   r   s    r+   parse_warmupr     se    \\^!!#F--/699	)	)	,	,((+B6*A)NOOr-   c                     | d   }| d   r!dj                  |t        | d         d         }|j                  d      r|dd  }|S )NrB   sourcez
{} ({:.4})rs   test_   )rT   r   
startswith)benchrB   s     r+   name_formatter_shortr   #  sN    =DX""4uX)?)CDwABxKr-   c                     | d   }| d   r@| d   j                  d      }|d   d d |d<   dj                  |dj                  |            }|S )NrB   r   r   rs      z{} ({}))r   rT   r
   )r   rB   rP   s      r+   name_formatter_normalr   ,  sX    =DXh%%c*"IcrNb	chhuo6Kr-   c                 :    | d   r dj                   di | S | d   S )Nr   z{fullname} ({source})fullnamerF   )rT   r   s    r+   name_formatter_longr   5  s+    X-&--666Z  r-   c                 N    | d   r dj                  t        | d         d         S y)Nr   z{:.4}rs   z????)rT   r   r   s    r+   name_formatter_trialr   <  s)    X~~eE(O4R899r-   )shortnormallongtrialc                     | j                         j                         } | t        v r| S t        j                  d| d      )Nr   r?   )r   rz   NAME_FORMATTERSr   r   r   s    r+   parse_name_formatr  K  s>    \\^!!#F ((+B6*A)NOOr-   c                 *    t        t        |             S r$   )r   r   r   s    r+   parse_timerr	  S  s    z&!""r-   c                 |    | j                         j                         } | dvrt        j                  d| d      | S )N)r   r   r   r   rB   r   zUnacceptable value: z`. Value for --benchmark-sort must be one of: 'min', 'max', 'mean', 'stddev', 'name', 'fullname'.)r   rz   r   r   r   s    r+   
parse_sortr  W  sJ    \\^!!#FII(("6* -, ,
 	

 Mr-   c                    | j                         j                  d      D cg c]  }t        j                  |       }}t	        |      t	        t
              z
  }|r\dj                  dj                  |            }|dj                  dj                  t
                    z  }t        j                  |      |S c c}w )N,zInvalid column name(s): {}. r   z#The only valid column names are: {})
r   r   r   rz   setALLOWED_COLUMNSrT   r
   r   r   )r   r/   columnsinvalidmsgs        r+   parse_columnsr  b  s    %+\\^%9%9#%>?syy|?G?'lS11G,33DIIg4FG4;;DIIo<VWW((--N @s   B;c                     	 t        |       }|dk  rt        j                  d      |S # t        $ r}t        j                  |      d d }~ww xY w)Nr   z0Value for --benchmark-rounds must be at least 1.)r   r   r   r   )r   re   r   s      r+   parse_roundsr  m  sU    F 19,,-_``  8((-478s   ) 	AAAc                     	 t        |       j                  S # t        $ r!}t        j                  d| d|      d d }~ww xY w)NzInvalid decimal value r   )r"   r2   r   r   r   )r   r   s     r+   parse_secondsr  x  sM    af%/// a((+A&2cW)UV\``as    	A<Ac                       st        j                  d      dj                   fddD              }|rt        j                  d|d       S )NzCan't be empty.r   c              3   ,   K   | ]  }|v s|  y wr$   rF   ).0cr   s     r+   	<genexpr>zparse_save.<locals>.<genexpr>  s     <AVa<s   	z\/:*?<>|z;Must not contain any of these characters: /:*?<>|\ (it has rD   )r   r   r
   )r   illegals   ` r+   
parse_saver    sR    (():;;gg<<<G((+ghogrrs)tuuMr-   c                    t         j                  j                  |      }d }|r4t         j                  j                  |      rt	        j                  |      }g }| j
                  j                  d      D ]o  }d}|rEd|vrA|j                  d      j                  d      }|j                  |      }|r|\  }	}
}|	 d| d}| j                   d| | }|j                  |       q |S )Nr  r   @:r   ://)rk   r   
expanduserisfilenetrcnetlocr   r   authenticatorsschemerM   )storage_url
netrc_filer   credsurlsr&  authhostresuserrJ   secreturls                r+   _parse_hostsr3    s    77j)DEbggnnT*D! D$$**3/ 	S&<<$((+D&&t,C"%aq*##$CvfX6C	 Kr-   c                 l   t        |       }t        ||      }|}|}|j                  rQ|j                  dk7  rB|j                  j                  d      j	                  d      }|d   }t        |      dk\  r|d   }t        |j                        }		 |	d   d   }
||||
fS # t        $ r t               }
Y w xY w)Nr   r   rS   r   rN   )
r   r3  r   rz   r   r   r   queryKeyErrorrm   )r   default_indexdefault_doctyper*  r)  hostsindexdoctypesplittedr5  rN   s              r+   parse_elasticsearch_storager=    s    6"Kj1EEGK,,3##))#.44S9x=AqkG[&&'E*^,Q/ %,..  *')*s   B B32B3c                 (   d| vrd| z   } |j                  d      }| j                  d      rddlm}  || t	        d      d  fi |S | j                  d      r'ddlm} t        | t	        d      d  |      } ||i |S t        j                  d	      )
Nr"  zfile://r%  r   )FileStoragezelasticsearch+)ElasticsearchStorage)r*  z[Storage must be in form of file://path or elasticsearch+http[s]://host1,host2/index/doctype)
r   r   storage.filer?  r   storage.elasticsearchr@  r=  r   r   )storagerc   r*  r?  r@  rb   s         r+   load_storagerD    s    Gg%G$J)$-73y>#34???			,	-? +737G3H3J+KXbc#T4V44((  *J  K  	Kr-   c                 (    | dk  ry| dk  ry| dk  ryy)Nư>)r   g    eAMbP?)r       .Ar   )r        @@r   g      ?rF   re   s    r+   	time_unitrL    s#    t|		r-   c                     | dkD  ry| dkD  ryy)NrH  )MrF  rI  )KrG  rJ  rF   rK  s    r+   operations_unitrP    s    s{s{r-   c                 4    t        |       \  }}| |z  d|dS )Nz.2fr/   )rL  )re   unit
adjustments      r+   r0   r0     s*     'D*j %d1X..r-   c                       e Zd Zd Zd Zy)cached_propertyc                 4    |j                   | _         || _        y r$   )__doc__rd   )r)   rd   s     r+   r=   zcached_property.__init__  s    ||	r-   c                 v    || S | j                  |      x}|j                  | j                   j                  <   |S r$   )rd   __dict__r3   )r)   r   clsre   s       r+   __get__zcached_property.__get__  s6    ;K3799S>ATYY//0r-   N)r3   r4   r5   r=   r[  rF   r-   r+   rU  rU    s    r-   rU  c                     	 t        | t              r| j                  j                  S | j                  S # t        $ r t        |       cY S w xY wr$   )rv   r   rd   r3   r   r   )fs    r+   funcnamer^    sA    a!66??":: 1vs   %4 4 A
Ac                    t        | d      s| S | j                  }|j                  |j                  |j                  |j
                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                   |j"                  g}t$        r8|j'                  d|j(                         |j'                  d|j*                         t-        j.                  | }t-        j0                  || j2                  | j4                  | j6                  | j8                        }|S )a  Deep clone the given function to create a new one.

    By default, the PyPy JIT specializes the assembler based on f.__code__:
    clonefunc makes sure that you will get a new function with a **different**
    __code__, so that PyPy will produce independent assembler. This is useful
    e.g. for benchmarks and microbenchmarks, so you can make sure to compare
    apples to apples.

    Use it with caution: if abused, this might easily produce an explosion of
    produced assembler.
    __code__r      )r@   r`  co_argcountco_posonlyargcountco_kwonlyargcount
co_nlocalsco_stacksizeco_flagsco_code	co_constsco_namesco_varnamesco_filenameco_nameco_firstlineno	co_lnotabco_freevarsco_cellvarsr   insertco_qualnameco_exceptiontabletypesCodeTypeFunctionType__globals__r3   __defaults____closure__)r]  corb   co2f2s        r+   	clonefuncr~    s    1j!	
B



















!D$ B'B,,-
..$
C 
		C

ANNAMM	ZBIr-   c                       e Zd Zd Zy)SafeJSONEncoderc                     d|dS )NzUNSERIALIZABLE[]rF   )r)   os     r+   r   zSafeJSONEncoder.default  s     Q''r-   N)r3   r4   r5   r   rF   r-   r+   r  r    s    (r-   r  c                 0    t        j                  | d      S )NT)	sort_keys)jsondumpsrK  s    r+   consistent_dumpsr  "  s    ::et,,r-   c                 :    t        j                  | fdt        i|S )NrZ  )r  r  r  )r   rc   s     r+   
safe_dumpsr  &  s    ::c99&99r-   c                 B     t                fd} |       S )Nc               3      K   t              D ]8  \  } } j                  d| dz   |d}j                  |dd       ||f : y w)Nr   )r   totalre   T)blackboldrF   )r   rT   rewrite)r   itemr   format_stringiterablerc   terminal_reporterr  s      r+   progress_reporting_wrapperz3report_progress.<locals>.progress_reporting_wrapper-  sa     "8, 	IC)]))YcAgU$YRXYF%%fDt%D$,	s   AA)r   )r  r  r  rc   r  r  s   ```` @r+   report_progressr  *  s!    ME  &''r-   c              /   &   K   | D ]  }d|f 
 y w)Nr   rF   )r  rb   rc   r  s       r+   report_noprogressr  6  s      $hs   c                 ,    t         | |g|d             y )Nz{value})next)progress_reportertrlines      r+   report_online_progressr  ;  s    	D62y	12r-   c                 X    dD ]$  }| j                  |d      j                  dd      } & | S )Nz	\/:*?<>| rJ   __)replace)rB   r  s     r+   slugifyr  ?  s3     7||As#++D#67Kr-   c                    g }t        t        j                               }| j                  j	                         D ]  \  }}|d   }|j                  |      r|t        |      d j                  d      }| d|d    d|d    d}|dd	 \  }}}	}
||k(  rt        |      }n| d| }|j                  |||	|dkD  r|	|z  nd|
|dkD  r|
|z  nd|d
        |S )zO
    Convert pstats structure to list of sorted dicts about each function.
    r   Nr   r!  r   (rS   rD      )ncalls_recursionncallstottimetottime_percumtimecumtime_perfunction_name)
r   rk   rl   statsitemsr   r   lstripr   rM   )r  resultproject_dir_parentfunction_inforun_info	file_pathr  pcallsr  r  r  callss               r+   get_cprofile_functionsr  E  s    F -#(;;#4#4#6 
x!!$	 23!#&8"9";<CCCHI$+Q}Q'7&8-:J9K1M+3BQ<( VKEhax(E$) "39A:w/1"39A:w/1!.
	

4 Mr-   r$   )	benchmarkr  r   )Ur   r  r%  rk   rU   ry   rt   r   ru  r   r   decimalr   	functoolsr   os.pathr   r   r	   r
   r   r   r   urllib.parser   r   compatr   
TIME_UNITSr  r"   r9   rQ   rZ   r\   
IndexErrorOSErrorrm   ri   r~   r   r   r   rK   rL   r   r   r   r   r   r   compiler   r   r   r   r   r   r   r  r  r	  r  r  r  r  r  r3  r=  rD  rL  rP  r0   rU  r^  r~  JSONEncoderr  r  r  r  r  r  r  r  rF   r-   r+   <module>r     s	      	  	  
           ) # ! ! "5<OVhi
n	!W 	!
/ 
/ . 	z+=wGH! I! $ $    $`,
^@"/r r5 5: : 	

		L&
	P! "#!	P#a,/$K$/
	 	)X(d&& (
-:	(
3"r-   