diff --git a/python-rope.changes b/python-rope.changes index c446860..9ac847e 100644 --- a/python-rope.changes +++ b/python-rope.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Wed Mar 31 12:05:06 UTC 2021 - Ben Greiner + +- Add rope-pr333-py39.patch for python39 compatibility + gh#python-rope/rope#333 + ------------------------------------------------------------------- Mon Oct 19 11:31:41 UTC 2020 - Matej Cepl diff --git a/python-rope.spec b/python-rope.spec index c276ee0..c1d2d7a 100644 --- a/python-rope.spec +++ b/python-rope.spec @@ -1,7 +1,7 @@ # # spec file for package python-rope # -# Copyright (c) 2020 SUSE LLC +# Copyright (c) 2021 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -26,6 +26,8 @@ License: LGPL-3.0-or-later Group: Development/Languages/Python URL: https://github.com/python-rope/rope Source: https://files.pythonhosted.org/packages/source/r/rope/rope-%{version}.tar.gz +# PATCH-FIX-UPSTREAM rope-pr333-py39.patch gh#python-rope/rope#333 +Patch1: rope-pr333-py39.patch BuildRequires: %{python_module pytest} BuildRequires: %{python_module setuptools} BuildRequires: fdupes @@ -59,6 +61,7 @@ export LANG=en_US.UTF-8 %license COPYING %doc README.rst %doc docs/ -%{python_sitelib}/ +%{python_sitelib}/rope +%{python_sitelib}/rope-%{version}*-info %changelog diff --git a/rope-pr333-py39.patch b/rope-pr333-py39.patch new file mode 100644 index 0000000..9478922 --- /dev/null +++ b/rope-pr333-py39.patch @@ -0,0 +1,155 @@ +From 5fbce2b97ba49c0900d882043acf3ff46e936d38 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Mat=C4=9Bj=20Cepl?= +Date: Mon, 15 Mar 2021 22:06:35 +0100 +Subject: [PATCH 1/4] Test for Python 3.9 as well + +--- + .github/workflows/main.yml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +From a63ae26035c5493dc8b7c3bf6a70fc05dba2be98 Mon Sep 17 00:00:00 2001 +From: Matt Turner +Date: Sun, 14 Mar 2021 10:17:47 -0400 +Subject: [PATCH 2/4] Fix test expectations for Python 3.9 AST changes + +Fixes the following two tests under Python 3.9: + +FAILED ropetest/refactor/patchedasttest.py::PatchedASTTest::test_ext_slice_node - AssertionError: Node cannot be found +FAILED ropetest/refactor/patchedasttest.py::PatchedASTTest::test_simple_subscript - AssertionError: False is not true : Expected but was + +The ast module in Python 3.9 has some API changes. Quoting [1]: + + Simplified AST for subscription. Simple indices will be represented + by their value, extended slices will be represented as tuples. + Index(value) will return a value itself, ExtSlice(slices) will + return Tuple(slices, Load()). (Contributed by Serhiy Storchaka in + bpo-34822.) + +[1] https://docs.python.org/3/whatsnew/3.9.html#changes-in-the-python-api +--- + ropetest/refactor/patchedasttest.py | 18 +++++++++++++----- + 1 file changed, 13 insertions(+), 5 deletions(-) + +diff --git a/ropetest/refactor/patchedasttest.py b/ropetest/refactor/patchedasttest.py +index 04df3752..74a9d9a6 100644 +--- a/ropetest/refactor/patchedasttest.py ++++ b/ropetest/refactor/patchedasttest.py +@@ -838,8 +838,12 @@ def test_ext_slice_node(self): + source = 'x = xs[0,:]\n' + ast_frag = patchedast.get_patched_ast(source, True) + checker = _ResultChecker(self, ast_frag) +- checker.check_region('ExtSlice', 7, len(source) - 2) +- checker.check_children('ExtSlice', ['Index', '', ',', '', 'Slice']) ++ if sys.version_info >= (3, 9): ++ checker.check_region('Tuple', 7, len(source) - 2) ++ checker.check_children('Tuple', ['Num', '', ',', '', 'Slice']) ++ else: ++ checker.check_region('ExtSlice', 7, len(source) - 2) ++ checker.check_children('ExtSlice', ['Index', '', ',', '', 'Slice']) + + def test_simple_module_node(self): + source = 'pass\n' +@@ -933,9 +937,13 @@ def test_simple_subscript(self): + source = 'a[1]\n' + ast_frag = patchedast.get_patched_ast(source, True) + checker = _ResultChecker(self, ast_frag) +- checker.check_children( +- 'Subscript', ['Name', '', '[', '', 'Index', '', ']']) +- checker.check_children('Index', ['Num']) ++ if sys.version_info >= (3, 9): ++ checker.check_children( ++ 'Subscript', ['Name', '', '[', '', 'Num', '', ']']) ++ else: ++ checker.check_children( ++ 'Subscript', ['Name', '', '[', '', 'Index', '', ']']) ++ checker.check_children('Index', ['Num']) + + def test_tuple_node(self): + source = '(1, 2)\n' + +From 02284e4151c2b1d549a64175ef0e3212b7737c56 Mon Sep 17 00:00:00 2001 +From: Matt Turner +Date: Sun, 14 Mar 2021 10:54:48 -0400 +Subject: [PATCH 3/4] Handle AST.expr in _Subscript() + +The ast module in Python 3.9 has some API changes. Quoting [1]: + + Simplified AST for subscription. Simple indices will be represented + by their value, extended slices will be represented as tuples. + Index(value) will return a value itself, ExtSlice(slices) will + return Tuple(slices, Load()). (Contributed by Serhiy Storchaka in + bpo-34822.) + +[1] https://docs.python.org/3/whatsnew/3.9.html#changes-in-the-python-api + +isinstance(thing, ast.Index) always return false in Python >= 3.9, so we +need to handle... whatever the value is now. ast.expr catches 20 of the +remaining 24 failures. The remaining 4 are resolved in the next patch. + +Fixes: #299 +--- + rope/base/evaluate.py | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/rope/base/evaluate.py b/rope/base/evaluate.py +index 610d34e0..4634981a 100644 +--- a/rope/base/evaluate.py ++++ b/rope/base/evaluate.py +@@ -307,6 +307,9 @@ def _Subscript(self, node): + elif isinstance(node.slice, ast.Slice): + self._call_function(node.value, '__getitem__', + [node.slice]) ++ elif isinstance(node.slice, ast.expr): ++ self._call_function(node.value, '__getitem__', ++ [node.value]) + + def _Slice(self, node): + self.result = self._get_builtin_name('slice') + +From 46a3403a06aaadf9d17f87b38300c4e3febe47c5 Mon Sep 17 00:00:00 2001 +From: Matt Turner +Date: Fri, 19 Mar 2021 18:41:53 -0400 +Subject: [PATCH 4/4] Handle AST.expr in static object analysis + +The ast module in Python 3.9 has some API changes. Quoting [1]: + + Simplified AST for subscription. Simple indices will be represented + by their value, extended slices will be represented as tuples. + Index(value) will return a value itself, ExtSlice(slices) will + return Tuple(slices, Load()). (Contributed by Serhiy Storchaka in + bpo-34822.) + +[1] https://docs.python.org/3/whatsnew/3.9.html#changes-in-the-python-api + +This fixes the remaining 4 failures under Python 3.9. + +FAILED ropetest/advanced_oi_test.py::NewStaticOITest::test_static_oi_for_dicts_depending_on_append_function +FAILED ropetest/advanced_oi_test.py::NewStaticOITest::test_static_oi_for_dicts_depending_on_for_loops +FAILED ropetest/advanced_oi_test.py::NewStaticOITest::test_static_oi_for_dicts_depending_on_update +FAILED ropetest/advanced_oi_test.py::NewStaticOITest::test_static_oi_for_lists_per_object_for_set_item + +Fixes: #299 +--- + rope/base/oi/soa.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/rope/base/oi/soa.py b/rope/base/oi/soa.py +index 8ef17aee..20ab567e 100644 +--- a/rope/base/oi/soa.py ++++ b/rope/base/oi/soa.py +@@ -126,7 +126,7 @@ def _evaluate_assign_value(self, node, nodes, type_hint=False): + for subscript, levels in nodes: + instance = evaluate.eval_node(self.scope, subscript.value) + args_pynames = [evaluate.eval_node(self.scope, +- subscript.slice.value)] ++ subscript.slice)] + value = rope.base.oi.soi._infer_assignment( + rope.base.pynames.AssignmentValue(node.value, levels, + type_hint=type_hint), +@@ -149,5 +149,5 @@ def __init__(self): + + def _added(self, node, levels): + if isinstance(node, rope.base.ast.Subscript) and \ +- isinstance(node.slice, rope.base.ast.Index): ++ isinstance(node.slice, (rope.base.ast.Index, rope.base.ast.expr)): + self.nodes.append((node, levels))