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,212 @@
1
+ import shutil
2
+ import os
3
+ import tempfile
4
+ import time
5
+
6
+ import Cython.Build.Dependencies
7
+ import Cython.Utils
8
+ from Cython.TestUtils import CythonTest
9
+
10
+
11
+ def fresh_cythonize(*args, **kwargs):
12
+ Cython.Utils.clear_function_caches()
13
+ Cython.Build.Dependencies._dep_tree = None # discard method caches
14
+ Cython.Build.Dependencies.cythonize(*args, **kwargs)
15
+
16
+ class TestRecythonize(CythonTest):
17
+
18
+ def setUp(self):
19
+ CythonTest.setUp(self)
20
+ self.temp_dir = (
21
+ tempfile.mkdtemp(
22
+ prefix='recythonize-test',
23
+ dir='TEST_TMP' if os.path.isdir('TEST_TMP') else None
24
+ )
25
+ )
26
+
27
+ def tearDown(self):
28
+ CythonTest.tearDown(self)
29
+ shutil.rmtree(self.temp_dir)
30
+
31
+ def test_recythonize_pyx_on_pxd_change(self):
32
+
33
+ src_dir = tempfile.mkdtemp(prefix='src', dir=self.temp_dir)
34
+
35
+ a_pxd = os.path.join(src_dir, 'a.pxd')
36
+ a_pyx = os.path.join(src_dir, 'a.pyx')
37
+ a_c = os.path.join(src_dir, 'a.c')
38
+ dep_tree = Cython.Build.Dependencies.create_dependency_tree()
39
+
40
+ with open(a_pxd, 'w') as f:
41
+ f.write('cdef int value\n')
42
+
43
+ with open(a_pyx, 'w') as f:
44
+ f.write('value = 1\n')
45
+
46
+
47
+ # The dependencies for "a.pyx" are "a.pxd" and "a.pyx".
48
+ self.assertEqual({a_pxd, a_pyx}, dep_tree.all_dependencies(a_pyx))
49
+
50
+ # Cythonize to create a.c
51
+ fresh_cythonize(a_pyx)
52
+
53
+ # Sleep to address coarse time-stamp precision.
54
+ time.sleep(1)
55
+
56
+ with open(a_c) as f:
57
+ a_c_contents1 = f.read()
58
+
59
+ with open(a_pxd, 'w') as f:
60
+ f.write('cdef double value\n')
61
+
62
+ fresh_cythonize(a_pyx)
63
+
64
+ with open(a_c) as f:
65
+ a_c_contents2 = f.read()
66
+
67
+ self.assertTrue("__pyx_v_1a_value = 1;" in a_c_contents1)
68
+ self.assertFalse("__pyx_v_1a_value = 1;" in a_c_contents2)
69
+ self.assertTrue("__pyx_v_1a_value = 1.0;" in a_c_contents2)
70
+ self.assertFalse("__pyx_v_1a_value = 1.0;" in a_c_contents1)
71
+
72
+
73
+ def test_recythonize_py_on_pxd_change(self):
74
+
75
+ src_dir = tempfile.mkdtemp(prefix='src', dir=self.temp_dir)
76
+
77
+ a_pxd = os.path.join(src_dir, 'a.pxd')
78
+ a_py = os.path.join(src_dir, 'a.py')
79
+ a_c = os.path.join(src_dir, 'a.c')
80
+ dep_tree = Cython.Build.Dependencies.create_dependency_tree()
81
+
82
+ with open(a_pxd, 'w') as f:
83
+ f.write('cdef int value\n')
84
+
85
+ with open(a_py, 'w') as f:
86
+ f.write('value = 1\n')
87
+
88
+
89
+ # The dependencies for "a.py" are "a.pxd" and "a.py".
90
+ self.assertEqual({a_pxd, a_py}, dep_tree.all_dependencies(a_py))
91
+
92
+ # Cythonize to create a.c
93
+ fresh_cythonize(a_py)
94
+
95
+ # Sleep to address coarse time-stamp precision.
96
+ time.sleep(1)
97
+
98
+ with open(a_c) as f:
99
+ a_c_contents1 = f.read()
100
+
101
+ with open(a_pxd, 'w') as f:
102
+ f.write('cdef double value\n')
103
+
104
+ fresh_cythonize(a_py)
105
+
106
+ with open(a_c) as f:
107
+ a_c_contents2 = f.read()
108
+
109
+
110
+ self.assertTrue("__pyx_v_1a_value = 1;" in a_c_contents1)
111
+ self.assertFalse("__pyx_v_1a_value = 1;" in a_c_contents2)
112
+ self.assertTrue("__pyx_v_1a_value = 1.0;" in a_c_contents2)
113
+ self.assertFalse("__pyx_v_1a_value = 1.0;" in a_c_contents1)
114
+
115
+ def test_recythonize_pyx_on_dep_pxd_change(self):
116
+ src_dir = tempfile.mkdtemp(prefix='src', dir=self.temp_dir)
117
+
118
+ a_pxd = os.path.join(src_dir, 'a.pxd')
119
+ a_pyx = os.path.join(src_dir, 'a.pyx')
120
+ b_pyx = os.path.join(src_dir, 'b.pyx')
121
+ b_c = os.path.join(src_dir, 'b.c')
122
+ dep_tree = Cython.Build.Dependencies.create_dependency_tree()
123
+
124
+ with open(a_pxd, 'w') as f:
125
+ f.write('cdef int value\n')
126
+
127
+ with open(a_pyx, 'w') as f:
128
+ f.write('value = 1\n')
129
+
130
+ with open(b_pyx, 'w') as f:
131
+ f.write('cimport a\n' + 'a.value = 2\n')
132
+
133
+
134
+ # The dependencies for "b.pyx" are "a.pxd" and "b.pyx".
135
+ self.assertEqual({a_pxd, b_pyx}, dep_tree.all_dependencies(b_pyx))
136
+
137
+
138
+ # Cythonize to create b.c
139
+ fresh_cythonize([a_pyx, b_pyx])
140
+
141
+ # Sleep to address coarse time-stamp precision.
142
+ time.sleep(1)
143
+
144
+ with open(b_c) as f:
145
+ b_c_contents1 = f.read()
146
+
147
+ with open(a_pxd, 'w') as f:
148
+ f.write('cdef double value\n')
149
+
150
+ fresh_cythonize([a_pyx, b_pyx])
151
+
152
+ with open(b_c) as f:
153
+ b_c_contents2 = f.read()
154
+
155
+
156
+
157
+ self.assertTrue("__pyx_v_1a_value = 2;" in b_c_contents1)
158
+ self.assertFalse("__pyx_v_1a_value = 2;" in b_c_contents2)
159
+ self.assertTrue("__pyx_v_1a_value = 2.0;" in b_c_contents2)
160
+ self.assertFalse("__pyx_v_1a_value = 2.0;" in b_c_contents1)
161
+
162
+
163
+
164
+ def test_recythonize_py_on_dep_pxd_change(self):
165
+
166
+ src_dir = tempfile.mkdtemp(prefix='src', dir=self.temp_dir)
167
+
168
+ a_pxd = os.path.join(src_dir, 'a.pxd')
169
+ a_pyx = os.path.join(src_dir, 'a.pyx')
170
+ b_pxd = os.path.join(src_dir, 'b.pxd')
171
+ b_py = os.path.join(src_dir, 'b.py')
172
+ b_c = os.path.join(src_dir, 'b.c')
173
+ dep_tree = Cython.Build.Dependencies.create_dependency_tree()
174
+
175
+ with open(a_pxd, 'w') as f:
176
+ f.write('cdef int value\n')
177
+
178
+ with open(a_pyx, 'w') as f:
179
+ f.write('value = 1\n')
180
+
181
+ with open(b_pxd, 'w') as f:
182
+ f.write('cimport a\n')
183
+
184
+ with open(b_py, 'w') as f:
185
+ f.write('a.value = 2\n')
186
+
187
+
188
+ # The dependencies for b.py are "a.pxd", "b.pxd" and "b.py".
189
+ self.assertEqual({a_pxd, b_pxd, b_py}, dep_tree.all_dependencies(b_py))
190
+
191
+
192
+ # Cythonize to create b.c
193
+ fresh_cythonize([a_pyx, b_py])
194
+
195
+ # Sleep to address coarse time-stamp precision.
196
+ time.sleep(1)
197
+
198
+ with open(b_c) as f:
199
+ b_c_contents1 = f.read()
200
+
201
+ with open(a_pxd, 'w') as f:
202
+ f.write('cdef double value\n')
203
+
204
+ fresh_cythonize([a_pyx, b_py])
205
+
206
+ with open(b_c) as f:
207
+ b_c_contents2 = f.read()
208
+
209
+ self.assertTrue("__pyx_v_1a_value = 2;" in b_c_contents1)
210
+ self.assertFalse("__pyx_v_1a_value = 2;" in b_c_contents2)
211
+ self.assertTrue("__pyx_v_1a_value = 2.0;" in b_c_contents2)
212
+ self.assertFalse("__pyx_v_1a_value = 2.0;" in b_c_contents1)
@@ -0,0 +1,155 @@
1
+ import pathlib
2
+ import re
3
+
4
+ from ...TestUtils import TimedTest
5
+ from ...Utils import open_source_file
6
+ from ..Dependencies import strip_string_literals
7
+
8
+
9
+ class TestStripLiterals(TimedTest):
10
+ maxDiff = None
11
+
12
+ @staticmethod
13
+ def _rebuild_string(stripped, literals):
14
+ def lookup(match):
15
+ return literals[match.group()]
16
+
17
+ return re.sub("__Pyx_L[0-9]+_", lookup, stripped)
18
+
19
+ def test_strip_string_literals(self):
20
+ def strip_equals(s, expected):
21
+ stripped, literals = strip_string_literals(s)
22
+ self.assertEqual(expected, stripped)
23
+
24
+ recovered = self._rebuild_string(stripped, literals)
25
+ self.assertEqual(s, recovered)
26
+
27
+ unchanged = [
28
+ "",
29
+ """abc""",
30
+ """123""",
31
+ """func(123)""",
32
+ """ '' """,
33
+ """ '''''''''''' """,
34
+ """ '''''''''''''' """,
35
+ ]
36
+
37
+ tests = [(code, code) for code in unchanged] + [
38
+ # strings and quotes
39
+ ('"x"',
40
+ '"__Pyx_L1_"'),
41
+ ("'x'",
42
+ "'__Pyx_L1_'"),
43
+ (""" '"' "'" """,
44
+ """ '__Pyx_L1_' "__Pyx_L2_" """),
45
+ (""" '''' ''' """,
46
+ """ '''__Pyx_L1_''' """),
47
+ (''' """" """ ''',
48
+ ''' """__Pyx_L1_""" '''),
49
+ (" '''a\n''' ",
50
+ " '''__Pyx_L1_''' "),
51
+
52
+ # escapes
53
+ (r"'a\'b'",
54
+ "'__Pyx_L1_'"),
55
+ (r"'a\\'",
56
+ "'__Pyx_L1_'"),
57
+ (r"'a\\\'b'",
58
+ "'__Pyx_L1_'"),
59
+
60
+ # string prefixes
61
+ ("u'abc'",
62
+ "u'__Pyx_L1_'"),
63
+ (r"r'abc\\'",
64
+ "r'__Pyx_L1_'"),
65
+ (r"ru'abc\\'",
66
+ "ru'__Pyx_L1_'"),
67
+
68
+ # comments
69
+ ("abc # foo",
70
+ "abc #__Pyx_L1_"),
71
+ ("abc # 'x'",
72
+ "abc #__Pyx_L1_"),
73
+ ("'abc#'",
74
+ "'__Pyx_L1_'"),
75
+
76
+ # special commands
77
+ ("include 'a.pxi' # something here",
78
+ "include '__Pyx_L1_' #__Pyx_L2_"),
79
+ ("cdef extern from 'a.h': # comment",
80
+ "cdef extern from '__Pyx_L1_': #__Pyx_L2_"),
81
+
82
+ # mixed strings
83
+ (""" func('xyz') + " " + "" '' # '' | "" "123" 'xyz' "' """,
84
+ """ func('__Pyx_L1_') + "__Pyx_L2_" + "" '' #__Pyx_L3_"""),
85
+
86
+ (""" f'f' """,
87
+ """ f'__Pyx_L1_' """),
88
+
89
+ (""" f'a{123}b' """,
90
+ """ f'__Pyx_L1_{123}__Pyx_L2_' """),
91
+
92
+ (""" f'{1}{f'xyz'}' """,
93
+ """ f'{1}{f'__Pyx_L1_'}' """),
94
+
95
+ (""" f'{f'''xyz{f\"""abc\"""}'''}' """,
96
+ """ f'{f'''__Pyx_L1_{f\"""__Pyx_L2_\"""}'''}' """),
97
+
98
+ (""" f'{{{{{"abc"}}}}}{{}}{{' == '{{abc}}{}{' """,
99
+ """ f'__Pyx_L1_{"__Pyx_L2_"}__Pyx_L3_' == '__Pyx_L4_' """),
100
+
101
+ ("f'" + ('{x} ' * 250) + "{x:{width}} '",
102
+ "f'" + ''.join([f'{{x}}__Pyx_L{n}_' for n in range(1, 251)]) + "{x:{width}}__Pyx_L251_'")
103
+ ]
104
+
105
+ for code, expected in tests:
106
+ with self.subTest(code=code):
107
+ strip_equals(code, expected) # plain
108
+ code = code.strip()
109
+ expected = expected.strip()
110
+ with self.subTest(code=code):
111
+ strip_equals(code, expected) # stripped
112
+ code += "\n"
113
+ expected += "\n"
114
+ with self.subTest(code=code):
115
+ strip_equals(code, expected) # +EOL
116
+
117
+ # GH-5977: unclosed string literal
118
+ strip_equals(
119
+ """ print("Say something: %s' % something) """,
120
+ """ print("__Pyx_L1_"""
121
+ )
122
+
123
+ def _test_all_files(self, base_dir, file_paths):
124
+ _find_leftover_string = re.compile(r"""[^_'"}](['"]+)[^_'"{]""").search
125
+ for file_path in sorted(file_paths):
126
+ with self.subTest(file=str(file_path.relative_to(base_dir))):
127
+ with open_source_file(str(file_path)) as f:
128
+ code = f.read()
129
+ stripped, literals = strip_string_literals(code)
130
+
131
+ match = _find_leftover_string(stripped)
132
+ if match and len(match.group(1)) != 2:
133
+ match_pos = match.start() + 1
134
+ self.fail(f"Leftover string found: {stripped[match_pos - 12 : match_pos + 12]!r}")
135
+
136
+ recovered = self._rebuild_string(stripped, literals)
137
+ self.assertEqual(code, recovered)
138
+
139
+ def test_strip_string_literals_py_files(self):
140
+ # process all .py files in the Cython package
141
+ package_dir = pathlib.Path(__file__).absolute().parents[2]
142
+ assert package_dir.name == 'Cython'
143
+ base_dir = package_dir.parent
144
+ self._test_all_files(base_dir, package_dir.rglob("*.py"))
145
+
146
+ def test_strip_string_literals_test_files(self):
147
+ # process all .py[x] files in the tests package
148
+ base_dir = pathlib.Path(__file__).absolute().parents[3]
149
+ tests_dir = base_dir / 'tests'
150
+ test_files = []
151
+ for test_subdir in tests_dir.iterdir():
152
+ if test_subdir.is_dir() and test_subdir.name != 'errors':
153
+ test_files.extend(test_subdir.rglob("*.py"))
154
+ test_files.extend(test_subdir.rglob("*.pyx"))
155
+ self._test_all_files(base_dir, test_files)
@@ -0,0 +1 @@
1
+ # empty file
@@ -0,0 +1,11 @@
1
+ from .Dependencies import cythonize
2
+
3
+ __all__ = ["cythonize"]
4
+
5
+
6
+ def __getattr__(name):
7
+ if name == 'build_ext':
8
+ # Lazy import, fails if distutils is not available (in Python 3.12+).
9
+ from .Distutils import build_ext
10
+ return build_ext
11
+ raise AttributeError("module '%s' has no attribute '%s'" % (__name__, name))