
    h3                     >   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
Z
d dlZd dlmZ d dlmZ e	j                   dk\  r	d dlmZmZ nd dlmZmZ d dlmZmZ d dlmZ d d	lmZ d*d
Zd Z G d de      Z G d d      Z  G d d      Z! G d d      Z" G d d      Z# G d d      Z$ G d d      Z% G d d      Z& G d d      Z' G d de'e      Z( G d  d!e'e      Z)d" Z* G d# d$e jV                        Z,d% Z-d& Z.e	j                   fd'Z/d( Z0d) Z1y)+    N)StringIO)defaultdict)      )EXTENSION_SUFFIXESExtensionFileLoader)r   r   )ProcessQueue)Empty)Threadc                     t        | |d      }t        j                  |      }|j                  j	                  |xs i        t        ||j                         |S )Nexec)compiletypes
ModuleType__dict__updater   )ast_nodemodule_namemodule_dictcodemodules        /home/xtuchyna/.var/app/com.visualstudio.code/data/virtualenvs/gen-test-bench-v8TMe8KL/lib/python3.12/site-packages/mutpy/utils.pycreate_moduler      sJ    8[&1Dk*F
OO;,"-vM    c                     | S N )sths    r   	notmutater    "   s    Jr   c                       e Zd Zd Zd Zy)ModulesLoaderExceptionc                      || _         || _        y r   )name	exception)selfr$   r%   s      r   __init__zModulesLoaderException.__init__'   s    	"r   c                 8    dj                  | j                        S )Nzcan't load {})formatr$   r&   s    r   __str__zModulesLoaderException.__str__+   s    %%dii00r   N)__name__
__module____qualname__r'   r+   r   r   r   r"   r"   &   s    #1r   r"   c                       e Zd Zd ZddZd Zd Zed        Zed        Z	ed        Z
d	 Zd
 Zed        Zed        Zd Zd Zed        Zed        Zed        Zed        Zy)ModulesLoaderc                 ^    || _         |xs d| _        | j                  | j                         y N.)namespathensure_in_path)r&   r4   r5   s      r   r'   zModulesLoader.__init__0   s&    
KC	DII&r   Nc              #      K   g }|xs g }| j                   D ]  }|| j                  |      z  } |D ]$  \  }}||vs|r| j                  |      r||f & y wr   )r4   load_single_is_c_extension)r&   without_modulesexclude_c_extensionsresultsr$   r   	to_mutates          r   loadzModulesLoader.load5   sk     )/RJJDt''--G !(FI_,6JtOcOcdjOki'' ")s   :AA	Ac                 P   | j                  |      }t        j                  j                  |      rD| j	                  |      r| j                  |      S | j                  |      r| j                  |      S | j                  |      r| j                  |      S | j                  |      S r   )get_full_pathosr5   existsis_file	load_fileis_directoryload_directory
is_packageload_packageload_module)r&   r$   	full_paths      r   r8   zModulesLoader.load_single?   s    &&t,	77>>)$||I&~~i00""9-**955??4 $$T**##D))r   c                     t         j                  j                  |      r|S t         j                  j                  t         j                  j	                  | j                  |            S r   )rA   r5   isabsabspathjoinr&   r$   s     r   r@   zModulesLoader.get_full_pathK   s=    77==Kwwrww||DIIt<==r   c                 @    t         j                  j                  |       S r   )rA   r5   isfiler$   s    r   rC   zModulesLoader.is_fileP   s    ww~~d##r   c                     t         j                  j                  |       xr t         j                  j                  |       S r   )rA   r5   rB   isdirrR   s    r   rE   zModulesLoader.is_directoryT   s'    ww~~d#;d(;;r   c                 ^   	 t        j                  |       }t        |d      xr |j                  j	                  d      	 t
        j                  j                          S # t        $ r! Y t
        j                  j                          yw xY w# t
        j                  j                          w xY w)N__file____init__.pyF)		importlibimport_modulehasattrrV   endswithsyspath_importer_cacheclearImportError)r$   r   s     r   rG   zModulesLoader.is_packageX   s    	,,,T2F6:.Z6??3K3KM3ZZ ##))+  	##))+	 ##))+s#   =A 	B	(B B		B  B,c                     |j                  d      rRt        j                  j                  |      }| j	                  |       | j                  |      }| j                  |      S y )Nz.py)r[   rA   r5   dirnamer6   get_filename_without_extensionrI   )r&   r$   ra   r   s       r   rD   zModulesLoader.load_fileb   sT    ==ggood+G(==dCK##K00	  r   c                 j    |t         j                  vr!t         j                  j                  d|       y y Nr   )r\   r5   insert)r&   	directorys     r   r6   zModulesLoader.ensure_in_pathi   s%    CHH$HHOOAy) %r   c                     t         j                  j                  t         j                  j                  |       d         S rd   )rA   r5   basenamesplitext)r5   s    r   rb   z,ModulesLoader.get_filename_without_extensionm   s+    ww 0 0 6q 9::r   c                 V   g }	 t        j                  |       }t        j                  |j                  |j
                  dz         D ]2  \  }}}|r
	 t        j                  |      }|j                  |d f       4 	 |S # t        $ r
}Y d }~Fd }~ww xY w# t        $ r}Y d }~|S d }~ww xY wr2   )rX   rY   pkgutilwalk_packages__path__r,   appendr_   )r$   resultpackage_r   ispkgr   s          r   rH   zModulesLoader.load_packageq   s    
	--d3G)0)>)>w?O?OQXQaQadgQg)h%;!*!8!8!Evtn5	 *i 	 '  		s6   AB (A>9B >	BB BB 	B(#B(c                    t         j                  j                  t         j                  j                  |d            rP| j	                  |      }| j                  |       | j                  t         j                  j                  |            S g }t        j                  |      D ]9  }| j                  t         j                  j                  ||            }|s5||z  }; |S )NrW   )
