numpy 2.4.1__cp314-cp314t-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (932) hide show
  1. numpy/__config__.py +170 -0
  2. numpy/__config__.pyi +108 -0
  3. numpy/__init__.cython-30.pxd +1242 -0
  4. numpy/__init__.pxd +1155 -0
  5. numpy/__init__.py +955 -0
  6. numpy/__init__.pyi +6202 -0
  7. numpy/_array_api_info.py +346 -0
  8. numpy/_array_api_info.pyi +206 -0
  9. numpy/_configtool.py +39 -0
  10. numpy/_configtool.pyi +1 -0
  11. numpy/_core/__init__.py +201 -0
  12. numpy/_core/__init__.pyi +666 -0
  13. numpy/_core/_add_newdocs.py +7151 -0
  14. numpy/_core/_add_newdocs.pyi +2 -0
  15. numpy/_core/_add_newdocs_scalars.py +381 -0
  16. numpy/_core/_add_newdocs_scalars.pyi +16 -0
  17. numpy/_core/_asarray.py +130 -0
  18. numpy/_core/_asarray.pyi +43 -0
  19. numpy/_core/_dtype.py +366 -0
  20. numpy/_core/_dtype.pyi +56 -0
  21. numpy/_core/_dtype_ctypes.py +120 -0
  22. numpy/_core/_dtype_ctypes.pyi +83 -0
  23. numpy/_core/_exceptions.py +162 -0
  24. numpy/_core/_exceptions.pyi +54 -0
  25. numpy/_core/_internal.py +968 -0
  26. numpy/_core/_internal.pyi +61 -0
  27. numpy/_core/_methods.py +252 -0
  28. numpy/_core/_methods.pyi +22 -0
  29. numpy/_core/_multiarray_tests.cp314t-win_arm64.lib +0 -0
  30. numpy/_core/_multiarray_tests.cp314t-win_arm64.pyd +0 -0
  31. numpy/_core/_multiarray_umath.cp314t-win_arm64.lib +0 -0
  32. numpy/_core/_multiarray_umath.cp314t-win_arm64.pyd +0 -0
  33. numpy/_core/_operand_flag_tests.cp314t-win_arm64.lib +0 -0
  34. numpy/_core/_operand_flag_tests.cp314t-win_arm64.pyd +0 -0
  35. numpy/_core/_rational_tests.cp314t-win_arm64.lib +0 -0
  36. numpy/_core/_rational_tests.cp314t-win_arm64.pyd +0 -0
  37. numpy/_core/_simd.cp314t-win_arm64.lib +0 -0
  38. numpy/_core/_simd.cp314t-win_arm64.pyd +0 -0
  39. numpy/_core/_simd.pyi +35 -0
  40. numpy/_core/_string_helpers.py +100 -0
  41. numpy/_core/_string_helpers.pyi +12 -0
  42. numpy/_core/_struct_ufunc_tests.cp314t-win_arm64.lib +0 -0
  43. numpy/_core/_struct_ufunc_tests.cp314t-win_arm64.pyd +0 -0
  44. numpy/_core/_type_aliases.py +131 -0
  45. numpy/_core/_type_aliases.pyi +86 -0
  46. numpy/_core/_ufunc_config.py +515 -0
  47. numpy/_core/_ufunc_config.pyi +69 -0
  48. numpy/_core/_umath_tests.cp314t-win_arm64.lib +0 -0
  49. numpy/_core/_umath_tests.cp314t-win_arm64.pyd +0 -0
  50. numpy/_core/_umath_tests.pyi +47 -0
  51. numpy/_core/arrayprint.py +1779 -0
  52. numpy/_core/arrayprint.pyi +158 -0
  53. numpy/_core/cversions.py +13 -0
  54. numpy/_core/defchararray.py +1414 -0
  55. numpy/_core/defchararray.pyi +1150 -0
  56. numpy/_core/einsumfunc.py +1650 -0
  57. numpy/_core/einsumfunc.pyi +184 -0
  58. numpy/_core/fromnumeric.py +4233 -0
  59. numpy/_core/fromnumeric.pyi +1735 -0
  60. numpy/_core/function_base.py +547 -0
  61. numpy/_core/function_base.pyi +276 -0
  62. numpy/_core/getlimits.py +462 -0
  63. numpy/_core/getlimits.pyi +124 -0
  64. numpy/_core/include/numpy/__multiarray_api.c +376 -0
  65. numpy/_core/include/numpy/__multiarray_api.h +1628 -0
  66. numpy/_core/include/numpy/__ufunc_api.c +55 -0
  67. numpy/_core/include/numpy/__ufunc_api.h +349 -0
  68. numpy/_core/include/numpy/_neighborhood_iterator_imp.h +90 -0
  69. numpy/_core/include/numpy/_numpyconfig.h +33 -0
  70. numpy/_core/include/numpy/_public_dtype_api_table.h +86 -0
  71. numpy/_core/include/numpy/arrayobject.h +7 -0
  72. numpy/_core/include/numpy/arrayscalars.h +198 -0
  73. numpy/_core/include/numpy/dtype_api.h +547 -0
  74. numpy/_core/include/numpy/halffloat.h +70 -0
  75. numpy/_core/include/numpy/ndarrayobject.h +304 -0
  76. numpy/_core/include/numpy/ndarraytypes.h +1982 -0
  77. numpy/_core/include/numpy/npy_2_compat.h +249 -0
  78. numpy/_core/include/numpy/npy_2_complexcompat.h +28 -0
  79. numpy/_core/include/numpy/npy_3kcompat.h +374 -0
  80. numpy/_core/include/numpy/npy_common.h +989 -0
  81. numpy/_core/include/numpy/npy_cpu.h +126 -0
  82. numpy/_core/include/numpy/npy_endian.h +79 -0
  83. numpy/_core/include/numpy/npy_math.h +602 -0
  84. numpy/_core/include/numpy/npy_no_deprecated_api.h +20 -0
  85. numpy/_core/include/numpy/npy_os.h +42 -0
  86. numpy/_core/include/numpy/numpyconfig.h +185 -0
  87. numpy/_core/include/numpy/random/LICENSE.txt +21 -0
  88. numpy/_core/include/numpy/random/bitgen.h +20 -0
  89. numpy/_core/include/numpy/random/distributions.h +209 -0
  90. numpy/_core/include/numpy/random/libdivide.h +2079 -0
  91. numpy/_core/include/numpy/ufuncobject.h +343 -0
  92. numpy/_core/include/numpy/utils.h +37 -0
  93. numpy/_core/lib/npy-pkg-config/mlib.ini +12 -0
  94. numpy/_core/lib/npy-pkg-config/npymath.ini +20 -0
  95. numpy/_core/lib/npymath.lib +0 -0
  96. numpy/_core/lib/pkgconfig/numpy.pc +7 -0
  97. numpy/_core/memmap.py +363 -0
  98. numpy/_core/memmap.pyi +3 -0
  99. numpy/_core/multiarray.py +1740 -0
  100. numpy/_core/multiarray.pyi +1316 -0
  101. numpy/_core/numeric.py +2758 -0
  102. numpy/_core/numeric.pyi +1276 -0
  103. numpy/_core/numerictypes.py +633 -0
  104. numpy/_core/numerictypes.pyi +196 -0
  105. numpy/_core/overrides.py +188 -0
  106. numpy/_core/overrides.pyi +47 -0
  107. numpy/_core/printoptions.py +32 -0
  108. numpy/_core/printoptions.pyi +28 -0
  109. numpy/_core/records.py +1088 -0
  110. numpy/_core/records.pyi +340 -0
  111. numpy/_core/shape_base.py +996 -0
  112. numpy/_core/shape_base.pyi +182 -0
  113. numpy/_core/strings.py +1813 -0
  114. numpy/_core/strings.pyi +536 -0
  115. numpy/_core/tests/_locales.py +72 -0
  116. numpy/_core/tests/_natype.py +144 -0
  117. numpy/_core/tests/data/astype_copy.pkl +0 -0
  118. numpy/_core/tests/data/generate_umath_validation_data.cpp +170 -0
  119. numpy/_core/tests/data/recarray_from_file.fits +0 -0
  120. numpy/_core/tests/data/umath-validation-set-README.txt +15 -0
  121. numpy/_core/tests/data/umath-validation-set-arccos.csv +1429 -0
  122. numpy/_core/tests/data/umath-validation-set-arccosh.csv +1429 -0
  123. numpy/_core/tests/data/umath-validation-set-arcsin.csv +1429 -0
  124. numpy/_core/tests/data/umath-validation-set-arcsinh.csv +1429 -0
  125. numpy/_core/tests/data/umath-validation-set-arctan.csv +1429 -0
  126. numpy/_core/tests/data/umath-validation-set-arctanh.csv +1429 -0
  127. numpy/_core/tests/data/umath-validation-set-cbrt.csv +1429 -0
  128. numpy/_core/tests/data/umath-validation-set-cos.csv +1375 -0
  129. numpy/_core/tests/data/umath-validation-set-cosh.csv +1429 -0
  130. numpy/_core/tests/data/umath-validation-set-exp.csv +412 -0
  131. numpy/_core/tests/data/umath-validation-set-exp2.csv +1429 -0
  132. numpy/_core/tests/data/umath-validation-set-expm1.csv +1429 -0
  133. numpy/_core/tests/data/umath-validation-set-log.csv +271 -0
  134. numpy/_core/tests/data/umath-validation-set-log10.csv +1629 -0
  135. numpy/_core/tests/data/umath-validation-set-log1p.csv +1429 -0
  136. numpy/_core/tests/data/umath-validation-set-log2.csv +1629 -0
  137. numpy/_core/tests/data/umath-validation-set-sin.csv +1370 -0
  138. numpy/_core/tests/data/umath-validation-set-sinh.csv +1429 -0
  139. numpy/_core/tests/data/umath-validation-set-tan.csv +1429 -0
  140. numpy/_core/tests/data/umath-validation-set-tanh.csv +1429 -0
  141. numpy/_core/tests/examples/cython/checks.pyx +373 -0
  142. numpy/_core/tests/examples/cython/meson.build +43 -0
  143. numpy/_core/tests/examples/cython/setup.py +39 -0
  144. numpy/_core/tests/examples/limited_api/limited_api1.c +17 -0
  145. numpy/_core/tests/examples/limited_api/limited_api2.pyx +11 -0
  146. numpy/_core/tests/examples/limited_api/limited_api_latest.c +19 -0
  147. numpy/_core/tests/examples/limited_api/meson.build +59 -0
  148. numpy/_core/tests/examples/limited_api/setup.py +24 -0
  149. numpy/_core/tests/test__exceptions.py +90 -0
  150. numpy/_core/tests/test_abc.py +54 -0
  151. numpy/_core/tests/test_api.py +655 -0
  152. numpy/_core/tests/test_argparse.py +90 -0
  153. numpy/_core/tests/test_array_api_info.py +113 -0
  154. numpy/_core/tests/test_array_coercion.py +928 -0
  155. numpy/_core/tests/test_array_interface.py +222 -0
  156. numpy/_core/tests/test_arraymethod.py +84 -0
  157. numpy/_core/tests/test_arrayobject.py +75 -0
  158. numpy/_core/tests/test_arrayprint.py +1324 -0
  159. numpy/_core/tests/test_casting_floatingpoint_errors.py +154 -0
  160. numpy/_core/tests/test_casting_unittests.py +955 -0
  161. numpy/_core/tests/test_conversion_utils.py +209 -0
  162. numpy/_core/tests/test_cpu_dispatcher.py +48 -0
  163. numpy/_core/tests/test_cpu_features.py +450 -0
  164. numpy/_core/tests/test_custom_dtypes.py +393 -0
  165. numpy/_core/tests/test_cython.py +352 -0
  166. numpy/_core/tests/test_datetime.py +2792 -0
  167. numpy/_core/tests/test_defchararray.py +858 -0
  168. numpy/_core/tests/test_deprecations.py +460 -0
  169. numpy/_core/tests/test_dlpack.py +190 -0
  170. numpy/_core/tests/test_dtype.py +2110 -0
  171. numpy/_core/tests/test_einsum.py +1351 -0
  172. numpy/_core/tests/test_errstate.py +131 -0
  173. numpy/_core/tests/test_extint128.py +217 -0
  174. numpy/_core/tests/test_finfo.py +86 -0
  175. numpy/_core/tests/test_function_base.py +504 -0
  176. numpy/_core/tests/test_getlimits.py +171 -0
  177. numpy/_core/tests/test_half.py +593 -0
  178. numpy/_core/tests/test_hashtable.py +36 -0
  179. numpy/_core/tests/test_indexerrors.py +122 -0
  180. numpy/_core/tests/test_indexing.py +1692 -0
  181. numpy/_core/tests/test_item_selection.py +167 -0
  182. numpy/_core/tests/test_limited_api.py +102 -0
  183. numpy/_core/tests/test_longdouble.py +370 -0
  184. numpy/_core/tests/test_mem_overlap.py +933 -0
  185. numpy/_core/tests/test_mem_policy.py +453 -0
  186. numpy/_core/tests/test_memmap.py +248 -0
  187. numpy/_core/tests/test_multiarray.py +11008 -0
  188. numpy/_core/tests/test_multiprocessing.py +55 -0
  189. numpy/_core/tests/test_multithreading.py +377 -0
  190. numpy/_core/tests/test_nditer.py +3533 -0
  191. numpy/_core/tests/test_nep50_promotions.py +287 -0
  192. numpy/_core/tests/test_numeric.py +4295 -0
  193. numpy/_core/tests/test_numerictypes.py +650 -0
  194. numpy/_core/tests/test_overrides.py +800 -0
  195. numpy/_core/tests/test_print.py +202 -0
  196. numpy/_core/tests/test_protocols.py +46 -0
  197. numpy/_core/tests/test_records.py +544 -0
  198. numpy/_core/tests/test_regression.py +2677 -0
  199. numpy/_core/tests/test_scalar_ctors.py +203 -0
  200. numpy/_core/tests/test_scalar_methods.py +328 -0
  201. numpy/_core/tests/test_scalarbuffer.py +153 -0
  202. numpy/_core/tests/test_scalarinherit.py +105 -0
  203. numpy/_core/tests/test_scalarmath.py +1168 -0
  204. numpy/_core/tests/test_scalarprint.py +403 -0
  205. numpy/_core/tests/test_shape_base.py +904 -0
  206. numpy/_core/tests/test_simd.py +1345 -0
  207. numpy/_core/tests/test_simd_module.py +105 -0
  208. numpy/_core/tests/test_stringdtype.py +1855 -0
  209. numpy/_core/tests/test_strings.py +1523 -0
  210. numpy/_core/tests/test_ufunc.py +3405 -0
  211. numpy/_core/tests/test_umath.py +4962 -0
  212. numpy/_core/tests/test_umath_accuracy.py +132 -0
  213. numpy/_core/tests/test_umath_complex.py +631 -0
  214. numpy/_core/tests/test_unicode.py +369 -0
  215. numpy/_core/umath.py +60 -0
  216. numpy/_core/umath.pyi +232 -0
  217. numpy/_distributor_init.py +15 -0
  218. numpy/_distributor_init.pyi +1 -0
  219. numpy/_expired_attrs_2_0.py +78 -0
  220. numpy/_expired_attrs_2_0.pyi +61 -0
  221. numpy/_globals.py +121 -0
  222. numpy/_globals.pyi +17 -0
  223. numpy/_pyinstaller/__init__.py +0 -0
  224. numpy/_pyinstaller/__init__.pyi +0 -0
  225. numpy/_pyinstaller/hook-numpy.py +36 -0
  226. numpy/_pyinstaller/hook-numpy.pyi +6 -0
  227. numpy/_pyinstaller/tests/__init__.py +16 -0
  228. numpy/_pyinstaller/tests/pyinstaller-smoke.py +32 -0
  229. numpy/_pyinstaller/tests/test_pyinstaller.py +35 -0
  230. numpy/_pytesttester.py +201 -0
  231. numpy/_pytesttester.pyi +18 -0
  232. numpy/_typing/__init__.py +173 -0
  233. numpy/_typing/_add_docstring.py +153 -0
  234. numpy/_typing/_array_like.py +106 -0
  235. numpy/_typing/_char_codes.py +213 -0
  236. numpy/_typing/_dtype_like.py +114 -0
  237. numpy/_typing/_extended_precision.py +15 -0
  238. numpy/_typing/_nbit.py +19 -0
  239. numpy/_typing/_nbit_base.py +94 -0
  240. numpy/_typing/_nbit_base.pyi +39 -0
  241. numpy/_typing/_nested_sequence.py +79 -0
  242. numpy/_typing/_scalars.py +20 -0
  243. numpy/_typing/_shape.py +8 -0
  244. numpy/_typing/_ufunc.py +7 -0
  245. numpy/_typing/_ufunc.pyi +975 -0
  246. numpy/_utils/__init__.py +95 -0
  247. numpy/_utils/__init__.pyi +28 -0
  248. numpy/_utils/_convertions.py +18 -0
  249. numpy/_utils/_convertions.pyi +4 -0
  250. numpy/_utils/_inspect.py +192 -0
  251. numpy/_utils/_inspect.pyi +70 -0
  252. numpy/_utils/_pep440.py +486 -0
  253. numpy/_utils/_pep440.pyi +118 -0
  254. numpy/char/__init__.py +2 -0
  255. numpy/char/__init__.pyi +111 -0
  256. numpy/conftest.py +248 -0
  257. numpy/core/__init__.py +33 -0
  258. numpy/core/__init__.pyi +0 -0
  259. numpy/core/_dtype.py +10 -0
  260. numpy/core/_dtype.pyi +0 -0
  261. numpy/core/_dtype_ctypes.py +10 -0
  262. numpy/core/_dtype_ctypes.pyi +0 -0
  263. numpy/core/_internal.py +27 -0
  264. numpy/core/_multiarray_umath.py +57 -0
  265. numpy/core/_utils.py +21 -0
  266. numpy/core/arrayprint.py +10 -0
  267. numpy/core/defchararray.py +10 -0
  268. numpy/core/einsumfunc.py +10 -0
  269. numpy/core/fromnumeric.py +10 -0
  270. numpy/core/function_base.py +10 -0
  271. numpy/core/getlimits.py +10 -0
  272. numpy/core/multiarray.py +25 -0
  273. numpy/core/numeric.py +12 -0
  274. numpy/core/numerictypes.py +10 -0
  275. numpy/core/overrides.py +10 -0
  276. numpy/core/overrides.pyi +7 -0
  277. numpy/core/records.py +10 -0
  278. numpy/core/shape_base.py +10 -0
  279. numpy/core/umath.py +10 -0
  280. numpy/ctypeslib/__init__.py +13 -0
  281. numpy/ctypeslib/__init__.pyi +15 -0
  282. numpy/ctypeslib/_ctypeslib.py +603 -0
  283. numpy/ctypeslib/_ctypeslib.pyi +236 -0
  284. numpy/doc/ufuncs.py +138 -0
  285. numpy/dtypes.py +41 -0
  286. numpy/dtypes.pyi +630 -0
  287. numpy/exceptions.py +246 -0
  288. numpy/exceptions.pyi +27 -0
  289. numpy/f2py/__init__.py +86 -0
  290. numpy/f2py/__init__.pyi +5 -0
  291. numpy/f2py/__main__.py +5 -0
  292. numpy/f2py/__version__.py +1 -0
  293. numpy/f2py/__version__.pyi +1 -0
  294. numpy/f2py/_backends/__init__.py +9 -0
  295. numpy/f2py/_backends/__init__.pyi +5 -0
  296. numpy/f2py/_backends/_backend.py +44 -0
  297. numpy/f2py/_backends/_backend.pyi +46 -0
  298. numpy/f2py/_backends/_distutils.py +76 -0
  299. numpy/f2py/_backends/_distutils.pyi +13 -0
  300. numpy/f2py/_backends/_meson.py +244 -0
  301. numpy/f2py/_backends/_meson.pyi +62 -0
  302. numpy/f2py/_backends/meson.build.template +58 -0
  303. numpy/f2py/_isocbind.py +62 -0
  304. numpy/f2py/_isocbind.pyi +13 -0
  305. numpy/f2py/_src_pyf.py +247 -0
  306. numpy/f2py/_src_pyf.pyi +28 -0
  307. numpy/f2py/auxfuncs.py +1004 -0
  308. numpy/f2py/auxfuncs.pyi +262 -0
  309. numpy/f2py/capi_maps.py +811 -0
  310. numpy/f2py/capi_maps.pyi +33 -0
  311. numpy/f2py/cb_rules.py +665 -0
  312. numpy/f2py/cb_rules.pyi +17 -0
  313. numpy/f2py/cfuncs.py +1563 -0
  314. numpy/f2py/cfuncs.pyi +31 -0
  315. numpy/f2py/common_rules.py +143 -0
  316. numpy/f2py/common_rules.pyi +9 -0
  317. numpy/f2py/crackfortran.py +3725 -0
  318. numpy/f2py/crackfortran.pyi +266 -0
  319. numpy/f2py/diagnose.py +149 -0
  320. numpy/f2py/diagnose.pyi +1 -0
  321. numpy/f2py/f2py2e.py +788 -0
  322. numpy/f2py/f2py2e.pyi +74 -0
  323. numpy/f2py/f90mod_rules.py +269 -0
  324. numpy/f2py/f90mod_rules.pyi +16 -0
  325. numpy/f2py/func2subr.py +329 -0
  326. numpy/f2py/func2subr.pyi +7 -0
  327. numpy/f2py/rules.py +1629 -0
  328. numpy/f2py/rules.pyi +41 -0
  329. numpy/f2py/setup.cfg +3 -0
  330. numpy/f2py/src/fortranobject.c +1436 -0
  331. numpy/f2py/src/fortranobject.h +173 -0
  332. numpy/f2py/symbolic.py +1518 -0
  333. numpy/f2py/symbolic.pyi +219 -0
  334. numpy/f2py/tests/__init__.py +16 -0
  335. numpy/f2py/tests/src/abstract_interface/foo.f90 +34 -0
  336. numpy/f2py/tests/src/abstract_interface/gh18403_mod.f90 +6 -0
  337. numpy/f2py/tests/src/array_from_pyobj/wrapmodule.c +235 -0
  338. numpy/f2py/tests/src/assumed_shape/.f2py_f2cmap +1 -0
  339. numpy/f2py/tests/src/assumed_shape/foo_free.f90 +34 -0
  340. numpy/f2py/tests/src/assumed_shape/foo_mod.f90 +41 -0
  341. numpy/f2py/tests/src/assumed_shape/foo_use.f90 +19 -0
  342. numpy/f2py/tests/src/assumed_shape/precision.f90 +4 -0
  343. numpy/f2py/tests/src/block_docstring/foo.f +6 -0
  344. numpy/f2py/tests/src/callback/foo.f +62 -0
  345. numpy/f2py/tests/src/callback/gh17797.f90 +7 -0
  346. numpy/f2py/tests/src/callback/gh18335.f90 +17 -0
  347. numpy/f2py/tests/src/callback/gh25211.f +10 -0
  348. numpy/f2py/tests/src/callback/gh25211.pyf +18 -0
  349. numpy/f2py/tests/src/callback/gh26681.f90 +18 -0
  350. numpy/f2py/tests/src/cli/gh_22819.pyf +6 -0
  351. numpy/f2py/tests/src/cli/hi77.f +3 -0
  352. numpy/f2py/tests/src/cli/hiworld.f90 +3 -0
  353. numpy/f2py/tests/src/common/block.f +11 -0
  354. numpy/f2py/tests/src/common/gh19161.f90 +10 -0
  355. numpy/f2py/tests/src/crackfortran/accesstype.f90 +13 -0
  356. numpy/f2py/tests/src/crackfortran/common_with_division.f +17 -0
  357. numpy/f2py/tests/src/crackfortran/data_common.f +8 -0
  358. numpy/f2py/tests/src/crackfortran/data_multiplier.f +5 -0
  359. numpy/f2py/tests/src/crackfortran/data_stmts.f90 +20 -0
  360. numpy/f2py/tests/src/crackfortran/data_with_comments.f +8 -0
  361. numpy/f2py/tests/src/crackfortran/foo_deps.f90 +6 -0
  362. numpy/f2py/tests/src/crackfortran/gh15035.f +16 -0
  363. numpy/f2py/tests/src/crackfortran/gh17859.f +12 -0
  364. numpy/f2py/tests/src/crackfortran/gh22648.pyf +7 -0
  365. numpy/f2py/tests/src/crackfortran/gh23533.f +5 -0
  366. numpy/f2py/tests/src/crackfortran/gh23598.f90 +4 -0
  367. numpy/f2py/tests/src/crackfortran/gh23598Warn.f90 +11 -0
  368. numpy/f2py/tests/src/crackfortran/gh23879.f90 +20 -0
  369. numpy/f2py/tests/src/crackfortran/gh27697.f90 +12 -0
  370. numpy/f2py/tests/src/crackfortran/gh2848.f90 +13 -0
  371. numpy/f2py/tests/src/crackfortran/operators.f90 +49 -0
  372. numpy/f2py/tests/src/crackfortran/privatemod.f90 +11 -0
  373. numpy/f2py/tests/src/crackfortran/publicmod.f90 +10 -0
  374. numpy/f2py/tests/src/crackfortran/pubprivmod.f90 +10 -0
  375. numpy/f2py/tests/src/crackfortran/unicode_comment.f90 +4 -0
  376. numpy/f2py/tests/src/f2cmap/.f2py_f2cmap +1 -0
  377. numpy/f2py/tests/src/f2cmap/isoFortranEnvMap.f90 +9 -0
  378. numpy/f2py/tests/src/isocintrin/isoCtests.f90 +34 -0
  379. numpy/f2py/tests/src/kind/foo.f90 +20 -0
  380. numpy/f2py/tests/src/mixed/foo.f +5 -0
  381. numpy/f2py/tests/src/mixed/foo_fixed.f90 +8 -0
  382. numpy/f2py/tests/src/mixed/foo_free.f90 +8 -0
  383. numpy/f2py/tests/src/modules/gh25337/data.f90 +8 -0
  384. numpy/f2py/tests/src/modules/gh25337/use_data.f90 +6 -0
  385. numpy/f2py/tests/src/modules/gh26920/two_mods_with_no_public_entities.f90 +21 -0
  386. numpy/f2py/tests/src/modules/gh26920/two_mods_with_one_public_routine.f90 +21 -0
  387. numpy/f2py/tests/src/modules/module_data_docstring.f90 +12 -0
  388. numpy/f2py/tests/src/modules/use_modules.f90 +20 -0
  389. numpy/f2py/tests/src/negative_bounds/issue_20853.f90 +7 -0
  390. numpy/f2py/tests/src/parameter/constant_array.f90 +45 -0
  391. numpy/f2py/tests/src/parameter/constant_both.f90 +57 -0
  392. numpy/f2py/tests/src/parameter/constant_compound.f90 +15 -0
  393. numpy/f2py/tests/src/parameter/constant_integer.f90 +22 -0
  394. numpy/f2py/tests/src/parameter/constant_non_compound.f90 +23 -0
  395. numpy/f2py/tests/src/parameter/constant_real.f90 +23 -0
  396. numpy/f2py/tests/src/quoted_character/foo.f +14 -0
  397. numpy/f2py/tests/src/regression/AB.inc +1 -0
  398. numpy/f2py/tests/src/regression/assignOnlyModule.f90 +25 -0
  399. numpy/f2py/tests/src/regression/datonly.f90 +17 -0
  400. numpy/f2py/tests/src/regression/f77comments.f +26 -0
  401. numpy/f2py/tests/src/regression/f77fixedform.f95 +5 -0
  402. numpy/f2py/tests/src/regression/f90continuation.f90 +9 -0
  403. numpy/f2py/tests/src/regression/incfile.f90 +5 -0
  404. numpy/f2py/tests/src/regression/inout.f90 +9 -0
  405. numpy/f2py/tests/src/regression/lower_f2py_fortran.f90 +5 -0
  406. numpy/f2py/tests/src/regression/mod_derived_types.f90 +23 -0
  407. numpy/f2py/tests/src/return_character/foo77.f +45 -0
  408. numpy/f2py/tests/src/return_character/foo90.f90 +48 -0
  409. numpy/f2py/tests/src/return_complex/foo77.f +45 -0
  410. numpy/f2py/tests/src/return_complex/foo90.f90 +48 -0
  411. numpy/f2py/tests/src/return_integer/foo77.f +56 -0
  412. numpy/f2py/tests/src/return_integer/foo90.f90 +59 -0
  413. numpy/f2py/tests/src/return_logical/foo77.f +56 -0
  414. numpy/f2py/tests/src/return_logical/foo90.f90 +59 -0
  415. numpy/f2py/tests/src/return_real/foo77.f +45 -0
  416. numpy/f2py/tests/src/return_real/foo90.f90 +48 -0
  417. numpy/f2py/tests/src/routines/funcfortranname.f +5 -0
  418. numpy/f2py/tests/src/routines/funcfortranname.pyf +11 -0
  419. numpy/f2py/tests/src/routines/subrout.f +4 -0
  420. numpy/f2py/tests/src/routines/subrout.pyf +10 -0
  421. numpy/f2py/tests/src/size/foo.f90 +44 -0
  422. numpy/f2py/tests/src/string/char.f90 +29 -0
  423. numpy/f2py/tests/src/string/fixed_string.f90 +34 -0
  424. numpy/f2py/tests/src/string/gh24008.f +8 -0
  425. numpy/f2py/tests/src/string/gh24662.f90 +7 -0
  426. numpy/f2py/tests/src/string/gh25286.f90 +14 -0
  427. numpy/f2py/tests/src/string/gh25286.pyf +12 -0
  428. numpy/f2py/tests/src/string/gh25286_bc.pyf +12 -0
  429. numpy/f2py/tests/src/string/scalar_string.f90 +9 -0
  430. numpy/f2py/tests/src/string/string.f +12 -0
  431. numpy/f2py/tests/src/value_attrspec/gh21665.f90 +9 -0
  432. numpy/f2py/tests/test_abstract_interface.py +26 -0
  433. numpy/f2py/tests/test_array_from_pyobj.py +678 -0
  434. numpy/f2py/tests/test_assumed_shape.py +50 -0
  435. numpy/f2py/tests/test_block_docstring.py +20 -0
  436. numpy/f2py/tests/test_callback.py +263 -0
  437. numpy/f2py/tests/test_character.py +641 -0
  438. numpy/f2py/tests/test_common.py +23 -0
  439. numpy/f2py/tests/test_crackfortran.py +421 -0
  440. numpy/f2py/tests/test_data.py +71 -0
  441. numpy/f2py/tests/test_docs.py +66 -0
  442. numpy/f2py/tests/test_f2cmap.py +17 -0
  443. numpy/f2py/tests/test_f2py2e.py +983 -0
  444. numpy/f2py/tests/test_isoc.py +56 -0
  445. numpy/f2py/tests/test_kind.py +52 -0
  446. numpy/f2py/tests/test_mixed.py +35 -0
  447. numpy/f2py/tests/test_modules.py +83 -0
  448. numpy/f2py/tests/test_parameter.py +129 -0
  449. numpy/f2py/tests/test_pyf_src.py +43 -0
  450. numpy/f2py/tests/test_quoted_character.py +18 -0
  451. numpy/f2py/tests/test_regression.py +187 -0
  452. numpy/f2py/tests/test_return_character.py +48 -0
  453. numpy/f2py/tests/test_return_complex.py +67 -0
  454. numpy/f2py/tests/test_return_integer.py +55 -0
  455. numpy/f2py/tests/test_return_logical.py +65 -0
  456. numpy/f2py/tests/test_return_real.py +109 -0
  457. numpy/f2py/tests/test_routines.py +29 -0
  458. numpy/f2py/tests/test_semicolon_split.py +75 -0
  459. numpy/f2py/tests/test_size.py +45 -0
  460. numpy/f2py/tests/test_string.py +100 -0
  461. numpy/f2py/tests/test_symbolic.py +500 -0
  462. numpy/f2py/tests/test_value_attrspec.py +15 -0
  463. numpy/f2py/tests/util.py +442 -0
  464. numpy/f2py/use_rules.py +99 -0
  465. numpy/f2py/use_rules.pyi +9 -0
  466. numpy/fft/__init__.py +213 -0
  467. numpy/fft/__init__.pyi +38 -0
  468. numpy/fft/_helper.py +235 -0
  469. numpy/fft/_helper.pyi +44 -0
  470. numpy/fft/_pocketfft.py +1693 -0
  471. numpy/fft/_pocketfft.pyi +137 -0
  472. numpy/fft/_pocketfft_umath.cp314t-win_arm64.lib +0 -0
  473. numpy/fft/_pocketfft_umath.cp314t-win_arm64.pyd +0 -0
  474. numpy/fft/tests/__init__.py +0 -0
  475. numpy/fft/tests/test_helper.py +167 -0
  476. numpy/fft/tests/test_pocketfft.py +589 -0
  477. numpy/lib/__init__.py +97 -0
  478. numpy/lib/__init__.pyi +52 -0
  479. numpy/lib/_array_utils_impl.py +62 -0
  480. numpy/lib/_array_utils_impl.pyi +10 -0
  481. numpy/lib/_arraypad_impl.py +926 -0
  482. numpy/lib/_arraypad_impl.pyi +88 -0
  483. numpy/lib/_arraysetops_impl.py +1158 -0
  484. numpy/lib/_arraysetops_impl.pyi +462 -0
  485. numpy/lib/_arrayterator_impl.py +224 -0
  486. numpy/lib/_arrayterator_impl.pyi +45 -0
  487. numpy/lib/_datasource.py +700 -0
  488. numpy/lib/_datasource.pyi +30 -0
  489. numpy/lib/_format_impl.py +1036 -0
  490. numpy/lib/_format_impl.pyi +56 -0
  491. numpy/lib/_function_base_impl.py +5760 -0
  492. numpy/lib/_function_base_impl.pyi +2324 -0
  493. numpy/lib/_histograms_impl.py +1085 -0
  494. numpy/lib/_histograms_impl.pyi +40 -0
  495. numpy/lib/_index_tricks_impl.py +1048 -0
  496. numpy/lib/_index_tricks_impl.pyi +267 -0
  497. numpy/lib/_iotools.py +900 -0
  498. numpy/lib/_iotools.pyi +116 -0
  499. numpy/lib/_nanfunctions_impl.py +2006 -0
  500. numpy/lib/_nanfunctions_impl.pyi +48 -0
  501. numpy/lib/_npyio_impl.py +2583 -0
  502. numpy/lib/_npyio_impl.pyi +299 -0
  503. numpy/lib/_polynomial_impl.py +1465 -0
  504. numpy/lib/_polynomial_impl.pyi +338 -0
  505. numpy/lib/_scimath_impl.py +642 -0
  506. numpy/lib/_scimath_impl.pyi +93 -0
  507. numpy/lib/_shape_base_impl.py +1289 -0
  508. numpy/lib/_shape_base_impl.pyi +236 -0
  509. numpy/lib/_stride_tricks_impl.py +582 -0
  510. numpy/lib/_stride_tricks_impl.pyi +73 -0
  511. numpy/lib/_twodim_base_impl.py +1201 -0
  512. numpy/lib/_twodim_base_impl.pyi +408 -0
  513. numpy/lib/_type_check_impl.py +710 -0
  514. numpy/lib/_type_check_impl.pyi +348 -0
  515. numpy/lib/_ufunclike_impl.py +199 -0
  516. numpy/lib/_ufunclike_impl.pyi +60 -0
  517. numpy/lib/_user_array_impl.py +310 -0
  518. numpy/lib/_user_array_impl.pyi +226 -0
  519. numpy/lib/_utils_impl.py +784 -0
  520. numpy/lib/_utils_impl.pyi +22 -0
  521. numpy/lib/_version.py +153 -0
  522. numpy/lib/_version.pyi +17 -0
  523. numpy/lib/array_utils.py +7 -0
  524. numpy/lib/array_utils.pyi +6 -0
  525. numpy/lib/format.py +24 -0
  526. numpy/lib/format.pyi +24 -0
  527. numpy/lib/introspect.py +94 -0
  528. numpy/lib/introspect.pyi +3 -0
  529. numpy/lib/mixins.py +180 -0
  530. numpy/lib/mixins.pyi +78 -0
  531. numpy/lib/npyio.py +1 -0
  532. numpy/lib/npyio.pyi +5 -0
  533. numpy/lib/recfunctions.py +1681 -0
  534. numpy/lib/recfunctions.pyi +444 -0
  535. numpy/lib/scimath.py +13 -0
  536. numpy/lib/scimath.pyi +12 -0
  537. numpy/lib/stride_tricks.py +1 -0
  538. numpy/lib/stride_tricks.pyi +4 -0
  539. numpy/lib/tests/__init__.py +0 -0
  540. numpy/lib/tests/data/py2-np0-objarr.npy +0 -0
  541. numpy/lib/tests/data/py2-objarr.npy +0 -0
  542. numpy/lib/tests/data/py2-objarr.npz +0 -0
  543. numpy/lib/tests/data/py3-objarr.npy +0 -0
  544. numpy/lib/tests/data/py3-objarr.npz +0 -0
  545. numpy/lib/tests/data/python3.npy +0 -0
  546. numpy/lib/tests/data/win64python2.npy +0 -0
  547. numpy/lib/tests/test__datasource.py +328 -0
  548. numpy/lib/tests/test__iotools.py +358 -0
  549. numpy/lib/tests/test__version.py +64 -0
  550. numpy/lib/tests/test_array_utils.py +32 -0
  551. numpy/lib/tests/test_arraypad.py +1427 -0
  552. numpy/lib/tests/test_arraysetops.py +1302 -0
  553. numpy/lib/tests/test_arrayterator.py +45 -0
  554. numpy/lib/tests/test_format.py +1054 -0
  555. numpy/lib/tests/test_function_base.py +4750 -0
  556. numpy/lib/tests/test_histograms.py +855 -0
  557. numpy/lib/tests/test_index_tricks.py +693 -0
  558. numpy/lib/tests/test_io.py +2857 -0
  559. numpy/lib/tests/test_loadtxt.py +1099 -0
  560. numpy/lib/tests/test_mixins.py +215 -0
  561. numpy/lib/tests/test_nanfunctions.py +1438 -0
  562. numpy/lib/tests/test_packbits.py +376 -0
  563. numpy/lib/tests/test_polynomial.py +325 -0
  564. numpy/lib/tests/test_recfunctions.py +1042 -0
  565. numpy/lib/tests/test_regression.py +231 -0
  566. numpy/lib/tests/test_shape_base.py +813 -0
  567. numpy/lib/tests/test_stride_tricks.py +655 -0
  568. numpy/lib/tests/test_twodim_base.py +559 -0
  569. numpy/lib/tests/test_type_check.py +473 -0
  570. numpy/lib/tests/test_ufunclike.py +97 -0
  571. numpy/lib/tests/test_utils.py +80 -0
  572. numpy/lib/user_array.py +1 -0
  573. numpy/lib/user_array.pyi +1 -0
  574. numpy/linalg/__init__.py +95 -0
  575. numpy/linalg/__init__.pyi +71 -0
  576. numpy/linalg/_linalg.py +3657 -0
  577. numpy/linalg/_linalg.pyi +548 -0
  578. numpy/linalg/_umath_linalg.cp314t-win_arm64.lib +0 -0
  579. numpy/linalg/_umath_linalg.cp314t-win_arm64.pyd +0 -0
  580. numpy/linalg/_umath_linalg.pyi +60 -0
  581. numpy/linalg/lapack_lite.cp314t-win_arm64.lib +0 -0
  582. numpy/linalg/lapack_lite.cp314t-win_arm64.pyd +0 -0
  583. numpy/linalg/lapack_lite.pyi +143 -0
  584. numpy/linalg/tests/__init__.py +0 -0
  585. numpy/linalg/tests/test_deprecations.py +21 -0
  586. numpy/linalg/tests/test_linalg.py +2442 -0
  587. numpy/linalg/tests/test_regression.py +182 -0
  588. numpy/ma/API_CHANGES.txt +135 -0
  589. numpy/ma/LICENSE +24 -0
  590. numpy/ma/README.rst +236 -0
  591. numpy/ma/__init__.py +53 -0
  592. numpy/ma/__init__.pyi +458 -0
  593. numpy/ma/core.py +8929 -0
  594. numpy/ma/core.pyi +3720 -0
  595. numpy/ma/extras.py +2266 -0
  596. numpy/ma/extras.pyi +297 -0
  597. numpy/ma/mrecords.py +762 -0
  598. numpy/ma/mrecords.pyi +96 -0
  599. numpy/ma/tests/__init__.py +0 -0
  600. numpy/ma/tests/test_arrayobject.py +40 -0
  601. numpy/ma/tests/test_core.py +6008 -0
  602. numpy/ma/tests/test_deprecations.py +65 -0
  603. numpy/ma/tests/test_extras.py +1945 -0
  604. numpy/ma/tests/test_mrecords.py +495 -0
  605. numpy/ma/tests/test_old_ma.py +939 -0
  606. numpy/ma/tests/test_regression.py +83 -0
  607. numpy/ma/tests/test_subclassing.py +469 -0
  608. numpy/ma/testutils.py +294 -0
  609. numpy/ma/testutils.pyi +69 -0
  610. numpy/matlib.py +380 -0
  611. numpy/matlib.pyi +580 -0
  612. numpy/matrixlib/__init__.py +12 -0
  613. numpy/matrixlib/__init__.pyi +3 -0
  614. numpy/matrixlib/defmatrix.py +1119 -0
  615. numpy/matrixlib/defmatrix.pyi +218 -0
  616. numpy/matrixlib/tests/__init__.py +0 -0
  617. numpy/matrixlib/tests/test_defmatrix.py +455 -0
  618. numpy/matrixlib/tests/test_interaction.py +360 -0
  619. numpy/matrixlib/tests/test_masked_matrix.py +240 -0
  620. numpy/matrixlib/tests/test_matrix_linalg.py +110 -0
  621. numpy/matrixlib/tests/test_multiarray.py +17 -0
  622. numpy/matrixlib/tests/test_numeric.py +18 -0
  623. numpy/matrixlib/tests/test_regression.py +31 -0
  624. numpy/polynomial/__init__.py +187 -0
  625. numpy/polynomial/__init__.pyi +31 -0
  626. numpy/polynomial/_polybase.py +1191 -0
  627. numpy/polynomial/_polybase.pyi +262 -0
  628. numpy/polynomial/_polytypes.pyi +501 -0
  629. numpy/polynomial/chebyshev.py +2001 -0
  630. numpy/polynomial/chebyshev.pyi +180 -0
  631. numpy/polynomial/hermite.py +1738 -0
  632. numpy/polynomial/hermite.pyi +106 -0
  633. numpy/polynomial/hermite_e.py +1640 -0
  634. numpy/polynomial/hermite_e.pyi +106 -0
  635. numpy/polynomial/laguerre.py +1673 -0
  636. numpy/polynomial/laguerre.pyi +100 -0
  637. numpy/polynomial/legendre.py +1603 -0
  638. numpy/polynomial/legendre.pyi +100 -0
  639. numpy/polynomial/polynomial.py +1625 -0
  640. numpy/polynomial/polynomial.pyi +109 -0
  641. numpy/polynomial/polyutils.py +759 -0
  642. numpy/polynomial/polyutils.pyi +307 -0
  643. numpy/polynomial/tests/__init__.py +0 -0
  644. numpy/polynomial/tests/test_chebyshev.py +618 -0
  645. numpy/polynomial/tests/test_classes.py +613 -0
  646. numpy/polynomial/tests/test_hermite.py +553 -0
  647. numpy/polynomial/tests/test_hermite_e.py +554 -0
  648. numpy/polynomial/tests/test_laguerre.py +535 -0
  649. numpy/polynomial/tests/test_legendre.py +566 -0
  650. numpy/polynomial/tests/test_polynomial.py +691 -0
  651. numpy/polynomial/tests/test_polyutils.py +123 -0
  652. numpy/polynomial/tests/test_printing.py +557 -0
  653. numpy/polynomial/tests/test_symbol.py +217 -0
  654. numpy/py.typed +0 -0
  655. numpy/random/LICENSE.md +71 -0
  656. numpy/random/__init__.pxd +14 -0
  657. numpy/random/__init__.py +213 -0
  658. numpy/random/__init__.pyi +124 -0
  659. numpy/random/_bounded_integers.cp314t-win_arm64.lib +0 -0
  660. numpy/random/_bounded_integers.cp314t-win_arm64.pyd +0 -0
  661. numpy/random/_bounded_integers.pxd +38 -0
  662. numpy/random/_bounded_integers.pyi +1 -0
  663. numpy/random/_common.cp314t-win_arm64.lib +0 -0
  664. numpy/random/_common.cp314t-win_arm64.pyd +0 -0
  665. numpy/random/_common.pxd +110 -0
  666. numpy/random/_common.pyi +16 -0
  667. numpy/random/_examples/cffi/extending.py +44 -0
  668. numpy/random/_examples/cffi/parse.py +53 -0
  669. numpy/random/_examples/cython/extending.pyx +77 -0
  670. numpy/random/_examples/cython/extending_distributions.pyx +117 -0
  671. numpy/random/_examples/cython/meson.build +53 -0
  672. numpy/random/_examples/numba/extending.py +86 -0
  673. numpy/random/_examples/numba/extending_distributions.py +67 -0
  674. numpy/random/_generator.cp314t-win_arm64.lib +0 -0
  675. numpy/random/_generator.cp314t-win_arm64.pyd +0 -0
  676. numpy/random/_generator.pyi +862 -0
  677. numpy/random/_mt19937.cp314t-win_arm64.lib +0 -0
  678. numpy/random/_mt19937.cp314t-win_arm64.pyd +0 -0
  679. numpy/random/_mt19937.pyi +27 -0
  680. numpy/random/_pcg64.cp314t-win_arm64.lib +0 -0
  681. numpy/random/_pcg64.cp314t-win_arm64.pyd +0 -0
  682. numpy/random/_pcg64.pyi +41 -0
  683. numpy/random/_philox.cp314t-win_arm64.lib +0 -0
  684. numpy/random/_philox.cp314t-win_arm64.pyd +0 -0
  685. numpy/random/_philox.pyi +36 -0
  686. numpy/random/_pickle.py +88 -0
  687. numpy/random/_pickle.pyi +43 -0
  688. numpy/random/_sfc64.cp314t-win_arm64.lib +0 -0
  689. numpy/random/_sfc64.cp314t-win_arm64.pyd +0 -0
  690. numpy/random/_sfc64.pyi +25 -0
  691. numpy/random/bit_generator.cp314t-win_arm64.lib +0 -0
  692. numpy/random/bit_generator.cp314t-win_arm64.pyd +0 -0
  693. numpy/random/bit_generator.pxd +40 -0
  694. numpy/random/bit_generator.pyi +123 -0
  695. numpy/random/c_distributions.pxd +119 -0
  696. numpy/random/lib/npyrandom.lib +0 -0
  697. numpy/random/mtrand.cp314t-win_arm64.lib +0 -0
  698. numpy/random/mtrand.cp314t-win_arm64.pyd +0 -0
  699. numpy/random/mtrand.pyi +759 -0
  700. numpy/random/tests/__init__.py +0 -0
  701. numpy/random/tests/data/__init__.py +0 -0
  702. numpy/random/tests/data/generator_pcg64_np121.pkl.gz +0 -0
  703. numpy/random/tests/data/generator_pcg64_np126.pkl.gz +0 -0
  704. numpy/random/tests/data/mt19937-testset-1.csv +1001 -0
  705. numpy/random/tests/data/mt19937-testset-2.csv +1001 -0
  706. numpy/random/tests/data/pcg64-testset-1.csv +1001 -0
  707. numpy/random/tests/data/pcg64-testset-2.csv +1001 -0
  708. numpy/random/tests/data/pcg64dxsm-testset-1.csv +1001 -0
  709. numpy/random/tests/data/pcg64dxsm-testset-2.csv +1001 -0
  710. numpy/random/tests/data/philox-testset-1.csv +1001 -0
  711. numpy/random/tests/data/philox-testset-2.csv +1001 -0
  712. numpy/random/tests/data/sfc64-testset-1.csv +1001 -0
  713. numpy/random/tests/data/sfc64-testset-2.csv +1001 -0
  714. numpy/random/tests/data/sfc64_np126.pkl.gz +0 -0
  715. numpy/random/tests/test_direct.py +595 -0
  716. numpy/random/tests/test_extending.py +131 -0
  717. numpy/random/tests/test_generator_mt19937.py +2825 -0
  718. numpy/random/tests/test_generator_mt19937_regressions.py +221 -0
  719. numpy/random/tests/test_random.py +1724 -0
  720. numpy/random/tests/test_randomstate.py +2099 -0
  721. numpy/random/tests/test_randomstate_regression.py +213 -0
  722. numpy/random/tests/test_regression.py +175 -0
  723. numpy/random/tests/test_seed_sequence.py +79 -0
  724. numpy/random/tests/test_smoke.py +882 -0
  725. numpy/rec/__init__.py +2 -0
  726. numpy/rec/__init__.pyi +23 -0
  727. numpy/strings/__init__.py +2 -0
  728. numpy/strings/__init__.pyi +97 -0
  729. numpy/testing/__init__.py +22 -0
  730. numpy/testing/__init__.pyi +107 -0
  731. numpy/testing/_private/__init__.py +0 -0
  732. numpy/testing/_private/__init__.pyi +0 -0
  733. numpy/testing/_private/extbuild.py +250 -0
  734. numpy/testing/_private/extbuild.pyi +25 -0
  735. numpy/testing/_private/utils.py +2830 -0
  736. numpy/testing/_private/utils.pyi +505 -0
  737. numpy/testing/overrides.py +84 -0
  738. numpy/testing/overrides.pyi +10 -0
  739. numpy/testing/print_coercion_tables.py +207 -0
  740. numpy/testing/print_coercion_tables.pyi +26 -0
  741. numpy/testing/tests/__init__.py +0 -0
  742. numpy/testing/tests/test_utils.py +2123 -0
  743. numpy/tests/__init__.py +0 -0
  744. numpy/tests/test__all__.py +10 -0
  745. numpy/tests/test_configtool.py +51 -0
  746. numpy/tests/test_ctypeslib.py +383 -0
  747. numpy/tests/test_lazyloading.py +42 -0
  748. numpy/tests/test_matlib.py +59 -0
  749. numpy/tests/test_numpy_config.py +47 -0
  750. numpy/tests/test_numpy_version.py +54 -0
  751. numpy/tests/test_public_api.py +807 -0
  752. numpy/tests/test_reloading.py +76 -0
  753. numpy/tests/test_scripts.py +48 -0
  754. numpy/tests/test_warnings.py +79 -0
  755. numpy/typing/__init__.py +233 -0
  756. numpy/typing/__init__.pyi +3 -0
  757. numpy/typing/mypy_plugin.py +200 -0
  758. numpy/typing/tests/__init__.py +0 -0
  759. numpy/typing/tests/data/fail/arithmetic.pyi +126 -0
  760. numpy/typing/tests/data/fail/array_constructors.pyi +34 -0
  761. numpy/typing/tests/data/fail/array_like.pyi +15 -0
  762. numpy/typing/tests/data/fail/array_pad.pyi +6 -0
  763. numpy/typing/tests/data/fail/arrayprint.pyi +15 -0
  764. numpy/typing/tests/data/fail/arrayterator.pyi +14 -0
  765. numpy/typing/tests/data/fail/bitwise_ops.pyi +17 -0
  766. numpy/typing/tests/data/fail/char.pyi +63 -0
  767. numpy/typing/tests/data/fail/chararray.pyi +61 -0
  768. numpy/typing/tests/data/fail/comparisons.pyi +27 -0
  769. numpy/typing/tests/data/fail/constants.pyi +3 -0
  770. numpy/typing/tests/data/fail/datasource.pyi +16 -0
  771. numpy/typing/tests/data/fail/dtype.pyi +17 -0
  772. numpy/typing/tests/data/fail/einsumfunc.pyi +12 -0
  773. numpy/typing/tests/data/fail/flatiter.pyi +38 -0
  774. numpy/typing/tests/data/fail/fromnumeric.pyi +148 -0
  775. numpy/typing/tests/data/fail/histograms.pyi +12 -0
  776. numpy/typing/tests/data/fail/index_tricks.pyi +14 -0
  777. numpy/typing/tests/data/fail/lib_function_base.pyi +60 -0
  778. numpy/typing/tests/data/fail/lib_polynomial.pyi +29 -0
  779. numpy/typing/tests/data/fail/lib_utils.pyi +3 -0
  780. numpy/typing/tests/data/fail/lib_version.pyi +6 -0
  781. numpy/typing/tests/data/fail/linalg.pyi +52 -0
  782. numpy/typing/tests/data/fail/ma.pyi +155 -0
  783. numpy/typing/tests/data/fail/memmap.pyi +5 -0
  784. numpy/typing/tests/data/fail/modules.pyi +17 -0
  785. numpy/typing/tests/data/fail/multiarray.pyi +52 -0
  786. numpy/typing/tests/data/fail/ndarray.pyi +11 -0
  787. numpy/typing/tests/data/fail/ndarray_misc.pyi +49 -0
  788. numpy/typing/tests/data/fail/nditer.pyi +8 -0
  789. numpy/typing/tests/data/fail/nested_sequence.pyi +17 -0
  790. numpy/typing/tests/data/fail/npyio.pyi +24 -0
  791. numpy/typing/tests/data/fail/numerictypes.pyi +5 -0
  792. numpy/typing/tests/data/fail/random.pyi +62 -0
  793. numpy/typing/tests/data/fail/rec.pyi +17 -0
  794. numpy/typing/tests/data/fail/scalars.pyi +86 -0
  795. numpy/typing/tests/data/fail/shape.pyi +7 -0
  796. numpy/typing/tests/data/fail/shape_base.pyi +8 -0
  797. numpy/typing/tests/data/fail/stride_tricks.pyi +9 -0
  798. numpy/typing/tests/data/fail/strings.pyi +52 -0
  799. numpy/typing/tests/data/fail/testing.pyi +28 -0
  800. numpy/typing/tests/data/fail/twodim_base.pyi +39 -0
  801. numpy/typing/tests/data/fail/type_check.pyi +12 -0
  802. numpy/typing/tests/data/fail/ufunc_config.pyi +21 -0
  803. numpy/typing/tests/data/fail/ufunclike.pyi +21 -0
  804. numpy/typing/tests/data/fail/ufuncs.pyi +17 -0
  805. numpy/typing/tests/data/fail/warnings_and_errors.pyi +5 -0
  806. numpy/typing/tests/data/misc/extended_precision.pyi +9 -0
  807. numpy/typing/tests/data/mypy.ini +8 -0
  808. numpy/typing/tests/data/pass/arithmetic.py +614 -0
  809. numpy/typing/tests/data/pass/array_constructors.py +138 -0
  810. numpy/typing/tests/data/pass/array_like.py +43 -0
  811. numpy/typing/tests/data/pass/arrayprint.py +37 -0
  812. numpy/typing/tests/data/pass/arrayterator.py +28 -0
  813. numpy/typing/tests/data/pass/bitwise_ops.py +131 -0
  814. numpy/typing/tests/data/pass/comparisons.py +316 -0
  815. numpy/typing/tests/data/pass/dtype.py +57 -0
  816. numpy/typing/tests/data/pass/einsumfunc.py +36 -0
  817. numpy/typing/tests/data/pass/flatiter.py +26 -0
  818. numpy/typing/tests/data/pass/fromnumeric.py +272 -0
  819. numpy/typing/tests/data/pass/index_tricks.py +62 -0
  820. numpy/typing/tests/data/pass/lib_user_array.py +22 -0
  821. numpy/typing/tests/data/pass/lib_utils.py +19 -0
  822. numpy/typing/tests/data/pass/lib_version.py +18 -0
  823. numpy/typing/tests/data/pass/literal.py +52 -0
  824. numpy/typing/tests/data/pass/ma.py +199 -0
  825. numpy/typing/tests/data/pass/mod.py +149 -0
  826. numpy/typing/tests/data/pass/modules.py +45 -0
  827. numpy/typing/tests/data/pass/multiarray.py +77 -0
  828. numpy/typing/tests/data/pass/ndarray_conversion.py +81 -0
  829. numpy/typing/tests/data/pass/ndarray_misc.py +199 -0
  830. numpy/typing/tests/data/pass/ndarray_shape_manipulation.py +47 -0
  831. numpy/typing/tests/data/pass/nditer.py +4 -0
  832. numpy/typing/tests/data/pass/numeric.py +90 -0
  833. numpy/typing/tests/data/pass/numerictypes.py +17 -0
  834. numpy/typing/tests/data/pass/random.py +1498 -0
  835. numpy/typing/tests/data/pass/recfunctions.py +164 -0
  836. numpy/typing/tests/data/pass/scalars.py +249 -0
  837. numpy/typing/tests/data/pass/shape.py +19 -0
  838. numpy/typing/tests/data/pass/simple.py +170 -0
  839. numpy/typing/tests/data/pass/ufunc_config.py +64 -0
  840. numpy/typing/tests/data/pass/ufunclike.py +52 -0
  841. numpy/typing/tests/data/pass/ufuncs.py +16 -0
  842. numpy/typing/tests/data/pass/warnings_and_errors.py +6 -0
  843. numpy/typing/tests/data/reveal/arithmetic.pyi +719 -0
  844. numpy/typing/tests/data/reveal/array_api_info.pyi +70 -0
  845. numpy/typing/tests/data/reveal/array_constructors.pyi +277 -0
  846. numpy/typing/tests/data/reveal/arraypad.pyi +27 -0
  847. numpy/typing/tests/data/reveal/arrayprint.pyi +25 -0
  848. numpy/typing/tests/data/reveal/arraysetops.pyi +74 -0
  849. numpy/typing/tests/data/reveal/arrayterator.pyi +27 -0
  850. numpy/typing/tests/data/reveal/bitwise_ops.pyi +166 -0
  851. numpy/typing/tests/data/reveal/char.pyi +225 -0
  852. numpy/typing/tests/data/reveal/chararray.pyi +138 -0
  853. numpy/typing/tests/data/reveal/comparisons.pyi +264 -0
  854. numpy/typing/tests/data/reveal/constants.pyi +14 -0
  855. numpy/typing/tests/data/reveal/ctypeslib.pyi +81 -0
  856. numpy/typing/tests/data/reveal/datasource.pyi +23 -0
  857. numpy/typing/tests/data/reveal/dtype.pyi +132 -0
  858. numpy/typing/tests/data/reveal/einsumfunc.pyi +39 -0
  859. numpy/typing/tests/data/reveal/emath.pyi +54 -0
  860. numpy/typing/tests/data/reveal/fft.pyi +37 -0
  861. numpy/typing/tests/data/reveal/flatiter.pyi +86 -0
  862. numpy/typing/tests/data/reveal/fromnumeric.pyi +347 -0
  863. numpy/typing/tests/data/reveal/getlimits.pyi +53 -0
  864. numpy/typing/tests/data/reveal/histograms.pyi +25 -0
  865. numpy/typing/tests/data/reveal/index_tricks.pyi +70 -0
  866. numpy/typing/tests/data/reveal/lib_function_base.pyi +409 -0
  867. numpy/typing/tests/data/reveal/lib_polynomial.pyi +147 -0
  868. numpy/typing/tests/data/reveal/lib_utils.pyi +17 -0
  869. numpy/typing/tests/data/reveal/lib_version.pyi +20 -0
  870. numpy/typing/tests/data/reveal/linalg.pyi +154 -0
  871. numpy/typing/tests/data/reveal/ma.pyi +1098 -0
  872. numpy/typing/tests/data/reveal/matrix.pyi +73 -0
  873. numpy/typing/tests/data/reveal/memmap.pyi +19 -0
  874. numpy/typing/tests/data/reveal/mod.pyi +178 -0
  875. numpy/typing/tests/data/reveal/modules.pyi +51 -0
  876. numpy/typing/tests/data/reveal/multiarray.pyi +197 -0
  877. numpy/typing/tests/data/reveal/nbit_base_example.pyi +20 -0
  878. numpy/typing/tests/data/reveal/ndarray_assignability.pyi +82 -0
  879. numpy/typing/tests/data/reveal/ndarray_conversion.pyi +83 -0
  880. numpy/typing/tests/data/reveal/ndarray_misc.pyi +246 -0
  881. numpy/typing/tests/data/reveal/ndarray_shape_manipulation.pyi +47 -0
  882. numpy/typing/tests/data/reveal/nditer.pyi +49 -0
  883. numpy/typing/tests/data/reveal/nested_sequence.pyi +25 -0
  884. numpy/typing/tests/data/reveal/npyio.pyi +83 -0
  885. numpy/typing/tests/data/reveal/numeric.pyi +170 -0
  886. numpy/typing/tests/data/reveal/numerictypes.pyi +16 -0
  887. numpy/typing/tests/data/reveal/polynomial_polybase.pyi +217 -0
  888. numpy/typing/tests/data/reveal/polynomial_polyutils.pyi +218 -0
  889. numpy/typing/tests/data/reveal/polynomial_series.pyi +138 -0
  890. numpy/typing/tests/data/reveal/random.pyi +1546 -0
  891. numpy/typing/tests/data/reveal/rec.pyi +171 -0
  892. numpy/typing/tests/data/reveal/scalars.pyi +191 -0
  893. numpy/typing/tests/data/reveal/shape.pyi +13 -0
  894. numpy/typing/tests/data/reveal/shape_base.pyi +52 -0
  895. numpy/typing/tests/data/reveal/stride_tricks.pyi +27 -0
  896. numpy/typing/tests/data/reveal/strings.pyi +196 -0
  897. numpy/typing/tests/data/reveal/testing.pyi +198 -0
  898. numpy/typing/tests/data/reveal/twodim_base.pyi +225 -0
  899. numpy/typing/tests/data/reveal/type_check.pyi +67 -0
  900. numpy/typing/tests/data/reveal/ufunc_config.pyi +29 -0
  901. numpy/typing/tests/data/reveal/ufunclike.pyi +31 -0
  902. numpy/typing/tests/data/reveal/ufuncs.pyi +142 -0
  903. numpy/typing/tests/data/reveal/warnings_and_errors.pyi +11 -0
  904. numpy/typing/tests/test_isfile.py +38 -0
  905. numpy/typing/tests/test_runtime.py +110 -0
  906. numpy/typing/tests/test_typing.py +205 -0
  907. numpy/version.py +11 -0
  908. numpy/version.pyi +9 -0
  909. numpy-2.4.1.dist-info/DELVEWHEEL +2 -0
  910. numpy-2.4.1.dist-info/METADATA +139 -0
  911. numpy-2.4.1.dist-info/RECORD +932 -0
  912. numpy-2.4.1.dist-info/WHEEL +4 -0
  913. numpy-2.4.1.dist-info/entry_points.txt +13 -0
  914. numpy-2.4.1.dist-info/licenses/LICENSE.txt +914 -0
  915. numpy-2.4.1.dist-info/licenses/numpy/_core/include/numpy/libdivide/LICENSE.txt +21 -0
  916. numpy-2.4.1.dist-info/licenses/numpy/_core/src/common/pythoncapi-compat/COPYING +14 -0
  917. numpy-2.4.1.dist-info/licenses/numpy/_core/src/highway/LICENSE +371 -0
  918. numpy-2.4.1.dist-info/licenses/numpy/_core/src/multiarray/dragon4_LICENSE.txt +27 -0
  919. numpy-2.4.1.dist-info/licenses/numpy/_core/src/npysort/x86-simd-sort/LICENSE.md +28 -0
  920. numpy-2.4.1.dist-info/licenses/numpy/_core/src/umath/svml/LICENSE +30 -0
  921. numpy-2.4.1.dist-info/licenses/numpy/fft/pocketfft/LICENSE.md +25 -0
  922. numpy-2.4.1.dist-info/licenses/numpy/linalg/lapack_lite/LICENSE.txt +48 -0
  923. numpy-2.4.1.dist-info/licenses/numpy/ma/LICENSE +24 -0
  924. numpy-2.4.1.dist-info/licenses/numpy/random/LICENSE.md +71 -0
  925. numpy-2.4.1.dist-info/licenses/numpy/random/src/distributions/LICENSE.md +61 -0
  926. numpy-2.4.1.dist-info/licenses/numpy/random/src/mt19937/LICENSE.md +61 -0
  927. numpy-2.4.1.dist-info/licenses/numpy/random/src/pcg64/LICENSE.md +22 -0
  928. numpy-2.4.1.dist-info/licenses/numpy/random/src/philox/LICENSE.md +31 -0
  929. numpy-2.4.1.dist-info/licenses/numpy/random/src/sfc64/LICENSE.md +27 -0
  930. numpy-2.4.1.dist-info/licenses/numpy/random/src/splitmix64/LICENSE.md +9 -0
  931. numpy.libs/msvcp140-5f1c5dd31916990d94181e07bc3afb32.dll +0 -0
  932. numpy.libs/scipy_openblas-7b69cbfd2599e6035f1310f2a72d59a6.dll +0 -0
