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(&quot;X&quot;)</code> is now <code>X</code> rather than
<code>&lt;X&gt;</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(&quot;X&quot;)</code> is now <code>X</code> rather than
<code>&lt;X&gt;</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(&quot;X&quot;)</code> is now <code>X</code> rather than
<code>&lt;X&gt;</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()
&lt;pytest.Metafunc.parametrize&gt;</code> -- and therefore of
<code>@pytest.mark.parametrize &lt;pytest.mark.parametrize
ref&gt;</code> -- are now keyword-only.</p>
<p>Passing them positionally was a common source of confusing errors,
e.g. <code>parametrize(&quot;arg1&quot;, &quot;arg2&quot;, [(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 --> &amp; <!-- 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 == &quot;win32&quot;:</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 &quot;mapping&quot; instead of &quot;dict&quot; 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 &quot;dev0&quot; 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 == &quot;win32&quot;:</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>
26 files changed
tree: f6d8f08760b80178c7b43093f109a20118ad51f9
  1. .agents/
  2. .bazelci/
  3. .bcr/
  4. .ci/
  5. .github/
  6. command_line_option/
  7. crates/
  8. dev/
  9. docs/
  10. examples/
  11. gazelle/
  12. news/
  13. python/
  14. sphinxdocs/
  15. tests/
  16. tools/
  17. .bazelignore
  18. .bazelrc
  19. .bazelrc.deleted_packages
  20. .bazelversion
  21. .clippy.toml
  22. .editorconfig
  23. .git-blame-ignore-revs
  24. .gitattributes
  25. .gitignore
  26. .pre-commit-config.yaml
  27. .python-version
  28. .readthedocs.yml
  29. addlicense.sh
  30. AGENTS.md
  31. AUTHORS
  32. BUILD.bazel
  33. buildbuddy.bazelrc
  34. BZLMOD_SUPPORT.md
  35. CHANGELOG.md
  36. CLAUDE.md
  37. CONTRIBUTING.md
  38. CONTRIBUTORS
  39. downloader_config.cfg
  40. GEMINI.md
  41. internal_dev_deps.bzl
  42. internal_dev_setup.bzl
  43. LICENSE
  44. MODULE.bazel
  45. README.md
  46. RELEASING.md
  47. replicate_ci
  48. ruff.toml
  49. specialized_configs.bazelrc
  50. version.bzl
  51. WORKSPACE
  52. WORKSPACE.bzlmod
  53. workspace_bazel9.bzl
README.md

Python Rules for Bazel

Build status GitHub CI status

Overview

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.

Design

  • Supported OSes - as per our supported platform policy, we strive for support on all of the platforms that we have CI for. Some platforms do not have the same backwards compatibility guarantees, but we hope the community can step in where needed to make the support more robust.
  • 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.
  • The 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.
  • Support for standards - we strive to first implement any standards needed within 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.

Documentation

For detailed documentation, see https://rules-python.readthedocs.io

Bzlmod support

See Bzlmod support for more details.