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.
- Cython/Build/BuildExecutable.py +169 -0
- Cython/Build/Cache.py +199 -0
- Cython/Build/Cythonize.py +350 -0
- Cython/Build/Dependencies.py +1314 -0
- Cython/Build/Distutils.py +1 -0
- Cython/Build/Inline.py +463 -0
- Cython/Build/IpythonMagic.py +560 -0
- Cython/Build/SharedModule.py +94 -0
- Cython/Build/Tests/TestCyCache.py +194 -0
- Cython/Build/Tests/TestCythonizeArgsParser.py +481 -0
- Cython/Build/Tests/TestDependencies.py +133 -0
- Cython/Build/Tests/TestInline.py +177 -0
- Cython/Build/Tests/TestIpythonMagic.py +287 -0
- Cython/Build/Tests/TestRecythonize.py +212 -0
- Cython/Build/Tests/TestStripLiterals.py +155 -0
- Cython/Build/Tests/__init__.py +1 -0
- Cython/Build/__init__.py +11 -0
- Cython/CodeWriter.py +815 -0
- Cython/Compiler/AnalysedTreeTransforms.py +97 -0
- Cython/Compiler/Annotate.py +328 -0
- Cython/Compiler/AutoDocTransforms.py +320 -0
- Cython/Compiler/Buffer.py +680 -0
- Cython/Compiler/Builtin.py +984 -0
- Cython/Compiler/CmdLine.py +263 -0
- Cython/Compiler/Code.pxd +149 -0
- Cython/Compiler/Code.py +3746 -0
- Cython/Compiler/Code.pyd +0 -0
- Cython/Compiler/CodeGeneration.py +33 -0
- Cython/Compiler/CythonScope.py +191 -0
- Cython/Compiler/Dataclass.py +864 -0
- Cython/Compiler/DebugFlags.py +24 -0
- Cython/Compiler/Errors.py +297 -0
- Cython/Compiler/ExprNodes.py +15562 -0
- Cython/Compiler/FlowControl.pxd +97 -0
- Cython/Compiler/FlowControl.py +1451 -0
- Cython/Compiler/FlowControl.pyd +0 -0
- Cython/Compiler/FusedNode.py +971 -0
- Cython/Compiler/FusedNode.pyd +0 -0
- Cython/Compiler/Future.py +16 -0
- Cython/Compiler/Interpreter.py +57 -0
- Cython/Compiler/Lexicon.py +421 -0
- Cython/Compiler/LineTable.py +114 -0
- Cython/Compiler/LineTable.pyd +0 -0
- Cython/Compiler/Main.py +857 -0
- Cython/Compiler/MatchCaseNodes.py +259 -0
- Cython/Compiler/MemoryView.py +905 -0
- Cython/Compiler/ModuleNode.py +4235 -0
- Cython/Compiler/Naming.py +363 -0
- Cython/Compiler/Nodes.py +10831 -0
- Cython/Compiler/Optimize.py +5288 -0
- Cython/Compiler/Options.py +843 -0
- Cython/Compiler/ParseTreeTransforms.pxd +78 -0
- Cython/Compiler/ParseTreeTransforms.py +4638 -0
- Cython/Compiler/Parsing.pxd +9 -0
- Cython/Compiler/Parsing.py +4775 -0
- Cython/Compiler/Parsing.pyd +0 -0
- Cython/Compiler/Pipeline.py +439 -0
- Cython/Compiler/PyrexTypes.py +5870 -0
- Cython/Compiler/Pythran.py +232 -0
- Cython/Compiler/Scanning.pxd +48 -0
- Cython/Compiler/Scanning.py +701 -0
- Cython/Compiler/Scanning.pyd +0 -0
- Cython/Compiler/StringEncoding.py +298 -0
- Cython/Compiler/Symtab.py +3073 -0
- Cython/Compiler/Tests/TestBuffer.py +105 -0
- Cython/Compiler/Tests/TestBuiltin.py +72 -0
- Cython/Compiler/Tests/TestCmdLine.py +586 -0
- Cython/Compiler/Tests/TestCode.py +144 -0
- Cython/Compiler/Tests/TestFlowControl.py +65 -0
- Cython/Compiler/Tests/TestGrammar.py +202 -0
- Cython/Compiler/Tests/TestMemView.py +71 -0
- Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
- Cython/Compiler/Tests/TestScanning.py +134 -0
- Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
- Cython/Compiler/Tests/TestStringEncoding.py +21 -0
- Cython/Compiler/Tests/TestTreeFragment.py +63 -0
- Cython/Compiler/Tests/TestTreePath.py +103 -0
- Cython/Compiler/Tests/TestTypes.py +75 -0
- Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
- Cython/Compiler/Tests/TestVisitor.py +61 -0
- Cython/Compiler/Tests/Utils.py +36 -0
- Cython/Compiler/Tests/__init__.py +1 -0
- Cython/Compiler/TreeFragment.py +278 -0
- Cython/Compiler/TreePath.py +303 -0
- Cython/Compiler/TypeInference.py +591 -0
- Cython/Compiler/TypeSlots.py +1174 -0
- Cython/Compiler/UFuncs.py +311 -0
- Cython/Compiler/UtilNodes.py +389 -0
- Cython/Compiler/UtilityCode.py +344 -0
- Cython/Compiler/Version.py +8 -0
- Cython/Compiler/Visitor.pxd +53 -0
- Cython/Compiler/Visitor.py +861 -0
- Cython/Compiler/Visitor.pyd +0 -0
- Cython/Compiler/__init__.py +1 -0
- Cython/Coverage.py +448 -0
- Cython/Debugger/Cygdb.py +177 -0
- Cython/Debugger/DebugWriter.py +82 -0
- Cython/Debugger/Tests/TestLibCython.py +275 -0
- Cython/Debugger/Tests/__init__.py +1 -0
- Cython/Debugger/Tests/cfuncs.c +8 -0
- Cython/Debugger/Tests/codefile +49 -0
- Cython/Debugger/Tests/test_libcython_in_gdb.py +578 -0
- Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
- Cython/Debugger/__init__.py +1 -0
- Cython/Debugger/libcython.py +1548 -0
- Cython/Debugger/libpython.py +2821 -0
- Cython/Debugging.py +20 -0
- Cython/Distutils/__init__.py +2 -0
- Cython/Distutils/build_ext.py +139 -0
- Cython/Distutils/extension.py +96 -0
- Cython/Distutils/old_build_ext.py +351 -0
- Cython/Includes/cpython/__init__.pxd +173 -0
- Cython/Includes/cpython/array.pxd +178 -0
- Cython/Includes/cpython/bool.pxd +37 -0
- Cython/Includes/cpython/buffer.pxd +112 -0
- Cython/Includes/cpython/bytearray.pxd +33 -0
- Cython/Includes/cpython/bytes.pxd +200 -0
- Cython/Includes/cpython/cellobject.pxd +35 -0
- Cython/Includes/cpython/ceval.pxd +8 -0
- Cython/Includes/cpython/codecs.pxd +121 -0
- Cython/Includes/cpython/complex.pxd +60 -0
- Cython/Includes/cpython/contextvars.pxd +145 -0
- Cython/Includes/cpython/conversion.pxd +36 -0
- Cython/Includes/cpython/datetime.pxd +395 -0
- Cython/Includes/cpython/descr.pxd +26 -0
- Cython/Includes/cpython/dict.pxd +187 -0
- Cython/Includes/cpython/exc.pxd +263 -0
- Cython/Includes/cpython/fileobject.pxd +57 -0
- Cython/Includes/cpython/float.pxd +47 -0
- Cython/Includes/cpython/function.pxd +65 -0
- Cython/Includes/cpython/genobject.pxd +25 -0
- Cython/Includes/cpython/getargs.pxd +12 -0
- Cython/Includes/cpython/instance.pxd +25 -0
- Cython/Includes/cpython/iterator.pxd +36 -0
- Cython/Includes/cpython/iterobject.pxd +24 -0
- Cython/Includes/cpython/list.pxd +92 -0
- Cython/Includes/cpython/long.pxd +149 -0
- Cython/Includes/cpython/longintrepr.pxd +14 -0
- Cython/Includes/cpython/mapping.pxd +63 -0
- Cython/Includes/cpython/marshal.pxd +66 -0
- Cython/Includes/cpython/mem.pxd +120 -0
- Cython/Includes/cpython/memoryview.pxd +50 -0
- Cython/Includes/cpython/method.pxd +49 -0
- Cython/Includes/cpython/module.pxd +208 -0
- Cython/Includes/cpython/number.pxd +258 -0
- Cython/Includes/cpython/object.pxd +433 -0
- Cython/Includes/cpython/pycapsule.pxd +143 -0
- Cython/Includes/cpython/pylifecycle.pxd +68 -0
- Cython/Includes/cpython/pyport.pxd +8 -0
- Cython/Includes/cpython/pystate.pxd +95 -0
- Cython/Includes/cpython/pythread.pxd +53 -0
- Cython/Includes/cpython/ref.pxd +141 -0
- Cython/Includes/cpython/sequence.pxd +134 -0
- Cython/Includes/cpython/set.pxd +119 -0
- Cython/Includes/cpython/slice.pxd +70 -0
- Cython/Includes/cpython/time.pxd +129 -0
- Cython/Includes/cpython/tuple.pxd +72 -0
- Cython/Includes/cpython/type.pxd +53 -0
- Cython/Includes/cpython/unicode.pxd +639 -0
- Cython/Includes/cpython/version.pxd +32 -0
- Cython/Includes/cpython/weakref.pxd +78 -0
- Cython/Includes/libc/__init__.pxd +1 -0
- Cython/Includes/libc/complex.pxd +35 -0
- Cython/Includes/libc/errno.pxd +127 -0
- Cython/Includes/libc/float.pxd +43 -0
- Cython/Includes/libc/limits.pxd +28 -0
- Cython/Includes/libc/locale.pxd +46 -0
- Cython/Includes/libc/math.pxd +209 -0
- Cython/Includes/libc/setjmp.pxd +10 -0
- Cython/Includes/libc/signal.pxd +64 -0
- Cython/Includes/libc/stddef.pxd +9 -0
- Cython/Includes/libc/stdint.pxd +105 -0
- Cython/Includes/libc/stdio.pxd +80 -0
- Cython/Includes/libc/stdlib.pxd +72 -0
- Cython/Includes/libc/string.pxd +50 -0
- Cython/Includes/libc/threads.pxd +234 -0
- Cython/Includes/libc/time.pxd +52 -0
- Cython/Includes/libcpp/__init__.pxd +4 -0
- Cython/Includes/libcpp/algorithm.pxd +320 -0
- Cython/Includes/libcpp/any.pxd +16 -0
- Cython/Includes/libcpp/atomic.pxd +59 -0
- Cython/Includes/libcpp/barrier.pxd +22 -0
- Cython/Includes/libcpp/bit.pxd +29 -0
- Cython/Includes/libcpp/cast.pxd +12 -0
- Cython/Includes/libcpp/cmath.pxd +518 -0
- Cython/Includes/libcpp/complex.pxd +106 -0
- Cython/Includes/libcpp/condition_variable.pxd +322 -0
- Cython/Includes/libcpp/deque.pxd +165 -0
- Cython/Includes/libcpp/exception.pxd +86 -0
- Cython/Includes/libcpp/execution.pxd +15 -0
- Cython/Includes/libcpp/forward_list.pxd +63 -0
- Cython/Includes/libcpp/functional.pxd +26 -0
- Cython/Includes/libcpp/future.pxd +103 -0
- Cython/Includes/libcpp/iterator.pxd +34 -0
- Cython/Includes/libcpp/latch.pxd +17 -0
- Cython/Includes/libcpp/limits.pxd +61 -0
- Cython/Includes/libcpp/list.pxd +117 -0
- Cython/Includes/libcpp/map.pxd +252 -0
- Cython/Includes/libcpp/memory.pxd +115 -0
- Cython/Includes/libcpp/mutex.pxd +387 -0
- Cython/Includes/libcpp/numbers.pxd +15 -0
- Cython/Includes/libcpp/numeric.pxd +131 -0
- Cython/Includes/libcpp/optional.pxd +34 -0
- Cython/Includes/libcpp/pair.pxd +1 -0
- Cython/Includes/libcpp/queue.pxd +25 -0
- Cython/Includes/libcpp/random.pxd +166 -0
- Cython/Includes/libcpp/semaphore.pxd +43 -0
- Cython/Includes/libcpp/set.pxd +228 -0
- Cython/Includes/libcpp/shared_mutex.pxd +96 -0
- Cython/Includes/libcpp/span.pxd +87 -0
- Cython/Includes/libcpp/stack.pxd +11 -0
- Cython/Includes/libcpp/stop_token.pxd +117 -0
- Cython/Includes/libcpp/string.pxd +355 -0
- Cython/Includes/libcpp/string_view.pxd +183 -0
- Cython/Includes/libcpp/typeindex.pxd +15 -0
- Cython/Includes/libcpp/typeinfo.pxd +10 -0
- Cython/Includes/libcpp/unordered_map.pxd +193 -0
- Cython/Includes/libcpp/unordered_set.pxd +152 -0
- Cython/Includes/libcpp/utility.pxd +30 -0
- Cython/Includes/libcpp/vector.pxd +186 -0
- Cython/Includes/numpy/math.pxd +150 -0
- Cython/Includes/openmp.pxd +50 -0
- Cython/Includes/posix/__init__.pxd +1 -0
- Cython/Includes/posix/dlfcn.pxd +14 -0
- Cython/Includes/posix/fcntl.pxd +86 -0
- Cython/Includes/posix/ioctl.pxd +4 -0
- Cython/Includes/posix/mman.pxd +101 -0
- Cython/Includes/posix/resource.pxd +57 -0
- Cython/Includes/posix/select.pxd +21 -0
- Cython/Includes/posix/signal.pxd +73 -0
- Cython/Includes/posix/stat.pxd +98 -0
- Cython/Includes/posix/stdio.pxd +37 -0
- Cython/Includes/posix/stdlib.pxd +29 -0
- Cython/Includes/posix/strings.pxd +9 -0
- Cython/Includes/posix/time.pxd +71 -0
- Cython/Includes/posix/types.pxd +30 -0
- Cython/Includes/posix/uio.pxd +26 -0
- Cython/Includes/posix/unistd.pxd +271 -0
- Cython/Includes/posix/wait.pxd +38 -0
- Cython/Plex/Actions.pxd +24 -0
- Cython/Plex/Actions.py +119 -0
- Cython/Plex/Actions.pyd +0 -0
- Cython/Plex/DFA.pxd +14 -0
- Cython/Plex/DFA.py +164 -0
- Cython/Plex/DFA.pyd +0 -0
- Cython/Plex/Errors.py +48 -0
- Cython/Plex/Lexicons.py +178 -0
- Cython/Plex/Machines.pxd +36 -0
- Cython/Plex/Machines.py +238 -0
- Cython/Plex/Machines.pyd +0 -0
- Cython/Plex/Regexps.py +535 -0
- Cython/Plex/Scanners.pxd +45 -0
- Cython/Plex/Scanners.py +328 -0
- Cython/Plex/Scanners.pyd +0 -0
- Cython/Plex/Transitions.pxd +14 -0
- Cython/Plex/Transitions.py +239 -0
- Cython/Plex/Transitions.pyd +0 -0
- Cython/Plex/__init__.py +34 -0
- Cython/Runtime/__init__.py +1 -0
- Cython/Runtime/refnanny.pyd +0 -0
- Cython/Runtime/refnanny.pyx +237 -0
- Cython/Shadow.py +690 -0
- Cython/Shadow.pyi +521 -0
- Cython/StringIOTree.py +170 -0
- Cython/StringIOTree.pyd +0 -0
- Cython/Tempita/__init__.py +4 -0
- Cython/Tempita/_looper.py +154 -0
- Cython/Tempita/_tempita.py +1091 -0
- Cython/Tempita/_tempita.pyd +0 -0
- Cython/TestUtils.py +422 -0
- Cython/Tests/TestCodeWriter.py +128 -0
- Cython/Tests/TestCythonUtils.py +202 -0
- Cython/Tests/TestJediTyper.py +223 -0
- Cython/Tests/TestShadow.py +114 -0
- Cython/Tests/TestStringIOTree.py +67 -0
- Cython/Tests/TestTestUtils.py +90 -0
- Cython/Tests/__init__.py +1 -0
- Cython/Tests/xmlrunner.py +390 -0
- Cython/Utility/AsyncGen.c +1031 -0
- Cython/Utility/Buffer.c +865 -0
- Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
- Cython/Utility/Builtins.c +810 -0
- Cython/Utility/CConvert.pyx +134 -0
- Cython/Utility/CMath.c +104 -0
- Cython/Utility/CommonStructures.c +226 -0
- Cython/Utility/Complex.c +378 -0
- Cython/Utility/Coroutine.c +2300 -0
- Cython/Utility/CpdefEnums.pyx +103 -0
- Cython/Utility/CppConvert.pyx +282 -0
- Cython/Utility/CppSupport.cpp +151 -0
- Cython/Utility/CythonFunction.c +1832 -0
- Cython/Utility/Dataclasses.c +101 -0
- Cython/Utility/Embed.c +121 -0
- Cython/Utility/Exceptions.c +1016 -0
- Cython/Utility/ExtensionTypes.c +996 -0
- Cython/Utility/FunctionArguments.c +1043 -0
- Cython/Utility/FusedFunction.pyx +44 -0
- Cython/Utility/ImportExport.c +907 -0
- Cython/Utility/MemoryView.pxd +188 -0
- Cython/Utility/MemoryView.pyx +1482 -0
- Cython/Utility/MemoryView_C.c +927 -0
- Cython/Utility/ModuleSetupCode.c +3203 -0
- Cython/Utility/NumpyImportArray.c +46 -0
- Cython/Utility/ObjectHandling.c +3273 -0
- Cython/Utility/Optimize.c +1603 -0
- Cython/Utility/Overflow.c +384 -0
- Cython/Utility/Printing.c +86 -0
- Cython/Utility/Profile.c +732 -0
- Cython/Utility/StringTools.c +1379 -0
- Cython/Utility/Synchronization.c +399 -0
- Cython/Utility/TString.c +356 -0
- Cython/Utility/TestCyUtilityLoader.pyx +8 -0
- Cython/Utility/TestCythonScope.pyx +75 -0
- Cython/Utility/TestUtilityLoader.c +12 -0
- Cython/Utility/TypeConversion.c +1385 -0
- Cython/Utility/UFuncs.pyx +50 -0
- Cython/Utility/UFuncs_C.c +89 -0
- Cython/Utility/__init__.py +28 -0
- Cython/Utility/arrayarray.h +167 -0
- Cython/Utils.py +687 -0
- Cython/Utils.pyd +0 -0
- Cython/__init__.py +10 -0
- Cython/__init__.pyi +7 -0
- Cython/py.typed +0 -0
- cython-3.2.0.dist-info/METADATA +85 -0
- cython-3.2.0.dist-info/RECORD +333 -0
- cython-3.2.0.dist-info/WHEEL +5 -0
- cython-3.2.0.dist-info/entry_points.txt +4 -0
- cython-3.2.0.dist-info/top_level.txt +3 -0
- cython.py +29 -0
- pyximport/__init__.py +4 -0
- pyximport/pyxbuild.py +160 -0
- 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()
|