From 239ce621757af6a1450d915393a03ba4ecbe2ddf Mon Sep 17 00:00:00 2001 From: Derek Wan Date: Thu, 9 Jan 2025 18:53:09 +0900 Subject: [PATCH] Fix latent bug in `ExcGroupTB.format` due to suppressed `ExceptionGroup` being treated as `.path` (#1044) --- pyproject.toml | 16 +- requirements.txt | 14 +- requirements/altair.txt | 6 +- requirements/astor.txt | 4 +- requirements/asyncio.txt | 4 +- requirements/atomicwrites.txt | 4 +- requirements/atools.txt | 4 +- requirements/beartype.txt | 4 +- requirements/cachetools.txt | 4 +- requirements/click.txt | 4 +- requirements/contextlib.txt | 4 +- requirements/cryptography.txt | 4 +- requirements/cvxpy.txt | 4 +- requirements/dataclasses.txt | 6 +- requirements/datetime.txt | 4 +- requirements/enum.txt | 4 +- requirements/errors.txt | 4 +- requirements/eventkit.txt | 4 +- requirements/fastapi.txt | 4 +- requirements/fpdf2.txt | 4 +- requirements/functions.txt | 4 +- requirements/functools.txt | 4 +- requirements/getpass.txt | 4 +- requirements/git.txt | 4 +- requirements/hashlib.txt | 6 +- requirements/http.txt | 6 +- requirements/humps.txt | 4 +- requirements/hypothesis.txt | 4 +- requirements/ipython.txt | 4 +- requirements/iterables.txt | 4 +- requirements/jupyter.txt | 8 +- requirements/logging.txt | 8 +- requirements/loguru.txt | 4 +- requirements/math.txt | 4 +- requirements/memory-profiler.txt | 4 +- requirements/modules.txt | 4 +- requirements/more-itertools.txt | 4 +- requirements/numpy.txt | 4 +- requirements/optuna.txt | 4 +- requirements/orjson.txt | 6 +- requirements/os.txt | 4 +- requirements/pathlib.txt | 4 +- requirements/pickle.txt | 4 +- requirements/platform.txt | 4 +- requirements/polars.txt | 4 +- requirements/pqdm.txt | 4 +- requirements/pydantic.txt | 4 +- requirements/pyinstrument.txt | 4 +- requirements/pyrsistent.txt | 4 +- requirements/pytest.txt | 6 +- requirements/python-dotenv.txt | 4 +- requirements/random.txt | 4 +- requirements/re.txt | 4 +- requirements/redis.txt | 6 +- requirements/rich.txt | 4 +- requirements/scipy.txt | 4 +- requirements/sentinel.txt | 4 +- requirements/slack-sdk.txt | 4 +- requirements/socket.txt | 4 +- requirements/sqlalchemy-polars.txt | 4 +- requirements/sqlalchemy.txt | 4 +- requirements/streamlit.txt | 8 +- requirements/sys.txt | 8 +- requirements/tempfile.txt | 4 +- requirements/tenacity.txt | 4 +- requirements/text.txt | 4 +- requirements/threading.txt | 4 +- requirements/timer.txt | 4 +- requirements/traceback.txt | 8 +- requirements/treelib.txt | 4 +- requirements/types.txt | 4 +- requirements/typing.txt | 4 +- requirements/uuid.txt | 4 +- requirements/version.txt | 8 +- requirements/warnings.txt | 4 +- requirements/whenever.txt | 4 +- requirements/zipfile.txt | 4 +- requirements/zoneinfo.txt | 4 +- src/tests/conftest.py | 47 +++--- src/tests/test_traceback.py | 230 +++++++++++++++-------------- src/utilities/__init__.py | 2 +- src/utilities/traceback.py | 126 ++++++++-------- 82 files changed, 391 insertions(+), 386 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 3e9554b75..449bd78ba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,7 @@ dev = [ "greenlet >= 3.1.1, < 3.2", # for sqlalchemy async "hatch >= 1.14.0, < 1.15", "httpx >= 0.28.1, < 0.29", # for fastapi - "hypothesis >= 6.123.7, < 6.124", + "hypothesis >= 6.123.11, < 6.124", "ib-async-dataclass >= 1.0.3rc5, < 1.1", "img2pdf >= 0.5.1, < 0.6", "loguru >= 0.7.3, < 0.8", @@ -49,7 +49,7 @@ dev = [ "numbagg >= 0.8.2, < 0.9", "numpy >= 2.0.2, < 2.1", # if 2.1, llvmite: RuntimeError: Cannot install on Python version 3.11.9; only versions >=3.6,<3.10 are supported. "optuna >= 4.1.0, < 4.2", - "orjson >= 3.10.13, < 3.11", + "orjson >= 3.10.14, < 3.11", "polars-lts-cpu >= 1.19.0, < 1.20", "pqdm >= 0.2.0, < 0.3", "psycopg2-binary >= 2.9.10, < 2.10", # for sqlalchemy @@ -76,7 +76,7 @@ dev = [ "whenever >= 0.6.16, < 0.7", # test "coverage-conditional-plugin >= 0.9.0, < 0.10", - "pytest-asyncio >= 0.25.1, < 0.26", + "pytest-asyncio >= 0.25.2, < 0.26", "pytest-cov >= 6.0.0, < 6.1", "pytest-instafail >= 0.5.0, < 0.6", "pytest-only >= 2.1.2, < 2.2", @@ -89,9 +89,9 @@ dev = [ ] test = [ "coverage-conditional-plugin >= 0.9.0, < 0.10", - "hypothesis >= 6.123.7, < 6.124", + "hypothesis >= 6.123.11, < 6.124", "pytest >= 8.3.4, < 8.4", - "pytest-asyncio >= 0.25.1, < 0.26", + "pytest-asyncio >= 0.25.2, < 0.26", "pytest-cov >= 6.0.0, < 6.1", "pytest-instafail >= 0.5.0, < 0.6", "pytest-only >= 2.1.2, < 2.2", @@ -157,7 +157,7 @@ zzz-test-hashlib = [ ] zzz-test-http = [ "atomicwrites >= 1.4.1, < 1.5", - "orjson >= 3.10.13, < 3.11", + "orjson >= 3.10.14, < 3.11", "whenever >= 0.6.16, < 0.7", ] zzz-test-humps = ["pyhumps >= 3.8.0, < 3.9"] @@ -165,7 +165,7 @@ zzz-test-hypothesis = [ "aiosqlite >= 0.20.0, < 0.21", "asyncpg >= 0.30.0, < 0.31", # for sqlalchemy async "greenlet >= 3.1.1, < 3.2", # for sqlalchemy async - "hypothesis >= 6.123.7, < 6.124", + "hypothesis >= 6.123.11, < 6.124", "numpy >= 2.0.2, < 2.1", "redis >= 5.2.1, < 5.3", "sqlalchemy >= 2.0.36, < 2.1", @@ -239,7 +239,7 @@ zzz-test-pyinstrument = [ zzz-test-pyrsistent = ["pyrsistent >= 0.20.0, < 0.21"] zzz-test-pytest = [ "atomicwrites >= 1.4.1, < 1.5", - "orjson >= 3.10.13, < 3.11", + "orjson >= 3.10.14, < 3.11", "whenever >= 0.6.16, < 0.7", ] zzz-test-python-dotenv = ["python-dotenv >= 1.0.1, < 1.1"] diff --git a/requirements.txt b/requirements.txt index f5dcd7ef3..313b38fc7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -142,7 +142,7 @@ humanfriendly==10.0 # via coloredlogs hyperlink==21.0.0 # via hatch -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) ib-async-dataclass==1.0.3rc5 # via dycw-utilities (pyproject.toml) @@ -202,7 +202,7 @@ multidict==6.1.0 # via # aiohttp # yarl -narwhals==1.21.0 +narwhals==1.21.1 # via # altair # vegafusion @@ -235,7 +235,7 @@ numpy==2.0.2 # streamlit optuna==4.1.0 # via dycw-utilities (pyproject.toml) -orjson==3.10.13 +orjson==3.10.14 # via dycw-utilities (pyproject.toml) osqp==0.6.7.post3 # via cvxpy @@ -284,7 +284,7 @@ propcache==0.2.1 # via # aiohttp # yarl -protobuf==5.29.2 +protobuf==5.29.3 # via streamlit psutil==6.1.1 # via memory-profiler @@ -322,7 +322,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) @@ -418,7 +418,7 @@ tqdm==4.67.1 # pqdm treelib==1.7.0 # via dycw-utilities (pyproject.toml) -trove-classifiers==2025.1.6.15 +trove-classifiers==2025.1.7.14 # via hatchling typing-extensions==4.12.2 # via @@ -443,7 +443,7 @@ urllib3==2.3.0 # via requests userpath==1.9.2 # via hatch -uv==0.5.15 +uv==0.5.16 # via hatch uvicorn==0.34.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/altair.txt b/requirements/altair.txt index 7a8f24b3d..16220d428 100644 --- a/requirements/altair.txt +++ b/requirements/altair.txt @@ -19,7 +19,7 @@ deprecated==1.2.15 # via pikepdf execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) img2pdf==0.5.1 # via dycw-utilities (pyproject.toml) @@ -35,7 +35,7 @@ lxml==5.3.0 # via pikepdf markupsafe==3.0.2 # via jinja2 -narwhals==1.21.0 +narwhals==1.21.1 # via altair packaging==24.2 # via @@ -64,7 +64,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/astor.txt b/requirements/astor.txt index 84103dd92..f9737c3e2 100644 --- a/requirements/astor.txt +++ b/requirements/astor.txt @@ -12,7 +12,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -33,7 +33,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/asyncio.txt b/requirements/asyncio.txt index 177ef4fea..ffd9810ef 100644 --- a/requirements/asyncio.txt +++ b/requirements/asyncio.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/atomicwrites.txt b/requirements/atomicwrites.txt index 218aae630..733b36f42 100644 --- a/requirements/atomicwrites.txt +++ b/requirements/atomicwrites.txt @@ -12,7 +12,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -33,7 +33,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/atools.txt b/requirements/atools.txt index 6ae2d655f..4096043cc 100644 --- a/requirements/atools.txt +++ b/requirements/atools.txt @@ -14,7 +14,7 @@ execnet==2.1.1 # via pytest-xdist frozendict==2.4.6 # via atools -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -35,7 +35,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/beartype.txt b/requirements/beartype.txt index 9af4b3db4..2390d62e6 100644 --- a/requirements/beartype.txt +++ b/requirements/beartype.txt @@ -12,7 +12,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -33,7 +33,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/cachetools.txt b/requirements/cachetools.txt index c9ac65d3f..8ca31cb48 100644 --- a/requirements/cachetools.txt +++ b/requirements/cachetools.txt @@ -12,7 +12,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -33,7 +33,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/click.txt b/requirements/click.txt index 71e10986b..418a6e221 100644 --- a/requirements/click.txt +++ b/requirements/click.txt @@ -12,7 +12,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -33,7 +33,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/contextlib.txt b/requirements/contextlib.txt index a2f3b28cc..bf9307912 100644 --- a/requirements/contextlib.txt +++ b/requirements/contextlib.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/cryptography.txt b/requirements/cryptography.txt index 4bcf944e1..8d0ea9113 100644 --- a/requirements/cryptography.txt +++ b/requirements/cryptography.txt @@ -14,7 +14,7 @@ cryptography==44.0.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -37,7 +37,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/cvxpy.txt b/requirements/cvxpy.txt index beaf7ea12..f4c42eede 100644 --- a/requirements/cvxpy.txt +++ b/requirements/cvxpy.txt @@ -14,7 +14,7 @@ cvxpy==1.6.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -45,7 +45,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/dataclasses.txt b/requirements/dataclasses.txt index e8827729e..7e0e10815 100644 --- a/requirements/dataclasses.txt +++ b/requirements/dataclasses.txt @@ -12,7 +12,7 @@ eventkit==1.0.3 # via ib-async-dataclass execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) ib-async-dataclass==1.0.3rc5 # via dycw-utilities (pyproject.toml) @@ -22,7 +22,7 @@ nest-asyncio==1.6.0 # via ib-async-dataclass numpy==2.2.1 # via eventkit -orjson==3.10.13 +orjson==3.10.14 # via dycw-utilities (pyproject.toml) packaging==24.2 # via @@ -43,7 +43,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/datetime.txt b/requirements/datetime.txt index 99dc75c57..f5fbb9a9d 100644 --- a/requirements/datetime.txt +++ b/requirements/datetime.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/enum.txt b/requirements/enum.txt index bed39eb61..b2c2e5d4b 100644 --- a/requirements/enum.txt +++ b/requirements/enum.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/errors.txt b/requirements/errors.txt index cb26a0215..8ef9ef5b9 100644 --- a/requirements/errors.txt +++ b/requirements/errors.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/eventkit.txt b/requirements/eventkit.txt index 84206e518..b4a7d0ba7 100644 --- a/requirements/eventkit.txt +++ b/requirements/eventkit.txt @@ -12,7 +12,7 @@ eventkit==1.0.3 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -35,7 +35,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/fastapi.txt b/requirements/fastapi.txt index cf5f047ee..b9c9d3bef 100644 --- a/requirements/fastapi.txt +++ b/requirements/fastapi.txt @@ -32,7 +32,7 @@ httpcore==1.0.7 # via httpx httpx==0.28.1 # via dycw-utilities (pyproject.toml) -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) idna==3.10 # via @@ -61,7 +61,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/fpdf2.txt b/requirements/fpdf2.txt index cd3aaf72f..aa8348ab9 100644 --- a/requirements/fpdf2.txt +++ b/requirements/fpdf2.txt @@ -16,7 +16,7 @@ fonttools==4.55.3 # via fpdf2 fpdf2==2.8.2 # via dycw-utilities (pyproject.toml) -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -39,7 +39,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/functions.txt b/requirements/functions.txt index 07fc2fd92..0d44fb582 100644 --- a/requirements/functions.txt +++ b/requirements/functions.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/functools.txt b/requirements/functools.txt index c81b2e40a..80bf9599c 100644 --- a/requirements/functools.txt +++ b/requirements/functools.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/getpass.txt b/requirements/getpass.txt index 11e068760..86301e4ba 100644 --- a/requirements/getpass.txt +++ b/requirements/getpass.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/git.txt b/requirements/git.txt index 349d98bec..24a0d44b6 100644 --- a/requirements/git.txt +++ b/requirements/git.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/hashlib.txt b/requirements/hashlib.txt index 0a997e5de..2d13f481c 100644 --- a/requirements/hashlib.txt +++ b/requirements/hashlib.txt @@ -12,7 +12,7 @@ eventkit==1.0.3 # via ib-async-dataclass execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) ib-async-dataclass==1.0.3rc5 # via dycw-utilities (pyproject.toml) @@ -22,7 +22,7 @@ nest-asyncio==1.6.0 # via ib-async-dataclass numpy==2.2.1 # via eventkit -orjson==3.10.13 +orjson==3.10.14 # via dycw-utilities (pyproject.toml) packaging==24.2 # via @@ -43,7 +43,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/http.txt b/requirements/http.txt index f34157145..988fe9f11 100644 --- a/requirements/http.txt +++ b/requirements/http.txt @@ -12,11 +12,11 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest -orjson==3.10.13 +orjson==3.10.14 # via dycw-utilities (pyproject.toml) packaging==24.2 # via @@ -35,7 +35,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/humps.txt b/requirements/humps.txt index 91be10981..fae5d1660 100644 --- a/requirements/humps.txt +++ b/requirements/humps.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -33,7 +33,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/hypothesis.txt b/requirements/hypothesis.txt index 0103dff41..c7ebe5e5f 100644 --- a/requirements/hypothesis.txt +++ b/requirements/hypothesis.txt @@ -18,7 +18,7 @@ execnet==2.1.1 # via pytest-xdist greenlet==3.1.1 # via dycw-utilities (pyproject.toml) -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -41,7 +41,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/ipython.txt b/requirements/ipython.txt index 16cbbb489..8d0634574 100644 --- a/requirements/ipython.txt +++ b/requirements/ipython.txt @@ -16,7 +16,7 @@ execnet==2.1.1 # via pytest-xdist executing==2.1.0 # via stack-data -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -55,7 +55,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/iterables.txt b/requirements/iterables.txt index 796f6aa3f..68eff58d1 100644 --- a/requirements/iterables.txt +++ b/requirements/iterables.txt @@ -12,7 +12,7 @@ eventkit==1.0.3 # via ib-async-dataclass execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) ib-async-dataclass==1.0.3rc5 # via dycw-utilities (pyproject.toml) @@ -41,7 +41,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/jupyter.txt b/requirements/jupyter.txt index a274af297..d15160793 100644 --- a/requirements/jupyter.txt +++ b/requirements/jupyter.txt @@ -64,7 +64,7 @@ httpcore==1.0.7 # via httpx httpx==0.28.1 # via jupyterlab -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) idna==3.10 # via @@ -125,7 +125,7 @@ jupyter-server==2.15.0 # notebook-shim jupyter-server-terminals==0.5.3 # via jupyter-server -jupyterlab==4.2.6 +jupyterlab==4.2.7 # via dycw-utilities (pyproject.toml) jupyterlab-pygments==0.3.0 # via nbconvert @@ -210,7 +210,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) @@ -261,7 +261,7 @@ rpds-py==0.22.3 # referencing send2trash==1.8.3 # via jupyter-server -setuptools==75.7.0 +setuptools==75.8.0 # via jupyterlab six==1.17.0 # via diff --git a/requirements/logging.txt b/requirements/logging.txt index cb1acc323..e93af49cd 100644 --- a/requirements/logging.txt +++ b/requirements/logging.txt @@ -46,7 +46,7 @@ humanfriendly==10.0 # via coloredlogs hyperlink==21.0.0 # via hatch -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) idna==3.10 # via @@ -108,7 +108,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) @@ -138,7 +138,7 @@ tomli-w==1.1.0 # via hatch tomlkit==0.13.2 # via hatch -trove-classifiers==2025.1.6.15 +trove-classifiers==2025.1.7.14 # via hatchling typing-extensions==4.12.2 # via @@ -148,7 +148,7 @@ tzlocal==5.2 # via dycw-utilities (pyproject.toml) userpath==1.9.2 # via hatch -uv==0.5.15 +uv==0.5.16 # via hatch virtualenv==20.28.1 # via hatch diff --git a/requirements/loguru.txt b/requirements/loguru.txt index 210e5f8e9..cd6110f64 100644 --- a/requirements/loguru.txt +++ b/requirements/loguru.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -33,7 +33,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/math.txt b/requirements/math.txt index 7c4107e69..48bcedc76 100644 --- a/requirements/math.txt +++ b/requirements/math.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -33,7 +33,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/memory-profiler.txt b/requirements/memory-profiler.txt index a2cc7c30a..dccaab6e6 100644 --- a/requirements/memory-profiler.txt +++ b/requirements/memory-profiler.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -35,7 +35,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/modules.txt b/requirements/modules.txt index c9f2ba496..67b9053b5 100644 --- a/requirements/modules.txt +++ b/requirements/modules.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/more-itertools.txt b/requirements/more-itertools.txt index a4f2719c7..1ded6b9cd 100644 --- a/requirements/more-itertools.txt +++ b/requirements/more-itertools.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -33,7 +33,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/numpy.txt b/requirements/numpy.txt index 58264865c..53661f17a 100644 --- a/requirements/numpy.txt +++ b/requirements/numpy.txt @@ -12,7 +12,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -45,7 +45,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/optuna.txt b/requirements/optuna.txt index 8efb66a11..548a368fb 100644 --- a/requirements/optuna.txt +++ b/requirements/optuna.txt @@ -14,7 +14,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -44,7 +44,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/orjson.txt b/requirements/orjson.txt index 2e8ce81cf..612f93944 100644 --- a/requirements/orjson.txt +++ b/requirements/orjson.txt @@ -12,7 +12,7 @@ eventkit==1.0.3 # via ib-async-dataclass execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) ib-async-dataclass==1.0.3rc5 # via dycw-utilities (pyproject.toml) @@ -26,7 +26,7 @@ nest-asyncio==1.6.0 # via ib-async-dataclass numpy==2.2.1 # via eventkit -orjson==3.10.13 +orjson==3.10.14 # via dycw-utilities (pyproject.toml) packaging==24.2 # via @@ -49,7 +49,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/os.txt b/requirements/os.txt index 712ef3ca2..c05d079e6 100644 --- a/requirements/os.txt +++ b/requirements/os.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/pathlib.txt b/requirements/pathlib.txt index 42bda7c79..f10ad0a06 100644 --- a/requirements/pathlib.txt +++ b/requirements/pathlib.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/pickle.txt b/requirements/pickle.txt index 8af94b529..f74b9f037 100644 --- a/requirements/pickle.txt +++ b/requirements/pickle.txt @@ -12,7 +12,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -33,7 +33,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/platform.txt b/requirements/platform.txt index ca163b698..3b8943602 100644 --- a/requirements/platform.txt +++ b/requirements/platform.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/polars.txt b/requirements/polars.txt index 573f5e6e1..a6de98dcb 100644 --- a/requirements/polars.txt +++ b/requirements/polars.txt @@ -12,7 +12,7 @@ dacite==1.8.1 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -35,7 +35,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/pqdm.txt b/requirements/pqdm.txt index af87d91fd..b41cde8ca 100644 --- a/requirements/pqdm.txt +++ b/requirements/pqdm.txt @@ -12,7 +12,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -35,7 +35,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/pydantic.txt b/requirements/pydantic.txt index 1d95de37e..b9f87dbbd 100644 --- a/requirements/pydantic.txt +++ b/requirements/pydantic.txt @@ -14,7 +14,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -39,7 +39,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/pyinstrument.txt b/requirements/pyinstrument.txt index e0fd4d927..7958a7e2e 100644 --- a/requirements/pyinstrument.txt +++ b/requirements/pyinstrument.txt @@ -12,7 +12,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -35,7 +35,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/pyrsistent.txt b/requirements/pyrsistent.txt index 0c67e481e..b6001e36f 100644 --- a/requirements/pyrsistent.txt +++ b/requirements/pyrsistent.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -33,7 +33,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/pytest.txt b/requirements/pytest.txt index 2ddb6df41..7e46436cc 100644 --- a/requirements/pytest.txt +++ b/requirements/pytest.txt @@ -12,11 +12,11 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest -orjson==3.10.13 +orjson==3.10.14 # via dycw-utilities (pyproject.toml) packaging==24.2 # via @@ -35,7 +35,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/python-dotenv.txt b/requirements/python-dotenv.txt index 507e0dd54..c85154489 100644 --- a/requirements/python-dotenv.txt +++ b/requirements/python-dotenv.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/random.txt b/requirements/random.txt index 63321d435..298b8d113 100644 --- a/requirements/random.txt +++ b/requirements/random.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/re.txt b/requirements/re.txt index c15e52f08..080b75e80 100644 --- a/requirements/re.txt +++ b/requirements/re.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/redis.txt b/requirements/redis.txt index 0d9e42702..f211dd12d 100644 --- a/requirements/redis.txt +++ b/requirements/redis.txt @@ -14,7 +14,7 @@ eventkit==1.0.3 # via ib-async-dataclass execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) ib-async-dataclass==1.0.3rc5 # via dycw-utilities (pyproject.toml) @@ -28,7 +28,7 @@ nest-asyncio==1.6.0 # via ib-async-dataclass numpy==2.2.1 # via eventkit -orjson==3.10.13 +orjson==3.10.14 # via dycw-utilities (pyproject.toml) packaging==24.2 # via @@ -51,7 +51,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/rich.txt b/requirements/rich.txt index e04aa4834..3f52430b0 100644 --- a/requirements/rich.txt +++ b/requirements/rich.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -37,7 +37,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/scipy.txt b/requirements/scipy.txt index 3d11bfffd..b3f9a6933 100644 --- a/requirements/scipy.txt +++ b/requirements/scipy.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -33,7 +33,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/sentinel.txt b/requirements/sentinel.txt index ab8964514..7436796a2 100644 --- a/requirements/sentinel.txt +++ b/requirements/sentinel.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/slack-sdk.txt b/requirements/slack-sdk.txt index 97c71a1fe..7a1b8ca30 100644 --- a/requirements/slack-sdk.txt +++ b/requirements/slack-sdk.txt @@ -22,7 +22,7 @@ frozenlist==1.5.0 # via # aiohttp # aiosignal -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) idna==3.10 # via yarl @@ -53,7 +53,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/socket.txt b/requirements/socket.txt index a0d93b05d..70615211a 100644 --- a/requirements/socket.txt +++ b/requirements/socket.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/sqlalchemy-polars.txt b/requirements/sqlalchemy-polars.txt index 1ac472e78..072174c44 100644 --- a/requirements/sqlalchemy-polars.txt +++ b/requirements/sqlalchemy-polars.txt @@ -16,7 +16,7 @@ execnet==2.1.1 # via pytest-xdist greenlet==3.1.1 # via dycw-utilities (pyproject.toml) -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -43,7 +43,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/sqlalchemy.txt b/requirements/sqlalchemy.txt index 04b4e9312..bc2ee048e 100644 --- a/requirements/sqlalchemy.txt +++ b/requirements/sqlalchemy.txt @@ -16,7 +16,7 @@ execnet==2.1.1 # via pytest-xdist greenlet==3.1.1 # via dycw-utilities (pyproject.toml) -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -41,7 +41,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/streamlit.txt b/requirements/streamlit.txt index 14c5af7e9..13f404c97 100644 --- a/requirements/streamlit.txt +++ b/requirements/streamlit.txt @@ -29,7 +29,7 @@ gitdb==4.0.12 # via gitpython gitpython==3.1.44 # via streamlit -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) idna==3.10 # via requests @@ -49,7 +49,7 @@ markupsafe==3.0.2 # via jinja2 mdurl==0.1.2 # via markdown-it-py -narwhals==1.21.0 +narwhals==1.21.1 # via altair numpy==2.2.1 # via @@ -69,7 +69,7 @@ pillow==11.1.0 # via streamlit pluggy==1.5.0 # via pytest -protobuf==5.29.2 +protobuf==5.29.3 # via streamlit pyarrow==18.1.0 # via streamlit @@ -87,7 +87,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/sys.txt b/requirements/sys.txt index 0aa6ad0f7..baf218800 100644 --- a/requirements/sys.txt +++ b/requirements/sys.txt @@ -40,7 +40,7 @@ httpx==0.28.1 # via hatch hyperlink==21.0.0 # via hatch -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) idna==3.10 # via @@ -100,7 +100,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) @@ -130,7 +130,7 @@ tomli-w==1.1.0 # via hatch tomlkit==0.13.2 # via hatch -trove-classifiers==2025.1.6.15 +trove-classifiers==2025.1.7.14 # via hatchling typing-extensions==4.12.2 # via @@ -140,7 +140,7 @@ tzlocal==5.2 # via dycw-utilities (pyproject.toml) userpath==1.9.2 # via hatch -uv==0.5.15 +uv==0.5.16 # via hatch virtualenv==20.28.1 # via hatch diff --git a/requirements/tempfile.txt b/requirements/tempfile.txt index cbd71697c..e70c2a0bc 100644 --- a/requirements/tempfile.txt +++ b/requirements/tempfile.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/tenacity.txt b/requirements/tenacity.txt index 33cede225..a5296decf 100644 --- a/requirements/tenacity.txt +++ b/requirements/tenacity.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/text.txt b/requirements/text.txt index 59402aff3..4d110bee1 100644 --- a/requirements/text.txt +++ b/requirements/text.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/threading.txt b/requirements/threading.txt index 25e7e578a..f322fd8be 100644 --- a/requirements/threading.txt +++ b/requirements/threading.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/timer.txt b/requirements/timer.txt index 518e32e98..dae83ebf8 100644 --- a/requirements/timer.txt +++ b/requirements/timer.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/traceback.txt b/requirements/traceback.txt index 895cf21af..5c2ea5cfe 100644 --- a/requirements/traceback.txt +++ b/requirements/traceback.txt @@ -40,7 +40,7 @@ httpx==0.28.1 # via hatch hyperlink==21.0.0 # via hatch -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) idna==3.10 # via @@ -100,7 +100,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) @@ -130,7 +130,7 @@ tomli-w==1.1.0 # via hatch tomlkit==0.13.2 # via hatch -trove-classifiers==2025.1.6.15 +trove-classifiers==2025.1.7.14 # via hatchling typing-extensions==4.12.2 # via @@ -140,7 +140,7 @@ tzlocal==5.2 # via dycw-utilities (pyproject.toml) userpath==1.9.2 # via hatch -uv==0.5.15 +uv==0.5.16 # via hatch virtualenv==20.28.1 # via hatch diff --git a/requirements/treelib.txt b/requirements/treelib.txt index a4cf1299b..31a5d8347 100644 --- a/requirements/treelib.txt +++ b/requirements/treelib.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/types.txt b/requirements/types.txt index 01954440b..3a2baae11 100644 --- a/requirements/types.txt +++ b/requirements/types.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/typing.txt b/requirements/typing.txt index b4d3ae71a..84dbe6300 100644 --- a/requirements/typing.txt +++ b/requirements/typing.txt @@ -14,7 +14,7 @@ eventkit==1.0.3 # via ib-async-dataclass execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) ib-async-dataclass==1.0.3rc5 # via dycw-utilities (pyproject.toml) @@ -43,7 +43,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/uuid.txt b/requirements/uuid.txt index a52c5057f..da0d4681b 100644 --- a/requirements/uuid.txt +++ b/requirements/uuid.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/version.txt b/requirements/version.txt index e7965a26a..2743a05b0 100644 --- a/requirements/version.txt +++ b/requirements/version.txt @@ -38,7 +38,7 @@ httpx==0.28.1 # via hatch hyperlink==21.0.0 # via hatch -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) idna==3.10 # via @@ -98,7 +98,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) @@ -126,7 +126,7 @@ tomli-w==1.1.0 # via hatch tomlkit==0.13.2 # via hatch -trove-classifiers==2025.1.6.15 +trove-classifiers==2025.1.7.14 # via hatchling typing-extensions==4.12.2 # via @@ -134,7 +134,7 @@ typing-extensions==4.12.2 # anyio userpath==1.9.2 # via hatch -uv==0.5.15 +uv==0.5.16 # via hatch virtualenv==20.28.1 # via hatch diff --git a/requirements/warnings.txt b/requirements/warnings.txt index d0fcd344c..107e67dbd 100644 --- a/requirements/warnings.txt +++ b/requirements/warnings.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/whenever.txt b/requirements/whenever.txt index c5236da21..e946202c7 100644 --- a/requirements/whenever.txt +++ b/requirements/whenever.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/zipfile.txt b/requirements/zipfile.txt index d2c3ee5e5..0a1f4ae7c 100644 --- a/requirements/zipfile.txt +++ b/requirements/zipfile.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/requirements/zoneinfo.txt b/requirements/zoneinfo.txt index 6a05a9ddc..f109a9326 100644 --- a/requirements/zoneinfo.txt +++ b/requirements/zoneinfo.txt @@ -10,7 +10,7 @@ coverage-conditional-plugin==0.9.0 # via dycw-utilities (pyproject.toml) execnet==2.1.1 # via pytest-xdist -hypothesis==6.123.7 +hypothesis==6.123.11 # via dycw-utilities (pyproject.toml) iniconfig==2.0.0 # via pytest @@ -31,7 +31,7 @@ pytest==8.3.4 # pytest-randomly # pytest-rerunfailures # pytest-xdist -pytest-asyncio==0.25.1 +pytest-asyncio==0.25.2 # via dycw-utilities (pyproject.toml) pytest-cov==6.0.0 # via dycw-utilities (pyproject.toml) diff --git a/src/tests/conftest.py b/src/tests/conftest.py index df2c2e47f..05f334d1c 100644 --- a/src/tests/conftest.py +++ b/src/tests/conftest.py @@ -143,31 +143,30 @@ def traceback_func_task_group_one() -> Pattern[str]: Host \| .+ Version \| .+ - Exception group 1/1: - Path: - Frame 1/1: func_task_group_one_first \(tests\.test_traceback_funcs\.task_group_one\) - Inputs: - args\[0\] = 1 - args\[1\] = 2 - args\[2\] = 3 - args\[3\] = 4 - kwargs\[c\] = 5 - kwargs\[d\] = 6 - kwargs\[e\] = 7 - Locals: - a = 2 - b = 4 - c = 10 - args = \(6, 8\) - kwargs = {'d': 12, 'e': 14} - tg = - _ = exception=AssertionError\('Result \(112\) must be divisible by 10'\)> - Line 18: - async with TaskGroup\(\) as tg: - Raised: - ExceptionGroup\(unhandled errors in a TaskGroup \(1 sub-exception\)\) + Exception group: + Frame 1/1: func_task_group_one_first \(tests\.test_traceback_funcs\.task_group_one\) + Inputs: + args\[0\] = 1 + args\[1\] = 2 + args\[2\] = 3 + args\[3\] = 4 + kwargs\[c\] = 5 + kwargs\[d\] = 6 + kwargs\[e\] = 7 + Locals: + a = 2 + b = 4 + c = 10 + args = \(6, 8\) + kwargs = {'d': 12, 'e': 14} + tg = + _ = exception=AssertionError\('Result \(112\) must be divisible by 10'\)> + Line 18: + async with TaskGroup\(\) as tg: + Raised: + ExceptionGroup\(unhandled errors in a TaskGroup \(1 sub-exception\)\) - Group error 1/1: + Exception group error 1/1: Frame 1/1: func_task_group_one_second \(tests\.test_traceback_funcs\.task_group_one\) Inputs: args\[0\] = 2 diff --git a/src/tests/test_traceback.py b/src/tests/test_traceback.py index c56c19594..309c33980 100644 --- a/src/tests/test_traceback.py +++ b/src/tests/test_traceback.py @@ -32,7 +32,7 @@ from tests.test_traceback_funcs.task_group_two import func_task_group_two_first from tests.test_traceback_funcs.two import func_two_first from tests.test_traceback_funcs.untraced import func_untraced -from utilities.functions import ensure_str +from utilities.functions import ensure_str, is_sequence_of from utilities.iterables import OneNonUniqueError, one from utilities.text import strip_and_dedent from utilities.traceback import ( @@ -102,7 +102,7 @@ def test_func_one(self, *, git_ref: str, traceback_func_one: Pattern[str]) -> No exc_tb = get_rich_traceback(exc_info.value, git_ref=git_ref) assert isinstance(exc_tb, ExcTB) assert len(exc_tb) == 1 - frame = one(exc_tb) + frame = exc_tb[0] # to hit coverage assert frame.module == "tests.test_traceback_funcs.one" assert frame.name == "func_one" assert ( @@ -205,12 +205,15 @@ def test_func_chain( ) -> None: with raises(ValueError, match=".*") as exc_info: _ = func_chain_first(1, 2, 3, 4, c=5, d=6, e=7) - exc_chain = get_rich_traceback(exc_info.value, git_ref=git_ref) - assert isinstance(exc_chain, ExcChainTB) - assert len(exc_chain) == 2 - exc_tb1, exc_tb2 = exc_chain - assert isinstance(exc_tb1, ExcTB) - frame1 = one(exc_tb1) + exc_chain_tb = get_rich_traceback(exc_info.value, git_ref=git_ref) + assert isinstance(exc_chain_tb, ExcChainTB) + assert len(exc_chain_tb) == 2 + for i in range(2): + _ = exc_chain_tb[i] # to hit coverage + exc_chain_tb1, exc_chain_tb2 = exc_chain_tb + assert isinstance(exc_chain_tb1, ExcTB) + assert len(exc_chain_tb1) == 1 + frame1 = exc_chain_tb1[0] assert frame1.module == "tests.test_traceback_funcs.chain" assert frame1.name == "func_chain_first" assert frame1.code_line == "raise ValueError(msg) from error" @@ -220,9 +223,9 @@ def test_func_chain( assert frame1.locals["b"] == 4 assert frame1.locals["args"] == (6, 8) assert frame1.locals["kwargs"] == {"d": 12, "e": 14} - assert isinstance(exc_tb2, ExcTB) - assert len(exc_tb2) == 1 - frame2 = one(exc_tb2) + assert isinstance(exc_chain_tb2, ExcTB) + assert len(exc_chain_tb2) == 1 + frame2 = one(exc_chain_tb2) assert frame2.module == "tests.test_traceback_funcs.chain" assert frame2.name == "func_chain_second" assert ( @@ -236,30 +239,30 @@ def test_func_chain( assert frame2.locals["args"] == (12, 16) assert frame2.locals["kwargs"] == {"d": 24, "e": 28} - assert traceback_func_chain.search(repr(exc_chain)) + assert traceback_func_chain.search(repr(exc_chain_tb)) def test_func_decorated_sync(self, *, git_ref: str) -> None: with raises(AssertionError) as exc_info: _ = func_decorated_sync_first(1, 2, 3, 4, c=5, d=6, e=7) - exc_path = get_rich_traceback(exc_info.value, git_ref=git_ref) - assert isinstance(exc_path, ExcTB) - self._assert_decorated(exc_path, "sync") - assert len(exc_path) == 5 + exc_tb = get_rich_traceback(exc_info.value, git_ref=git_ref) + assert isinstance(exc_tb, ExcTB) + self._assert_decorated(exc_tb, "sync") + assert len(exc_tb) == 5 async def test_func_decorated_async(self, *, git_ref: str) -> None: with raises(AssertionError) as exc_info: _ = await func_decorated_async_first(1, 2, 3, 4, c=5, d=6, e=7) - error = get_rich_traceback(exc_info.value, git_ref=git_ref) - assert isinstance(error, ExcTB) - self._assert_decorated(error, "async") + exc_tb = get_rich_traceback(exc_info.value, git_ref=git_ref) + assert isinstance(exc_tb, ExcTB) + self._assert_decorated(exc_tb, "async") def test_func_recursive(self, *, git_ref: str) -> None: with raises(AssertionError) as exc_info: _ = func_recursive(1, 2, 3, 4, c=5, d=6, e=7) - exc_path = get_rich_traceback(exc_info.value, git_ref=git_ref) - assert isinstance(exc_path, ExcTB) - assert len(exc_path) == 2 - frame1, frame2 = exc_path + exc_tb = get_rich_traceback(exc_info.value, git_ref=git_ref) + assert isinstance(exc_tb, ExcTB) + assert len(exc_tb) == 2 + frame1, frame2 = exc_tb assert frame1.module == "tests.test_traceback_funcs.recursive" assert frame1.name == "func_recursive" assert frame1.code_line == "return func_recursive(a, b, *args, c=c, **kwargs)" @@ -281,84 +284,85 @@ def test_func_recursive(self, *, git_ref: str) -> None: assert frame2.locals["b"] == 8 assert frame2.locals["args"] == (12, 16) assert frame2.locals["kwargs"] == {"d": 24, "e": 28} - assert isinstance(exc_path.error, AssertionError) + assert isinstance(exc_tb.error, AssertionError) def test_func_runtime_sync(self, *, git_ref: str) -> None: with raises(AssertionError) as exc_info1: _ = func_runtime_sync(1, 2, 3, 4, c=5, d=6, e=7) - exc_path1 = get_rich_traceback(exc_info1.value, git_ref=git_ref) - assert isinstance(exc_path1, ExcTB) + exc_tb1 = get_rich_traceback(exc_info1.value, git_ref=git_ref) + assert isinstance(exc_tb1, ExcTB) with disable_trace_for_func_runtime_sync(): with raises(AssertionError) as exc_info2: _ = func_runtime_sync(1, 2, 3, 4, c=5, d=6, e=7) - exc_path2 = get_rich_traceback(exc_info2.value, git_ref=git_ref) - assert isinstance(exc_path2, AssertionError) + exc_tb2 = get_rich_traceback(exc_info2.value, git_ref=git_ref) + assert isinstance(exc_tb2, AssertionError) with raises(AssertionError) as exc_info3: _ = func_runtime_sync(1, 2, 3, 4, c=5, d=6, e=7) - exc_path3 = get_rich_traceback(exc_info3.value, git_ref=git_ref) - assert isinstance(exc_path3, ExcTB) + exc_tb3 = get_rich_traceback(exc_info3.value, git_ref=git_ref) + assert isinstance(exc_tb3, ExcTB) async def test_func_runtime_async(self, *, git_ref: str) -> None: with raises(AssertionError) as exc_info1: _ = await func_runtime_async(1, 2, 3, 4, c=5, d=6, e=7) - exc_path1 = get_rich_traceback(exc_info1.value, git_ref=git_ref) - assert isinstance(exc_path1, ExcTB) + exc_tb1 = get_rich_traceback(exc_info1.value, git_ref=git_ref) + assert isinstance(exc_tb1, ExcTB) with disable_trace_for_func_runtime_async(): with raises(AssertionError) as exc_info2: _ = await func_runtime_async(1, 2, 3, 4, c=5, d=6, e=7) - exc_path2 = get_rich_traceback(exc_info2.value, git_ref=git_ref) - assert isinstance(exc_path2, AssertionError) + exc_tb2 = get_rich_traceback(exc_info2.value, git_ref=git_ref) + assert isinstance(exc_tb2, AssertionError) with raises(AssertionError) as exc_info3: _ = await func_runtime_async(1, 2, 3, 4, c=5, d=6, e=7) - exc_path3 = get_rich_traceback(exc_info3.value, git_ref=git_ref) - assert isinstance(exc_path3, ExcTB) + exc_tb3 = get_rich_traceback(exc_info3.value, git_ref=git_ref) + assert isinstance(exc_tb3, ExcTB) def test_func_setup(self, *, git_ref: str) -> None: with raises(AssertionError) as exc_info1: _ = func_setup(1, 2, 3, 4, c=5, d=6, e=7) - exc_path1 = get_rich_traceback(exc_info1.value, git_ref=git_ref) - assert isinstance(exc_path1, AssertionError) + assertion_error = get_rich_traceback(exc_info1.value, git_ref=git_ref) + assert isinstance(assertion_error, AssertionError) async def test_func_task_group_one( self, *, git_ref: str, traceback_func_task_group_one: Pattern[str] ) -> None: with raises(ExceptionGroup) as exc_info: await func_task_group_one_first(1, 2, 3, 4, c=5, d=6, e=7) - exc_group = get_rich_traceback(exc_info.value, git_ref=git_ref) - assert isinstance(exc_group, ExcGroupTB) - assert exc_group.path is not None - assert len(exc_group.path) == 1 - path_frame = one(exc_group.path) - assert path_frame.module == "tests.test_traceback_funcs.task_group_one" - assert path_frame.name == "func_task_group_one_first" - assert path_frame.code_line == "async with TaskGroup() as tg:" - assert path_frame.args == (1, 2, 3, 4) - assert path_frame.kwargs == {"c": 5, "d": 6, "e": 7} - assert path_frame.locals["a"] == 2 - assert path_frame.locals["b"] == 4 - assert path_frame.locals["args"] == (6, 8) - assert path_frame.locals["kwargs"] == {"d": 12, "e": 14} - assert isinstance(exc_group.path.error, ExceptionGroup) - assert len(exc_group.errors) == 1 - exc_path = one(exc_group.errors) - assert isinstance(exc_path, ExcTB) - assert len(exc_path) == 1 - frame = one(exc_path) - assert frame.module == "tests.test_traceback_funcs.task_group_one" - assert frame.name == "func_task_group_one_second" + exc_group_tb = get_rich_traceback(exc_info.value, git_ref=git_ref) + assert isinstance(exc_group_tb, ExcGroupTB) + assert isinstance(exc_group_tb.exc_group, ExcTB) + assert len(exc_group_tb.exc_group) == 1 + frame_outer = one(exc_group_tb.exc_group) + assert frame_outer.module == "tests.test_traceback_funcs.task_group_one" + assert frame_outer.name == "func_task_group_one_first" + assert frame_outer.code_line == "async with TaskGroup() as tg:" + assert frame_outer.args == (1, 2, 3, 4) + assert frame_outer.kwargs == {"c": 5, "d": 6, "e": 7} + assert frame_outer.locals["a"] == 2 + assert frame_outer.locals["b"] == 4 + assert frame_outer.locals["args"] == (6, 8) + assert frame_outer.locals["kwargs"] == {"d": 12, "e": 14} + assert isinstance(exc_group_tb.exc_group.error, ExceptionGroup) + assert len(exc_group_tb.exc_group.error.exceptions) == 1 + assert isinstance(one(exc_group_tb.exc_group.error.exceptions), AssertionError) + assert len(exc_group_tb.errors) == 1 + assert is_sequence_of(exc_group_tb.errors, ExcTB) + assert len(one(exc_group_tb.errors)) == 1 + frame_inner = one(one(exc_group_tb.errors)) + assert frame_inner.module == "tests.test_traceback_funcs.task_group_one" + assert frame_inner.name == "func_task_group_one_second" assert ( - frame.code_line + frame_inner.code_line == 'assert result % 10 == 0, f"Result ({result}) must be divisible by 10"' ) - assert frame.args == (2, 4, 6, 8) - assert frame.kwargs == {"c": 10, "d": 12, "e": 14} - assert frame.locals["a"] == 4 - assert frame.locals["b"] == 8 - assert frame.locals["args"] == (12, 16) - assert frame.locals["kwargs"] == {"d": 24, "e": 28} - assert isinstance(exc_path.error, AssertionError) - - res_group = repr(exc_group) + assert frame_inner.args == (2, 4, 6, 8) + assert frame_inner.kwargs == {"c": 10, "d": 12, "e": 14} + assert frame_inner.locals["a"] == 4 + assert frame_inner.locals["b"] == 8 + assert frame_inner.locals["args"] == (12, 16) + assert frame_inner.locals["kwargs"] == {"d": 24, "e": 28} + assert isinstance(one(exc_group_tb.errors).error, AssertionError) + + res_group = repr(exc_group_tb) assert traceback_func_task_group_one.search(res_group) @FLAKY @@ -366,55 +370,55 @@ async def test_func_task_group_one( async def test_func_task_group_two(self, *, git_ref: str) -> None: with raises(ExceptionGroup) as exc_info: await func_task_group_two_first(1, 2, 3, 4, c=5, d=6, e=7) - exc_group = get_rich_traceback(exc_info.value, git_ref=git_ref) - assert isinstance(exc_group, ExcGroupTB) - assert exc_group.path is not None - assert len(exc_group.path) == 1 - frame0 = one(exc_group.path) - assert frame0.module == "tests.test_traceback_funcs.task_group_two" - assert frame0.name == "func_task_group_two_first" - assert frame0.code_line == "async with TaskGroup() as tg:" - assert frame0.args == (1, 2, 3, 4) - assert frame0.kwargs == {"c": 5, "d": 6, "e": 7} - assert frame0.locals["a"] == 2 - assert frame0.locals["b"] == 4 - assert frame0.locals["args"] == (6, 8) - assert frame0.locals["kwargs"] == {"d": 12, "e": 14} - assert isinstance(exc_group.path.error, ExceptionGroup) - assert len(exc_group.errors) == 2 - exc_path1, exc_path2 = exc_group.errors - assert isinstance(exc_path1, ExcTB) - assert len(exc_path1) == 1 - frame1 = one(exc_path1) - assert frame1.module == "tests.test_traceback_funcs.task_group_two" - assert frame1.name == "func_task_group_two_second" + exc_group_tb = get_rich_traceback(exc_info.value, git_ref=git_ref) + assert isinstance(exc_group_tb, ExcGroupTB) + assert isinstance(exc_group_tb.exc_group, ExcTB) + assert len(exc_group_tb.exc_group) == 1 + frame_outer = one(exc_group_tb.exc_group) + assert frame_outer.module == "tests.test_traceback_funcs.task_group_two" + assert frame_outer.name == "func_task_group_two_first" + assert frame_outer.code_line == "async with TaskGroup() as tg:" + assert frame_outer.args == (1, 2, 3, 4) + assert frame_outer.kwargs == {"c": 5, "d": 6, "e": 7} + assert frame_outer.locals["a"] == 2 + assert frame_outer.locals["b"] == 4 + assert frame_outer.locals["args"] == (6, 8) + assert frame_outer.locals["kwargs"] == {"d": 12, "e": 14} + assert isinstance(exc_group_tb.exc_group.error, ExceptionGroup) + assert len(exc_group_tb.errors) == 2 + assert is_sequence_of(exc_group_tb.exc_group.error.exceptions, AssertionError) + assert is_sequence_of(exc_group_tb.errors, ExcTB) + assert len(exc_group_tb.errors) == 2 + assert len(exc_group_tb.errors[0]) == 1 + frame_inner1 = one(exc_group_tb.errors[0]) + assert frame_inner1.module == "tests.test_traceback_funcs.task_group_two" + assert frame_inner1.name == "func_task_group_two_second" assert ( - frame1.code_line + frame_inner1.code_line == 'assert result % 10 == 0, f"Result ({result}) must be divisible by 10"' ) - assert frame1.args == (2, 4, 6, 8) - assert frame1.kwargs == {"c": 10, "d": 12, "e": 14} - assert frame1.locals["a"] == 4 - assert frame1.locals["b"] == 8 - assert frame1.locals["args"] == (12, 16) - assert frame1.locals["kwargs"] == {"d": 24, "e": 28} - assert isinstance(exc_path1.error, AssertionError) - assert isinstance(exc_path2, ExcTB) - assert len(exc_path2) == 1 - frame2 = one(exc_path2) - assert frame2.module == "tests.test_traceback_funcs.task_group_two" - assert frame2.name == "func_task_group_two_second" + assert frame_inner1.args == (2, 4, 6, 8) + assert frame_inner1.kwargs == {"c": 10, "d": 12, "e": 14} + assert frame_inner1.locals["a"] == 4 + assert frame_inner1.locals["b"] == 8 + assert frame_inner1.locals["args"] == (12, 16) + assert frame_inner1.locals["kwargs"] == {"d": 24, "e": 28} + assert isinstance(exc_group_tb.errors[0].error, AssertionError) + assert len(exc_group_tb.errors[1]) == 1 + frame_inner2 = one(exc_group_tb.errors[1]) + assert frame_inner2.module == "tests.test_traceback_funcs.task_group_two" + assert frame_inner2.name == "func_task_group_two_second" assert ( - frame2.code_line + frame_inner2.code_line == 'assert result % 10 == 0, f"Result ({result}) must be divisible by 10"' ) - assert frame2.args == (3, 5, 7, 9) - assert frame2.kwargs == {"c": 11, "d": 13, "e": 15} - assert frame2.locals["a"] == 6 - assert frame2.locals["b"] == 10 - assert frame2.locals["args"] == (14, 18) - assert frame2.locals["kwargs"] == {"d": 26, "e": 30} - assert isinstance(exc_path2.error, AssertionError) + assert frame_inner2.args == (3, 5, 7, 9) + assert frame_inner2.kwargs == {"c": 11, "d": 13, "e": 15} + assert frame_inner2.locals["a"] == 6 + assert frame_inner2.locals["b"] == 10 + assert frame_inner2.locals["args"] == (14, 18) + assert frame_inner2.locals["kwargs"] == {"d": 26, "e": 30} + assert isinstance(exc_group_tb.errors[1].error, AssertionError) def test_func_untraced(self, *, git_ref: str) -> None: with raises(AssertionError) as exc_info: diff --git a/src/utilities/__init__.py b/src/utilities/__init__.py index a28ee9033..c63d0df98 100644 --- a/src/utilities/__init__.py +++ b/src/utilities/__init__.py @@ -1,3 +1,3 @@ from __future__ import annotations -__version__ = "0.90.11" +__version__ = "0.90.12" diff --git a/src/utilities/traceback.py b/src/utilities/traceback.py index 49e6be73e..7b98477dc 100644 --- a/src/utilities/traceback.py +++ b/src/utilities/traceback.py @@ -38,7 +38,7 @@ get_func_qualname, ) from utilities.git import MASTER -from utilities.iterables import one +from utilities.iterables import always_iterable, one from utilities.rich import ( EXPAND_ALL, INDENT_SIZE, @@ -62,7 +62,7 @@ _F = TypeVar("_F", bound=Callable[..., Any]) _T = TypeVar("_T") -_TExc = TypeVar("_TExc", bound=BaseException) +_TBaseExc = TypeVar("_TBaseExc", bound=BaseException) _CALL_ARGS = "_CALL_ARGS" _INDENT = 4 * " " @@ -217,15 +217,22 @@ def exc_tb(self) -> _ExcTBInternal: ... # pragma: no cover @dataclass(kw_only=True, slots=True) -class ExcChainTB(Generic[_TExc]): +class ExcChainTB(Generic[_TBaseExc]): """A rich traceback for an exception chain.""" - errors: list[ExcGroupTB[_TExc] | ExcTB[_TExc] | BaseException] = field( + errors: list[ExcGroupTB[_TBaseExc] | ExcTB[_TBaseExc] | _TBaseExc] = field( default_factory=list ) git_ref: str = field(default=MASTER, repr=False) - def __iter__(self) -> Iterator[ExcGroupTB[_TExc] | ExcTB[_TExc] | BaseException]: + def __getitem__( + self, i: int, / + ) -> ExcGroupTB[_TBaseExc] | ExcTB[_TBaseExc] | _TBaseExc: + return self.errors[i] + + def __iter__( + self, + ) -> Iterator[ExcGroupTB[_TBaseExc] | ExcTB[_TBaseExc] | _TBaseExc]: yield from self.errors def __len__(self) -> int: @@ -252,26 +259,10 @@ def format( if header: # pragma: no cover lines.extend(_yield_header_lines(git_ref=self.git_ref)) total = len(self.errors) - for i, errors in enumerate(self.errors): - lines.append(f"Exception chain {i + 1}/{total}:") + for i, errors in enumerate(self.errors, start=1): + lines.append(f"Exception chain {i}/{total}:") match errors: - case ExcGroupTB(): # pragma: no cover - lines.append( - errors.format( - index=i, - total=total, - header=False, - detail=detail, - max_width=max_width, - indent_size=indent_size, - max_length=max_length, - max_string=max_string, - max_depth=max_depth, - expand_all=expand_all, - depth=1, - ) - ) - case ExcTB(): # pragma: no cover + case ExcGroupTB() | ExcTB(): lines.append( errors.format( header=False, @@ -294,11 +285,11 @@ def format( @dataclass(kw_only=True, slots=True) -class ExcGroupTB(Generic[_TExc]): +class ExcGroupTB(Generic[_TBaseExc]): """A rich traceback for an exception group.""" - path: ExcTB[_TExc] - errors: list[ExcGroupTB[_TExc] | ExcTB[_TExc] | BaseException] = field( + exc_group: ExcTB[ExceptionGroup[Any]] | ExceptionGroup[Any] + errors: list[ExcGroupTB[_TBaseExc] | ExcTB[_TBaseExc] | _TBaseExc] = field( default_factory=list ) git_ref: str = field(default=MASTER, repr=False) @@ -310,8 +301,6 @@ def __repr__(self) -> str: def format( self, *, - index: int = 0, - total: int = 1, header: bool = False, detail: bool = False, max_width: int = MAX_WIDTH, @@ -326,15 +315,18 @@ def format( lines: list[str] = [] if header: # pragma: no cover lines.extend(_yield_header_lines(git_ref=self.git_ref)) - lines.extend([ - f"Exception group {index + 1}/{total}:", - indent("Path:", _INDENT), - self.path.format(header=False, detail=detail, depth=2), - "", - ]) - total_sub_errors = len(self.errors) - for i, errors in enumerate(self.errors): - lines.append(indent(f"Group error {i + 1}/{total_sub_errors}:", _INDENT)) + lines.append("Exception group:") + match self.exc_group: + case ExcTB() as exc_tb: + lines.append(exc_tb.format(header=False, detail=detail, depth=1)) + case ExceptionGroup() as exc_group: # pragma: no cover + lines.append(_format_exception(exc_group, depth=1)) + case _ as never: + assert_never(never) + lines.append("") + total = len(self.errors) + for i, errors in enumerate(self.errors, start=1): + lines.append(indent(f"Exception group error {i}/{total}:", _INDENT)) match errors: case ExcGroupTB() | ExcTB(): # pragma: no cover lines.append( @@ -359,13 +351,16 @@ def format( @dataclass(kw_only=True, slots=True) -class ExcTB(Generic[_TExc]): +class ExcTB(Generic[_TBaseExc]): """A rich traceback for a single exception.""" frames: list[_Frame] = field(default_factory=list) - error: _TExc + error: _TBaseExc git_ref: str = field(default=MASTER, repr=False) + def __getitem__(self, i: int, /) -> _Frame: + return self.frames[i] + def __iter__(self) -> Iterator[_Frame]: yield from self.frames @@ -487,43 +482,50 @@ def format( def get_rich_traceback( - error: _TExc, /, *, git_ref: str = MASTER -) -> ExcChainTB[_TExc] | ExcGroupTB[_TExc] | ExcTB[_TExc] | BaseException: + error: _TBaseExc, /, *, git_ref: str = MASTER +) -> ExcChainTB[_TBaseExc] | ExcGroupTB[_TBaseExc] | ExcTB[_TBaseExc] | _TBaseExc: """Get a rich traceback.""" match list(yield_exceptions(error)): case []: # pragma: no cover raise ImpossibleCaseError(case=[f"{error}"]) case [err]: - err = cast(_TExc, err) - return _get_rich_traceback_non_chain(err, git_ref=git_ref) - case errors: - errors = cast(list[_TExc], errors) + err_recast = cast(_TBaseExc, err) + return _get_rich_traceback_non_chain(err_recast, git_ref=git_ref) + case errs: + errs_recast = cast(list[_TBaseExc], errs) return ExcChainTB( errors=[ - _get_rich_traceback_non_chain(e, git_ref=git_ref) for e in errors + _get_rich_traceback_non_chain(e, git_ref=git_ref) + for e in errs_recast ], git_ref=git_ref, ) def _get_rich_traceback_non_chain( - error: _TExc, /, *, git_ref: str = MASTER -) -> ExcTB[_TExc] | ExcGroupTB[_TExc] | BaseException: + error: ExceptionGroup[Any] | _TBaseExc, /, *, git_ref: str = MASTER +) -> ExcGroupTB[_TBaseExc] | ExcTB[_TBaseExc] | _TBaseExc: """Get a rich traceback, for a non-chained error.""" - if not isinstance(error, ExceptionGroup): - return _get_rich_traceback_non_chain_non_group(error, git_ref=git_ref) - path = cast( - ExcTB[_TExc], _get_rich_traceback_non_chain_non_group(error, git_ref=git_ref) - ) - errors = cast(list[_TExc], error.exceptions) - errors = [_get_rich_traceback_non_chain(e, git_ref=git_ref) for e in errors] - return ExcGroupTB(path=path, errors=errors, git_ref=git_ref) + match error: + case ExceptionGroup() as exc_group: + exc_group_or_exc_tb = _get_rich_traceback_base_one(exc_group) + errors = [ + _get_rich_traceback_non_chain(e, git_ref=git_ref) + for e in always_iterable(exc_group.exceptions) + ] + return ExcGroupTB( + exc_group=exc_group_or_exc_tb, errors=errors, git_ref=git_ref + ) + case BaseException() as base_exc: + return _get_rich_traceback_base_one(base_exc, git_ref=git_ref) + case _ as never: + assert_never(never) -def _get_rich_traceback_non_chain_non_group( - error: _TExc, /, *, git_ref: str = MASTER -) -> ExcTB[_TExc] | BaseException: - """Get a rich traceback, for a non-chained, non-grouped error.""" +def _get_rich_traceback_base_one( + error: _TBaseExc, /, *, git_ref: str = MASTER +) -> ExcTB[_TBaseExc] | _TBaseExc: + """Get a rich traceback, for a single exception.""" if isinstance(error, _HasExceptionPath): frames = [ _Frame( @@ -537,7 +539,7 @@ def _get_rich_traceback_non_chain_non_group( ) for f in error.exc_tb.frames ] - return ExcTB(frames=frames, error=cast(_TExc, error), git_ref=git_ref) + return ExcTB(frames=frames, error=error, git_ref=git_ref) return error