Cython 3.3.0a1__cp315-cp315-win_amd64.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 (335) hide show
  1. Cython/Build/BuildExecutable.py +156 -0
  2. Cython/Build/Cache.py +199 -0
  3. Cython/Build/Cythonize.py +349 -0
  4. Cython/Build/Dependencies.py +1276 -0
  5. Cython/Build/Distutils.py +1 -0
  6. Cython/Build/Inline.py +467 -0
  7. Cython/Build/IpythonMagic.py +559 -0
  8. Cython/Build/SharedModule.py +84 -0
  9. Cython/Build/Tests/TestCyCache.py +195 -0
  10. Cython/Build/Tests/TestCythonizeArgsParser.py +480 -0
  11. Cython/Build/Tests/TestDependencies.py +133 -0
  12. Cython/Build/Tests/TestInline.py +177 -0
  13. Cython/Build/Tests/TestIpythonMagic.py +303 -0
  14. Cython/Build/Tests/TestRecythonize.py +212 -0
  15. Cython/Build/Tests/TestStripLiterals.py +155 -0
  16. Cython/Build/Tests/__init__.py +1 -0
  17. Cython/Build/__init__.py +11 -0
  18. Cython/CodeWriter.py +815 -0
  19. Cython/Compiler/AnalysedTreeTransforms.py +97 -0
  20. Cython/Compiler/Annotate.py +328 -0
  21. Cython/Compiler/AutoDocTransforms.py +320 -0
  22. Cython/Compiler/Buffer.py +680 -0
  23. Cython/Compiler/Builtin.py +997 -0
  24. Cython/Compiler/CmdLine.py +263 -0
  25. Cython/Compiler/Code.cp315-win_amd64.pyd +0 -0
  26. Cython/Compiler/Code.pxd +152 -0
  27. Cython/Compiler/Code.py +3907 -0
  28. Cython/Compiler/CodeGeneration.py +33 -0
  29. Cython/Compiler/CythonScope.py +194 -0
  30. Cython/Compiler/Dataclass.py +890 -0
  31. Cython/Compiler/DebugFlags.py +24 -0
  32. Cython/Compiler/Errors.py +310 -0
  33. Cython/Compiler/ExprNodes.py +15983 -0
  34. Cython/Compiler/FlowControl.cp315-win_amd64.pyd +0 -0
  35. Cython/Compiler/FlowControl.pxd +99 -0
  36. Cython/Compiler/FlowControl.py +1571 -0
  37. Cython/Compiler/FusedNode.cp315-win_amd64.pyd +0 -0
  38. Cython/Compiler/FusedNode.py +976 -0
  39. Cython/Compiler/Future.py +16 -0
  40. Cython/Compiler/Interpreter.py +57 -0
  41. Cython/Compiler/Lexicon.py +422 -0
  42. Cython/Compiler/LineTable.cp315-win_amd64.pyd +0 -0
  43. Cython/Compiler/LineTable.py +114 -0
  44. Cython/Compiler/Main.py +856 -0
  45. Cython/Compiler/MatchCaseNodes.py +2197 -0
  46. Cython/Compiler/MemoryView.py +930 -0
  47. Cython/Compiler/ModuleNode.py +4517 -0
  48. Cython/Compiler/Naming.py +367 -0
  49. Cython/Compiler/Nodes.py +10941 -0
  50. Cython/Compiler/Optimize.py +5455 -0
  51. Cython/Compiler/Options.py +838 -0
  52. Cython/Compiler/ParseTreeTransforms.pxd +79 -0
  53. Cython/Compiler/ParseTreeTransforms.py +4744 -0
  54. Cython/Compiler/Parsing.cp315-win_amd64.pyd +0 -0
  55. Cython/Compiler/Parsing.pxd +9 -0
  56. Cython/Compiler/Parsing.py +4792 -0
  57. Cython/Compiler/Pipeline.py +439 -0
  58. Cython/Compiler/PyrexTypes.py +6111 -0
  59. Cython/Compiler/Pythran.py +232 -0
  60. Cython/Compiler/Scanning.cp315-win_amd64.pyd +0 -0
  61. Cython/Compiler/Scanning.pxd +70 -0
  62. Cython/Compiler/Scanning.py +720 -0
  63. Cython/Compiler/StringEncoding.py +297 -0
  64. Cython/Compiler/Symtab.py +3092 -0
  65. Cython/Compiler/Tests/TestBuffer.py +105 -0
  66. Cython/Compiler/Tests/TestBuiltin.py +117 -0
  67. Cython/Compiler/Tests/TestCmdLine.py +587 -0
  68. Cython/Compiler/Tests/TestCode.py +145 -0
  69. Cython/Compiler/Tests/TestFlowControl.py +65 -0
  70. Cython/Compiler/Tests/TestGrammar.py +202 -0
  71. Cython/Compiler/Tests/TestMemView.py +71 -0
  72. Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
  73. Cython/Compiler/Tests/TestScanning.py +132 -0
  74. Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
  75. Cython/Compiler/Tests/TestStringEncoding.py +20 -0
  76. Cython/Compiler/Tests/TestTreeFragment.py +63 -0
  77. Cython/Compiler/Tests/TestTreePath.py +103 -0
  78. Cython/Compiler/Tests/TestTypes.py +118 -0
  79. Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
  80. Cython/Compiler/Tests/TestVisitor.py +61 -0
  81. Cython/Compiler/Tests/Utils.py +36 -0
  82. Cython/Compiler/Tests/__init__.py +1 -0
  83. Cython/Compiler/TreeFragment.py +278 -0
  84. Cython/Compiler/TreePath.py +303 -0
  85. Cython/Compiler/TypeInference.py +611 -0
  86. Cython/Compiler/TypeSlots.py +1329 -0
  87. Cython/Compiler/UFuncs.py +311 -0
  88. Cython/Compiler/UtilNodes.py +413 -0
  89. Cython/Compiler/UtilityCode.py +348 -0
  90. Cython/Compiler/Version.py +8 -0
  91. Cython/Compiler/Visitor.cp315-win_amd64.pyd +0 -0
  92. Cython/Compiler/Visitor.pxd +53 -0
  93. Cython/Compiler/Visitor.py +864 -0
  94. Cython/Compiler/__init__.py +1 -0
  95. Cython/Coverage.py +448 -0
  96. Cython/Debugger/Cygdb.py +177 -0
  97. Cython/Debugger/DebugWriter.py +82 -0
  98. Cython/Debugger/Tests/TestLibCython.py +280 -0
  99. Cython/Debugger/Tests/__init__.py +1 -0
  100. Cython/Debugger/Tests/cfuncs.c +8 -0
  101. Cython/Debugger/Tests/codefile +49 -0
  102. Cython/Debugger/Tests/test_libcython_in_gdb.py +580 -0
  103. Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
  104. Cython/Debugger/__init__.py +1 -0
  105. Cython/Debugger/libcython.py +1548 -0
  106. Cython/Debugger/libpython.py +2821 -0
  107. Cython/Debugging.py +20 -0
  108. Cython/Distutils/__init__.py +2 -0
  109. Cython/Distutils/build_ext.py +139 -0
  110. Cython/Distutils/extension.py +96 -0
  111. Cython/Distutils/old_build_ext.py +351 -0
  112. Cython/Includes/cpython/__init__.pxd +173 -0
  113. Cython/Includes/cpython/array.pxd +152 -0
  114. Cython/Includes/cpython/bool.pxd +37 -0
  115. Cython/Includes/cpython/buffer.pxd +112 -0
  116. Cython/Includes/cpython/bytearray.pxd +33 -0
  117. Cython/Includes/cpython/bytes.pxd +200 -0
  118. Cython/Includes/cpython/cellobject.pxd +35 -0
  119. Cython/Includes/cpython/ceval.pxd +8 -0
  120. Cython/Includes/cpython/codecs.pxd +121 -0
  121. Cython/Includes/cpython/complex.pxd +60 -0
  122. Cython/Includes/cpython/contextvars.pxd +145 -0
  123. Cython/Includes/cpython/conversion.pxd +36 -0
  124. Cython/Includes/cpython/datetime.pxd +395 -0
  125. Cython/Includes/cpython/descr.pxd +26 -0
  126. Cython/Includes/cpython/dict.pxd +268 -0
  127. Cython/Includes/cpython/exc.pxd +263 -0
  128. Cython/Includes/cpython/fileobject.pxd +57 -0
  129. Cython/Includes/cpython/float.pxd +56 -0
  130. Cython/Includes/cpython/frozendict.pxd +37 -0
  131. Cython/Includes/cpython/function.pxd +65 -0
  132. Cython/Includes/cpython/genobject.pxd +25 -0
  133. Cython/Includes/cpython/getargs.pxd +12 -0
  134. Cython/Includes/cpython/instance.pxd +25 -0
  135. Cython/Includes/cpython/iterator.pxd +36 -0
  136. Cython/Includes/cpython/iterobject.pxd +24 -0
  137. Cython/Includes/cpython/list.pxd +144 -0
  138. Cython/Includes/cpython/long.pxd +180 -0
  139. Cython/Includes/cpython/longintrepr.pxd +14 -0
  140. Cython/Includes/cpython/mapping.pxd +63 -0
  141. Cython/Includes/cpython/marshal.pxd +66 -0
  142. Cython/Includes/cpython/mem.pxd +120 -0
  143. Cython/Includes/cpython/memoryview.pxd +50 -0
  144. Cython/Includes/cpython/method.pxd +49 -0
  145. Cython/Includes/cpython/module.pxd +208 -0
  146. Cython/Includes/cpython/number.pxd +258 -0
  147. Cython/Includes/cpython/object.pxd +430 -0
  148. Cython/Includes/cpython/pycapsule.pxd +143 -0
  149. Cython/Includes/cpython/pylifecycle.pxd +68 -0
  150. Cython/Includes/cpython/pyport.pxd +8 -0
  151. Cython/Includes/cpython/pystate.pxd +95 -0
  152. Cython/Includes/cpython/pythread.pxd +53 -0
  153. Cython/Includes/cpython/ref.pxd +141 -0
  154. Cython/Includes/cpython/sentinel.pxd +17 -0
  155. Cython/Includes/cpython/sequence.pxd +134 -0
  156. Cython/Includes/cpython/set.pxd +119 -0
  157. Cython/Includes/cpython/slice.pxd +70 -0
  158. Cython/Includes/cpython/time.pxd +129 -0
  159. Cython/Includes/cpython/tuple.pxd +72 -0
  160. Cython/Includes/cpython/type.pxd +146 -0
  161. Cython/Includes/cpython/unicode.pxd +639 -0
  162. Cython/Includes/cpython/version.pxd +32 -0
  163. Cython/Includes/cpython/weakref.pxd +78 -0
  164. Cython/Includes/libc/__init__.pxd +1 -0
  165. Cython/Includes/libc/complex.pxd +35 -0
  166. Cython/Includes/libc/errno.pxd +127 -0
  167. Cython/Includes/libc/float.pxd +43 -0
  168. Cython/Includes/libc/limits.pxd +28 -0
  169. Cython/Includes/libc/locale.pxd +46 -0
  170. Cython/Includes/libc/math.pxd +209 -0
  171. Cython/Includes/libc/setjmp.pxd +10 -0
  172. Cython/Includes/libc/signal.pxd +64 -0
  173. Cython/Includes/libc/stddef.pxd +9 -0
  174. Cython/Includes/libc/stdint.pxd +105 -0
  175. Cython/Includes/libc/stdio.pxd +80 -0
  176. Cython/Includes/libc/stdlib.pxd +72 -0
  177. Cython/Includes/libc/string.pxd +50 -0
  178. Cython/Includes/libc/threads.pxd +234 -0
  179. Cython/Includes/libc/time.pxd +52 -0
  180. Cython/Includes/libcpp/__init__.pxd +4 -0
  181. Cython/Includes/libcpp/algorithm.pxd +320 -0
  182. Cython/Includes/libcpp/any.pxd +16 -0
  183. Cython/Includes/libcpp/atomic.pxd +59 -0
  184. Cython/Includes/libcpp/barrier.pxd +22 -0
  185. Cython/Includes/libcpp/bit.pxd +29 -0
  186. Cython/Includes/libcpp/cast.pxd +12 -0
  187. Cython/Includes/libcpp/cmath.pxd +518 -0
  188. Cython/Includes/libcpp/complex.pxd +106 -0
  189. Cython/Includes/libcpp/condition_variable.pxd +322 -0
  190. Cython/Includes/libcpp/deque.pxd +165 -0
  191. Cython/Includes/libcpp/exception.pxd +216 -0
  192. Cython/Includes/libcpp/execution.pxd +15 -0
  193. Cython/Includes/libcpp/forward_list.pxd +63 -0
  194. Cython/Includes/libcpp/functional.pxd +26 -0
  195. Cython/Includes/libcpp/future.pxd +103 -0
  196. Cython/Includes/libcpp/iterator.pxd +34 -0
  197. Cython/Includes/libcpp/latch.pxd +17 -0
  198. Cython/Includes/libcpp/limits.pxd +61 -0
  199. Cython/Includes/libcpp/list.pxd +117 -0
  200. Cython/Includes/libcpp/map.pxd +252 -0
  201. Cython/Includes/libcpp/memory.pxd +115 -0
  202. Cython/Includes/libcpp/mutex.pxd +387 -0
  203. Cython/Includes/libcpp/numbers.pxd +15 -0
  204. Cython/Includes/libcpp/numeric.pxd +131 -0
  205. Cython/Includes/libcpp/optional.pxd +34 -0
  206. Cython/Includes/libcpp/pair.pxd +1 -0
  207. Cython/Includes/libcpp/queue.pxd +25 -0
  208. Cython/Includes/libcpp/random.pxd +166 -0
  209. Cython/Includes/libcpp/semaphore.pxd +43 -0
  210. Cython/Includes/libcpp/set.pxd +228 -0
  211. Cython/Includes/libcpp/shared_mutex.pxd +96 -0
  212. Cython/Includes/libcpp/span.pxd +87 -0
  213. Cython/Includes/libcpp/stack.pxd +11 -0
  214. Cython/Includes/libcpp/stop_token.pxd +117 -0
  215. Cython/Includes/libcpp/string.pxd +355 -0
  216. Cython/Includes/libcpp/string_view.pxd +183 -0
  217. Cython/Includes/libcpp/typeindex.pxd +15 -0
  218. Cython/Includes/libcpp/typeinfo.pxd +10 -0
  219. Cython/Includes/libcpp/unordered_map.pxd +193 -0
  220. Cython/Includes/libcpp/unordered_set.pxd +152 -0
  221. Cython/Includes/libcpp/utility.pxd +30 -0
  222. Cython/Includes/libcpp/vector.pxd +186 -0
  223. Cython/Includes/numpy/math.pxd +150 -0
  224. Cython/Includes/openmp.pxd +50 -0
  225. Cython/Includes/posix/__init__.pxd +1 -0
  226. Cython/Includes/posix/dlfcn.pxd +14 -0
  227. Cython/Includes/posix/fcntl.pxd +86 -0
  228. Cython/Includes/posix/ioctl.pxd +4 -0
  229. Cython/Includes/posix/mman.pxd +101 -0
  230. Cython/Includes/posix/resource.pxd +57 -0
  231. Cython/Includes/posix/select.pxd +21 -0
  232. Cython/Includes/posix/signal.pxd +73 -0
  233. Cython/Includes/posix/stat.pxd +98 -0
  234. Cython/Includes/posix/stdio.pxd +37 -0
  235. Cython/Includes/posix/stdlib.pxd +29 -0
  236. Cython/Includes/posix/strings.pxd +9 -0
  237. Cython/Includes/posix/time.pxd +71 -0
  238. Cython/Includes/posix/types.pxd +30 -0
  239. Cython/Includes/posix/uio.pxd +26 -0
  240. Cython/Includes/posix/unistd.pxd +271 -0
  241. Cython/Includes/posix/wait.pxd +38 -0
  242. Cython/LZSS.py +170 -0
  243. Cython/Plex/Actions.cp315-win_amd64.pyd +0 -0
  244. Cython/Plex/Actions.pxd +24 -0
  245. Cython/Plex/Actions.py +119 -0
  246. Cython/Plex/DFA.cp315-win_amd64.pyd +0 -0
  247. Cython/Plex/DFA.pxd +14 -0
  248. Cython/Plex/DFA.py +164 -0
  249. Cython/Plex/Errors.py +48 -0
  250. Cython/Plex/Lexicons.py +178 -0
  251. Cython/Plex/Machines.cp315-win_amd64.pyd +0 -0
  252. Cython/Plex/Machines.pxd +36 -0
  253. Cython/Plex/Machines.py +238 -0
  254. Cython/Plex/Regexps.py +535 -0
  255. Cython/Plex/Scanners.cp315-win_amd64.pyd +0 -0
  256. Cython/Plex/Scanners.pxd +45 -0
  257. Cython/Plex/Scanners.py +328 -0
  258. Cython/Plex/Transitions.cp315-win_amd64.pyd +0 -0
  259. Cython/Plex/Transitions.pxd +14 -0
  260. Cython/Plex/Transitions.py +239 -0
  261. Cython/Plex/__init__.py +34 -0
  262. Cython/Runtime/__init__.py +1 -0
  263. Cython/Runtime/refnanny.cp315-win_amd64.pyd +0 -0
  264. Cython/Runtime/refnanny.pyx +237 -0
  265. Cython/Shadow.py +1167 -0
  266. Cython/StringIOTree.cp315-win_amd64.pyd +0 -0
  267. Cython/StringIOTree.py +169 -0
  268. Cython/Tempita/__init__.py +4 -0
  269. Cython/Tempita/_looper.py +154 -0
  270. Cython/Tempita/_tempita.cp315-win_amd64.pyd +0 -0
  271. Cython/Tempita/_tempita.py +1087 -0
  272. Cython/TestUtils.py +464 -0
  273. Cython/Tests/TestCodeWriter.py +128 -0
  274. Cython/Tests/TestCythonUtils.py +202 -0
  275. Cython/Tests/TestJediTyper.py +223 -0
  276. Cython/Tests/TestShadow.py +110 -0
  277. Cython/Tests/TestStringIOTree.py +68 -0
  278. Cython/Tests/TestTestUtils.py +89 -0
  279. Cython/Tests/__init__.py +1 -0
  280. Cython/Tests/xmlrunner.py +390 -0
  281. Cython/Utility/AsyncGen.c +1073 -0
  282. Cython/Utility/Buffer.c +866 -0
  283. Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
  284. Cython/Utility/Builtins.c +933 -0
  285. Cython/Utility/CConvert.pyx +149 -0
  286. Cython/Utility/CMath.c +104 -0
  287. Cython/Utility/CommonStructures.c +244 -0
  288. Cython/Utility/Complex.c +378 -0
  289. Cython/Utility/Coroutine.c +2337 -0
  290. Cython/Utility/CpdefEnums.pyx +107 -0
  291. Cython/Utility/CppConvert.pyx +282 -0
  292. Cython/Utility/CppSupport.cpp +151 -0
  293. Cython/Utility/CythonFunction.c +2072 -0
  294. Cython/Utility/Dataclasses.c +101 -0
  295. Cython/Utility/Embed.c +129 -0
  296. Cython/Utility/Exceptions.c +1038 -0
  297. Cython/Utility/ExtensionTypes.c +1158 -0
  298. Cython/Utility/FunctionArguments.c +1045 -0
  299. Cython/Utility/FusedFunction.pyx +44 -0
  300. Cython/Utility/ImportExport.c +930 -0
  301. Cython/Utility/MatchCase.c +979 -0
  302. Cython/Utility/MatchCase_Cy.pyx +12 -0
  303. Cython/Utility/MemoryView.pxd +108 -0
  304. Cython/Utility/MemoryView.pyx +1499 -0
  305. Cython/Utility/MemoryView_C.c +1056 -0
  306. Cython/Utility/ModuleSetupCode.c +3352 -0
  307. Cython/Utility/NumpyImportArray.c +46 -0
  308. Cython/Utility/ObjectHandling.c +3372 -0
  309. Cython/Utility/Optimize.c +2563 -0
  310. Cython/Utility/Overflow.c +378 -0
  311. Cython/Utility/Profile.c +736 -0
  312. Cython/Utility/StringTools.c +1414 -0
  313. Cython/Utility/Synchronization.c +438 -0
  314. Cython/Utility/TString.c +369 -0
  315. Cython/Utility/TestCyUtilityLoader.pyx +8 -0
  316. Cython/Utility/TestCythonScope.pyx +75 -0
  317. Cython/Utility/TestUtilityLoader.c +12 -0
  318. Cython/Utility/TypeConversion.c +1556 -0
  319. Cython/Utility/UFuncs.pyx +50 -0
  320. Cython/Utility/UFuncs_C.c +89 -0
  321. Cython/Utility/__init__.py +28 -0
  322. Cython/Utility/arrayarray.h +172 -0
  323. Cython/Utils.cp315-win_amd64.pyd +0 -0
  324. Cython/Utils.py +677 -0
  325. Cython/__init__.py +12 -0
  326. Cython/py.typed +0 -0
  327. cython-3.3.0a1.dist-info/METADATA +394 -0
  328. cython-3.3.0a1.dist-info/RECORD +335 -0
  329. cython-3.3.0a1.dist-info/WHEEL +5 -0
  330. cython-3.3.0a1.dist-info/entry_points.txt +4 -0
  331. cython-3.3.0a1.dist-info/top_level.txt +3 -0
  332. cython.py +29 -0
  333. pyximport/__init__.py +4 -0
  334. pyximport/pyxbuild.py +160 -0
  335. pyximport/pyximport.py +482 -0
