Cython 3.2.0__cp39-abi3-win32.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 (333) hide show
  1. Cython/Build/BuildExecutable.py +169 -0
  2. Cython/Build/Cache.py +199 -0
  3. Cython/Build/Cythonize.py +350 -0
  4. Cython/Build/Dependencies.py +1314 -0
  5. Cython/Build/Distutils.py +1 -0
  6. Cython/Build/Inline.py +463 -0
  7. Cython/Build/IpythonMagic.py +560 -0
  8. Cython/Build/SharedModule.py +94 -0
  9. Cython/Build/Tests/TestCyCache.py +194 -0
  10. Cython/Build/Tests/TestCythonizeArgsParser.py +481 -0
  11. Cython/Build/Tests/TestDependencies.py +133 -0
  12. Cython/Build/Tests/TestInline.py +177 -0
  13. Cython/Build/Tests/TestIpythonMagic.py +287 -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 +984 -0
  24. Cython/Compiler/CmdLine.py +263 -0
  25. Cython/Compiler/Code.pxd +149 -0
  26. Cython/Compiler/Code.py +3746 -0
  27. Cython/Compiler/Code.pyd +0 -0
  28. Cython/Compiler/CodeGeneration.py +33 -0
  29. Cython/Compiler/CythonScope.py +191 -0
  30. Cython/Compiler/Dataclass.py +864 -0
  31. Cython/Compiler/DebugFlags.py +24 -0
  32. Cython/Compiler/Errors.py +297 -0
  33. Cython/Compiler/ExprNodes.py +15562 -0
  34. Cython/Compiler/FlowControl.pxd +97 -0
  35. Cython/Compiler/FlowControl.py +1451 -0
  36. Cython/Compiler/FlowControl.pyd +0 -0
  37. Cython/Compiler/FusedNode.py +971 -0
  38. Cython/Compiler/FusedNode.pyd +0 -0
  39. Cython/Compiler/Future.py +16 -0
  40. Cython/Compiler/Interpreter.py +57 -0
  41. Cython/Compiler/Lexicon.py +421 -0
  42. Cython/Compiler/LineTable.py +114 -0
  43. Cython/Compiler/LineTable.pyd +0 -0
  44. Cython/Compiler/Main.py +857 -0
  45. Cython/Compiler/MatchCaseNodes.py +259 -0
  46. Cython/Compiler/MemoryView.py +905 -0
  47. Cython/Compiler/ModuleNode.py +4235 -0
  48. Cython/Compiler/Naming.py +363 -0
  49. Cython/Compiler/Nodes.py +10831 -0
  50. Cython/Compiler/Optimize.py +5288 -0
  51. Cython/Compiler/Options.py +843 -0
  52. Cython/Compiler/ParseTreeTransforms.pxd +78 -0
  53. Cython/Compiler/ParseTreeTransforms.py +4638 -0
  54. Cython/Compiler/Parsing.pxd +9 -0
  55. Cython/Compiler/Parsing.py +4775 -0
  56. Cython/Compiler/Parsing.pyd +0 -0
  57. Cython/Compiler/Pipeline.py +439 -0
  58. Cython/Compiler/PyrexTypes.py +5870 -0
  59. Cython/Compiler/Pythran.py +232 -0
  60. Cython/Compiler/Scanning.pxd +48 -0
  61. Cython/Compiler/Scanning.py +701 -0
  62. Cython/Compiler/Scanning.pyd +0 -0
  63. Cython/Compiler/StringEncoding.py +298 -0
  64. Cython/Compiler/Symtab.py +3073 -0
  65. Cython/Compiler/Tests/TestBuffer.py +105 -0
  66. Cython/Compiler/Tests/TestBuiltin.py +72 -0
  67. Cython/Compiler/Tests/TestCmdLine.py +586 -0
  68. Cython/Compiler/Tests/TestCode.py +144 -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 +134 -0
  74. Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
  75. Cython/Compiler/Tests/TestStringEncoding.py +21 -0
  76. Cython/Compiler/Tests/TestTreeFragment.py +63 -0
  77. Cython/Compiler/Tests/TestTreePath.py +103 -0
  78. Cython/Compiler/Tests/TestTypes.py +75 -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 +591 -0
  86. Cython/Compiler/TypeSlots.py +1174 -0
  87. Cython/Compiler/UFuncs.py +311 -0
  88. Cython/Compiler/UtilNodes.py +389 -0
  89. Cython/Compiler/UtilityCode.py +344 -0
  90. Cython/Compiler/Version.py +8 -0
  91. Cython/Compiler/Visitor.pxd +53 -0
  92. Cython/Compiler/Visitor.py +861 -0
  93. Cython/Compiler/Visitor.pyd +0 -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 +275 -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 +578 -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 +178 -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 +187 -0
  127. Cython/Includes/cpython/exc.pxd +263 -0
  128. Cython/Includes/cpython/fileobject.pxd +57 -0
  129. Cython/Includes/cpython/float.pxd +47 -0
  130. Cython/Includes/cpython/function.pxd +65 -0
  131. Cython/Includes/cpython/genobject.pxd +25 -0
  132. Cython/Includes/cpython/getargs.pxd +12 -0
  133. Cython/Includes/cpython/instance.pxd +25 -0
  134. Cython/Includes/cpython/iterator.pxd +36 -0
  135. Cython/Includes/cpython/iterobject.pxd +24 -0
  136. Cython/Includes/cpython/list.pxd +92 -0
  137. Cython/Includes/cpython/long.pxd +149 -0
  138. Cython/Includes/cpython/longintrepr.pxd +14 -0
  139. Cython/Includes/cpython/mapping.pxd +63 -0
  140. Cython/Includes/cpython/marshal.pxd +66 -0
  141. Cython/Includes/cpython/mem.pxd +120 -0
  142. Cython/Includes/cpython/memoryview.pxd +50 -0
  143. Cython/Includes/cpython/method.pxd +49 -0
  144. Cython/Includes/cpython/module.pxd +208 -0
  145. Cython/Includes/cpython/number.pxd +258 -0
  146. Cython/Includes/cpython/object.pxd +433 -0
  147. Cython/Includes/cpython/pycapsule.pxd +143 -0
  148. Cython/Includes/cpython/pylifecycle.pxd +68 -0
  149. Cython/Includes/cpython/pyport.pxd +8 -0
  150. Cython/Includes/cpython/pystate.pxd +95 -0
  151. Cython/Includes/cpython/pythread.pxd +53 -0
  152. Cython/Includes/cpython/ref.pxd +141 -0
  153. Cython/Includes/cpython/sequence.pxd +134 -0
  154. Cython/Includes/cpython/set.pxd +119 -0
  155. Cython/Includes/cpython/slice.pxd +70 -0
  156. Cython/Includes/cpython/time.pxd +129 -0
  157. Cython/Includes/cpython/tuple.pxd +72 -0
  158. Cython/Includes/cpython/type.pxd +53 -0
  159. Cython/Includes/cpython/unicode.pxd +639 -0
  160. Cython/Includes/cpython/version.pxd +32 -0
  161. Cython/Includes/cpython/weakref.pxd +78 -0
  162. Cython/Includes/libc/__init__.pxd +1 -0
  163. Cython/Includes/libc/complex.pxd +35 -0
  164. Cython/Includes/libc/errno.pxd +127 -0
  165. Cython/Includes/libc/float.pxd +43 -0
  166. Cython/Includes/libc/limits.pxd +28 -0
  167. Cython/Includes/libc/locale.pxd +46 -0
  168. Cython/Includes/libc/math.pxd +209 -0
  169. Cython/Includes/libc/setjmp.pxd +10 -0
  170. Cython/Includes/libc/signal.pxd +64 -0
  171. Cython/Includes/libc/stddef.pxd +9 -0
  172. Cython/Includes/libc/stdint.pxd +105 -0
  173. Cython/Includes/libc/stdio.pxd +80 -0
  174. Cython/Includes/libc/stdlib.pxd +72 -0
  175. Cython/Includes/libc/string.pxd +50 -0
  176. Cython/Includes/libc/threads.pxd +234 -0
  177. Cython/Includes/libc/time.pxd +52 -0
  178. Cython/Includes/libcpp/__init__.pxd +4 -0
  179. Cython/Includes/libcpp/algorithm.pxd +320 -0
  180. Cython/Includes/libcpp/any.pxd +16 -0
  181. Cython/Includes/libcpp/atomic.pxd +59 -0
  182. Cython/Includes/libcpp/barrier.pxd +22 -0
  183. Cython/Includes/libcpp/bit.pxd +29 -0
  184. Cython/Includes/libcpp/cast.pxd +12 -0
  185. Cython/Includes/libcpp/cmath.pxd +518 -0
  186. Cython/Includes/libcpp/complex.pxd +106 -0
  187. Cython/Includes/libcpp/condition_variable.pxd +322 -0
  188. Cython/Includes/libcpp/deque.pxd +165 -0
  189. Cython/Includes/libcpp/exception.pxd +86 -0
  190. Cython/Includes/libcpp/execution.pxd +15 -0
  191. Cython/Includes/libcpp/forward_list.pxd +63 -0
  192. Cython/Includes/libcpp/functional.pxd +26 -0
  193. Cython/Includes/libcpp/future.pxd +103 -0
  194. Cython/Includes/libcpp/iterator.pxd +34 -0
  195. Cython/Includes/libcpp/latch.pxd +17 -0
  196. Cython/Includes/libcpp/limits.pxd +61 -0
  197. Cython/Includes/libcpp/list.pxd +117 -0
  198. Cython/Includes/libcpp/map.pxd +252 -0
  199. Cython/Includes/libcpp/memory.pxd +115 -0
  200. Cython/Includes/libcpp/mutex.pxd +387 -0
  201. Cython/Includes/libcpp/numbers.pxd +15 -0
  202. Cython/Includes/libcpp/numeric.pxd +131 -0
  203. Cython/Includes/libcpp/optional.pxd +34 -0
  204. Cython/Includes/libcpp/pair.pxd +1 -0
  205. Cython/Includes/libcpp/queue.pxd +25 -0
  206. Cython/Includes/libcpp/random.pxd +166 -0
  207. Cython/Includes/libcpp/semaphore.pxd +43 -0
  208. Cython/Includes/libcpp/set.pxd +228 -0
  209. Cython/Includes/libcpp/shared_mutex.pxd +96 -0
  210. Cython/Includes/libcpp/span.pxd +87 -0
  211. Cython/Includes/libcpp/stack.pxd +11 -0
  212. Cython/Includes/libcpp/stop_token.pxd +117 -0
  213. Cython/Includes/libcpp/string.pxd +355 -0
  214. Cython/Includes/libcpp/string_view.pxd +183 -0
  215. Cython/Includes/libcpp/typeindex.pxd +15 -0
  216. Cython/Includes/libcpp/typeinfo.pxd +10 -0
  217. Cython/Includes/libcpp/unordered_map.pxd +193 -0
  218. Cython/Includes/libcpp/unordered_set.pxd +152 -0
  219. Cython/Includes/libcpp/utility.pxd +30 -0
  220. Cython/Includes/libcpp/vector.pxd +186 -0
  221. Cython/Includes/numpy/math.pxd +150 -0
  222. Cython/Includes/openmp.pxd +50 -0
  223. Cython/Includes/posix/__init__.pxd +1 -0
  224. Cython/Includes/posix/dlfcn.pxd +14 -0
  225. Cython/Includes/posix/fcntl.pxd +86 -0
  226. Cython/Includes/posix/ioctl.pxd +4 -0
  227. Cython/Includes/posix/mman.pxd +101 -0
  228. Cython/Includes/posix/resource.pxd +57 -0
  229. Cython/Includes/posix/select.pxd +21 -0
  230. Cython/Includes/posix/signal.pxd +73 -0
  231. Cython/Includes/posix/stat.pxd +98 -0
  232. Cython/Includes/posix/stdio.pxd +37 -0
  233. Cython/Includes/posix/stdlib.pxd +29 -0
  234. Cython/Includes/posix/strings.pxd +9 -0
  235. Cython/Includes/posix/time.pxd +71 -0
  236. Cython/Includes/posix/types.pxd +30 -0
  237. Cython/Includes/posix/uio.pxd +26 -0
  238. Cython/Includes/posix/unistd.pxd +271 -0
  239. Cython/Includes/posix/wait.pxd +38 -0
  240. Cython/Plex/Actions.pxd +24 -0
  241. Cython/Plex/Actions.py +119 -0
  242. Cython/Plex/Actions.pyd +0 -0
  243. Cython/Plex/DFA.pxd +14 -0
  244. Cython/Plex/DFA.py +164 -0
  245. Cython/Plex/DFA.pyd +0 -0
  246. Cython/Plex/Errors.py +48 -0
  247. Cython/Plex/Lexicons.py +178 -0
  248. Cython/Plex/Machines.pxd +36 -0
  249. Cython/Plex/Machines.py +238 -0
  250. Cython/Plex/Machines.pyd +0 -0
  251. Cython/Plex/Regexps.py +535 -0
  252. Cython/Plex/Scanners.pxd +45 -0
  253. Cython/Plex/Scanners.py +328 -0
  254. Cython/Plex/Scanners.pyd +0 -0
  255. Cython/Plex/Transitions.pxd +14 -0
  256. Cython/Plex/Transitions.py +239 -0
  257. Cython/Plex/Transitions.pyd +0 -0
  258. Cython/Plex/__init__.py +34 -0
  259. Cython/Runtime/__init__.py +1 -0
  260. Cython/Runtime/refnanny.pyd +0 -0
  261. Cython/Runtime/refnanny.pyx +237 -0
  262. Cython/Shadow.py +690 -0
  263. Cython/Shadow.pyi +521 -0
  264. Cython/StringIOTree.py +170 -0
  265. Cython/StringIOTree.pyd +0 -0
  266. Cython/Tempita/__init__.py +4 -0
  267. Cython/Tempita/_looper.py +154 -0
  268. Cython/Tempita/_tempita.py +1091 -0
  269. Cython/Tempita/_tempita.pyd +0 -0
  270. Cython/TestUtils.py +422 -0
  271. Cython/Tests/TestCodeWriter.py +128 -0
  272. Cython/Tests/TestCythonUtils.py +202 -0
  273. Cython/Tests/TestJediTyper.py +223 -0
  274. Cython/Tests/TestShadow.py +114 -0
  275. Cython/Tests/TestStringIOTree.py +67 -0
  276. Cython/Tests/TestTestUtils.py +90 -0
  277. Cython/Tests/__init__.py +1 -0
  278. Cython/Tests/xmlrunner.py +390 -0
  279. Cython/Utility/AsyncGen.c +1031 -0
  280. Cython/Utility/Buffer.c +865 -0
  281. Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
  282. Cython/Utility/Builtins.c +810 -0
  283. Cython/Utility/CConvert.pyx +134 -0
  284. Cython/Utility/CMath.c +104 -0
  285. Cython/Utility/CommonStructures.c +226 -0
  286. Cython/Utility/Complex.c +378 -0
  287. Cython/Utility/Coroutine.c +2300 -0
  288. Cython/Utility/CpdefEnums.pyx +103 -0
  289. Cython/Utility/CppConvert.pyx +282 -0
  290. Cython/Utility/CppSupport.cpp +151 -0
  291. Cython/Utility/CythonFunction.c +1832 -0
  292. Cython/Utility/Dataclasses.c +101 -0
  293. Cython/Utility/Embed.c +121 -0
  294. Cython/Utility/Exceptions.c +1016 -0
  295. Cython/Utility/ExtensionTypes.c +996 -0
  296. Cython/Utility/FunctionArguments.c +1043 -0
  297. Cython/Utility/FusedFunction.pyx +44 -0
  298. Cython/Utility/ImportExport.c +907 -0
  299. Cython/Utility/MemoryView.pxd +188 -0
  300. Cython/Utility/MemoryView.pyx +1482 -0
  301. Cython/Utility/MemoryView_C.c +927 -0
  302. Cython/Utility/ModuleSetupCode.c +3203 -0
  303. Cython/Utility/NumpyImportArray.c +46 -0
  304. Cython/Utility/ObjectHandling.c +3273 -0
  305. Cython/Utility/Optimize.c +1603 -0
  306. Cython/Utility/Overflow.c +384 -0
  307. Cython/Utility/Printing.c +86 -0
  308. Cython/Utility/Profile.c +732 -0
  309. Cython/Utility/StringTools.c +1379 -0
  310. Cython/Utility/Synchronization.c +399 -0
  311. Cython/Utility/TString.c +356 -0
  312. Cython/Utility/TestCyUtilityLoader.pyx +8 -0
  313. Cython/Utility/TestCythonScope.pyx +75 -0
  314. Cython/Utility/TestUtilityLoader.c +12 -0
  315. Cython/Utility/TypeConversion.c +1385 -0
  316. Cython/Utility/UFuncs.pyx +50 -0
  317. Cython/Utility/UFuncs_C.c +89 -0
  318. Cython/Utility/__init__.py +28 -0
  319. Cython/Utility/arrayarray.h +167 -0
  320. Cython/Utils.py +687 -0
  321. Cython/Utils.pyd +0 -0
  322. Cython/__init__.py +10 -0
  323. Cython/__init__.pyi +7 -0
  324. Cython/py.typed +0 -0
  325. cython-3.2.0.dist-info/METADATA +85 -0
  326. cython-3.2.0.dist-info/RECORD +333 -0
  327. cython-3.2.0.dist-info/WHEEL +5 -0
  328. cython-3.2.0.dist-info/entry_points.txt +4 -0
  329. cython-3.2.0.dist-info/top_level.txt +3 -0
  330. cython.py +29 -0
  331. pyximport/__init__.py +4 -0
  332. pyximport/pyxbuild.py +160 -0
  333. pyximport/pyximport.py +482 -0
