U
    e(                     @   sB  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mZ ddlmZmZ ddlmZmZ ddlmZ dada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)asbytesasstr)temppathIS_WASM)import_modulei  c                   C   sZ   t d k	rVztjt  W n tk
r,   Y nX ztt  W n tk
rP   Y nX d a d S N)_module_dirsyspathremove
ValueErrorshutilrmtreeOSError r   r   V/var/www/html/assets/scripts/venv/lib/python3.8/site-packages/numpy/f2py/tests/util.py_cleanup"   s    r   c                   C   s6   t d kr2t a tt t tjkr2tjdt  t S Nr   )	r	   tempfilemkdtempatexitregisterr   r
   r   insertr   r   r   r   get_module_dir0   s    

r   c                  C   s,   t   dt } td7 a| tjk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               
      sn   t | |f}|krTz | ||< W n, tk
rR } z||<  W 5 d }~X Y nX | }t|trj||S r   )repr	Exception
isinstance)akwkeyeretfuncmemor   r   wrapperI   s    
z_memoize.<locals>.wrapper)__name__)r*   r,   r   r)   r   _memoizeF   s    r.   c              
   C   sr  dt jd}t }g }g }| D ]j}	tj|	s<td|	 tj|tj|	}
t	|	|
 |
|
 tj|
\}}|dkr |
|
 q |st|dkrt }dd|g| | }|r|dg| 7 }|r|d	g| 7 }t }zft| t jd|g| }tj|tjtjd
}| \}}|jdkrDtd|dd t|f W 5 t| |D ]}	t|	 qVX 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
   r   r   osisfiler   joinbasenamer   copyfileappendsplitextAssertionErrorr    getcwdchdirunlink
executable
subprocessPopenPIPESTDOUTcommunicate
returncoder   r   )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_module_   sL    



rZ   c              
   C   sb   |dkrd}t |dB}t|d}||  W 5 Q R X t|g||||dW  5 Q R  S Q R X dS )z6
    Compile and import Fortran code using f2py.

    Nr1   )suffixwrJ   rK   rL   rM   )r   openwriterZ   )Zsource_coderJ   rK   rL   r[   rM   r   fr   r   r   
build_code   s    ra   c            	   	   C   s  t d k	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 5 Q R X tjddg}tj|tjtj|d}| \}}W 5 t
| X 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.pyr\   config)r4   r5   rU   s   COMPILERS:(\d+),(\d+),(\d+)r         )_compiler_statusr   textwrapdedentr!   r
   r   dictr   r   r   r   r7   r9   r^   r_   rB   rC   rD   rE   rF   rG   researchboolintgroup)	rN   Ztmpdirscriptr`   rV   rW   rX   rY   mr   r   r   _get_compiler_status   s:    
rp   c                   C   s
   t  d S r   rp   r   r   r   r   has_c_compiler   s    rr   c                   C   s
   t  d S )Nr   rq   r   r   r   r   has_f77_compiler   s    rs   c                   C   s
   t  d S )Nrc   rq   r   r   r   r   has_f90_compiler   s    rt   c              
   K   sf  t  }g }| D ]H}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}
|
t| W 5 Q R X t }zdt| tj|	d	d
g}tj|tjtjd}| \}}|jdkr.td|dd t|f W 5 t| |D ]}t| q@X 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	build_extz-ir3   r   z%Running distutils build failed: %s
%sr6   N) r   r7   r   r8   r   r9   r:   r   r;   r<   rf   rg   replacer!   r
   r    r^   r_   r   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   r   
__import__r   )rI   Zconfig_coderM   r%   rO   rP   rQ   rR   rN   rn   r`   rU   rV   rW   rX   rY   r   r   r   build_module_distutils  sH    



rz   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   rM   U  s    zF2PyTest.module_namec                 C   sL  t jdkrtd | jd k	r"d S t s2td g }| jrH|| j | jd k	r^|	| j
 d}d}d}|D ]>}t|drd}qnt|drd}qnt|drnd}qn|rt std	 |rt std
 |rt st std | jd k	rt| j| j| j| j| j
| jd| _| jd k	rHt| j| j| j| j| jd| _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)rJ   rK   rL   r[   rM   r]   )r
   platformpytestrK   modulerr   sourcesextendrN   r<   r[   strendswithrs   rt   ra   rJ   rL   rM   rZ   )r   codesZ	needs_f77Z	needs_f90Z	needs_pyfrQ   r   r   r   setup_methodZ  sX    









	zF2PyTest.setup_method)r-   r   __qualname__rN   r   rJ   rK   rL   r[   r   propertyrM   r   r   r   r   r   r{   L  s   
r{   c                  G   s   t tjjj }|j|  S r   )r   numpyZf2py__file__parentresolvejoinpath)r$   rO   r   r   r   getpath  s    r   c              	   c   s.   t  }t|  z
d V  W 5 t| X d S r   )r   rU   r7   r@   )r   Zcurpathr   r   r   	switchdir  s
    

r   )(__doc__r7   r
   rC   r   r   r   rf   ri   r   
contextlibr   pathlibr   Znumpy.compatr   r   Znumpy.testingr   r   	importlibr   r	   r   r   r   r    r.   rZ   ra   re   rp   rr   rs   rt   rz   r{   r   contextmanagerr   r   r   r   r   <module>   sR   
:>	
DJ