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,202 @@
1
+ import sys
2
+ from io import StringIO
3
+
4
+ from Cython.Utils import (
5
+ _CACHE_NAME_PATTERN, _build_cache_name, _find_cache_attributes,
6
+ build_hex_version, cached_method, clear_method_caches, try_finally_contextmanager,
7
+ print_version, normalise_float_repr,
8
+ )
9
+ from Cython.TestUtils import TimedTest
10
+
11
+ METHOD_NAME = "cached_next"
12
+ CACHE_NAME = _build_cache_name(METHOD_NAME)
13
+ NAMES = CACHE_NAME, METHOD_NAME
14
+
15
+ class Cached:
16
+ @cached_method
17
+ def cached_next(self, x):
18
+ return next(x)
19
+
20
+
21
+ class TestCythonUtils(TimedTest):
22
+ def test_build_hex_version(self):
23
+ self.assertEqual('0x001D00A1', build_hex_version('0.29a1'))
24
+ self.assertEqual('0x001D03C4', build_hex_version('0.29.3rc4'))
25
+ self.assertEqual('0x001D00F0', build_hex_version('0.29'))
26
+ self.assertEqual('0x040000F0', build_hex_version('4.0'))
27
+
28
+ ############################## Cached Methods ##############################
29
+
30
+ def test_cache_method_name(self):
31
+ method_name = "foo"
32
+ cache_name = _build_cache_name(method_name)
33
+ match = _CACHE_NAME_PATTERN.match(cache_name)
34
+
35
+ self.assertIsNot(match, None)
36
+ self.assertEqual(match.group(1), method_name)
37
+
38
+ def test_requirements_for_Cached(self):
39
+ obj = Cached()
40
+
41
+ self.assertFalse(hasattr(obj, CACHE_NAME))
42
+ self.assertTrue(hasattr(obj, METHOD_NAME))
43
+ self.set_of_names_equal(obj, set())
44
+
45
+ def set_of_names_equal(self, obj, value):
46
+ self.assertEqual(set(_find_cache_attributes(obj)), value)
47
+
48
+ def test_find_cache_attributes(self):
49
+ obj = Cached()
50
+ method_name = "bar"
51
+ cache_name = _build_cache_name(method_name)
52
+
53
+ setattr(obj, CACHE_NAME, {})
54
+ setattr(obj, cache_name, {})
55
+
56
+ self.assertFalse(hasattr(obj, method_name))
57
+ self.set_of_names_equal(obj, {NAMES, (cache_name, method_name)})
58
+
59
+ def test_cached_method(self):
60
+ obj = Cached()
61
+ value = iter(range(3))
62
+ cache = {(value,): 0}
63
+
64
+ # cache args
65
+ self.assertEqual(obj.cached_next(value), 0)
66
+ self.set_of_names_equal(obj, {NAMES})
67
+ self.assertEqual(getattr(obj, CACHE_NAME), cache)
68
+
69
+ # use cache
70
+ self.assertEqual(obj.cached_next(value), 0)
71
+ self.set_of_names_equal(obj, {NAMES})
72
+ self.assertEqual(getattr(obj, CACHE_NAME), cache)
73
+
74
+ def test_clear_method_caches(self):
75
+ obj = Cached()
76
+ value = iter(range(3))
77
+ cache = {(value,): 1}
78
+
79
+ obj.cached_next(value) # cache args
80
+
81
+ clear_method_caches(obj)
82
+ self.set_of_names_equal(obj, set())
83
+
84
+ self.assertEqual(obj.cached_next(value), 1)
85
+ self.set_of_names_equal(obj, {NAMES})
86
+ self.assertEqual(getattr(obj, CACHE_NAME), cache)
87
+
88
+ def test_clear_method_caches_with_missing_method(self):
89
+ obj = Cached()
90
+ method_name = "bar"
91
+ cache_name = _build_cache_name(method_name)
92
+ names = cache_name, method_name
93
+
94
+ setattr(obj, cache_name, object())
95
+
96
+ self.assertFalse(hasattr(obj, method_name))
97
+ self.set_of_names_equal(obj, {names})
98
+
99
+ clear_method_caches(obj)
100
+ self.set_of_names_equal(obj, {names})
101
+
102
+ def test_try_finally_contextmanager(self):
103
+ states = []
104
+ @try_finally_contextmanager
105
+ def gen(*args, **kwargs):
106
+ states.append("enter")
107
+ yield (args, kwargs)
108
+ states.append("exit")
109
+
110
+ with gen(1, 2, 3, x=4) as call_args:
111
+ assert states == ["enter"]
112
+ self.assertEqual(call_args, ((1, 2, 3), {'x': 4}))
113
+ assert states == ["enter", "exit"]
114
+
115
+ class MyException(RuntimeError):
116
+ pass
117
+
118
+ del states[:]
119
+ with self.assertRaises(MyException):
120
+ with gen(1, 2, y=4) as call_args:
121
+ assert states == ["enter"]
122
+ self.assertEqual(call_args, ((1, 2), {'y': 4}))
123
+ raise MyException("FAIL INSIDE")
124
+ assert states == ["enter", "exit"]
125
+
126
+ del states[:]
127
+ with self.assertRaises(StopIteration):
128
+ with gen(1, 2, y=4) as call_args:
129
+ assert states == ["enter"]
130
+ self.assertEqual(call_args, ((1, 2), {'y': 4}))
131
+ raise StopIteration("STOP")
132
+ assert states == ["enter", "exit"]
133
+
134
+ def test_print_version(self):
135
+ orig_stderr = sys.stderr
136
+ orig_stdout = sys.stdout
137
+ stderr = sys.stderr = StringIO()
138
+ stdout = sys.stdout = StringIO()
139
+ try:
140
+ print_version()
141
+ finally:
142
+ sys.stdout = orig_stdout
143
+ sys.stderr = orig_stderr
144
+
145
+ stdout = stdout.getvalue()
146
+ stderr = stderr.getvalue()
147
+
148
+ from .. import __version__ as version
149
+ self.assertIn(version, stdout)
150
+ if stderr: # Depends on os.fstat(1/2).
151
+ self.assertIn(version, stderr)
152
+
153
+ def test_print_version_stdouterr(self):
154
+ orig_stderr = sys.stderr
155
+ orig_stdout = sys.stdout
156
+ stdout = sys.stdout = sys.stderr = StringIO() # same!
157
+ try:
158
+ print_version()
159
+ finally:
160
+ sys.stdout = orig_stdout
161
+ sys.stderr = orig_stderr
162
+
163
+ stdout = stdout.getvalue()
164
+
165
+ from .. import __version__ as version
166
+ self.assertIn(version, stdout)
167
+ self.assertEqual(stdout.count(version), 1)
168
+
169
+ def test_normalise_float_repr(self):
170
+ examples = [
171
+ ('.0', '.0'),
172
+ ('.000000', '.0'),
173
+ ('.1', '.1'),
174
+ ('1.', '1.'),
175
+ ('1.0', '1.'),
176
+ ('1.000000000000000000000', '1.'),
177
+ ('00000000000000000000001.000000000000000000000', '1.'),
178
+ ('12345.0025', '12345.0025'),
179
+ ('1E5', '100000.'),
180
+ ('.1E-5', '.000001'),
181
+ ('1.1E-5', '.000011'),
182
+ ('12.3E-5', '.000123'),
183
+ ('.1E10', '1000000000.'),
184
+ ('1.1E10', '11000000000.'),
185
+ ('123.4E10', '1234000000000.'),
186
+ ('123.456E0', '123.456'),
187
+ ('123.456E-1', '12.3456'),
188
+ ('123.456E-2', '1.23456'),
189
+ ('123.456E1', '1234.56'),
190
+ ('123.456E2', '12345.6'),
191
+ ('2.1E80', '210000000000000000000000000000000000000000000000000000000000000000000000000000000.'),
192
+ ]
193
+
194
+ for float_str, norm_str in examples:
195
+ self.assertEqual(float(float_str), float(norm_str)) # safety check for test data
196
+
197
+ result = normalise_float_repr(float_str)
198
+ self.assertEqual(float(float_str), float(result))
199
+ self.assertEqual(
200
+ result, norm_str,
201
+ "normalise_float_repr(%r) == %r != %r (%.330f)" % (float_str, result, norm_str, float(float_str))
202
+ )
@@ -0,0 +1,223 @@
1
+ # tag: jedi
2
+
3
+
4
+ import sys
5
+ import os.path
6
+
7
+ from textwrap import dedent
8
+ from contextlib import contextmanager
9
+ from tempfile import NamedTemporaryFile
10
+
11
+ from Cython.Compiler.ParseTreeTransforms import NormalizeTree, InterpretCompilerDirectives
12
+ from Cython.Compiler import Main, Symtab, Visitor, Options
13
+ from Cython.TestUtils import TransformTest
14
+
15
+ TOOLS_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'Tools'))
16
+
17
+
18
+ @contextmanager
19
+ def _tempfile(code):
20
+ code = dedent(code)
21
+ if not isinstance(code, bytes):
22
+ code = code.encode('utf8')
23
+
24
+ with NamedTemporaryFile(suffix='.py') as f:
25
+ f.write(code)
26
+ f.seek(0)
27
+ yield f
28
+
29
+
30
+ def _test_typing(code, inject=False):
31
+ sys.path.insert(0, TOOLS_DIR)
32
+ try:
33
+ import jedityper
34
+ finally:
35
+ sys.path.remove(TOOLS_DIR)
36
+ lines = []
37
+ with _tempfile(code) as f:
38
+ types = jedityper.analyse(f.name)
39
+ if inject:
40
+ lines = jedityper.inject_types(f.name, types)
41
+ return types, lines
42
+
43
+
44
+ class DeclarationsFinder(Visitor.VisitorTransform):
45
+ directives = None
46
+
47
+ visit_Node = Visitor.VisitorTransform.recurse_to_children
48
+
49
+ def visit_CompilerDirectivesMixin(self, node):
50
+ if not self.directives:
51
+ self.directives = []
52
+ self.directives.append(node)
53
+ self.visitchildren(node)
54
+ return node
55
+
56
+
57
+ class TestJediTyper(TransformTest):
58
+ def _test(self, code):
59
+ return _test_typing(code)[0]
60
+
61
+ def test_typing_global_int_loop(self):
62
+ code = '''\
63
+ for i in range(10):
64
+ a = i + 1
65
+ '''
66
+ types = self._test(code)
67
+ self.assertIn((None, (1, 0)), types)
68
+ variables = types.pop((None, (1, 0)))
69
+ self.assertFalse(types)
70
+ self.assertEqual({'a': {'int'}, 'i': {'int'}}, variables)
71
+
72
+ def test_typing_function_int_loop(self):
73
+ code = '''\
74
+ def func(x):
75
+ for i in range(x):
76
+ a = i + 1
77
+ return a
78
+ '''
79
+ types = self._test(code)
80
+ self.assertIn(('func', (1, 0)), types)
81
+ variables = types.pop(('func', (1, 0)))
82
+ self.assertFalse(types)
83
+ self.assertEqual({'a': {'int'}, 'i': {'int'}}, variables)
84
+
85
+ def test_conflicting_types_in_function(self):
86
+ code = '''\
87
+ def func(a, b):
88
+ print(a)
89
+ a = 1
90
+ b += a
91
+ a = 'abc'
92
+ return a, str(b)
93
+
94
+ print(func(1.5, 2))
95
+ '''
96
+ types = self._test(code)
97
+ self.assertIn(('func', (1, 0)), types)
98
+ variables = types.pop(('func', (1, 0)))
99
+ self.assertFalse(types)
100
+ self.assertEqual({'a': {'float', 'int', 'str'}, 'b': {'int'}}, variables)
101
+
102
+ def _test_typing_function_char_loop(self):
103
+ code = '''\
104
+ def func(x):
105
+ l = []
106
+ for c in x:
107
+ l.append(c)
108
+ return l
109
+
110
+ print(func('abcdefg'))
111
+ '''
112
+ types = self._test(code)
113
+ self.assertIn(('func', (1, 0)), types)
114
+ variables = types.pop(('func', (1, 0)))
115
+ self.assertFalse(types)
116
+ self.assertEqual({'a': {'int'}, 'i': {'int'}}, variables)
117
+
118
+ def test_typing_global_list(self):
119
+ code = '''\
120
+ a = [x for x in range(10)]
121
+ b = list(range(10))
122
+ c = a + b
123
+ d = [0]*10
124
+ '''
125
+ types = self._test(code)
126
+ self.assertIn((None, (1, 0)), types)
127
+ variables = types.pop((None, (1, 0)))
128
+ self.assertFalse(types)
129
+ self.assertEqual({'a': {'list'}, 'b': {'list'}, 'c': {'list'}, 'd': {'list'}}, variables)
130
+
131
+ def test_typing_function_list(self):
132
+ code = '''\
133
+ def func(x):
134
+ a = [[], []]
135
+ b = [0]* 10 + a
136
+ c = a[0]
137
+
138
+ print(func([0]*100))
139
+ '''
140
+ types = self._test(code)
141
+ self.assertIn(('func', (1, 0)), types)
142
+ variables = types.pop(('func', (1, 0)))
143
+ self.assertFalse(types)
144
+ self.assertEqual({'a': {'list'}, 'b': {'list'}, 'c': {'list'}, 'x': {'list'}}, variables)
145
+
146
+ def test_typing_global_dict(self):
147
+ code = '''\
148
+ a = dict()
149
+ b = {i: i**2 for i in range(10)}
150
+ c = a
151
+ '''
152
+ types = self._test(code)
153
+ self.assertIn((None, (1, 0)), types)
154
+ variables = types.pop((None, (1, 0)))
155
+ self.assertFalse(types)
156
+ self.assertEqual({'a': {'dict'}, 'b': {'dict'}, 'c': {'dict'}}, variables)
157
+
158
+ def test_typing_function_dict(self):
159
+ code = '''\
160
+ def func(x):
161
+ a = dict()
162
+ b = {i: i**2 for i in range(10)}
163
+ c = x
164
+
165
+ print(func({1:2, 'x':7}))
166
+ '''
167
+ types = self._test(code)
168
+ self.assertIn(('func', (1, 0)), types)
169
+ variables = types.pop(('func', (1, 0)))
170
+ self.assertFalse(types)
171
+ self.assertEqual({'a': {'dict'}, 'b': {'dict'}, 'c': {'dict'}, 'x': {'dict'}}, variables)
172
+
173
+
174
+ def test_typing_global_set(self):
175
+ code = '''\
176
+ a = set()
177
+ # b = {i for i in range(10)} # jedi does not support set comprehension yet
178
+ c = a
179
+ d = {1,2,3}
180
+ e = a | b
181
+ '''
182
+ types = self._test(code)
183
+ self.assertIn((None, (1, 0)), types)
184
+ variables = types.pop((None, (1, 0)))
185
+ self.assertFalse(types)
186
+ self.assertEqual({'a': {'set'}, 'c': {'set'}, 'd': {'set'}, 'e': {'set'}}, variables)
187
+
188
+ def test_typing_function_set(self):
189
+ code = '''\
190
+ def func(x):
191
+ a = set()
192
+ # b = {i for i in range(10)} # jedi does not support set comprehension yet
193
+ c = a
194
+ d = a | b
195
+
196
+ print(func({1,2,3}))
197
+ '''
198
+ types = self._test(code)
199
+ self.assertIn(('func', (1, 0)), types)
200
+ variables = types.pop(('func', (1, 0)))
201
+ self.assertFalse(types)
202
+ self.assertEqual({'a': {'set'}, 'c': {'set'}, 'd': {'set'}, 'x': {'set'}}, variables)
203
+
204
+
205
+ class TestTypeInjection(TestJediTyper):
206
+ """
207
+ Subtype of TestJediTyper that additionally tests type injection and compilation.
208
+ """
209
+ def setUp(self):
210
+ super().setUp()
211
+ compilation_options = Options.CompilationOptions(Options.default_options)
212
+ ctx = Main.Context.from_options(compilation_options)
213
+ transform = InterpretCompilerDirectives(ctx, ctx.compiler_directives)
214
+ transform.module_scope = Symtab.ModuleScope('__main__', None, ctx)
215
+ self.declarations_finder = DeclarationsFinder()
216
+ self.pipeline = [NormalizeTree(None), transform, self.declarations_finder]
217
+
218
+ def _test(self, code):
219
+ types, lines = _test_typing(code, inject=True)
220
+ tree = self.run_pipeline(self.pipeline, ''.join(lines))
221
+ directives = self.declarations_finder.directives
222
+ # TODO: validate directives
223
+ return types
@@ -0,0 +1,110 @@
1
+ from Cython import Shadow
2
+ from Cython.Compiler import Options, CythonScope, PyrexTypes, Errors
3
+ from Cython.TestUtils import TimedTest
4
+
5
+
6
+ class TestShadow(TimedTest):
7
+ def tearDown(self):
8
+ Errors.reset() # help out any future tests
9
+
10
+ def test_all_directives_in_shadow(self):
11
+ missing_directives = []
12
+ extra_directives = []
13
+ for full_directive in Options.directive_types.keys():
14
+ directive, *rest = full_directive.split('.')
15
+
16
+ scope = Options.directive_scopes.get(full_directive)
17
+ if scope and len(scope) == 1 and scope[0] == "module":
18
+ # module-scoped things can't be used from Cython
19
+ if hasattr(Shadow, directive):
20
+ extra_directives.append(full_directive)
21
+ continue
22
+ if full_directive == "staticmethod":
23
+ # staticmethod is a weird special-case and not really intended to be
24
+ # used from the cython module
25
+ continue
26
+
27
+ if not hasattr(Shadow, directive):
28
+ missing_directives.append(full_directive)
29
+ elif rest:
30
+ directive_value = getattr(Shadow, directive)
31
+ for subdirective in rest:
32
+ if (hasattr(type(directive_value), '__getattr__') or
33
+ hasattr(type(directive_value), '__getattribute__')):
34
+ # skip things like "dataclasses" which override attribute lookup
35
+ break
36
+ self.assertEqual(missing_directives, [])
37
+ self.assertEqual(extra_directives, [])
38
+
39
+ def test_all_types_in_shadow(self):
40
+ cython_scope = CythonScope.create_cython_scope(None)
41
+ # Not doing load_cythonscope at this stage because it requires a proper context and
42
+ # Errors.py to be set up
43
+
44
+ missing_types = []
45
+ for key in cython_scope.entries.keys():
46
+ if key.startswith('__') and key.endswith('__'):
47
+ continue
48
+ if key in ('PyTypeObject', 'PyObject_TypeCheck'):
49
+ # These are declared in Shadow.py for reasons that look to
50
+ # be an implementation detail, but it isn't our intention for
51
+ # users to access them from Pure Python mode.
52
+ continue
53
+ if not hasattr(Shadow, key):
54
+ missing_types.append(key)
55
+ self.assertEqual(missing_types, [])
56
+
57
+ def test_int_types_in_shadow(self):
58
+ missing_types = []
59
+ for int_name in Shadow.int_types:
60
+ for sign in ['', 'u', 's']:
61
+ name = sign + int_name
62
+
63
+ if sign and (
64
+ int_name in ['Py_UNICODE', 'Py_UCS4', 'Py_ssize_t',
65
+ 'ssize_t', 'ptrdiff_t', 'Py_hash_t'] or
66
+ name == "usize_t"):
67
+ # size_t is special-cased here a little since ssize_t legitimate
68
+ # but usize_t isn't
69
+ self.assertNotIn(name, dir(Shadow))
70
+ self.assertNotIn('p_' + name, dir(Shadow))
71
+ continue
72
+
73
+ if not hasattr(Shadow, name):
74
+ missing_types.append(name)
75
+
76
+ for ptr in range(1, 4):
77
+ ptr_name = 'p' * ptr + '_' + name
78
+ if not hasattr(Shadow, ptr_name):
79
+ missing_types.append(ptr_name)
80
+ self.assertEqual(missing_types, [])
81
+
82
+ def test_most_types(self):
83
+ # TODO it's unfortunately hard to get a definite list of types to confirm that they're
84
+ # present (because they're obtained by on-the-fly string parsing in `cython_scope.lookup_type`)
85
+
86
+ cython_scope = CythonScope.create_cython_scope(None)
87
+ # Set up just enough of "Context" that CythonScope.lookup_type can fail
88
+ class Context:
89
+ cpp = False
90
+ language_level = 3
91
+ future_directives = []
92
+ cython_scope._context = Context
93
+
94
+ missing_types = []
95
+ missing_lookups = []
96
+ for (signed, longness, name), type_ in PyrexTypes.modifiers_and_name_to_type.items():
97
+ if name == 'object':
98
+ continue # This probably shouldn't be in Shadow
99
+ if not hasattr(Shadow, name):
100
+ missing_types.append(name)
101
+ if not cython_scope.lookup_type(name):
102
+ missing_lookups.append(name)
103
+ for ptr in range(1, 4):
104
+ ptr_name = 'p' * ptr + '_' + name
105
+ if not hasattr(Shadow, ptr_name):
106
+ missing_types.append(ptr_name)
107
+ if not cython_scope.lookup_type(ptr_name):
108
+ missing_lookups.append(ptr_name)
109
+ self.assertEqual(missing_types, [])
110
+ self.assertEqual(missing_lookups, [])
@@ -0,0 +1,68 @@
1
+ from Cython import StringIOTree as stringtree
2
+ from Cython.TestUtils import TimedTest
3
+
4
+ code = """
5
+ cdef int spam # line 1
6
+
7
+ cdef ham():
8
+ a = 1
9
+ b = 2
10
+ c = 3
11
+ d = 4
12
+
13
+ def eggs():
14
+ pass
15
+
16
+ cpdef bacon():
17
+ print spam
18
+ print 'scotch'
19
+ print 'tea?'
20
+ print 'or coffee?' # line 16
21
+ """
22
+
23
+ linemap = dict(enumerate(code.splitlines()))
24
+
25
+
26
+ class TestStringIOTree(TimedTest):
27
+
28
+ def setUp(self):
29
+ self.tree = stringtree.StringIOTree()
30
+ super().setUp()
31
+
32
+ def test_markers(self):
33
+ assert not self.tree.allmarkers()
34
+
35
+ def test_insertion(self):
36
+ self.write_lines((1, 2, 3))
37
+ line_4_to_6_insertion_point = self.tree.insertion_point()
38
+ self.write_lines((7, 8))
39
+ line_9_to_13_insertion_point = self.tree.insertion_point()
40
+ self.write_lines((14, 15, 16))
41
+
42
+ line_4_insertion_point = line_4_to_6_insertion_point.insertion_point()
43
+ self.write_lines((5, 6), tree=line_4_to_6_insertion_point)
44
+
45
+ line_9_to_12_insertion_point = (
46
+ line_9_to_13_insertion_point.insertion_point())
47
+ self.write_line(13, tree=line_9_to_13_insertion_point)
48
+
49
+ self.write_line(4, tree=line_4_insertion_point)
50
+ self.write_line(9, tree=line_9_to_12_insertion_point)
51
+ line_10_insertion_point = line_9_to_12_insertion_point.insertion_point()
52
+ self.write_line(11, tree=line_9_to_12_insertion_point)
53
+ self.write_line(10, tree=line_10_insertion_point)
54
+ self.write_line(12, tree=line_9_to_12_insertion_point)
55
+
56
+ self.assertEqual(self.tree.allmarkers(), list(range(1, 17)))
57
+ self.assertEqual(code.strip(), self.tree.getvalue().strip())
58
+
59
+
60
+ def write_lines(self, linenos, tree=None):
61
+ for lineno in linenos:
62
+ self.write_line(lineno, tree=tree)
63
+
64
+ def write_line(self, lineno, tree=None):
65
+ if tree is None:
66
+ tree = self.tree
67
+ tree.markers.append(lineno)
68
+ tree.write(linemap[lineno] + '\n')
@@ -0,0 +1,89 @@
1
+ import os.path
2
+ import tempfile
3
+ import textwrap
4
+ import shutil
5
+
6
+ from ..TestUtils import TimedTest, write_file, write_newer_file, _parse_pattern
7
+
8
+
9
+ class TestTestUtils(TimedTest):
10
+ def setUp(self):
11
+ super().setUp()
12
+ self.temp_dir = tempfile.mkdtemp()
13
+
14
+ def tearDown(self):
15
+ if self.temp_dir and os.path.isdir(self.temp_dir):
16
+ shutil.rmtree(self.temp_dir)
17
+ super().tearDown()
18
+
19
+ def _test_path(self, filename):
20
+ return os.path.join(self.temp_dir, filename)
21
+
22
+ def _test_write_file(self, content, expected, **kwargs):
23
+ file_path = self._test_path("abcfile")
24
+ write_file(file_path, content, **kwargs)
25
+ assert os.path.isfile(file_path)
26
+
27
+ with open(file_path, 'rb') as f:
28
+ found = f.read()
29
+ assert found == expected, (repr(expected), repr(found))
30
+
31
+ def test_write_file_text(self):
32
+ text = "abcüöä"
33
+ self._test_write_file(text, text.encode('utf8'))
34
+
35
+ def test_write_file_dedent(self):
36
+ text = """
37
+ A horse is a horse,
38
+ of course, of course,
39
+ And no one can talk to a horse
40
+ of course
41
+ """
42
+ self._test_write_file(text, textwrap.dedent(text).encode('utf8'), dedent=True)
43
+
44
+ def test_write_file_bytes(self):
45
+ self._test_write_file(b"ab\0c", b"ab\0c")
46
+
47
+ def test_write_newer_file(self):
48
+ file_path_1 = self._test_path("abcfile1.txt")
49
+ file_path_2 = self._test_path("abcfile2.txt")
50
+ write_file(file_path_1, "abc")
51
+ assert os.path.isfile(file_path_1)
52
+ write_newer_file(file_path_2, file_path_1, "xyz")
53
+ assert os.path.isfile(file_path_2)
54
+ assert os.path.getmtime(file_path_2) > os.path.getmtime(file_path_1)
55
+
56
+ def test_write_newer_file_same(self):
57
+ file_path = self._test_path("abcfile.txt")
58
+ write_file(file_path, "abc")
59
+ mtime = os.path.getmtime(file_path)
60
+ write_newer_file(file_path, file_path, "xyz")
61
+ assert os.path.getmtime(file_path) > mtime
62
+
63
+ def test_write_newer_file_fresh(self):
64
+ file_path = self._test_path("abcfile.txt")
65
+ assert not os.path.exists(file_path)
66
+ write_newer_file(file_path, file_path, "xyz")
67
+ assert os.path.isfile(file_path)
68
+
69
+ def test_parse_pattern(self):
70
+ self.assertEqual(
71
+ _parse_pattern("pattern"),
72
+ (None, None, 'pattern')
73
+ )
74
+ self.assertEqual(
75
+ _parse_pattern("/start/:pattern"),
76
+ ('start', None, 'pattern')
77
+ )
78
+ self.assertEqual(
79
+ _parse_pattern(":/end/ pattern"),
80
+ (None, 'end', 'pattern')
81
+ )
82
+ self.assertEqual(
83
+ _parse_pattern("/start/:/end/ pattern"),
84
+ ('start', 'end', 'pattern')
85
+ )
86
+ self.assertEqual(
87
+ _parse_pattern("/start/:/end/pattern"),
88
+ ('start', 'end', 'pattern')
89
+ )
@@ -0,0 +1 @@
1
+ # empty file