@@ -0,0 +1,133 @@
1
+ import contextlib
2
+ import os
3
+ import tempfile
4
+ from os.path import join as pjoin
5
+
6
+ from ..Dependencies import extended_iglob
7
+ from ...TestUtils import TimedTest
8
+
9
+
10
+ @contextlib.contextmanager
11
+ def writable_file(dir_path, filename):
12
+ with open(pjoin(dir_path, filename), "w", encoding="utf8") as f:
13
+ yield f
14
+
15
+
16
+ class TestGlobbing(TimedTest):
17
+ @classmethod
18
+ def setUpClass(cls):
19
+ cls._orig_dir = os.getcwd()
20
+ cls._tmpdir = tempfile.TemporaryDirectory()
21
+ temp_path = cls._tmpdir.name
22
+ os.chdir(temp_path)
23
+
24
+ for dir1 in "abcd":
25
+ for dir1x in [dir1, dir1 + 'x']:
26
+ for dir2 in "xyz":
27
+ dir_path = pjoin(dir1x, dir2)
28
+ os.makedirs(dir_path)
29
+ with writable_file(dir_path, "file2_pyx.pyx") as f:
30
+ f.write('""" PYX """')
31
+ with writable_file(dir_path, "file2_py.py") as f:
32
+ f.write('""" PY """')
33
+
34
+ with writable_file(dir1x, "file1_pyx.pyx") as f:
35
+ f.write('""" PYX """')
36
+ with writable_file(dir1x, "file1_py.py") as f:
37
+ f.write('""" PY """')
38
+
39
+ @classmethod
40
+ def tearDownClass(cls):
41
+ os.chdir(cls._orig_dir)
42
+ cls._tmpdir.cleanup()
43
+
44
+ def files_equal(self, pattern, expected_files):
45
+ expected_files = sorted(expected_files)
46
+ # It's the users's choice whether '/' will appear on Windows.
47
+ matched_files = sorted(path.replace('/', os.sep) for path in extended_iglob(pattern))
48
+ self.assertListEqual(matched_files, expected_files) # /
49
+
50
+ # Special case for Windows: also support '\' in patterns.
51
+ if os.sep == '\\' and '/' in pattern:
52
+ matched_files = sorted(extended_iglob(pattern.replace('/', '\\')))
53
+ self.assertListEqual(matched_files, expected_files) # \
54
+
55
+ def test_extended_iglob_simple(self):
56
+ ax_files = [pjoin("a", "x", "file2_pyx.pyx"), pjoin("a", "x", "file2_py.py")]
57
+ self.files_equal("a/x/*", ax_files)
58
+ self.files_equal("a/x/*.c12", [])
59
+ self.files_equal("a/x/*.{py,pyx,c12}", ax_files)
60
+ self.files_equal("a/x/*.{py,pyx}", ax_files)
61
+ self.files_equal("a/x/*.{pyx}", ax_files[:1])
62
+ self.files_equal("a/x/*.pyx", ax_files[:1])
63
+ self.files_equal("a/x/*.{py}", ax_files[1:])
64
+ self.files_equal("a/x/*.py", ax_files[1:])
65
+
66
+ def test_extended_iglob_simple_star(self):
67
+ for basedir in "ad":
68
+ files = [
69
+ pjoin(basedir, dirname, filename)
70
+ for dirname in "xyz"
71
+ for filename in ["file2_pyx.pyx", "file2_py.py"]
72
+ ]
73
+ self.files_equal(basedir + "/*/*", files)
74
+ self.files_equal(basedir + "/*/*.c12", [])
75
+ self.files_equal(basedir + "/*/*.{py,pyx,c12}", files)
76
+ self.files_equal(basedir + "/*/*.{py,pyx}", files)
77
+ self.files_equal(basedir + "/*/*.{pyx}", files[::2])
78
+ self.files_equal(basedir + "/*/*.pyx", files[::2])
79
+ self.files_equal(basedir + "/*/*.{py}", files[1::2])
80
+ self.files_equal(basedir + "/*/*.py", files[1::2])
81
+
82
+ for subdir in "xy*":
83
+ files = [
84
+ pjoin(basedir, dirname, filename)
85
+ for dirname in "xyz"
86
+ if subdir in ('*', dirname)
87
+ for filename in ["file2_pyx.pyx", "file2_py.py"]
88
+ ]
89
+ path = basedir + '/' + subdir + '/'
90
+ self.files_equal(path + "*", files)
91
+ self.files_equal(path + "*.{py,pyx}", files)
92
+ self.files_equal(path + "*.{pyx}", files[::2])
93
+ self.files_equal(path + "*.pyx", files[::2])
94
+ self.files_equal(path + "*.{py}", files[1::2])
95
+ self.files_equal(path + "*.py", files[1::2])
96
+
97
+ def test_extended_iglob_double_star(self):
98
+ basedirs = os.listdir(".")
99
+ files = [
100
+ pjoin(basedir, dirname, filename)
101
+ for basedir in basedirs
102
+ for dirname in "xyz"
103
+ for filename in ["file2_pyx.pyx", "file2_py.py"]
104
+ ]
105
+ all_files = [
106
+ pjoin(basedir, filename)
107
+ for basedir in basedirs
108
+ for filename in ["file1_pyx.pyx", "file1_py.py"]
109
+ ] + files
110
+ self.files_equal("*/*/*", files)
111
+ self.files_equal("*/*/**/*", files)
112
+ self.files_equal("*/**/*.*", all_files)
113
+ self.files_equal("**/*.*", all_files)
114
+ self.files_equal("*/**/*.c12", [])
115
+ self.files_equal("**/*.c12", [])
116
+ self.files_equal("*/*/*.{py,pyx,c12}", files)
117
+ self.files_equal("*/*/**/*.{py,pyx,c12}", files)
118
+ self.files_equal("*/**/*/*.{py,pyx,c12}", files)
119
+ self.files_equal("**/*/*/*.{py,pyx,c12}", files)
120
+ self.files_equal("**/*.{py,pyx,c12}", all_files)
121
+ self.files_equal("*/*/*.{py,pyx}", files)
122
+ self.files_equal("**/*/*/*.{py,pyx}", files)
123
+ self.files_equal("*/**/*/*.{py,pyx}", files)
124
+ self.files_equal("**/*.{py,pyx}", all_files)
125
+ self.files_equal("*/*/*.{pyx}", files[::2])
126
+ self.files_equal("**/*.{pyx}", all_files[::2])
127
+ self.files_equal("*/**/*/*.pyx", files[::2])
128
+ self.files_equal("*/*/*.pyx", files[::2])
129
+ self.files_equal("**/*.pyx", all_files[::2])
130
+ self.files_equal("*/*/*.{py}", files[1::2])
131
+ self.files_equal("**/*.{py}", all_files[1::2])
132
+ self.files_equal("*/*/*.py", files[1::2])
133
+ self.files_equal("**/*.py", all_files[1::2])
@@ -0,0 +1,177 @@
1
+ import os
2
+ import tempfile
3
+ import unittest
4
+ from Cython.Shadow import inline
5
+ from Cython.Build.Inline import safe_type, cymeit
6
+ from Cython.TestUtils import CythonTest, TimedTest
7
+
8
+ try:
9
+ import numpy
10
+ has_numpy = True
11
+ except:
12
+ has_numpy = False
13
+
14
+ test_kwds = dict(force=True, quiet=True)
15
+
16
+ global_value = 100
17
+
18
+ class TestInline(CythonTest):
19
+ def setUp(self):
20
+ self._call_kwds = dict(test_kwds)
21
+ if os.path.isdir('TEST_TMP'):
22
+ lib_dir = os.path.join('TEST_TMP','inline')
23
+ else:
24
+ lib_dir = tempfile.mkdtemp(prefix='cython_inline_')
25
+ self._call_kwds['lib_dir'] = lib_dir
26
+ super().setUp()
27
+
28
+ def test_simple(self):
29
+ self.assertEqual(inline("return 1+2", **self._call_kwds), 3)
30
+
31
+ def test_types(self):
32
+ self.assertEqual(inline("""
33
+ cimport cython
34
+ return cython.typeof(a), cython.typeof(b)
35
+ """, a=1.0, b=[], **self._call_kwds), ('double', 'list object'))
36
+
37
+ def test_locals(self):
38
+ a = 1
39
+ b = 2
40
+ self.assertEqual(inline("return a+b", **self._call_kwds), 3)
41
+
42
+ def test_globals(self):
43
+ self.assertEqual(inline("return global_value + 1", **self._call_kwds), global_value + 1)
44
+
45
+ def test_no_return(self):
46
+ self.assertEqual(inline("""
47
+ a = 1
48
+ cdef double b = 2
49
+ cdef c = []
50
+ """, **self._call_kwds), dict(a=1, b=2.0, c=[]))
51
+
52
+ def test_def_node(self):
53
+ foo = inline("def foo(x): return x * x", **self._call_kwds)['foo']
54
+ self.assertEqual(foo(7), 49)
55
+
56
+ def test_class_ref(self):
57
+ class Type:
58
+ pass
59
+ tp = inline("Type")['Type']
60
+ self.assertEqual(tp, Type)
61
+
62
+ def test_pure(self):
63
+ import cython as cy
64
+ b = inline("""
65
+ b = cy.declare(float, a)
66
+ c = cy.declare(cy.pointer(cy.float), &b)
67
+ return b
68
+ """, a=3, **self._call_kwds)
69
+ self.assertEqual(type(b), float)
70
+
71
+ def test_compiler_directives(self):
72
+ self.assertEqual(
73
+ inline('return sum(x)',
74
+ x=[1, 2, 3],
75
+ cython_compiler_directives={'boundscheck': False}),
76
+ 6
77
+ )
78
+
79
+ def test_lang_version(self):
80
+ # GH-3419. Caching for inline code didn't always respect compiler directives.
81
+ inline_divcode = "def f(int a, int b): return a/b"
82
+ self.assertEqual(
83
+ inline(inline_divcode, language_level=2)['f'](5,2),
84
+ 2
85
+ )
86
+ self.assertEqual(
87
+ inline(inline_divcode, language_level=3)['f'](5,2),
88
+ 2.5
89
+ )
90
+ self.assertEqual(
91
+ inline(inline_divcode, language_level=2)['f'](5,2),
92
+ 2
93
+ )
94
+
95
+ def test_repeated_use(self):
96
+ inline_mulcode = "def f(int a, int b): return a * b"
97
+ self.assertEqual(inline(inline_mulcode)['f'](5, 2), 10)
98
+ self.assertEqual(inline(inline_mulcode)['f'](5, 3), 15)
99
+ self.assertEqual(inline(inline_mulcode)['f'](6, 2), 12)
100
+ self.assertEqual(inline(inline_mulcode)['f'](5, 2), 10)
101
+
102
+ f = inline(inline_mulcode)['f']
103
+ self.assertEqual(f(5, 2), 10)
104
+ self.assertEqual(f(5, 3), 15)
105
+
106
+ @unittest.skipIf(not has_numpy, "NumPy is not available")
107
+ def test_numpy(self):
108
+ import numpy
109
+ a = numpy.ndarray((10, 20))
110
+ a[0,0] = 10
111
+ self.assertEqual(safe_type(a), 'numpy.ndarray[numpy.float64_t, ndim=2]')
112
+ self.assertEqual(inline("return a[0,0]", a=a, **self._call_kwds), 10.0)
113
+
114
+
115
+ class TestCymeit(TimedTest):
116
+ def _run(self, code, setup_code=None, **kwargs):
117
+ timings, number = cymeit(code, setup_code=setup_code, **kwargs)
118
+
119
+ self.assertGreater(min(timings), 0)
120
+
121
+ # Guard that autoscaling leads to reasonable timings.
122
+ # Note: we cannot compare against the expected 0.2 due to large timing variations on CI.
123
+ max_time = max(timing * number for timing in timings)
124
+ if isinstance(max_time, int):
125
+ self.assertGreaterEqual(max_time, 100_000)
126
+ else:
127
+ self.assertGreaterEqual(max_time, 0.0001)
128
+ self.assertGreater(number, 4) # arbitrary lower bound for our very quick benchmarks
129
+
130
+ return timings
131
+
132
+ def test_benchmark_simple(self):
133
+ setup_code = "numbers = list(range(0, 1000, 3))"
134
+ self._run("sum([num for num in numbers])", setup_code, repeat=3)
135
+
136
+ def test_benchmark_timer(self):
137
+ import time
138
+ setup_code = "numbers = list(range(0, 1000, 3))"
139
+ timings = self._run("sum([num for num in numbers])", setup_code, timer=time.perf_counter, repeat=3)
140
+
141
+ for timing in timings:
142
+ self.assertIsInstance(timing, float)
143
+
144
+ def test_benchmark_timer_ns(self):
145
+ import time
146
+ setup_code = "numbers = list(range(0, 1000, 3))"
147
+ timings = self._run("sum([num for num in numbers])", setup_code, timer=time.perf_counter_ns, repeat=3)
148
+
149
+ for timing in timings:
150
+ self.assertIsInstance(timing, int)
151
+
152
+ def test_benchmark_multiline_setup(self):
153
+ setup_code = """
154
+ numbers = list(range(0, 100, 3))
155
+
156
+ def csum(numbers):
157
+ result = 0
158
+ for number in numbers:
159
+ result += number
160
+ return result
161
+ """
162
+ self._run("csum(numbers)", setup_code)
163
+
164
+ def test_benchmark_multiline_code(self):
165
+ setup_code = "numbers = list(range(0, 100, 3))"
166
+ self._run("""
167
+ sum([
168
+ num
169
+ for num in numbers
170
+ ])
171
+ """,
172
+ setup_code,
173
+ repeat=3
174
+ )
175
+
176
+ def test_benchmark_in_module(self):
177
+ self._run("fsum(range(100))", import_module='math', repeat=2)
@@ -0,0 +1,303 @@
1
+ # tag: ipython
2
+
3
+ """Tests for the Cython magics extension."""
4
+
5
+
6
+ import builtins
7
+ import os
8
+ import io
9
+ import sys
10
+ from contextlib import contextmanager
11
+ from unittest import skipIf, SkipTest
12
+
13
+ from Cython.Build import IpythonMagic
14
+ from Cython.TestUtils import CythonTest
15
+ from Cython.Compiler.Annotate import AnnotationCCodeWriter
16
+
17
+
18
+ # not using IPython's decorators here because they depend on "nose"
19
+ skip_win32 = skipIf(sys.platform == 'win32', "Skip on Windows")
20
+
21
+
22
+ @contextmanager
23
+ def capture_output():
24
+ backup = sys.stdout, sys.stderr
25
+ try:
26
+ replacement = [
27
+ io.TextIOWrapper(io.BytesIO(), encoding=sys.stdout.encoding),
28
+ io.TextIOWrapper(io.BytesIO(), encoding=sys.stderr.encoding),
29
+ ]
30
+ sys.stdout, sys.stderr = replacement
31
+ output = []
32
+ yield output
33
+ finally:
34
+ sys.stdout, sys.stderr = backup
35
+ for wrapper in replacement:
36
+ wrapper.seek(0) # rewind
37
+ output.append(wrapper.read())
38
+ wrapper.close()
39
+
40
+
41
+ code = """\
42
+ def f(x):
43
+ return 2*x
44
+ """
45
+
46
+ cython3_code = """\
47
+ def f(int x):
48
+ return 2 / x
49
+
50
+ def call(x):
51
+ return f(*(x,))
52
+ """
53
+
54
+ pgo_cython3_code = cython3_code + """\
55
+ def main():
56
+ for _ in range(100): call(5)
57
+ main()
58
+ """
59
+
60
+ compile_error_code = '''\
61
+ cdef extern from *:
62
+ """
63
+ xxx a=1;
64
+ """
65
+ int a;
66
+ def doit():
67
+ return a
68
+ '''
69
+
70
+ compile_warning_code = '''\
71
+ cdef extern from *:
72
+ """
73
+ #pragma message ( "CWarning" )
74
+ int a = 42;
75
+ """
76
+ int a;
77
+ def doit():
78
+ return a
79
+ '''
80
+
81
+
82
+ class TestIPythonMagic(CythonTest):
83
+ _orig_builtins = None
84
+
85
+ @classmethod
86
+ def setUpClass(cls):
87
+ super().setUpClass()
88
+
89
+ # IPython modifies the builtins, so keep a clean copy before the import.
90
+ orig_builtins = dict(builtins.__dict__)
91
+
92
+ try:
93
+ import IPython.testing.globalipapp
94
+ except ImportError as exc:
95
+ # Disable tests and fake helpers for initialisation below.
96
+ raise SkipTest(f"IPython is not installed: {exc}")
97
+
98
+ try:
99
+ # disable IPython history thread before it gets started to avoid having to clean it up
100
+ from IPython.core.history import HistoryManager
101
+ HistoryManager.enabled = False
102
+ except ImportError:
103
+ pass
104
+
105
+ cls._orig_builtins = orig_builtins
106
+ cls._ip = IPython.testing.globalipapp.get_ipython()
107
+
108
+ @classmethod
109
+ def tearDownClass(cls):
110
+ # Clean up builtins from IPython left-overs.
111
+ if cls._orig_builtins:
112
+ for name in list(vars(builtins)):
113
+ if name not in cls._orig_builtins:
114
+ delattr(builtins, name)
115
+ for name, value in cls._orig_builtins.items():
116
+ if getattr(builtins, name, None) is not value:
117
+ setattr(builtins, name, value)
118
+
119
+ super().tearDownClass()
120
+
121
+ def setUp(self):
122
+ CythonTest.setUp(self)
123
+ self._ip.extension_manager.load_extension('cython')
124
+
125
+ def test_cython_inline(self):
126
+ ip = self._ip
127
+ ip.ex('a=10; b=20')
128
+ result = ip.run_cell_magic('cython_inline', '', 'return a+b')
129
+ self.assertEqual(result, 30)
130
+
131
+ @skip_win32
132
+ def test_cython_pyximport(self):
133
+ ip = self._ip
134
+ module_name = '_test_cython_pyximport'
135
+ ip.run_cell_magic('cython_pyximport', module_name, code)
136
+ ip.ex('g = f(10)')
137
+ self.assertEqual(ip.user_ns['g'], 20.0)
138
+ ip.run_cell_magic('cython_pyximport', module_name, code)
139
+ ip.ex('h = f(-10)')
140
+ self.assertEqual(ip.user_ns['h'], -20.0)
141
+ try:
142
+ os.remove(module_name + '.pyx')
143
+ except OSError:
144
+ pass
145
+
146
+ def test_cython(self):
147
+ ip = self._ip
148
+ ip.run_cell_magic('cython', '', code)
149
+ ip.ex('g = f(10)')
150
+ self.assertEqual(ip.user_ns['g'], 20.0)
151
+
152
+ def test_cython_name(self):
153
+ # The Cython module named 'mymodule' defines the function f.
154
+ ip = self._ip
155
+ ip.run_cell_magic('cython', '--name=mymodule', code)
156
+ # This module can now be imported in the interactive namespace.
157
+ ip.ex('import mymodule; g = mymodule.f(10)')
158
+ self.assertEqual(ip.user_ns['g'], 20.0)
159
+
160
+ def test_cython_language_level(self):
161
+ # The Cython cell defines the functions f() and call().
162
+ ip = self._ip
163
+ ip.run_cell_magic('cython', '', cython3_code)
164
+ ip.ex('g = f(10); h = call(10)')
165
+ self.assertEqual(ip.user_ns['g'], 2.0 / 10.0)
166
+ self.assertEqual(ip.user_ns['h'], 2.0 / 10.0)
167
+
168
+ def test_cython3(self):
169
+ # The Cython cell defines the functions f() and call().
170
+ ip = self._ip
171
+ ip.run_cell_magic('cython', '-3', cython3_code)
172
+ ip.ex('g = f(10); h = call(10)')
173
+ self.assertEqual(ip.user_ns['g'], 2.0 / 10.0)
174
+ self.assertEqual(ip.user_ns['h'], 2.0 / 10.0)
175
+
176
+ def test_cython2(self):
177
+ # The Cython cell defines the functions f() and call().
178
+ ip = self._ip
179
+ ip.run_cell_magic('cython', '-2', cython3_code)
180
+ ip.ex('g = f(10); h = call(10)')
181
+ self.assertEqual(ip.user_ns['g'], 2 // 10)
182
+ self.assertEqual(ip.user_ns['h'], 2 // 10)
183
+
184
+ def test_cython_compile_error_shown(self):
185
+ ip = self._ip
186
+ with capture_output() as out:
187
+ ip.run_cell_magic('cython', '-3', compile_error_code)
188
+ captured_out, captured_err = out
189
+
190
+ # it could be that c-level output is captured by distutil-extension
191
+ # (and not by us) and is printed to stdout:
192
+ captured_all = captured_out + "\n" + captured_err
193
+ self.assertTrue("error" in captured_all, msg="error in " + captured_all)
194
+
195
+ def test_cython_link_error_shown(self):
196
+ ip = self._ip
197
+ with capture_output() as out:
198
+ ip.run_cell_magic('cython', '-3 -l=xxxxxxxx', code)
199
+ captured_out, captured_err = out
200
+
201
+ # it could be that c-level output is captured by distutil-extension
202
+ # (and not by us) and is printed to stdout:
203
+ captured_all = captured_out + "\n!" + captured_err
204
+ self.assertTrue("error" in captured_all, msg="error in " + captured_all)
205
+
206
+ def test_cython_warning_shown(self):
207
+ ip = self._ip
208
+ with capture_output() as out:
209
+ # force rebuild, otherwise no warning as after the first success
210
+ # no build step is performed
211
+ ip.run_cell_magic('cython', '-3 -f', compile_warning_code)
212
+ captured_out, captured_err = out
213
+
214
+ # check that warning was printed to stdout even if build hasn't failed
215
+ self.assertTrue("CWarning" in captured_out)
216
+
217
+ @skip_win32
218
+ def test_cython3_pgo(self):
219
+ # The Cython cell defines the functions f() and call().
220
+ ip = self._ip
221
+ ip.run_cell_magic('cython', '-3 --pgo', pgo_cython3_code)
222
+ ip.ex('g = f(10); h = call(10); main()')
223
+ self.assertEqual(ip.user_ns['g'], 2.0 / 10.0)
224
+ self.assertEqual(ip.user_ns['h'], 2.0 / 10.0)
225
+
226
+ @skip_win32
227
+ def test_extlibs(self):
228
+ ip = self._ip
229
+ code = """
230
+ from libc.math cimport sin
231
+ x = sin(0.0)
232
+ """
233
+ ip.user_ns['x'] = 1
234
+ ip.run_cell_magic('cython', '-l m', code)
235
+ self.assertEqual(ip.user_ns['x'], 0)
236
+
237
+
238
+ def test_cython_verbose(self):
239
+ ip = self._ip
240
+ ip.run_cell_magic('cython', '--verbose', code)
241
+ ip.ex('g = f(10)')
242
+ self.assertEqual(ip.user_ns['g'], 20.0)
243
+
244
+ def test_cython_verbose_thresholds(self):
245
+ @contextmanager
246
+ def mock_distutils():
247
+ class MockLog:
248
+ DEBUG = 1
249
+ INFO = 2
250
+ thresholds = [INFO]
251
+
252
+ def set_threshold(self, val):
253
+ self.thresholds.append(val)
254
+ return self.thresholds[-2]
255
+
256
+
257
+ new_log = MockLog()
258
+ old_log = IpythonMagic.distutils.log
259
+ try:
260
+ IpythonMagic.distutils.log = new_log
261
+ yield new_log
262
+ finally:
263
+ IpythonMagic.distutils.log = old_log
264
+
265
+ ip = self._ip
266
+ with mock_distutils() as verbose_log:
267
+ ip.run_cell_magic('cython', '--verbose', code)
268
+ ip.ex('g = f(10)')
269
+ self.assertEqual(ip.user_ns['g'], 20.0)
270
+ self.assertEqual([verbose_log.INFO, verbose_log.DEBUG, verbose_log.INFO],
271
+ verbose_log.thresholds)
272
+
273
+ with mock_distutils() as normal_log:
274
+ ip.run_cell_magic('cython', '', code)
275
+ ip.ex('g = f(10)')
276
+ self.assertEqual(ip.user_ns['g'], 20.0)
277
+ self.assertEqual([normal_log.INFO], normal_log.thresholds)
278
+
279
+ def test_cython_no_annotate(self):
280
+ ip = self._ip
281
+ html = ip.run_cell_magic('cython', '', code)
282
+ self.assertTrue(html is None)
283
+
284
+ def test_cython_annotate(self):
285
+ ip = self._ip
286
+ html = ip.run_cell_magic('cython', '--annotate', code)
287
+ # somewhat brittle way to differentiate between annotated htmls
288
+ # with/without complete source code:
289
+ self.assertTrue(AnnotationCCodeWriter.COMPLETE_CODE_TITLE not in html.data)
290
+
291
+ def test_cython_annotate_default(self):
292
+ ip = self._ip
293
+ html = ip.run_cell_magic('cython', '-a', code)
294
+ # somewhat brittle way to differentiate between annotated htmls
295
+ # with/without complete source code:
296
+ self.assertTrue(AnnotationCCodeWriter.COMPLETE_CODE_TITLE not in html.data)
297
+
298
+ def test_cython_annotate_complete_c_code(self):
299
+ ip = self._ip
300
+ html = ip.run_cell_magic('cython', '--annotate-fullc', code)
301
+ # somewhat brittle way to differentiate between annotated htmls
302
+ # with/without complete source code:
303
+ self.assertTrue(AnnotationCCodeWriter.COMPLETE_CODE_TITLE in html.data)