o
    U=ºin)  ã                   @   s>  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 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)Úimport_modulei  c                   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   ú[C:\Users\psant\Downloads\PAF backend\school\venv\Lib\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_dir0   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)ÚdÚ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   ÚwrapperI   s   €þ
z_memoize.<locals>.wrapper)Ú__name__)r*   r,   r   r)   r   Ú_memoizeF   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|du rMtƒ }dd|g| | }|r_|dg| 7 }|rh|d	g| 7 }t ¡ }zDt |¡ t jd|g| }tj|tjtjd
�}| ¡ \}}|jdkr�td|dd… t|ƒf ƒ‚W t |¡ |D ]}	t |	¡ q¥t|ƒS t |¡ |D ]}	t |	¡ q¸w )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Úsplitextr    ÚgetcwdÚchdirÚ
executableÚ
subprocessÚPopenÚPIPEÚSTDOUTÚcommunicateÚ
returncoder   Úunlinkr   )Úsource_filesÚoptionsÚskipÚonlyÚmodule_nameÚcoder   Údst_sourcesZf2py_sourcesÚfnÚdstÚbaseÚextZ	f2py_optsÚcwdÚcmdÚpÚoutÚerrr   r   r   Úbuild_module_   sV   

€
þ
ÿÿ

ùÿrX   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©rI   rJ   rK   rL   )r   ÚopenÚwriterX   )Zsource_coderI   rJ   rK   rY   rL   r
   Úfr   r   r   Ú
build_code˜   s   ÿü$ýr_   c            	   	   C   s  t d urt S da t dttjƒ› d�¡} | tttjƒd� } t ¡ }z?t	j 
|d¡}t|dƒ�}| | ¡ W d   ƒ n1 s?w   Y  tjddg}tj|tjtj|d�}| ¡ \}}W t |¡ nt |¡ w t d	|¡}|rŠt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.pyrZ   Úconfig)r4   r5   rS   s   COMPILERS:(\d+),(\d+),(\d+)r   é   é   )Ú_compiler_statusÚtextwrapÚdedentr!   r	   r
   Údictr   r   r7   r9   r\   r]   r@   rA   rB   rC   rD   rE   r   r   ÚreÚsearchÚboolÚintÚgroup)	rM   ZtmpdirÚscriptr^   rT   rU   rV   rW   Úmr   r   r   Ú_get_compiler_status¶   s8   
ýÿýýrn   c                   C   ó
   t ƒ d S r   ©rn   r   r   r   r   Úhas_c_compilerñ   ó   
rq   c                   C   ro   )Nr   rp   r   r   r   r   Úhas_f77_compilerõ   rr   rs   c                   C   ro   )Nra   rp   r   r   r   r   Úhas_f90_compilerù   rr   rt   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ƒ�}
|
 t|ƒ¡ W d	  ƒ n1 sgw   Y  t ¡ }z?t |¡ tj|	d
dg}tj|tjtjd�}| ¡ \}}|jdkr td|dd	… t|ƒf ƒ‚W t |¡ |D ]}t |¡ q¨t |¡ |D ]}t |¡ q·w 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ÚwbNÚ	build_extz-ir3   r   z%Running distutils build failed: %s
%sr6   ) r   r7   r
   r8   r   r9   r:   r   r;   r<   rd   re   Úreplacer!   r	   r    r\   r]   r   r>   r?   r@   rA   rB   rC   rD   rE   rF   r   rG   Ú
__import__r   )rH   Zconfig_coderL   r%   r   rN   rO   rP   rM   rl   r^   rS   rT   rU   rV   rW   r   r   r   Úbuild_module_distutils  sT   ýø
ÿ
þ
ÿÿ

üÿ
rz   c                   @   s4   e Zd ZdZdZg Zg Zg ZdZdZ	dZ
dd„ ZdS )ÚF2PyTestNr1   c                 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rŽt| j| j| j| j| j
| jd�| _| jd ur¤t| 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)rI   rJ   rK   rY   rL   r[   )r	   ÚplatformÚpytestrJ   Úmodulerq   ÚsourcesÚextendrM   r<   rY   ÚstrÚendswithrs   rt   r_   rI   rK   rL   rX   )ÚselfÚcodesZ	needs_f77Z	needs_f90Z	needs_pyfrO   r   r   r   Úsetup_methodQ  s\   




€





ú
	ûÿzF2PyTest.setup_method)r-   Ú
__module__Ú__qualname__rM   r€   rI   rJ   rK   rY   r   rL   r†   r   r   r   r   r{   G  s    r{   c                  G   s   t tjjƒj ¡ }|j| Ž S r   )r   ÚnumpyZf2pyÚ__file__ÚparentÚresolveÚjoinpath)r$   r   r   r   r   Úgetpath�  s   
rŽ   c              	   c   s8   � t  ¡ }t | ¡ zd V  W t |¡ d S t |¡ w r   )r   rS   r7   r?   )r
   Zcurpathr   r   r   Ú	switchdir“  s   €
r�   )'Ú__doc__r7   r	   rA   r   r   r   rd   rg   r~   Ú
contextlibr‰   Úpathlibr   Znumpy.compatr   r   Znumpy.testingr   Ú	importlibr   r   r   r   r   r    r.   rX   r_   rc   rn   rq   rs   rt   rz   r{   rŽ   Úcontextmanagerr�   r   r   r   r   Ú<module>   sT    
8û;	
DF