o
    p>e+                     @   sl  d 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ZddlmZ ddlmZ ddlmZmZ ddlmZ dadaejdkrceejjjZeed	Zd
d Zdd Zdd Z dd Z!e!g g g dfddZ"e!g g g ddfddZ#da$dd Z%dd Z&dd Z'dd Z(e!dd Z)G d d! d!Z*d"d# Z+ej,d$d% Z-dS )&z
Utility functions for

- building and importing modules on test time, using a temporary location
- detecting if compilers are present
- determining paths to tests

    N)Path)	asunicode)temppathIS_WASM)import_modulei  cygwinz**/*.dllc                   C   sZ   t d ur+ztjt  W n	 ty   Y nw ztt  W n	 ty&   Y nw d a d S d S N)_module_dirsyspathremove
ValueErrorshutilrmtreeOSError r   r   V/home/www/facesmatcher.com/pyenv/lib/python3.10/site-packages/numpy/f2py/tests/util.py_cleanup'   s   r   c                   C   s6   t d u rt a tt t tjvrtjdt  t S Nr   )	r	   tempfilemkdtempatexitregisterr   r
   r   insertr   r   r   r   get_module_dir5   s   

r   c                  C   s,   t   dt } td7 a| tjv rtd| S )Nz_test_ext_module_%d   z%Temporary module name already in use.)r   _module_numr
   modulesRuntimeError)namer   r   r   get_temp_module_name?   s   
r    c                    s   i  fdd} j |_ |S )Nc               
      sh   t | |f}|vr'z | i ||< W n ty& } z||<  d }~ww | }t|tr2||S r   )repr	Exception
isinstance)akwkeyeretfuncmemor   r   wrapperN   s   
z_memoize.<locals>.wrapper)__name__)r*   r,   r   r)   r   _memoizeK   s   r.   c              
   C   s  dt jd}t }g }g }| D ]5}	tj|	std|	 tj|tj|	}
t	|	|
 |
|
 tj|
\}}|dv rE|
|
 q|sJJ |du rQt }dd|g| | }|rc|dg| 7 }|rl|d	g| 7 }t }zAt| t jd|g| }tj|tjtjd
}| \}}|jdkrtd|dd t|f W t| |D ]}	t|	 qnt| |D ]}	t|	 qw t jdkrtttj|d| tg dt  t|S )zH
    Compile and import a f2py module, built from the given files.

    zimport sys; sys.path = z&; import numpy.f2py; numpy.f2py.main()%s is not a file).f90.fz.c.pyfNz-cz-mzskip:zonly:stdoutstderrr   zRunning f2py failed: %s
%s   r   z{:s}*)z/usr/bin/rebasez
--databasez--obliviousz	--verbose)r
   r   r   osisfiler   joinbasenamer   copyfileappendsplitextr    getcwdchdir
executable
subprocessPopenPIPESTDOUTcommunicate
returncoder   unlinkplatform_module_listextendglobformat
check_callr   )source_filesoptionsskiponlymodule_namecodeddst_sourcesZf2py_sourcesfndstbaseextZ	f2py_optscwdcmdpouterrr   r   r   build_moduled   sl   






r_   c              	   C   s   |du rd}t |d,}t|d}||  W d   n1 s!w   Y  t|g||||dW  d   S 1 s:w   Y  dS )z6
    Compile and import Fortran code using f2py.

    Nr1   )suffixwrO   rP   rQ   rR   )r   openwriter_   )Zsource_coderO   rP   rQ   r`   rR   r   fr   r   r   
build_code   s   $rf   c            	   	   C   s   t d urt S da trt S tdttj d} | tttjd } t	 }z?t
j|d}t|d}||  W d    n1 sCw   Y  tjddg}tj|tjtj|d}| \}}W t| nt| w td	|}|rtt|d
tt|dtt|dfa t S )N)FFFz8        import os
        import sys
        sys.path = a{  

        def configuration(parent_name='',top_path=None):
            global config
            from numpy.distutils.misc_util import Configuration
            config = Configuration('', parent_name, top_path)
            return config

        from numpy.distutils.core import setup
        setup(configuration=configuration)

        config_cmd = config.get_config_cmd()
        have_c = config_cmd.try_compile('void foo() {}')
        print('COMPILERS:%%d,%%d,%%d' %% (have_c,
                                          config.have_f77c(),
                                          config.have_f90c()))
        sys.exit(99)
        )Zsyspathzsetup.pyra   config)r4   r5   rZ   s   COMPILERS:(\d+),(\d+),(\d+)r         )_compiler_statusr   textwrapdedentr!   r
   r   dictr   r   r7   r9   rc   rd   r@   rA   rB   rC   rD   rE   r   r   researchboolintgroup)	rS   Ztmpdirscriptre   r[   r\   r]   r^   mr   r   r   _get_compiler_status   s<   
ru   c                   C   
   t  d S r   ru   r   r   r   r   has_c_compiler
     
rx   c                   C   rv   )Nr   rw   r   r   r   r   has_f77_compiler  ry   rz   c                   C   rv   )Nrh   rw   r   r   r   r   has_f90_compiler  ry   r{   c              
   K   s  t  }g }| D ]$}tj|std| tj|tj|}t|| |	| qt
|dd}dttj d| d}tj|t d }	|	|	 t|	d}
|
|d	 W d
   n1 shw   Y  t }z@t| tj|	ddg}tj|tjtjd}| \}}|jdkrtd|dd
 t|f W t| |D ]}t| qnt| |D ]}t| qw t| tj| S )z6
    Build a module via distutils and import it.

    r/   
z
    z!
import os
import sys
sys.path = z

def configuration(parent_name='',top_path=None):
    from numpy.distutils.misc_util import Configuration
    config = Configuration('', parent_name, top_path)
    z
    return config

if __name__ == "__main__":
    from numpy.distutils.core import setup
    setup(configuration=configuration)
    z.pywblatin1NZ	build_extz-ir3   r   z%Running distutils build failed: %s
%sr6   ) r   r7   r   r8   r   r9   r:   r   r;   r<   rk   rl   replacer!   r
   r    rc   rd   encoder>   r?   r@   rA   rB   rC   rD   rE   rF   ZasstrrG   
__import__r   )rN   Zconfig_coderR   r%   rT   rU   rV   rW   rS   rs   re   rZ   r[   r\   r]   r^   r   r   r   build_module_distutils  sV   





r   c                   @   s<   e Zd ZdZdZg Zg Zg ZdZdZ	e
dd Zdd ZdS )F2PyTestNr1   c                 C   s*   t | }d|jddd  d|j dS )N_.r   Z_ext_module)type
__module__rsplitr-   )selfclsr   r   r   rR   i  s   "zF2PyTest.module_namec                 C   sL  t jdkr
td | jd urd S t std g }| jr$|| j | jd ur/|	| j
 d}d}d}|D ]}t|drCd}q7t|drMd}q7t|drVd}q7|rat satd	 |rkt sktd
 |rxt sxt sxtd | jd urt| j| j| j| j| j
| jd| _| jd urt| j| j| j| j| jd| _d S d S )Nwin32z)Fails with MinGW64 Gfortran (Issue #9673)zNo C compiler availableFr1   Tr0   r2   z No Fortran 77 compiler availablez No Fortran 90 compiler availablezNo Fortran compiler available)rO   rP   rQ   r`   rR   rb   )r
   rH   pytestrP   modulerx   sourcesrJ   rS   r<   r`   strendswithrz   r{   rf   rO   rQ   rR   r_   )r   codesZ	needs_f77Z	needs_f90Z	needs_pyfrV   r   r   r   setup_methodn  s\   











	zF2PyTest.setup_method)r-   r   __qualname__rS   r   rO   rP   rQ   r`   r   propertyrR   r   r   r   r   r   r   `  s    
r   c                  G   s   t tjjj }|j|  S r   )r   numpyZf2py__file__parentresolvejoinpath)r$   rT   r   r   r   getpath  s   
r   c              	   c   s8    t  }t|  zd V  W t| d S t| w r   )r   rZ   r7   r?   )r   Zcurpathr   r   r   	switchdir  s   
r   ).__doc__rK   r7   r
   rA   r   r   r   rk   rn   r   
contextlibr   pathlibr   Znumpy._utilsr   Znumpy.testingr   r   	importlibr   r	   r   rH   r   r   ZNUMPY_INSTALL_ROOTlistrI   r   r   r    r.   r_   rf   rj   ru   rx   rz   r{   r   r   r   contextmanagerr   r   r   r   r   <module>   s\    

I>	
DJ