@@ -0,0 +1,144 @@
1
+ import textwrap
2
+ from unittest import TestCase
3
+
4
+ from .. import Naming
5
+ from ..Code import _indent_chunk, UtilityCode, process_utility_ccode
6
+
7
+ class TestIndent(TestCase):
8
+ def _test_indentations(self, chunk, expected):
9
+ for indentation in range(16):
10
+ expected_indented = textwrap.indent(expected, ' ' * indentation)
11
+ for line in expected_indented.splitlines():
12
+ # Validate before the comparison that empty lines got stripped also by textwrap.indent().
13
+ self.assertTrue(line == '' or line.strip(), repr(line))
14
+
15
+ with self.subTest(indentation=indentation):
16
+ result = _indent_chunk(chunk, indentation_length=indentation)
17
+ self.assertEqual(expected_indented, result)
18
+
19
+ def test_indent_empty(self):
20
+ self._test_indentations('', '')
21
+
22
+ def test_indent_empty_lines(self):
23
+ self._test_indentations('\n', '\n')
24
+ self._test_indentations('\n'*2, '\n'*2)
25
+ self._test_indentations('\n'*3, '\n'*3)
26
+ self._test_indentations(' \n'*2, '\n'*2)
27
+ self._test_indentations('\n \n \n \n', '\n'*4)
28
+
29
+ def test_indent_one_line(self):
30
+ self._test_indentations('abc', 'abc')
31
+
32
+ def test_indent_chunk(self):
33
+ chunk = """
34
+ x = 1
35
+ if x == 2:
36
+ print("False")
37
+ else:
38
+ print("True")
39
+ """
40
+ expected = """
41
+ x = 1
42
+ if x == 2:
43
+ print("False")
44
+ else:
45
+ print("True")
46
+ """
47
+ self._test_indentations(chunk, expected)
48
+
49
+ def test_indent_empty_line(self):
50
+ chunk = """
51
+ x = 1
52
+
53
+ if x == 2:
54
+ print("False")
55
+ else:
56
+ print("True")
57
+ """
58
+ expected = """
59
+ x = 1
60
+
61
+ if x == 2:
62
+ print("False")
63
+ else:
64
+ print("True")
65
+ """
66
+ self._test_indentations(chunk, expected)
67
+
68
+ def test_indent_empty_line_unclean(self):
69
+ lines = """
70
+ x = 1
71
+
72
+ if x == 2:
73
+ print("False")
74
+ else:
75
+ print("True")
76
+ """.splitlines(keepends=True)
77
+ lines[2] = ' \n'
78
+ chunk = ''.join(lines)
79
+ expected = """
80
+ x = 1
81
+
82
+ if x == 2:
83
+ print("False")
84
+ else:
85
+ print("True")
86
+ """
87
+ self._test_indentations(chunk, expected)
88
+
89
+
90
+ class TestUtilityCodeProcessing(TestCase):
91
+ def _process(self, code):
92
+ utility_code = UtilityCode()
93
+ formatted_code, is_module_specific = process_utility_ccode(utility_code, None, code)
94
+ self.assertFalse(is_module_specific) # cannot currently test this case
95
+ return formatted_code
96
+
97
+ def assert_formatted_code(self, code: str, expected: str, dedent=False):
98
+ if dedent:
99
+ expected = textwrap.dedent(expected)
100
+ expected = expected.strip() + '\n\n'
101
+ formatted = self._process(code)
102
+ self.assertEqual(formatted, expected)
103
+
104
+ def test_format_cstring(self):
105
+ self.assert_formatted_code('''
106
+ Some Text and a CSTRING("""
107
+ spanning "multiple" 'lines'.
108
+ Really.
109
+ """); # end of C string
110
+ ''',
111
+ expected=r'''
112
+ Some Text and a "\n"
113
+ " spanning \042multiple\042 'lines'.\n"
114
+ " Really.\n"
115
+ " \n"
116
+ ; # end of C string
117
+ ''',
118
+ dedent=True)
119
+
120
+ def test_cglobal(self):
121
+ self.assert_formatted_code("""
122
+ CGLOBAL(name)
123
+ NAMED_CGLOBAL(empty_tuple)
124
+ """,
125
+ expected=f"""
126
+ {Naming.modulestateglobal_cname}->name
127
+ {Naming.modulestateglobal_cname}->{Naming.empty_tuple}
128
+ """)
129
+
130
+ def test_empty_builtin(self):
131
+ self.assert_formatted_code("""
132
+ EMPTY(tuple)EMPTY(bytes)
133
+ EMPTY(tuple);EMPTY(bytes)
134
+ EMPTY(unicode)
135
+ EMPTY(bytes)
136
+ EMPTY(tuple)
137
+ """,
138
+ expected=f"""
139
+ {Naming.modulestateglobal_cname}->{Naming.empty_tuple}{Naming.modulestateglobal_cname}->{Naming.empty_bytes}
140
+ {Naming.modulestateglobal_cname}->{Naming.empty_tuple};{Naming.modulestateglobal_cname}->{Naming.empty_bytes}
141
+ {Naming.modulestateglobal_cname}->{Naming.empty_unicode}
142
+ {Naming.modulestateglobal_cname}->{Naming.empty_bytes}
143
+ {Naming.modulestateglobal_cname}->{Naming.empty_tuple}
144
+ """)
@@ -0,0 +1,65 @@
1
+ from copy import deepcopy
2
+ from unittest import TestCase
3
+
4
+ from Cython.Compiler.FlowControl import (
5
+ NameAssignment, StaticAssignment, Argument, NameDeletion)
6
+
7
+
8
+ class FakeType:
9
+ is_pyobject = True
10
+
11
+
12
+ class FakeNode:
13
+ pos = ('filename.pyx', 1, 2)
14
+ cf_state = None
15
+ type = FakeType()
16
+
17
+ def infer_type(self, scope):
18
+ return self.type
19
+
20
+
21
+ class FakeEntry:
22
+ type = FakeType()
23
+
24
+
25
+ class TestGraph(TestCase):
26
+ def test_deepcopy(self):
27
+ lhs, rhs = FakeNode(), FakeNode()
28
+ entry = FakeEntry()
29
+ entry.pos = lhs.pos
30
+
31
+ name_ass = NameAssignment(lhs, rhs, entry)
32
+ ass = deepcopy(name_ass)
33
+ self.assertTrue(ass.lhs)
34
+ self.assertTrue(ass.rhs)
35
+ self.assertTrue(ass.entry)
36
+ self.assertEqual(ass.pos, name_ass.pos)
37
+ self.assertFalse(ass.is_arg)
38
+ self.assertFalse(ass.is_deletion)
39
+
40
+ static_ass = StaticAssignment(entry)
41
+ ass = deepcopy(static_ass)
42
+ self.assertTrue(ass.lhs)
43
+ self.assertTrue(ass.rhs)
44
+ self.assertTrue(ass.entry)
45
+ self.assertEqual(ass.pos, static_ass.pos)
46
+ self.assertFalse(ass.is_arg)
47
+ self.assertFalse(ass.is_deletion)
48
+
49
+ arg_ass = Argument(lhs, rhs, entry)
50
+ ass = deepcopy(arg_ass)
51
+ self.assertTrue(ass.lhs)
52
+ self.assertTrue(ass.rhs)
53
+ self.assertTrue(ass.entry)
54
+ self.assertEqual(ass.pos, arg_ass.pos)
55
+ self.assertTrue(ass.is_arg)
56
+ self.assertFalse(ass.is_deletion)
57
+
58
+ name_del = NameDeletion(lhs, entry)
59
+ ass = deepcopy(name_del)
60
+ self.assertTrue(ass.lhs)
61
+ self.assertTrue(ass.rhs)
62
+ self.assertTrue(ass.entry)
63
+ self.assertEqual(ass.pos, name_del.pos)
64
+ self.assertFalse(ass.is_arg)
65
+ self.assertTrue(ass.is_deletion)
@@ -0,0 +1,202 @@
1
+ # mode: run
2
+ # tag: syntax
3
+
4
+ """
5
+ Uses TreeFragment to test invalid syntax.
6
+ """
7
+
8
+
9
+ import ast
10
+ import textwrap
11
+
12
+ from ...TestUtils import CythonTest
13
+ from .. import ExprNodes
14
+ from ..Errors import CompileError
15
+
16
+ # Copied from CPython's test_grammar.py
17
+ VALID_UNDERSCORE_LITERALS = [
18
+ '0_0_0',
19
+ '4_2',
20
+ '1_0000_0000',
21
+ '0b1001_0100',
22
+ '0xffff_ffff',
23
+ '0o5_7_7',
24
+ '1_00_00.5',
25
+ '1_00_00.5j',
26
+ '1_00_00.5e5',
27
+ '1_00_00j',
28
+ '1_00_00e5_1',
29
+ '1e1_0',
30
+ '.1_4',
31
+ '.1_4e1',
32
+ '0b_0',
33
+ '0x_f',
34
+ '0o_5',
35
+ '1_00_00j',
36
+ '1_00_00.5j',
37
+ '1_00_00e5_1j',
38
+ '.1_4j',
39
+ '(1_2.5+3_3j)',
40
+ '(.5_6j)',
41
+ ]
42
+
43
+ # Copied from CPython's test_grammar.py
44
+ INVALID_UNDERSCORE_LITERALS = [
45
+ # Trailing underscores:
46
+ '0_',
47
+ '42_',
48
+ '1.4j_',
49
+ '0x_',
50
+ '0b1_',
51
+ '0xf_',
52
+ '0o5_',
53
+ '0 if 1_Else 1',
54
+ # Underscores in the base selector:
55
+ '0_b0',
56
+ '0_xf',
57
+ '0_o5',
58
+ # Old-style octal, still disallowed:
59
+ # FIXME: still need to support PY_VERSION_HEX < 3
60
+ '0_7',
61
+ '09_99',
62
+ # Multiple consecutive underscores:
63
+ '4_______2',
64
+ '0.1__4',
65
+ '0.1__4j',
66
+ '0b1001__0100',
67
+ '0xffff__ffff',
68
+ '0x___',
69
+ '0o5__77',
70
+ '1e1__0',
71
+ '1e1__0j',
72
+ # Underscore right before a dot:
73
+ '1_.4',
74
+ '1_.4j',
75
+ # Underscore right after a dot:
76
+ '1._4',
77
+ '1._4j',
78
+ '._5',
79
+ '._5j',
80
+ # Underscore right after a sign:
81
+ '1.0e+_1',
82
+ '1.0e+_1j',
83
+ # Underscore right before j:
84
+ '1.4_j',
85
+ '1.4e5_j',
86
+ # Underscore right before e:
87
+ '1_e1',
88
+ '1.4_e1',
89
+ '1.4_e1j',
90
+ # Underscore right after e:
91
+ '1e_1',
92
+ '1.4e_1',
93
+ '1.4e_1j',
94
+ # Complex cases with parens:
95
+ '(1+1.5_j_)',
96
+ '(1+1.5_j)',
97
+ # Whitespace in literals
98
+ '1_ 2',
99
+ '1 _2',
100
+ '1_2.2_ 1',
101
+ '1_2.2 _1',
102
+ '1_2e _1',
103
+ '1_2e2 _1',
104
+ '1_2e 2_1',
105
+ ]
106
+
107
+
108
+ INVALID_ELLIPSIS = [
109
+ (". . .", 2, 0),
110
+ (". ..", 2, 0),
111
+ (".. .", 2, 0),
112
+ (". ...", 2, 0),
113
+ (". ... .", 2, 0),
114
+ (".. ... .", 2, 0),
115
+ (". ... ..", 2, 0),
116
+ ("""
117
+ (
118
+ .
119
+ ..
120
+ )
121
+ """, 3, 4),
122
+ ("""
123
+ [
124
+ ..
125
+ .,
126
+ None
127
+ ]
128
+ """, 3, 4),
129
+ ("""
130
+ {
131
+ None,
132
+ .
133
+ .
134
+
135
+ .
136
+ }
137
+ """, 4, 4)
138
+ ]
139
+
140
+
141
+ class TestGrammar(CythonTest):
142
+
143
+ def test_invalid_number_literals(self):
144
+ for literal in INVALID_UNDERSCORE_LITERALS:
145
+ for expression in ['%s', '1 + %s', '%s + 1', '2 * %s', '%s * 2']:
146
+ code = 'x = ' + expression % literal
147
+ try:
148
+ self.fragment('''\
149
+ # cython: language_level=3
150
+ ''' + code)
151
+ except CompileError as exc:
152
+ assert code in [s.strip() for s in str(exc).splitlines()], str(exc)
153
+ else:
154
+ assert False, "Invalid Cython code '%s' failed to raise an exception" % code
155
+
156
+ def test_valid_number_literals(self):
157
+ for literal in VALID_UNDERSCORE_LITERALS:
158
+ for i, expression in enumerate(['%s', '1 + %s', '%s + 1', '2 * %s', '%s * 2']):
159
+ code = 'x = ' + expression % literal
160
+ node = self.fragment('''\
161
+ # cython: language_level=3
162
+ ''' + code).root
163
+ assert node is not None
164
+
165
+ literal_node = node.stats[0].rhs # StatListNode([SingleAssignmentNode('x', expr)])
166
+ if i > 0:
167
+ # Add/MulNode() -> literal is first or second operand
168
+ literal_node = literal_node.operand2 if i % 2 else literal_node.operand1
169
+ if 'j' in literal or 'J' in literal:
170
+ if '+' in literal:
171
+ # FIXME: tighten this test
172
+ assert isinstance(literal_node, ExprNodes.AddNode), (literal, literal_node)
173
+ else:
174
+ assert isinstance(literal_node, ExprNodes.ImagNode), (literal, literal_node)
175
+ elif '.' in literal or 'e' in literal or 'E' in literal and not ('0x' in literal or '0X' in literal):
176
+ assert isinstance(literal_node, ExprNodes.FloatNode), (literal, literal_node)
177
+ else:
178
+ assert isinstance(literal_node, ExprNodes.IntNode), (literal, literal_node)
179
+
180
+ def test_invalid_ellipsis(self):
181
+ ERR = ":{0}:{1}: Expected an identifier or literal"
182
+ for code, line, col in INVALID_ELLIPSIS:
183
+ try:
184
+ ast.parse(textwrap.dedent(code))
185
+ except SyntaxError as exc:
186
+ assert True
187
+ else:
188
+ assert False, "Invalid Python code '%s' failed to raise an exception" % code
189
+
190
+ try:
191
+ self.fragment('''\
192
+ # cython: language_level=3
193
+ ''' + code)
194
+ except CompileError as exc:
195
+ assert ERR.format(line, col) in str(exc), str(exc)
196
+ else:
197
+ assert False, "Invalid Cython code '%s' failed to raise an exception" % code
198
+
199
+
200
+ if __name__ == "__main__":
201
+ import unittest
202
+ unittest.main()
@@ -0,0 +1,71 @@
1
+ from Cython.TestUtils import CythonTest
2
+ import Cython.Compiler.Errors as Errors
3
+ from Cython.Compiler.Nodes import *
4
+ from Cython.Compiler.ParseTreeTransforms import *
5
+ from Cython.Compiler.Buffer import *
6
+
7
+
8
+ class TestMemviewParsing(CythonTest):
9
+
10
+ def parse(self, s):
11
+ return self.should_not_fail(lambda: self.fragment(s)).root
12
+
13
+ def not_parseable(self, expected_error, s):
14
+ e = self.should_fail(lambda: self.fragment(s), Errors.CompileError)
15
+ self.assertEqual(expected_error, e.message_only)
16
+
17
+ def test_default_1dim(self):
18
+ self.parse("cdef int[:] x")
19
+ self.parse("cdef short int[:] x")
20
+
21
+ def test_default_ndim(self):
22
+ self.parse("cdef int[:,:,:,:,:] x")
23
+ self.parse("cdef unsigned long int[:,:,:,:,:] x")
24
+ self.parse("cdef unsigned int[:,:,:,:,:] x")
25
+
26
+ def test_zero_offset(self):
27
+ self.parse("cdef long double[0:] x")
28
+ self.parse("cdef int[0:] x")
29
+
30
+ def test_zero_offset_ndim(self):
31
+ self.parse("cdef int[0:,0:,0:,0:] x")
32
+
33
+ def test_def_arg(self):
34
+ self.parse("def foo(int[:,:] x): pass")
35
+
36
+ def test_cdef_arg(self):
37
+ self.parse("cdef foo(int[:,:] x): pass")
38
+
39
+ def test_general_slice(self):
40
+ self.parse('cdef float[::ptr, ::direct & contig, 0::full & strided] x')
41
+
42
+ def test_non_slice_memview(self):
43
+ self.not_parseable("An axis specification in memoryview declaration does not have a ':'.",
44
+ "cdef double[:foo, bar] x")
45
+ self.not_parseable("An axis specification in memoryview declaration does not have a ':'.",
46
+ "cdef double[0:foo, bar] x")
47
+
48
+ def test_basic(self):
49
+ t = self.parse("cdef int[:] x")
50
+ memv_node = t.stats[0].base_type
51
+ self.assertTrue(isinstance(memv_node, MemoryViewSliceTypeNode))
52
+
53
+ # we also test other similar declarations (buffers, anonymous C arrays)
54
+ # since the parsing has to distinguish between them.
55
+
56
+ def disable_test_no_buf_arg(self): # TODO
57
+ self.not_parseable("Expected ']'",
58
+ "cdef extern foo(object[int, ndim=2])")
59
+
60
+ def disable_test_parse_sizeof(self): # TODO
61
+ self.parse("sizeof(int[NN])")
62
+ self.parse("sizeof(int[])")
63
+ self.parse("sizeof(int[][NN])")
64
+ self.not_parseable("Expected an identifier or literal",
65
+ "sizeof(int[:NN])")
66
+ self.not_parseable("Expected ']'",
67
+ "sizeof(foo[dtype=bar]")
68
+
69
+ if __name__ == '__main__':
70
+ import unittest
71
+ unittest.main()