build(deps-dev): Bump the "dev-only" group with 1 update across multiple ecosystems (#4463) Bumps the dev-only group with 5 updates in the /dev directory: | Package | From | To | | --- | --- | --- | | [absl-py](https://github.com/abseil/abseil-py) | `2.4.0` | `2.5.1` | | [typing-extensions](https://github.com/python/typing_extensions) | `4.15.0` | `4.16.0` | | [pyelftools](https://github.com/eliben/pyelftools) | `0.32` | `0.33` | | [markupsafe](https://github.com/pallets/markupsafe) | `3.0.3` | `3.0.4` | | [pytest](https://github.com/pytest-dev/pytest) | `9.1.1` | `9.2.0` | Bumps the dev-only group with 3 updates in the /examples/bzlmod directory: [s3cmd](http://s3tools.org), [tabulate](https://github.com/astanin/python-tabulate) and [pylint](https://github.com/pylint-dev/pylint). Bumps the dev-only group with 2 updates in the /examples/pip_parse directory: [s3cmd](http://s3tools.org) and [yamllint](https://github.com/adrienverge/yamllint). Bumps the dev-only group with 5 updates in the /gazelle/examples/bzlmod_build_file_generation directory: | Package | From | To | | --- | --- | --- | | [s3cmd](http://s3tools.org) | `2.1.0` | `2.4.0` | | [tabulate](https://github.com/astanin/python-tabulate) | `0.9.0` | `0.10.0` | | [pylint](https://github.com/pylint-dev/pylint) | `4.0.10` | `4.1.3` | | [python-dateutil](https://github.com/dateutil/dateutil) | `3.0.0` | `4.0.0` | | [django](https://github.com/django/django) | `5.2.18` | `5.2.19` | Bumps the dev-only group with 1 update in the /tests directory: [attrs](https://github.com/python-attrs/attrs). Bumps the dev-only group with 1 update in the /tests/integration/bzlmod_lockfile directory: [pycparser](https://github.com/eliben/pycparser). Bumps the dev-only group with 1 update in the /tests/integration/unified_pypi directory: [colorama](https://github.com/tartley/colorama). Bumps the dev-only group with 1 update in the /tests/multi_pypi/alpha directory: [more-itertools](https://github.com/more-itertools/more-itertools). Bumps the dev-only group with 1 update in the /tests/multi_pypi/beta directory: [more-itertools](https://github.com/more-itertools/more-itertools). Bumps the dev-only group with 1 update in the /tests/multiple_inputs directory: [attrs](https://github.com/python-attrs/attrs). Bumps the dev-only group with 7 updates in the /tests/uv/lock directory: | Package | From | To | | --- | --- | --- | | [certifi](https://github.com/certifi/python-certifi) | `2025.1.31` | `2026.10.23` | | [idna](https://github.com/kjd/idna) | `3.15` | `3.20` | | [charset-normalizer](https://github.com/jawah/charset_normalizer) | `3.4.0` | `3.5.2` | | [click](https://github.com/pallets/click) | `8.4.1` | `8.5.1` | | [mypy-extensions](https://github.com/python/mypy_extensions) | `1.1.0` | `1.2.0` | | [packaging](https://github.com/pypa/packaging) | `26.2` | `26.3` | | [platformdirs](https://github.com/tox-dev/platformdirs) | `4.10.0` | `4.14.5` | Bumps the dev-only group with 2 updates in the /tests/uv/lock/pyproject_toml directory: [certifi](https://github.com/certifi/python-certifi) and [idna](https://github.com/kjd/idna). Bumps the dev-only group with 3 updates in the /tests/uv/lock/testdata directory: [certifi](https://github.com/certifi/python-certifi), [idna](https://github.com/kjd/idna) and [charset-normalizer](https://github.com/jawah/charset_normalizer). Bumps the dev-only group with 6 updates in the /tests/uv/lock/workspaces directory: | Package | From | To | | --- | --- | --- | | [idna](https://github.com/kjd/idna) | `3.15` | `3.20` | | [charset-normalizer](https://github.com/jawah/charset_normalizer) | `3.4.7` | `3.5.2` | | [click](https://github.com/pallets/click) | `8.4.1` | `8.5.1` | | [mypy-extensions](https://github.com/python/mypy_extensions) | `1.1.0` | `1.2.0` | | [packaging](https://github.com/pypa/packaging) | `26.2` | `26.3` | | [platformdirs](https://github.com/tox-dev/platformdirs) | `4.10.0` | `4.14.5` | Updates `absl-py` from 2.4.0 to 2.5.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/abseil/abseil-py/releases">absl-py's releases</a>.</em></p> <blockquote> <h2>v2.5.1</h2> <h3>Added</h3> <ul> <li>(testing) Add <code>assertIsSubclass</code> and <code>assertNotIsSubclass</code> to <code>absltest.TestCase</code>, matching the <code>unittest.TestCase</code> methods added in Python 3.14.</li> <li>(flags) Add support for disabling <code>ReloadDetector</code> via the <code>ABSL_RELOAD_DETECTOR</code> environment variable.</li> </ul> <h3>Changed</h3> <ul> <li>(testing) Include argument <code>repr</code> in <code>absltest.TestCase.assertDataclassEqual</code> failure message when an argument is not a dataclass instance.</li> </ul> <h3>Fixed</h3> <ul> <li>(app) Add <code>__init__</code> to the <code>app.UsageError</code> type stub.</li> <li>(logging) Fix the type signature of <code>logging.skip_log_prefix</code> to preserve the decorated function's return type.</li> <li>(testing) Strip ANSI escape sequences from test output before XML escaping in <code>xml_reporter</code>.</li> </ul> <h2>v2.5.0</h2> <h3>Added</h3> <ul> <li>(app) Add support for enabling Python profiling via the <code>ABSL_PYTHON_PROFILE_FILE</code> environment variable.</li> <li>(flags) Introduce <code>--only_check_flags</code> built-in flag to validate flag definitions without executing <code>main()</code>.</li> <li>(flagsaver) Add support for <code>async</code> test functions in <code>@flagsaver.flagsaver</code>.</li> <li>(testing) Add <code>record_property</code> and <code>get_recorded_properties</code> methods to <code>absltest.TestCase</code>.</li> </ul> <h3>Changed</h3> <ul> <li>(flags) Apply defensive copying in <code>save_flag_values</code> to prevent dictionary mutation flakiness.</li> <li>(logging) Update type signatures for <code>absl.logging</code> functions to support standard <code>logging</code> arguments (<code>exc_info</code>, <code>stack_info</code>, <code>stacklevel</code>, <code>extra</code>).</li> <li>(cleanup) Expand usage of <code>FlagHolder</code> objects in <code>app</code> and <code>absltest</code>.</li> </ul> <h3>Fixed</h3> <ul> <li>(flags) Improve formatting and clarity of <code>DuplicateFlagError</code> message.</li> <li>(testing) Fix assertion logic in <code>absltest.TestCase.create_file</code>.</li> <li>(typechecking) Fix type annotations and compatibility with MyPy and Pyrefly.</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/abseil/abseil-py/blob/main/CHANGELOG.md">absl-py's changelog</a>.</em></p> <blockquote> <h2>2.5.1 (2026-10-09)</h2> <h3>Added</h3> <ul> <li>(testing) Add <code>assertIsSubclass</code> and <code>assertNotIsSubclass</code> to <code>absltest.TestCase</code>, matching the <code>unittest.TestCase</code> methods added in Python 3.14.</li> <li>(flags) Add support for disabling <code>ReloadDetector</code> via the <code>ABSL_RELOAD_DETECTOR</code> environment variable.</li> </ul> <h3>Changed</h3> <ul> <li>(testing) Include argument <code>repr</code> in <code>absltest.TestCase.assertDataclassEqual</code> failure message when an argument is not a dataclass instance.</li> </ul> <h3>Fixed</h3> <ul> <li>(app) Add <code>__init__</code> to the <code>app.UsageError</code> type stub.</li> <li>(logging) Fix the type signature of <code>logging.skip_log_prefix</code> to preserve the decorated function's return type.</li> <li>(testing) Strip ANSI escape sequences from test output before XML escaping in <code>xml_reporter</code>.</li> </ul> <h2>2.5.0 (2026-07-03)</h2> <h3>Added</h3> <ul> <li>(app) Add support for enabling Python profiling via the <code>ABSL_PYTHON_PROFILE_FILE</code> environment variable.</li> <li>(flags) Introduce <code>--only_check_flags</code> built-in flag to validate flag definitions without executing <code>main()</code>.</li> <li>(flagsaver) Add support for <code>async</code> test functions in <code>@flagsaver.flagsaver</code>.</li> <li>(testing) Add <code>record_property</code> and <code>get_recorded_properties</code> methods to <code>absltest.TestCase</code>.</li> </ul> <h3>Changed</h3> <ul> <li>(flags) Apply defensive copying in <code>save_flag_values</code> to prevent dictionary mutation flakiness.</li> <li>(logging) Update type signatures for <code>absl.logging</code> functions to support standard <code>logging</code> arguments (<code>exc_info</code>, <code>stack_info</code>, <code>stacklevel</code>, <code>extra</code>).</li> <li>(cleanup) Expand usage of <code>FlagHolder</code> objects in <code>app</code> and <code>absltest</code>.</li> </ul> <h3>Fixed</h3> <ul> <li>(flags) Improve formatting and clarity of <code>DuplicateFlagError</code> message.</li> <li>(testing) Fix assertion logic in <code>absltest.TestCase.create_file</code>.</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/abseil/abseil-py/commit/23b2c75e57966ba8389fc056b261ebc33ceb5658"><code>23b2c75</code></a> Release Abseil-py 2.5.1</li> <li><a href="https://github.com/abseil/abseil-py/commit/0918a3046ff49ef7eb03459693835ab9ce3458e6"><code>0918a30</code></a> Include repr when assertDataclassEqual arg is not a dataclass instance</li> <li><a href="https://github.com/abseil/abseil-py/commit/16358a089941e07d5ef01b9390952caf4ff31451"><code>16358a0</code></a> Replace <code># pytype: disable</code> suppressions with <code># pyrefly: ignore</code></li> <li><a href="https://github.com/abseil/abseil-py/commit/f5eadb09e775ac29a10115f715734884bee48d9e"><code>f5eadb0</code></a> Replace <code># pytype: disable</code> suppressions with <code># pyrefly: ignore</code></li> <li><a href="https://github.com/abseil/abseil-py/commit/87523671c43233c1c5feaa11d446685ab2c67c91"><code>8752367</code></a> Add an option to disable ReloadDetector with an env variable</li> <li><a href="https://github.com/abseil/abseil-py/commit/86e4f1ea43872911db408891cc07126bb3cf411d"><code>86e4f1e</code></a> Add assertIsSubclass and assertNotIsSubclass to absltest.TestCase.</li> <li><a href="https://github.com/abseil/abseil-py/commit/097f7c2ccac6c4636c3c5d233682e64affe1eb2f"><code>097f7c2</code></a> Add <strong>init</strong> to the absl app.UsageError type stub.</li> <li><a href="https://github.com/abseil/abseil-py/commit/3e459074c71cb79f3d29ccf14e41113b1133f3dd"><code>3e45907</code></a> Strip ANSI escape sequences from test output before XML escaping in the JUnit...</li> <li><a href="https://github.com/abseil/abseil-py/commit/a2150fe10a48b69d9fcc4baa74125a7d667a021a"><code>a2150fe</code></a> Update versions of Github actions and Python version in actions</li> <li><a href="https://github.com/abseil/abseil-py/commit/7e6d9c15692ab300ac88a2c88e59f59816dc0900"><code>7e6d9c1</code></a> Remove obsolete Pyrefly suppression comments</li> <li>Additional commits viewable in <a href="https://github.com/abseil/abseil-py/compare/v2.4.0...v2.5.1">compare view</a></li> </ul> </details> <br /> Updates `typing-extensions` from 4.15.0 to 4.16.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/python/typing_extensions/releases">typing-extensions's releases</a>.</em></p> <blockquote> <h2>4.16.0</h2> <p>No changes since 4.16.0rc2.</p> <p>Changes since 4.15.0:</p> <ul> <li>Make <code>typing_extensions.TypeAliasType</code>'s <code>__module__</code> attribute writable. Backport of CPython PR <a href="https://redirect.github.com/python/cpython/pull/149172">#149172</a>.</li> <li>Fix setting of <code>__required_keys__</code> and <code>__optional_keys__</code> when inheriting keys with the same name.</li> <li>Add support for <code>AsyncIterator</code>, <code>io.Reader</code>, <code>io.Writer</code> and <code>os.PathLike</code> protocols as bases for other protocols.</li> <li>Fix incorrect behaviour on Python 3.9 and Python 3.10 that meant that calling <code>isinstance</code> with <code>typing_extensions.Concatenate[...]</code> or <code>typing_extensions.Unpack[...]</code> as the first argument could have a different result in some situations depending on whether or not a profiling function had been set using <code>sys.setprofile</code>. This affected both CPython and PyPy implementations. Patch by Brian Schubert.</li> <li>Fix <code>__init_subclass__()</code> behavior in the presence of multiple inheritance involving an <code>@deprecated</code>-decorated base class. Backport of CPython PR <a href="https://redirect.github.com/python/cpython/pull/138210">#138210</a> by Brian Schubert.</li> <li>Raise <code>TypeError</code> when attempting to subclass <code>typing_extensions.ParamSpec</code> on Python 3.9. The <code>typing</code> implementation has always raised an error, and the <code>typing_extensions</code> implementation has raised an error on Python 3.10+ since <code>typing_extensions</code> v4.6.0. Patch by Brian Schubert.</li> <li>Add the <code>bound</code>, <code>covariant</code>, <code>contravariant</code>, and <code>infer_variance</code> parameters to <code>TypeVarTuple</code>.</li> <li>Officially support the <code>bound</code>, <code>covariant</code>, <code>contravariant</code> and <code>infer_variance</code> parameters to <code>ParamSpec</code>. Improve the validation of these parameters at runtime.</li> <li>Rename <code>typing_extensions.Sentinel</code> to <code>typing_extensions.sentinel</code>, following the name that has been adopted for <code>builtins.sentinel</code> on Python 3.15. <code>typing_extensions.Sentinel</code> is retained as a soft-deprecated alias for backwards compatibility.</li> <li>Add support for pickling sentinels.</li> <li>Sentinels now preserve their identity when copied or deep-copied.</li> <li>Deprecate passing <code>name</code> as a keyword argument or <code>repr</code> as a positional argument to the <code>sentinel</code> constructor.</li> <li>The default repr of a sentinel <code>X = sentinel("X")</code> is now <code>X</code> rather than <code><X></code>.</li> <li>Deprecate arbitrary attribute assignments to sentinels.</li> <li>Deprecate subclassing sentinels.</li> <li>Add support for Python 3.15.</li> <li>Avoid a <code>DeprecationWarning</code> when <code>deprecated</code> is applied to a coroutine function on Python 3.14.0.</li> </ul> <h2>4.16.0rc2</h2> <p>Changes since 4.16.0rc1:</p> <ul> <li>Avoid a <code>DeprecationWarning</code> when <code>deprecated</code> is applied to a coroutine function on Python 3.14.0.</li> </ul> <p>Changes since 4.15.0:</p> <ul> <li>Make <code>typing_extensions.TypeAliasType</code>'s <code>__module__</code> attribute writable. Backport of CPython PR <a href="https://redirect.github.com/python/cpython/pull/149172">#149172</a>.</li> <li>Fix setting of <code>__required_keys__</code> and <code>__optional_keys__</code> when inheriting keys with the same name.</li> <li>Add support for <code>AsyncIterator</code>, <code>io.Reader</code>, <code>io.Writer</code> and <code>os.PathLike</code> protocols as bases for other protocols.</li> <li>Fix incorrect behaviour on Python 3.9 and Python 3.10 that meant that calling <code>isinstance</code> with <code>typing_extensions.Concatenate[...]</code> or <code>typing_extensions.Unpack[...]</code> as the first argument could have a different result in some situations depending on whether or not a profiling function had been set using <code>sys.setprofile</code>. This affected both CPython and PyPy implementations. Patch by Brian Schubert.</li> <li>Fix <code>__init_subclass__()</code> behavior in the presence of multiple inheritance involving an <code>@deprecated</code>-decorated base class. Backport of CPython PR <a href="https://redirect.github.com/python/cpython/pull/138210">#138210</a> by Brian Schubert.</li> <li>Raise <code>TypeError</code> when attempting to subclass <code>typing_extensions.ParamSpec</code> on Python 3.9. The <code>typing</code> implementation has always raised an error, and the <code>typing_extensions</code> implementation has raised an error on Python 3.10+ since <code>typing_extensions</code> v4.6.0. Patch by Brian Schubert.</li> <li>Add the <code>bound</code>, <code>covariant</code>, <code>contravariant</code>, and <code>infer_variance</code> parameters to <code>TypeVarTuple</code>.</li> <li>Officially support the <code>bound</code>, <code>covariant</code>, <code>contravariant</code> and <code>infer_variance</code> parameters to <code>ParamSpec</code>. Improve the validation of these parameters at runtime.</li> <li>Rename <code>typing_extensions.Sentinel</code> to <code>typing_extensions.sentinel</code>, following the name that has been adopted for <code>builtins.sentinel</code> on Python 3.15. <code>typing_extensions.Sentinel</code> is retained as a soft-deprecated alias for backwards compatibility.</li> <li>Add support for pickling sentinels.</li> <li>Sentinels now preserve their identity when copied or deep-copied.</li> <li>Deprecate passing <code>name</code> as a keyword argument or <code>repr</code> as a positional argument to the <code>sentinel</code> constructor.</li> <li>The default repr of a sentinel <code>X = sentinel("X")</code> is now <code>X</code> rather than <code><X></code>.</li> <li>Deprecate arbitrary attribute assignments to sentinels.</li> <li>Deprecate subclassing sentinels.</li> <li>Add support for Python 3.15.</li> </ul> <h2>4.16.0rc1</h2> <ul> <li>Make <code>typing_extensions.TypeAliasType</code>'s <code>__module__</code> attribute writable. Backport of CPython PR <a href="https://redirect.github.com/python/cpython/pull/149172">#149172</a>.</li> <li>Fix setting of <code>__required_keys__</code> and <code>__optional_keys__</code> when inheriting keys with the same name.</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/python/typing_extensions/blob/main/CHANGELOG.md">typing-extensions's changelog</a>.</em></p> <blockquote> <h1>Release 4.16.0 (July 2, 2026)</h1> <p>No user-facing changes since 4.16.0rc2.</p> <h1>Release 4.16.0rc2 (June 25, 2026)</h1> <ul> <li>Avoid a <code>DeprecationWarning</code> when <code>deprecated</code> is applied to a coroutine function on Python 3.14.0.</li> </ul> <h1>Release 4.16.0rc1 (June 24, 2026)</h1> <ul> <li>Make <code>typing_extensions.TypeAliasType</code>'s <code>__module__</code> attribute writable. Backport of CPython PR <a href="https://redirect.github.com/python/cpython/pull/149172">#149172</a>.</li> <li>Fix setting of <code>__required_keys__</code> and <code>__optional_keys__</code> when inheriting keys with the same name.</li> <li>Add support for <code>AsyncIterator</code>, <code>io.Reader</code>, <code>io.Writer</code> and <code>os.PathLike</code> protocols as bases for other protocols.</li> <li>Fix incorrect behaviour on Python 3.9 and Python 3.10 that meant that calling <code>isinstance</code> with <code>typing_extensions.Concatenate[...]</code> or <code>typing_extensions.Unpack[...]</code> as the first argument could have a different result in some situations depending on whether or not a profiling function had been set using <code>sys.setprofile</code>. This affected both CPython and PyPy implementations. Patch by Brian Schubert.</li> <li>Fix <code>__init_subclass__()</code> behavior in the presence of multiple inheritance involving an <code>@deprecated</code>-decorated base class. Backport of CPython PR <a href="https://redirect.github.com/python/cpython/pull/138210">#138210</a> by Brian Schubert.</li> <li>Raise <code>TypeError</code> when attempting to subclass <code>typing_extensions.ParamSpec</code> on Python 3.9. The <code>typing</code> implementation has always raised an error, and the <code>typing_extensions</code> implementation has raised an error on Python 3.10+ since <code>typing_extensions</code> v4.6.0. Patch by Brian Schubert.</li> <li>Add the <code>bound</code>, <code>covariant</code>, <code>contravariant</code>, and <code>infer_variance</code> parameters to <code>TypeVarTuple</code>.</li> <li>Officially support the <code>bound</code>, <code>covariant</code>, <code>contravariant</code> and <code>infer_variance</code> parameters to <code>ParamSpec</code>. Improve the validation of these parameters at runtime.</li> <li>Rename <code>typing_extensions.Sentinel</code> to <code>typing_extensions.sentinel</code>, following the name that has been adopted for <code>builtins.sentinel</code> on Python 3.15. <code>typing_extensions.Sentinel</code> is retained as a soft-deprecated alias for backwards compatibility.</li> <li>Add support for pickling sentinels.</li> <li>Sentinels now preserve their identity when copied or deep-copied.</li> <li>Deprecate passing <code>name</code> as a keyword argument or <code>repr</code> as a positional argument to the <code>sentinel</code> constructor.</li> <li>The default repr of a sentinel <code>X = sentinel("X")</code> is now <code>X</code> rather than <code><X></code>.</li> <li>Deprecate arbitrary attribute assignments to sentinels.</li> <li>Deprecate subclassing sentinels.</li> <li>Add support for Python 3.15.</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/python/typing_extensions/commit/f29cd28d8ed7642cafb1d18daf5aa41be6a5c0aa"><code>f29cd28</code></a> Prepare relase 4.16.0 (<a href="https://redirect.github.com/python/typing_extensions/issues/774">#774</a>)</li> <li><a href="https://github.com/python/typing_extensions/commit/43174610ec0c407ce05ad750077c4e62b9192b2b"><code>4317461</code></a> Bump version to 4.16.0rc2.dev (<a href="https://redirect.github.com/python/typing_extensions/issues/772">#772</a>)</li> <li><a href="https://github.com/python/typing_extensions/commit/4f71098e5be84798d36416bbca0e776223ee40f9"><code>4f71098</code></a> Prepare release 4.16.0rc2 (<a href="https://redirect.github.com/python/typing_extensions/issues/771">#771</a>)</li> <li><a href="https://github.com/python/typing_extensions/commit/37ed08a11f3b7c05234f8963ab97e3ebdbdc16a2"><code>37ed08a</code></a> Remove use of <code>asyncio.coroutines.iscoroutinefunction()</code> (<a href="https://redirect.github.com/python/typing_extensions/issues/769">#769</a>)</li> <li><a href="https://github.com/python/typing_extensions/commit/8dcc5594cbe5a4e348245fea6ce160ce93ed6601"><code>8dcc559</code></a> Improve <code>TypedDict</code> documentation (<a href="https://redirect.github.com/python/typing_extensions/issues/770">#770</a>)</li> <li><a href="https://github.com/python/typing_extensions/commit/224f8d50551d26f0d603093596c3a47a7302a46f"><code>224f8d5</code></a> Post-release followups for 3.16.0rc1 (<a href="https://redirect.github.com/python/typing_extensions/issues/767">#767</a>)</li> <li><a href="https://github.com/python/typing_extensions/commit/777de3eb5f4562e2054d1d7ce707f098b1f4fd2f"><code>777de3e</code></a> Prepare release 4.16.0rc1 (<a href="https://redirect.github.com/python/typing_extensions/issues/766">#766</a>)</li> <li><a href="https://github.com/python/typing_extensions/commit/890be90f1545e7d5fa904dfa3154d5f03c96782c"><code>890be90</code></a> Type variable tuple variance (<a href="https://redirect.github.com/python/typing_extensions/issues/741">#741</a>)</li> <li><a href="https://github.com/python/typing_extensions/commit/0e0545866d78458b668dc52d2edc411f6e39540d"><code>0e05458</code></a> Pin SQLAlchemy third-party tests to pytest==9.0.3 (<a href="https://redirect.github.com/python/typing_extensions/issues/765">#765</a>)</li> <li><a href="https://github.com/python/typing_extensions/commit/d2777468c274202ec290103b34313e50cf040229"><code>d277746</code></a> docs: add version compatibility table (<a href="https://redirect.github.com/python/typing_extensions/issues/733">#733</a>)</li> <li>Additional commits viewable in <a href="https://github.com/python/typing_extensions/compare/4.15.0...4.16.0">compare view</a></li> </ul> </details> <br /> Updates `pyelftools` from 0.32 to 0.33 <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/eliben/pyelftools/commit/52ce435186022bd6b32012a998931fe86c985ec8"><code>52ce435</code></a> Bump version</li> <li><a href="https://github.com/eliben/pyelftools/commit/f8c3b725744eafb45890da2d7f7f3d1e83b93c26"><code>f8c3b72</code></a> Refactor hacking guide for better structure</li> <li><a href="https://github.com/eliben/pyelftools/commit/8c9c31d11a6b1a3a03d3c9251b04942e44f0477c"><code>8c9c31d</code></a> Revise user guide formatting and section titles</li> <li><a href="https://github.com/eliben/pyelftools/commit/486f6274de17fd527031de8a1b94ca017b363d06"><code>486f627</code></a> Convert user's guide and hacking guide to markdown</li> <li><a href="https://github.com/eliben/pyelftools/commit/8ec946fa4d70f0232ae1de221a722e74053f7aeb"><code>8ec946f</code></a> Refactor README.md with improved structure</li> <li><a href="https://github.com/eliben/pyelftools/commit/a0c0a649a1aa315ba8a9e2c9f8be0d8a73046d43"><code>a0c0a64</code></a> Convert README file to markdown</li> <li><a href="https://github.com/eliben/pyelftools/commit/be53814762491796d428a7fd8211aeebb94ce60b"><code>be53814</code></a> Set up uv in CI before running it</li> <li><a href="https://github.com/eliben/pyelftools/commit/2b15c813e82cfbc21c90d4cb3c8963fc79e87651"><code>2b15c81</code></a> Add Makefile for 'make check' and 'make test' and use it in CI</li> <li><a href="https://github.com/eliben/pyelftools/commit/e383a2538fe133648ced0a0324d78ec814bd4c56"><code>e383a25</code></a> Add type hints (<a href="https://redirect.github.com/eliben/pyelftools/issues/611">#611</a>)</li> <li><a href="https://github.com/eliben/pyelftools/commit/14c46c2d8bff5e7e8e0a8a4c00d66ad68728e3d2"><code>14c46c2</code></a> elf/section: Remove <strong>hash</strong> (<a href="https://redirect.github.com/eliben/pyelftools/issues/659">#659</a>)</li> <li>Additional commits viewable in <a href="https://github.com/eliben/pyelftools/compare/v0.32...v0.33">compare view</a></li> </ul> </details> <br /> Updates `markupsafe` from 3.0.3 to 3.0.4 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pallets/markupsafe/releases">markupsafe's releases</a>.</em></p> <blockquote> <h2>3.0.4</h2> <p>This is the MarkupSafe 3.0.4 fix release, which fixes bugs but does not otherwise change behavior and should not result in breaking changes compared to the latest feature release.</p> <p>PyPI: <a href="https://pypi.org/project/MarkupSafe/3.0.4/">https://pypi.org/project/MarkupSafe/3.0.4/</a> Changes: <a href="https://markupsafe.palletsprojects.com/page/changes/#version-3-0-4">https://markupsafe.palletsprojects.com/page/changes/#version-3-0-4</a> Milestone: <a href="https://github.com/pallets/markupsafe/milestone/17?closed=1">https://github.com/pallets/markupsafe/milestone/17?closed=1</a></p> <ul> <li>Build Python 3.15, armv7l, ppc64le, Android, and iOS wheels.</li> <li>Improve performance of <code>striptags</code>. <a href="https://redirect.github.com/pallets/markupsafe/issues/521">#521</a></li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/pallets/markupsafe/blob/main/CHANGES.rst">markupsafe's changelog</a>.</em></p> <blockquote> <h2>Version 3.0.4</h2> <p>Released 2026-10-02</p> <ul> <li>Build Python 3.15, armv7l, ppc64le, Android, and iOS wheels.</li> <li>Improve performance of <code>striptags</code>. :issue:<code>521</code></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pallets/markupsafe/commit/ece26078ec168ebac69f02877238e68d4b376c91"><code>ece2607</code></a> release version 3.0.4</li> <li><a href="https://github.com/pallets/markupsafe/commit/620bc809d748de3a7848bdf7e27b1c2a2903aaf5"><code>620bc80</code></a> split archs</li> <li><a href="https://github.com/pallets/markupsafe/commit/73c3be1596906daf3e642e51852af5a019c5e1ea"><code>73c3be1</code></a> fix wheel builds (<a href="https://redirect.github.com/pallets/markupsafe/issues/536">#536</a>)</li> <li><a href="https://github.com/pallets/markupsafe/commit/d8ae19e6e45b5512472b74fe5c60b7f6aa18d70f"><code>d8ae19e</code></a> fix wheel builds</li> <li><a href="https://github.com/pallets/markupsafe/commit/ff1eaff921f92db57327752bbc37472d37fb9b21"><code>ff1eaff</code></a> Build Android and iOS wheels (<a href="https://redirect.github.com/pallets/markupsafe/issues/516">#516</a>)</li> <li><a href="https://github.com/pallets/markupsafe/commit/87e64f9628c574bf91898f8642a21356cccaa58c"><code>87e64f9</code></a> build Android and iOS wheels</li> <li><a href="https://github.com/pallets/markupsafe/commit/bc33c55cb3078ba9f9b0950babb32f8d842f1267"><code>bc33c55</code></a> Build ppc64le wheels (<a href="https://redirect.github.com/pallets/markupsafe/issues/518">#518</a>)</li> <li><a href="https://github.com/pallets/markupsafe/commit/0ddd6eac9b20df52c75fae9181c0e73e195fa8d1"><code>0ddd6ea</code></a> build ppc64le wheels</li> <li><a href="https://github.com/pallets/markupsafe/commit/3e0775809b92150b10d1671ce1821ea6eb56be0c"><code>3e07758</code></a> Build armv7l wheels (<a href="https://redirect.github.com/pallets/markupsafe/issues/514">#514</a>)</li> <li><a href="https://github.com/pallets/markupsafe/commit/39b9aae5f1e70edc33f380b47d1bef0e281746b5"><code>39b9aae</code></a> build armv7l wheels</li> <li>Additional commits viewable in <a href="https://github.com/pallets/markupsafe/compare/3.0.3...3.0.4">compare view</a></li> </ul> </details> <br /> Updates `pytest` from 9.1.1 to 9.2.0 <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.2.0</h2> <h1>pytest 9.2.0 (2026-10-27)</h1> <h2>Removals and backward incompatible breaking changes</h2> <ul> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/14716">#14716</a>: <code>-c</code> now raises a usage error for a path that does not exist, is a directory, or is in a format pytest has no loader for. Such paths were previously either ignored or reported as an unhandled <code>FileNotFoundError</code>.</p> </li> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/8593">#8593</a>: The <code>indirect</code>, <code>ids</code> and <code>scope</code> arguments of <code>Metafunc.parametrize() <pytest.Metafunc.parametrize></code> -- and therefore of <code>@pytest.mark.parametrize <pytest.mark.parametrize ref></code> -- are now keyword-only.</p> <p>Passing them positionally was a common source of confusing errors, e.g. <code>parametrize("arg1", "arg2", [(1, 2)])</code> made the argvalues land in <code>indirect</code> and failed with <code>indirect fixture '(1, 2)' doesn't exist</code>; such mistakes now fail with an understandable <code>TypeError</code>. The type annotations have always declared these arguments as keyword-only.</p> </li> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/993">#993</a>: Plugin import failures at startup are now reported and classified instead of escaping as a raw traceback with the accidental exit code <code>1</code>:</p> <ul> <li>a plugin that cannot be found -- via <code>-p</code>, <code>pytest_plugins</code> or <code>PYTEST_PLUGINS</code> -- exits with <code>pytest.ExitCode</code> <code>USAGE_ERROR</code> (<code>4</code>), like a <code>conftest.py</code> that fails to import;</li> <li>a plugin that is found but raises while importing -- including a broken <code>pytest11</code> entry point or a missing plugin dependency -- exits with <code>pytest.ExitCode</code> <code>INTERNAL_ERROR</code> (<code>3</code>), with the traceback preserved.</li> </ul> <p><code>pytest.main</code> now returns these codes instead of raising <code>ImportError</code>. Also fixed an <code>IndexError</code> from pytest's own internals when the plugin raised an exception with no arguments.</p> </li> </ul> <h2>Deprecations (removal in next major release)</h2> <ul> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/14742">#14742</a>: The private <code>_pytest.python.CallSpec2</code> name has been renamed to <code>CallSpec</code>. The old <code>CallSpec2</code> alias remains available for now and will be removed in pytest 10 or 11.</p> </li> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/14755">#14755</a>: Schedule <em>yield_fixture</em> decorator for removal in pytest 10 or 11.</p> </li> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/14774">#14774</a>: Similarly to the deprecation of class-scoped fixtures defined as instance methods in pytest 9.1, <em>all</em> higher-scoped fixtures (<code>module</code>, <code>package</code>, and <code>session</code>) defined as instance methods are now deprecated.</p> <p>They suffer from the same issue the original deprecation only fixed for class-scoped fixtures, see <code>10819</code> and <code>14011</code>.</p> </li> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/14808">#14808</a>: Passing a non-string value to a <code>string</code>-typed ini option now emits a <code>pytest.PytestRemovedIn10Warning</code>. This affects <code>[tool.pytest.ini_options]</code> in <code>pyproject.toml</code>. In pytest 10 this will raise a <code>TypeError</code>, matching the behavior of the corresponding TOML config path.</p> </li> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/7323">#7323</a>: Passing <code>bytes</code> to <code>TerminalReporter.write_line()</code> is now deprecated, pass a <code>str</code> instead.</p> </li> </ul> <h2>New features</h2> <ul> <li><a href="https://redirect.github.com/pytest-dev/pytest/issues/14743">#14743</a>: <!-- raw HTML omitted -->Full diff:<!-- raw HTML omitted --> now contains a legend explaining the <!-- raw HTML omitted -->+<!-- raw HTML omitted --> & <!-- raw HTML omitted -->-<!-- raw HTML omitted --> symbols in diff output.</li> <li><a href="https://redirect.github.com/pytest-dev/pytest/issues/2781">#2781</a>: When <code>strict_markers</code> is enabled, marker names used in <code>-m</code> expressions are now validated against registered markers.</li> <li><a href="https://redirect.github.com/pytest-dev/pytest/issues/6881">#6881</a>: Added the <code>parametrize_long_str_id_strategy</code> configuration option to control how long <code>str</code>/<code>bytes</code> parameter values are handled in auto-generated test IDs. Explicit IDs set via <code>ids=[...]</code> or <code>pytest.param(..., id=...)</code> are not affected. Available strategies: <code>short</code> (default, values over 100 chars fall back to <code>argname+index</code>), <code>sha256</code> (SHA-256 hex digest), <code>legacy</code> (keep full value), and <code>disallow</code> (error requesting explicit IDs).</li> </ul> <h2>Improvements in existing functionality</h2> <ul> <li><a href="https://redirect.github.com/pytest-dev/pytest/issues/10745">#10745</a>: A <code>RecursionError</code> whose recursion origin cannot be located now shows only the first and last 10 stack frames, matching what pytest already did when locating the origin failed outright. Previously the full traceback -- often around a thousand near-identical frames -- was rendered, which was both slow and unreadable. Pass <code>--full-trace</code> to see every frame.</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/ae1d0ff57b8bd4252da9ade7353523ac0ac73281"><code>ae1d0ff</code></a> Prepare release version 9.2.0</li> <li><a href="https://github.com/pytest-dev/pytest/commit/143ce31dea9b12ff2ab6add04361ee01ab114931"><code>143ce31</code></a> pre-commit: exclude codespell on generated release announcements</li> <li><a href="https://github.com/pytest-dev/pytest/commit/532dc5fc78f57de5115c5ecc9c6c29257787ada7"><code>532dc5f</code></a> tox: add attrs dependency to regen, needed in reportingdemo.rst</li> <li><a href="https://github.com/pytest-dev/pytest/commit/a7b2446ee41a7298d3a0bc22c52f3b8bacae1566"><code>a7b2446</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/15245">#15245</a> from pytest-dev/claude/project-thread-9jcf91</li> <li><a href="https://github.com/pytest-dev/pytest/commit/679d09c6945156746e17e9ec0b1c8309bbde3ad3"><code>679d09c</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://redirect.github.com/pytest-dev/pytest/issues/15266">#15266</a>)</li> <li><a href="https://github.com/pytest-dev/pytest/commit/41d12cdbb4a35a7877768d93d8dc50a9117a8d8c"><code>41d12cd</code></a> docs: clarify typing for yield fixtures</li> <li><a href="https://github.com/pytest-dev/pytest/commit/b9022ba04a33bfc76b5c9aefb8974755a80bf5ce"><code>b9022ba</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/15182">#15182</a> from 1871698/docs/improve-getting-started-description</li> <li><a href="https://github.com/pytest-dev/pytest/commit/16f87a7f364a7362fbfbb204c79a47ad567b4fbd"><code>16f87a7</code></a> docs: improve getting-started.rst test execution description</li> <li><a href="https://github.com/pytest-dev/pytest/commit/082ed70e314ee8e1ab117763d17fe801648f7508"><code>082ed70</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/15255">#15255</a> from pytest-dev/claude/project-thread-eoi3d6</li> <li><a href="https://github.com/pytest-dev/pytest/commit/ae37a013763e9c4a143245eda1acdc3c27961685"><code>ae37a01</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/15227">#15227</a> from pytest-dev/claude/project-thread-4etye4</li> <li>Additional commits viewable in <a href="https://github.com/pytest-dev/pytest/compare/9.1.1...9.2.0">compare view</a></li> </ul> </details> <br /> Updates `s3cmd` from 2.1.0 to 2.4.0 Updates `tabulate` from 0.9.0 to 0.10.0 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/astanin/python-tabulate/blob/master/CHANGELOG">tabulate's changelog</a>.</em></p> <blockquote> <ul> <li>0.10.0: Add support for Python 3.11, 3.12, 3.13, 3.14. Drop support for Python 3.7, 3.8, 3.9. PRESERVE_STERILITY global is replaced with preserve_sterility function argument. New formatting options: headersglobalalign, headersalign, colglobalalign. New output format: <code>colon_grid</code> (Pandoc grid_tables with alignment) Various bug fixes. Improved error messages.</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/astanin/python-tabulate/commit/3b4cd509820e4c45cd2aaba833aa585ea6308b94"><code>3b4cd50</code></a> update HOWTOPUBLISH</li> <li><a href="https://github.com/astanin/python-tabulate/commit/35ee0f61544b53067247cfe8fd8b7547b7e1c1e2"><code>35ee0f6</code></a> update mini-benchmark table</li> <li><a href="https://github.com/astanin/python-tabulate/commit/37ac76e9365fa3694e92c8ab651a2cc694438983"><code>37ac76e</code></a> restore tabulate.<strong>version</strong></li> <li><a href="https://github.com/astanin/python-tabulate/commit/37e1ed089f779ed5a962e287b12dc9c15e61c7ff"><code>37e1ed0</code></a> move # nowa: E931 to a different line (flake8)</li> <li><a href="https://github.com/astanin/python-tabulate/commit/7bacc90422f416f61034c6aeb45be32dc67bafdf"><code>7bacc90</code></a> run pre-commit hooks (black)</li> <li><a href="https://github.com/astanin/python-tabulate/commit/1b69704b12b13c70b1fa42f942e84d9c134a5763"><code>1b69704</code></a> Remove spurious cast in string interpolation</li> <li><a href="https://github.com/astanin/python-tabulate/commit/4d535af12d2de46ee5a87329d2bc5810a386ef89"><code>4d535af</code></a> Use specific noqa directives</li> <li><a href="https://github.com/astanin/python-tabulate/commit/76c3d37a5f51546b2bfba8d3e0648ebcda05b436"><code>76c3d37</code></a> Remove spurious space from error message</li> <li><a href="https://github.com/astanin/python-tabulate/commit/13508e7a75783af650a2b76065dac28e06d1fa34"><code>13508e7</code></a> Unnecessary <code>list</code> call</li> <li><a href="https://github.com/astanin/python-tabulate/commit/69f67cd72de4c7990bc7a25200b89ab9b2bdd870"><code>69f67cd</code></a> Do not call <code>getattr</code> with a constant value</li> <li>Additional commits viewable in <a href="https://github.com/astanin/python-tabulate/compare/v0.9.0...v0.10.0">compare view</a></li> </ul> </details> <br /> Updates `pylint` from 4.0.9 to 4.1.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pylint-dev/pylint/releases">pylint's releases</a>.</em></p> <blockquote> <h2>v4.1.3</h2> <h2>What's new in Pylint 4.1.3?</h2> <p>Release date: 2026-10-11</p> <h2>False Positives Fixed</h2> <ul> <li> <p>Fixed a false positive for <code>attribute-defined-outside-init</code> when an attribute is assigned inside the setter of an old-style, non-decorator <code>property(fget, fset)</code> call. The decorator form (<code>@property</code> / <code>@x.setter</code>) was already exempted by the fix for <a href="https://redirect.github.com/pylint-dev/pylint/issues/409">#409</a>; the classic call form was not.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/3325">#3325</a></p> </li> <li> <p>Fix a false positive for <code>used-before-assignment</code> when a name bound by an earlier target of the same assignment is used by a later target, as in <code>a = b[a] = 0</code>.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/5955">#5955</a></p> </li> <li> <p>Fix a <code>no-member</code> false positive in a comprehension inside a branch that cannot run, such as <code>if sys.platform == "win32":</code> on Linux. Like the rest of the branch, the comprehension is no longer checked for missing members.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/7240">#7240</a></p> </li> <li> <p>Fix a false positive for <code>used-before-assignment</code> when a name bound by a tuple or list target of a <code>with</code> item is used by a later item of the same <code>with</code> statement.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/7545">#7545</a></p> </li> <li> <p>Fix false positives such as <code>not-callable</code>, <code>not-an-iterable</code>, <code>unpacking-non-sequence</code> and <code>no-member</code> on the result of a function whose body is only <code>...</code>, like <code>@overload</code> and <code>.pyi</code> stubs. Such calls were inferred as returning <code>None</code>. This affected <code>sqlalchemy.func</code>, <code>pydantic.Field</code>, and the <code>torch</code> functions wrapped by <code>_add_docstr</code>, such as <code>torch.linalg.qr</code>.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/8138">#8138</a> Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/9218">#9218</a> Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/9354">#9354</a> Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/10087">#10087</a></p> </li> <li> <p>Fix a false positive for <code>protected-access</code> when a subclass of a subscripted generic base, such as <code>class Child(Parent[T])</code>, accesses a protected member through that base, such as <code>Parent._foo(self)</code>.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/8600">#8600</a></p> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pylint-dev/pylint/commit/e75de10c69103381c875601f638d4b977ff0fcaf"><code>e75de10</code></a> Bump pylint to 4.1.3, update changelog (<a href="https://redirect.github.com/pylint-dev/pylint/issues/11637">#11637</a>)</li> <li><a href="https://github.com/pylint-dev/pylint/commit/591f6e2b9a258f3a069df9b9af56eb730bcea825"><code>591f6e2</code></a> [Backport maintenance/4.1.x] Fix protected-access false positive through a su...</li> <li><a href="https://github.com/pylint-dev/pylint/commit/a537920085b9d92abd54000b674d941063e52030"><code>a537920</code></a> [Backport maintenance/4.1.x] Ignore discard variable type redefinitions (<a href="https://redirect.github.com/pylint-dev/pylint/issues/11635">#11635</a>)</li> <li><a href="https://github.com/pylint-dev/pylint/commit/4a8f61ca7c216f8cde5b98faca5590154487eb00"><code>4a8f61c</code></a> [Backport maintenance/4.1.x] Fix duplicate-code crash when min-similarity-lin...</li> <li><a href="https://github.com/pylint-dev/pylint/commit/41fa1c4ccf7f24ff7e653846a76305500df9ae66"><code>41fa1c4</code></a> [Backport maintenance/4.1.x] [pyreverse] Fix hang/RecursionError with --all-a...</li> <li><a href="https://github.com/pylint-dev/pylint/commit/a05e2f340808daab0fa775cbc39c3ce00e89f576"><code>a05e2f3</code></a> [Backport maintenance/4.1.x] Fix <code>used-before-assignment</code> false positive for ...</li> <li><a href="https://github.com/pylint-dev/pylint/commit/ea7996b00280e3b8e5fcd9dc4e8e122466abff6a"><code>ea7996b</code></a> [Backport maintenance/4.1.x] Error when several output formats write to stdou...</li> <li><a href="https://github.com/pylint-dev/pylint/commit/479c0379366e482cda6d842b5d4cca0a52370939"><code>479c037</code></a> [Backport maintenance/4.1.x] Fix IndexError when Enum <strong>init</strong> has no argumen...</li> <li><a href="https://github.com/pylint-dev/pylint/commit/e6aa780ba6e393a517556000cc81961996585cad"><code>e6aa780</code></a> [Backport maintenance/4.1.x] Fix unreachable false positive for raising gener...</li> <li><a href="https://github.com/pylint-dev/pylint/commit/fc58d0b4aa48eedc03776416998d70dda61dfe48"><code>fc58d0b</code></a> [Backport maintenance/4.1.x] Fix pyreverse crash on classes with EmptyNode in...</li> <li>Additional commits viewable in <a href="https://github.com/pylint-dev/pylint/compare/v4.0.9...v4.1.3">compare view</a></li> </ul> </details> <br /> Updates `s3cmd` from 2.1.0 to 2.4.0 Updates `yamllint` from 1.28.0 to 1.38.0 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/adrienverge/yamllint/blob/master/CHANGELOG.rst">yamllint's changelog</a>.</em></p> <blockquote> <h2>1.38.0 (2026-01-13)</h2> <ul> <li>Add support for Python 3.14, drop support for Python 3.9</li> <li>Require pathspec ≥ 1.0.0</li> <li>Config: Follow gitignore implementation in <code>yaml-files</code> and <code>ignore</code></li> <li>Config: Use "mapping" instead of "dict" for user-facing errors</li> <li>Rule <code>indentation</code>: Fix error message for <code>check-multi-line-strings</code></li> <li>Rule <code>quoted-strings</code>: Add <code>quote-type: consistent</code></li> <li>Docs: Update the name of BSD ports</li> <li>Docs: Enhance wording of recursive directory lint in README</li> <li>Docs: Add Alpine Linux installation instructions in README</li> </ul> <h2>1.37.1 (2025-05-04)</h2> <ul> <li>Rule <code>comments</code>: tell how many spaces are expected</li> <li>Rule <code>quoted-strings</code>: Fix <code>only-when-needed</code> on multiline with backslash</li> <li>Config: Report if <code>rules</code> is not a dict</li> <li>Fix <code>test_codec_built_in_equivalent()</code> test when run with pytest</li> <li>CI: Fix TestPyPI "dev0" versions for master commits on tags</li> <li>Docs: Add links to GitHub repository and releases</li> <li>Docs: Fix GitLab integration example</li> <li>Docs: Fix GitLab integration link</li> <li>Fix the tests badge link on the README</li> </ul> <h2>1.37.0 (2025-03-23)</h2> <ul> <li>Automatically detect Unicode character encoding of files</li> <li>Publish pushes to master branch to TestPyPI</li> </ul> <h2>1.36.2 (2025-03-17)</h2> <ul> <li>Build: Restore missing documentation and tests in sdist</li> </ul> <h2>1.36.1 (2025-03-15)</h2> <ul> <li>Publish PyPI releases using GitHub Actions workflows</li> </ul> <h2>1.36.0 (2025-03-11)</h2> <ul> <li>Add support for Python 3.13, drop support for Python 3.8</li> <li>Rule <code>key-ordering</code>: add <code>ignored-keys</code> option</li> <li>Rule <code>quoted-strings</code>: fix <code>only-when-needed</code> and escaped special chars</li> <li>Fix TTY-related tests on Python 3.14</li> <li>Docs: fix import of <code>yamllint.config</code> rather than <code>yamllint</code></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/adrienverge/yamllint/commit/cba56bcde1fdd01c1deb3f945e69764c291a6530"><code>cba56bc</code></a> yamllint version 1.38.0</li> <li><a href="https://github.com/adrienverge/yamllint/commit/9dc506b5a1e22a728a95321a7cdb829ba17de0e0"><code>9dc506b</code></a> Require pathspec ≥ 1.0.0 and follow Git's gitignore implementation</li> <li><a href="https://github.com/adrienverge/yamllint/commit/73b9c0b54270076e2c76e2e6bfd428aa4203ed3a"><code>73b9c0b</code></a> Drop support for Python 3.9</li> <li><a href="https://github.com/adrienverge/yamllint/commit/22d07edd4903c71c4ea63d2e2e3880adde4604d6"><code>22d07ed</code></a> indentation: Fix error message for check-multi-line-strings</li> <li><a href="https://github.com/adrienverge/yamllint/commit/cfbfe9b076b877fb9276a22ffb3d2726ead5866d"><code>cfbfe9b</code></a> README: Add Alpine Linux installation instructions</li> <li><a href="https://github.com/adrienverge/yamllint/commit/a3b3bb31bb0e79fb6c43676314c89de00c667334"><code>a3b3bb3</code></a> README: Enhance wording of recursive directory lint</li> <li><a href="https://github.com/adrienverge/yamllint/commit/e3b72f585b1bf8c779b7bae2f773b11a5fb80eb1"><code>e3b72f5</code></a> quoted-strings: Add missing quote-type: consistent docs</li> <li><a href="https://github.com/adrienverge/yamllint/commit/e3d54cc100f892fe79eac820ce35cfd633603e37"><code>e3d54cc</code></a> quoted-strings: Add quote-type: consistent</li> <li><a href="https://github.com/adrienverge/yamllint/commit/0b4ddc88c05ab3f20e3f8e5ffca7d04eccd290d6"><code>0b4ddc8</code></a> CI: Update GitHub Actions</li> <li><a href="https://github.com/adrienverge/yamllint/commit/866f805cbfaa4c89de8b92c3839eb80d46001eda"><code>866f805</code></a> build: Remove license-files from pyproject.toml</li> <li>Additional commits viewable in <a href="https://github.com/adrienverge/yamllint/compare/v1.28.0...v1.38.0">compare view</a></li> </ul> </details> <br /> Updates `s3cmd` from 2.1.0 to 2.4.0 Updates `tabulate` from 0.9.0 to 0.10.0 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/astanin/python-tabulate/blob/master/CHANGELOG">tabulate's changelog</a>.</em></p> <blockquote> <ul> <li>0.10.0: Add support for Python 3.11, 3.12, 3.13, 3.14. Drop support for Python 3.7, 3.8, 3.9. PRESERVE_STERILITY global is replaced with preserve_sterility function argument. New formatting options: headersglobalalign, headersalign, colglobalalign. New output format: <code>colon_grid</code> (Pandoc grid_tables with alignment) Various bug fixes. Improved error messages.</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/astanin/python-tabulate/commit/3b4cd509820e4c45cd2aaba833aa585ea6308b94"><code>3b4cd50</code></a> update HOWTOPUBLISH</li> <li><a href="https://github.com/astanin/python-tabulate/commit/35ee0f61544b53067247cfe8fd8b7547b7e1c1e2"><code>35ee0f6</code></a> update mini-benchmark table</li> <li><a href="https://github.com/astanin/python-tabulate/commit/37ac76e9365fa3694e92c8ab651a2cc694438983"><code>37ac76e</code></a> restore tabulate.<strong>version</strong></li> <li><a href="https://github.com/astanin/python-tabulate/commit/37e1ed089f779ed5a962e287b12dc9c15e61c7ff"><code>37e1ed0</code></a> move # nowa: E931 to a different line (flake8)</li> <li><a href="https://github.com/astanin/python-tabulate/commit/7bacc90422f416f61034c6aeb45be32dc67bafdf"><code>7bacc90</code></a> run pre-commit hooks (black)</li> <li><a href="https://github.com/astanin/python-tabulate/commit/1b69704b12b13c70b1fa42f942e84d9c134a5763"><code>1b69704</code></a> Remove spurious cast in string interpolation</li> <li><a href="https://github.com/astanin/python-tabulate/commit/4d535af12d2de46ee5a87329d2bc5810a386ef89"><code>4d535af</code></a> Use specific noqa directives</li> <li><a href="https://github.com/astanin/python-tabulate/commit/76c3d37a5f51546b2bfba8d3e0648ebcda05b436"><code>76c3d37</code></a> Remove spurious space from error message</li> <li><a href="https://github.com/astanin/python-tabulate/commit/13508e7a75783af650a2b76065dac28e06d1fa34"><code>13508e7</code></a> Unnecessary <code>list</code> call</li> <li><a href="https://github.com/astanin/python-tabulate/commit/69f67cd72de4c7990bc7a25200b89ab9b2bdd870"><code>69f67cd</code></a> Do not call <code>getattr</code> with a constant value</li> <li>Additional commits viewable in <a href="https://github.com/astanin/python-tabulate/compare/v0.9.0...v0.10.0">compare view</a></li> </ul> </details> <br /> Updates `pylint` from 4.0.10 to 4.1.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pylint-dev/pylint/releases">pylint's releases</a>.</em></p> <blockquote> <h2>v4.1.3</h2> <h2>What's new in Pylint 4.1.3?</h2> <p>Release date: 2026-10-11</p> <h2>False Positives Fixed</h2> <ul> <li> <p>Fixed a false positive for <code>attribute-defined-outside-init</code> when an attribute is assigned inside the setter of an old-style, non-decorator <code>property(fget, fset)</code> call. The decorator form (<code>@property</code> / <code>@x.setter</code>) was already exempted by the fix for <a href="https://redirect.github.com/pylint-dev/pylint/issues/409">#409</a>; the classic call form was not.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/3325">#3325</a></p> </li> <li> <p>Fix a false positive for <code>used-before-assignment</code> when a name bound by an earlier target of the same assignment is used by a later target, as in <code>a = b[a] = 0</code>.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/5955">#5955</a></p> </li> <li> <p>Fix a <code>no-member</code> false positive in a comprehension inside a branch that cannot run, such as <code>if sys.platform == "win32":</code> on Linux. Like the rest of the branch, the comprehension is no longer checked for missing members.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/7240">#7240</a></p> </li> <li> <p>Fix a false positive for <code>used-before-assignment</code> when a name bound by a tuple or list target of a <code>with</code> item is used by a later item of the same <code>with</code> statement.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/7545">#7545</a></p> </li> <li> <p>Fix false positives such as <code>not-callable</code>, <code>not-an-iterable</code>, <code>unpacking-non-sequence</code> and <code>no-member</code> on the result of a function whose body is only <code>...</code>, like <code>@overload</code> and <code>.pyi</code> stubs. Such calls were inferred as returning <code>None</code>. This affected <code>sqlalchemy.func</code>, <code>pydantic.Field</code>, and the <code>torch</code> functions wrapped by <code>_add_docstr</code>, such as <code>torch.linalg.qr</code>.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/8138">#8138</a> Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/9218">#9218</a> Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/9354">#9354</a> Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/10087">#10087</a></p> </li> <li> <p>Fix a false positive for <code>protected-access</code> when a subclass of a subscripted generic base, such as <code>class Child(Parent[T])</code>, accesses a protected member through that base, such as <code>Parent._foo(self)</code>.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/8600">#8600</a></p> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pylint-dev/pylint/commit/e75de10c69103381c875601f638d4b977ff0fcaf"><code>e75de10</code></a> Bump pylint to 4.1.3, update changelog (<a href="https://redirect.github.com/pylint-dev/pylint/issues/11637">#11637</a>)</li> <li><a href="https://github.com/pylint-dev/pylint/commit/591f6e2b9a258f3a069df9b9af56eb730bcea825"><code>591f6e2</code></a> [Backport maintenance/4.1.x] Fix protected-access false positive through a su...</li> <li><a href="https://github.com/pylint-dev/pylint/commit/a537920085b9d92abd54000b674d941063e52030"><code>a537920</code></a> [Backport maintenance/4.1.x] Ignore discard variable type redefinitions (<a href="https://redirect.github.com/pylint-dev/pylint/issues/11635">#11635</a>)</li> <li><a href="https://github.com/pylint-dev/pylint/commit/4a8f61ca7c216f8cde5b98faca5590154487eb00"><code>4a8f61c</code></a> [Backport maintenance/4.1.x] Fix duplicate-code crash when min-similarity-lin...</li> <li><a href="https://github.com/pylint-dev/pylint/commit/41fa1c4ccf7f24ff7e653846a76305500df9ae66"><code>41fa1c4</code></a> [Backport maintenance/4.1.x] [pyreverse] Fix hang/RecursionError with --all-a...</li> <li><a href="https://github.com/pylint-dev/pylint/commit/a05e2f340808daab0fa775cbc39c3ce00e89f576"><code>a05e2f3</code></a> [Backport maintenance/4.1.x] Fix <code>used-before-assignment</code> false positive for ...</li> <li><a href="https://github.com/pylint-dev/pylint/commit/ea7996b00280e3b8e5fcd9dc4e8e122466abff6a"><code>ea7996b</code></a> [Backport maintenance/4.1.x] Error when several output formats write to stdou...</li> <li><a href="https://github.com/pylint-dev/pylint/commit/479c0379366e482cda6d842b5d4cca0a52370939"><code>479c037</code></a> [Backport maintenance/4.1.x] Fix IndexError when Enum <strong>init</strong> has no argumen...</li> <li><a href="https://github.com/pylint-dev/pylint/commit/e6aa780ba6e393a517556000cc81961996585cad"><code>e6aa780</code></a> [Backport maintenance/4.1.x] Fix unreachable false positive for raising gener...</li> <li><a href="https://github.com/pylint-dev/pylint/commit/fc58d0b4aa48eedc03776416998d70dda61dfe48"><code>fc58d0b</code></a> [Backport maintenance/4.1.x] Fix pyreverse crash on classes with EmptyNode in...</li> <li>Additional commits viewable in <a href="https://github.com/pylint-dev/pylint/compare/v4.0.9...v4.1.3">compare view</a></li> </ul> </details> <br /> Updates `python-dateutil` from 3.0.0 to 4.0.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/dateutil/dateutil/releases">python-dateutil's releases</a>.</em></p> <blockquote> <h2>4.0.0</h2> <p><code>dateutil</code> 4.0 requires Python 3.11 or later and no longer depends on <code>six</code>. Apart from that, the changes in this release are bug fixes, but note that <code>isoparse</code> is now stricter about the numeric fields it accepts (see below).</p> <h2>Deprecations</h2> <ul> <li>Dropped support for Python versions older than 3.11 and removed the dependency on <code>six</code>, along with Python 2 compatibility helpers that were never part of the public API, such as <code>dateutil.tz.tzname_in_python2</code>. (gh pr <a href="https://redirect.github.com/dateutil/dateutil/issues/1625">#1625</a>)</li> </ul> <h2>Bugfixes</h2> <ul> <li><code>parser.isoparse</code>, and the <code>isoparser</code> methods <code>parse_isodate</code>, <code>parse_isotime</code> and <code>parse_tzstr</code>, now require each numeric field to be exactly the expected number of ASCII digits. Strings that were previously accepted, such as <code>20200728121240</code> (read as 21:24), <code>2014- 4-21</code> and <code>2_14-04-21</code>, and offsets such as <code>+-1:00</code>, now raise <code>ValueError</code>. <code>tzical</code> applies the same check to <code>TZOFFSETFROM</code> and <code>TZOFFSETTO</code>. Reported by <a href="https://github.com/janos-gonye"><code>@janos-gonye</code></a> (gh issue <a href="https://redirect.github.com/dateutil/dateutil/issues/1074">#1074</a>). Fixed by <a href="https://github.com/varun3257"><code>@varun3257</code></a> (gh pr <a href="https://redirect.github.com/dateutil/dateutil/issues/1617">#1617</a>).</li> <li>Fixed an issue where iterating over a cached <code>rrule</code> or <code>rruleset</code> could hang forever if another iterator over the same rule had already completed the cache, for example when a cached <code>rrule</code> was included twice in an <code>rruleset</code>. Reported by <a href="https://github.com/bysiber"><code>@bysiber</code></a> (gh pr <a href="https://redirect.github.com/dateutil/dateutil/issues/1455">#1455</a>). Fixed by <a href="https://github.com/pganssle"><code>@pganssle</code></a> (gh pr <a href="https://redirect.github.com/dateutil/dateutil/issues/1655">#1655</a>).</li> <li>Unpickling a <code>tzutc</code> now gives the <code>dateutil.tz.UTC</code> singleton, and unpickling a <code>tzoffset</code> gives the same object as calling <code>tzoffset(name, offset)</code>. Previously unpickling bypassed the singleton-generation logic. Reported and fixed by <a href="https://github.com/masipcat"><code>@masipcat</code></a> (gh issue <a href="https://redirect.github.com/dateutil/dateutil/issues/1051">#1051</a>, gh pr <a href="https://redirect.github.com/dateutil/dateutil/issues/1053">#1053</a>).</li> <li><code>relativedelta(yearday=366)</code> now resolves to December 31 in leap years. Previously it gave December 30, the same date as <code>yearday=365</code>. Reported and fixed by <a href="https://github.com/Master-Norna"><code>@Master-Norna</code></a> (gh pr <a href="https://redirect.github.com/dateutil/dateutil/issues/1583">#1583</a>).</li> </ul> <h2>Misc</h2> <ul> <li>The build backend is now Hatchling, and the package metadata is in <code>pyproject.toml</code>. Versions are still derived from Git tags and exposed as <code>dateutil.__version__</code>. This mainly affects people building <code>dateutil</code> from source. (gh pr <a href="https://redirect.github.com/dateutil/dateutil/issues/1637">#1637</a>, <a href="https://redirect.github.com/dateutil/dateutil/issues/1638">#1638</a>)</li> <li>Changes to CI, tests and release tooling that do not affect users of the package: gh pr <a href="https://redirect.github.com/dateutil/dateutil/issues/1636">#1636</a>, <a href="https://redirect.github.com/dateutil/dateutil/issues/1644">#1644</a>, <a href="https://redirect.github.com/dateutil/dateutil/issues/1645">#1645</a>, <a href="https://redirect.github.com/dateutil/dateutil/issues/1646">#1646</a>, <a href="https://redirect.github.com/dateutil/dateutil/issues/1648">#1648</a>, <a href="https://redirect.github.com/dateutil/dateutil/issues/1649">#1649</a>, <a href="https://redirect.github.com/dateutil/dateutil/issues/1650">#1650</a>.</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/dateutil/dateutil/blob/master/NEWS">python-dateutil's changelog</a>.</em></p> <blockquote> <h1>Version 4.0.0 (2026-11-01)</h1> <p><code>dateutil</code> 4.0 requires Python 3.11 or later and no longer depends on <code>six</code>. Apart from that, the changes in this release are bug fixes, but note that <code>isoparse</code> is now stricter about the numeric fields it accepts (see below).</p> <h2>Deprecations</h2> <ul> <li>Dropped support for Python versions older than 3.11 and removed the dependency on <code>six</code>, along with Python 2 compatibility helpers that were never part of the public API, such as <code>dateutil.tz.tzname_in_python2</code>. (gh pr <a href="https://redirect.github.com/dateutil/dateutil/issues/1625">#1625</a>)</li> </ul> <h2>Bugfixes</h2> <ul> <li><code>parser.isoparse</code>, and the <code>isoparser</code> methods <code>parse_isodate</code>, <code>parse_isotime</code> and <code>parse_tzstr</code>, now require each numeric field to be exactly the expected number of ASCII digits. Strings that were previously accepted, such as <code>20200728121240</code> (read as 21:24), <code>2014- 4-21</code> and <code>2_14-04-21</code>, and offsets such as <code>+-1:00</code>, now raise <code>ValueError</code>. <code>tzical</code> applies the same check to <code>TZOFFSETFROM</code> and <code>TZOFFSETTO</code>. Reported by <a href="https://github.com/janos-gonye"><code>@janos-gonye</code></a> (gh issue <a href="https://redirect.github.com/dateutil/dateutil/issues/1074">#1074</a>). Fixed by <a href="https://github.com/varun3257"><code>@varun3257</code></a> (gh pr <a href="https://redirect.github.com/dateutil/dateutil/issues/1617">#1617</a>).</li> <li>Fixed an issue where iterating over a cached <code>rrule</code> or <code>rruleset</code> could hang forever if another iterator over the same rule had already completed the cache, for example when a cached <code>rrule</code> was included twice in an <code>rruleset</code>. Reported by <a href="https://github.com/bysiber"><code>@bysiber</code></a> (gh pr <a href="https://redirect.github.com/dateutil/dateutil/issues/1455">#1455</a>). Fixed by <a href="https://github.com/pganssle"><code>@pganssle</code></a> (gh pr <a href="https://redirect.github.com/dateutil/dateutil/issues/1655">#1655</a>).</li> <li>Unpickling a <code>tzutc</code> now gives the <code>dateutil.tz.UTC</code> singleton, and unpickling a <code>tzoffset</code> gives the same object as calling <code>t... _Description has been truncated_ Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This repository is the home of the core Python rules -- py_library, py_binary, py_test, and related symbols that provide the basis for Python support in Bazel. It also contains package installation rules for integrating with PyPI and other indices.
Documentation for rules_python is at https://rules-python.readthedocs.io and in the Bazel Build Encyclopedia.
Examples live in the examples directory.
The core rules are stable. Their implementation is subject to Bazel's backward compatibility policy. This repository aims to follow semantic versioning.
The Bazel community maintains this repository. Neither Google nor the Bazel team provides support for the code. However, this repository is part of the test suite used to vet new Bazel releases. See How to contribute page for information on our development workflow.
requirements.txt is how users have been defining dependencies for a long time. We support this to support legacy usecases or package managers that we don't support directly. Any additional information that we need will be retrieved from the SimpleAPI during the bzlmod extension evaluation phase. Then it will be written to the MODULE.bazel.lock file for future reuse. We also support uv.lock files directly under bzlmod, which already contain cross-platform distribution URLs and hashes and do not require SimpleAPI queries or storing distribution hashes in MODULE.bazel.lock. uv is recommended for generating uv.lock or a fully locked requirements.txt file, and we provide a rule for it.py_binary, py_test rules should scale to large monorepos and we work hard to minimize the work done during analysis and build phase. What is more, the space requirements for should be minimal, so we strive to use symlinks rather than extracting wheels at build time. This means that for different configurations of the same build, we are not extracting the wheel multiple times thus scaling better over the time. From 2.0 onwards we are creating a virtual env for each target by creating an actual minimal virtual environment using symlinks. We plan on creating the traditional site-packages layout in the future by default.rules_python and this has resulted in a few PEPs supported within pure starlark - PEP440, PEP509.Common misconceptions:
rules_python has to keep backwards compatibility with google3. Whilst this might have been true in the past, rules_python is an open source project and any compatibility needs should come from the community - we have no requirement to keep this compatibility and are allowed to make our decisions. However, we do want to keep backwards compatibility as long as possible to not upset users with never ending migrations.rules_python is not caching pip downloads. With 2.0, we use Bazel's downloader by default and rely on bazel to provide the repository caching mechanisms. This means that for simpler setups this should result in transparent and scalable caching with the most recent bazel versions unless there are issues in the bazel itself.For detailed documentation, see https://rules-python.readthedocs.io
See Bzlmod support for more details.