Skip to content

Commit e2fbbb7

Browse files
build(deps-dev): Bump the minor group across 1 directory with 6 updates (#552)
Bumps the minor group with 6 updates in the / directory: | Package | From | To | | --- | --- | --- | | [griffe](https://github.com/mkdocstrings/griffe) | `2.0.2` | `2.1.0` | | [mypy](https://github.com/python/mypy) | `2.1.0` | `2.3.0` | | [nox](https://github.com/wntrblm/nox) | `2026.4.10` | `2026.7.11` | | [hypothesis](https://github.com/HypothesisWorks/hypothesis) | `6.155.7` | `6.163.0` | | [pytest](https://github.com/pytest-dev/pytest) | `9.0.3` | `9.1.1` | | [setuptools-scm](https://github.com/pypa/setuptools-scm) | `10.0.5` | `10.2.1` | Updates `griffe` from 2.0.2 to 2.1.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/mkdocstrings/griffe/releases">griffe's releases</a>.</em></p> <blockquote> <h2>2.1.0</h2> <h2><a href="https://github.com/mkdocstrings/griffe/releases/tag/2.1.0">2.1.0</a> - 2026-06-19</h2> <p><!-- raw HTML omitted --><a href="https://github.com/mkdocstrings/griffe/compare/2.0.2...2.1.0">Compare with 2.0.2</a><!-- raw HTML omitted --></p> <h3>Build</h3> <ul> <li>Add tests to source distributions for <code>griffecli</code> and <code>griffelib</code> packages. <a href="https://redirect.github.com/mkdocstrings/griffe/issues/452">Issue-452</a></li> </ul> <h3>Features</h3> <ul> <li>Add logging format for Azure Devops (<a href="https://github.com/mkdocstrings/griffe/commit/82526e487946f838c2521e531ef8716dd12d4eea">82526e4</a> by Carsten Igel). <a href="https://redirect.github.com/mkdocstrings/griffe/pull/457">PR-457</a>, Co-authored-by: Timothée Mazzucotelli <a href="mailto:dev@pawamoy.fr">dev@pawamoy.fr</a></li> </ul> <h3>Bug Fixes</h3> <ul> <li>Rename tests module to avoid exclusion by packagers (<a href="https://github.com/mkdocstrings/griffe/commit/5b3e392006da98d5f23ba0e808393038be6014d8">5b3e392</a> by Timothée Mazzucotelli). <a href="https://redirect.github.com/mkdocstrings/griffe/issues/461">Issue-461</a></li> <li>Don't try merging overload annotations into non-function objects (<a href="https://github.com/mkdocstrings/griffe/commit/1b6b053dc4cfdc4381a9dc4b0676b7946e55951e">1b6b053</a> by Timothée Mazzucotelli). <a href="https://github.com/mkdocstrings/griffe/discussions/451">Issue-451</a></li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/mkdocstrings/griffe/blob/main/CHANGELOG.md">griffe's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/mkdocstrings/griffe/releases/tag/2.1.0">2.1.0</a> - 2026-06-19</h2> <p><!-- raw HTML omitted --><a href="https://github.com/mkdocstrings/griffe/compare/2.0.2...2.1.0">Compare with 2.0.2</a><!-- raw HTML omitted --></p> <h3>Build</h3> <ul> <li>Add tests to source distributions for <code>griffecli</code> and <code>griffelib</code> packages. <a href="https://redirect.github.com/mkdocstrings/griffe/issues/452">Issue-452</a></li> </ul> <h3>Features</h3> <ul> <li>Add logging format for Azure Devops (<a href="https://github.com/mkdocstrings/griffe/commit/82526e487946f838c2521e531ef8716dd12d4eea">82526e4</a> by Carsten Igel). <a href="https://redirect.github.com/mkdocstrings/griffe/pull/457">PR-457</a>, Co-authored-by: Timothée Mazzucotelli <a href="mailto:dev@pawamoy.fr">dev@pawamoy.fr</a></li> </ul> <h3>Bug Fixes</h3> <ul> <li>Rename tests module to avoid exclusion by packagers (<a href="https://github.com/mkdocstrings/griffe/commit/5b3e392006da98d5f23ba0e808393038be6014d8">5b3e392</a> by Timothée Mazzucotelli). <a href="https://redirect.github.com/mkdocstrings/griffe/issues/461">Issue-461</a></li> <li>Don't try merging overload annotations into non-function objects (<a href="https://github.com/mkdocstrings/griffe/commit/1b6b053dc4cfdc4381a9dc4b0676b7946e55951e">1b6b053</a> by Timothée Mazzucotelli). <a href="https://github.com/mkdocstrings/griffe/discussions/451">Issue-451</a></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/mkdocstrings/griffe/commit/6913290379b109982bb4fe814a11198a6c84c4b2"><code>6913290</code></a> chore: Prepare release 2.1.0</li> <li><a href="https://github.com/mkdocstrings/griffe/commit/20457fe6d5c22c713137d32f24c7ecb6213deba3"><code>20457fe</code></a> tests: Split test suite in two (CLI/lib)</li> <li><a href="https://github.com/mkdocstrings/griffe/commit/5b3e392006da98d5f23ba0e808393038be6014d8"><code>5b3e392</code></a> fix: Rename tests module to avoid exclusion by packagers</li> <li><a href="https://github.com/mkdocstrings/griffe/commit/5dc97b78f318ac97016fbaee83a574ff15516f58"><code>5dc97b7</code></a> chore: Docs, space trimming</li> <li><a href="https://github.com/mkdocstrings/griffe/commit/82526e487946f838c2521e531ef8716dd12d4eea"><code>82526e4</code></a> feat: Add logging format for Azure Devops</li> <li><a href="https://github.com/mkdocstrings/griffe/commit/ead0127049115282a09617412d9832cd731cb00b"><code>ead0127</code></a> fix: bump jsonschema minimum to 4.18</li> <li><a href="https://github.com/mkdocstrings/griffe/commit/702b33cfdf4cbb3ab441ea9a7adc742ccc2fb828"><code>702b33c</code></a> ci: fix typing</li> <li><a href="https://github.com/mkdocstrings/griffe/commit/1b6b053dc4cfdc4381a9dc4b0676b7946e55951e"><code>1b6b053</code></a> fix: Don't try merging overload annotations into non-function objects</li> <li><a href="https://github.com/mkdocstrings/griffe/commit/97106e4f56c99146f23864c7777e5bfaec89bafe"><code>97106e4</code></a> style: Format</li> <li>See full diff in <a href="https://github.com/mkdocstrings/griffe/compare/2.0.2...2.1.0">compare view</a></li> </ul> </details> <br /> Updates `mypy` from 2.1.0 to 2.3.0 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/python/mypy/blob/master/CHANGELOG.md">mypy's changelog</a>.</em></p> <blockquote> <h1>Mypy Release Notes</h1> <h2>Next Release</h2> <h3>Packaging changes</h3> <ul> <li>No longer provide mypyc-accelerated wheels for macOS x86_64 [mypyc-wheels <a href="https://redirect.github.com/python/mypy/issues/119">#119</a>](<a href="https://redirect.github.com/mypyc/mypy_mypyc-wheels/pull/119">mypyc/mypy_mypyc-wheels#119</a>)</li> </ul> <h2>Mypy 2.3</h2> <p>We've just uploaded mypy 2.3.0 to the Python Package Index (<a href="https://pypi.org/project/mypy/">PyPI</a>). Mypy is a static type checker for Python. This release includes new features, performance improvements and bug fixes. You can install it as follows:</p> <pre><code>python3 -m pip install -U mypy </code></pre> <p>You can read the full documentation for this release on <a href="http://mypy.readthedocs.io">Read the Docs</a>.</p> <h3>The Upcoming Switch to the New Native Parser</h3> <p>We are planning to enable the new native parser (<code>--native-parser</code>) by default soon. We recommend that you test the native parser in your projects and report any issues in the <a href="https://github.com/python/mypy/issues">mypy issue tracker</a>.</p> <h3>Mypyc Free-threading Memory Safety</h3> <p>Free-threaded Python builds that don't have the GIL require additional synchronization primitives or lock-free algorithms to ensure memory safety when there are race conditions (for example, when a thread reads a list item while another thread writes the same list item concurrently). This release greatly improves memory safety of free threading.</p> <p>List operations are now memory-safe on free threaded Python builds, even in the presence of race conditions. This has some performance cost. For list-heavy workloads, using <code>librt.vecs.vec</code> instead of list is often significantly faster, but note that <code>vec</code> is not (and likely won't be) fully memory safe, and the user is expected to avoid race conditions. The newly introduced <code>librt.threading.Lock</code> helps with this. Using variable-length tuples can also be more efficient than lists, since tuples are immutable and don't require expensive synchronization to ensure memory safety.</p> <p>Instance attribute access is also (mostly) memory safe now on free-threaded builds in the presence of race conditions. We are planning to fix the remaining unsafe cases in a future release.</p> <p>Full list of changes:</p> <ul> <li>Make attribute access memory safe on free-threaded builds (Jukka Lehtosalo, PR <a href="https://redirect.github.com/python/mypy/pull/21705">21705</a>)</li> <li>Fix unsafe borrowing of instance attributes with free-threading (Jukka Lehtosalo, PR <a href="https://redirect.github.com/python/mypy/pull/21688">21688</a>)</li> <li>Make list get/set item more memory safe on free-threaded builds (Jukka Lehtosalo, PR <a href="https://redirect.github.com/python/mypy/pull/21683">21683</a>)</li> <li>Don't borrow list items on free-threaded builds (Jukka Lehtosalo, PR <a href="https://redirect.github.com/python/mypy/pull/21679">21679</a>)</li> <li>Make multiple assignment from list memory-safe on free-threaded builds (Jukka Lehtosalo, PR <a href="https://redirect.github.com/python/mypy/pull/21684">21684</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/python/mypy/commit/8aabf8435357eaffceca7237f371e293b8168e54"><code>8aabf84</code></a> Drop +dev from version</li> <li><a href="https://github.com/python/mypy/commit/4d8ad2ab5e86c99581b73775f2c00b9b8265b589"><code>4d8ad2a</code></a> Update changelog for 2.3 release (<a href="https://redirect.github.com/python/mypy/issues/21728">#21728</a>)</li> <li><a href="https://github.com/python/mypy/commit/2c2154672040c52e481f423854d104e6cf172585"><code>2c21546</code></a> [mypyc] Update documentation of race conditions under free threading (<a href="https://redirect.github.com/python/mypy/issues/21726">#21726</a>)</li> <li><a href="https://github.com/python/mypy/commit/a9f62a3cf98a58a7a2607b7c81695802b39f5edc"><code>a9f62a3</code></a> [mypyc] Make attribute access memory safe on free-threaded builds (<a href="https://redirect.github.com/python/mypy/issues/21705">#21705</a>)</li> <li><a href="https://github.com/python/mypy/commit/0faa413ebf7c924a864ef5dabd70303d898e7766"><code>0faa413</code></a> Use <code>PYODIDE</code> environment variable for Emscripten cross-compilation detection...</li> <li><a href="https://github.com/python/mypy/commit/3d75cdb09f0928fa8b83e5ef03572ed878ac8d09"><code>3d75cdb</code></a> [mypyc] Borrow final attributes more aggressively (<a href="https://redirect.github.com/python/mypy/issues/21702">#21702</a>)</li> <li><a href="https://github.com/python/mypy/commit/24c237d85b48f618e655ffff1dc0f19089d9b599"><code>24c237d</code></a> [mypyc] Improve documentation of Final (<a href="https://redirect.github.com/python/mypy/issues/21713">#21713</a>)</li> <li><a href="https://github.com/python/mypy/commit/b5be217392b9b2771d1764066b9d600bf93ce7a8"><code>b5be217</code></a> [mypyc] Update free threading Python compatibility docs (<a href="https://redirect.github.com/python/mypy/issues/21711">#21711</a>)</li> <li><a href="https://github.com/python/mypy/commit/cbcb51add3094ec91b29cdd4c624943bf251b63f"><code>cbcb51a</code></a> Narrow for frozendict membership check (<a href="https://redirect.github.com/python/mypy/issues/21709">#21709</a>)</li> <li><a href="https://github.com/python/mypy/commit/af2bc0f3cc7f2f129f0c11294158d0c292692c3d"><code>af2bc0f</code></a> Sync typeshed (<a href="https://redirect.github.com/python/mypy/issues/21707">#21707</a>)</li> <li>Additional commits viewable in <a href="https://github.com/python/mypy/compare/v2.1.0...v2.3.0">compare view</a></li> </ul> </details> <br /> Updates `nox` from 2026.4.10 to 2026.7.11 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/wntrblm/nox/releases">nox's releases</a>.</em></p> <blockquote> <h2>2026.07.11 🏪</h2> <p>This release drops Python 3.9 and brings a batch of performance improvements, like caching uv detection and interpreter discovery, plus lazy module imports on Python 3.15. Various bugs were fixed as well.</p> <p>We'd like to thank the following folks who contributed to this release:</p> <ul> <li><a href="https://github.com/henryiii"><code>@​henryiii</code></a></li> <li><a href="https://github.com/davidhewitt"><code>@​davidhewitt</code></a></li> <li><a href="https://github.com/SAY-5"><code>@​SAY-5</code></a> (first contribution)</li> <li><a href="https://github.com/Himanshuagrawal4"><code>@​Himanshuagrawal4</code></a> (first contribution)</li> <li><a href="https://github.com/TejasAmle"><code>@​TejasAmle</code></a> (first contribution)</li> <li><a href="https://github.com/felixfontein"><code>@​felixfontein</code></a> (first contribution)</li> </ul> <p>Features:</p> <ul> <li>Drop Python 3.9 by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1049">wntrblm/nox#1049</a></li> <li>Add <code>return_code</code> property to <code>CommandFailed</code> exception by <a href="https://github.com/felixfontein"><code>@​felixfontein</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1129">wntrblm/nox#1129</a></li> </ul> <p>Performance:</p> <ul> <li>Cache session-name normalization, uv detection, interpreter discovery, and metadata reads by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1113">wntrblm/nox#1113</a></li> <li>Lazy modules on Python 3.15 by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1115">wntrblm/nox#1115</a></li> </ul> <p>Fixes:</p> <ul> <li>Script-mode pip resolution on Windows and <code>--download-python</code> fallback by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1110">wntrblm/nox#1110</a></li> <li>Don't crash when a parametrized session has an empty parameter list by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1109">wntrblm/nox#1109</a></li> <li>Hash fully non-ASCII session names instead of returning the envdir by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1108">wntrblm/nox#1108</a></li> <li>Interpreter-resolution edge cases in <code>virtualenv.py</code> by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1111">wntrblm/nox#1111</a></li> <li>Create missing parent directories for the session cache dir by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1104">wntrblm/nox#1104</a></li> <li>Enforce <code>--error-on-external-run</code> even when <code>log=False</code> by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1107">wntrblm/nox#1107</a></li> <li>Handle <code>=</code> in <code>set_env</code> values and out-of-tree <code>change_dir</code> in <code>tox-to-nox</code> by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1105">wntrblm/nox#1105</a></li> <li>Return empty dict from <code>load_toml</code> when script file is missing by <a href="https://github.com/SAY-5"><code>@​SAY-5</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1096">wntrblm/nox#1096</a></li> <li>Show envvars in CLI help by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1085">wntrblm/nox#1085</a></li> </ul> <p>Documentation:</p> <ul> <li>Add PyO3 as a user by <a href="https://github.com/davidhewitt"><code>@​davidhewitt</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1123">wntrblm/nox#1123</a></li> <li>List micromamba in <code>--default-venv-backend</code> supported names by <a href="https://github.com/SAY-5"><code>@​SAY-5</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1092">wntrblm/nox#1092</a></li> <li>Clarify <code>session.notify</code> target docs by <a href="https://github.com/Himanshuagrawal4"><code>@​Himanshuagrawal4</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1099">wntrblm/nox#1099</a></li> <li>Document venv backend for EOL Python by <a href="https://github.com/Himanshuagrawal4"><code>@​Himanshuagrawal4</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1101">wntrblm/nox#1101</a></li> <li>Fix typo in README installation section by <a href="https://github.com/TejasAmle"><code>@​TejasAmle</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1097">wntrblm/nox#1097</a></li> </ul> <p>Internal changes:</p> <ul> <li>Add Python 3.15 to the test matrix and classifiers by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1133">wntrblm/nox#1133</a></li> <li>Isolate <code>run_nox</code> envdir to fix flaky <code>test_main_requires</code> by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1134">wntrblm/nox#1134</a></li> <li>Assorted simplifications and dead-code removal by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1112">wntrblm/nox#1112</a></li> <li>Remove Python 3.9-era pins/backports and tighten generator annotations by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1106">wntrblm/nox#1106</a></li> <li>Run tests in parallel by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/965">wntrblm/nox#965</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/wntrblm/nox/blob/main/CHANGELOG.md">nox's changelog</a>.</em></p> <blockquote> <h1>Changelog</h1> <h2>2026.07.11</h2> <p>This release drops Python 3.9 and brings a batch of performance improvements, like caching uv detection and interpreter discovery, plus lazy module imports on Python 3.15. Various bugs were fixed as well.</p> <p>We'd like to thank the following folks who contributed to this release:</p> <ul> <li><a href="https://github.com/henryiii"><code>@​henryiii</code></a></li> <li><a href="https://github.com/davidhewitt"><code>@​davidhewitt</code></a></li> <li><a href="https://github.com/SAY-5"><code>@​SAY-5</code></a> (first contribution)</li> <li><a href="https://github.com/Himanshuagrawal4"><code>@​Himanshuagrawal4</code></a> (first contribution)</li> <li><a href="https://github.com/TejasAmle"><code>@​TejasAmle</code></a> (first contribution)</li> <li><a href="https://github.com/felixfontein"><code>@​felixfontein</code></a> (first contribution)</li> </ul> <p>Features:</p> <ul> <li>Drop Python 3.9 by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1049">wntrblm/nox#1049</a></li> <li>Add <code>return_code</code> property to <code>CommandFailed</code> exception by <a href="https://github.com/felixfontein"><code>@​felixfontein</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1129">wntrblm/nox#1129</a></li> </ul> <p>Performance:</p> <ul> <li>Cache session-name normalization, uv detection, interpreter discovery, and metadata reads by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1113">wntrblm/nox#1113</a></li> <li>Lazy modules on Python 3.15 by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1115">wntrblm/nox#1115</a></li> </ul> <p>Fixes:</p> <ul> <li>Script-mode pip resolution on Windows and <code>--download-python</code> fallback by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1110">wntrblm/nox#1110</a></li> <li>Don't crash when a parametrized session has an empty parameter list by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1109">wntrblm/nox#1109</a></li> <li>Hash fully non-ASCII session names instead of returning the envdir by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1108">wntrblm/nox#1108</a></li> <li>Interpreter-resolution edge cases in <code>virtualenv.py</code> by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1111">wntrblm/nox#1111</a></li> <li>Create missing parent directories for the session cache dir by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1104">wntrblm/nox#1104</a></li> <li>Enforce <code>--error-on-external-run</code> even when <code>log=False</code> by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1107">wntrblm/nox#1107</a></li> <li>Handle <code>=</code> in <code>set_env</code> values and out-of-tree <code>change_dir</code> in <code>tox-to-nox</code> by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1105">wntrblm/nox#1105</a></li> <li>Return empty dict from <code>load_toml</code> when script file is missing by <a href="https://github.com/SAY-5"><code>@​SAY-5</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1096">wntrblm/nox#1096</a></li> <li>Show envvars in CLI help by <a href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1085">wntrblm/nox#1085</a></li> </ul> <p>Documentation:</p> <ul> <li>Add PyO3 as a user by <a href="https://github.com/davidhewitt"><code>@​davidhewitt</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1123">wntrblm/nox#1123</a></li> <li>List micromamba in <code>--default-venv-backend</code> supported names by <a href="https://github.com/SAY-5"><code>@​SAY-5</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1092">wntrblm/nox#1092</a></li> <li>Clarify <code>session.notify</code> target docs by <a href="https://github.com/Himanshuagrawal4"><code>@​Himanshuagrawal4</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1099">wntrblm/nox#1099</a></li> <li>Document venv backend for EOL Python by <a href="https://github.com/Himanshuagrawal4"><code>@​Himanshuagrawal4</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1101">wntrblm/nox#1101</a></li> <li>Fix typo in README installation section by <a href="https://github.com/TejasAmle"><code>@​TejasAmle</code></a> in <a href="https://redirect.github.com/wntrblm/nox/pull/1097">wntrblm/nox#1097</a></li> </ul> <p>Internal changes:</p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/wntrblm/nox/commit/3284968a16fa5bd7fc0cc64a69a531404ccb4756"><code>3284968</code></a> chore: prepare release 2026.07.11 (<a href="https://redirect.github.com/wntrblm/nox/issues/1132">#1132</a>)</li> <li><a href="https://github.com/wntrblm/nox/commit/d73f96a257af685c948326cd37a3125ffbe778dc"><code>d73f96a</code></a> ci: add Python 3.15 to the test matrix and classifiers (<a href="https://redirect.github.com/wntrblm/nox/issues/1133">#1133</a>)</li> <li><a href="https://github.com/wntrblm/nox/commit/53919851d49123393a6502df05a1350b0c2cfe0b"><code>5391985</code></a> test: isolate run_nox envdir to fix flaky test_main_requires (<a href="https://redirect.github.com/wntrblm/nox/issues/1134">#1134</a>)</li> <li><a href="https://github.com/wntrblm/nox/commit/390d8170819d239b278137503e691419c065fa6d"><code>390d817</code></a> feat: add return_code to CommandFailed. (<a href="https://redirect.github.com/wntrblm/nox/issues/1129">#1129</a>)</li> <li><a href="https://github.com/wntrblm/nox/commit/f1d521079f2c8d9d22494ce30d0f31e8a9cd7b86"><code>f1d5210</code></a> chore(deps): bump the github-actions group with 2 updates (<a href="https://redirect.github.com/wntrblm/nox/issues/1125">#1125</a>)</li> <li><a href="https://github.com/wntrblm/nox/commit/0894b7340d4012220e146bd56657edde41d91000"><code>0894b73</code></a> chore(deps): bump the pre-commit group with 4 updates (<a href="https://redirect.github.com/wntrblm/nox/issues/1126">#1126</a>)</li> <li><a href="https://github.com/wntrblm/nox/commit/9b747edbc2c72f147325742add03c2c201d7f018"><code>9b747ed</code></a> ci: experimental MSYS2/MinGW test run (<a href="https://redirect.github.com/wntrblm/nox/issues/1122">#1122</a>)</li> <li><a href="https://github.com/wntrblm/nox/commit/8a44270d63c7d232bf4dd0773a12e1d8b43649d4"><code>8a44270</code></a> docs: add PyO3 as a user (<a href="https://redirect.github.com/wntrblm/nox/issues/1123">#1123</a>)</li> <li><a href="https://github.com/wntrblm/nox/commit/5bd0f8357ef4bee910b03373b1cdb24de0a71f35"><code>5bd0f83</code></a> perf: lazy modules on Python 3.15 (<a href="https://redirect.github.com/wntrblm/nox/issues/1115">#1115</a>)</li> <li><a href="https://github.com/wntrblm/nox/commit/982fcfa6a5a5fa10c7777be0d60acd784121e319"><code>982fcfa</code></a> chore(deps): bump dependency-groups in the pre-commit group (<a href="https://redirect.github.com/wntrblm/nox/issues/1121">#1121</a>)</li> <li>Additional commits viewable in <a href="https://github.com/wntrblm/nox/compare/2026.04.10...2026.07.11">compare view</a></li> </ul> </details> <br /> Updates `hypothesis` from 6.155.7 to 6.163.0 <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/HypothesisWorks/hypothesis/commit/793e92df4baa95a10f7f7f63751d88517fbd4bfb"><code>793e92d</code></a> Bump hypothesis version to 6.163.0 and update changelog</li> <li><a href="https://github.com/HypothesisWorks/hypothesis/commit/ba2899bc218ab778adb3ab7316f7137388960802"><code>ba2899b</code></a> Merge pull request <a href="https://redirect.github.com/HypothesisWorks/hypothesis/issues/4830">#4830</a> from Liam-DeVoe/from-regex-alphabet-collections</li> <li><a href="https://github.com/HypothesisWorks/hypothesis/commit/5e3cae290577cd842f495ff40cd899e02fa15b62"><code>5e3cae2</code></a> Bump hypothesis version to 6.162.0 and update changelog</li> <li><a href="https://github.com/HypothesisWorks/hypothesis/commit/d92a798f4d8dabba29111e0cc726a92ea0a47937"><code>d92a798</code></a> Merge pull request <a href="https://redirect.github.com/HypothesisWorks/hypothesis/issues/4811">#4811</a> from Zac-HD/claude/sleepy-keller-o5cUK</li> <li><a href="https://github.com/HypothesisWorks/hypothesis/commit/f5e473a52cc3604829aac8d9a87ba25c5880f673"><code>f5e473a</code></a> claude: support Collection[str] alphabet in from_regex, unify alphabet valida...</li> <li><a href="https://github.com/HypothesisWorks/hypothesis/commit/cbf124b97f8058d2142da0498dbb3f1a7d0ba797"><code>cbf124b</code></a> Skip non-ns dtype construction at import on pandas &lt; 2</li> <li><a href="https://github.com/HypothesisWorks/hypothesis/commit/8d0a004c0100579d511ba4ea014efdb2321a47b8"><code>8d0a004</code></a> Address review: constrain constant-offset range, simplify tz classification</li> <li><a href="https://github.com/HypothesisWorks/hypothesis/commit/8852abeebc192c1ea4386fd0fafe404384e0fe6d"><code>8852abe</code></a> add new test</li> <li><a href="https://github.com/HypothesisWorks/hypothesis/commit/72d88bddbed3612a99a5a8a97bd57a7a950b2108"><code>72d88bd</code></a> simplify tests</li> <li><a href="https://github.com/HypothesisWorks/hypothesis/commit/0addb3861bf9a508d895285a075eac0960c8e9e8"><code>0addb38</code></a> Support timezone-aware datetime dtypes in hypothesis.extra.pandas</li> <li>Additional commits viewable in <a href="https://github.com/HypothesisWorks/hypothesis/compare/v6.155.7...v6.163.0">compare view</a></li> </ul> </details> <br /> Updates `pytest` from 9.0.3 to 9.1.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pytest-dev/pytest/releases">pytest's releases</a>.</em></p> <blockquote> <h2>9.1.1</h2> <h1>pytest 9.1.1 (2026-06-19)</h1> <h2>Bug fixes</h2> <ul> <li><a href="https://redirect.github.com/pytest-dev/pytest/issues/14220">#14220</a>: Fixed a logic bug in <code>pytest.RaisesGroup</code> which would might cause it to display incorrect &quot;It matches <!-- raw HTML omitted -->FooError()<!-- raw HTML omitted --> which was paired with <!-- raw HTML omitted -->BarError<!-- raw HTML omitted -->&quot; messages.</li> <li><a href="https://redirect.github.com/pytest-dev/pytest/issues/14591">#14591</a>: Fixed a regression in pytest 9.1.0 which caused overriding a parametrized fixture with an indirect <!-- raw HTML omitted --><a href="https://github.com/pytest"><code>@​pytest</code></a>.mark.parametrize<!-- raw HTML omitted --> to fail with &quot;duplicate parametrization of '&lt;fixture name&gt;'&quot;.</li> <li><a href="https://redirect.github.com/pytest-dev/pytest/issues/14606">#14606</a>: Fixed <code>list-item</code> typing errors from mypy in <code>@pytest.mark.parametrize &lt;pytest.mark.parametrize ref&gt;</code> <code>argvalues</code> parameter.</li> <li><a href="https://redirect.github.com/pytest-dev/pytest/issues/14608">#14608</a>: Fixed a regression in pytest 9.1.0 where <code>conftest.py</code> files located in <code>&lt;invocation dir&gt;/test*</code> were no longer loaded as initial conftests when invoked without arguments. This could cause certain hooks (like <code>pytest_addoption</code>) in these files to not fire.</li> </ul> <h2>9.1.0</h2> <h1>pytest 9.1.0 (2026-06-13)</h1> <h2>Removals and backward incompatible breaking changes</h2> <ul> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/14533">#14533</a>: When using <code>--doctest-modules</code>, autouse fixtures with <code>module</code>, <code>package</code> or <code>session</code> scope that are defined inline in Python test modules (not plugins or conftests) will now possibly execute twice.</p> <p>If this is undesirable, move the fixture definition to a <code>conftest.py</code> file if possible.</p> <p>Technical explanation for those interested: When using <!-- raw HTML omitted -->--doctest-modules<!-- raw HTML omitted -->, pytest possibly collects Python modules twice, once as <code>pytest.Module</code> and once as a <code>DoctestModule</code> (depending on the configuration). Due to improvements in pytest's fixture implementation, if e.g. the <code>DoctestModule</code> collects a fixture, it is now visible to it only, and not to the <code>Module</code>. This means that both need to register the fixtures independently.</p> </li> </ul> <h2>Deprecations (removal in next major release)</h2> <ul> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/10819">#10819</a>: Added a deprecation warning for class-scoped fixtures defined as instance methods (without <code>@classmethod</code>). Such fixtures set attributes on a different instance than the test methods use, leading to unexpected behavior. Use <code>@classmethod</code> decorator instead -- by <code>yastcher</code>.</p> <p>See <code>10819</code> and <code>14011</code>.</p> </li> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/12882">#12882</a>: Calling <code>request.getfixturevalue() &lt;pytest.FixtureRequest.getfixturevalue&gt;</code> during teardown to request a fixture that was not already requested is now deprecated and will become an error in pytest 10.</p> <p>See <code>dynamic-fixture-request-during-teardown</code> for details.</p> </li> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/13409">#13409</a>: Using non-<code>~collections.abc.Collection</code> iterables (such as generators, iterators, or custom iterable objects) for the <code>argvalues</code> parameter in <code>@pytest.mark.parametrize &lt;pytest.mark.parametrize ref&gt;</code> and <code>metafunc.parametrize &lt;pytest.Metafunc.parametrize&gt;</code> is now deprecated.</p> <p>These iterables get exhausted after the first iteration, leading to tests getting unexpectedly skipped in cases such as running <code>pytest.main()</code> multiple times, using class-level parametrize decorators, or collecting tests multiple times.</p> <p>See <code>parametrize-iterators</code> for details and suggestions.</p> </li> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/13946">#13946</a>: The private <code>config.inicfg</code> attribute is now deprecated. Use <code>config.getini() &lt;pytest.Config.getini&gt;</code> to access configuration values instead.</p> <p>See <code>config-inicfg</code> for more details.</p> </li> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/14004">#14004</a>: Passing <code>baseid</code> to <code>~pytest.FixtureDef</code> or <code>nodeid</code> strings to fixture registration APIs is now deprecated. These are internal pytest APIs that are used by some plugins.</p> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pytest-dev/pytest/commit/cf470ec0bf7eb89cd97dd56df4859eae5db46447"><code>cf470ec</code></a> Prepare release version 9.1.1</li> <li><a href="https://github.com/pytest-dev/pytest/commit/e0c8ce6cc5db1f08363be6f152c32e6838df2690"><code>e0c8ce6</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/14625">#14625</a> from pytest-dev/patchback/backports/9.1.x/a07c31a97...</li> <li><a href="https://github.com/pytest-dev/pytest/commit/1b82d1694fce22385ee7a4287917fbafbaf2e757"><code>1b82d16</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/14624">#14624</a> from pytest-dev/patchback/backports/9.1.x/b375b79ec...</li> <li><a href="https://github.com/pytest-dev/pytest/commit/501c4bc784da3b08bfcaa64858eba5d15dc59e53"><code>501c4bc</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/14596">#14596</a> from bluetech/doc-classmethod</li> <li><a href="https://github.com/pytest-dev/pytest/commit/b61f588e36e9377c3d1d3f06bece1da0fc31d9ca"><code>b61f588</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/14622">#14622</a> from chrisburr/fix-14608-initial-conftest-test-subdir</li> <li><a href="https://github.com/pytest-dev/pytest/commit/9a567e009f4d2da3ce1721c6db3109cb5744d40a"><code>9a567e0</code></a> [automated] Update plugin list (<a href="https://redirect.github.com/pytest-dev/pytest/issues/14617">#14617</a>) (<a href="https://redirect.github.com/pytest-dev/pytest/issues/14618">#14618</a>)</li> <li><a href="https://github.com/pytest-dev/pytest/commit/ef8b2993e5b48639e4a3d97d0525df9760781384"><code>ef8b299</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/14620">#14620</a> from pytest-dev/patchback/backports/9.1.x/680f9f3ed...</li> <li><a href="https://github.com/pytest-dev/pytest/commit/66abd0784d4cb7c1ba44ab9a8896506cd4985acc"><code>66abd07</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/14220">#14220</a> from bysiber/fix-stale-iexp-raisesgroup</li> <li><a href="https://github.com/pytest-dev/pytest/commit/79fbf93b666cac5f27c9dad047943d47b766c8d5"><code>79fbf93</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/14612">#14612</a> from pytest-dev/patchback/backports/9.1.x/974ed48b6...</li> <li><a href="https://github.com/pytest-dev/pytest/commit/0d312eb876177e9f1c04262b54060a41034ebf5c"><code>0d312eb</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/14611">#14611</a> from bluetech/parametrize-argvalues-typing</li> <li>Additional commits viewable in <a href="https://github.com/pytest-dev/pytest/compare/9.0.3...9.1.1">compare view</a></li> </ul> </details> <br /> Updates `setuptools-scm` from 10.0.5 to 10.2.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pypa/setuptools-scm/releases">setuptools-scm's releases</a>.</em></p> <blockquote> <h2>setuptools-scm v10.2.1</h2> <h3>Fixed</h3> <ul> <li>Omit <code>scm_version.json</code> and <code>scm_file_list.json</code> from wheel <code>.dist-info</code> while still including them in sdists for fallback discovery. (<a href="https://redirect.github.com/pypa/setuptools-scm/issues/1473">#1473</a>)</li> </ul> <h2>setuptools-scm v10.2.0</h2> <h3>Added</h3> <ul> <li>Restore Python 3.8 and 3.9 support, re-enabling use as a build dependency for projects like scikit-build that still support these versions. (<a href="https://redirect.github.com/pypa/setuptools-scm/issues/1445">#1445</a>)</li> </ul> <h3>Miscellaneous</h3> <ul> <li>Move PKG-INFO discovery tests from vcs-versioning to setuptools-scm where the entry points are registered. (<a href="https://redirect.github.com/pypa/setuptools-scm/issues/1446">#1446</a>)</li> </ul> <h2>setuptools-scm v10.1.2</h2> <h3>Fixed</h3> <ul> <li>Fix DeprecationWarning leak by threading VcsEnvironment through VersionInferenceConfig and using env.make_reader() in _should_write_to_source. (<a href="https://redirect.github.com/pypa/setuptools-scm/issues/1424">#1424</a>)</li> </ul> <h2>setuptools-scm v10.1.1</h2> <h3>Fixed</h3> <ul> <li>Update CI to use PyPy 3.11 as cryptography has no PyPy 3.10 build available (<a href="https://redirect.github.com/pypa/setuptools-scm/issues/1421">#1421</a>)</li> </ul> <h2>setuptools-scm v10.1.0</h2> <h3>Added</h3> <ul> <li>Add backward-compatible shims in <code>setuptools_scm.git</code>, <code>setuptools_scm.hg</code>, <code>setuptools_scm.hg_git</code>, and <code>setuptools_scm.scm_workdir</code> so that external code calling <code>get_scm_version(config)</code> or <code>run_describe(config)</code> with an explicit <code>Configuration</code> continues to work. The shim automatically wires <code>_config</code> and <code>VcsEnvironment</code> onto the workdir. (<a href="https://github.com/pypa/setuptools-scm/issues/compat-shims">#compat-shims</a>)</li> <li>Write <code>scm_version.json</code> and <code>scm_file_list.json</code> into egg-info directories during <code>egg_info</code>, enabling sdist fallback version inference when no VCS is present. Add <code>ScmEggInfoMixin</code> for workdir-based file finding in <code>find_sources()</code>. (<a href="https://github.com/pypa/setuptools-scm/issues/egg-info-metadata">#egg-info-metadata</a>)</li> <li>Add <code>write_to_source</code> pyproject.toml option to control whether version files are written to the source tree. When unset, a deprecation warning advises setting it explicitly before the default changes in a future major release. The <code>SETUPTOOLS_SCM_WRITE_TO_SOURCE</code> environment variable overrides this setting. (<a href="https://redirect.github.com/pypa/setuptools-scm/issues/1301">#1301</a>)</li> <li>Adopt the workdir-centric pipeline from vcs-versioning: version discovery now follows an explicit <code>env → config → workdir → version</code> chain instead of relying on ambient globals and <code>parse</code> entry points. The <code>egg_info</code> command writes <code>scm_version.json</code> and <code>scm_file_list.json</code> metadata so sdists can infer versions without a VCS checkout. Requires <code>vcs-versioning &gt;= 2.0.0.dev0</code>. (<a href="https://redirect.github.com/pypa/setuptools-scm/issues/1378">#1378</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Fix worktree file listing test to expect relative paths from the file finder. The test now passes on Linux; Windows remains xfail due to a subprocess limitation with worktree directories. (<a href="https://redirect.github.com/pypa/setuptools-scm/issues/620">#620</a>)</li> <li>Remove the <code>_warn_on_old_setuptools()</code> check that incorrectly warned when a custom build-backend caused <code>setuptools.__version__</code> to return the project version instead of setuptools' version. The minimum setuptools version is now enforced via build-system requirements. (<a href="https://redirect.github.com/pypa/setuptools-scm/issues/1192">#1192</a>)</li> <li>Wrap version in <code>setuptools.sic()</code> when <code>normalize = false</code> to prevent setuptools from re-normalizing the version after our hook returns. This preserves CalVer zero-padding (e.g. <code>2024.01.05</code>) and other non-canonical version strings in <code>dist.metadata.version</code>. (<a href="https://redirect.github.com/pypa/setuptools-scm/issues/1354">#1354</a>)</li> <li>Skip writing non-package version files to build_lib, fixing incorrect inclusion of root-level version files in wheels. (<a href="https://redirect.github.com/pypa/setuptools-scm/issues/1364">#1364</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>Rewrite the GitHub Actions CI/CD example to use a dedicated build job (via <code>build-and-inspect-python-package</code>) and OIDC Trusted Publishers instead of building in publishing jobs with long-lived API tokens. (<a href="https://redirect.github.com/pypa/setuptools-scm/issues/1215">#1215</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pypa/setuptools-scm/commit/ac108b243380c10de77de32eb696b74d5f5eb63f"><code>ac108b2</code></a> Merge pull request <a href="https://redirect.github.com/pypa/setuptools-scm/issues/1475">#1475</a> from pypa/release/main</li> <li><a href="https://github.com/pypa/setuptools-scm/commit/b3beed6744fea5ead505f7b4635f624b51b769fb"><code>b3beed6</code></a> Prepare release: setuptools-scm v10.2.1</li> <li><a href="https://github.com/pypa/setuptools-scm/commit/ec67f8c628c89da807dcaaa5b8d9f781c86aff68"><code>ec67f8c</code></a> Merge pull request <a href="https://redirect.github.com/pypa/setuptools-scm/issues/1474">#1474</a> from RonnyPfannschmidt/fix/1473-omit-scm-metadata-fr...</li> <li><a href="https://github.com/pypa/setuptools-scm/commit/08f22bdc0fe75b08db380dc7bc7e034c89310c87"><code>08f22bd</code></a> fix: lazy-import bdist_wheel and simplify unlink</li> <li><a href="https://github.com/pypa/setuptools-scm/commit/82768f083db8780d2b2c568a1cc2102b20c82c44"><code>82768f0</code></a> fix: omit SCM egg-info JSON from wheels</li> <li><a href="https://github.com/pypa/setuptools-scm/commit/5b91e2faf0079157a52c0914c21beb6622e9f7a7"><code>5b91e2f</code></a> Merge pull request <a href="https://redirect.github.com/pypa/setuptools-scm/issues/1460">#1460</a> from pypa/dependabot/uv/uv-f4f52c089d</li> <li><a href="https://github.com/pypa/setuptools-scm/commit/4ac172459cd14cad465060efe50040a6caa6b983"><code>4ac1724</code></a> Merge pull request <a href="https://redirect.github.com/pypa/setuptools-scm/issues/1463">#1463</a> from pypa/release/main</li> <li><a href="https://github.com/pypa/setuptools-scm/commit/474cc9ce72e20ef3dcfd99465b0b28a244007607"><code>474cc9c</code></a> Prepare release: vcs-versioning v2.2.2</li> <li><a href="https://github.com/pypa/setuptools-scm/commit/29c8f6ce7e739c0bd84388def43043a91475d4c2"><code>29c8f6c</code></a> Merge pull request <a href="https://redirect.github.com/pypa/setuptools-scm/issues/1462">#1462</a> from RonnyPfannschmidt/fix/vcs-versioning-pytest-tim...</li> <li><a href="https://github.com/pypa/setuptools-scm/commit/25d32eee6b99cfc40fd97229ff68cdaa68ffbcff"><code>25d32ee</code></a> fix: add missing pytest-timeout to vcs-versioning test dependencies (<a href="https://redirect.github.com/pypa/setuptools-scm/issues/1461">#1461</a>)</li> <li>Additional commits viewable in <a href="https://github.com/pypa/setuptools-scm/compare/setuptools-scm-v10.0.5...setuptools-scm-v10.2.1">compare view</a></li> </ul> </details> <br />
2 parents 1e1c051 + 7215838 commit e2fbbb7

2 files changed

Lines changed: 60 additions & 42 deletions

File tree

‎pyproject.toml‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
[build-system]
55
requires = [
66
"setuptools == 82.0.1",
7-
"setuptools_scm[toml] == 10.0.5",
7+
"setuptools_scm[toml] == 10.2.1",
88
"frequenz-repo-config[lib] == 0.18.0",
99
]
1010
build-backend = "setuptools.build_meta"
@@ -60,15 +60,15 @@ dev-mkdocs = [
6060
"mkdocstrings[python] == 1.0.6",
6161
"mkdocstrings-python == 2.0.5",
6262
"pymdownx-superfence-filter-lines == 0.1.0",
63-
"griffe==2.0.2",
63+
"griffe==2.1.0",
6464
]
6565
dev-mypy = [
6666
# For checking the noxfile, docs/ script, and tests
6767
"frequenz-channels[dev-mkdocs,dev-noxfile,dev-pytest]",
68-
"mypy == 2.1.0",
68+
"mypy == 2.3.0",
6969
"types-Markdown == 3.10.2.20260518",
7070
]
71-
dev-noxfile = ["nox == 2026.4.10", "frequenz-repo-config[lib] == 0.18.0"]
71+
dev-noxfile = ["nox == 2026.7.11", "frequenz-repo-config[lib] == 0.18.0"]
7272
dev-pylint = [
7373
# For checking the noxfile, docs/ script, and tests
7474
"frequenz-channels[dev-mkdocs,dev-noxfile,dev-pytest]",
@@ -77,8 +77,8 @@ dev-pylint = [
7777
dev-pytest = [
7878
"async-solipsism == 0.9",
7979
"frequenz-repo-config[extra-lint-examples] == 0.18.0",
80-
"hypothesis == 6.155.7",
81-
"pytest == 9.0.3",
80+
"hypothesis == 6.163.0",
81+
"pytest == 9.1.1",
8282
"pytest-asyncio == 1.4.0",
8383
"pytest-mock == 3.15.1",
8484
]

‎tests/test_timer.py‎

Lines changed: 54 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import enum
88
import re
99
from datetime import timedelta
10+
from typing import Any
1011

1112
import async_solipsism
1213
import hypothesis
@@ -22,6 +23,21 @@
2223
)
2324

2425

26+
def _approx_timedelta(expected: timedelta) -> Any:
27+
"""Build an approximate comparison for a timedelta.
28+
29+
`pytest.approx()` requires an explicit tolerance to compare timedeltas, and since
30+
timers work with a microsecond resolution, one microsecond is used as the tolerance.
31+
32+
Args:
33+
expected: The timedelta the compared value should be close to.
34+
35+
Returns:
36+
An object comparing equal to any timedelta within one microsecond of `expected`.
37+
"""
38+
return pytest.approx(expected, abs=timedelta(microseconds=1))
39+
40+
2541
@pytest.fixture(autouse=True)
2642
def event_loop_policy() -> async_solipsism.EventLoopPolicy:
2743
"""Return an event loop policy that uses the async solipsism event loop."""
@@ -384,7 +400,7 @@ async def test_timer_close_receiver() -> None:
384400
timer = Timer(timedelta(seconds=1.0), TriggerAllMissed())
385401

386402
drift = await timer.receive()
387-
assert drift == pytest.approx(timedelta(seconds=0.0))
403+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
388404
assert event_loop.time() == pytest.approx(1.0)
389405

390406
timer.close()
@@ -403,7 +419,7 @@ async def test_timer_autostart() -> None:
403419
# time 1.0 without any drift
404420
await asyncio.sleep(0.5)
405421
drift = await timer.receive()
406-
assert drift == pytest.approx(timedelta(seconds=0.0))
422+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
407423
assert event_loop.time() == pytest.approx(1.0)
408424

409425

@@ -420,12 +436,12 @@ async def test_timer_autostart_with_delay() -> None:
420436
# time 1.5 without any drift
421437
await asyncio.sleep(1.2)
422438
drift = await timer.receive()
423-
assert drift == pytest.approx(timedelta(seconds=0.0))
439+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
424440
assert event_loop.time() == pytest.approx(1.5)
425441

426442
# Still the next tick should be at 2.5 (every second)
427443
drift = await timer.receive()
428-
assert drift == pytest.approx(timedelta(seconds=0.0))
444+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
429445
assert event_loop.time() == pytest.approx(2.5)
430446

431447

@@ -437,12 +453,12 @@ async def test_timer_autostart_with_tick_at_start() -> None:
437453

438454
# The first tick should be at 0.0, without any delay.
439455
drift = await timer.receive()
440-
assert drift == pytest.approx(timedelta(seconds=0.0))
456+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
441457
assert event_loop.time() == pytest.approx(0.0)
442458

443459
# The next tick should be at 1.0
444460
drift = await timer.receive()
445-
assert drift == pytest.approx(timedelta(seconds=0.0))
461+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
446462
assert event_loop.time() == pytest.approx(1.0)
447463

448464

@@ -460,12 +476,12 @@ async def test_timer_autostart_with_delay_and_tick_at_start() -> None:
460476
# The first tick should be at 0.5, as soon as the start delay is over.
461477
await asyncio.sleep(0.3)
462478
drift = await timer.receive()
463-
assert drift == pytest.approx(timedelta(seconds=0.0))
479+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
464480
assert event_loop.time() == pytest.approx(0.5)
465481

466482
# The next tick should be at 1.5
467483
drift = await timer.receive()
468-
assert drift == pytest.approx(timedelta(seconds=0.0))
484+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
469485
assert event_loop.time() == pytest.approx(1.5)
470486

471487

@@ -509,7 +525,7 @@ async def test_timer_no_autostart(
509525
else:
510526
assert False, f"Unknown start method {start_method}"
511527

512-
assert drift == pytest.approx(timedelta(seconds=0.0))
528+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
513529
assert event_loop.time() == pytest.approx(1.5)
514530

515531

@@ -523,29 +539,29 @@ async def test_timer_trigger_all_missed() -> None:
523539
# We let the first tick be triggered on time
524540
drift = await timer.receive()
525541
assert event_loop.time() == pytest.approx(interval)
526-
assert drift == pytest.approx(timedelta(seconds=0.0))
542+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
527543

528544
# Now we let the time pass interval plus a bit more, so we should get
529545
# a drift, but the next tick should be triggered still at a multiple of the
530546
# interval because we are using TRIGGER_ALL.
531547
await asyncio.sleep(interval + 0.1)
532548
drift = await timer.receive()
533549
assert event_loop.time() == pytest.approx(interval * 2 + 0.1)
534-
assert drift == pytest.approx(timedelta(seconds=0.1))
550+
assert drift == _approx_timedelta(timedelta(seconds=0.1))
535551
drift = await timer.receive()
536552
assert event_loop.time() == pytest.approx(interval * 3)
537-
assert drift == pytest.approx(timedelta(seconds=0.0))
553+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
538554

539555
# Now we let the time pass by two times the interval, so we should get
540556
# a drift of a whole interval and then next tick should be triggered
541557
# immediately with no drift, because we are still at an interval boundary.
542558
await asyncio.sleep(2 * interval)
543559
drift = await timer.receive()
544560
assert event_loop.time() == pytest.approx(interval * 5)
545-
assert drift == pytest.approx(timedelta(seconds=interval))
561+
assert drift == _approx_timedelta(timedelta(seconds=interval))
546562
drift = await timer.receive()
547563
assert event_loop.time() == pytest.approx(interval * 5)
548-
assert drift == pytest.approx(timedelta(seconds=0.0))
564+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
549565

550566
# Finally we let the time pass by 5 times the interval plus some extra
551567
# delay (even when the tolerance should be irrelevant for this mode),
@@ -556,22 +572,22 @@ async def test_timer_trigger_all_missed() -> None:
556572
await asyncio.sleep(5 * interval + extra_delay)
557573
drift = await timer.receive()
558574
assert event_loop.time() == pytest.approx(interval * 10 + extra_delay)
559-
assert drift == pytest.approx(timedelta(seconds=interval * 4 + extra_delay))
575+
assert drift == _approx_timedelta(timedelta(seconds=interval * 4 + extra_delay))
560576
drift = await timer.receive()
561577
assert event_loop.time() == pytest.approx(interval * 10 + extra_delay)
562-
assert drift == pytest.approx(timedelta(seconds=interval * 3 + extra_delay))
578+
assert drift == _approx_timedelta(timedelta(seconds=interval * 3 + extra_delay))
563579
drift = await timer.receive()
564580
assert event_loop.time() == pytest.approx(interval * 10 + extra_delay)
565-
assert drift == pytest.approx(timedelta(seconds=interval * 2 + extra_delay))
581+
assert drift == _approx_timedelta(timedelta(seconds=interval * 2 + extra_delay))
566582
drift = await timer.receive()
567583
assert event_loop.time() == pytest.approx(interval * 10 + extra_delay)
568-
assert drift == pytest.approx(timedelta(seconds=interval * 1 + extra_delay))
584+
assert drift == _approx_timedelta(timedelta(seconds=interval * 1 + extra_delay))
569585
drift = await timer.receive()
570586
assert event_loop.time() == pytest.approx(interval * 10 + extra_delay)
571-
assert drift == pytest.approx(timedelta(seconds=interval * 0 + extra_delay))
587+
assert drift == _approx_timedelta(timedelta(seconds=interval * 0 + extra_delay))
572588
drift = await timer.receive()
573589
assert event_loop.time() == pytest.approx(interval * 11)
574-
assert drift == pytest.approx(timedelta(seconds=0.0))
590+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
575591

576592

577593
async def test_timer_skip_missed_and_resync() -> None:
@@ -584,29 +600,29 @@ async def test_timer_skip_missed_and_resync() -> None:
584600
# We let the first tick be triggered on time
585601
drift = await timer.receive()
586602
assert event_loop.time() == pytest.approx(interval)
587-
assert drift == pytest.approx(timedelta(seconds=0.0))
603+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
588604

589605
# Now we let the time pass interval plus a bit more, so we should get
590606
# a drift, but the next tick should be triggered still at a multiple of the
591607
# interval because we are using TRIGGER_ALL.
592608
await asyncio.sleep(interval + 0.1)
593609
drift = await timer.receive()
594610
assert event_loop.time() == pytest.approx(interval * 2 + 0.1)
595-
assert drift == pytest.approx(timedelta(seconds=0.1))
611+
assert drift == _approx_timedelta(timedelta(seconds=0.1))
596612
drift = await timer.receive()
597613
assert event_loop.time() == pytest.approx(interval * 3)
598-
assert drift == pytest.approx(timedelta(seconds=0.0))
614+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
599615

600616
# Now we let the time pass by two times the interval, so we should get
601617
# a drift of a whole interval and then next tick should an interval later,
602618
# as the delayed tick will be skipped and the timer will resync.
603619
await asyncio.sleep(2 * interval)
604620
drift = await timer.receive()
605621
assert event_loop.time() == pytest.approx(interval * 5)
606-
assert drift == pytest.approx(timedelta(seconds=interval))
622+
assert drift == _approx_timedelta(timedelta(seconds=interval))
607623
drift = await timer.receive()
608624
assert event_loop.time() == pytest.approx(interval * 6)
609-
assert drift == pytest.approx(timedelta(seconds=0.0))
625+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
610626

611627
# Finally we let the time pass by 5 times the interval plus some extra
612628
# delay. The timer should fire immediately once with a drift of 4 intervals
@@ -616,13 +632,13 @@ async def test_timer_skip_missed_and_resync() -> None:
616632
await asyncio.sleep(5 * interval + extra_delay)
617633
drift = await timer.receive()
618634
assert event_loop.time() == pytest.approx(interval * 11 + extra_delay)
619-
assert drift == pytest.approx(timedelta(seconds=interval * 4 + extra_delay))
635+
assert drift == _approx_timedelta(timedelta(seconds=interval * 4 + extra_delay))
620636
drift = await timer.receive()
621637
assert event_loop.time() == pytest.approx(interval * 12)
622-
assert drift == pytest.approx(timedelta(seconds=0.0))
638+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
623639
drift = await timer.receive()
624640
assert event_loop.time() == pytest.approx(interval * 13)
625-
assert drift == pytest.approx(timedelta(seconds=0.0))
641+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
626642

627643

628644
async def test_timer_skip_missed_and_drift() -> None:
@@ -647,21 +663,21 @@ async def test_timer_skip_missed_and_drift() -> None:
647663
await asyncio.sleep(interval + tolerance)
648664
drift = await timer.receive()
649665
assert event_loop.time() == pytest.approx(interval * 2 + tolerance)
650-
assert drift == pytest.approx(timedelta(seconds=tolerance))
666+
assert drift == _approx_timedelta(timedelta(seconds=tolerance))
651667
drift = await timer.receive()
652668
assert event_loop.time() == pytest.approx(interval * 3)
653-
assert drift == pytest.approx(timedelta(seconds=0.0))
669+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
654670

655671
# Now we let the time pass the interval plus two times the tolerance. Now
656672
# the timer should start to drift, and the next tick should be triggered at
657673
# a multiple of the interval plus the shift of two times the tolerance.
658674
await asyncio.sleep(interval + tolerance * 2)
659675
drift = await timer.receive()
660676
assert event_loop.time() == pytest.approx(interval * 4 + tolerance * 2)
661-
assert drift == pytest.approx(timedelta(seconds=tolerance * 2))
677+
assert drift == _approx_timedelta(timedelta(seconds=tolerance * 2))
662678
drift = await timer.receive()
663679
assert event_loop.time() == pytest.approx(interval * 5 + tolerance * 2)
664-
assert drift == pytest.approx(timedelta(seconds=0.0))
680+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
665681

666682
# Now we let the time pass by two times the interval, so we should missed
667683
# one tick (the tick at time = 6 + tolerance * 2) and the next tick should
@@ -671,10 +687,10 @@ async def test_timer_skip_missed_and_drift() -> None:
671687
await asyncio.sleep(2 * interval)
672688
drift = await timer.receive()
673689
assert event_loop.time() == pytest.approx(interval * 7 + tolerance * 2)
674-
assert drift == pytest.approx(timedelta(seconds=interval))
690+
assert drift == _approx_timedelta(timedelta(seconds=interval))
675691
drift = await timer.receive()
676692
assert event_loop.time() == pytest.approx(interval * 8 + tolerance * 2)
677-
assert drift == pytest.approx(timedelta(seconds=0.0))
693+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
678694

679695
# Finally we let the time pass by 5 times the interval plus a tiny bit more
680696
# than the tolerance, so we should missed 4 ticks (the ticks at times 9+,
@@ -683,10 +699,12 @@ async def test_timer_skip_missed_and_drift() -> None:
683699
await asyncio.sleep(5 * interval + tolerance + 0.001)
684700
drift = await timer.receive()
685701
assert event_loop.time() == pytest.approx(interval * 13 + tolerance * 3 + 0.001)
686-
assert drift == pytest.approx(timedelta(seconds=interval * 4 + tolerance + 0.001))
702+
assert drift == _approx_timedelta(
703+
timedelta(seconds=interval * 4 + tolerance + 0.001)
704+
)
687705
drift = await timer.receive()
688706
assert event_loop.time() == pytest.approx(interval * 14 + tolerance * 3 + 0.001)
689-
assert drift == pytest.approx(timedelta(seconds=0.0))
707+
assert drift == _approx_timedelta(timedelta(seconds=0.0))
690708

691709

692710
async def test_timer_reset_with_new_interval() -> None:

0 commit comments

Comments
 (0)