K ilddlZddlZddlZddlZddlZddlZddlmZddlm Z ddl Z ddl m Z ddlmZddlmZdZed d ZdQd Ze j*d dZe j*d dZe j*d dZe j*d dZe j*d dZe j*d dZdZdZdZdZdZ dZ!e jDjGejHdkddZ%e jDjGejLdk7xsejHdkdd Z'e jDjPd!Z)d"Z*d#Z+d$Z,d%Z-d&Z.d'Z/d(Z0d)Z1d*Z2d+Z3d,Z4d-Z5d.Z6d/Z7e jDjqd0d1Z9d2Z:d3Z;d4Zd7Z?d8Z@d9ZAd:ZBe jDjqd0d;ZCe jDjGejLdk7xsejHdkd<d=ZDe jDjGejLdk7xsejHdkd<d>ZEd?ZFd@ZGdAZHdBZIdCZJdDZKdEZLdFZMdGZNdHZOdIZPdJZQdKZRdLZSdMZTdNZUdOZVdPZWy)RN) namedtuple)Path)main) NOGIL_BUILD)utilcltjstjdyt y)Nz$CLI command needs a Fortran compiler)rhas_fortran_compilerpytestskipf2pyclib/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/numpy/f2py/tests/test_f2py2e.pycompiler_check_f2pyclirs  $ $ & :; rPPathsz(finp, f90inp, pyf, wrap77, wrap90, cmodfc t|}t|jd|jd|jd|j|d|j|d|j|dS)axTakes in a temporary file for testing and returns the expected output and input paths Here expected output is essentially one of any of the possible generated files. ..note:: Since this does not actually run f2py, none of these are guaranteed to exist, and module names are typically incorrect Parameters ---------- fname_inp : str The input filename mname : str, optional The name of the module, untitled by default Returns ------- genp : NamedTuple PPaths The possible paths which are generated, not all of which exist z.fz.f90.pyfz-f2pywrappers.fz-f2pywrappers2.f90module.c)finpf90inppyfwrap77wrap90cmodf)rr with_suffix with_name) fname_inpmnamebpaths r get_io_pathsr!%s~. OE    t $  (   f %%89%(:;<oox01  rsession)scopectjddddj}|jdz }|j |d|S)'Generates a single f90 file for testingtestssrccliz hiworld.f90z hello.f90asciiencodingrgetpath read_text getbasetemp write_texttmpdir_factoryfdatfns rhello_world_f90r5LsI <<} = G G ID  # # % 3BMM$M) Irctjddddj}|jdz }|j |d|S)z(F90 file for testing warnings in gh23598r&r' crackfortranzgh23598Warn.f90r)r*r,r1s r gh23598_warnr8UsK <<8I J T T VD  # # %(9 9BMM$M) Irctjddddj}|jdz }|j |d|S)z8F90 file for testing disallowed CLI arguments in ghff819r&r'r(z gh_22819.pyfr)r*r,r1s r gh22819_clir:^sI <<~ > H H JD  # # % 6BMM$M) Irctjddddj}|jdz }|j |d|S)'Generates a single f77 file for testingr&r'r(zhi77.fzhello.fr)r*r,r1s rhello_world_f77r=gsI <<x 8 B B DD  # # % 1BMM$M) Irctjddddj}|jdz }|j |d|S)r<r&r' return_realzfoo77.fzfoo.fr)r*r,r1s r retreal_f77r@psI << y A K K MD  # # % /BMM$M) Irc6tjddddj}tjddddj}|jdz }|jdz }|j |d |j |d |S) r%r&r'f2cmapzisoFortranEnvMap.f90z .f2py_f2cmapz f2cmap.f90mapfiler)r*r,)r2r3rBr4fmaps r f2cmap_f90rExs <<2H I S S UD \\'5(N C M M OF  # # % 4B  % % ') 3DMM$M)OOFWO- Irct|}|jtdd|jt j |j 5t|j jdDcgc]}|js|j!}}d|vsJd|vsJd|vsJd|vsJ dddycc}w#1swYyxYw) zCheck that module names are handled correctly gh-22819 Essentially, the -m name cannot be used to import the module, so the module named in the .pyf needs to be used instead CLI :: -m and a .pyf file argv f2py -m blah *z blahmodule.czblah-f2pywrappers.fztest_22819-f2pywrappers.fztest_22819module.cN) rsetattrsyssplitr switchdirparentr rglobis_filename)capfdr: monkeypatchipathitem gen_pathss rtest_gh22819_clirWs  EV}UG%<%B%B%DE  %1 +0<<+=+=c+BU4dllnTYYU UY...$I555*i777#y000 11U11s$(C;CCCCCcHt|}|jtdd|djt j |j 5tjtd5tddddddy#1swYxYw#1swYyxYw)zBOnly one .pyf file allowed gh-22819 CLI :: .pyf files rGrHz hello.pyfzOnly one .pyf file per call)matchN) rrJrKrLrrMrNr raises ValueErrorr )rRr:rSrTs rtest_gh22819_many_pyfr\s  EV}UG:%F%L%L%NO  % ]]:-J K  I   s$B0 B ;B B BB!cFt|d}|j}|jtdd|dj t j |j5t|jj}d|vsJ dddy#1swYyxYw)NtestrrGf2py z -m testzintproductf2pywrap, intpr) r!rrJrKrLrrMrNr rr.)rRr8rSfoutlrTwrappers rtest_gh23598_warnrcs V 4E LLE V wh%%')  %: ,,((**'999:::s "+BB ct|}t|jdz}|jtdd|d|j t j |j5t|j\}}d|vsJt|jsJ dddy#1swYyxYw)zIEnsures that a signature file is generated via the CLI CLI :: -h rrGzf2py -h  Saving signatures to fileN) rstemrJrKrLrrMrNr readouterrexists)rRr5rSrTopathout_s r test_gen_pyfrms  !E  ! & & /EVxwaw%?%E%E%GH  %) !!#Q*c111ug&&((( )))s .AB88Cc&t|}|jtdd|jt j |j 5t|j\}}d|vsJd|vsJ dddy#1swYyxYw)zHEnsures that a signature file can be dumped to stdout CLI :: -h rGzf2py -h stdout rfzfunction hi() ! in N rrJrKrLrrMrNr rhrRr5rSrTrkrls rtest_gen_pyf_stdoutrqs  !EVug%>%D%D%FG  %, !!#Q*c111$+++ ,,,s *BBct|}|jtdd|jt j |j 5tdjddtjt5t|j\}}d|vsJ ddddddy#1swYxYw#1swYyxYw) zjEnsures that the CLI refuses to overwrite signature files CLI :: -h without --overwrite-signature rGf2py -h faker.pyf faker.pyf Fake newsr)r*z&Use --overwrite-signature to overwriteN) rrJrKrLrrMrNr0r rZ SystemExitr rh)rRr5rSrTrlerrs rtest_gen_pyf_no_overwriterxs  !EV'9%%A%G%G%IJ  %C [$$[7$C ]]: & C I%%'FAs;sB BB CCC C CCCs$6C  $B?.C ?C C  C) zPython 3.12 required)reasonct|}|jtdd|jt j |j 5t|j\}}d|vsJ dddy#1swYyxYw)z@Check that modules are named correctly CLI :: defaults rGzf2py --backend meson -c zuntitledmodule.cN) rrJrKrLrrMrNrrhrps rtest_untitled_clir}s|  !EV'?w%G%M%M%OP  %) !!#Q!S((()))s $BB LinuxzCompiler and 3.12 requiredc .d}t||}|j}|jtdd|d|j t j |j5t|j\}}d|vsJ ddd|jtddd gt j |j5t|j\}}d |vsJ dddd }|jtdd|d |d j t j |j5t|j\}}d|vsJ dddy#1swYxYw#1swYxYw#1swYyxYw)zqCheck that no distutils imports are performed on 3.12 CLI :: --fcompiler --help-link --backend distutils hir_rGr`z -c --fcompiler=gfortran -m z%--fcompiler cannot be used with mesonNf2pyz --help-linkzUse --dep for meson buildshi2z -c -m z --backend distutilsz.Cannot use distutils backend with Python>=3.12) r!rrJrKrLrrMrNrrhr )rRr5rSMNAMErarTrkrls r!test_no_py312_distutils_fcompilerrs E  6E LLE VuUG#?wGMMO  %> !!#Q6#===> Vfm,  %3 !!#Q+s2223 E VuUG75'1EFLLN  %G !!#Q?3FFFGG>>33GGs$&$E3 $E?$F 3E<?F Fct|d}|j}d}d}|jtdd|d|j t j |j5t|j\}}|j D] } d| d |vr J|j D] } d | d |vr J d d d y #1swYy xYw) z9Tests that functions can be skipped CLI :: skip: r^r_t0 t4 t8 sd s8 s4td s0rGr`z -m test skip: z=buildmodule: Could not found the body of interfaced routine " ". Skipping.Constructing wrapper function ""N r!rrJrKrLrrMrNr rh) rRr@rSrarTtoskip remainingrkrwskeyrkeys rtest_f2py_skipr s F 3E JJE FI V wofX.4468  %D ##%SLLN DOPTvUab  OO% DD4TF!<C CC DDDD(9C"CCCct|d}|j}d}d}|jtdd|d|j t j |j5t|j\}}|j D] } d| d |vr J|j D] } d | d |vr J d d d y #1swYy xYw) z>Test that functions can be kept by only: CLI :: only: r^r_rrrGr`z -m test only: -h pyf_file BUG: numpy-gh #20520 rr_rGr`rz -h hi.pyfzhi.pyfzpython module hiN) r!rrJrKrLrrMrNr ropenread)rRr=rSrrarThipyfpyfdats rtest_mod_gen_gh25263rjs E  6E JJEVuUG4wj%I%O%O%QR  %0 (^ " 0eZZ\F%/ // 000 0 000s$'$C B4#C4B= 9CC ct|d}|j}tjd}tjd}|j t dd|dj tj|j5t|j\}}|j|J|j|J ddd|j t dd|d j tj|j5t|j\}}|j|J|j|J dddy#1swYxYw#1swYyxYw) zHLowers cases by flag or when -h is present CLI :: --[no-]lower r^r_zHI\(\)zhi\(\)rGr`z -m test --lowerNz -m test --no-lower) r!rrecompilerJrKrLrrMrNr rhsearch rRr=rSrarTcapshicapslorkrls rtest_lower_cmodrzsV  7E JJE ZZ "F ZZ "FVuUG3C%D%J%J%LM  %* !!#Q}}S!---}}S!))) * Vw&9:@@BD  %. !!#Q}}S!)))}}S!--- ..**..s AE/!AE;/E8;Fc Bt|d}|j}tjd}tjd}|j t dd|d|j djtj|j5t|j\}}|j|J|j|J d d d |j t dd|d|j d jtj|j5t|j\}}|j|J|j|J d d d y #1swYxYw#1swYy xYw) z^Lowers cases in signature files by flag or when -h is present CLI :: --[no-]lower -h r^r_z Block: HIz Block: hirGr`z -h z -m test --overwrite-signatureNz) -m test --overwrite-signature --no-lower)r!rrrrJrKrrLrrMrNr rhrrs rtest_lower_sigrst  7E JJE ZZ %F ZZ %F  wd599+%CDJJL  %* !!#Q}}S!---}}S!))) *  wd599+%NO    %. !!#Q}}S!)))}}S!--- ..**..sAF ;AF FFc 6t|}d}d}|jtdd|d|d|jt j |j 5t|j\}}d|d|vsJ d d d y #1swYy xYw) zNEnsures that the build directory can be specified CLI :: --build-dir rtttmprGf2py -m rez --build-dir zWrote C/API module "rNro)rRr5rSrTrodirrkrls rtest_build_dirrs  !E E DV"5'5'tfEKKMO  %8 !!#Q&ugR0C777888s (BBcTt|}|jtdd|djt j |j 5tdjddt|j\}}d|vsJ d d d y #1swYy xYw) zXEnsures that the build directory can be specified CLI :: --overwrite-signature rGrsz --overwrite-signaturertrur)r*rfN) rrJrKrLrrMrNr0r rhrps rtest_overwriters  !E V UG#9:@@BD  %2 [$$[7$C !!#Q*c111 222s ABB'c t|}d}|jtdd|d|djt j |j 5t|j\}}d|vsJt|dj5}d|jvsJ d d d d d d y #1swYxYw#1swYy xYw) zJEnsures that TeX documentation is written out CLI :: --latex-doc rrGrrez --latex-docDocumentation is saved to file module.tex\documentclassN rrJrKrLrrMrNr rhrrrRr5rSrTrrkrlotexs r test_latexdocrs  !E EV"5'5'>DDFH  %4 !!#Q/3666 UG:& ' , , . 4$$ 3 33 4 44 4 4 44s%AC C/C C C  Cc &t|}d}|jtdd|d|djt j |j 5t|j\}}d|vsJ dddy#1swYyxYw)zMEnsures that TeX documentation is written out CLI :: --no-latex-doc rrGrrez --no-latex-docrNrorRr5rSrTrrkrls rtest_nolatexdocrs  !E EV"5'5'AGGIK  %; !!#Q/s:::;;; $BBc t|}d}|jtdd|d|djt j |j 5t|j\}}d|vsJtd|dj5}d |jvsJ d d d d d d y #1swYxYw#1swYy xYw) zEnsures that truncated documentation is written out TODO: Test to ensure this has no effect without --latex-doc CLI :: --latex-doc --short-latex rrGrrez --latex-doc --short-latexr./rrNrrs rtest_shortlatexrs  !E E  5'5'!;<BBD  %8 !!#Q/3666 BugZ( ) . . 0 8D$DIIK7 77 8 88 8 8 88%AC C0C C C  Cc t|}d}|jtdd|d|djt j |j 5t|j\}}d|vsJtd|dj5}d |jvsJ d d d d d d y #1swYxYw#1swYy xYw) zIEnsures that RsT documentation is written out CLI :: --rest-doc rrGrrez --rest-doc#ReST Documentation is saved to filerz module.restz.. -*- rest -*-Nr)rRr5rSrTrrkrlorsts r test_restdocrs  !E EV"5'5'=CCEG  %5 !!#Q4;;; Bug[) * / / 1 5T%4 44 5 55 5 5 55rc &t|}d}|jtdd|d|djt j |j 5t|j\}}d|vsJ dddy#1swYyxYw)zLEnsures that TeX documentation is written out CLI :: --no-rest-doc rrGrrez --no-rest-docrNrors rtest_norestexdocr's  !E EV"5'5'@FFHJ  %@ !!#Q4C???@@@rc t|}d}|jtdd|d|djt j |j 5ttd|dj5}d|jvsJ d d d d d d y #1swYxYw#1swYy xYw) zIEnsures that debugging wrappers are written CLI :: --debug-capi rrGrrez --debug-capirrz#define DEBUGCFUNCSN rrJrKrLrrMrNr rr)rRr5rSrTrocmods rtest_debugcapir7s  !E EV"5'5'?EEGI  %: BugX& ' , , . :%)UZZ\9 99 ::: : :::s$(B4B(B4(B1 -B44B=z2Consistently fails on CI; noisy so skip not xfail.c t|}d}|jtdd|d|djt j |j 5ttjtjd}tj|dd }d }tjd }|j|k(sJ|j|k(sJ d d d y #1swYy xYw) zEEnsures that debugging wrappers work CLI :: --debug-capi -c rrGrrez -c --debug-capi -c "import blah; blah.hi()"TUTF-8capture_outputr+ Hello World a debug-capi:Python C/API function blah.hi() debug-capi:float hi=:output,hidden,scalar debug-capi:hi=0 debug-capi:Fortran subroutine `f2pywraphi(&hi)' debug-capi:hi=0 debug-capi:Building return value. debug-capi:Python C/API function blah.hi: successful. debug-capi:Freeing memory. N)rrJrKrLrrMrNr shlex executable subprocessruntextwrapdedentstdoutstderr)r5rSrTrcmd_runrouteouteerrs rtest_debugcapi_bldrGs  !E EV"5'5'1ABHHJL  %# ++ 00NOP~~gdWM  {{d"""{{d"""!###s BC%%C.c *t|}d}|jtdd|d|jt j |j 5tddd|j\}}d|vsJ|jtdd|d|djt j |j 5t|j\}}d|vsJ dddy#1swYxYw#1swYyxYw)zoEnsures that fortran subroutine wrappers for F77 are included by default CLI :: --[no]-wrap-functions rrGrreN Fortran 77 wrappers are saved toz --wrap-functionsrors rtest_wrapfunc_defres  !E EVxwaw%?%E%E%GH  %     FC .# 55 5V"5'5'1BCIIKM  %: !!#Q2c999::::s C=$D =D Dc &t|}d}|jtdd|d|djt j |j 5t|j\}}d|vsJ dddy#1swYyxYw)zeEnsures that fortran subroutine wrappers for F77 can be disabled CLI :: --no-wrap-functions rrGrrez --no-wrap-functionsrNrors rtest_nowrapfuncr~s  !E EV"5'5'1EFLLNP  %> !!#Q2#===>>>rc t|}d}|jtdd|d|djt j |j 5ttd|dj5}|j}d|vsJd |vsJ d d d d d d y #1swYxYw#1swYy xYw) zcAdd to the include directories CLI :: -include TODO: Document this in the help string rrGrrez' -include -include rrz#include z#include Nr)rRr5rSrTrrocmrs rtest_inclheaderrs  !E E  5'5'!HI    %0 BugX& ' , , . 0%::>Bct|}|jtdd|djt j |j 5ttjtjd}tj|dd}d}|j|k(sJ d d d y #1swYy xYw) z CLI :: -c rGrHz -crTrrrN) rrJrKrLrrMrNr rrrrr)r5rSrTrrrs r test_npdistoprs  !EV}UG3%?%E%E%GH  %# ++ 00NOP~~gdWM{{d""" ###s AB::Cz*Compiler and Python 3.12 or newer requiredct|}|jtdd|djt j |j 5ttjd}tr|dz }n|dz }tj|}tj|dd }d }|j|k(sJtrd |jvsJ|jd k(sJ d d d y #1swYy xYw)z. CLI :: --no-freethreading-compatible rGrHz! -c --no-freethreading-compatible -c "import blah; blah.hi();z1import sys; assert sys._is_gil_enabled() is True"rTrrrzHThe global interpreter lock (GIL) has been enabled to load module 'blah'rNrrJrKrLrrMrNrrrrrrrr returncoder5rSrTcmdrrrs r test_no_freethreading_compatiblers  !EV}UG;\%]%c%c%ef  % $  =>  G GC 4KC++c"~~gdWM{{d""" ]aealall ll!### $ $ $s BC44C=ct|}|jtdd|djt j |j 5ttjd}tr|dz }n|dz }tj|}tj|dd }d }|j|k(sJ|jd k(sJ|jd k(sJ d d d y #1swYy xYw)z+ CLI :: --freethreading_compatible rGrHz -c --freethreading-compatiblerz2import sys; assert sys._is_gil_enabled() is False"rTrrrrNrrs rtest_freethreading_compatiblers  !EV}UG;Y%Z%`%`%bc  % $  =>  H HC 4KC++c"~~gdWM{{d"""{{b   !### $ $ $s BC//C8cy)z CLI :: -c --fcompiler Nrrrrtest_npd_fcompilerr 7  rcy)z CLI :: -c --compiler Nrrrrtest_npd_compilerr ?r rcy)z$ CLI :: -c --help-fcompiler Nrrrrtest_npd_help_fcompilerrGr rcy)z CLI :: -c --f77exec Nrrrrtest_npd_f77execrOr rcy)z CLI :: -c --f90exec Nrrrrtest_npd_f90execrWr rcy)z CLI :: -c --f77flags Nrrrrtest_npd_f77flagsr_r rcy)z CLI :: -c --f90flags Nrrrrtest_npd_f90flagsrgr rcy)z CLI :: -c --opt Nrrrr test_npd_optror rcy)z CLI :: -c --arch Nrrrr test_npd_archrwr rcy)z CLI :: -c --noopt Nrrrrtest_npd_nooptrr rcy)z CLI :: -c --noarch Nrrrrtest_npd_noarchrr rcy)z CLI :: -c --debug Nrrrrtest_npd_debugr r rcy)z% CLI :: -c --link- Nrrrrtest_npd_link_autor"r rcy)z/ CLI :: -c -L/path/to/lib/ -l Nrrrr test_npd_libr$r rcy)z CLI :: -D Nrrrrtest_npd_definer&r rcy)z CLI :: -U Nrrrrtest_npd_undefiner(r rcy)z$ CLI :: -I/path/to/include/ Nrrrr test_npd_inclr*r rcy)z8 CLI :: .o .so .a Nrrrrtest_npd_linkerr,r r)untitled)XplatformrrrrKr collectionsrpathlibrr numpy.f2py.f2py2err numpy.testing._private.utilsrrrrrr!fixturer5r8r:r=r@rErWr\rcrmrqrxmarkskipif version_infor}systemrxfailrrrrrrrrrrrrrrrr rrrrrrrrrrrrrr r rrrrrrrrrr r"r$r&r(r*r,rrrr9sw  " -4 HH INi !i !i !i !i !i !1&  : ) , CC$$/8NO )P )_X__&'1Ss7G7G77R\xyGzG>DD.D.D<%" 0 .4$.N8"2"4$ ; 8,5$ @ : MN#O#::2 > 0.  I$  $ -MN #O #_X__&'1Qc6F6F'6QGI$I$._X__&'1Qc6F6F'6QGI$I$2                  r