commit:     2ad017be9d2702c92fa40535890594722e66835d
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Wed May 14 08:35:08 2025 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Wed May 14 19:23:15 2025 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=2ad017be

dev-python/asttokens: Enable py3.14

Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 dev-python/asttokens/asttokens-3.0.0-r1.ebuild     | 39 ++++++++++++++
 .../asttokens/files/asttokens-3.0.0-py314.patch    | 63 ++++++++++++++++++++++
 2 files changed, 102 insertions(+)

diff --git a/dev-python/asttokens/asttokens-3.0.0-r1.ebuild 
b/dev-python/asttokens/asttokens-3.0.0-r1.ebuild
new file mode 100644
index 000000000000..430bddcfefc8
--- /dev/null
+++ b/dev-python/asttokens/asttokens-3.0.0-r1.ebuild
@@ -0,0 +1,39 @@
+# Copyright 2020-2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=setuptools
+PYTHON_COMPAT=( pypy3_11 python3_{11..14} )
+
+inherit distutils-r1
+
+DESCRIPTION="Annotate Python AST trees with source text and token information"
+HOMEPAGE="
+       https://github.com/gristlabs/asttokens/
+       https://pypi.org/project/asttokens/
+"
+SRC_URI="
+       https://github.com/gristlabs/asttokens/archive/v${PV}.tar.gz
+               -> ${P}.gh.tar.gz
+"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~ppc ~ppc64 ~riscv ~s390 
~sparc ~x86 ~arm64-macos ~x64-macos"
+
+BDEPEND="
+       dev-python/setuptools-scm[${PYTHON_USEDEP}]
+       test? (
+               dev-python/astroid[${PYTHON_USEDEP}]
+       )
+"
+
+distutils_enable_tests pytest
+
+export SETUPTOOLS_SCM_PRETEND_VERSION=${PV}
+
+PATCHES=(
+       # https://github.com/gristlabs/asttokens/pull/157
+       "${FILESDIR}/${P}-py314.patch"
+)

diff --git a/dev-python/asttokens/files/asttokens-3.0.0-py314.patch 
b/dev-python/asttokens/files/asttokens-3.0.0-py314.patch
new file mode 100644
index 000000000000..a8b92f6d11cd
--- /dev/null
+++ b/dev-python/asttokens/files/asttokens-3.0.0-py314.patch
@@ -0,0 +1,63 @@
+From 442d8615b2e60ba2274edd7cc24fc631a369bf02 Mon Sep 17 00:00:00 2001
+From: Karolina Surma <[email protected]>
+Date: Tue, 7 Jan 2025 10:29:52 +0100
+Subject: [PATCH] Replace ast.Str usages with ast.Constant
+
+Per What's new in Python 3.14:
+ast.Str has been deprecated since Python 3.8, and have emitted deprecation
+warnings since Python 3.12.
+https://docs.python.org/dev/whatsnew/3.14.html#id3
+---
+ tests/test_asttokens.py | 2 +-
+ tests/test_tokenless.py | 4 ++--
+ tests/test_util.py      | 2 +-
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/tests/test_asttokens.py b/tests/test_asttokens.py
+index b9489cb..c654af3 100644
+--- a/tests/test_asttokens.py
++++ b/tests/test_asttokens.py
+@@ -125,7 +125,7 @@ def test_unicode_offsets(self):
+ 
+     # Verify that ast parser produces offsets as we expect. This is just to 
inform the
+     # implementation.
+-    string_node = next(n for n in ast.walk(root) if isinstance(n, ast.Str))
++    string_node = next(n for n in ast.walk(root) if isinstance(n, 
ast.Constant))
+     self.assertEqual(string_node.lineno, 1)
+     self.assertEqual(string_node.col_offset, 4)
+ 
+diff --git a/tests/test_tokenless.py b/tests/test_tokenless.py
+index ab2f3d6..881c69a 100644
+--- a/tests/test_tokenless.py
++++ b/tests/test_tokenless.py
+@@ -47,7 +47,7 @@ def is_fstring_format_spec(node):
+       and len(node.values) == 1
+       and (
+           (
+-              isinstance(node.values[0], ast.Str)
++              isinstance(node.values[0], ast.Constant)
+               and node.values[0].value in ['.2f']
+           ) or (
+               isinstance(node.values[0], ast.FormattedValue)
+@@ -97,7 +97,7 @@ def check_node(self, atok, node):
+       atok_text = atok.get_text(node, padded=padded)
+       if ast_text:
+         if sys.version_info < (3, 12) and (
+-          ast_text.startswith("f") and isinstance(node, (ast.Str, 
ast.FormattedValue))
++          ast_text.startswith("f") and isinstance(node, (ast.Constant, 
ast.FormattedValue))
+           or is_fstring_format_spec(node)
+           or (not fstring_positions_work() and is_fstring_internal_node(node))
+         ):
+diff --git a/tests/test_util.py b/tests/test_util.py
+index a38fef2..0c7f94d 100644
+--- a/tests/test_util.py
++++ b/tests/test_util.py
+@@ -98,7 +98,7 @@ def test_replace(self):
+     source = "foo(bar(1 + 2), 'hello' + ', ' + 'world')"
+     atok = asttokens.ASTTokens(source, parse=True)
+     names = [n for n in asttokens.util.walk(atok.tree) if isinstance(n, 
ast.Name)]
+-    strings = [n for n in asttokens.util.walk(atok.tree) if isinstance(n, 
ast.Str)]
++    strings = [n for n in asttokens.util.walk(atok.tree) if isinstance(n, 
ast.Constant) and isinstance(n.value, str)]
+     repl1 = [atok.get_text_range(n) + ('TEST',) for n in names]
+     repl2 = [atok.get_text_range(n) + ('val',) for n in strings]
+     self.assertEqual(asttokens.util.replace(source, repl1 + repl2),

Reply via email to