loguru
loguru copied to clipboard
Python 3.14.0a6: a few new regressions
$ python3.14 --version
3.14.0a6
$ python3.14 -m venv _e
$ . _e/bin/activate
(_e) $ pip install tox
(_e) $ tox
[…]
========================================================================================== short test summary info ===========================================================================================
FAILED tests/test_exceptions_formatting.py::test_exception_others[recursion_error] - assert '\nTraceback (most recent call last):\n File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n [Previous line repeated 995 more times]\n File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive\n def recursive():\nRecursionError: maximum recursion depth exceeded\n\nTraceback (most recent call last):\n> File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n [Previous line repeated 995 more times]\n File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive\n def recursive():\nRecursionError: maximum recursion depth exceeded\n\n\x1b[33m\x1b[1mTraceback (most recent call last):\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m19\x1b[0m, in \x1b[35m<module>\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n [Previous line repeated 995 more times]\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m14\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[35m\x1b[1mdef\x1b[0m \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\x1b[1m:\x1b[0m\n\x1b[31m\x1b[1mRecursionError\x1b[0m:\x1b[1m maximum recursion depth exceeded\x1b[0m\n\nTraceback (most recent call last):\n\n File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n [Previous line repeated 995 more times]\n\n File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive\n def recursive():\n └ <function recursive at 0xDEADBEEF>\n\nRecursionError: maximum recursion depth exceeded\n/home/ben/src/forks/loguru/.tox/tests/lib/python3.14/site-packages/coverage/pytracer.py:355: CoverageWarning: Trace function changed, data is likely wrong: None != <bound method PyTracer._trace of <PyTracer at 0xDEADBEEF: 984 data points in 19 files>> (trace-changed)\n self.warn(\n' == '\nTraceback (most recent call last):\n File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n [Previous line repeated 996 more times]\nRecursionError: maximum recursion depth exceeded\n\nTraceback (most recent call last):\n> File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n [Previous line repeated 996 more times]\nRecursionError: maximum recursion depth exceeded\n\n\x1b[33m\x1b[1mTraceback (most recent call last):\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m19\x1b[0m, in \x1b[35m<module>\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n [Previous line repeated 996 more times]\n\x1b[31m\x1b[1mRecursionError\x1b[0m:\x1b[1m maximum recursion depth exceeded\x1b[0m\n\nTraceback (most recent call last):\n\n File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n [Previous line repeated 996 more times]\n\nRecursionError: maximum recursion depth exceeded\n'
Traceback (most recent call last):
File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
- [Previous line repeated 996 more times]
? ^
+ [Previous line repeated 995 more times]
? ^
+ File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive
+ def recursive():
RecursionError: maximum recursion depth exceeded
Traceback (most recent call last):
> File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
- [Previous line repeated 996 more times]
? ^
+ [Previous line repeated 995 more times]
? ^
+ File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive
+ def recursive():
RecursionError: maximum recursion depth exceeded
Traceback (most recent call last):
File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
- [Previous line repeated 996 more times]
? ^
+ [Previous line repeated 995 more times]
? ^
+ File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive
+ def recursive():
RecursionError: maximum recursion depth exceeded
Traceback (most recent call last):
File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>
recursive()
└ <function recursive at 0xDEADBEEF>
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
└ <function recursive at 0xDEADBEEF>
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
└ <function recursive at 0xDEADBEEF>
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
└ <function recursive at 0xDEADBEEF>
- [Previous line repeated 996 more times]
? ^
+ [Previous line repeated 995 more times]
? ^
+
+ File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive
+ def recursive():
+ └ <function recursive at 0xDEADBEEF>
RecursionError: maximum recursion depth exceeded
+ /home/ben/src/forks/loguru/.tox/tests/lib/python3.14/site-packages/coverage/pytracer.py:355: CoverageWarning: Trace function changed, data is likely wrong: None != <bound method PyTracer._trace of <PyTracer at 0xDEADBEEF: 984 data points in 19 files>> (trace-changed)
+ self.warn(
FAILED tests/test_exceptions_formatting.py::test_exception_modern[type_hints-minimum_python_version0] - assert '\n\x1b[33m\x1b[1mTraceback (most recent call last):\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m23\x1b[0m, in \x1b[35m<module>\x1b[0m\n \x1b[1mmain\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n \x1b[36m└ \x1b[0m\x1b[36m\x1b[1m<function main at 0xDEADBEEF>\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m19\x1b[0m, in \x1b[35mmain\x1b[0m\n \x1b[1mbar\x1b[0m\x1b[1m:\x1b[0m \x1b[1mName\x1b[0m \x1b[35m\x1b[1m=\x1b[0m \x1b[1mfoo\x1b[0m\x1b[1m(\x1b[0m\x1b[34m\x1b[1m1\x1b[0m\x1b[1m,\x1b[0m \x1b[34m\x1b[1m2\x1b[0m\x1b[1m,\x1b[0m \x1b[34m\x1b[1m3\x1b[0m\x1b[1m)\x1b[0m\n \x1b[36m └ \x1b[0m\x1b[36m\x1b[1m<function foo at 0xDEADBEEF>\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mfoo\x1b[0m\n \x1b[35m\x1b[1mdef\x1b[0m \x1b[1mfoo\x1b[0m\x1b[1m(\x1b[0m\x1b[1ma\x1b[0m\x1b[1m:\x1b[0m \x1b[1mint\x1b[0m\x1b[1m,\x1b[0m \x1b[1mb\x1b[0m\x1b[1m:\x1b[0m \x1b[1mUnion\x1b[0m\x1b[1m[\x1b[0m\x1b[1mName\x1b[0m\x1b[1m,\x1b[0m \x1b[1mfloat\x1b[0m\x1b[1m]\x1b[0m\x1b[1m,\x1b[0m \x1b[1mc\x1b[0m\x1b[1m:\x1b[0m \x1b[36m"Name"\x1b[0m\x1b[1m)\x1b[0m \x1b[35m\x1b[1m->\x1b[0m \x1b[1mT\x1b[0m\x1b[1m:\x1b[0m \x1b[34m\x1b[1m1\x1b[0m \x1b[35m\x1b[1m/\x1b[0m \x1b[34m\x1b[1m0\x1b[0m\n \x1b[36m │ │ │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m~T\x1b[0m\n \x1b[36m │ │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m3\x1b[0m\n \x1b[36m │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m<class \'str\'>\x1b[0m\n \x1b[36m │ │ │ └ \x1b[0m\x1b[36m\x1b[1m<class \'typing.Union\'>\x1b[0m\n \x1b[36m │ │ └ \x1b[0m\x1b[36m\x1b[1m2\x1b[0m\n \x1b[36m │ └ \x1b[0m\x1b[36m\x1b[1m1\x1b[0m\n \x1b[36m └ \x1b[0m\x1b[36m\x1b[1m<function foo at 0xDEADBEEF>\x1b[0m\n\n\x1b[31m\x1b[1mZeroDivisionError\x1b[0m:\x1b[1m division by zero\x1b[0m\n' == '\n\x1b[33m\x1b[1mTraceback (most recent call last):\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m23\x1b[0m, in \x1b[35m<module>\x1b[0m\n \x1b[1mmain\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n \x1b[36m└ \x1b[0m\x1b[36m\x1b[1m<function main at 0xDEADBEEF>\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m19\x1b[0m, in \x1b[35mmain\x1b[0m\n \x1b[1mbar\x1b[0m\x1b[1m:\x1b[0m \x1b[1mName\x1b[0m \x1b[35m\x1b[1m=\x1b[0m \x1b[1mfoo\x1b[0m\x1b[1m(\x1b[0m\x1b[34m\x1b[1m1\x1b[0m\x1b[1m,\x1b[0m \x1b[34m\x1b[1m2\x1b[0m\x1b[1m,\x1b[0m \x1b[34m\x1b[1m3\x1b[0m\x1b[1m)\x1b[0m\n \x1b[36m └ \x1b[0m\x1b[36m\x1b[1m<function foo at 0xDEADBEEF>\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mfoo\x1b[0m\n \x1b[35m\x1b[1mdef\x1b[0m \x1b[1mfoo\x1b[0m\x1b[1m(\x1b[0m\x1b[1ma\x1b[0m\x1b[1m:\x1b[0m \x1b[1mint\x1b[0m\x1b[1m,\x1b[0m \x1b[1mb\x1b[0m\x1b[1m:\x1b[0m \x1b[1mUnion\x1b[0m\x1b[1m[\x1b[0m\x1b[1mName\x1b[0m\x1b[1m,\x1b[0m \x1b[1mfloat\x1b[0m\x1b[1m]\x1b[0m\x1b[1m,\x1b[0m \x1b[1mc\x1b[0m\x1b[1m:\x1b[0m \x1b[36m"Name"\x1b[0m\x1b[1m)\x1b[0m \x1b[35m\x1b[1m->\x1b[0m \x1b[1mT\x1b[0m\x1b[1m:\x1b[0m \x1b[34m\x1b[1m1\x1b[0m \x1b[35m\x1b[1m/\x1b[0m \x1b[34m\x1b[1m0\x1b[0m\n \x1b[36m │ │ │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m~T\x1b[0m\n \x1b[36m │ │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m3\x1b[0m\n \x1b[36m │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m<class \'str\'>\x1b[0m\n \x1b[36m │ │ │ └ \x1b[0m\x1b[36m\x1b[1mtyping.Union\x1b[0m\n \x1b[36m │ │ └ \x1b[0m\x1b[36m\x1b[1m2\x1b[0m\n \x1b[36m │ └ \x1b[0m\x1b[36m\x1b[1m1\x1b[0m\n \x1b[36m └ \x1b[0m\x1b[36m\x1b[1m<function foo at 0xDEADBEEF>\x1b[0m\n\n\x1b[31m\x1b[1mZeroDivisionError\x1b[0m:\x1b[1m division by zero\x1b[0m\n'
Traceback (most recent call last):
File "tests/exceptions/source/modern/type_hints.py", line 23, in <module>
main()
└ <function main at 0xDEADBEEF>
File "tests/exceptions/source/modern/type_hints.py", line 19, in main
bar: Name = foo(1, 2, 3)
└ <function foo at 0xDEADBEEF>
File "tests/exceptions/source/modern/type_hints.py", line 15, in foo
def foo(a: int, b: Union[Name, float], c: "Name") -> T: 1 / 0
│ │ │ │ │ │ └ ~T
│ │ │ │ │ └ 3
│ │ │ │ └ <class 'str'>
- │ │ │ └ typing.Union
+ │ │ │ └ <class 'typing.Union'>
? ++++++++ ++
│ │ └ 2
│ └ 1
└ <function foo at 0xDEADBEEF>
ZeroDivisionError: division by zero
=========================================================================== 2 failed, 1560 passed, 29 skipped in 118.36s (0:01:58) ===========================================================================
tests: exit 1 (119.09 seconds) /home/ben/src/forks/loguru> pytest -vv --cov loguru/ --cov-report= pid=417152
tests: FAIL ✖ in 2 minutes 9 seconds
[…]
The docs environment also fails:
Traceback
=========
File "/home/ben/src/forks/loguru/.tox/docs/lib/python3.14/site-packages/sphinx/builders/html/__init__.py", line 1228, in handle_page
raise ThemeError(msg) from exc
sphinx.errors.ThemeError: An error happened in rendering the page api.
Reason: SystemError('error return without exception set')
Python 3.14.0a7 is available, so I tried this again, with basically similar results:
$ python3.14 --version
3.14.0a7
$ python3.14 -m venv _e
$ . _e/bin/activate
(_e) $ pip install tox
(_e) $ tox
[…]
============================================== FAILURES ==============================================
_______________________________ test_exception_others[recursion_error] _______________________________
filename = 'recursion_error'
> ???
filename = 'recursion_error'
tests/test_exceptions_formatting.py:242:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
dirname = 'others', filename = 'recursion_error'
def compare_exception(dirname, filename):
cwd = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
python = sys.executable or "python"
filepath = os.path.join("tests", "exceptions", "source", dirname, filename + ".py")
outpath = os.path.join(cwd, "tests", "exceptions", "output", dirname, filename + ".txt")
with subprocess.Popen(
[python, filepath],
shell=False,
cwd=cwd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
env=dict(os.environ, PYTHONPATH=cwd, PYTHONIOENCODING="utf8"),
) as proc:
stdout, stderr = proc.communicate()
print(stderr, file=sys.stderr)
assert proc.returncode == 0
assert stdout == ""
assert stderr != ""
stderr = normalize(stderr)
# generate(stderr, outpath)
with open(outpath, "r") as file:
> assert stderr == file.read()
E assert '\nTraceback (most recent call last):\n File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n [Previous line repeated 995 more times]\n File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive\n def recursive():\nRecursionError: maximum recursion depth exceeded\n\nTraceback (most recent call last):\n> File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n [Previous line repeated 995 more times]\n File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive\n def recursive():\nRecursionError: maximum recursion depth exceeded\n\n\x1b[33m\x1b[1mTraceback (most recent call last):\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m19\x1b[0m, in \x1b[35m<module>\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n [Previous line repeated 995 more times]\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m14\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[35m\x1b[1mdef\x1b[0m \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\x1b[1m:\x1b[0m\n\x1b[31m\x1b[1mRecursionError\x1b[0m:\x1b[1m maximum recursion depth exceeded\x1b[0m\n\nTraceback (most recent call last):\n\n File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n [Previous line repeated 995 more times]\n\n File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive\n def recursive():\n └ <function recursive at 0xDEADBEEF>\n\nRecursionError: maximum recursion depth exceeded\n/home/ben/src/forks/loguru/.tox/tests/lib/python3.14/site-packages/coverage/pytracer.py:355: CoverageWarning: Trace function changed, data is likely wrong: None != <bound method PyTracer._trace of <PyTracer at 0xDEADBEEF: 984 data points in 19 files>> (trace-changed)\n self.warn(\n' == '\nTraceback (most recent call last):\n File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n [Previous line repeated 996 more times]\nRecursionError: maximum recursion depth exceeded\n\nTraceback (most recent call last):\n> File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n [Previous line repeated 996 more times]\nRecursionError: maximum recursion depth exceeded\n\n\x1b[33m\x1b[1mTraceback (most recent call last):\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m19\x1b[0m, in \x1b[35m<module>\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n [Previous line repeated 996 more times]\n\x1b[31m\x1b[1mRecursionError\x1b[0m:\x1b[1m maximum recursion depth exceeded\x1b[0m\n\nTraceback (most recent call last):\n\n File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n [Previous line repeated 996 more times]\n\nRecursionError: maximum recursion depth exceeded\n'
E
E
E Traceback (most recent call last):
E File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>
E recursive()
E File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
E recursive()
E File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
E recursive()
E File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
E recursive()
E - [Previous line repeated 996 more times]
E ? ^
E + [Previous line repeated 995 more times]
E ? ^
E + File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive
E + def recursive():
E RecursionError: maximum recursion depth exceeded
E
E Traceback (most recent call last):
E > File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>
E recursive()
E File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
E recursive()
E File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
E recursive()
E File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
E recursive()
E - [Previous line repeated 996 more times]
E ? ^
E + [Previous line repeated 995 more times]
E ? ^
E + File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive
E + def recursive():
E RecursionError: maximum recursion depth exceeded
E
E Traceback (most recent call last):
E File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>
E recursive()
E File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
E recursive()
E File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
E recursive()
E File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
E recursive()
E - [Previous line repeated 996 more times]
E ? ^
E + [Previous line repeated 995 more times]
E ? ^
E + File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive
E + def recursive():
E RecursionError: maximum recursion depth exceeded
E
E Traceback (most recent call last):
E
E File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>
E recursive()
E └ <function recursive at 0xDEADBEEF>
E
E File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
E recursive()
E └ <function recursive at 0xDEADBEEF>
E
E File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
E recursive()
E └ <function recursive at 0xDEADBEEF>
E
E File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
E recursive()
E └ <function recursive at 0xDEADBEEF>
E - [Previous line repeated 996 more times]
E ? ^
E + [Previous line repeated 995 more times]
E ? ^
E +
E + File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive
E + def recursive():
E + └ <function recursive at 0xDEADBEEF>
E
E RecursionError: maximum recursion depth exceeded
E + /home/ben/src/forks/loguru/.tox/tests/lib/python3.14/site-packages/coverage/pytracer.py:355: CoverageWarning: Trace function changed, data is likely wrong: None != <bound method PyTracer._trace of <PyTracer at 0xDEADBEEF: 984 data points in 19 files>> (trace-changed)
E + self.warn(
cwd = '/home/ben/src/forks/loguru'
dirname = 'others'
file = <_io.TextIOWrapper name='/home/ben/src/forks/loguru/tests/exceptions/output/others/recursion_error.txt' mode='r' encoding='UTF-8'>
filename = 'recursion_error'
filepath = 'tests/exceptions/source/others/recursion_error.py'
outpath = '/home/ben/src/forks/loguru/tests/exceptions/output/others/recursion_error.txt'
proc = <Popen: returncode: 0 args: ['/home/ben/src/forks/loguru/.tox/tests/bin/pyth...>
python = '/home/ben/src/forks/loguru/.tox/tests/bin/python'
stderr = ('\n'
'Traceback (most recent call last):\n'
' File "tests/exceptions/source/others/recursion_error.py", line 19, in '
'<module>\n'
' recursive()\n'
' File "tests/exceptions/source/others/recursion_error.py", line 15, in '
'recursive\n'
' recursive()\n'
' File "tests/exceptions/source/others/recursion_error.py", line 15, in '
'recursive\n'
' recursive()\n'
' File "tests/exceptions/source/others/recursion_error.py", line 15, in '
'recursive\n'
' recursive()\n'
' [Previous line repeated 995 more times]\n'
' File "tests/exceptions/source/others/recursion_error.py", line 14, in '
'recursive\n'
' def recursive():\n'
'RecursionError: maximum recursion depth exceeded\n'
'\n'
'Traceback (most recent call last):\n'
'> File "tests/exceptions/source/others/recursion_error.py", line 19, in '
'<module>\n'
' recursive()\n'
' File "tests/exceptions/source/others/recursion_error.py", line 15, in '
'recursive\n'
' recursive()\n'
' File "tests/exceptions/source/others/recursion_error.py", line 15, in '
'recursive\n'
' recursive()\n'
' File "tests/exceptions/source/others/recursion_error.py", line 15, in '
'recursive\n'
' recursive()\n'
' [Previous line repeated 995 more times]\n'
' File "tests/exceptions/source/others/recursion_error.py", line 14, in '
'recursive\n'
' def recursive():\n'
'RecursionError: maximum recursion depth exceeded\n'
'\n'
'\x1b[33m\x1b[1mTraceback (most recent call last):\x1b[0m\n'
' File '
'"\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", '
'line \x1b[33m19\x1b[0m, in \x1b[35m<module>\x1b[0m\n'
' \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n'
' File '
'"\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", '
'line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n'
' \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n'
' File '
'"\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", '
'line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n'
' \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n'
' File '
'"\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", '
'line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n'
' \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n'
' [Previous line repeated 995 more times]\n'
' File '
'"\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", '
'line \x1b[33m14\x1b[0m, in \x1b[35mrecursive\x1b[0m\n'
' \x1b[35m\x1b[1mdef\x1b[0m '
'\x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\x1b[1m:\x1b[0m\n'
'\x1b[31m\x1b[1mRecursionError\x1b[0m:\x1b[1m maximum recursion depth '
'exceeded\x1b[0m\n'
'\n'
'Traceback (most recent call last):\n'
'\n'
' File "tests/exceptions/source/others/recursion_error.py", line 19, in '
'<module>\n'
' recursive()\n'
' └ <function recursive at 0xDEADBEEF>\n'
'\n'
' File "tests/exceptions/source/others/recursion_error.py", line 15, in '
'recursive\n'
' recursive()\n'
' └ <function recursive at 0xDEADBEEF>\n'
'\n'
' File "tests/exceptions/source/others/recursion_error.py", line 15, in '
'recursive\n'
' recursive()\n'
' └ <function recursive at 0xDEADBEEF>\n'
'\n'
' File "tests/exceptions/source/others/recursion_error.py", line 15, in '
'recursive\n'
' recursive()\n'
' └ <function recursive at 0xDEADBEEF>\n'
' [Previous line repeated 995 more times]\n'
'\n'
' File "tests/exceptions/source/others/recursion_error.py", line 14, in '
'recursive\n'
' def recursive():\n'
' └ <function recursive at 0xDEADBEEF>\n'
'\n'
'RecursionError: maximum recursion depth exceeded\n'
'/home/ben/src/forks/loguru/.tox/tests/lib/python3.14/site-packages/coverage/pytracer.py:355: '
'CoverageWarning: Trace function changed, data is likely wrong: None != '
'<bound method PyTracer._trace of <PyTracer at 0xDEADBEEF: 984 data points in '
'19 files>> (trace-changed)\n'
' self.warn(\n')
stdout = ''
tests/test_exceptions_formatting.py:123: AssertionError
---------------------------------------- Captured stderr call ----------------------------------------
Traceback (most recent call last):
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 19, in <module>
recursive()
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
[Previous line repeated 995 more times]
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 14, in recursive
def recursive():
RecursionError: maximum recursion depth exceeded
Traceback (most recent call last):
> File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 19, in <module>
recursive()
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
[Previous line repeated 995 more times]
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 14, in recursive
def recursive():
RecursionError: maximum recursion depth exceeded
Traceback (most recent call last):
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 19, in <module>
recursive()
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
[Previous line repeated 995 more times]
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 14, in recursive
def recursive():
RecursionError: maximum recursion depth exceeded
Traceback (most recent call last):
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 19, in <module>
recursive()
└ <function recursive at 0x7f965b6ed380>
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
└ <function recursive at 0x7f965b6ed380>
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
└ <function recursive at 0x7f965b6ed380>
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
└ <function recursive at 0x7f965b6ed380>
[Previous line repeated 995 more times]
File "/home/ben/src/forks/loguru/tests/exceptions/source/others/recursion_error.py", line 14, in recursive
def recursive():
└ <function recursive at 0x7f965b6ed380>
RecursionError: maximum recursion depth exceeded
/home/ben/src/forks/loguru/.tox/tests/lib/python3.14/site-packages/coverage/pytracer.py:355: CoverageWarning: Trace function changed, data is likely wrong: None != <bound method PyTracer._trace of <PyTracer at 0x7f965b6be490: 984 data points in 19 files>> (trace-changed)
self.warn(
_____________________ test_exception_modern[type_hints-minimum_python_version0] ______________________
filename = 'type_hints', minimum_python_version = (3, 6)
@pytest.mark.parametrize(
("filename", "minimum_python_version"),
[
("type_hints", (3, 6)),
("exception_formatting_async_generator", (3, 6)),
("decorate_async_generator", (3, 7)),
("positional_only_argument", (3, 8)),
("walrus_operator", (3, 8)),
("match_statement", (3, 10)),
("exception_group_catch", (3, 11)),
("notes", (3, 11)),
("grouped_simple", (3, 11)),
("grouped_nested", (3, 11)),
("grouped_with_cause_and_context", (3, 11)),
("grouped_as_cause_and_context", (3, 11)),
("grouped_max_length", (3, 11)),
("grouped_max_depth", (3, 11)),
("f_string", (3, 12)), # Available since 3.6 but in 3.12 the lexer for f-string changed.
],
)
def test_exception_modern(filename, minimum_python_version):
if sys.version_info < minimum_python_version:
pytest.skip("Feature not supported in this Python version")
> compare_exception("modern", filename)
filename = 'type_hints'
minimum_python_version = (3, 6)
tests/test_exceptions_formatting.py:269:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
dirname = 'modern', filename = 'type_hints'
def compare_exception(dirname, filename):
cwd = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
python = sys.executable or "python"
filepath = os.path.join("tests", "exceptions", "source", dirname, filename + ".py")
outpath = os.path.join(cwd, "tests", "exceptions", "output", dirname, filename + ".txt")
with subprocess.Popen(
[python, filepath],
shell=False,
cwd=cwd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
env=dict(os.environ, PYTHONPATH=cwd, PYTHONIOENCODING="utf8"),
) as proc:
stdout, stderr = proc.communicate()
print(stderr, file=sys.stderr)
assert proc.returncode == 0
assert stdout == ""
assert stderr != ""
stderr = normalize(stderr)
# generate(stderr, outpath)
with open(outpath, "r") as file:
> assert stderr == file.read()
E assert '\n\x1b[33m\x1b[1mTraceback (most recent call last):\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m23\x1b[0m, in \x1b[35m<module>\x1b[0m\n \x1b[1mmain\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n \x1b[36m└ \x1b[0m\x1b[36m\x1b[1m<function main at 0xDEADBEEF>\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m19\x1b[0m, in \x1b[35mmain\x1b[0m\n \x1b[1mbar\x1b[0m\x1b[1m:\x1b[0m \x1b[1mName\x1b[0m \x1b[35m\x1b[1m=\x1b[0m \x1b[1mfoo\x1b[0m\x1b[1m(\x1b[0m\x1b[34m\x1b[1m1\x1b[0m\x1b[1m,\x1b[0m \x1b[34m\x1b[1m2\x1b[0m\x1b[1m,\x1b[0m \x1b[34m\x1b[1m3\x1b[0m\x1b[1m)\x1b[0m\n \x1b[36m └ \x1b[0m\x1b[36m\x1b[1m<function foo at 0xDEADBEEF>\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mfoo\x1b[0m\n \x1b[35m\x1b[1mdef\x1b[0m \x1b[1mfoo\x1b[0m\x1b[1m(\x1b[0m\x1b[1ma\x1b[0m\x1b[1m:\x1b[0m \x1b[1mint\x1b[0m\x1b[1m,\x1b[0m \x1b[1mb\x1b[0m\x1b[1m:\x1b[0m \x1b[1mUnion\x1b[0m\x1b[1m[\x1b[0m\x1b[1mName\x1b[0m\x1b[1m,\x1b[0m \x1b[1mfloat\x1b[0m\x1b[1m]\x1b[0m\x1b[1m,\x1b[0m \x1b[1mc\x1b[0m\x1b[1m:\x1b[0m \x1b[36m"Name"\x1b[0m\x1b[1m)\x1b[0m \x1b[35m\x1b[1m->\x1b[0m \x1b[1mT\x1b[0m\x1b[1m:\x1b[0m \x1b[34m\x1b[1m1\x1b[0m \x1b[35m\x1b[1m/\x1b[0m \x1b[34m\x1b[1m0\x1b[0m\n \x1b[36m │ │ │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m~T\x1b[0m\n \x1b[36m │ │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m3\x1b[0m\n \x1b[36m │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m<class \'str\'>\x1b[0m\n \x1b[36m │ │ │ └ \x1b[0m\x1b[36m\x1b[1m<class \'typing.Union\'>\x1b[0m\n \x1b[36m │ │ └ \x1b[0m\x1b[36m\x1b[1m2\x1b[0m\n \x1b[36m │ └ \x1b[0m\x1b[36m\x1b[1m1\x1b[0m\n \x1b[36m └ \x1b[0m\x1b[36m\x1b[1m<function foo at 0xDEADBEEF>\x1b[0m\n\n\x1b[31m\x1b[1mZeroDivisionError\x1b[0m:\x1b[1m division by zero\x1b[0m\n' == '\n\x1b[33m\x1b[1mTraceback (most recent call last):\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m23\x1b[0m, in \x1b[35m<module>\x1b[0m\n \x1b[1mmain\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n \x1b[36m└ \x1b[0m\x1b[36m\x1b[1m<function main at 0xDEADBEEF>\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m19\x1b[0m, in \x1b[35mmain\x1b[0m\n \x1b[1mbar\x1b[0m\x1b[1m:\x1b[0m \x1b[1mName\x1b[0m \x1b[35m\x1b[1m=\x1b[0m \x1b[1mfoo\x1b[0m\x1b[1m(\x1b[0m\x1b[34m\x1b[1m1\x1b[0m\x1b[1m,\x1b[0m \x1b[34m\x1b[1m2\x1b[0m\x1b[1m,\x1b[0m \x1b[34m\x1b[1m3\x1b[0m\x1b[1m)\x1b[0m\n \x1b[36m └ \x1b[0m\x1b[36m\x1b[1m<function foo at 0xDEADBEEF>\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mfoo\x1b[0m\n \x1b[35m\x1b[1mdef\x1b[0m \x1b[1mfoo\x1b[0m\x1b[1m(\x1b[0m\x1b[1ma\x1b[0m\x1b[1m:\x1b[0m \x1b[1mint\x1b[0m\x1b[1m,\x1b[0m \x1b[1mb\x1b[0m\x1b[1m:\x1b[0m \x1b[1mUnion\x1b[0m\x1b[1m[\x1b[0m\x1b[1mName\x1b[0m\x1b[1m,\x1b[0m \x1b[1mfloat\x1b[0m\x1b[1m]\x1b[0m\x1b[1m,\x1b[0m \x1b[1mc\x1b[0m\x1b[1m:\x1b[0m \x1b[36m"Name"\x1b[0m\x1b[1m)\x1b[0m \x1b[35m\x1b[1m->\x1b[0m \x1b[1mT\x1b[0m\x1b[1m:\x1b[0m \x1b[34m\x1b[1m1\x1b[0m \x1b[35m\x1b[1m/\x1b[0m \x1b[34m\x1b[1m0\x1b[0m\n \x1b[36m │ │ │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m~T\x1b[0m\n \x1b[36m │ │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m3\x1b[0m\n \x1b[36m │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m<class \'str\'>\x1b[0m\n \x1b[36m │ │ │ └ \x1b[0m\x1b[36m\x1b[1mtyping.Union\x1b[0m\n \x1b[36m │ │ └ \x1b[0m\x1b[36m\x1b[1m2\x1b[0m\n \x1b[36m │ └ \x1b[0m\x1b[36m\x1b[1m1\x1b[0m\n \x1b[36m └ \x1b[0m\x1b[36m\x1b[1m<function foo at 0xDEADBEEF>\x1b[0m\n\n\x1b[31m\x1b[1mZeroDivisionError\x1b[0m:\x1b[1m division by zero\x1b[0m\n'
E
E
E Traceback (most recent call last):
E
E File "tests/exceptions/source/modern/type_hints.py", line 23, in <module>
E main()
E └ <function main at 0xDEADBEEF>
E
E File "tests/exceptions/source/modern/type_hints.py", line 19, in main
E bar: Name = foo(1, 2, 3)
E └ <function foo at 0xDEADBEEF>
E
E File "tests/exceptions/source/modern/type_hints.py", line 15, in foo
E def foo(a: int, b: Union[Name, float], c: "Name") -> T: 1 / 0
E │ │ │ │ │ │ └ ~T
E │ │ │ │ │ └ 3
E │ │ │ │ └ <class 'str'>
E - │ │ │ └ typing.Union
E + │ │ │ └ <class 'typing.Union'>
E ? ++++++++ ++
E │ │ └ 2
E │ └ 1
E └ <function foo at 0xDEADBEEF>
E
E ZeroDivisionError: division by zero
cwd = '/home/ben/src/forks/loguru'
dirname = 'modern'
file = <_io.TextIOWrapper name='/home/ben/src/forks/loguru/tests/exceptions/output/modern/type_hints.txt' mode='r' encoding='UTF-8'>
filename = 'type_hints'
filepath = 'tests/exceptions/source/modern/type_hints.py'
outpath = '/home/ben/src/forks/loguru/tests/exceptions/output/modern/type_hints.txt'
proc = <Popen: returncode: 0 args: ['/home/ben/src/forks/loguru/.tox/tests/bin/pyth...>
python = '/home/ben/src/forks/loguru/.tox/tests/bin/python'
stderr = ('\n'
'\x1b[33m\x1b[1mTraceback (most recent call last):\x1b[0m\n'
'\n'
' File '
'"\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", '
'line \x1b[33m23\x1b[0m, in \x1b[35m<module>\x1b[0m\n'
' \x1b[1mmain\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n'
' \x1b[36m└ \x1b[0m\x1b[36m\x1b[1m<function main at 0xDEADBEEF>\x1b[0m\n'
'\n'
' File '
'"\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", '
'line \x1b[33m19\x1b[0m, in \x1b[35mmain\x1b[0m\n'
' \x1b[1mbar\x1b[0m\x1b[1m:\x1b[0m \x1b[1mName\x1b[0m '
'\x1b[35m\x1b[1m=\x1b[0m '
'\x1b[1mfoo\x1b[0m\x1b[1m(\x1b[0m\x1b[34m\x1b[1m1\x1b[0m\x1b[1m,\x1b[0m '
'\x1b[34m\x1b[1m2\x1b[0m\x1b[1m,\x1b[0m '
'\x1b[34m\x1b[1m3\x1b[0m\x1b[1m)\x1b[0m\n'
' \x1b[36m └ \x1b[0m\x1b[36m\x1b[1m<function foo at '
'0xDEADBEEF>\x1b[0m\n'
'\n'
' File '
'"\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", '
'line \x1b[33m15\x1b[0m, in \x1b[35mfoo\x1b[0m\n'
' \x1b[35m\x1b[1mdef\x1b[0m '
'\x1b[1mfoo\x1b[0m\x1b[1m(\x1b[0m\x1b[1ma\x1b[0m\x1b[1m:\x1b[0m '
'\x1b[1mint\x1b[0m\x1b[1m,\x1b[0m \x1b[1mb\x1b[0m\x1b[1m:\x1b[0m '
'\x1b[1mUnion\x1b[0m\x1b[1m[\x1b[0m\x1b[1mName\x1b[0m\x1b[1m,\x1b[0m '
'\x1b[1mfloat\x1b[0m\x1b[1m]\x1b[0m\x1b[1m,\x1b[0m '
'\x1b[1mc\x1b[0m\x1b[1m:\x1b[0m \x1b[36m"Name"\x1b[0m\x1b[1m)\x1b[0m '
'\x1b[35m\x1b[1m->\x1b[0m \x1b[1mT\x1b[0m\x1b[1m:\x1b[0m '
'\x1b[34m\x1b[1m1\x1b[0m \x1b[35m\x1b[1m/\x1b[0m \x1b[34m\x1b[1m0\x1b[0m\n'
' \x1b[36m │ │ │ │ │ │ └ '
'\x1b[0m\x1b[36m\x1b[1m~T\x1b[0m\n'
' \x1b[36m │ │ │ │ │ └ '
'\x1b[0m\x1b[36m\x1b[1m3\x1b[0m\n'
' \x1b[36m │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m<class '
"'str'>\x1b[0m\n"
' \x1b[36m │ │ │ └ \x1b[0m\x1b[36m\x1b[1m<class '
"'typing.Union'>\x1b[0m\n"
' \x1b[36m │ │ └ \x1b[0m\x1b[36m\x1b[1m2\x1b[0m\n'
' \x1b[36m │ └ \x1b[0m\x1b[36m\x1b[1m1\x1b[0m\n'
' \x1b[36m └ \x1b[0m\x1b[36m\x1b[1m<function foo at 0xDEADBEEF>\x1b[0m\n'
'\n'
'\x1b[31m\x1b[1mZeroDivisionError\x1b[0m:\x1b[1m division by zero\x1b[0m\n')
stdout = ''
tests/test_exceptions_formatting.py:123: AssertionError
---------------------------------------- Captured stderr call ----------------------------------------
Traceback (most recent call last):
File "/home/ben/src/forks/loguru/tests/exceptions/source/modern/type_hints.py", line 23, in <module>
main()
└ <function main at 0x7f573f9b94e0>
File "/home/ben/src/forks/loguru/tests/exceptions/source/modern/type_hints.py", line 19, in main
bar: Name = foo(1, 2, 3)
└ <function foo at 0x7f573fc09590>
File "/home/ben/src/forks/loguru/tests/exceptions/source/modern/type_hints.py", line 15, in foo
def foo(a: int, b: Union[Name, float], c: "Name") -> T: 1 / 0
│ │ │ │ │ │ └ ~T
│ │ │ │ │ └ 3
│ │ │ │ └ <class 'str'>
│ │ │ └ <class 'typing.Union'>
│ │ └ 2
│ └ 1
└ <function foo at 0x7f573fc09590>
ZeroDivisionError: division by zero
====================================== short test summary info =======================================
FAILED tests/test_exceptions_formatting.py::test_exception_others[recursion_error] - assert '\nTraceback (most recent call last):\n File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n [Previous line repeated 995 more times]\n File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive\n def recursive():\nRecursionError: maximum recursion depth exceeded\n\nTraceback (most recent call last):\n> File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n [Previous line repeated 995 more times]\n File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive\n def recursive():\nRecursionError: maximum recursion depth exceeded\n\n\x1b[33m\x1b[1mTraceback (most recent call last):\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m19\x1b[0m, in \x1b[35m<module>\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n [Previous line repeated 995 more times]\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m14\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[35m\x1b[1mdef\x1b[0m \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\x1b[1m:\x1b[0m\n\x1b[31m\x1b[1mRecursionError\x1b[0m:\x1b[1m maximum recursion depth exceeded\x1b[0m\n\nTraceback (most recent call last):\n\n File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n [Previous line repeated 995 more times]\n\n File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive\n def recursive():\n └ <function recursive at 0xDEADBEEF>\n\nRecursionError: maximum recursion depth exceeded\n/home/ben/src/forks/loguru/.tox/tests/lib/python3.14/site-packages/coverage/pytracer.py:355: CoverageWarning: Trace function changed, data is likely wrong: None != <bound method PyTracer._trace of <PyTracer at 0xDEADBEEF: 984 data points in 19 files>> (trace-changed)\n self.warn(\n' == '\nTraceback (most recent call last):\n File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n [Previous line repeated 996 more times]\nRecursionError: maximum recursion depth exceeded\n\nTraceback (most recent call last):\n> File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n [Previous line repeated 996 more times]\nRecursionError: maximum recursion depth exceeded\n\n\x1b[33m\x1b[1mTraceback (most recent call last):\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m19\x1b[0m, in \x1b[35m<module>\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n File "\x1b[32mtests/exceptions/source/others/\x1b[0m\x1b[32m\x1b[1mrecursion_error.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mrecursive\x1b[0m\n \x1b[1mrecursive\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n [Previous line repeated 996 more times]\n\x1b[31m\x1b[1mRecursionError\x1b[0m:\x1b[1m maximum recursion depth exceeded\x1b[0m\n\nTraceback (most recent call last):\n\n File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n\n File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive\n recursive()\n └ <function recursive at 0xDEADBEEF>\n [Previous line repeated 996 more times]\n\nRecursionError: maximum recursion depth exceeded\n'
Traceback (most recent call last):
File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
- [Previous line repeated 996 more times]
? ^
+ [Previous line repeated 995 more times]
? ^
+ File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive
+ def recursive():
RecursionError: maximum recursion depth exceeded
Traceback (most recent call last):
> File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
- [Previous line repeated 996 more times]
? ^
+ [Previous line repeated 995 more times]
? ^
+ File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive
+ def recursive():
RecursionError: maximum recursion depth exceeded
Traceback (most recent call last):
File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
- [Previous line repeated 996 more times]
? ^
+ [Previous line repeated 995 more times]
? ^
+ File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive
+ def recursive():
RecursionError: maximum recursion depth exceeded
Traceback (most recent call last):
File "tests/exceptions/source/others/recursion_error.py", line 19, in <module>
recursive()
└ <function recursive at 0xDEADBEEF>
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
└ <function recursive at 0xDEADBEEF>
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
└ <function recursive at 0xDEADBEEF>
File "tests/exceptions/source/others/recursion_error.py", line 15, in recursive
recursive()
└ <function recursive at 0xDEADBEEF>
- [Previous line repeated 996 more times]
? ^
+ [Previous line repeated 995 more times]
? ^
+
+ File "tests/exceptions/source/others/recursion_error.py", line 14, in recursive
+ def recursive():
+ └ <function recursive at 0xDEADBEEF>
RecursionError: maximum recursion depth exceeded
+ /home/ben/src/forks/loguru/.tox/tests/lib/python3.14/site-packages/coverage/pytracer.py:355: CoverageWarning: Trace function changed, data is likely wrong: None != <bound method PyTracer._trace of <PyTracer at 0xDEADBEEF: 984 data points in 19 files>> (trace-changed)
+ self.warn(
FAILED tests/test_exceptions_formatting.py::test_exception_modern[type_hints-minimum_python_version0] - assert '\n\x1b[33m\x1b[1mTraceback (most recent call last):\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m23\x1b[0m, in \x1b[35m<module>\x1b[0m\n \x1b[1mmain\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n \x1b[36m└ \x1b[0m\x1b[36m\x1b[1m<function main at 0xDEADBEEF>\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m19\x1b[0m, in \x1b[35mmain\x1b[0m\n \x1b[1mbar\x1b[0m\x1b[1m:\x1b[0m \x1b[1mName\x1b[0m \x1b[35m\x1b[1m=\x1b[0m \x1b[1mfoo\x1b[0m\x1b[1m(\x1b[0m\x1b[34m\x1b[1m1\x1b[0m\x1b[1m,\x1b[0m \x1b[34m\x1b[1m2\x1b[0m\x1b[1m,\x1b[0m \x1b[34m\x1b[1m3\x1b[0m\x1b[1m)\x1b[0m\n \x1b[36m └ \x1b[0m\x1b[36m\x1b[1m<function foo at 0xDEADBEEF>\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mfoo\x1b[0m\n \x1b[35m\x1b[1mdef\x1b[0m \x1b[1mfoo\x1b[0m\x1b[1m(\x1b[0m\x1b[1ma\x1b[0m\x1b[1m:\x1b[0m \x1b[1mint\x1b[0m\x1b[1m,\x1b[0m \x1b[1mb\x1b[0m\x1b[1m:\x1b[0m \x1b[1mUnion\x1b[0m\x1b[1m[\x1b[0m\x1b[1mName\x1b[0m\x1b[1m,\x1b[0m \x1b[1mfloat\x1b[0m\x1b[1m]\x1b[0m\x1b[1m,\x1b[0m \x1b[1mc\x1b[0m\x1b[1m:\x1b[0m \x1b[36m"Name"\x1b[0m\x1b[1m)\x1b[0m \x1b[35m\x1b[1m->\x1b[0m \x1b[1mT\x1b[0m\x1b[1m:\x1b[0m \x1b[34m\x1b[1m1\x1b[0m \x1b[35m\x1b[1m/\x1b[0m \x1b[34m\x1b[1m0\x1b[0m\n \x1b[36m │ │ │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m~T\x1b[0m\n \x1b[36m │ │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m3\x1b[0m\n \x1b[36m │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m<class \'str\'>\x1b[0m\n \x1b[36m │ │ │ └ \x1b[0m\x1b[36m\x1b[1m<class \'typing.Union\'>\x1b[0m\n \x1b[36m │ │ └ \x1b[0m\x1b[36m\x1b[1m2\x1b[0m\n \x1b[36m │ └ \x1b[0m\x1b[36m\x1b[1m1\x1b[0m\n \x1b[36m └ \x1b[0m\x1b[36m\x1b[1m<function foo at 0xDEADBEEF>\x1b[0m\n\n\x1b[31m\x1b[1mZeroDivisionError\x1b[0m:\x1b[1m division by zero\x1b[0m\n' == '\n\x1b[33m\x1b[1mTraceback (most recent call last):\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m23\x1b[0m, in \x1b[35m<module>\x1b[0m\n \x1b[1mmain\x1b[0m\x1b[1m(\x1b[0m\x1b[1m)\x1b[0m\n \x1b[36m└ \x1b[0m\x1b[36m\x1b[1m<function main at 0xDEADBEEF>\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m19\x1b[0m, in \x1b[35mmain\x1b[0m\n \x1b[1mbar\x1b[0m\x1b[1m:\x1b[0m \x1b[1mName\x1b[0m \x1b[35m\x1b[1m=\x1b[0m \x1b[1mfoo\x1b[0m\x1b[1m(\x1b[0m\x1b[34m\x1b[1m1\x1b[0m\x1b[1m,\x1b[0m \x1b[34m\x1b[1m2\x1b[0m\x1b[1m,\x1b[0m \x1b[34m\x1b[1m3\x1b[0m\x1b[1m)\x1b[0m\n \x1b[36m └ \x1b[0m\x1b[36m\x1b[1m<function foo at 0xDEADBEEF>\x1b[0m\n\n File "\x1b[32mtests/exceptions/source/modern/\x1b[0m\x1b[32m\x1b[1mtype_hints.py\x1b[0m", line \x1b[33m15\x1b[0m, in \x1b[35mfoo\x1b[0m\n \x1b[35m\x1b[1mdef\x1b[0m \x1b[1mfoo\x1b[0m\x1b[1m(\x1b[0m\x1b[1ma\x1b[0m\x1b[1m:\x1b[0m \x1b[1mint\x1b[0m\x1b[1m,\x1b[0m \x1b[1mb\x1b[0m\x1b[1m:\x1b[0m \x1b[1mUnion\x1b[0m\x1b[1m[\x1b[0m\x1b[1mName\x1b[0m\x1b[1m,\x1b[0m \x1b[1mfloat\x1b[0m\x1b[1m]\x1b[0m\x1b[1m,\x1b[0m \x1b[1mc\x1b[0m\x1b[1m:\x1b[0m \x1b[36m"Name"\x1b[0m\x1b[1m)\x1b[0m \x1b[35m\x1b[1m->\x1b[0m \x1b[1mT\x1b[0m\x1b[1m:\x1b[0m \x1b[34m\x1b[1m1\x1b[0m \x1b[35m\x1b[1m/\x1b[0m \x1b[34m\x1b[1m0\x1b[0m\n \x1b[36m │ │ │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m~T\x1b[0m\n \x1b[36m │ │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m3\x1b[0m\n \x1b[36m │ │ │ │ └ \x1b[0m\x1b[36m\x1b[1m<class \'str\'>\x1b[0m\n \x1b[36m │ │ │ └ \x1b[0m\x1b[36m\x1b[1mtyping.Union\x1b[0m\n \x1b[36m │ │ └ \x1b[0m\x1b[36m\x1b[1m2\x1b[0m\n \x1b[36m │ └ \x1b[0m\x1b[36m\x1b[1m1\x1b[0m\n \x1b[36m └ \x1b[0m\x1b[36m\x1b[1m<function foo at 0xDEADBEEF>\x1b[0m\n\n\x1b[31m\x1b[1mZeroDivisionError\x1b[0m:\x1b[1m division by zero\x1b[0m\n'
Traceback (most recent call last):
File "tests/exceptions/source/modern/type_hints.py", line 23, in <module>
main()
└ <function main at 0xDEADBEEF>
File "tests/exceptions/source/modern/type_hints.py", line 19, in main
bar: Name = foo(1, 2, 3)
└ <function foo at 0xDEADBEEF>
File "tests/exceptions/source/modern/type_hints.py", line 15, in foo
def foo(a: int, b: Union[Name, float], c: "Name") -> T: 1 / 0
│ │ │ │ │ │ └ ~T
│ │ │ │ │ └ 3
│ │ │ │ └ <class 'str'>
- │ │ │ └ typing.Union
+ │ │ │ └ <class 'typing.Union'>
? ++++++++ ++
│ │ └ 2
│ └ 1
└ <function foo at 0xDEADBEEF>
ZeroDivisionError: division by zero
======================= 2 failed, 1560 passed, 29 skipped in 97.53s (0:01:37) ========================
The docs environment still fails.
With Python 3.14.0b2, the results are still similar to those I posted above. Since Fedora Rawhide (the development version of the distribution) is about to have Python 3.14 as its system Python, I’m going to skip test_exception_others[recursion_error] and test_exception_modern[type_hints-minimum_python_version0] in the python-loguru package for now.
Hey @musicinmybrain. Thank you for this early report on Python 3.14. Apologies for not being able to address it in a more timely manner.
I fixed the failure in test_exception_modern[type_hints-minimum_python_version0] in 84023e2bd8339de95250470f422f096edcb8f7b7.
However, I was unable to reproduce the failure in test_exception_others[recursion_error] or the documentation build issue. I tested with latest Fedora image using Python 3.14.0b3, see:
FROM fedora:rawhide
RUN dnf -y update && \
dnf -y install \
vim \
git \
bash-completion \
gcc \
python3.14 \
python3.14-devel \
libffi \
libffi-devel \
&& dnf clean all
RUN git clone https://github.com/Delgan/loguru.git
WORKDIR loguru
RUN python3.14 -m venv .venv && \
source .venv/bin/activate && \
python3.14 -m pip install -e .[dev]
CMD [".venv/bin/tox"]
$ docker build -t loguru-fedora-demo .
$ docker run -it --rm loguru-fedora-demo
lint: OK (39.68=setup[10.93]+cmd[28.75] seconds)
tests: OK (97.55=setup[10.68]+cmd[0.09,86.47,0.13,0.17] seconds)
docs: OK (11.69=setup[9.74]+cmd[1.95] seconds)
build: OK (12.65=setup[10.66]+cmd[1.72,0.27] seconds)
congratulations :) (161.66 seconds)
Let me know if you notice any significant differences between your environment and mine.
Thank you for looking at this!
I can confirm that 84023e2bd8339de95250470f422f096edcb8f7b7 fixes test_exception_modern[type_hints-minimum_python_version0] when backported to 0.7.3.
I can also confirm that I am no longer able to reproduce test_exception_others[recursion_error]. I suspect that it may have been fixed in Python itself between 3.14.0b2 and 3.14.0b3.