Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-pegen for openSUSE:Factory checked in at 2026-04-08 17:16:58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-pegen (Old) and /work/SRC/openSUSE:Factory/.python-pegen.new.21863 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pegen" Wed Apr 8 17:16:58 2026 rev:5 rq:1345107 version:0.3.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-pegen/python-pegen.changes 2024-12-04 15:27:09.237302555 +0100 +++ /work/SRC/openSUSE:Factory/.python-pegen.new.21863/python-pegen.changes 2026-04-08 17:16:59.975051701 +0200 @@ -1,0 +2,6 @@ +Wed Apr 8 05:19:56 UTC 2026 - Steve Kowalik <[email protected]> + +- Add patch support-python-314.patch: + * Support Python 3.14's grammar changes. + +------------------------------------------------------------------- New: ---- support-python-314.patch ----------(New B)---------- New: - Add patch support-python-314.patch: * Support Python 3.14's grammar changes. ----------(New E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-pegen.spec ++++++ --- /var/tmp/diff_new_pack.zI1HiB/_old 2026-04-08 17:17:01.343107946 +0200 +++ /var/tmp/diff_new_pack.zI1HiB/_new 2026-04-08 17:17:01.347108110 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-pegen # -# Copyright (c) 2024 SUSE LLC +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -25,6 +25,8 @@ Source: https://files.pythonhosted.org/packages/source/p/pegen/pegen-%{version}.tar.gz # PATCH-FIX-UPSTREAM gh#we-like-parsers/pegen#104 Patch0: support-python-313.patch +# PATCH-FIX-UPSTREAM gh#we-like-parsers/pegen#112 +Patch1: support-python-314.patch BuildRequires: %{python_module pip} BuildRequires: %{python_module pytest} BuildRequires: %{python_module setuptools_scm} ++++++ support-python-314.patch ++++++ >From 30839512f752c69fcec5d63c23ae7b9e46c151a3 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian <[email protected]> Date: Fri, 2 Jan 2026 16:31:24 +0100 Subject: [PATCH 1/5] Improve SyntaxError messages for pattern captures python/cpython@23f159ae711d84177e8ce34cd9a6c8a762de64ac improved the SyntaxError messages for invalid pattern targets. This adds support for the more detailed messages in Python 3.14 and above. --- data/python.gram | 7 +++++-- tests/python_parser/test_syntax_error_handling.py | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) Index: pegen-0.3.0/data/python.gram =================================================================== --- pegen-0.3.0.orig/data/python.gram +++ pegen-0.3.0/data/python.gram @@ -1047,13 +1047,29 @@ try_stmt[ast.Try]: except_block[ast.ExceptHandler]: | invalid_except_stmt_indent + | 'except' e=expressions ':' b=block { + PY_VERSION >= (3, 14); + ast.ExceptHandler(type=e, name=None, body=b, LOCATIONS) } + | 'except' e=expression 'as' t=NAME ':' b=block { + PY_VERSION >= (3, 14); + ast.ExceptHandler(type=e, name=t.string, body=b, LOCATIONS) } | 'except' e=expression t=['as' z=NAME { z.string }] ':' b=block { + PY_VERSION < (3, 14); ast.ExceptHandler(type=e, name=t, body=b, LOCATIONS) } | 'except' ':' b=block { ast.ExceptHandler(type=None, name=None, body=b, LOCATIONS) } | invalid_except_stmt except_star_block[ast.ExceptHandler]: | invalid_except_star_stmt_indent + | 'except' '*' e=expressions ':' b=block { + PY_VERSION >= (3, 14); + ast.ExceptHandler(type=e, name=None, body=b, LOCATIONS) + } + | 'except' '*' e=expression 'as' t=NAME ':' b=block { + PY_VERSION >= (3, 14); + ast.ExceptHandler(type=e, name=t.string, body=b, LOCATIONS) + } | 'except' '*' e=expression t=['as' z=NAME { z.string }] ':' b=block { + PY_VERSION < (3, 14); ast.ExceptHandler(type=e, name=t, body=b, LOCATIONS) } | invalid_except_stmt @@ -2255,7 +2271,12 @@ invalid_try_stmt[NoReturn]: ) } invalid_except_stmt[None]: + | 'except' '*'? a=expression ',' expressions 'as' NAME ':' { + PY_VERSION >= (3, 14); + self.raise_syntax_error_starting_from("multiple exception types must be parenthesized when using 'as'", a) + } | 'except' '*'? a=expression ',' expressions ['as' NAME ] ':' { + PY_VERSION < (3, 14); self.raise_syntax_error_starting_from("multiple exception types must be parenthesized", a) } | a='except' '*'? expression ['as' NAME ] NEWLINE { self.raise_syntax_error("expected ':'") } @@ -2314,8 +2335,11 @@ invalid_as_pattern[NoReturn]: | or_pattern 'as' a="_" { self.raise_syntax_error_known_location("cannot use '_' as a target", a) } - | or_pattern 'as' !NAME a=expression { - self.raise_syntax_error_known_location("invalid pattern target", a) + | or_pattern 'as' a=expression { + self.raise_syntax_error_known_location( + f"cannot use {self.get_expr_name(a)} as pattern target", a) + if self.py_version >= (3, 14) + else self.raise_syntax_error_known_location("invalid pattern target", a) } invalid_class_pattern[NoReturn]: | name_or_attr '(' a=invalid_class_argument_pattern { Index: pegen-0.3.0/tests/python_parser/test_syntax_error_handling.py =================================================================== --- pegen-0.3.0.orig/tests/python_parser/test_syntax_error_handling.py +++ pegen-0.3.0/tests/python_parser/test_syntax_error_handling.py @@ -976,26 +976,32 @@ def test_invalid_try_stmt( sys.version_info < (3, 11), reason="Syntax unsupported before 3.11+" ), ), - ( + pytest.param( "try:\n\tpass\nexcept ValueError, IndexError:", SyntaxError, "multiple exception types must be parenthesized", (3, 8), (3, 30), + marks=pytest.mark.skipif( + sys.version_info >= (3, 14), reason="PEP 758 allows unparenthesized except and except* blocks" + ), ), - ( + pytest.param( "try:\n\tpass\nexcept ValueError, IndexError,:", SyntaxError, "multiple exception types must be parenthesized", (3, 8), (3, 31), + marks=pytest.mark.skipif( + sys.version_info >= (3, 14), reason="PEP 758 allows unparenthesized except and except* blocks" + ), ), ( "try:\n\tpass\nexcept ValueError, IndexError, a=1:", SyntaxError, "invalid syntax", - (3, 18), - (3, 19), + (3, 33) if sys.version_info >= (3, 14) else (3, 18), + (3, 34) if sys.version_info >= (3, 14) else (3, 19), ), ( "try:\n\tpass\nexcept Exception\npass", @@ -1156,7 +1162,7 @@ def test_invalid_case_stmt( ( "match a:\n\tcase 1 as 1+1:\n\t\tpass", SyntaxError, - "invalid pattern target", + "cannot use expression as pattern target" if sys.version_info >= (3, 14) else "invalid pattern target", (2, 12), (2, 15), ), Index: pegen-0.3.0/src/pegen/python_generator.py =================================================================== --- pegen-0.3.0.orig/src/pegen/python_generator.py +++ pegen-0.3.0/src/pegen/python_generator.py @@ -397,6 +397,7 @@ class PythonParserGenerator(ParserGenera locations = False unreachable = False used = None + version_check = None if action: # Replace magic name in the action rule if "LOCATIONS" in action: @@ -405,6 +406,11 @@ class PythonParserGenerator(ParserGenera if "UNREACHABLE" in action: unreachable = True action = action.replace("UNREACHABLE", self.unreachable_formatting) + if ";" in action: + parts = action.split(";", 1) + if parts[0].startswith("PY_VERSION"): + action = parts[1].lstrip() + version_check = parts[0].replace("PY_VERSION", "self.py_version") # Extract the names actually used in the action. used = self.usednamesvisitor.visit(ast.parse(action)) @@ -423,6 +429,11 @@ class PythonParserGenerator(ParserGenera if has_invalid: self.print("self.call_invalid_rules") first = False + if version_check: + if not first: + self.print("and") + self.print(f"({version_check})") + first = False for item in node.items: if first: first = False Index: pegen-0.3.0/.github/workflows/test.yml =================================================================== --- pegen-0.3.0.orig/.github/workflows/test.yml +++ pegen-0.3.0/.github/workflows/test.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.8','3.9','3.10', '3.11', '3.12', '3.13'] + python-version: ['3.8','3.9','3.10', '3.11', '3.12', '3.13', '3.14'] steps: - uses: actions/checkout@v4 - name: Get history and tags for SCM versioning to work Index: pegen-0.3.0/pyproject.toml =================================================================== --- pegen-0.3.0.orig/pyproject.toml +++ pegen-0.3.0/pyproject.toml @@ -24,6 +24,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Programming Language :: Python :: 3 :: Only", ] keywords = ["parser", "CPython", "PEG", "pegen"]