rA   r5   rQ   rN   _get_parent_directoryr6   rH   rh   listdirr8   )r&   r$   
parent_dirro   filemoduless         r   rF   zModulesLoader.load_directory   s    77>>"'',,t];<33D9J
+$$RWW%5%5d%;<<F

4(**277<<d+CDg%F ) Mr   c                     | j                  |      \  }}}| j                  ||      st        ||      ||rdj                  |      fgS d fgS r2   )_split_by_module_and_remainder_module_has_memberr"   rN   )r&   r$   r   remainder_pathlast_exceptions        r   rI   zModulesLoader.load_module   s[    151T1TUY1Z.&&v~>(~>>^.1NOONOOr   c                     t         j                  j                  t         j                  j                  | t         j                              }|S r   )rA   r5   rM   rN   pardir)r$   rv   s     r   rt   z#ModulesLoader._get_parent_directory   s-    WW__RWW\\$		%BC
r   c                     | j                  d      }g }d}	 	 t        j                  dj                  |            }	 |||fS # t        $ r.}|j                         g|z   }|}|st        | |      Y d}~nd}~ww xY wf)zTakes a path string and returns the contained module and the remaining path after it.

        Example: "mymodule.mysubmodule.MyClass.my_func" -> mysubmodule, "MyClass.my_func"
        r3   N)splitrX   rY   rN   r_   popr"   )r$   module_pathmember_pathr}   r   errors         r   rz   z,ModulesLoader._split_by_module_and_remainder   s     jjoG"00+1FG {N22  G*01K?!&"0~FF #G	 s   $A 	A9$A44A9c                 J    | }|D ]  }t        ||      rt        ||      } y y)NFT)rZ   getattr)r   r   attrparts       r   r{   z ModulesLoader._module_has_member   s/    DtT"tT*	  
 r   c                     t        t        | dd       t              ryt        j                  |       }t
        j                  j                  |      d   }|t        v S )N
