Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

importlib.metadata.metadata("package") fails with email.errors.HeaderParseError when README contains valid markdown link #119650

Open
hcording opened this issue May 28, 2024 · 12 comments
Assignees
Labels
stdlib Python modules in the Lib dir topic-email topic-importlib type-bug An unexpected behavior, bug, or error

Comments

@hcording
Copy link

hcording commented May 28, 2024

Bug report

Bug description:

Here is a minimal example project (tested on Python 3.10):

pyproject.toml

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "test"
readme = "README.md"
version = "0.1.0"

README.md

# Test

[MIT](<https://choosealicense.com/licenses/mit/>)

test package:

  • __init__.py (empty)
  • bug.py: import importlib.metadata; print(importlib.metadata.metadata("test"))

To reproduce:
pip install -e .
python test/bug.py

Traceback:

Traceback (most recent call last):
  File "bug.py", line 1, in <module>
    import importlib.metadata; print(importlib.metadata.metadata("test"))
  File "lib/python3.10/email/message.py", line 135, in __str__
    return self.as_string()
  File "lib/python3.10/email/message.py", line 158, in as_string
    g.flatten(self, unixfrom=unixfrom)
  File "/home/mint/miniforge3/lib/python3.10/email/generator.py", line 116, in flatten
    self._write(msg)
  File "lib/python3.10/email/generator.py", line 199, in _write
    self._write_headers(msg)
  File "lib/python3.10/email/generator.py", line 226, in _write_headers
    self.write(self.policy.fold(h, v))
  File "lib/python3.10/email/_policybase.py", line 326, in fold
    return self._fold(name, value, sanitize=True)
  File "lib/python3.10/email/_policybase.py", line 369, in _fold
    parts.append(h.encode(linesep=self.linesep, maxlinelen=maxlinelen))
  File "lib/python3.10/email/header.py", line 389, in encode
    raise HeaderParseError("header value appears to contain "
email.errors.HeaderParseError: header value appears to contain an embedded header: '# Test\n[MIT](<https://choosealicense.com/licenses/mit/>)'

It appears that [MIT] is seen as a header, as it would be in a TOML file. That's my best guess really. Any help is appreciated!

CPython versions tested on:

3.10

Operating systems tested on:

Linux

@hcording hcording added the type-bug An unexpected behavior, bug, or error label May 28, 2024
@jaraco jaraco self-assigned this Jun 21, 2024
@jaraco
Copy link
Member

jaraco commented Jun 21, 2024

Today I encountered this error as well on a file with RST in the description:

 ~ @ pip-run build -- -c "import build.util; print(build.util.project_wheel_metadata('~/code/jaraco/jaraco.packaging'))"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
    import build.util; print(build.util.project_wheel_metadata('~/code/jaraco/jaraco.packaging'))
                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/folders/f2/2plv6q2n7l932m2x004jlw340000gn/T/pip-run-u6naqgo3/build/util.py", line 43, in project_wheel_metadata
    builder = ProjectBuilder.from_isolated_env(
        env,
        source_dir,
        runner=runner,
    )
  File "/var/folders/f2/2plv6q2n7l932m2x004jlw340000gn/T/pip-run-u6naqgo3/build/_builder.py", line 179, in from_isolated_env
    return cls(
        source_dir=source_dir,
        python_executable=env.python_executable,
        runner=_wrap_subprocess_runner(runner, env),
    )
  File "/var/folders/f2/2plv6q2n7l932m2x004jlw340000gn/T/pip-run-u6naqgo3/build/_builder.py", line 154, in __init__
    _validate_source_directory(source_dir)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
  File "/var/folders/f2/2plv6q2n7l932m2x004jlw340000gn/T/pip-run-u6naqgo3/build/_builder.py", line 52, in _validate_source_directory
    raise BuildException(msg)
build._exceptions.BuildException: Source ~/code/jaraco/jaraco.packaging is not a directory
 ~ [1] @ pip-run build -- -c "import build.util; print(build.util.project_wheel_metadata('code/jaraco/jaraco.packaging'))"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
    import build.util; print(build.util.project_wheel_metadata('code/jaraco/jaraco.packaging'))
                       ~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/python/lib/python3.13/email/message.py", line 165, in __str__
    return self.as_string()
           ~~~~~~~~~~~~~~^^
  File "/opt/python/lib/python3.13/email/message.py", line 188, in as_string
    g.flatten(self, unixfrom=unixfrom)
    ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/python/lib/python3.13/email/generator.py", line 115, in flatten
    self._write(msg)
    ~~~~~~~~~~~^^^^^
  File "/opt/python/lib/python3.13/email/generator.py", line 198, in _write
    self._write_headers(msg)
    ~~~~~~~~~~~~~~~~~~~^^^^^
  File "/opt/python/lib/python3.13/email/generator.py", line 225, in _write_headers
    self.write(self.policy.fold(h, v))
               ~~~~~~~~~~~~~~~~^^^^^^
  File "/opt/python/lib/python3.13/email/_policybase.py", line 326, in fold
    return self._fold(name, value, sanitize=True)
           ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/python/lib/python3.13/email/_policybase.py", line 369, in _fold
    parts.append(h.encode(linesep=self.linesep, maxlinelen=maxlinelen))
                 ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/python/lib/python3.13/email/header.py", line 385, in encode
    raise HeaderParseError("header value appears to contain "
        "an embedded header: {!r}".format(value))
email.errors.HeaderParseError: header value appears to contain an embedded header: ".. image:: https://img.shields.io/pypi/v/jaraco.packaging.svg\n   :target: https://pypi.org/project/jaraco.packaging\n.. image:: https://img.shields.io/pypi/pyversions/jaraco.packaging.svg\n.. image:: https://github.com/jaraco/jaraco.packaging/actions/workflows/main.yml/badge.svg\n   :target: https://github.com/jaraco/jaraco.packaging/actions?query=workflow%3A%22tests%22\n   :alt: tests\n.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json\n    :target: https://github.com/astral-sh/ruff\n    :alt: Ruff\n.. image:: https://readthedocs.org/projects/jaracopackaging/badge/?version=latest\n   :target: https://jaracopackaging.readthedocs.io/en/latest/?badge=latest\n.. image:: https://img.shields.io/badge/skeleton-2024-informational\n   :target: https://blog.jaraco.com/skeleton\nTools for packaging.\nsphinx\n======\nThis package provides a Sphinx extension that will inject into the config\nthe following values from the project's package metadata (as presented by\ndistutils):\n - project (from name)\n - author\n - copyright (same as author)\n - version\n - release (same as version)\n - package_url (from url)\nTo enable, include 'jaraco.packaging' in the requirements and add\n'jaraco.packaging.sphinx' to the list of extensions in a Sphinx config\nfile::\n    extensions=['jaraco.packaging.sphinx']\nThe extension by default builds the project in an isolated environment in\norder to extract the metadata. For offline builds, set\n``BUILD_ENVIRONMENT=current`` and ensure the build dependencies are\nmet in the current environment.\nDeprecated: To build the documentation offline,\nprovide an already built wheel by setting the environment variable\n``JARACO_PACKAGING_SPHINX_WHEEL`` to the path of an existing wheel.\nmake-tree\n=========\nA utility for taking output from ``pipdeptree --json`` and producing a tree\nrooted at a given package.\nUsage::\n    pipdeptree --json | python -m jaraco.packaging.make-tree mypkg\nmetadata\n=========\nA wrapper around ``build.util.project_wheel_metadata`` to enable dowstream\npackagers to indicate that they need an isolated build. Set the environment\nvariable ``BUILD_ENVIRONMENT=current`` to bypass build isolation and use the\ncurrent isolation for loading metadata from a project."

I believe this is a bug in the email module incorrectly inferring an error in the (multi-line) description.

A workaround is to not print the metadata, but instead print each of the keys:

md = importlib.metadata.metadata('test')
for key in md:
    print(key, md[key], sep=": ")

Edit: on further consideration, that approach will fail to emit unique values for headers of the same key. A better workaround is needed.

@jaraco
Copy link
Member

jaraco commented Jun 21, 2024

The error is easily reproduced without involving importlib.metadata:

>>> import email.message
>>> msg = email.message.Message()
>>> msg.add_header('Foo', 'Test\n[bar](https://example.com)\n')
>>> print(msg)
Traceback (most recent call last):
...
email.errors.HeaderParseError: header value appears to contain an embedded header: 'Test\n[bar](https://example.com)'

@jaraco jaraco changed the title importlib.metadata.metadata("package") fails with email.errors.HeaderParseError when README contains valid markdown link email.message.Message.__str__ fails with email.errors.HeaderParseError for valid non-header content Jun 21, 2024
@jaraco
Copy link
Member

jaraco commented Jun 21, 2024

The regex that's rejecting the header value is:

# Find a header embedded in a putative header value. Used to check for
# header injection attack.
_embedded_header = re.compile(r'\n[^ \t]+:')

It's detecting the [bar](https as a header key and //example.com) as the value.

@jaraco
Copy link
Member

jaraco commented Jun 21, 2024

Aha. So maybe importlib.metadata is implicated, since it's repairing the headers thus:

def _repair_headers(self):
def redent(value):
"Correct for RFC822 indentation"
if not value or '\n' not in value:
return value
return textwrap.dedent(' ' * 8 + value)
headers = [(key, redent(value)) for key, value in vars(self)['_headers']]
if self._payload:
headers.append(('Description', self.get_payload()))
return headers

The email module is assuming the headers are internally represented in their messy, escaped format, but importlib.metadata adapts that to store friendly values internally.

Probably that means that importlib.metadata should also override the rendering behavior.

@jaraco jaraco changed the title email.message.Message.__str__ fails with email.errors.HeaderParseError for valid non-header content importlib.metadata.metadata("package") fails with email.errors.HeaderParseError when README contains valid markdown link Jun 21, 2024
@henryiii
Copy link
Contributor

henryiii commented Oct 9, 2024

I get this with iminuit, too. There's it's actually in a header - the license.

assuming the headers are internally represented in their messy, escaped format

The looks like it's just adding indent to already-indented headers. I don't think they could be broken that way. But are the headers actually escaped? The email module doesn't handle unicode (at least for the body), and the specification says it's RFC822 + unicode. And headers aren't allowed to have a new newline in the writers. So most writers customize the writing, and I don't think they escape anything.

@defnull
Copy link

defnull commented Oct 9, 2024

Just for context: In emails, a header values cannot contain \n. Long headers can be folded into multiple lines with a line break and the next line starting with white-space, but that's only for transport. Semantically, a folded header value is still just a single line of text. Folding is reversed by removing the white-space and the line-break and stitching the value back together with a single white-space. The line-breaks are lost in the process. So, using the email module for key/value pairs with multi-line values may be tricky. The current approach sounds like a very fragile way to handle this type of data.

@henryiii
Copy link
Contributor

henryiii commented Oct 9, 2024

I would love if Python package metadata was JSON instead of not-really-email format. :) There's a way to express metadata (starting with 2.1 or 2.2, forget which) as JSON, but no standard filename, etc. for it.

The original "long-description" section, before it was moved to the payload, used | like so:

To support empty lines and lines with indentation with respect to the RFC 822 format, any > CRLF character has to be suffixed by 7 spaces followed by a pipe (“|”) char. As a result, > the Description field is encoded into a folded field that can be interpreted by RFC822 parser.

Example:

Description: This project provides powerful math functions
     |For example, you can use `sum()` to sum numbers:
     |
     |Example::
     |
     |    >>> sum(1, 2)
     |    3
     |

This encoding implies that any occurrences of a CRLF followed by 7 spaces and a pipe char > have to be replaced by a single CRLF when the field is unfolded using a RFC822 reader.

Alternatively, the distribution’s description may instead be provided in the message body > (i.e., after a completely blank line following the headers, with no indentation or other special formatting necessary).

(TBH, payloads aren't unicode, so this requires more hacks.)

But this was never done for the license field, such as in this example:

License: This software may only be obtained by sending the
      author a postcard, and then the user promises not
      to redistribute it.

(See https://packaging.python.org/en/latest/specifications/core-metadata/#license)

When I've tried to validate single line for the one-line summary, I had to go back because people were loading paragraphs into the summary and were mad that it broke. 🤷


The issue here, though, is that there seems to be some escaping needed for things like markdown and restructure text code in a field (License for example), and I'm trying to find out if there's some escaping we can do to make the parser happy.

HDembinski pushed a commit to scikit-hep/iminuit that referenced this issue Oct 10, 2024
Before moving to scikit-build-core, this was the contents of the
`License` field. Putting the entire contents of the license file here
breaks `importlib.metadata.metadata("iminuit")` (see
python/cpython#119650), and isn't needed - the
license file is stored in the wheel already, and the currently only
canonical location for license metadata is the trove classifiers. PEP
639, which is currently provisionally accepted and waiting support in
packaging, PyPI, etc, solves this by supporting SPDX license
expressions. But that's not ready yet.

(This is not critical, but a minor annoyance I hit while debugging)
@henryiii
Copy link
Contributor

henryiii commented Oct 11, 2024

Currently, I can't reproduce the error. The same version of iminuit I was running is not reporting an error even when I try it on a range of Pythons.

# /// script
# dependencies = ["nox"]
# ///

import nox
import nox.__main__


@nox.session(python=["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"], venv_backend="uv")
def check(session):
    session.install("iminuit")
    session.run("python", "-c", "import importlib.metadata; importlib.metadata.metadata('iminuit')['License']")

if __name__ == "__main__":
    nox.__main__.main()

@zyzzyxdonta
Copy link

This problem also occurs with license identifiers in HTML comments in README.md, e.g.

<!--
SPDX-FileCopyrightText: 2025 David (Me)

SPDX-License-Identifier: GPL-3.0-or-later
-->

contents here ...

with error

email.errors.HeaderParseError: header value appears to contain an embedded header: "(complete content of README.md here)"

@jaraco
Copy link
Member

jaraco commented Jan 20, 2025

Here's a simpler reproducer:

 🐚 py -c "import importlib.metadata as md; print(md.metadata('pip'))"

Essentially, attempting to render the metadata for any package with a multiline description is likely to fail.

I would love if Python package metadata was JSON instead of not-really-email format. :)

I do observe that the importlib.metadata._adapters.Message has a .json property. Perhaps that's the best way to work around this issue until native rendering support can be added:

 🐚 py -c "import importlib.metadata as md; print(md.metadata('pip').json)"

@picnixz picnixz added the stdlib Python modules in the Lib dir label Jan 20, 2025
@jaraco
Copy link
Member

jaraco commented Jan 20, 2025

I've rolled out a fix in importlib_metadata 8.6.0. Unfortunately, it doesn't seem to be having the desired effect:

 🐚 pip-run importlib_metadata==8.6.0 -- -c "import importlib_metadata as md; print(md.metadata('pip'))"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
    import importlib_metadata as md; print(md.metadata('pip'))
                                     ~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/opt/python/lib/python3.14t/email/message.py", line 165, in __str__
    return self.as_string()
           ~~~~~~~~~~~~~~^^
  File "/var/folders/f2/2plv6q2n7l932m2x004jlw340000gn/T/pip-run-ays8in74/importlib_metadata/_adapters.py", line 113, in as_string
    return super().as_string(policy=RawPolicy())
           ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/opt/python/lib/python3.14t/email/message.py", line 188, in as_string
    g.flatten(self, unixfrom=unixfrom)
    ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/python/lib/python3.14t/email/generator.py", line 117, in flatten
    self._write(msg)
    ~~~~~~~~~~~^^^^^
  File "/opt/python/lib/python3.14t/email/generator.py", line 200, in _write
    self._write_headers(msg)
    ~~~~~~~~~~~~~~~~~~~^^^^^
  File "/opt/python/lib/python3.14t/email/generator.py", line 234, in _write_headers
    raise HeaderWriteError(
        f'folded header contains newline: {folded!r}')
email.errors.HeaderWriteError: folded header contains newline: "Description: pip - The Python Package Installer\n        ==================================\n\n        .. |pypi-version| image:: https://img.shields.io/pypi/v/pip.svg\n           :target: https://pypi.org/project/pip/\n           :alt: PyPI\n\n        .. |python-versions| image:: https://img.shields.io/pypi/pyversions/pip\n           :target: https://pypi.org/project/pip\n           :alt: PyPI - Python Version\n\n        .. |docs-badge| image:: https://readthedocs.org/projects/pip/badge/?version=latest\n           :target: https://pip.pypa.io/en/latest\n           :alt: Documentation\n\n        |pypi-version| |python-versions| |docs-badge|\n\n        pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.\n\n        Please take a look at our documentation for how to install and use pip:\n\n        * `Installation`_\n        * `Usage`_\n\n        We release updates regularly, with a new version every 3 months. Find more details in our documentation:\n\n        * `Release notes`_\n        * `Release process`_\n\n        If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:\n\n        * `Issue tracking`_\n        * `Discourse channel`_\n        * `User IRC`_\n\n        If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:\n\n        * `GitHub page`_\n        * `Development documentation`_\n        * `Development IRC`_\n\n        Code of Conduct\n        ---------------\n\n        Everyone interacting in the pip project's codebases, issue trackers, chat\n        rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.\n\n        .. _package installer: https://packaging.python.org/guides/tool-recommendations/\n        .. _Python Package Index: https://pypi.org\n        .. _Installation: https://pip.pypa.io/en/stable/installation/\n        .. _Usage: https://pip.pypa.io/en/stable/\n        .. _Release notes: https://pip.pypa.io/en/stable/news.html\n        .. _Release process: https://pip.pypa.io/en/latest/development/release-process/\n        .. _GitHub page: https://github.com/pypa/pip\n        .. _Development documentation: https://pip.pypa.io/en/latest/development\n        .. _Issue tracking: https://github.com/pypa/pip/issues\n        .. _Discourse channel: https://discuss.python.org/c/packaging\n        .. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa\n        .. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev\n        .. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md\n"

It seems that although I added some support for rendering content with newlines (by indenting it), there are still some blank lines that are not being indented.

Aha. It seems that textwrap.indent does not indent blank lines by default.

textwrap.indent('foo\n\nbar', prefix='!!!')
'!!!foo\n\n!!!bar'

@jaraco
Copy link
Member

jaraco commented Jan 20, 2025

In importlib_metadata 8.6.1, it now honors blank lines as well. Please try it out and confirm it addresses your concerns; it should get merged into Python 3.14.

neu-ro-github-bot bot pushed a commit to neuro-inc/apolo-cli that referenced this issue Jan 21, 2025
Bumps [importlib-metadata](https://github.com/python/importlib_metadata)
from 8.5.0 to 8.6.1.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/python/importlib_metadata/blob/main/NEWS.rst">importlib-metadata's
changelog</a>.</em></p>
<blockquote>
<h1>v8.6.1</h1>
<h2>Bugfixes</h2>
<ul>
<li>Fixed indentation logic to also honor blank lines.</li>
</ul>
<h1>v8.6.0</h1>
<h2>Features</h2>
<ul>
<li><code>python/cpython#119650</code></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/python/importlib_metadata/commit/45e8bde73f8ce816fdc47618a31ba3916a332485"><code>45e8bde</code></a>
Finalize</li>
<li><a
href="https://github.com/python/importlib_metadata/commit/506beb7cbd23fef4f93a63a5c3931e302d828896"><code>506beb7</code></a>
Fixed indentation logic to also honor blank lines.</li>
<li><a
href="https://github.com/python/importlib_metadata/commit/dad738095d6d28f24d254f3cc9f82e2394fb2a09"><code>dad7380</code></a>
Finalize</li>
<li><a
href="https://github.com/python/importlib_metadata/commit/dab1dd81507fef5bff6a32a63ab8fc8633e2c24c"><code>dab1dd8</code></a>
When transforming the payload to a Description key, clear the
payload.</li>
<li><a
href="https://github.com/python/importlib_metadata/commit/07aa607e54672bc1077007771cbca0e16475aa24"><code>07aa607</code></a>
Add support for rendering metadata where some fields have newlines
(python/cp...</li>
<li><a
href="https://github.com/python/importlib_metadata/commit/b92ec183c0297c2edd9b66202647c560937241e3"><code>b92ec18</code></a>
Merge <a
href="https://github.com/jaraco/skeleton">https://github.com/jaraco/skeleton</a></li>
<li><a
href="https://github.com/python/importlib_metadata/commit/5c34e69568f23a524af4fa9dad3f5e80f22ec3e6"><code>5c34e69</code></a>
Use extend for proper workaround.</li>
<li><a
href="https://github.com/python/importlib_metadata/commit/694e5b4e5e024e29d3bff6f8ff3054792c6e726a"><code>694e5b4</code></a>
Merge <a
href="https://github.com/jaraco/skeleton">https://github.com/jaraco/skeleton</a></li>
<li><a
href="https://github.com/python/importlib_metadata/commit/750a1891ec4a1c0602050e3463e9593a8c13aa14"><code>750a189</code></a>
Require Python 3.9 or later now that Python 3.8 is EOL.</li>
<li><a
href="https://github.com/python/importlib_metadata/commit/e61a9df7cdc9c8d1b56c30b7b3f94a7cdac14414"><code>e61a9df</code></a>
Include pyproject.toml in ruff.toml.</li>
<li>Additional commits viewable in <a
href="https://github.com/python/importlib_metadata/compare/v8.5.0...v8.6.1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=importlib-metadata&package-manager=pip&previous-version=8.5.0&new-version=8.6.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
clrpackages pushed a commit to clearlinux-pkgs/pypi-importlib_metadata that referenced this issue Jan 24, 2025
…5.0 to version 8.6.1

Anderson Bravalheri (1):
      Bump pre-commit hook for ruff to avoid clashes with pytest-ruff (jaraco/skeleton#150)

Avasam (1):
      Fix an incompatibility (and source of merge conflicts) with projects using Ruff/isort.

Jason R. Coombs (15):
      Remove workaround for sphinx-contrib/sphinx-lint#83
      Allow the workflow to be triggered manually.
      👹 Feed the hobgoblins (delint).
      Ensure redent is idempotent (doesn't add 8 spaces to already dedented values).
      Add Python 3.13 and 3.14 into the matrix. (jaraco/skeleton#146)
      Separate bpo from Python issue numbers.
      Add Python 3.13 and 3.14 into the matrix. (jaraco/skeleton#151)
      Include pyproject.toml in ruff.toml.
      Require Python 3.9 or later now that Python 3.8 is EOL.
      Use extend for proper workaround.
      Add support for rendering metadata where some fields have newlines (python/cpython#119650).
      When transforming the payload to a Description key, clear the payload.
      Finalize
      Fixed indentation logic to also honor blank lines.
      Finalize
ansibuddy pushed a commit to ansible/molecule that referenced this issue Jan 27, 2025
Bumps the dependencies group in /.config with 12 updates:

| Package | From | To |
| --- | --- | --- |
| [filelock](https://github.com/tox-dev/py-filelock) | `3.16.1` |
`3.17.0` |
| [pre-commit](https://github.com/pre-commit/pre-commit) | `4.0.1` |
`4.1.0` |
| [ruff](https://github.com/astral-sh/ruff) | `0.9.2` | `0.9.3` |
| [tox](https://github.com/tox-dev/tox) | `4.23.2` | `4.24.1` |
| [attrs](https://github.com/sponsors/hynek) | `24.3.0` | `25.1.0` |
| [cachetools](https://github.com/tkem/cachetools) | `5.5.0` | `5.5.1` |
| [identify](https://github.com/pre-commit/identify) | `2.6.5` | `2.6.6`
|
| [importlib-metadata](https://github.com/python/importlib_metadata) |
`8.5.0` | `8.6.1` |
|
[pymdown-extensions](https://github.com/facelessuser/pymdown-extensions)
| `10.14` | `10.14.1` |
| [pyproject-api](https://github.com/tox-dev/pyproject-api) | `1.8.0` |
`1.9.0` |
| [referencing](https://github.com/python-jsonschema/referencing) |
`0.36.1` | `0.36.2` |
| ruamel-yaml | `0.18.6` | `0.18.10` |

Updates `filelock` from 3.16.1 to 3.17.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/tox-dev/py-filelock/releases">filelock's
releases</a>.</em></p>
<blockquote>
<h2>Drop 3.8</h2>
<!-- raw HTML omitted -->
<p><strong>Full Changelog</strong>: <a
href="https://github.com/tox-dev/filelock/compare/3.16.1...3.17.0">https://github.com/tox-dev/filelock/compare/3.16.1...3.17.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/tox-dev/filelock/commit/5eb02b2580122e6f42fb8b7a4e08cededcb22b1c"><code>5eb02b2</code></a>
Drop 3.8 (<a
href="https://github.com/tox-dev/py-filelock/issues/388">#388</a>)</li>
<li><a
href="https://github.com/tox-dev/filelock/commit/23a984803c969a75530ba8c2c5fb5a6b73686762"><code>23a9848</code></a>
Bump astral-sh/setup-uv from 4 to 5 (<a
href="https://github.com/tox-dev/py-filelock/issues/387">#387</a>)</li>
<li><a
href="https://github.com/tox-dev/filelock/commit/79a958358f79ea3ae0ae1bc7ee7ce6a96a5ef407"><code>79a9583</code></a>
Bump pypa/gh-action-pypi-publish from 1.12.2 to 1.12.3 (<a
href="https://github.com/tox-dev/py-filelock/issues/386">#386</a>)</li>
<li><a
href="https://github.com/tox-dev/filelock/commit/46dddc89672d1646156c61c4db0a664ba4886d2f"><code>46dddc8</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://github.com/tox-dev/py-filelock/issues/385">#385</a>)</li>
<li><a
href="https://github.com/tox-dev/filelock/commit/57f488ff8fdc2193572efe102408fb63cfefe4e4"><code>57f488f</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://github.com/tox-dev/py-filelock/issues/383">#383</a>)</li>
<li><a
href="https://github.com/tox-dev/filelock/commit/d4feb5a15974754a8fcd7893c196f229652a05ca"><code>d4feb5a</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://github.com/tox-dev/py-filelock/issues/382">#382</a>)</li>
<li><a
href="https://github.com/tox-dev/filelock/commit/fb2a4e26c6b391e78ca35d0959e854e9c174fc2b"><code>fb2a4e2</code></a>
Bump astral-sh/setup-uv from 3 to 4 (<a
href="https://github.com/tox-dev/py-filelock/issues/381">#381</a>)</li>
<li><a
href="https://github.com/tox-dev/filelock/commit/07c2840b805d1dd2400ee1b6b193dd3c9bf1f7c0"><code>07c2840</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://github.com/tox-dev/py-filelock/issues/379">#379</a>)</li>
<li><a
href="https://github.com/tox-dev/filelock/commit/ee4c7ba1c863509a4fa9a8a992c7ec41747e1f96"><code>ee4c7ba</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://github.com/tox-dev/py-filelock/issues/377">#377</a>)</li>
<li><a
href="https://github.com/tox-dev/filelock/commit/2e1a1b228dcf9ab82d93be164573def7c630ae54"><code>2e1a1b2</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://github.com/tox-dev/py-filelock/issues/374">#374</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/tox-dev/py-filelock/compare/3.16.1...3.17.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `pre-commit` from 4.0.1 to 4.1.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pre-commit/pre-commit/releases">pre-commit's
releases</a>.</em></p>
<blockquote>
<h2>pre-commit v4.1.0</h2>
<h3>Features</h3>
<ul>
<li>Add <code>language: julia</code>.
<ul>
<li><a
href="https://github.com/pre-commit/pre-commit/issues/3348">#3348</a>
PR by <a
href="https://github.com/fredrikekre"><code>@​fredrikekre</code></a>.</li>
<li><a
href="https://github.com/pre-commit/pre-commit/issues/2689">#2689</a>
issue <a
href="https://github.com/jmuchovej"><code>@​jmuchovej</code></a>.</li>
</ul>
</li>
</ul>
<h3>Fixes</h3>
<ul>
<li>Disable automatic toolchain switching for <code>language:
golang</code>.
<ul>
<li><a
href="https://github.com/pre-commit/pre-commit/issues/3304">#3304</a>
PR by <a
href="https://github.com/AleksaC"><code>@​AleksaC</code></a>.</li>
<li><a
href="https://github.com/pre-commit/pre-commit/issues/3300">#3300</a>
issue by <a
href="https://github.com/AleksaC"><code>@​AleksaC</code></a>.</li>
<li><a
href="https://github.com/pre-commit/pre-commit/issues/3149">#3149</a>
issue by <a
href="https://github.com/nijel"><code>@​nijel</code></a>.</li>
</ul>
</li>
<li>Fix <code>language: r</code> installation when initiated by RStudio.
<ul>
<li><a
href="https://github.com/pre-commit/pre-commit/issues/3389">#3389</a>
PR by <a
href="https://github.com/lorenzwalthert"><code>@​lorenzwalthert</code></a>.</li>
<li><a
href="https://github.com/pre-commit/pre-commit/issues/3385">#3385</a>
issue by <a
href="https://github.com/lorenzwalthert"><code>@​lorenzwalthert</code></a>.</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md">pre-commit's
changelog</a>.</em></p>
<blockquote>
<h1>4.1.0 - 2025-01-20</h1>
<h3>Features</h3>
<ul>
<li>Add <code>language: julia</code>.
<ul>
<li><a
href="https://github.com/pre-commit/pre-commit/issues/3348">#3348</a>
PR by <a
href="https://github.com/fredrikekre"><code>@​fredrikekre</code></a>.</li>
<li><a
href="https://github.com/pre-commit/pre-commit/issues/2689">#2689</a>
issue <a
href="https://github.com/jmuchovej"><code>@​jmuchovej</code></a>.</li>
</ul>
</li>
</ul>
<h3>Fixes</h3>
<ul>
<li>Disable automatic toolchain switching for <code>language:
golang</code>.
<ul>
<li><a
href="https://github.com/pre-commit/pre-commit/issues/3304">#3304</a>
PR by <a
href="https://github.com/AleksaC"><code>@​AleksaC</code></a>.</li>
<li><a
href="https://github.com/pre-commit/pre-commit/issues/3300">#3300</a>
issue by <a
href="https://github.com/AleksaC"><code>@​AleksaC</code></a>.</li>
<li><a
href="https://github.com/pre-commit/pre-commit/issues/3149">#3149</a>
issue by <a
href="https://github.com/nijel"><code>@​nijel</code></a>.</li>
</ul>
</li>
<li>Fix <code>language: r</code> installation when initiated by RStudio.
<ul>
<li><a
href="https://github.com/pre-commit/pre-commit/issues/3389">#3389</a>
PR by <a
href="https://github.com/lorenzwalthert"><code>@​lorenzwalthert</code></a>.</li>
<li><a
href="https://github.com/pre-commit/pre-commit/issues/3385">#3385</a>
issue by <a
href="https://github.com/lorenzwalthert"><code>@​lorenzwalthert</code></a>.</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/b152e922ef11a97efe22ca7dc4f90011f0d1711c"><code>b152e92</code></a>
v4.1.0</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/c3125a4d36912c768bfa5dcb2b79d6f4179d79ed"><code>c3125a4</code></a>
Merge pull request <a
href="https://github.com/pre-commit/pre-commit/issues/3389">#3389</a>
from lorenzwalthert/dev-always-unset-renv</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/c2c061cf63e00a3ff8c88a9054c47e96a36f2daa"><code>c2c061c</code></a>
fix: ensure env patch is applied for vanilla emulation</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/cd429db5e2172e51099716efd58a15e76a1719a7"><code>cd429db</code></a>
Merge pull request <a
href="https://github.com/pre-commit/pre-commit/issues/3382">#3382</a>
from pre-commit/pre-commit-ci-update-config</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/9b9f8e254d46da65c8544244c423596d54260e24"><code>9b9f8e2</code></a>
[pre-commit.ci] pre-commit autoupdate</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/86300a4a7e5441aad007d83c1101d8a8eb767ad7"><code>86300a4</code></a>
Merge pull request <a
href="https://github.com/pre-commit/pre-commit/issues/3376">#3376</a>
from pre-commit/r-gone</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/77edad8455e88b403e055d2692c9545085cf3edb"><code>77edad8</code></a>
install r on ubuntu runners</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/18b393905e24c730eeb15754f6f275a9d27e396f"><code>18b3939</code></a>
Merge pull request <a
href="https://github.com/pre-commit/pre-commit/issues/3375">#3375</a>
from pre-commit/dotnet-tests-ubuntu-latest</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/31cb945ffb860f6f8176642d1a27af40eeec554d"><code>31cb945</code></a>
Merge pull request <a
href="https://github.com/pre-commit/pre-commit/issues/3374">#3374</a>
from pre-commit/docker-image-tests-ubuntu-22-not-pre...</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/28c3d81bd27fe5e62eead459c1963a582e763bd7"><code>28c3d81</code></a>
update .net tests to use .net 8</li>
<li>Additional commits viewable in <a
href="https://github.com/pre-commit/pre-commit/compare/v4.0.1...v4.1.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `ruff` from 0.9.2 to 0.9.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/releases">ruff's
releases</a>.</em></p>
<blockquote>
<h2>0.9.3</h2>
<h2>Release Notes</h2>
<h3>Preview features</h3>
<ul>
<li>[<code>airflow</code>] Argument <code>fail_stop</code> in DAG has
been renamed as <code>fail_fast</code> (<code>AIR302</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15633">#15633</a>)</li>
<li>[<code>airflow</code>] Extend <code>AIR303</code> with more symbols
(<a
href="https://github.com/astral-sh/ruff/pull/15611">#15611</a>)</li>
<li>[<code>flake8-bandit</code>] Report all references to suspicious
functions (<code>S3</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15541">#15541</a>)</li>
<li>[<code>flake8-pytest-style</code>] Do not emit diagnostics for empty
<code>for</code> loops (<code>PT012</code>, <code>PT031</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15542">#15542</a>)</li>
<li>[<code>flake8-simplify</code>] Avoid double negations
(<code>SIM103</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15562">#15562</a>)</li>
<li>[<code>pyflakes</code>] Fix infinite loop with unused local import
in <code>__init__.py</code> (<code>F401</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15517">#15517</a>)</li>
<li>[<code>pylint</code>] Do not report methods with only one
<code>EM101</code>-compatible <code>raise</code> (<code>PLR6301</code>)
(<a
href="https://github.com/astral-sh/ruff/pull/15507">#15507</a>)</li>
<li>[<code>pylint</code>] Implement
<code>redefined-slots-in-subclass</code> (<code>W0244</code>) (<a
href="https://github.com/astral-sh/ruff/pull/9640">#9640</a>)</li>
<li>[<code>pyupgrade</code>] Add rules to use PEP 695 generics in
classes and functions (<code>UP046</code>, <code>UP047</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15565">#15565</a>,
<a
href="https://github.com/astral-sh/ruff/pull/15659">#15659</a>)</li>
<li>[<code>refurb</code>] Implement <code>for-loop-writes</code>
(<code>FURB122</code>) (<a
href="https://github.com/astral-sh/ruff/pull/10630">#10630</a>)</li>
<li>[<code>ruff</code>] Implement <code>needless-else</code> clause
(<code>RUF047</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15051">#15051</a>)</li>
<li>[<code>ruff</code>] Implement <code>starmap-zip</code>
(<code>RUF058</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15483">#15483</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-bugbear</code>] Do not raise error if keyword argument
is present and target-python version is less or equals than 3.9
(<code>B903</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15549">#15549</a>)</li>
<li>[<code>flake8-comprehensions</code>] strip parentheses around
generators in <code>unnecessary-generator-set</code> (<code>C401</code>)
(<a
href="https://github.com/astral-sh/ruff/pull/15553">#15553</a>)</li>
<li>[<code>flake8-pytest-style</code>] Rewrite references to
<code>.exception</code> (<code>PT027</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15680">#15680</a>)</li>
<li>[<code>flake8-simplify</code>] Mark fixes as unsafe
(<code>SIM201</code>, <code>SIM202</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15626">#15626</a>)</li>
<li>[<code>flake8-type-checking</code>] Fix some safe fixes being
labeled unsafe (<code>TC006</code>,<code>TC008</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15638">#15638</a>)</li>
<li>[<code>isort</code>] Omit trailing whitespace in
<code>unsorted-imports</code> (<code>I001</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15518">#15518</a>)</li>
<li>[<code>pydoclint</code>] Allow ignoring one line docstrings for
<code>DOC</code> rules (<a
href="https://github.com/astral-sh/ruff/pull/13302">#13302</a>)</li>
<li>[<code>pyflakes</code>] Apply redefinition fixes by source code
order (<code>F811</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15575">#15575</a>)</li>
<li>[<code>pyflakes</code>] Avoid removing too many imports in
<code>redefined-while-unused</code> (<code>F811</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15585">#15585</a>)</li>
<li>[<code>pyflakes</code>] Group redefinition fixes by source statement
(<code>F811</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15574">#15574</a>)</li>
<li>[<code>pylint</code>] Include name of base class in message for
<code>redefined-slots-in-subclass</code> (<code>W0244</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15559">#15559</a>)</li>
<li>[<code>ruff</code>] Update fix for <code>RUF055</code> to use
<code>var == value</code> (<a
href="https://github.com/astral-sh/ruff/pull/15605">#15605</a>)</li>
</ul>
<h3>Formatter</h3>
<ul>
<li>Fix bracket spacing for single-element tuples in f-string
expressions (<a
href="https://github.com/astral-sh/ruff/pull/15537">#15537</a>)</li>
<li>Fix unstable f-string formatting for expressions containing a
trailing comma (<a
href="https://github.com/astral-sh/ruff/pull/15545">#15545</a>)</li>
</ul>
<h3>Performance</h3>
<ul>
<li>Avoid quadratic membership check in import fixes (<a
href="https://github.com/astral-sh/ruff/pull/15576">#15576</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Allow <code>unsafe-fixes</code> settings for code actions (<a
href="https://github.com/astral-sh/ruff/pull/15666">#15666</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>flake8-bandit</code>] Add missing single-line/dotall regex
flag (<code>S608</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15654">#15654</a>)</li>
<li>[<code>flake8-import-conventions</code>] Fix infinite loop between
<code>ICN001</code> and <code>I002</code> (<code>ICN001</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15480">#15480</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's
changelog</a>.</em></p>
<blockquote>
<h2>0.9.3</h2>
<h3>Preview features</h3>
<ul>
<li>[<code>airflow</code>] Argument <code>fail_stop</code> in DAG has
been renamed as <code>fail_fast</code> (<code>AIR302</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15633">#15633</a>)</li>
<li>[<code>airflow</code>] Extend <code>AIR303</code> with more symbols
(<a
href="https://github.com/astral-sh/ruff/pull/15611">#15611</a>)</li>
<li>[<code>flake8-bandit</code>] Report all references to suspicious
functions (<code>S3</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15541">#15541</a>)</li>
<li>[<code>flake8-pytest-style</code>] Do not emit diagnostics for empty
<code>for</code> loops (<code>PT012</code>, <code>PT031</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15542">#15542</a>)</li>
<li>[<code>flake8-simplify</code>] Avoid double negations
(<code>SIM103</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15562">#15562</a>)</li>
<li>[<code>pyflakes</code>] Fix infinite loop with unused local import
in <code>__init__.py</code> (<code>F401</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15517">#15517</a>)</li>
<li>[<code>pylint</code>] Do not report methods with only one
<code>EM101</code>-compatible <code>raise</code> (<code>PLR6301</code>)
(<a
href="https://github.com/astral-sh/ruff/pull/15507">#15507</a>)</li>
<li>[<code>pylint</code>] Implement
<code>redefined-slots-in-subclass</code> (<code>W0244</code>) (<a
href="https://github.com/astral-sh/ruff/pull/9640">#9640</a>)</li>
<li>[<code>pyupgrade</code>] Add rules to use PEP 695 generics in
classes and functions (<code>UP046</code>, <code>UP047</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15565">#15565</a>,
<a
href="https://github.com/astral-sh/ruff/pull/15659">#15659</a>)</li>
<li>[<code>refurb</code>] Implement <code>for-loop-writes</code>
(<code>FURB122</code>) (<a
href="https://github.com/astral-sh/ruff/pull/10630">#10630</a>)</li>
<li>[<code>ruff</code>] Implement <code>needless-else</code> clause
(<code>RUF047</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15051">#15051</a>)</li>
<li>[<code>ruff</code>] Implement <code>starmap-zip</code>
(<code>RUF058</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15483">#15483</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>flake8-bugbear</code>] Do not raise error if keyword argument
is present and target-python version is less or equals than 3.9
(<code>B903</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15549">#15549</a>)</li>
<li>[<code>flake8-comprehensions</code>] strip parentheses around
generators in <code>unnecessary-generator-set</code> (<code>C401</code>)
(<a
href="https://github.com/astral-sh/ruff/pull/15553">#15553</a>)</li>
<li>[<code>flake8-pytest-style</code>] Rewrite references to
<code>.exception</code> (<code>PT027</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15680">#15680</a>)</li>
<li>[<code>flake8-simplify</code>] Mark fixes as unsafe
(<code>SIM201</code>, <code>SIM202</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15626">#15626</a>)</li>
<li>[<code>flake8-type-checking</code>] Fix some safe fixes being
labeled unsafe (<code>TC006</code>,<code>TC008</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15638">#15638</a>)</li>
<li>[<code>isort</code>] Omit trailing whitespace in
<code>unsorted-imports</code> (<code>I001</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15518">#15518</a>)</li>
<li>[<code>pydoclint</code>] Allow ignoring one line docstrings for
<code>DOC</code> rules (<a
href="https://github.com/astral-sh/ruff/pull/13302">#13302</a>)</li>
<li>[<code>pyflakes</code>] Apply redefinition fixes by source code
order (<code>F811</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15575">#15575</a>)</li>
<li>[<code>pyflakes</code>] Avoid removing too many imports in
<code>redefined-while-unused</code> (<code>F811</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15585">#15585</a>)</li>
<li>[<code>pyflakes</code>] Group redefinition fixes by source statement
(<code>F811</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15574">#15574</a>)</li>
<li>[<code>pylint</code>] Include name of base class in message for
<code>redefined-slots-in-subclass</code> (<code>W0244</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15559">#15559</a>)</li>
<li>[<code>ruff</code>] Update fix for <code>RUF055</code> to use
<code>var == value</code> (<a
href="https://github.com/astral-sh/ruff/pull/15605">#15605</a>)</li>
</ul>
<h3>Formatter</h3>
<ul>
<li>Fix bracket spacing for single-element tuples in f-string
expressions (<a
href="https://github.com/astral-sh/ruff/pull/15537">#15537</a>)</li>
<li>Fix unstable f-string formatting for expressions containing a
trailing comma (<a
href="https://github.com/astral-sh/ruff/pull/15545">#15545</a>)</li>
</ul>
<h3>Performance</h3>
<ul>
<li>Avoid quadratic membership check in import fixes (<a
href="https://github.com/astral-sh/ruff/pull/15576">#15576</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Allow <code>unsafe-fixes</code> settings for code actions (<a
href="https://github.com/astral-sh/ruff/pull/15666">#15666</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>flake8-bandit</code>] Add missing single-line/dotall regex
flag (<code>S608</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15654">#15654</a>)</li>
<li>[<code>flake8-import-conventions</code>] Fix infinite loop between
<code>ICN001</code> and <code>I002</code> (<code>ICN001</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15480">#15480</a>)</li>
<li>[<code>flake8-simplify</code>] Do not emit diagnostics for
expressions inside string type annotations (<code>SIM222</code>,
<code>SIM223</code>) (<a
href="https://github.com/astral-sh/ruff/pull/15405">#15405</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/astral-sh/ruff/commit/90589372daf58ec4d314cbd15db8d2ef572c33cc"><code>9058937</code></a>
Fix grep for version number in docker build (<a
href="https://github.com/astral-sh/ruff/issues/15699">#15699</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/b5ffb404de8ab05eb7b14d6547f79f4fe3a3e25f"><code>b5ffb40</code></a>
Bump version to 0.9.3 (<a
href="https://github.com/astral-sh/ruff/issues/15698">#15698</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/cffd1866ce1ac6da4d6a5bc12435316d2d99755b"><code>cffd186</code></a>
Preserve raw string prefix and escapes (<a
href="https://github.com/astral-sh/ruff/issues/15694">#15694</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/569060f46ca2e036cd54532c97121737884f26c0"><code>569060f</code></a>
[<code>flake8-pytest-style</code>] Rewrite references to
<code>.exception</code> (<code>PT027</code>) (<a
href="https://github.com/astral-sh/ruff/issues/15680">#15680</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/15394a80282f589526497eefb2507a0afc662ca6"><code>15394a8</code></a>
[red-knot] MDTests: Do not depend on precise public-symbol type
inference (<a
href="https://github.com/astral-sh/ruff/issues/1">#1</a>...</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/fc2ebea7369b26c864769fce54201a8657d70058"><code>fc2ebea</code></a>
[red-knot] Make <code>infer.rs</code> unit tests independent of public
symbol inference ...</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/43160b4c3edb9cda4c01ed857e94578213e70c6f"><code>43160b4</code></a>
Tidy knot CLI tests (<a
href="https://github.com/astral-sh/ruff/issues/15685">#15685</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/0173738eef808a9b2f492a0b966e3f70e8584e21"><code>0173738</code></a>
[red-knot] Port comprehension tests to Markdown (<a
href="https://github.com/astral-sh/ruff/issues/15688">#15688</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/05ea77b1d4d1863e6436101cf877fbf265e966f4"><code>05ea77b</code></a>
Create Unknown rule diagnostics with a source range (<a
href="https://github.com/astral-sh/ruff/issues/15648">#15648</a>)</li>
<li><a
href="https://github.com/astral-sh/ruff/commit/1e790d3885919826e2cff2fbf6ddb31554714050"><code>1e790d3</code></a>
[red-knot] Port 'deferred annotations' unit tests to Markdown (<a
href="https://github.com/astral-sh/ruff/issues/15686">#15686</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/astral-sh/ruff/compare/0.9.2...0.9.3">compare
view</a></li>
</ul>
</details>
<br />

Updates `tox` from 4.23.2 to 4.24.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/tox-dev/tox/releases">tox's
releases</a>.</em></p>
<blockquote>
<h2>4.24.1</h2>
<!-- raw HTML omitted -->
<h2>What's Changed</h2>
<ul>
<li>Adds ability to configure stderr output color by <a
href="https://github.com/ssbarnea"><code>@​ssbarnea</code></a> in <a
href="https://github.com/tox-dev/tox/pull/3426">tox-dev/tox#3426</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/tox-dev/tox/compare/4.24.0...4.24.1">https://github.com/tox-dev/tox/compare/4.24.0...4.24.1</a></p>
<h2>4.24.0</h2>
<!-- raw HTML omitted -->
<h2>What's Changed</h2>
<ul>
<li>fix docs config typo by <a
href="https://github.com/wooshaun53"><code>@​wooshaun53</code></a> in <a
href="https://github.com/tox-dev/tox/pull/3424">tox-dev/tox#3424</a></li>
<li>Allow users to disable use of pre-commit-uv by <a
href="https://github.com/ssbarnea"><code>@​ssbarnea</code></a> in <a
href="https://github.com/tox-dev/tox/pull/3430">tox-dev/tox#3430</a></li>
<li>Pass nix-ld related variables by default in pass_env (fixes <a
href="https://github.com/tox-dev/tox/issues/3425">#3425</a>) by
<a
href="https://github.com/albertodonato"><code>@​albertodonato</code></a>
in <a
href="https://github.com/tox-dev/tox/pull/3434">tox-dev/tox#3434</a></li>
<li>Improve testenv docs consistency by <a
href="https://github.com/thatch"><code>@​thatch</code></a> in <a
href="https://github.com/tox-dev/tox/pull/3440">tox-dev/tox#3440</a></li>
<li>Display exception name when subprocesses raise them by <a
href="https://github.com/ssbarnea"><code>@​ssbarnea</code></a> in <a
href="https://github.com/tox-dev/tox/pull/3450">tox-dev/tox#3450</a></li>
<li>Fix the CI after setuptools 75.6 change by <a
href="https://github.com/gaborbernat"><code>@​gaborbernat</code></a> in
<a
href="https://github.com/tox-dev/tox/pull/3452">tox-dev/tox#3452</a></li>
<li>Update pre-commit hooks with mypy fix by <a
href="https://github.com/ssbarnea"><code>@​ssbarnea</code></a> in <a
href="https://github.com/tox-dev/tox/pull/3454">tox-dev/tox#3454</a></li>
<li>Fix a typo in a code block in the User Guide by <a
href="https://github.com/bryant1410"><code>@​bryant1410</code></a> in <a
href="https://github.com/tox-dev/tox/pull/3462">tox-dev/tox#3462</a></li>
<li>Update pre-commit hooks by <a
href="https://github.com/ssbarnea"><code>@​ssbarnea</code></a> in <a
href="https://github.com/tox-dev/tox/pull/3460">tox-dev/tox#3460</a></li>
<li>💅 Make SVG image compatible with Firefox by <a
href="https://github.com/webknjaz"><code>@​webknjaz</code></a> in <a
href="https://github.com/tox-dev/tox/pull/3466">tox-dev/tox#3466</a></li>
<li>feat: adding a json schema command by <a
href="https://github.com/henryiii"><code>@​henryiii</code></a> in <a
href="https://github.com/tox-dev/tox/pull/3446">tox-dev/tox#3446</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/wooshaun53"><code>@​wooshaun53</code></a> made
their first contribution in <a
href="https://github.com/tox-dev/tox/pull/3424">tox-dev/tox#3424</a></li>
<li><a
href="https://github.com/albertodonato"><code>@​albertodonato</code></a>
made their first contribution in <a
href="https://github.com/tox-dev/tox/pull/3434">tox-dev/tox#3434</a></li>
<li><a href="https://github.com/thatch"><code>@​thatch</code></a> made
their first contribution in <a
href="https://github.com/tox-dev/tox/pull/3440">tox-dev/tox#3440</a></li>
<li><a
href="https://github.com/bryant1410"><code>@​bryant1410</code></a> made
their first contribution in <a
href="https://github.com/tox-dev/tox/pull/3462">tox-dev/tox#3462</a></li>
<li><a href="https://github.com/henryiii"><code>@​henryiii</code></a>
made their first contribution in <a
href="https://github.com/tox-dev/tox/pull/3446">tox-dev/tox#3446</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/tox-dev/tox/compare/4.23.2...4.24.0">https://github.com/tox-dev/tox/compare/4.23.2...4.24.0</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/tox-dev/tox/blob/main/docs/changelog.rst">tox's
changelog</a>.</em></p>
<blockquote>
<h2>v4.24.1 (2025-01-21)</h2>
<p>Misc - 4.24.1</p>
<pre><code>- :issue:`3426`
<h2>v4.24.0 (2025-01-21)</h2>
<p>Features - 4.24.0
</code></pre></p>
<ul>
<li>
<p>Add a <code>schema</code> command to produce a JSON Schema for tox
and the current plugins.</p>
<ul>
<li>by :user:<code>henryiii</code> (:issue:<code>3446</code>)</li>
</ul>
</li>
</ul>
<p>Bugfixes - 4.24.0</p>
<pre><code>- Log exception name when subprocess execution produces one.
<ul>
<li>by :user:<code>ssbarnea</code> (:issue:<code>3450</code>)</li>
</ul>
<p>Improved Documentation - 4.24.0
</code></pre></p>
<ul>
<li>
<p>Fix typo in <code>docs/config.rst</code> from <code>{}</code> to
<code>{:}</code>.</p>
<ul>
<li>by :user:<code>wooshaun53</code> (:issue:<code>3424</code>)</li>
</ul>
</li>
<li>
<p>Pass <code>NIX_LD</code> and <code>NIX_LD_LIBRARY_PATH</code>
variables by default in <code>pass_env</code> to make generic binaries
work under Nix/NixOS.</p>
<ul>
<li>by :user:<code>albertodonato</code> (:issue:<code>3425</code>)</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/tox-dev/tox/commit/d4276dc0b6096811547848cc9ab245920db639cb"><code>d4276dc</code></a>
release 4.24.1</li>
<li><a
href="https://github.com/tox-dev/tox/commit/ee660b96bdcf527f4706c9e406d25e1dcb54048b"><code>ee660b9</code></a>
Adds ability to configure stderr output color (<a
href="https://github.com/tox-dev/tox/issues/3426">#3426</a>)</li>
<li><a
href="https://github.com/tox-dev/tox/commit/eca61ed6ce1f24836b51a42496304ba42ae4a6cd"><code>eca61ed</code></a>
release 4.24.0</li>
<li><a
href="https://github.com/tox-dev/tox/commit/bbd966361b28119d9b0097e0d48299b888596828"><code>bbd9663</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://github.com/tox-dev/tox/issues/3464">#3464</a>)</li>
<li><a
href="https://github.com/tox-dev/tox/commit/825c68bf266ef466523f494a96b45fc0e943de35"><code>825c68b</code></a>
feat: adding a json schema command (<a
href="https://github.com/tox-dev/tox/issues/3446">#3446</a>)</li>
<li><a
href="https://github.com/tox-dev/tox/commit/fccbe2a6cf4e23edeb8eb78030fdfc2fcfdd0e1d"><code>fccbe2a</code></a>
💅 Make SVG image compatible with Firefox (<a
href="https://github.com/tox-dev/tox/issues/3466">#3466</a>)</li>
<li><a
href="https://github.com/tox-dev/tox/commit/e3e77a6f711f0c333aea10eb2bc8794c6215c637"><code>e3e77a6</code></a>
Bump astral-sh/setup-uv from 4 to 5 (<a
href="https://github.com/tox-dev/tox/issues/3463">#3463</a>)</li>
<li><a
href="https://github.com/tox-dev/tox/commit/c0b490d6668b0aa9c531087b23b24691bfe49f9c"><code>c0b490d</code></a>
Update pre-commit hooks (<a
href="https://github.com/tox-dev/tox/issues/3460">#3460</a>)</li>
<li><a
href="https://github.com/tox-dev/tox/commit/fbac0786536f682ccb5facfafa1eed6e8b5ac18e"><code>fbac078</code></a>
Fix a typo in a code block in the User Guide (<a
href="https://github.com/tox-dev/tox/issues/3462">#3462</a>)</li>
<li><a
href="https://github.com/tox-dev/tox/commit/c7f2cafff187cf4895964ad066fb3548fe42ad1a"><code>c7f2caf</code></a>
Bump pypa/gh-action-pypi-publish from 1.12.2 to 1.12.3 (<a
href="https://github.com/tox-dev/tox/issues/3459">#3459</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/tox-dev/tox/compare/4.23.2...4.24.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `attrs` from 24.3.0 to 25.1.0
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/sponsors/hynek/commits">compare view</a></li>
</ul>
</details>
<br />

Updates `cachetools` from 5.5.0 to 5.5.1
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst">cachetools's
changelog</a>.</em></p>
<blockquote>
<h1>v5.5.1 (2025-01-21)</h1>
<ul>
<li>
<p>Add documentation regarding caching of exceptions.</p>
</li>
<li>
<p>Officially support Python 3.13.</p>
</li>
<li>
<p>Update CI environment.</p>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/tkem/cachetools/commit/b072920d6cfb803be7dbbc7eafd9adc61c5c3cbd"><code>b072920</code></a>
Release v5.5.1.</li>
<li><a
href="https://github.com/tkem/cachetools/commit/efc363338a0257eb86477f4d695c363fb059c2db"><code>efc3633</code></a>
Fix <a
href="https://github.com/tkem/cachetools/issues/138">#138</a>:
Add documentation regarding caching of exceptions.</li>
<li><a
href="https://github.com/tkem/cachetools/commit/d5c689242a55ffe29370ff7a0d912785f076dc9a"><code>d5c6892</code></a>
Officially support Python 3.13.</li>
<li><a
href="https://github.com/tkem/cachetools/commit/a34b9c5a3f540747977a7ac39aafc52056836b1e"><code>a34b9c5</code></a>
Merge remote-tracking branch
'origin/dependabot/github_actions/actions/setup-...</li>
<li><a
href="https://github.com/tkem/cachetools/commit/9c122a2e5aadf4adc71e1e1e3fbea83337fb729b"><code>9c122a2</code></a>
Merge remote-tracking branch
'origin/dependabot/github_actions/actions/checko...</li>
<li><a
href="https://github.com/tkem/cachetools/commit/d44c98407030d2e91cbe82c3997be042d9c2f0de"><code>d44c984</code></a>
Create FUNDING.yml</li>
<li><a
href="https://github.com/tkem/cachetools/commit/49bff17088baefd81c3fabf66254541e3d2b2924"><code>49bff17</code></a>
Bump actions/checkout from 4.1.7 to 4.2.0</li>
<li><a
href="https://github.com/tkem/cachetools/commit/85c6026dc96e17d45e895d84e3e551f6d3f1086a"><code>85c6026</code></a>
Bump actions/setup-python from 5.1.1 to 5.2.0</li>
<li>See full diff in <a
href="https://github.com/tkem/cachetools/compare/v5.5.0...v5.5.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `identify` from 2.6.5 to 2.6.6
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/pre-commit/identify/commit/5bc1845addd0f9600fe719cc27464bde5c19f839"><code>5bc1845</code></a>
v2.6.6</li>
<li><a
href="https://github.com/pre-commit/identify/commit/7b82a63b70054697a4c17598872ada429a424835"><code>7b82a63</code></a>
Merge pull request <a
href="https://github.com/pre-commit/identify/issues/500">#500</a>
from vlotorev/patch-1</li>
<li><a
href="https://github.com/pre-commit/identify/commit/26e13ca264d23a4c759eee395311bf84dde5bf75"><code>26e13ca</code></a>
Add '.asm' file extension as 'asm' filetype</li>
<li><a
href="https://github.com/pre-commit/identify/commit/f09385549fc272df4e28ad8b771ea62bb32c49ca"><code>f093855</code></a>
Merge pull request <a
href="https://github.com/pre-commit/identify/issues/499">#499</a>
from pre-commit/pre-commit-ci-update-config</li>
<li><a
href="https://github.com/pre-commit/identify/commit/e9ef72e442a7eb1c835b0451340333d53d04e9df"><code>e9ef72e</code></a>
[pre-commit.ci] pre-commit autoupdate</li>
<li>See full diff in <a
href="https://github.com/pre-commit/identify/compare/v2.6.5...v2.6.6">compare
view</a></li>
</ul>
</details>
<br />

Updates `importlib-metadata` from 8.5.0 to 8.6.1
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/python/importlib_metadata/blob/main/NEWS.rst">importlib-metadata's
changelog</a>.</em></p>
<blockquote>
<h1>v8.6.1</h1>
<h2>Bugfixes</h2>
<ul>
<li>Fixed indentation logic to also honor blank lines.</li>
</ul>
<h1>v8.6.0</h1>
<h2>Features</h2>
<ul>
<li><code>python/cpython#119650</code></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/python/importlib_metadata/commit/45e8bde73f8ce816fdc47618a31ba3916a332485"><code>45e8bde</code></a>
Finalize</li>
<li><a
href="https://github.com/python/importlib_metadata/commit/506beb7cbd23fef4f93a63a5c3931e302d828896"><code>506beb7</code></a>
Fixed indentation logic to also honor blank lines.</li>
<li><a
href="https://github.com/python/importlib_metadata/commit/dad738095d6d28f24d254f3cc9f82e2394fb2a09"><code>dad7380</code></a>
Finalize</li>
<li><a
href="https://github.com/python/importlib_metadata/commit/dab1dd81507fef5bff6a32a63ab8fc8633e2c24c"><code>dab1dd8</code></a>
When transforming the payload to a Description key, clear the
payload.</li>
<li><a
href="https://github.com/python/importlib_metadata/commit/07aa607e54672bc1077007771cbca0e16475aa24"><code>07aa607</code></a>
Add support for rendering metadata where some fields have newlines
(python/cp...</li>
<li><a
href="https://github.com/python/importlib_metadata/commit/b92ec183c0297c2edd9b66202647c560937241e3"><code>b92ec18</code></a>
Merge <a
href="https://github.com/jaraco/skeleton">https://github.com/jaraco/skeleton</a></li>
<li><a
href="https://github.com/python/importlib_metadata/commit/5c34e69568f23a524af4fa9dad3f5e80f22ec3e6"><code>5c34e69</code></a>
Use extend for proper workaround.</li>
<li><a
href="https://github.com/python/importlib_metadata/commit/694e5b4e5e024e29d3bff6f8ff3054792c6e726a"><code>694e5b4</code></a>
Merge <a
href="https://github.com/jaraco/skeleton">https://github.com/jaraco/skeleton</a></li>
<li><a
href="https://github.com/python/importlib_metadata/commit/750a1891ec4a1c0602050e3463e9593a8c13aa14"><code>750a189</code></a>
Require Python 3.9 or later now that Python 3.8 is EOL.</li>
<li><a
href="https://github.com/python/importlib_metadata/commit/e61a9df7cdc9c8d1b56c30b7b3f94a7cdac14414"><code>e61a9df</code></a>
Include pyproject.toml in ruff.toml.</li>
<li>Additional commits viewable in <a
href="https://github.com/python/importlib_metadata/compare/v8.5.0...v8.6.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `pymdown-extensions` from 10.14 to 10.14.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/facelessuser/pymdown-extensions/releases">pymdown-extensions's
releases</a>.</em></p>
<blockquote>
<h2>10.14.1</h2>
<ul>
<li><strong>FIX</strong>: MagicLink: Ensure that repo names that start
with <code>.</code> are handled correctly.</li>
<li><strong>FIX</strong>: FancyLists: Fix case were lists could be
falsely created when a line started with <code>.</code> or
<code>)</code>.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/facelessuser/pymdown-extensions/commit/868f7e95064b50f6593263a57681533978c99f97"><code>868f7e9</code></a>
Update versioning to reflect next release</li>
<li><a
href="https://github.com/facelessuser/pymdown-extensions/commit/2aba1895ad7ec19ef90d6385e6f798414d97a0e2"><code>2aba189</code></a>
Fix list patterns in FancyList (<a
href="https://github.com/facelessuser/pymdown-extensions/issues/2576">#2576</a>)</li>
<li><a
href="https://github.com/facelessuser/pymdown-extensions/commit/b5d38261aac121cb13cd459df0272c4c81abd67f"><code>b5d3826</code></a>
Docs: Fix snippets example</li>
<li><a
href="https://github.com/facelessuser/pymdown-extensions/commit/c9ef97e65936f2ec932b04d688bc5fba6d7787ab"><code>c9ef97e</code></a>
Docs: Update stylelint (<a
href="https://github.com/facelessuser/pymdown-extensions/issues/2564">#2564</a>)</li>
<li><a
href="https://github.com/facelessuser/pymdown-extensions/commit/94c6bc4d704455e03a0242b1d1ccefaf3179ee5a"><code>94c6bc4</code></a>
Fix Block HTML lint issue</li>
<li><a
href="https://github.com/facelessuser/pymdown-extensions/commit/ba219e67a1764ad8bf0a692faca00fb1086059d2"><code>ba219e6</code></a>
Fix spelling</li>
<li><a
href="https://github.com/facelessuser/pymdown-extensions/commit/8363af6250f6bcc0fa1373b42ba7d6a05613af93"><code>8363af6</code></a>
Fix highlight lint issue</li>
<li><a
href="https://github.com/facelessuser/pymdown-extensions/commit/760e56b38d1e884ae776bcaef7af4a11324e61c0"><code>760e56b</code></a>
Magiclink: fix handling of repos that start with dot</li>
<li><a
href="https://github.com/facelessuser/pymdown-extensions/commit/51bf16368ac54b6fdf7f10a4f81e50f8556c60a2"><code>51bf163</code></a>
Fix missing dict key in arithmatex docs (<a
href="https://github.com/facelessuser/pymdown-extensions/issues/2560">#2560</a>)</li>
<li>See full diff in <a
href="https://github.com/facelessuser/pymdown-extensions/compare/10.14...10.14.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `pyproject-api` from 1.8.0 to 1.9.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/tox-dev/pyproject-api/releases">pyproject-api's
releases</a>.</em></p>
<blockquote>
<h2>Drop 3.8</h2>
<!-- raw HTML omitted -->
<h2>What's Changed</h2>
<ul>
<li>Create FUNDING.yml by <a
href="https://github.com/gaborbernat"><code>@​gaborbernat</code></a> in
<a
href="https://github.com/tox-dev/pyproject-api/pull/158">tox-dev/pyproject-api#158</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/tox-dev/pyproject-api/compare/1.8.0...1.9.0">https://github.com/tox-dev/pyproject-api/compare/1.8.0...1.9.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/tox-dev/pyproject-api/commit/aace737496bcab66c9a1526c00afc680dcf7bb22"><code>aace737</code></a>
Bump pypa/gh-action-pypi-publish from 1.12.2 to 1.12.3 (<a
href="https://github.com/tox-dev/pyproject-api/issues/175">#175</a>)</li>
<li><a
href="https://github.com/tox-dev/pyproject-api/commit/ce4087bd85332841dc0e91cc8defadf4b994d504"><code>ce4087b</code></a>
Bump astral-sh/setup-uv from 4 to 5 (<a
href="https://github.com/tox-dev/pyproject-api/issues/176">#176</a>)</li>
<li><a
href="https://github.com/tox-dev/pyproject-api/commit/136e5ded8f65fb157c2e5fee5e8e05de9eefcdd4"><code>136e5de</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://github.com/tox-dev/pyproject-api/issues/174">#174</a>)</li>
<li><a
href="https://github.com/tox-dev/pyproject-api/commit/81e9d2214d4904afefac2e7decad8d5c5cd95b45"><code>81e9d22</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://github.com/tox-dev/pyproject-api/issues/172">#172</a>)</li>
<li><a
href="https://github.com/tox-dev/pyproject-api/commit/5814c0a764a026d25794fb56fbbc2391f2500d53"><code>5814c0a</code></a>
Bump astral-sh/setup-uv from 3 to 4 (<a
href="https://github.com/tox-dev/pyproject-api/issues/173">#173</a>)</li>
<li><a
href="https://github.com/tox-dev/pyproject-api/commit/eb9f7baab9393f3f377fe8e8f402c87f55d6770f"><code>eb9f7ba</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://github.com/tox-dev/pyproject-api/issues/171">#171</a>)</li>
<li><a
href="https://github.com/tox-dev/pyproject-api/commit/249be0cd649221cfe968e0a6e214036d65d0a66f"><code>249be0c</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://github.com/tox-dev/pyproject-api/issues/170">#170</a>)</li>
<li><a
href="https://github.com/tox-dev/pyproject-api/commit/f9c1b7f5dc5e917b5971610c1eb2d151c2789df1"><code>f9c1b7f</code></a>
Bump pypa/gh-action-pypi-publish from 1.12.1 to 1.12.2 (<a
href="https://github.com/tox-dev/pyproject-api/issues/169">#169</a>)</li>
<li><a
href="https://github.com/tox-dev/pyproject-api/commit/298cafc6c104a20dbe101d0cdae46c8e038a843d"><code>298cafc</code></a>
[pre-commit.ci] pre-commit autoupdate (<a
href="https://github.com/tox-dev/pyproject-api/issues/166">#166</a>)</li>
<li><a
href="https://github.com/tox-dev/pyproject-api/commit/762410da01d76795f01feec05150bc15dd5bd780"><code>762410d</code></a>
Bump pypa/gh-action-pypi-publish from 1.11.0 to 1.12.1 (<a
href="https://github.com/tox-dev/pyproject-api/issues/168">#168</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/tox-dev/pyproject-api/compare/1.8.0...1.9.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `referencing` from 0.36.1 to 0.36.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/python-jsonschema/referencing/releases">referencing's
releases</a>.</em></p>
<blockquote>
<h2>v0.36.2</h2>
<!-- raw HTML omitted -->
<p><strong>Full Changelog</strong>: <a
href="https://github.com/python-jsonschema/referencing/compare/v0.36.1...v0.36.2">https://github.com/python-jsonschema/referencing/compare/v0.36.1...v0.36.2</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/python-jsonschema/referencing/blob/main/docs/changes.rst">referencing's
changelog</a>.</em></p>
<blockquote>
<h2>v0.36.2</h2>
<ul>
<li>Release using the newer twine release to preserve PEP 639 license
metadata.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/python-jsonschema/referencing/commit/9a82e6c7e5e2e395b61bb4017dc6adc52ac52e7c"><code>9a82e6c</code></a>
Add v0.36.2 to the CHANGELOG.</li>
<li><a
href="https://github.com/python-jsonschema/referencing/commit/28f4b79770bdf791f9c5666b0d741094d76f1329"><code>28f4b79</code></a>
Update docs requirements.</li>
<li><a
href="https://github.com/python-jsonschema/referencing/commit/f0d87239ce016a5a65ed124a98b98f57e262df4b"><code>f0d8723</code></a>
Merge pull request <a
href="https://github.com/python-jsonschema/referencing/issues/215">#215</a>
from python-jsonschema/dependabot/submodules/suite-f4...</li>
<li><a
href="https://github.com/python-jsonschema/referencing/commit/767145a1b36500b10844ffdb5797a508ae4d22af"><code>767145a</code></a>
Bump suite from <code>d01bb7a</code> to <code>f49bd3a</code></li>
<li><a
href="https://github.com/python-jsonschema/referencing/commit/bf82571280f1144df31b3dae918281c276509489"><code>bf82571</code></a>
Merge pull request <a
href="https://github.com/python-jsonschema/referencing/issues/214">#214</a>
from python-jsonschema/pre-commit-ci-update-config</li>
<li><a
href="https://github.com/python-jsonschema/referencing/commit/94294c149509f1ad8da6918a1373a8242299a2ac"><code>94294c1</code></a>
[pre-commit.ci] pre-commit autoupdate</li>
<li><a
href="https://github.com/python-jsonschema/referencing/commit/52add9268ee29ccd47ed36f9f14228233e77dddb"><code>52add92</code></a>
Update the uv lockfile.</li>
<li><a
href="https://github.com/python-jsonschema/referencing/commit/b5296077222f2ebdce0e3c5342539ce6c2d039fb"><code>b529607</code></a>
Update the CHANGELOG.</li>
<li>See full diff in <a
href="https://github.com/python-jsonschema/referencing/compare/v0.36.1...v0.36.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `ruamel-yaml` from 0.18.6 to 0.18.10


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Abhinav Anand <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
stdlib Python modules in the Lib dir topic-email topic-importlib type-bug An unexpected behavior, bug, or error
Projects
None yet
Development

No branches or pull requests

6 participants