summaryrefslogtreecommitdiff
path: root/dev-python/astor/files
diff options
context:
space:
mode:
Diffstat (limited to 'dev-python/astor/files')
-rw-r--r--dev-python/astor/files/astor-0.8.1-py314.patch99
1 files changed, 99 insertions, 0 deletions
diff --git a/dev-python/astor/files/astor-0.8.1-py314.patch b/dev-python/astor/files/astor-0.8.1-py314.patch
new file mode 100644
index 000000000000..e5af45648393
--- /dev/null
+++ b/dev-python/astor/files/astor-0.8.1-py314.patch
@@ -0,0 +1,99 @@
+From d0b5563cc1e263f08df9312d89a7691167448f4d Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= <mgorny@gentoo.org>
+Date: Wed, 14 May 2025 19:52:30 +0200
+Subject: [PATCH] Fix compatibility with Python 3.14 (mostly)
+
+Fix the code and the test suite to work with Python 3.14, where
+deprecated constant-like AST nodes were removed. Notably:
+
+1. Skip tests for deprecated nodes in Python 3.14.
+
+2. Use `ast.Constant` over `ast.Num` for non-deprecated code
+ in Python 3.6+.
+
+3. Check for `ast.Str` only in Python < 3.14, and handle `ast.Constant`
+ being used to represent a string instead.
+
+With these changes, all tests except for:
+
+ tests/test_rtrip.py::RtripTestCase::test_convert_stdlib
+
+pass. However, this particular test also hanged for me with older Python
+versions.
+
+Related to #217
+---
+ astor/code_gen.py | 9 +++++++--
+ tests/test_code_gen.py | 11 ++++++++---
+ 2 files changed, 15 insertions(+), 5 deletions(-)
+
+diff --git a/astor/code_gen.py b/astor/code_gen.py
+index b2bae12..4330f49 100644
+--- a/astor/code_gen.py
++++ b/astor/code_gen.py
+@@ -692,6 +692,7 @@ def _handle_string_constant(self, node, value, is_joined=False):
+ current_line = ''.join(current_line)
+
+ has_ast_constant = sys.version_info >= (3, 6)
++ has_ast_str = sys.version_info < (3, 14)
+
+ if is_joined:
+ # Handle new f-strings. This is a bit complicated, because
+@@ -700,7 +701,7 @@ def _handle_string_constant(self, node, value, is_joined=False):
+
+ def recurse(node):
+ for value in node.values:
+- if isinstance(value, ast.Str):
++ if has_ast_str and isinstance(value, ast.Str):
+ # Double up braces to escape them.
+ self.write(value.s.replace('{', '{{').replace('}', '}}'))
+ elif isinstance(value, ast.FormattedValue):
+@@ -713,7 +714,11 @@ def recurse(node):
+ self.write(':')
+ recurse(value.format_spec)
+ elif has_ast_constant and isinstance(value, ast.Constant):
+- self.write(value.value)
++ if isinstance(value.value, str):
++ # Double up braces to escape them.
++ self.write(value.value.replace('{', '{{').replace('}', '}}'))
++ else:
++ self.write(value.value)
+ else:
+ kind = type(value).__name__
+ assert False, 'Invalid node %s inside JoinedStr' % kind
+diff --git a/tests/test_code_gen.py b/tests/test_code_gen.py
+index e828eb9..1825030 100644
+--- a/tests/test_code_gen.py
++++ b/tests/test_code_gen.py
+@@ -28,7 +28,10 @@ def astorexpr(x):
+ return eval(astor.to_source(ast.Expression(body=x)))
+
+ def astornum(x):
+- return astorexpr(ast.Num(n=x))
++ if sys.version_info >= (3, 6):
++ return astorexpr(ast.Constant(x))
++ else:
++ return astorexpr(ast.Num(n=x))
+
+ class Comparisons(object):
+
+@@ -515,8 +518,8 @@ def test_deprecated_constants_as_name(self):
+ ast.Assign(targets=[ast.Name(id='spam')], value=ast.Name(id='None')),
+ "spam = None")
+
+- @unittest.skipUnless(sys.version_info >= (3, 4),
+- "ast.NameConstant introduced in Python 3.4")
++ @unittest.skipUnless((3, 4) <= sys.version_info < (3, 14),
++ "ast.NameConstant introduced in Python 3.4, removed in 3.14")
+ def test_deprecated_name_constants(self):
+ self.assertAstEqualsSource(
+ ast.Assign(targets=[ast.Name(id='spam')], value=ast.NameConstant(value=True)),
+@@ -530,6 +533,8 @@ def test_deprecated_name_constants(self):
+ ast.Assign(targets=[ast.Name(id='spam')], value=ast.NameConstant(value=None)),
+ "spam = None")
+
++ @unittest.skipIf(sys.version_info >= (3, 14),
++ "Deprecated Constant nodes removed in Python 3.14")
+ def test_deprecated_constant_nodes(self):
+ self.assertAstEqualsSource(
+ ast.Assign(targets=[ast.Name(id='spam')], value=ast.Num(3)),