__loader__T   )	
isinstancer   r   inspectgetfilerA   r5   ri   r   )r   module_filenamemodule_filetypes      r   r9   zModulesLoader._is_c_extension   sL    gflD9;NO!//&1''**?;A>"444r   )NT)r,   r-   r.   r'   r>   r8   r@   staticmethodrC   rE   rG   rD   r6   rb   rH   rF   rI   rt   rz   r{   r9   r   r   r   r0   r0   /   s    '
(
*>
 $ $ < < , ,1* ; ;  P   3 3&   5 5r   r0   c                   6    e Zd Zd ZddZd Zd Zed        Zy)InjectImporterc                 v    	 t         j                  |j                  = || _        y # t        $ r
 Y || _        y w xY wr   )r\   rx   r,   KeyErrorr   )r&   r   s     r   r'   zInjectImporter.__init__   s;    	FOO,   		s   % 	88Nc                 :    || j                   j                  k(  r| S y r   )r   r,   )r&   fullnamer5   s      r   find_modulezInjectImporter.find_module   s    t{{+++Kr   c                 `    | | j                   _        | j                   t        j                  |<   y r   )r   r   r\   rx   )r&   r   s     r   rI   zInjectImporter.load_module   s     !% $Hr   c                     t        t        j                  d   | j                        r| t        j                  d<   y t        j                  j	                  d|        y rd   )r   r\   	meta_path	__class__re   r*   s    r   installzInjectImporter.install   s;    cmmA&7#CMM!MM  D)r   c                 b    t        t        j                  d   |       rt        j                  d= y y rd   )r   r\   r   clss    r   	uninstallzInjectImporter.uninstall   s&    cmmA&,a  -r   r   )	r,   r-   r.   r'   r   rI   r   classmethodr   r   r   r   r   r      s*    ,* ! !r   r   c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
ModuleInjectorc                     || _         y r   )source)r&   r   s     r   r'   zModuleInjector.__init__   	    r   c                     |j                   j                         D ]$  }|j                   |   }| j                  |||       & y r   )r   copy"_ModuleInjector__perform_injection)r&   targetimported_asartifacts       r   	inject_tozModuleInjector.inject_to   s9    !??//1K{3H$$[(FC 2r   c                     t        j                  |      r| j                  |||       y t        j                  |      st        j                  |      r| j                  |||       y | j                  ||       y r   )r   ismoduletry_inject_moduleisclass
isfunctiontry_incject_class_or_functiontry_inject_other)r&   r   artefactr   s       r   __perform_injectionz"ModuleInjector.__perform_injection   s]    H%"";&A__X&'*<*<X*F..{HfM!!+v6r   c                     | j                  |d      | j                  j                  k(  r5|j                  | j                  _        | j                  |j                  |<   y y Nr,   )safe_getattrr   r,   rV   r   )r&   r   r   r   s       r   r   z ModuleInjector.try_inject_module   sI    VZ0DKK4H4HH#)??DKK +/;;FOOK( Ir   c                     | j                  |d      | j                  j                  v r7| j                  j                  | j                  |d         |j                  |<   y y r   )r   r   r   )r&   r   class_or_functionr   s       r   r   z,ModuleInjector.try_incject_class_or_function   sT    .
;t{{?S?SS+/;;+?+?@Q@QRceo@p+qFOOK( Tr   c                     || j                   j                  v r9| j                  |      s'| j                   j                  |   |j                  |<   y y y r   )r   r   is_restricted)r&   r   r   s      r   r   zModuleInjector.try_inject_other   sG    $++...t7I7I+7V+/;;+?+?+LFOOK( 8W.r   c                 
    |dv S )N)__builtins__r,   __doc__rV   r   rO   s     r   r   zModuleInjector.is_restricted   s    JJJr   c                 .    t         j                  ||      S r   )object__getattribute__)r&   objr$   s      r   r   zModuleInjector.safe_getattr   s    &&sD11r   N)r,   r-   r.   r'   r   r   r   r   r   r   r   r   r   r   r   r      s.    D
