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,586 @@
1
+ import os
2
+ import sys
3
+ import re
4
+ from io import StringIO
5
+ from unittest import TestCase
6
+ from unittest.mock import patch, Mock
7
+
8
+ from .. import Options
9
+ from ..CmdLine import parse_command_line
10
+
11
+ from .Utils import backup_Options, restore_Options, check_global_options
12
+
13
+ unpatched_exists = os.path.exists
14
+
15
+ def patched_exists(path):
16
+ # avoid the Cython command raising a file not found error
17
+ if path in (
18
+ 'source.pyx',
19
+ os.path.join('/work/dir', 'source.pyx'),
20
+ os.path.join('my_working_path', 'source.pyx'),
21
+ 'file.pyx',
22
+ 'file1.pyx',
23
+ 'file2.pyx',
24
+ 'file3.pyx',
25
+ 'foo.pyx',
26
+ 'bar.pyx',
27
+ ):
28
+ return True
29
+ return unpatched_exists(path)
30
+
31
+ @patch('os.path.exists', new=Mock(side_effect=patched_exists))
32
+ class CmdLineParserTest(TestCase):
33
+ def setUp(self):
34
+ self._options_backup = backup_Options()
35
+
36
+ def tearDown(self):
37
+ restore_Options(self._options_backup)
38
+
39
+ def check_default_global_options(self, white_list=[]):
40
+ self.assertEqual(check_global_options(self._options_backup, white_list), "")
41
+
42
+ def check_default_options(self, options, white_list=[]):
43
+ default_options = Options.CompilationOptions(Options.default_options)
44
+ no_value = object()
45
+ for name in default_options.__dict__.keys():
46
+ if name not in white_list:
47
+ self.assertEqual(getattr(options, name, no_value), getattr(default_options, name), msg="error in option " + name)
48
+
49
+ def test_short_options(self):
50
+ options, sources = parse_command_line([
51
+ '-V', '-l', '-+', '-t', '-v', '-v', '-v', '-p', '-D', '-a', '-3',
52
+ ])
53
+ self.assertFalse(sources)
54
+ self.assertTrue(options.show_version)
55
+ self.assertTrue(options.use_listing_file)
56
+ self.assertTrue(options.cplus)
57
+ self.assertTrue(options.timestamps)
58
+ self.assertTrue(options.verbose >= 3)
59
+ self.assertTrue(Options.embed_pos_in_docstring)
60
+ self.assertFalse(Options.docstrings)
61
+ self.assertTrue(Options.annotate)
62
+ self.assertEqual(options.language_level, 3)
63
+
64
+ options, sources = parse_command_line([
65
+ '-f', '-2', 'source.pyx',
66
+ ])
67
+ self.assertTrue(sources)
68
+ self.assertTrue(len(sources) == 1)
69
+ self.assertFalse(options.timestamps)
70
+ self.assertEqual(options.language_level, 2)
71
+
72
+ def test_long_options(self):
73
+ options, sources = parse_command_line([
74
+ '--version', '--create-listing', '--cplus', '--embed', '--timestamps',
75
+ '--verbose', '--verbose', '--verbose',
76
+ '--embed-positions', '--no-docstrings', '--annotate', '--lenient',
77
+ ])
78
+ self.assertFalse(sources)
79
+ self.assertTrue(options.show_version)
80
+ self.assertTrue(options.use_listing_file)
81
+ self.assertTrue(options.cplus)
82
+ self.assertEqual(Options.embed, 'main')
83
+ self.assertTrue(options.timestamps)
84
+ self.assertTrue(options.verbose >= 3)
85
+ self.assertTrue(Options.embed_pos_in_docstring)
86
+ self.assertFalse(Options.docstrings)
87
+ self.assertTrue(Options.annotate)
88
+ self.assertFalse(Options.error_on_unknown_names)
89
+ self.assertFalse(Options.error_on_uninitialized)
90
+
91
+ options, sources = parse_command_line([
92
+ '--force', 'source.pyx',
93
+ ])
94
+ self.assertTrue(sources)
95
+ self.assertTrue(len(sources) == 1)
96
+ self.assertFalse(options.timestamps)
97
+
98
+ def test_options_with_values(self):
99
+ options, sources = parse_command_line([
100
+ '--embed=huhu',
101
+ '-I/test/include/dir1', '--include-dir=/test/include/dir2',
102
+ '--include-dir', '/test/include/dir3',
103
+ '--working=/work/dir',
104
+ 'source.pyx',
105
+ '--output-file=/output/dir',
106
+ '--pre-import=/pre/import',
107
+ '--cleanup=3',
108
+ '--annotate-coverage=cov.xml',
109
+ '--gdb-outdir=/gdb/outdir',
110
+ '--directive=wraparound=false',
111
+ '--shared=foo.shared',
112
+ ])
113
+ self.assertEqual(sources, ['source.pyx'])
114
+ self.assertEqual(Options.embed, 'huhu')
115
+ self.assertEqual(options.include_path, ['/test/include/dir1', '/test/include/dir2', '/test/include/dir3'])
116
+ self.assertEqual(options.working_path, '/work/dir')
117
+ self.assertEqual(options.output_file, '/output/dir')
118
+ self.assertEqual(Options.pre_import, '/pre/import')
119
+ self.assertEqual(Options.generate_cleanup_code, 3)
120
+ self.assertTrue(Options.annotate)
121
+ self.assertEqual(Options.annotate_coverage_xml, 'cov.xml')
122
+ self.assertTrue(options.gdb_debug)
123
+ self.assertEqual(options.output_dir, '/gdb/outdir')
124
+ self.assertEqual(options.compiler_directives['wraparound'], False)
125
+ self.assertEqual(options.shared_utility_qualified_name, 'foo.shared')
126
+
127
+ def test_embed_before_positional(self):
128
+ options, sources = parse_command_line([
129
+ '--embed',
130
+ 'source.pyx',
131
+ ])
132
+ self.assertEqual(sources, ['source.pyx'])
133
+ self.assertEqual(Options.embed, 'main')
134
+
135
+ def test_two_embeds(self):
136
+ options, sources = parse_command_line([
137
+ '--embed', '--embed=huhu',
138
+ 'source.pyx',
139
+ ])
140
+ self.assertEqual(sources, ['source.pyx'])
141
+ self.assertEqual(Options.embed, 'huhu')
142
+
143
+ def test_two_embeds2(self):
144
+ options, sources = parse_command_line([
145
+ '--embed=huhu', '--embed',
146
+ 'source.pyx',
147
+ ])
148
+ self.assertEqual(sources, ['source.pyx'])
149
+ self.assertEqual(Options.embed, 'main')
150
+
151
+ def test_no_annotate(self):
152
+ options, sources = parse_command_line([
153
+ '--embed=huhu', 'source.pyx'
154
+ ])
155
+ self.assertFalse(Options.annotate)
156
+
157
+ def test_annotate_short(self):
158
+ options, sources = parse_command_line([
159
+ '-a',
160
+ 'source.pyx',
161
+ ])
162
+ self.assertEqual(Options.annotate, 'default')
163
+
164
+ def test_annotate_long(self):
165
+ options, sources = parse_command_line([
166
+ '--annotate',
167
+ 'source.pyx',
168
+ ])
169
+ self.assertEqual(Options.annotate, 'default')
170
+
171
+ def test_annotate_fullc(self):
172
+ options, sources = parse_command_line([
173
+ '--annotate-fullc',
174
+ 'source.pyx',
175
+ ])
176
+ self.assertEqual(Options.annotate, 'fullc')
177
+
178
+ def test_short_w(self):
179
+ options, sources = parse_command_line([
180
+ '-w', 'my_working_path',
181
+ 'source.pyx'
182
+ ])
183
+ self.assertEqual(options.working_path, 'my_working_path')
184
+ self.check_default_global_options()
185
+ self.check_default_options(options, ['working_path'])
186
+
187
+ def test_short_o(self):
188
+ options, sources = parse_command_line([
189
+ '-o', 'my_output',
190
+ 'source.pyx'
191
+ ])
192
+ self.assertEqual(options.output_file, 'my_output')
193
+ self.check_default_global_options()
194
+ self.check_default_options(options, ['output_file'])
195
+
196
+ def test_short_z(self):
197
+ options, sources = parse_command_line([
198
+ '-z', 'my_preimport',
199
+ 'source.pyx'
200
+ ])
201
+ self.assertEqual(Options.pre_import, 'my_preimport')
202
+ self.check_default_global_options(['pre_import'])
203
+ self.check_default_options(options)
204
+
205
+ def test_convert_range(self):
206
+ options, sources = parse_command_line([
207
+ '--convert-range',
208
+ 'source.pyx'
209
+ ])
210
+ self.assertEqual(Options.convert_range, True)
211
+ self.check_default_global_options(['convert_range'])
212
+ self.check_default_options(options)
213
+
214
+ def test_line_directives(self):
215
+ options, sources = parse_command_line([
216
+ '--line-directives',
217
+ 'source.pyx'
218
+ ])
219
+ self.assertEqual(options.emit_linenums, True)
220
+ self.check_default_global_options()
221
+ self.check_default_options(options, ['emit_linenums'])
222
+
223
+ def test_no_c_in_traceback(self):
224
+ options, sources = parse_command_line([
225
+ '--no-c-in-traceback',
226
+ 'source.pyx'
227
+ ])
228
+ self.assertEqual(options.c_line_in_traceback, False)
229
+ self.check_default_global_options()
230
+ self.check_default_options(options, ['c_line_in_traceback'])
231
+
232
+ def test_gdb(self):
233
+ options, sources = parse_command_line([
234
+ '--gdb',
235
+ 'source.pyx'
236
+ ])
237
+ self.assertEqual(options.gdb_debug, True)
238
+ self.assertEqual(options.output_dir, os.curdir)
239
+ self.check_default_global_options()
240
+ self.check_default_options(options, ['gdb_debug', 'output_dir'])
241
+
242
+ def test_3str(self):
243
+ options, sources = parse_command_line([
244
+ '--3str',
245
+ 'source.pyx'
246
+ ])
247
+ self.assertEqual(options.language_level, '3')
248
+ self.check_default_global_options()
249
+ self.check_default_options(options, ['language_level'])
250
+
251
+ def test_capi_reexport_cincludes(self):
252
+ options, sources = parse_command_line([
253
+ '--capi-reexport-cincludes',
254
+ 'source.pyx'
255
+ ])
256
+ self.assertEqual(options.capi_reexport_cincludes, True)
257
+ self.check_default_global_options()
258
+ self.check_default_options(options, ['capi_reexport_cincludes'])
259
+
260
+ def test_fast_fail(self):
261
+ options, sources = parse_command_line([
262
+ '--fast-fail',
263
+ 'source.pyx'
264
+ ])
265
+ self.assertEqual(Options.fast_fail, True)
266
+ self.check_default_global_options(['fast_fail'])
267
+ self.check_default_options(options)
268
+
269
+ def test_cimport_from_pyx(self):
270
+ options, sources = parse_command_line([
271
+ '--cimport-from-pyx',
272
+ 'source.pyx'
273
+ ])
274
+ self.assertEqual(Options.cimport_from_pyx, True)
275
+ self.check_default_global_options(['cimport_from_pyx'])
276
+ self.check_default_options(options)
277
+
278
+ def test_Werror(self):
279
+ options, sources = parse_command_line([
280
+ '-Werror',
281
+ 'source.pyx'
282
+ ])
283
+ self.assertEqual(Options.warning_errors, True)
284
+ self.check_default_global_options(['warning_errors'])
285
+ self.check_default_options(options)
286
+
287
+ def test_warning_errors(self):
288
+ options, sources = parse_command_line([
289
+ '--warning-errors',
290
+ 'source.pyx'
291
+ ])
292
+ self.assertEqual(Options.warning_errors, True)
293
+ self.check_default_global_options(['warning_errors'])
294
+ self.check_default_options(options)
295
+
296
+ def test_Wextra(self):
297
+ options, sources = parse_command_line([
298
+ '-Wextra',
299
+ 'source.pyx'
300
+ ])
301
+ self.assertEqual(options.compiler_directives, Options.extra_warnings)
302
+ self.check_default_global_options()
303
+ self.check_default_options(options, ['compiler_directives'])
304
+
305
+ def test_warning_extra(self):
306
+ options, sources = parse_command_line([
307
+ '--warning-extra',
308
+ 'source.pyx'
309
+ ])
310
+ self.assertEqual(options.compiler_directives, Options.extra_warnings)
311
+ self.check_default_global_options()
312
+ self.check_default_options(options, ['compiler_directives'])
313
+
314
+ def test_old_style_globals(self):
315
+ options, sources = parse_command_line([
316
+ '--old-style-globals',
317
+ 'source.pyx'
318
+ ])
319
+ self.assertEqual(Options.old_style_globals, True)
320
+ self.check_default_global_options(['old_style_globals'])
321
+ self.check_default_options(options)
322
+
323
+ def test_directive_multiple(self):
324
+ options, source = parse_command_line([
325
+ '-X', 'cdivision=True',
326
+ '-X', 'c_string_type=bytes',
327
+ 'source.pyx'
328
+ ])
329
+ self.assertEqual(options.compiler_directives['cdivision'], True)
330
+ self.assertEqual(options.compiler_directives['c_string_type'], 'bytes')
331
+ self.check_default_global_options()
332
+ self.check_default_options(options, ['compiler_directives'])
333
+
334
+ def test_directive_multiple_v2(self):
335
+ options, source = parse_command_line([
336
+ '-X', 'cdivision=True,c_string_type=bytes',
337
+ 'source.pyx'
338
+ ])
339
+ self.assertEqual(options.compiler_directives['cdivision'], True)
340
+ self.assertEqual(options.compiler_directives['c_string_type'], 'bytes')
341
+ self.check_default_global_options()
342
+ self.check_default_options(options, ['compiler_directives'])
343
+
344
+ def test_directive_value_yes(self):
345
+ options, source = parse_command_line([
346
+ '-X', 'cdivision=YeS',
347
+ 'source.pyx'
348
+ ])
349
+ self.assertEqual(options.compiler_directives['cdivision'], True)
350
+ self.check_default_global_options()
351
+ self.check_default_options(options, ['compiler_directives'])
352
+
353
+ def test_directive_value_no(self):
354
+ options, source = parse_command_line([
355
+ '-X', 'cdivision=no',
356
+ 'source.pyx'
357
+ ])
358
+ self.assertEqual(options.compiler_directives['cdivision'], False)
359
+ self.check_default_global_options()
360
+ self.check_default_options(options, ['compiler_directives'])
361
+
362
+ def test_directive_value_invalid(self):
363
+ self.assertRaises(ValueError, parse_command_line, [
364
+ '-X', 'cdivision=sadfasd',
365
+ 'source.pyx'
366
+ ])
367
+
368
+ def test_directive_key_invalid(self):
369
+ self.assertRaises(ValueError, parse_command_line, [
370
+ '-X', 'abracadabra',
371
+ 'source.pyx'
372
+ ])
373
+
374
+ def test_directive_no_value(self):
375
+ self.assertRaises(ValueError, parse_command_line, [
376
+ '-X', 'cdivision',
377
+ 'source.pyx'
378
+ ])
379
+
380
+ def test_compile_time_env_short(self):
381
+ options, source = parse_command_line([
382
+ '-E', 'MYSIZE=10',
383
+ 'source.pyx'
384
+ ])
385
+ self.assertEqual(options.compile_time_env['MYSIZE'], 10)
386
+ self.check_default_global_options()
387
+ self.check_default_options(options, ['compile_time_env'])
388
+
389
+ def test_compile_time_env_long(self):
390
+ options, source = parse_command_line([
391
+ '--compile-time-env', 'MYSIZE=10',
392
+ 'source.pyx'
393
+ ])
394
+ self.assertEqual(options.compile_time_env['MYSIZE'], 10)
395
+ self.check_default_global_options()
396
+ self.check_default_options(options, ['compile_time_env'])
397
+
398
+ def test_compile_time_env_multiple(self):
399
+ options, source = parse_command_line([
400
+ '-E', 'MYSIZE=10', '-E', 'ARRSIZE=11',
401
+ 'source.pyx'
402
+ ])
403
+ self.assertEqual(options.compile_time_env['MYSIZE'], 10)
404
+ self.assertEqual(options.compile_time_env['ARRSIZE'], 11)
405
+ self.check_default_global_options()
406
+ self.check_default_options(options, ['compile_time_env'])
407
+
408
+ def test_compile_time_env_multiple_v2(self):
409
+ options, source = parse_command_line([
410
+ '-E', 'MYSIZE=10,ARRSIZE=11',
411
+ 'source.pyx'
412
+ ])
413
+ self.assertEqual(options.compile_time_env['MYSIZE'], 10)
414
+ self.assertEqual(options.compile_time_env['ARRSIZE'], 11)
415
+ self.check_default_global_options()
416
+ self.check_default_options(options, ['compile_time_env'])
417
+
418
+ def test_option_first(self):
419
+ options, sources = parse_command_line(['-V', 'file.pyx'])
420
+ self.assertEqual(sources, ['file.pyx'])
421
+
422
+ def test_file_inbetween(self):
423
+ options, sources = parse_command_line(['-V', 'file.pyx', '-a'])
424
+ self.assertEqual(sources, ['file.pyx'])
425
+
426
+ def test_option_trailing(self):
427
+ options, sources = parse_command_line(['file.pyx', '-V'])
428
+ self.assertEqual(sources, ['file.pyx'])
429
+
430
+ def test_multiple_files(self):
431
+ options, sources = parse_command_line([
432
+ 'file1.pyx', '-V',
433
+ 'file2.pyx', '-a',
434
+ 'file3.pyx'
435
+ ])
436
+ self.assertEqual(sources, ['file1.pyx', 'file2.pyx', 'file3.pyx'])
437
+
438
+ def test_debug_flags(self):
439
+ options, sources = parse_command_line([
440
+ '--debug-disposal-code', '--debug-coercion',
441
+ 'file3.pyx'
442
+ ])
443
+ from Cython.Compiler import DebugFlags
444
+ for name in ['debug_disposal_code', 'debug_temp_alloc', 'debug_coercion']:
445
+ self.assertEqual(getattr(DebugFlags, name), name in ['debug_disposal_code', 'debug_coercion'])
446
+ setattr(DebugFlags, name, 0) # restore original value
447
+
448
+ def test_gdb_overwrites_gdb_outdir(self):
449
+ options, sources = parse_command_line([
450
+ '--gdb-outdir=my_dir', '--gdb',
451
+ 'file3.pyx'
452
+ ])
453
+ self.assertEqual(options.gdb_debug, True)
454
+ self.assertEqual(options.output_dir, os.curdir)
455
+ self.check_default_global_options()
456
+ self.check_default_options(options, ['gdb_debug', 'output_dir'])
457
+
458
+ def test_gdb_first(self):
459
+ options, sources = parse_command_line([
460
+ '--gdb', '--gdb-outdir=my_dir',
461
+ 'file3.pyx'
462
+ ])
463
+ self.assertEqual(options.gdb_debug, True)
464
+ self.assertEqual(options.output_dir, 'my_dir')
465
+ self.check_default_global_options()
466
+ self.check_default_options(options, ['gdb_debug', 'output_dir'])
467
+
468
+ def test_coverage_overwrites_annotation(self):
469
+ options, sources = parse_command_line([
470
+ '--annotate-fullc', '--annotate-coverage=my.xml',
471
+ 'file3.pyx'
472
+ ])
473
+ self.assertEqual(Options.annotate, True)
474
+ self.assertEqual(Options.annotate_coverage_xml, 'my.xml')
475
+ self.check_default_global_options(['annotate', 'annotate_coverage_xml'])
476
+ self.check_default_options(options)
477
+
478
+ def test_coverage_first(self):
479
+ options, sources = parse_command_line([
480
+ '--annotate-coverage=my.xml', '--annotate-fullc',
481
+ 'file3.pyx'
482
+ ])
483
+ self.assertEqual(Options.annotate, 'fullc')
484
+ self.assertEqual(Options.annotate_coverage_xml, 'my.xml')
485
+ self.check_default_global_options(['annotate', 'annotate_coverage_xml'])
486
+ self.check_default_options(options)
487
+
488
+ def test_annotate_first_fullc_second(self):
489
+ options, sources = parse_command_line([
490
+ '--annotate', '--annotate-fullc',
491
+ 'file3.pyx'
492
+ ])
493
+ self.assertEqual(Options.annotate, 'fullc')
494
+ self.check_default_global_options(['annotate'])
495
+ self.check_default_options(options)
496
+
497
+ def test_annotate_fullc_first(self):
498
+ options, sources = parse_command_line([
499
+ '--annotate-fullc', '--annotate',
500
+ 'file3.pyx'
501
+ ])
502
+ self.assertEqual(Options.annotate, 'default')
503
+ self.check_default_global_options(['annotate'])
504
+ self.check_default_options(options)
505
+
506
+ def test_warning_extra_dont_overwrite(self):
507
+ options, sources = parse_command_line([
508
+ '-X', 'cdivision=True',
509
+ '--warning-extra',
510
+ '-X', 'c_string_type=bytes',
511
+ 'source.pyx'
512
+ ])
513
+ self.assertTrue(len(options.compiler_directives), len(Options.extra_warnings) + 1)
514
+ self.check_default_global_options()
515
+ self.check_default_options(options, ['compiler_directives'])
516
+
517
+ def test_module_name(self):
518
+ options, sources = parse_command_line([
519
+ 'source.pyx'
520
+ ])
521
+ self.assertEqual(options.module_name, None)
522
+ self.check_default_global_options()
523
+ self.check_default_options(options)
524
+ options, sources = parse_command_line([
525
+ '--module-name', 'foo.bar',
526
+ 'source.pyx'
527
+ ])
528
+ self.assertEqual(options.module_name, 'foo.bar')
529
+ self.check_default_global_options()
530
+ self.check_default_options(options, ['module_name'])
531
+
532
+ def test_generate_shared(self):
533
+ options, sources = parse_command_line([
534
+ '--generate-shared=foo/shared.c',
535
+ ])
536
+ self.assertEqual(sources, [])
537
+ self.assertEqual(options.shared_c_file_path, 'foo/shared.c')
538
+
539
+ def test_errors(self):
540
+ def error(args, regex=None):
541
+ old_stderr = sys.stderr
542
+ stderr = sys.stderr = StringIO()
543
+ try:
544
+ self.assertRaises(SystemExit, parse_command_line, list(args))
545
+ finally:
546
+ sys.stderr = old_stderr
547
+ msg = stderr.getvalue()
548
+ err_msg = 'Message "{}"'.format(msg.strip())
549
+ self.assertTrue(msg.startswith('usage: '),
550
+ '%s does not start with "usage :"' % err_msg)
551
+ self.assertTrue(': error: ' in msg,
552
+ '%s does not contain ": error :"' % err_msg)
553
+ if regex:
554
+ self.assertTrue(re.search(regex, msg),
555
+ '%s does not match search "%s"' %
556
+ (err_msg, regex))
557
+
558
+ error(['-1'],
559
+ 'unknown option -1')
560
+ error(['-I'],
561
+ 'argument -I/--include-dir: expected one argument')
562
+ error(['--version=-a'],
563
+ "argument -V/--version: ignored explicit argument '-a'")
564
+ error(['--version=--annotate=true'],
565
+ "argument -V/--version: ignored explicit argument "
566
+ "'--annotate=true'")
567
+ error(['--working'],
568
+ "argument -w/--working: expected one argument")
569
+ error(['--verbose=1'],
570
+ "argument -v/--verbose: ignored explicit argument '1'")
571
+ error(['--cleanup'],
572
+ "argument --cleanup: expected one argument")
573
+ error(['--debug-disposal-code-wrong-name', 'file3.pyx'],
574
+ "unknown option --debug-disposal-code-wrong-name")
575
+ error(['--module-name', 'foo.pyx'],
576
+ "Need at least one source file")
577
+ error(['--module-name', 'foo.bar'],
578
+ "Need at least one source file")
579
+ error(['--module-name', 'foo.bar', 'foo.pyx', 'bar.pyx'],
580
+ "Only one source file allowed when using --module-name")
581
+ error(['--module-name', 'foo.bar', '--timestamps', 'foo.pyx'],
582
+ "Cannot use --module-name with --timestamps")
583
+ error(['--generate-shared=shared.c', 'foo.pyx'],
584
+ "Source file not allowed when using --generate-shared")
585
+ error(['--generate-shared'],
586
+ "argument --generate-shared: expected one argument")