Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-exceptiongroup for
openSUSE:Factory checked in at 2026-02-18 17:04:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-exceptiongroup (Old)
and /work/SRC/openSUSE:Factory/.python-exceptiongroup.new.1977 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-exceptiongroup"
Wed Feb 18 17:04:34 2026 rev:11 rq:1333712 version:1.3.1
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-exceptiongroup/python-exceptiongroup.changes
2025-09-11 14:39:27.180081988 +0200
+++
/work/SRC/openSUSE:Factory/.python-exceptiongroup.new.1977/python-exceptiongroup.changes
2026-02-18 17:04:52.892354520 +0100
@@ -1,0 +2,9 @@
+Wed Feb 18 07:08:36 UTC 2026 - Daniel Garcia <[email protected]>
+
+- Update to 1.3.1
+ * Fixed AttributeError: 'TracebackException' object has no attribute
+ 'exceptions' when formatting unpickled TBEs from another Python
+ process which did not apply the exceptiongroup patches (#144)
+- Drop upstreamed patch py314.patch
+
+-------------------------------------------------------------------
Old:
----
exceptiongroup-1.3.0-gh.tar.gz
py314.patch
New:
----
exceptiongroup-1.3.1-gh.tar.gz
----------(Old B)----------
Old: process which did not apply the exceptiongroup patches (#144)
- Drop upstreamed patch py314.patch
----------(Old E)----------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-exceptiongroup.spec ++++++
--- /var/tmp/diff_new_pack.aB6v7k/_old 2026-02-18 17:04:53.624384988 +0100
+++ /var/tmp/diff_new_pack.aB6v7k/_new 2026-02-18 17:04:53.624384988 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-exceptiongroup
#
-# Copyright (c) 2025 SUSE LLC and contributors
+# 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
@@ -29,14 +29,12 @@
%{?sle15_python_module_pythons}
Name: python-exceptiongroup%{psuffix}
-Version: 1.3.0
+Version: 1.3.1
Release: 0
Summary: Backport of PEP 654 (exception groups)
License: MIT AND Python-2.0
URL: https://github.com/agronholm/exceptiongroup
Source:
https://github.com/agronholm/exceptiongroup/archive/refs/tags/%{version}.tar.gz#/exceptiongroup-%{version}-gh.tar.gz
-# PATCH-FIX-UPSTREAM
https://github.com/agronholm/exceptiongroup/commit/a0da94dadfb39c0b52c0cd5c87ace166b00f74c1
Fixed test failures on Python 3.14
-Patch0: py314.patch
BuildRequires: %{python_module base >= 3.7}
BuildRequires: %{python_module flit-scm}
BuildRequires: %{python_module pip}
@@ -91,7 +89,9 @@
%if %{with test}
%check
-%pytest
+# Broken test with latest python3.13
+# https://github.com/agronholm/exceptiongroup/issues/154
+%pytest -k "not test_exceptions_mutate_original_sequence"
%endif
%if !%{with test}
++++++ exceptiongroup-1.3.0-gh.tar.gz -> exceptiongroup-1.3.1-gh.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/exceptiongroup-1.3.0/.github/workflows/test.yml
new/exceptiongroup-1.3.1/.github/workflows/test.yml
--- old/exceptiongroup-1.3.0/.github/workflows/test.yml 2025-05-10
19:41:55.000000000 +0200
+++ new/exceptiongroup-1.3.1/.github/workflows/test.yml 2025-11-22
00:00:44.000000000 +0100
@@ -10,7 +10,7 @@
strategy:
fail-fast: false
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"]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
@@ -18,6 +18,7 @@
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
+ allow-prereleases: true
- uses: actions/cache@v4
with:
path: ~/.cache/pip
@@ -35,7 +36,7 @@
strategy:
fail-fast: false
matrix:
- python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13",
pypy-3.11]
+ python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14",
pypy-3.11]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/exceptiongroup-1.3.0/.pre-commit-config.yaml
new/exceptiongroup-1.3.1/.pre-commit-config.yaml
--- old/exceptiongroup-1.3.0/.pre-commit-config.yaml 2025-05-10
19:41:55.000000000 +0200
+++ new/exceptiongroup-1.3.1/.pre-commit-config.yaml 2025-11-22
00:00:44.000000000 +0100
@@ -1,6 +1,6 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v5.0.0
+ rev: v6.0.0
hooks:
- id: check-added-large-files
- id: check-case-conflict
@@ -16,7 +16,7 @@
- id: trailing-whitespace
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.11.7
+ rev: v0.13.3
hooks:
- id: ruff
args: [--fix, --show-fixes]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/exceptiongroup-1.3.0/CHANGES.rst
new/exceptiongroup-1.3.1/CHANGES.rst
--- old/exceptiongroup-1.3.0/CHANGES.rst 2025-05-10 19:41:55.000000000
+0200
+++ new/exceptiongroup-1.3.1/CHANGES.rst 2025-11-22 00:00:44.000000000
+0100
@@ -3,6 +3,13 @@
This library adheres to `Semantic Versioning 2.0 <http://semver.org/>`_.
+**1.3.1**
+
+- Fixed ``AttributeError: 'TracebackException' object has no attribute
'exceptions'``
+ when formatting unpickled TBEs from another Python process which did not
apply the
+ ``exceptiongroup`` patches
+ (`#144 <https://github.com/agronholm/exceptiongroup/issues/144>`_)
+
**1.3.0**
- Added ``**kwargs`` to function and method signatures as appropriate to match
the
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/exceptiongroup-1.3.0/pyproject.toml
new/exceptiongroup-1.3.1/pyproject.toml
--- old/exceptiongroup-1.3.0/pyproject.toml 2025-05-10 19:41:55.000000000
+0200
+++ new/exceptiongroup-1.3.1/pyproject.toml 2025-11-22 00:00:44.000000000
+0100
@@ -88,9 +88,9 @@
warn_unused_ignores = true
[tool.tox]
-env_list = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "pypy3"]
+env_list = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14",
"pypy3"]
skip_missing_interpreters = true
-labels = {typing = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]}
+labels = {typing = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13",
"3.14"]}
requires = ["tox >= 4.22"]
[tool.tox.env_run_base]
@@ -104,4 +104,4 @@
["pyright", "tests/check_types.py"],
["mypy", "tests/check_types.py"],
]
-deps = ["pyright", "mypy"]
+deps = ["pyright == 1.1.400", "mypy"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/exceptiongroup-1.3.0/src/exceptiongroup/_formatting.py
new/exceptiongroup-1.3.1/src/exceptiongroup/_formatting.py
--- old/exceptiongroup-1.3.0/src/exceptiongroup/_formatting.py 2025-05-10
19:41:55.000000000 +0200
+++ new/exceptiongroup-1.3.1/src/exceptiongroup/_formatting.py 2025-11-22
00:00:44.000000000 +0100
@@ -241,7 +241,7 @@
for msg, exc in reversed(output):
if msg is not None:
yield from _ctx.emit(msg)
- if exc.exceptions is None:
+ if getattr(exc, "exceptions", None) is None:
if exc.stack:
yield from _ctx.emit("Traceback (most recent call
last):\n")
yield from _ctx.emit(exc.stack.format())
@@ -332,12 +332,13 @@
else:
yield from traceback_exception_original_format_exception_only(self)
- if isinstance(self.__notes__, collections.abc.Sequence):
- for note in self.__notes__:
+ notes = getattr(self, "__notes__", None)
+ if isinstance(notes, collections.abc.Sequence):
+ for note in notes:
note = _safe_string(note, "note")
yield from [line + "\n" for line in note.split("\n")]
- elif self.__notes__ is not None:
- yield _safe_string(self.__notes__, "__notes__", func=repr)
+ elif notes is not None:
+ yield _safe_string(notes, "__notes__", func=repr)
traceback_exception_original_format = traceback.TracebackException.format
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/exceptiongroup-1.3.0/tests/dummyscript.py
new/exceptiongroup-1.3.1/tests/dummyscript.py
--- old/exceptiongroup-1.3.0/tests/dummyscript.py 1970-01-01
01:00:00.000000000 +0100
+++ new/exceptiongroup-1.3.1/tests/dummyscript.py 2025-11-22
00:00:44.000000000 +0100
@@ -0,0 +1,12 @@
+# This script exists solely for test_unpatched_tracebackexception_format()
+import pickle
+import sys
+import traceback
+
+assert "exceptiongroup" not in sys.modules, "exceptiongroup was already
imported"
+
+try:
+ raise ValueError("hello")
+except ValueError as exc:
+ tbe = traceback.TracebackException(type(exc), exc, exc.__traceback__)
+ sys.stdout.buffer.write(pickle.dumps(tbe,
protocol=pickle.HIGHEST_PROTOCOL))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/exceptiongroup-1.3.0/tests/test_exceptions.py
new/exceptiongroup-1.3.1/tests/test_exceptions.py
--- old/exceptiongroup-1.3.0/tests/test_exceptions.py 2025-05-10
19:41:55.000000000 +0200
+++ new/exceptiongroup-1.3.1/tests/test_exceptions.py 2025-11-22
00:00:44.000000000 +0100
@@ -374,7 +374,7 @@
class DeepRecursionInSplitAndSubgroup(unittest.TestCase):
def make_deep_eg(self):
e = TypeError(1)
- for _ in range(10000):
+ for _ in range(150_000):
e = ExceptionGroup("eg", [e])
return e
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/exceptiongroup-1.3.0/tests/test_formatting.py
new/exceptiongroup-1.3.1/tests/test_formatting.py
--- old/exceptiongroup-1.3.0/tests/test_formatting.py 2025-05-10
19:41:55.000000000 +0200
+++ new/exceptiongroup-1.3.1/tests/test_formatting.py 2025-11-22
00:00:44.000000000 +0100
@@ -1,5 +1,8 @@
+import pickle
+import subprocess
import sys
import traceback
+from pathlib import Path
from typing import NoReturn
from urllib.error import HTTPError
@@ -55,6 +58,22 @@
return request.param
[email protected](
+ sys.version_info >= (3, 11),
+ reason="The failure only occurs on Python 3.10 and earlier",
+)
+def test_unpatched_tracebackexception_format():
+ dummy_script_path = Path(__file__).parent / "dummyscript.py"
+ process = subprocess.run(
+ [sys.executable, str(dummy_script_path)], capture_output=True
+ )
+ tbe = pickle.loads(process.stdout)
+ assert not hasattr(tbe, "exceptions")
+ assert not hasattr(tbe, "__notes__")
+ formatted = tbe.format()
+ "".join(formatted)
+
+
def test_exceptionhook(capsys: CaptureFixture) -> None:
try:
raise_excgroup()