77
rMK2r   r   c                        e Zd ZddZd Zd Zy)StdoutManagerc                      || _         d | _        y r   )disableoriginal_stdout)r&   r   s     r   r'   zStdoutManager.__init__  s    #r   c                 n    | j                   r)t        j                  | _        t	               t        _        y y r   )r   r\   stdoutr   r   r*   s    r   	__enter__zStdoutManager.__enter__	  s#    <<#&::D !CJ r   c                 H    | j                   r| j                  t        _        y y r   )r   r   r\   r   )r&   typevalue	tracebacks       r   __exit__zStdoutManager.__exit__  s    <<--CJ r   N)T)r,   r-   r.   r'   r   r   r   r   r   r   r     s    $$
.r   r   c                   0    e Zd Zej                  Zd Zd Zy)Timerc                 <    d| _         | j                         | _        y rd   )durationtime_providerstartr*   s    r   r'   zTimer.__init__  s    '')
r   c                 ^    | j                         | j                  z
  | _        | j                  S r   )r   r   r   r*   s    r   stopz
Timer.stop  s%    **,tzz9}}r   N)r,   r-   r.   timer   r'   r   r   r   r   r   r     s    IIM*r   r   c                   H    e Zd Z ee      ZeZg Zd Z	ddZ
d Zed        Zy)TimeRegisterc                     || _         y r   )method)r&   r   s     r   r'   zTimeRegister.__init__$  r   r   Nc                 .    t        j                  | |      S r   )r   
MethodType)r&   r   
ownerClasss      r   __get__zTimeRegister.__get__'  s    c**r   c                    | j                   r.| j                   d   | j                  k(  r | j                  |i |S | j                   j                  | j                         | j                         } | j                  |i |}| j                  | j                  j
                  xx   |j                         z  cc<   | j                   j                          |S )N)stackr   rn   timer_class
executionsr,   r   r   )r&   argskwargstime_regro   s        r   __call__zTimeRegister.__call__*  s    ::$**R.DKK74;;///

$++&##%d-f-,,-@-

r   c                 F    | j                   j                          g | _        y r   )r   r^   r   r   s    r   cleanzTimeRegister.clean6  s    	r   r   )r,   r-   r.   r   floatr   r   r   r   r'   r   r   r   r   r   r   r   r   r     s9    U#JKE+
  r   r   c                       e Zd Zd Zd Zy)RandomSamplerc                 :    d|cxk  rdk  r	|| _         y  d| _         y )Nr   d   )
percentage)r&   r   s     r   r'   zRandomSampler.__init__=  s    ()J(<(<*(<#r   c                 F    t        j                  d      | j                  k  S )Nr   )random	randranger   r*   s    r   is_mutation_timezRandomSampler.is_mutation_time@  s    $t66r   N)r,   r-   r.   r'   r   r   r   r   r   r   <  s    F7r   r   c                   $     e Zd Z fdZd Z xZS )MutationTestRunnerc                 0    t         |           || _        y r   )superr'   suite)r&   r   r   s     r   r'   zMutationTestRunner.__init__E  s    
r   c                 Z    | j                   j                         }| j                  |       y r   )r   run
set_resultr&   ro   s     r   r   zMutationTestRunner.runI  s    !r   )r,   r-   r.   r'   r   __classcell__r   s   @r   r   r   D  s     r   r   c                   *     e Zd Z fdZd Zd Z xZS )MutationTestRunnerProcessc                 B    t        |   |i | t               | _        y r   )r   r'   r
   queuer&   r   r   r   s      r   r'   z"MutationTestRunnerProcess.__init__O  s    $)&)W
r   c                 Z    	 | j                   j                  |      S # t        $ r Y y w xY w)N)timeout)r  getr   r&   	live_times     r   
get_resultz$MutationTestRunnerProcess.get_resultS  s.    	::>>)>44 		s    	**c                 V    | j                   j                  |j                                y r   )r  
put_nowait	serializer  s     r   r  z$MutationTestRunnerProcess.set_resultY  s    

f..01r   )r,   r-   r.   r'   r  r  r  r  s   @r   r  r  N  s    2r   r  c                   4     e Zd ZdZ fdZd Zd Zd Z xZS )MutationTestRunnerThreadTc                 2    t        |   |i | d | _        y r   )r   r'   ro   r	  s      r   r'   z!MutationTestRunnerThread.__init__`  s    $)&)r   c                    | j                         rut        j                  j                  t        j                  | j
                        t        j                  t                    }|dk(  rt        d      |dk7  rt        d      y y )Nr   zInvalid thread id.r   zThread killing failed.)