@@ -0,0 +1,983 @@
1
+ import platform
2
+ import re
3
+ import shlex
4
+ import subprocess
5
+ import sys
6
+ import textwrap
7
+ from collections import namedtuple
8
+ from pathlib import Path
9
+
10
+ import pytest
11
+
12
+ from numpy.f2py.f2py2e import main as f2pycli
13
+ from numpy.testing._private.utils import NOGIL_BUILD
14
+
15
+ from . import util
16
+
17
+ #######################
18
+ # F2PY Test utilities #
19
+ ######################
20
+
21
+ # Tests for CLI commands which call meson will fail if no compilers are present, these are to be skipped
22
+
23
+ def compiler_check_f2pycli():
24
+ if not util.has_fortran_compiler():
25
+ pytest.skip("CLI command needs a Fortran compiler")
26
+ else:
27
+ f2pycli()
28
+
29
+ #########################
30
+ # CLI utils and classes #
31
+ #########################
32
+
33
+
34
+ PPaths = namedtuple("PPaths", "finp, f90inp, pyf, wrap77, wrap90, cmodf")
35
+
36
+
37
+ def get_io_paths(fname_inp, mname="untitled"):
38
+ """Takes in a temporary file for testing and returns the expected output and input paths
39
+
40
+ Here expected output is essentially one of any of the possible generated
41
+ files.
42
+
43
+ ..note::
44
+
45
+ Since this does not actually run f2py, none of these are guaranteed to
46
+ exist, and module names are typically incorrect
47
+
48
+ Parameters
49
+ ----------
50
+ fname_inp : str
51
+ The input filename
52
+ mname : str, optional
53
+ The name of the module, untitled by default
54
+
55
+ Returns
56
+ -------
57
+ genp : NamedTuple PPaths
58
+ The possible paths which are generated, not all of which exist
59
+ """
60
+ bpath = Path(fname_inp)
61
+ return PPaths(
62
+ finp=bpath.with_suffix(".f"),
63
+ f90inp=bpath.with_suffix(".f90"),
64
+ pyf=bpath.with_suffix(".pyf"),
65
+ wrap77=bpath.with_name(f"{mname}-f2pywrappers.f"),
66
+ wrap90=bpath.with_name(f"{mname}-f2pywrappers2.f90"),
67
+ cmodf=bpath.with_name(f"{mname}module.c"),
68
+ )
69
+
70
+
71
+ ################
72
+ # CLI Fixtures #
73
+ ################
74
+
75
+
76
+ @pytest.fixture(scope="session")
77
+ def hello_world_f90(tmpdir_factory):
78
+ """Generates a single f90 file for testing"""
79
+ fdat = util.getpath("tests", "src", "cli", "hiworld.f90").read_text()
80
+ fn = tmpdir_factory.getbasetemp() / "hello.f90"
81
+ fn.write_text(fdat, encoding="ascii")
82
+ return fn
83
+
84
+
85
+ @pytest.fixture(scope="session")
86
+ def gh23598_warn(tmpdir_factory):
87
+ """F90 file for testing warnings in gh23598"""
88
+ fdat = util.getpath("tests", "src", "crackfortran", "gh23598Warn.f90").read_text()
89
+ fn = tmpdir_factory.getbasetemp() / "gh23598Warn.f90"
90
+ fn.write_text(fdat, encoding="ascii")
91
+ return fn
92
+
93
+
94
+ @pytest.fixture(scope="session")
95
+ def gh22819_cli(tmpdir_factory):
96
+ """F90 file for testing disallowed CLI arguments in ghff819"""
97
+ fdat = util.getpath("tests", "src", "cli", "gh_22819.pyf").read_text()
98
+ fn = tmpdir_factory.getbasetemp() / "gh_22819.pyf"
99
+ fn.write_text(fdat, encoding="ascii")
100
+ return fn
101
+
102
+
103
+ @pytest.fixture(scope="session")
104
+ def hello_world_f77(tmpdir_factory):
105
+ """Generates a single f77 file for testing"""
106
+ fdat = util.getpath("tests", "src", "cli", "hi77.f").read_text()
107
+ fn = tmpdir_factory.getbasetemp() / "hello.f"
108
+ fn.write_text(fdat, encoding="ascii")
109
+ return fn
110
+
111
+
112
+ @pytest.fixture(scope="session")
113
+ def retreal_f77(tmpdir_factory):
114
+ """Generates a single f77 file for testing"""
115
+ fdat = util.getpath("tests", "src", "return_real", "foo77.f").read_text()
116
+ fn = tmpdir_factory.getbasetemp() / "foo.f"
117
+ fn.write_text(fdat, encoding="ascii")
118
+ return fn
119
+
120
+ @pytest.fixture(scope="session")
121
+ def f2cmap_f90(tmpdir_factory):
122
+ """Generates a single f90 file for testing"""
123
+ fdat = util.getpath("tests", "src", "f2cmap", "isoFortranEnvMap.f90").read_text()
124
+ f2cmap = util.getpath("tests", "src", "f2cmap", ".f2py_f2cmap").read_text()
125
+ fn = tmpdir_factory.getbasetemp() / "f2cmap.f90"
126
+ fmap = tmpdir_factory.getbasetemp() / "mapfile"
127
+ fn.write_text(fdat, encoding="ascii")
128
+ fmap.write_text(f2cmap, encoding="ascii")
129
+ return fn
130
+
131
+ #########
132
+ # Tests #
133
+ #########
134
+
135
+ def test_gh22819_cli(capfd, gh22819_cli, monkeypatch):
136
+ """Check that module names are handled correctly
137
+ gh-22819
138
+ Essentially, the -m name cannot be used to import the module, so the module
139
+ named in the .pyf needs to be used instead
140
+
141
+ CLI :: -m and a .pyf file
142
+ """
143
+ ipath = Path(gh22819_cli)
144
+ monkeypatch.setattr(sys, "argv", f"f2py -m blah {ipath}".split())
145
+ with util.switchdir(ipath.parent):
146
+ f2pycli()
147
+ gen_paths = [item.name for item in ipath.parent.rglob("*") if item.is_file()]
148
+ assert "blahmodule.c" not in gen_paths # shouldn't be generated
149
+ assert "blah-f2pywrappers.f" not in gen_paths
150
+ assert "test_22819-f2pywrappers.f" in gen_paths
151
+ assert "test_22819module.c" in gen_paths
152
+
153
+
154
+ def test_gh22819_many_pyf(capfd, gh22819_cli, monkeypatch):
155
+ """Only one .pyf file allowed
156
+ gh-22819
157
+ CLI :: .pyf files
158
+ """
159
+ ipath = Path(gh22819_cli)
160
+ monkeypatch.setattr(sys, "argv", f"f2py -m blah {ipath} hello.pyf".split())
161
+ with util.switchdir(ipath.parent):
162
+ with pytest.raises(ValueError, match="Only one .pyf file per call"):
163
+ f2pycli()
164
+
165
+
166
+ def test_gh23598_warn(capfd, gh23598_warn, monkeypatch):
167
+ foutl = get_io_paths(gh23598_warn, mname="test")
168
+ ipath = foutl.f90inp
169
+ monkeypatch.setattr(
170
+ sys, "argv",
171
+ f'f2py {ipath} -m test'.split())
172
+
173
+ with util.switchdir(ipath.parent):
174
+ f2pycli() # Generate files
175
+ wrapper = foutl.wrap90.read_text()
176
+ assert "intproductf2pywrap, intpr" not in wrapper
177
+
178
+
179
+ def test_gen_pyf(capfd, hello_world_f90, monkeypatch):
180
+ """Ensures that a signature file is generated via the CLI
181
+ CLI :: -h
182
+ """
183
+ ipath = Path(hello_world_f90)
184
+ opath = Path(hello_world_f90).stem + ".pyf"
185
+ monkeypatch.setattr(sys, "argv", f'f2py -h {opath} {ipath}'.split())
186
+
187
+ with util.switchdir(ipath.parent):
188
+ f2pycli() # Generate wrappers
189
+ out, _ = capfd.readouterr()
190
+ assert "Saving signatures to file" in out
191
+ assert Path(f'{opath}').exists()
192
+
193
+
194
+ def test_gen_pyf_stdout(capfd, hello_world_f90, monkeypatch):
195
+ """Ensures that a signature file can be dumped to stdout
196
+ CLI :: -h
197
+ """
198
+ ipath = Path(hello_world_f90)
199
+ monkeypatch.setattr(sys, "argv", f'f2py -h stdout {ipath}'.split())
200
+ with util.switchdir(ipath.parent):
201
+ f2pycli()
202
+ out, _ = capfd.readouterr()
203
+ assert "Saving signatures to file" in out
204
+ assert "function hi() ! in " in out
205
+
206
+
207
+ def test_gen_pyf_no_overwrite(capfd, hello_world_f90, monkeypatch):
208
+ """Ensures that the CLI refuses to overwrite signature files
209
+ CLI :: -h without --overwrite-signature
210
+ """
211
+ ipath = Path(hello_world_f90)
212
+ monkeypatch.setattr(sys, "argv", f'f2py -h faker.pyf {ipath}'.split())
213
+
214
+ with util.switchdir(ipath.parent):
215
+ Path("faker.pyf").write_text("Fake news", encoding="ascii")
216
+ with pytest.raises(SystemExit):
217
+ f2pycli() # Refuse to overwrite
218
+ _, err = capfd.readouterr()
219
+ assert "Use --overwrite-signature to overwrite" in err
220
+
221
+
222
+ @pytest.mark.skipif(sys.version_info <= (3, 12), reason="Python 3.12 required")
223
+ def test_untitled_cli(capfd, hello_world_f90, monkeypatch):
224
+ """Check that modules are named correctly
225
+
226
+ CLI :: defaults
227
+ """
228
+ ipath = Path(hello_world_f90)
229
+ monkeypatch.setattr(sys, "argv", f"f2py --backend meson -c {ipath}".split())
230
+ with util.switchdir(ipath.parent):
231
+ compiler_check_f2pycli()
232
+ out, _ = capfd.readouterr()
233
+ assert "untitledmodule.c" in out
234
+
235
+
236
+ @pytest.mark.skipif((platform.system() != 'Linux') or (sys.version_info <= (3, 12)), reason='Compiler and 3.12 required')
237
+ def test_no_py312_distutils_fcompiler(capfd, hello_world_f90, monkeypatch):
238
+ """Check that no distutils imports are performed on 3.12
239
+ CLI :: --fcompiler --help-link --backend distutils
240
+ """
241
+ MNAME = "hi"
242
+ foutl = get_io_paths(hello_world_f90, mname=MNAME)
243
+ ipath = foutl.f90inp
244
+ monkeypatch.setattr(
245
+ sys, "argv", f"f2py {ipath} -c --fcompiler=gfortran -m {MNAME}".split()
246
+ )
247
+ with util.switchdir(ipath.parent):
248
+ compiler_check_f2pycli()
249
+ out, _ = capfd.readouterr()
250
+ assert "--fcompiler cannot be used with meson" in out
251
+ monkeypatch.setattr(
252
+ sys, "argv", ["f2py", "--help-link"]
253
+ )
254
+ with util.switchdir(ipath.parent):
255
+ f2pycli()
256
+ out, _ = capfd.readouterr()
257
+ assert "Use --dep for meson builds" in out
258
+ MNAME = "hi2" # Needs to be different for a new -c
259
+ monkeypatch.setattr(
260
+ sys, "argv", f"f2py {ipath} -c -m {MNAME} --backend distutils".split()
261
+ )
262
+ with util.switchdir(ipath.parent):
263
+ f2pycli()
264
+ out, _ = capfd.readouterr()
265
+ assert "Cannot use distutils backend with Python>=3.12" in out
266
+
267
+
268
+ @pytest.mark.xfail
269
+ def test_f2py_skip(capfd, retreal_f77, monkeypatch):
270
+ """Tests that functions can be skipped
271
+ CLI :: skip:
272
+ """
273
+ foutl = get_io_paths(retreal_f77, mname="test")
274
+ ipath = foutl.finp
275
+ toskip = "t0 t4 t8 sd s8 s4"
276
+ remaining = "td s0"
277
+ monkeypatch.setattr(
278
+ sys, "argv",
279
+ f'f2py {ipath} -m test skip: {toskip}'.split())
280
+
281
+ with util.switchdir(ipath.parent):
282
+ f2pycli()
283
+ out, err = capfd.readouterr()
284
+ for skey in toskip.split():
285
+ assert (
286
+ f'buildmodule: Could not found the body of interfaced routine "{skey}". Skipping.'
287
+ in err)
288
+ for rkey in remaining.split():
289
+ assert f'Constructing wrapper function "{rkey}"' in out
290
+
291
+
292
+ def test_f2py_only(capfd, retreal_f77, monkeypatch):
293
+ """Test that functions can be kept by only:
294
+ CLI :: only:
295
+ """
296
+ foutl = get_io_paths(retreal_f77, mname="test")
297
+ ipath = foutl.finp
298
+ toskip = "t0 t4 t8 sd s8 s4"
299
+ tokeep = "td s0"
300
+ monkeypatch.setattr(
301
+ sys, "argv",
302
+ f'f2py {ipath} -m test only: {tokeep}'.split())
303
+
304
+ with util.switchdir(ipath.parent):
305
+ f2pycli()
306
+ out, err = capfd.readouterr()
307
+ for skey in toskip.split():
308
+ assert (
309
+ f'buildmodule: Could not find the body of interfaced routine "{skey}". Skipping.'
310
+ in err)
311
+ for rkey in tokeep.split():
312
+ assert f'Constructing wrapper function "{rkey}"' in out
313
+
314
+
315
+ def test_file_processing_switch(capfd, hello_world_f90, retreal_f77,
316
+ monkeypatch):
317
+ """Tests that it is possible to return to file processing mode
318
+ CLI :: :
319
+ BUG: numpy-gh #20520
320
+ """
321
+ foutl = get_io_paths(retreal_f77, mname="test")
322
+ ipath = foutl.finp
323
+ toskip = "t0 t4 t8 sd s8 s4"
324
+ ipath2 = Path(hello_world_f90)
325
+ tokeep = "td s0 hi" # hi is in ipath2
326
+ mname = "blah"
327
+ monkeypatch.setattr(
328
+ sys,
329
+ "argv",
330
+ f'f2py {ipath} -m {mname} only: {tokeep} : {ipath2}'.split(
331
+ ),
332
+ )
333
+
334
+ with util.switchdir(ipath.parent):
335
+ f2pycli()
336
+ out, err = capfd.readouterr()
337
+ for skey in toskip.split():
338
+ assert (
339
+ f'buildmodule: Could not find the body of interfaced routine "{skey}". Skipping.'
340
+ in err)
341
+ for rkey in tokeep.split():
342
+ assert f'Constructing wrapper function "{rkey}"' in out
343
+
344
+
345
+ def test_mod_gen_f77(capfd, hello_world_f90, monkeypatch):
346
+ """Checks the generation of files based on a module name
347
+ CLI :: -m
348
+ """
349
+ MNAME = "hi"
350
+ foutl = get_io_paths(hello_world_f90, mname=MNAME)
351
+ ipath = foutl.f90inp
352
+ monkeypatch.setattr(sys, "argv", f'f2py {ipath} -m {MNAME}'.split())
353
+ with util.switchdir(ipath.parent):
354
+ f2pycli()
355
+
356
+ # Always generate C module
357
+ assert Path.exists(foutl.cmodf)
358
+ # File contains a function, check for F77 wrappers
359
+ assert Path.exists(foutl.wrap77)
360
+
361
+
362
+ def test_mod_gen_gh25263(capfd, hello_world_f77, monkeypatch):
363
+ """Check that pyf files are correctly generated with module structure
364
+ CLI :: -m <name> -h pyf_file
365
+ BUG: numpy-gh #20520
366
+ """
367
+ MNAME = "hi"
368
+ foutl = get_io_paths(hello_world_f77, mname=MNAME)
369
+ ipath = foutl.finp
370
+ monkeypatch.setattr(sys, "argv", f'f2py {ipath} -m {MNAME} -h hi.pyf'.split())
371
+ with util.switchdir(ipath.parent):
372
+ f2pycli()
373
+ with Path('hi.pyf').open() as hipyf:
374
+ pyfdat = hipyf.read()
375
+ assert "python module hi" in pyfdat
376
+
377
+
378
+ def test_lower_cmod(capfd, hello_world_f77, monkeypatch):
379
+ """Lowers cases by flag or when -h is present
380
+
381
+ CLI :: --[no-]lower
382
+ """
383
+ foutl = get_io_paths(hello_world_f77, mname="test")
384
+ ipath = foutl.finp
385
+ capshi = re.compile(r"HI\(\)")
386
+ capslo = re.compile(r"hi\(\)")
387
+ # Case I: --lower is passed
388
+ monkeypatch.setattr(sys, "argv", f'f2py {ipath} -m test --lower'.split())
389
+ with util.switchdir(ipath.parent):
390
+ f2pycli()
391
+ out, _ = capfd.readouterr()
392
+ assert capslo.search(out) is not None
393
+ assert capshi.search(out) is None
394
+ # Case II: --no-lower is passed
395
+ monkeypatch.setattr(sys, "argv",
396
+ f'f2py {ipath} -m test --no-lower'.split())
397
+ with util.switchdir(ipath.parent):
398
+ f2pycli()
399
+ out, _ = capfd.readouterr()
400
+ assert capslo.search(out) is None
401
+ assert capshi.search(out) is not None
402
+
403
+
404
+ def test_lower_sig(capfd, hello_world_f77, monkeypatch):
405
+ """Lowers cases in signature files by flag or when -h is present
406
+
407
+ CLI :: --[no-]lower -h
408
+ """
409
+ foutl = get_io_paths(hello_world_f77, mname="test")
410
+ ipath = foutl.finp
411
+ # Signature files
412
+ capshi = re.compile(r"Block: HI")
413
+ capslo = re.compile(r"Block: hi")
414
+ # Case I: --lower is implied by -h
415
+ # TODO: Clean up to prevent passing --overwrite-signature
416
+ monkeypatch.setattr(
417
+ sys,
418
+ "argv",
419
+ f'f2py {ipath} -h {foutl.pyf} -m test --overwrite-signature'.split(),
420
+ )
421
+
422
+ with util.switchdir(ipath.parent):
423
+ f2pycli()
424
+ out, _ = capfd.readouterr()
425
+ assert capslo.search(out) is not None
426
+ assert capshi.search(out) is None
427
+
428
+ # Case II: --no-lower overrides -h
429
+ monkeypatch.setattr(
430
+ sys,
431
+ "argv",
432
+ f'f2py {ipath} -h {foutl.pyf} -m test --overwrite-signature --no-lower'
433
+ .split(),
434
+ )
435
+
436
+ with util.switchdir(ipath.parent):
437
+ f2pycli()
438
+ out, _ = capfd.readouterr()
439
+ assert capslo.search(out) is None
440
+ assert capshi.search(out) is not None
441
+
442
+
443
+ def test_build_dir(capfd, hello_world_f90, monkeypatch):
444
+ """Ensures that the build directory can be specified
445
+
446
+ CLI :: --build-dir
447
+ """
448
+ ipath = Path(hello_world_f90)
449
+ mname = "blah"
450
+ odir = "tttmp"
451
+ monkeypatch.setattr(sys, "argv",
452
+ f'f2py -m {mname} {ipath} --build-dir {odir}'.split())
453
+
454
+ with util.switchdir(ipath.parent):
455
+ f2pycli()
456
+ out, _ = capfd.readouterr()
457
+ assert f"Wrote C/API module \"{mname}\"" in out
458
+
459
+
460
+ def test_overwrite(capfd, hello_world_f90, monkeypatch):
461
+ """Ensures that the build directory can be specified
462
+
463
+ CLI :: --overwrite-signature
464
+ """
465
+ ipath = Path(hello_world_f90)
466
+ monkeypatch.setattr(
467
+ sys, "argv",
468
+ f'f2py -h faker.pyf {ipath} --overwrite-signature'.split())
469
+
470
+ with util.switchdir(ipath.parent):
471
+ Path("faker.pyf").write_text("Fake news", encoding="ascii")
472
+ f2pycli()
473
+ out, _ = capfd.readouterr()
474
+ assert "Saving signatures to file" in out
475
+
476
+
477
+ def test_latexdoc(capfd, hello_world_f90, monkeypatch):
478
+ """Ensures that TeX documentation is written out
479
+
480
+ CLI :: --latex-doc
481
+ """
482
+ ipath = Path(hello_world_f90)
483
+ mname = "blah"
484
+ monkeypatch.setattr(sys, "argv",
485
+ f'f2py -m {mname} {ipath} --latex-doc'.split())
486
+
487
+ with util.switchdir(ipath.parent):
488
+ f2pycli()
489
+ out, _ = capfd.readouterr()
490
+ assert "Documentation is saved to file" in out
491
+ with Path(f"{mname}module.tex").open() as otex:
492
+ assert "\\documentclass" in otex.read()
493
+
494
+
495
+ def test_nolatexdoc(capfd, hello_world_f90, monkeypatch):
496
+ """Ensures that TeX documentation is written out
497
+
498
+ CLI :: --no-latex-doc
499
+ """
500
+ ipath = Path(hello_world_f90)
501
+ mname = "blah"
502
+ monkeypatch.setattr(sys, "argv",
503
+ f'f2py -m {mname} {ipath} --no-latex-doc'.split())
504
+
505
+ with util.switchdir(ipath.parent):
506
+ f2pycli()
507
+ out, _ = capfd.readouterr()
508
+ assert "Documentation is saved to file" not in out
509
+
510
+
511
+ def test_shortlatex(capfd, hello_world_f90, monkeypatch):
512
+ """Ensures that truncated documentation is written out
513
+
514
+ TODO: Test to ensure this has no effect without --latex-doc
515
+ CLI :: --latex-doc --short-latex
516
+ """
517
+ ipath = Path(hello_world_f90)
518
+ mname = "blah"
519
+ monkeypatch.setattr(
520
+ sys,
521
+ "argv",
522
+ f'f2py -m {mname} {ipath} --latex-doc --short-latex'.split(),
523
+ )
524
+
525
+ with util.switchdir(ipath.parent):
526
+ f2pycli()
527
+ out, _ = capfd.readouterr()
528
+ assert "Documentation is saved to file" in out
529
+ with Path(f"./{mname}module.tex").open() as otex:
530
+ assert "\\documentclass" not in otex.read()
531
+
532
+
533
+ def test_restdoc(capfd, hello_world_f90, monkeypatch):
534
+ """Ensures that RsT documentation is written out
535
+
536
+ CLI :: --rest-doc
537
+ """
538
+ ipath = Path(hello_world_f90)
539
+ mname = "blah"
540
+ monkeypatch.setattr(sys, "argv",
541
+ f'f2py -m {mname} {ipath} --rest-doc'.split())
542
+
543
+ with util.switchdir(ipath.parent):
544
+ f2pycli()
545
+ out, _ = capfd.readouterr()
546
+ assert "ReST Documentation is saved to file" in out
547
+ with Path(f"./{mname}module.rest").open() as orst:
548
+ assert r".. -*- rest -*-" in orst.read()
549
+
550
+
551
+ def test_norestexdoc(capfd, hello_world_f90, monkeypatch):
552
+ """Ensures that TeX documentation is written out
553
+
554
+ CLI :: --no-rest-doc
555
+ """
556
+ ipath = Path(hello_world_f90)
557
+ mname = "blah"
558
+ monkeypatch.setattr(sys, "argv",
559
+ f'f2py -m {mname} {ipath} --no-rest-doc'.split())
560
+
561
+ with util.switchdir(ipath.parent):
562
+ f2pycli()
563
+ out, _ = capfd.readouterr()
564
+ assert "ReST Documentation is saved to file" not in out
565
+
566
+
567
+ def test_debugcapi(capfd, hello_world_f90, monkeypatch):
568
+ """Ensures that debugging wrappers are written
569
+
570
+ CLI :: --debug-capi
571
+ """
572
+ ipath = Path(hello_world_f90)
573
+ mname = "blah"
574
+ monkeypatch.setattr(sys, "argv",
575
+ f'f2py -m {mname} {ipath} --debug-capi'.split())
576
+
577
+ with util.switchdir(ipath.parent):
578
+ f2pycli()
579
+ with Path(f"./{mname}module.c").open() as ocmod:
580
+ assert r"#define DEBUGCFUNCS" in ocmod.read()
581
+
582
+
583
+ @pytest.mark.skip(reason="Consistently fails on CI; noisy so skip not xfail.")
584
+ def test_debugcapi_bld(hello_world_f90, monkeypatch):
585
+ """Ensures that debugging wrappers work
586
+
587
+ CLI :: --debug-capi -c
588
+ """
589
+ ipath = Path(hello_world_f90)
590
+ mname = "blah"
591
+ monkeypatch.setattr(sys, "argv",
592
+ f'f2py -m {mname} {ipath} -c --debug-capi'.split())
593
+
594
+ with util.switchdir(ipath.parent):
595
+ f2pycli()
596
+ cmd_run = shlex.split(f"{sys.executable} -c \"import blah; blah.hi()\"")
597
+ rout = subprocess.run(cmd_run, capture_output=True, encoding='UTF-8')
598
+ eout = ' Hello World\n'
599
+ eerr = textwrap.dedent("""\
600
+ debug-capi:Python C/API function blah.hi()
601
+ debug-capi:float hi=:output,hidden,scalar
602
+ debug-capi:hi=0
603
+ debug-capi:Fortran subroutine `f2pywraphi(&hi)'
604
+ debug-capi:hi=0
605
+ debug-capi:Building return value.
606
+ debug-capi:Python C/API function blah.hi: successful.
607
+ debug-capi:Freeing memory.
608
+ """)
609
+ assert rout.stdout == eout
610
+ assert rout.stderr == eerr
611
+
612
+
613
+ def test_wrapfunc_def(capfd, hello_world_f90, monkeypatch):
614
+ """Ensures that fortran subroutine wrappers for F77 are included by default
615
+
616
+ CLI :: --[no]-wrap-functions
617
+ """
618
+ # Implied
619
+ ipath = Path(hello_world_f90)
620
+ mname = "blah"
621
+ monkeypatch.setattr(sys, "argv", f'f2py -m {mname} {ipath}'.split())
622
+
623
+ with util.switchdir(ipath.parent):
624
+ f2pycli()
625
+ out, _ = capfd.readouterr()
626
+ assert r"Fortran 77 wrappers are saved to" in out
627
+
628
+ # Explicit
629
+ monkeypatch.setattr(sys, "argv",
630
+ f'f2py -m {mname} {ipath} --wrap-functions'.split())
631
+
632
+ with util.switchdir(ipath.parent):
633
+ f2pycli()
634
+ out, _ = capfd.readouterr()
635
+ assert r"Fortran 77 wrappers are saved to" in out
636
+
637
+
638
+ def test_nowrapfunc(capfd, hello_world_f90, monkeypatch):
639
+ """Ensures that fortran subroutine wrappers for F77 can be disabled
640
+
641
+ CLI :: --no-wrap-functions
642
+ """
643
+ ipath = Path(hello_world_f90)
644
+ mname = "blah"
645
+ monkeypatch.setattr(sys, "argv",
646
+ f'f2py -m {mname} {ipath} --no-wrap-functions'.split())
647
+
648
+ with util.switchdir(ipath.parent):
649
+ f2pycli()
650
+ out, _ = capfd.readouterr()
651
+ assert r"Fortran 77 wrappers are saved to" not in out
652
+
653
+
654
+ def test_inclheader(capfd, hello_world_f90, monkeypatch):
655
+ """Add to the include directories
656
+
657
+ CLI :: -include
658
+ TODO: Document this in the help string
659
+ """
660
+ ipath = Path(hello_world_f90)
661
+ mname = "blah"
662
+ monkeypatch.setattr(
663
+ sys,
664
+ "argv",
665
+ f'f2py -m {mname} {ipath} -include<stdbool.h> -include<stdio.h> '.
666
+ split(),
667
+ )
668
+
669
+ with util.switchdir(ipath.parent):
670
+ f2pycli()
671
+ with Path(f"./{mname}module.c").open() as ocmod:
672
+ ocmr = ocmod.read()
673
+ assert "#include <stdbool.h>" in ocmr
674
+ assert "#include <stdio.h>" in ocmr
675
+
676
+ @pytest.mark.skipif((platform.system() != 'Linux'), reason='Compiler required')
677
+ def test_cli_obj(capfd, hello_world_f90, monkeypatch):
678
+ """Ensures that the extra object can be specified when using meson backend
679
+ """
680
+ ipath = Path(hello_world_f90)
681
+ mname = "blah"
682
+ odir = "tttmp"
683
+ obj = "extra.o"
684
+ monkeypatch.setattr(sys, "argv",
685
+ f'f2py --backend meson --build-dir {odir} -m {mname} -c {obj} {ipath}'.split())
686
+
687
+ with util.switchdir(ipath.parent):
688
+ Path(obj).touch()
689
+ compiler_check_f2pycli()
690
+ with Path(f"{odir}/meson.build").open() as mesonbuild:
691
+ mbld = mesonbuild.read()
692
+ assert "objects:" in mbld
693
+ assert f"'''{obj}'''" in mbld
694
+
695
+
696
+ def test_inclpath():
697
+ """Add to the include directories
698
+
699
+ CLI :: --include-paths
700
+ """
701
+ # TODO: populate
702
+ pass
703
+
704
+
705
+ def test_hlink():
706
+ """Add to the include directories
707
+
708
+ CLI :: --help-link
709
+ """
710
+ # TODO: populate
711
+ pass
712
+
713
+
714
+ def test_f2cmap(capfd, f2cmap_f90, monkeypatch):
715
+ """Check that Fortran-to-Python KIND specs can be passed
716
+
717
+ CLI :: --f2cmap
718
+ """
719
+ ipath = Path(f2cmap_f90)
720
+ monkeypatch.setattr(sys, "argv", f'f2py -m blah {ipath} --f2cmap mapfile'.split())
721
+
722
+ with util.switchdir(ipath.parent):
723
+ f2pycli()
724
+ out, _ = capfd.readouterr()
725
+ assert "Reading f2cmap from 'mapfile' ..." in out
726
+ assert "Mapping \"real(kind=real32)\" to \"float\"" in out
727
+ assert "Mapping \"real(kind=real64)\" to \"double\"" in out
728
+ assert "Mapping \"integer(kind=int64)\" to \"long_long\"" in out
729
+ assert "Successfully applied user defined f2cmap changes" in out
730
+
731
+
732
+ def test_quiet(capfd, hello_world_f90, monkeypatch):
733
+ """Reduce verbosity
734
+
735
+ CLI :: --quiet
736
+ """
737
+ ipath = Path(hello_world_f90)
738
+ monkeypatch.setattr(sys, "argv", f'f2py -m blah {ipath} --quiet'.split())
739
+
740
+ with util.switchdir(ipath.parent):
741
+ f2pycli()
742
+ out, _ = capfd.readouterr()
743
+ assert len(out) == 0
744
+
745
+
746
+ def test_verbose(capfd, hello_world_f90, monkeypatch):
747
+ """Increase verbosity
748
+
749
+ CLI :: --verbose
750
+ """
751
+ ipath = Path(hello_world_f90)
752
+ monkeypatch.setattr(sys, "argv", f'f2py -m blah {ipath} --verbose'.split())
753
+
754
+ with util.switchdir(ipath.parent):
755
+ f2pycli()
756
+ out, _ = capfd.readouterr()
757
+ assert "analyzeline" in out
758
+
759
+
760
+ def test_version(capfd, monkeypatch):
761
+ """Ensure version
762
+
763
+ CLI :: -v
764
+ """
765
+ monkeypatch.setattr(sys, "argv", ["f2py", "-v"])
766
+ # TODO: f2py2e should not call sys.exit() after printing the version
767
+ with pytest.raises(SystemExit):
768
+ f2pycli()
769
+ out, _ = capfd.readouterr()
770
+ import numpy as np
771
+ assert np.__version__ == out.strip()
772
+
773
+
774
+ @pytest.mark.skip(reason="Consistently fails on CI; noisy so skip not xfail.")
775
+ def test_npdistop(hello_world_f90, monkeypatch):
776
+ """
777
+ CLI :: -c
778
+ """
779
+ ipath = Path(hello_world_f90)
780
+ monkeypatch.setattr(sys, "argv", f'f2py -m blah {ipath} -c'.split())
781
+
782
+ with util.switchdir(ipath.parent):
783
+ f2pycli()
784
+ cmd_run = shlex.split(f"{sys.executable} -c \"import blah; blah.hi()\"")
785
+ rout = subprocess.run(cmd_run, capture_output=True, encoding='UTF-8')
786
+ eout = ' Hello World\n'
787
+ assert rout.stdout == eout
788
+
789
+
790
+ @pytest.mark.skipif((platform.system() != 'Linux') or sys.version_info <= (3, 12),
791
+ reason='Compiler and Python 3.12 or newer required')
792
+ def test_no_freethreading_compatible(hello_world_f90, monkeypatch):
793
+ """
794
+ CLI :: --no-freethreading-compatible
795
+ """
796
+ ipath = Path(hello_world_f90)
797
+ monkeypatch.setattr(sys, "argv", f'f2py -m blah {ipath} -c --no-freethreading-compatible'.split())
798
+
799
+ with util.switchdir(ipath.parent):
800
+ compiler_check_f2pycli()
801
+ cmd = f"{sys.executable} -c \"import blah; blah.hi();"
802
+ if NOGIL_BUILD:
803
+ cmd += "import sys; assert sys._is_gil_enabled() is True\""
804
+ else:
805
+ cmd += "\""
806
+ cmd_run = shlex.split(cmd)
807
+ rout = subprocess.run(cmd_run, capture_output=True, encoding='UTF-8')
808
+ eout = ' Hello World\n'
809
+ assert rout.stdout == eout
810
+ if NOGIL_BUILD:
811
+ assert "The global interpreter lock (GIL) has been enabled to load module 'blah'" in rout.stderr
812
+ assert rout.returncode == 0
813
+
814
+
815
+ @pytest.mark.skipif((platform.system() != 'Linux') or sys.version_info <= (3, 12),
816
+ reason='Compiler and Python 3.12 or newer required')
817
+ def test_freethreading_compatible(hello_world_f90, monkeypatch):
818
+ """
819
+ CLI :: --freethreading_compatible
820
+ """
821
+ ipath = Path(hello_world_f90)
822
+ monkeypatch.setattr(sys, "argv", f'f2py -m blah {ipath} -c --freethreading-compatible'.split())
823
+
824
+ with util.switchdir(ipath.parent):
825
+ compiler_check_f2pycli()
826
+ cmd = f"{sys.executable} -c \"import blah; blah.hi();"
827
+ if NOGIL_BUILD:
828
+ cmd += "import sys; assert sys._is_gil_enabled() is False\""
829
+ else:
830
+ cmd += "\""
831
+ cmd_run = shlex.split(cmd)
832
+ rout = subprocess.run(cmd_run, capture_output=True, encoding='UTF-8')
833
+ eout = ' Hello World\n'
834
+ assert rout.stdout == eout
835
+ assert rout.stderr == ""
836
+ assert rout.returncode == 0
837
+
838
+
839
+ # Numpy distutils flags
840
+ # TODO: These should be tested separately
841
+
842
+ def test_npd_fcompiler():
843
+ """
844
+ CLI :: -c --fcompiler
845
+ """
846
+ # TODO: populate
847
+ pass
848
+
849
+
850
+ def test_npd_compiler():
851
+ """
852
+ CLI :: -c --compiler
853
+ """
854
+ # TODO: populate
855
+ pass
856
+
857
+
858
+ def test_npd_help_fcompiler():
859
+ """
860
+ CLI :: -c --help-fcompiler
861
+ """
862
+ # TODO: populate
863
+ pass
864
+
865
+
866
+ def test_npd_f77exec():
867
+ """
868
+ CLI :: -c --f77exec
869
+ """
870
+ # TODO: populate
871
+ pass
872
+
873
+
874
+ def test_npd_f90exec():
875
+ """
876
+ CLI :: -c --f90exec
877
+ """
878
+ # TODO: populate
879
+ pass
880
+
881
+
882
+ def test_npd_f77flags():
883
+ """
884
+ CLI :: -c --f77flags
885
+ """
886
+ # TODO: populate
887
+ pass
888
+
889
+
890
+ def test_npd_f90flags():
891
+ """
892
+ CLI :: -c --f90flags
893
+ """
894
+ # TODO: populate
895
+ pass
896
+
897
+
898
+ def test_npd_opt():
899
+ """
900
+ CLI :: -c --opt
901
+ """
902
+ # TODO: populate
903
+ pass
904
+
905
+
906
+ def test_npd_arch():
907
+ """
908
+ CLI :: -c --arch
909
+ """
910
+ # TODO: populate
911
+ pass
912
+
913
+
914
+ def test_npd_noopt():
915
+ """
916
+ CLI :: -c --noopt
917
+ """
918
+ # TODO: populate
919
+ pass
920
+
921
+
922
+ def test_npd_noarch():
923
+ """
924
+ CLI :: -c --noarch
925
+ """
926
+ # TODO: populate
927
+ pass
928
+
929
+
930
+ def test_npd_debug():
931
+ """
932
+ CLI :: -c --debug
933
+ """
934
+ # TODO: populate
935
+ pass
936
+
937
+
938
+ def test_npd_link_auto():
939
+ """
940
+ CLI :: -c --link-<resource>
941
+ """
942
+ # TODO: populate
943
+ pass
944
+
945
+
946
+ def test_npd_lib():
947
+ """
948
+ CLI :: -c -L/path/to/lib/ -l<libname>
949
+ """
950
+ # TODO: populate
951
+ pass
952
+
953
+
954
+ def test_npd_define():
955
+ """
956
+ CLI :: -D<define>
957
+ """
958
+ # TODO: populate
959
+ pass
960
+
961
+
962
+ def test_npd_undefine():
963
+ """
964
+ CLI :: -U<name>
965
+ """
966
+ # TODO: populate
967
+ pass
968
+
969
+
970
+ def test_npd_incl():
971
+ """
972
+ CLI :: -I/path/to/include/
973
+ """
974
+ # TODO: populate
975
+ pass
976
+
977
+
978
+ def test_npd_linker():
979
+ """
980
+ CLI :: <filename>.o <filename>.so <filename>.a
981
+ """
982
+ # TODO: populate
983
+ pass