
    Yf                        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
Z
d dlmZmZ d dlmZmZ d dlmZmZmZmZmZmZmZ d dlmZmZ d dlmZmZ  G d d      Z G d	 d
      Z  e       Z! e        Z"dedeee#ge$f   deeef   de%de%de%ddfdZ&dedededee   fdZ'dedefdZ(deee   ef   de#fdZ)de#de#de#de#fdZ*dededdfdZ+de,de#ddfd Z-d$d!e#de,d"e#ddfd#Z.y)%    N)EnvironmentFileSystemLoader)CodeType	FrameType)AnyCallableDictListOptionalTuplecast)Filename
LineNumber)scalene_versionscalene_datec                       e Zd ZdefdZy)LineNoreturnc                     t        j                         }|sJ |j                  sJ t        |j                  j                        S N)inspectcurrentframef_backstrf_linenoselfframes     W/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/scalene/scalene_utility.py__str__zLineNo.__str__   s8    $$&u|||5<<(())    N__name__
__module____qualname__r   r     r!   r   r   r      s    * *r!   r   c                       e Zd ZdefdZy)FileNamer   c                     t        j                         }|sJ |j                  sJ |j                  j                  sJ t	        |j                  j                  j
                        S r   )r   r   r   f_coder   co_filenamer   s     r   r    zFileName.__str__   sQ    $$&u|||||""""5<<&&2233r!   Nr"   r&   r!   r   r(   r(      s    4 4r!   r(   r   should_tracestackspython_timec_timecpu_samplesr   c                    t               }| }|r |t        |j                  j                        |j                  j                        rG|j                  d|j                  j                  |j                  j                  |j                  f       |j                  }|rt        |      |vrd|||f|t        |      <   y|t        |         \  }}	}
}|dz   |	|z   |
|z   ||z   f|t        |      <   y)z.Add one to the stack starting from this frame.r      N)	listr   r*   r+   co_nameinsertr   r   tuple)r   r,   r-   r.   r/   r0   stkf
prev_countprev_python_timeprev_c_timeprev_cpu_sampless               r   	add_stackr=   *   s     '+fC"A
!5!568H8HIJJq188//1A1A1::NOHH  SzfkBuSzHNuUXzHZE%{4D(1n.<)F2.<>uSzr!   fnamelinenoc                     | }||f}|rD|j                   j                  |j                  f|k(  r|S t        t        |j
                        }|rDy)zFind a frame matching the given filename and line number, if any.

    Used for checking whether we are still executing the same line
    of code or not in invalidate_lines (for per-line memory
    accounting).
    N)r*   r+   r   r   r   r   )r   r>   r?   r8   current_file_and_lines        r   on_stackrB   D   sQ     	A"FO
HH  !**-1FFHAHH%  r!   c                    t         j                  }|j                  dk\  r0|j                  dk\  r!t	        | j
                  j                        }|S | }t	        |j
                  j                        }|r|j                  r|j                  j
                  rd|j                  v r:|j                  d   j                  j                  }d|vrt	        | d|       }	 |S d|j                  v r6t        |j                  d   dd       }|rd|v r	 |S t	        | d|       }	 |S |j                  }|r#|j                  r|j                  j
                  r|S )N      r   Scalene.clsr#   )sysversion_infomajorminorr   r*   co_qualnamer4   r   f_locals	__class__r#   getattr)r   versionfn_namer8   prepend_names        r   get_fully_qualified_namerT   V   s5   G}}gmmr15<<334Aqxx''(G
QXX__QZZ::f-77@@L,"l^1WI#>? N AJJ"1::e#4j$GL9#< N ,q	:;GN HH QXX__ Nr!   c           	          d}| j                         D ]9  }|D ]  }|\  }}}|| d| d| dz  } |dt        | |   d         z   z  }|dz  }; |S )zWConverts stacks to a string suitable for input to Brendan Gregg's flamegraph.pl script.  :;r   
)keysr   )r-   outputr7   itemr>   rR   r?   s          r   flamegraph_formatr^   p   s    F{{}  	5D'+$UGVq	6(!44F	5 	#F3KN+++$ Mr!   	directorysubdirectoryfilenamec                     t         j                  j                  | ||      }t        j                  |      j                         S r   )ospathjoinpathlibPath	read_text)r_   r`   ra   	file_paths       r   read_file_contentrj   |   s0    Yh?I<<	",,..r!   profile_fnameoutput_fnamec           
         	 t        j                  |       }|j                         }t        j
                  j                  t              }t        |dd      t        |dd      t        |dd      t        |dd      t        |dd      d	}t        t        t        j
                  j                  |d            
      }|j                  d      }|j                  ||d   |d   |d   |d   |d   t        t              }	 t!        |dd      5 }	|	j#                  |       ddd       y# t        $ r | dk(  sJ d}Y w xY w# 1 sw Y   yxY w# t$        $ r Y yw xY w)zRApply a template to generate a single HTML payload containing the current profile.demorV   zscalene-guizscalene-gui.jsz	prism.csszprism.jsztablesort.jsztablesort.number.js)scalene_gui_js_textprism_css_textprism_js_texttablesort_js_texttablesort_number_js_text)loaderzindex.html.templatero   rp   rq   rr   rs   )profilegui_js	prism_cssprism_jstablesort_jstablesort_number_jsr   r   wzutf-8)encodingN)rf   rg   rh   FileNotFoundErrorrc   rd   dirname__file__rj   r   r   re   get_templaterenderr   r   openwriteOSError)
rk   rl   profile_fileru   scalene_dirfile_contentsenvironmenttemplaterendered_contentr8   s
             r   generate_htmlr      sn   ||M2((* ''//(+K  1mM]^+KT*;zR.{M>Z$5k=Rg$hM [- HIK ''(=>H23 01/"#67)*DE'! ' 	,g6 	&!GG$%	& 	&E  &&&D	& 	& sA   %D' >E E E 'D=<D= E	E 	E 	EEportc                 
   	 t         j                  j                  }t        j                  d| f|      5 }t        j                  |       |j                          d d d        y # 1 sw Y   y xY w# t        $ r
}Y d }~y d }~ww xY w)NrV   )	httpserverSimpleHTTPRequestHandlersocketserver	TCPServerrc   chdirserve_foreverr   )r   r_   handlerhttpdes        r   start_serverr      sm    ++66##RJ8 	"EHHY!	" 	" 	"  s.   2A/ &A#A/ #A,(A/ ,A/ /	B=Bri   orig_pythonc                 D   t        j                         }t        j                  | t        j
                  j                  |d             d| d}t	        j                         }	 t	        j                  |       t        j                  |t        j
                  j                  t        j
                  j                  t              d      | | g       t        j                  d| d       t	        j                  |       y #  Y xY w# t	        j                  |       w xY w)Nz
index.htmlzhttp://localhost:/zlaunchbrowser.py)tempfile
gettempdirshutilcopyrc   rd   re   getcwdr   
subprocessPopenr~   r   
webbrowserr   )ri   r   r   temp_dirurlcurr_dirs         r   show_browserr      s    ""$H KK	277<<,?@ dV1
%Cyy{H
+rww||BGGOOH4MOa'bdmrvqwyz 	+D634 	
s   $BD DD D)python3)/http.serverr   r   rc   rf   rI   r   r   r   r   r   jinja2r   r   typesr   r   typingr   r   r	   r
   r   r   r   scalene.scalene_statisticsr   r   scalene.scalene_configr   r   r   r(   __LINE____FILE__r   boolfloatr=   rB   rT   r^   rj   r   intr   r   r&   r!   r   <module>r      s     	  
      1 % C C C ; @* *4 4 8:>>Hc?D01> cN> 	>
 > > 
>4%/9i$I ( 4	d5:s?3 	 	/ /C /3 /3 /, , ,d ,^	s 	s 	t 	C s # T r!   