
    Yf!                         d dl Z d dlZd dlZd dlZd dlmZmZmZmZm	Z	 ej                  dk  rd dlZej                  e _         G d d      Zy)    N)castAnyDictListTuple)   	   c            	           e Zd Zededefd       Zededee   fd       Zededee   fd       Z	edede
eeeef   f   fd       Zedede
eeeef   f   fd	       Zededefd
       Zy)ScaleneAnalysispackage_namereturnc                    d}	 t        j                  |       }|j                  rst        j                  j                  |j                        }t        j                  |      D ]2  \  }}}|D ]'  }|j                  d      s|j                  d      s&  y 4 d}|S # t        $ r d}Y |S t        $ r d}Y |S t        $ r d}Y |S t        $ r d}Y |S w xY w)z=
        Returns whether a package is native or not.
        Fz.soz.pydT)	importlibimport_module__file__ospathdirnamewalkendswithImportErrorAttributeError	TypeErrorModuleNotFoundError)r   resultpackagepackage_dirrootdirsfilesfilenames           X/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/scalene/scalene_analysis.py	is_nativezScaleneAnalysis.is_native   s    
 	--l;G ggoog.>.>?)+)= (%D$$) (#,,U3x7H7H7P#'(( F   	F   	F   	F  # 	F	s0   BB B B C*
C7
C
CCsourcec                 0   t         j                  |       } t        j                  |       }g }t        j                  |      D ]Q  }t        |t        j                  t        j                  f      s.|j                  t        j                  |             S |S )z
        Extracts a list of imported modules from the given source code.

        Parameters:
        - source (str): The source code to be analyzed.

        Returns:
        - imported_modules (list[str]): A list of import statements.
        )
r   strip_magic_lineastparser   
isinstanceImport
ImportFromappendunparse)r$   treeimported_modulesnodes       r"   get_imported_modulesz$ScaleneAnalysis.get_imported_modules,   sw     !11&9yy  HHTN 	;D$S^^ <= ''D(9:	;
      c                 n   t         j                  |       } t        j                  |       }g }t        j                  |      D ]  }t        |t        j                        rV|j                  D ]F  }t         j                  |j                        s#|j                  t        j                  |             H st        |t        j                        st        t        |j                        |_        t         j                  |j                        s|j                  t        j                  |              |S )a   
        Extracts a list of **native** imported modules from the given source code.

        Parameters:
        - source (str): The source code to be analyzed.

        Returns:
        - imported_modules (list[str]): A list of import statements.
        )r   r&   r'   r(   r   r)   r*   namesr#   namer,   r-   r+   r   strmodule)r$   r.   r/   r0   aliass        r"   get_native_imported_modulesz+ScaleneAnalysis.get_native_imported_modulesE   s     !11&9yy  HHTN 
	?D$

+!ZZ CE&00<(//D0ABC D#..1"34",,T[[9$++CKK,=>
	?  r2   srcc                    t         j                  |       } | j                  d      }t        j                  |       }i }i }i }i }t        j
                  |      D ]V  }t        |t        j                        rQ|j                  sJ t        |j                  |j                  dz         D ]  }|j                  |j                  f||<    t        |t        j                  t        j                  f      rQ|j                  sJ t        |j                  |j                  dz         D ]  }|j                  |j                  f||<    t        |t        j                        s|j                  sJ t        |j                  |j                  dz         D ]  }|j                  |j                  f||<    Y t        |d      D ]3  \  }	}
|	|v r	||	   ||	<   |	|v r	||	   ||	<    |	|v r	||	   ||	<   -|	|	f||	<   5 |S )zThis function collects the start and end lines of all loops and functions in the AST, and then uses these to determine the narrowest region containing each line in the source code (that is, loops take precedence over functions.
   )r   r&   splitr'   r(   r   r)   ClassDef
end_linenorangelinenoForWhileFunctionDef	enumerate)r:   srclinesr.   regionsloops	functionsclassesr0   linerB   _s              r"   find_regionszScaleneAnalysis.find_regionse   s    ..s399T?yy~	HHTN 	ED$-&!$++t/BC CD%)[[$//$BGDMC$#)) 45&!$++t/BC AD#';;"@E$KA$0&!$++t/BC ED'+{{DOO&DIdOE	E #8Q/ 	3IFA"'-9$"+F"37"")&/#)6"2	3 r2   c                 <   t         j                  |       } | j                  d      t        j                  |       }i dt        j
                  dt        dt        dd ffd |d d        t        d      D ]  \  }}j                  |||f      |<    S )Nr<   r0   current_outermost_regionouter_classr   c                 l   t        | t        j                  t        j                  t        j                  f      st        | t        j
                  t        j                  t        j                  t        j                  f      r\|t        j                  u s&|t        j                  u s|t        j                  u s|$| j                  | j                  f}| j                  }t        j                  |       D ]  } 	|||        t        | t        j                        r|t        j
                  t        j                  t        j                  fv }| j                  t        j                  t        j                  t        j                  t        j                  t        j                  fv }| j                  sJ t        | j                  | j                  dz         D ]X  }|vs|r|r||<   |r>t!        |dz
     j#                               dkD  r| j                  | j                  f|<   R||f|<   Z y y )Nr=   r   )r)   r'   r?   rE   AsyncFunctionDefrC   rD   AsyncForIfrB   r@   	__class__iter_child_nodesstmtWithrA   lenstrip)
r0   rP   rQ   
child_nodeoutermost_is_loopcurr_is_block_not_looprL   rH   rG   r   s
          r"   r   z1ScaleneAnalysis.find_outermost_loop.<locals>.walk   s   s||S__c6J6JK 4#''399cllCFF!KL3??2"c&:&::"cll2"* -1KK+I("nn!2248 H
Z!9;GH$)$/GGLLII4 %!
 *.HHFFLLOO((< *& &!$++t/BC 9D 7*38I -EGDM2 #HTAX$6$<$<$> ?! C
 .2[[$//,JGDM-14LGDM'9 *r2   r=   )	r   r&   r>   r'   r(   ASTr   rF   get)r:   r.   rB   rL   rH   rG   r   s       @@@r"   find_outermost_loopz#ScaleneAnalysis.find_outermost_loop   s     ..s399T?yy~4	9 4	9C 4	9s 4	9W[ 4	9l 	T4%h2 	DLFD%kk&662BCGFO	D r2   c                 n    dd l t        fd| j                  d            }dj                  |      } | S )Nr   c                 *    j                  dd|       S )Nz^\%.* )sub)xres    r"   <lambda>z2ScaleneAnalysis.strip_magic_line.<locals>.<lambda>   s    "a!8 r2   r<   )rg   mapr>   join)r$   rG   rg   s     @r"   r&   z ScaleneAnalysis.strip_magic_line   s1     	8&,,t:LM8$r2   N)__name__
__module____qualname__staticmethodr6   boolr#   r   r1   r9   r   intr   rN   ra   r&    r2   r"   r   r      s       6  S  T#Y    0  C  DI    >  #  $sE#s(O';"<    D A Ac5c?.B)C A AF    r2   r   )r'   r   r   systypingr   r   r   r   r   version_info
astunparser-   r   rq   r2   r"   <module>rv      sA    
  	 
 / /f$$CKD Dr2   