idBTLddlZddlZddlZddlZddlZddlmZddlmZddl Z ddl m Z ddl m ZeddZdCd Ze jd d Ze jd dZe jd dZe jd dZe jd dZdZdZdZdZe jjdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&d Z'd!Z(d"Z)d#Z*e jd$%d&Z+d'Z,d(Z-d)Z.d*Z/d+Z0d,Z1d-Z2d.Z3d/Z4e jd$%d0Z5d1Z6d2Z7d3Z8d4Z9d5Z:d6Z;d7Zd:Z?d;Z@d<ZAd=ZBd>ZCd?ZDd@ZEdAZFdBZGdS)DN)Path) namedtuple)util)mainPPathsz(finp, f90inp, pyf, wrap77, wrap90, cmodfuntitledc @t|}t|d|d|d||d||d||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 Q/opt/cloudlinux/venv/lib/python3.11/site-packages/numpy/f2py/tests/test_f2py2e.py get_io_pathsrs. OOE    t $ $  ((   f % %%88899%;;;<<oo00011    session)scopectjdddd}|dz }||d|S)'Generates a single f90 file for testingtestssrccliz hiworld.f90z hello.f90asciiencodingrgetpath read_text getbasetemp write_texttmpdir_factoryfdatfns rhello_world_f90r.8sV <} = = G G I ID  # # % % 3BMM$M))) Irctjdddd}|dz }||d|S)z(F90 file for testing warnings in gh23598rr crackfortranzgh23598Warn.f90r"r#r%r*s r gh23598_warnr1AsX <8I J J T T V VD  # # % %(9 9BMM$M))) Irctjdddd}|dz }||d|S)'Generates a single f77 file for testingrr r!zhi77.fzhello.fr"r#r%r*s rhello_world_f77r4JsV <x 8 8 B B D DD  # # % % 1BMM$M))) Irctjdddd}|dz }||d|S)r3rr return_realzfoo77.fzfoo.fr"r#r%r*s r retreal_f77r7SsV < y A A K K M MD  # # % % /BMM$M))) Ircbtjdddd}tjdddd}|dz }|dz }||d ||d |S) rrr f2cmapzisoFortranEnvMap.f90z .f2py_f2cmapz f2cmap.f90mapfiler"r#r%)r+r,r9r-fmaps r f2cmap_f90r<[s <2H I I S S U UD \'5(N C C M M O OF  # # % % 4B  % % ' ') 3DMM$M)))OOFWO--- IrcLt|d}|j}|tdd|dt j|j5t|j }ddddS#1swxYwYdS)Ntestrargvf2py z -m test) rrsetattrsyssplitr switchdirparentf2pyclirr')capfdr1 monkeypatchfoutlipathwrappers rtest_gh23598_warnrMgs V 4 4 4E LE V%%'')))  % %:: ,((**::::::::::::::::::s$(BB Bcht|}t|jdz}|tdd|d|t j|j5t| \}}ddddS#1swxYwYdS)zIEnsures that a signature file is generated via the CLI CLI :: -h r r@zf2py -h  N) rstemrBrCrDrrErFrG readouterr)rHr.rIrKopathout_s r test_gen_pyfrUts  ! !E  ! ! & /EV%?%?%?%?%?%E%E%G%GHHH  % %)) !!##Q))))))))))))))))))s4&B''B+.B+c4t|}|tdd|t j|j5t|\}}ddddS#1swxYwYdS)zHEnsures that a signature file can be dumped to stdout CLI :: -h r@zf2py -h stdout N rrBrCrDrrErFrGrQrHr.rIrKrSrTs rtest_gen_pyf_stdoutrYs  ! !EV%>u%>%>%D%D%F%FGGG  % %,, !!##Q,,,,,,,,,,,,,,,,,,s&B  BBct|}|tdd|t j|j5tdddtj t5t| \}}dddn #1swxYwYddddS#1swxYwYdS)zjEnsures that the CLI refuses to overwrite signature files CLI :: -h without --overwrite-signature r@f2py -h faker.pyf faker.pyf Fake newsr"r#N) rrBrCrDrrErFr)pytestraises SystemExitrGrQ)rHr.rIrKrTerrs rtest_gen_pyf_no_overwriterbs}  ! !EV%A%%A%A%G%G%I%IJJJ  % %CC [$$[7$CCC ]: & & C C III%%''FAs C C C C C C C C C C C C C C CCCCCCCCCCCCCCCCCCCs6>C"&C > C" C C"C C""C&)C&ct|d}|j}d}d}|tdd|d|t j|j5t| \}}|D]} |D]}  ddddS#1swxYwYdS) z9Tests that functions can be skipped CLI :: skip: r>r?t0 t4 t8 sd s8 s4td s0r@rAz -m test skip: N rr rBrCrDrrErFrGrQ) rHr7rIrJrKtoskip remainingrSraskeyrkeys rtest_f2py_skiprksK F 3 3 3E JE FI V...f..4466888  % %DD ##%%SLLNN  DDOO%% D DDD DDDDDDDDDDDDDDDDDDD*AC  CCct|d}|j}d}d}|tdd|d|t j|j5t| \}}|D]} |D]}  ddddS#1swxYwYdS) z>Test that functions can be kept by only: CLI :: only: r>r?rdrer@rAz -m test only: Nrf) rHr7rIrJrKrgtokeeprSrarirjs rtest_f2py_onlyrosI F 3 3 3E JE F F V...f..4466888  % %DD ##%%SLLNN  DDLLNN D DDD DDDDDDDDDDDDDDDDDDDrlc t|d}|j}d}t|}d}d} |tdd|d| d |d |t j|j5t| \} } |D]} |D]}  d d d d S#1swxYwYd S) zfTests that it is possible to return to file processing mode CLI :: : BUG: numpy-gh #20520 r>r?rdztd s0 hiblahr@rA -m z only: z : N) rr rrBrCrDrrErFrGrQ)rHr.r7rIrJrKrgipath2rnrrSrarirjs rtest_file_processing_switchrtsp F 3 3 3E JE F / " "F F E <<<5<<<r?zHI\(\)zhi\(\)r@rAz -m test --lowerNz -m test --no-lower) rr recompilerBrCrDrrErFrGrQ rHr4rIrJrKcapshicapslorSrTs rtest_lower_cmodrs  7 7 7E JE Z " "F Z " "FV%DU%D%D%D%J%J%L%LMMM  % %** !!##Q*************** V::::@@BBDDD  % %.. !!##Q..................s$ &B>>CC&EE E c t|d}|j}tjd}tjd}|t dd|d|jdtj |j 5t| \}}d d d n #1swxYwY|t dd|d|jd tj |j 5t| \}}d d d d S#1swxYwYd S) z^Lowers cases in signature files by flag or when -h is present CLI :: --[no-]lower -h r>r?z Block: HIz Block: hir@rAz -h z -m test --overwrite-signatureNz) -m test --overwrite-signature --no-lower) rr rzr{rBrCrrDrrErFrGrQr|s rtest_lower_sigrs  7 7 7E JE Z % %F Z % %F DDD59DDDJJLL  % %** !!##Q*************** OOO59OOO    % %.. !!##Q..................s$&CC  C $&EEEc Ht|}d}d}|tdd|d|d|t j|j5t|\}}ddddS#1swxYwYdS)zNEnsures that the build directory can be specified CLI :: --build-dir rqtttmpr@f2py -m rOz --build-dir NrW)rHr.rIrKrodirrSrTs rtest_build_dirr>s  ! !E E DVE5EE5EEtEEKKMMOOO  % %88 !!##Q888888888888888888s$&BBBc~t|}|tdd|dt j|j5tdddt| \}}ddddS#1swxYwYdS) zXEnsures that the build directory can be specified CLI :: --overwrite-signature r@r[z --overwrite-signaturer\r]r"r#N) rrBrCrDrrErFr)rGrQrXs rtest_overwriterOs  ! !E V:U:::@@BBDDD  % %22 [$$[7$CCC !!##Q222222222222222222sA B22B69B6c t|}d}|tdd|d|dt j|j5t|\}}t|d 5}dddn #1swxYwYddddS#1swxYwYdS)zJEnsures that TeX documentation is written out CLI :: --latex-doc rqr@rrOz --latex-doc module.texN rrBrCrDrrErFrGrQopenrHr.rIrKrrSrTotexs r test_latexdocr`sb  ! !E EV>5>>5>>>DDFFHHH  % %44 !!##Q U&&& ' ' , , . . 4$ 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 444444444444444444s7 A C*B7+ C7B; ;C>B; ?CCCc @t|}d}|tdd|d|dt j|j5t|\}}ddddS#1swxYwYdS)zMEnsures that TeX documentation is written out CLI :: --no-latex-doc rqr@rrOz --no-latex-docNrWrHr.rIrKrrSrTs rtest_nolatexdocrrs  ! !E EVA5AA5AAAGGIIKKK  % %;; !!##Q;;;;;;;;;;;;;;;;;; &BBBc t|}d}|tdd|d|dt j|j5t|\}}td|d 5}dddn #1swxYwYddddS#1swxYwYdS) zEnsures that truncated documentation is written out TODO: Test to ensure this has no effect without --latex-doc CLI :: --latex-doc --short-latex rqr@rrOz --latex-doc --short-latex./rNrrs rtest_shortlatexrsd  ! !E E <5<<5<<<BBDD  % %88 !!##Q (u((( ) ) . . 0 0 8D 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8888888888888888887 A C+B8, C8B< <C?B< CCCc t|}d}|tdd|d|dt j|j5t|\}}td|d 5}dddn #1swxYwYddddS#1swxYwYdS) zIEnsures that RsT documentation is written out CLI :: --rest-doc rqr@rrOz --rest-docrz module.restNr)rHr.rIrKrrSrTorsts r test_restdocrse  ! !E EV=5==5===CCEEGGG  % %55 !!##Q )u))) * * / / 1 1 5T 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 555555555555555555rc @t|}d}|tdd|d|dt j|j5t|\}}ddddS#1swxYwYdS)zLEnsures that TeX documentation is written out CLI :: --no-rest-doc rqr@rrOz --no-rest-docNrWrs rtest_norestexdocrs  ! !E EV@5@@5@@@FFHHJJJ  % %@@ !!##Q@@@@@@@@@@@@@@@@@@rc t|}d}|tdd|d|dt j|j5ttd|d5}dddn #1swxYwYddddS#1swxYwYdS) zIEnsures that debugging wrappers are written CLI :: --debug-capi rqr@rrOz --debug-capirr N) rrBrCrDrrErFrGr)rHr.rIrKrocmods rtest_debugcapirsP  ! !E EV?5??5???EEGGIII  % %:: &u&&& ' ' , , . . :% : : : : : : : : : : : : : : :::::::::::::::::::s6 4B9B! B9!B% %B9(B% )B99B=B=zConsistently fails on CI.)reasonc t|}d}|tdd|d|dt j|j5ttjd}tj |dd }d }tj d }d d d d S#1swxYwYd S) zEEnsures that debugging wrappers work CLI :: --debug-capi -c rqr@rrOz -c --debug-capiz#python3 -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) rrBrCrDrrErFrGshlex subprocessruntextwrapdedent)r.rIrKrcmd_runrouteouteerrs rtest_debugcapi_bldrs  ! !E EVB5BB5BBBHHJJLLL  % %## +EFF~gdWMMM    ##################s AB==CCc Tt|}d}|tdd|d|t j|j5tdddn #1swxYwY|\}}|tdd|d|dt j|j5t|\}}ddddS#1swxYwYdS)zoEnsures that fortran subroutine wrappers for F77 are included by default CLI :: --[no]-wrap-functions rqr@rrONz --wrap-functionsrWrs rtest_wrapfunc_defrs  ! !E EV%?%?%?%?%?%E%E%G%GHHH  % %      FCVC5CC5CCCIIKKMMM  % %:: !!##Q::::::::::::::::::s$A::A>A>*&DD!$D!c @t|}d}|tdd|d|dt j|j5t|\}}ddddS#1swxYwYdS)zeEnsures that fortran subroutine wrappers for F77 can be disabled CLI :: --no-wrap-functions rqr@rrOz --no-wrap-functionsNrWrs rtest_nowrapfuncrs  ! !E EVF5FF5FFFLLNNPPP  % %>> !!##Q>>>>>>>>>>>>>>>>>>rc t|}d}|tdd|d|dt j|j5ttd|d5}| }dddn #1swxYwYddddS#1swxYwYdS) zcAdd to the include directories CLI :: -include TODO: Document this in the help string rqr@rrOz' -include -include rr N) rrBrCrDrrErFrGrread)rHr.rIrKrrocmrs rtest_inclheaderrsY  ! !E E I5II5III    % %00 &u&&& ' ' , , . . 0%::< Nrrrrtest_npd_link_autorrrcdS)z/ CLI :: -c -L/path/to/lib/ -l Nrrrr test_npd_librrrcdS)z CLI :: -D Nrrrrtest_npd_definerrrcdS)z CLI :: -U Nrrrrtest_npd_undefinerrrcdS)z$ CLI :: -I/path/to/include/ Nrrrr test_npd_inclr rrcdS)z8 CLI :: .o .so .a Nrrrrtest_npd_linkerrrr)r )HrrzrCrrpathlibr collectionsrr^rnumpy.f2py.f2py2errGrrfixturer.r1r4r7r<rMrUrYrbmarkxfailrkrortrxrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrs++++++++++++++++++++"""""" ------ HH I INi   ! i   ! i   ! i   ! i   !  : : : ) ) ) , , , C C CDDD.DDD.DDD<%%%"...4$.$.$.N888"222"444$ ; ; ; 888,555$ @ @ @ : : : 566##76#::::2 > > > 000.      III$    $ $ $ - - -566 # #76 #&                                                        r