isAlivectypes	pythonapiPyThreadState_SetAsyncExcc_longident	py_object
SystemExit
ValueErrorSystemError)r&   ress     r   	terminatez"MutationTestRunnerThread.terminated  sm    <<>""<<V]]4::=VX^XhXhisXtuCax !566!":;; 	 r   c                     || _         y r   )ro   r  s     r   r  z#MutationTestRunnerThread.set_resultl  r   r   c                 z    | j                  |       | j                         ry | j                  j                         S r   )rN   is_alivero   r  r  s     r   r  z#MutationTestRunnerThread.get_resulto  s-    		)==?{{$$&&r   )	r,   r-   r.   daemonr'   r"  r  r  r  r  s   @r   r  r  ]  s    F<'r   r  c                  @    t         j                  dk(  rt        S t        S )Nnt)rA   r$   r  r  r   r   r   get_mutation_test_runner_classr)  v  s    	ww$''((r   c                        e Zd Z fdZ xZS )ParentNodeTransformerc                 Z   t        |dd       r#t        j                  |      }t        |d      r|`t        | dd       |_        g |_        || _        t        |   |      }|j                  | _        | j                  r-| j                  xj
                  |g|j
                  z   z  c_        |S )Nparentlineno)r   r   rZ   r.  r-  childrenr   visit)r&   noderesult_noder   s      r   r0  zParentNodeTransformer.visit~  s    44(99T?DtX&KdHd3gmD)kk;;KK  TFT]]$:: r   )r,   r-   r.   r0  r  r  s   @r   r+  r+  }  s     r   r+  c                 Z    t               j                  t        j                  |             S r   )r+  r0  astparse)r   s    r   
create_astr6    s     "((499r   c                    | j                   j                   }t        |t        j                  t        j                  t        j
                  f      xr |j                  xrx t        |j                  d   t        j                        xrO t        |j                  d   j                  t        j                        xr |j                  d   j                  | k(  S rd   )
r-  r   r4  FunctionDefClassDefModulebodyExprr   Str)r1  def_nodes     r   is_docstringr?    s    {{!!Hx#//3<<!LM +RZR_R_ +x}}Q'2+7A(--PQBRBXBXZ]ZaZa7b+MM!""d*,r   c                     | D cg c]  }|j                   |k  s| }}|s(t        dj                  t        j                              t        |D cg c]  }| c}d       S c c}w c c}w )Nz!MutPy does not support Python {}.c                     | j                   S r   )__python_version__r   s    r   <lambda>z'get_by_python_version.<locals>.<lambda>  s
    H^H^r   key)rB  NotImplementedErrorr)   r\   versionmax)classespython_versionr   
candidates	candidates        r   get_by_python_versionrM    si    !(U#C,B,Bn,T#JU!"E"L"LS[["YZZ:6:i	:6<^__ V 7s   A&A&	A+c                     t        | d       S )Nc                 "    | j                         S r   rR   r   s    r   rC  z sort_operators.<locals>.<lambda>  s
    SXXZr   rD  )sorted)	operatorss    r   sort_operatorsrR    s    )!788r   c                     | j                  d      dd }t        j                  d|d         j                  d      dj	                  fd|D              S )N
r   r   z(\s*).*r   c              3   :   K   | ]  }|t              d    y wr   )len).0line	indentions     r   	<genexpr>zf.<locals>.<genexpr>  s     =utT#i./*us   )r   researchgrouprN   )textlinesrY  s     @r   fr`    sL    JJtQr"E		)U1X.44Q7I99=u===r   )mutantN)2r4  r   r  rX   r   rA   rk   r   r[  r\   r   r   _pyior   collectionsr   version_infoimportlib._bootstrap_externalr   r   importlib._bootstrapmultiprocessingr	   r
   r  r   	threadingr   r   r    	Exceptionr"   r0   r   r   r   r   r   r   r   r  r  r)  NodeTransformerr+  r6  r?  rM  rR  r`  r   r   r   <module>rk     s   
     	   	 
    #vUUL *  1Y 1N5 N5b! !<#2 #2L. .	 	 :7 7   2 2G 2'16 '2)C//  :, 362B2B `9>r   