Skip to content

Bump the python-requirements group across 1 directory with 9 updates - #276

Open
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/pip/python-requirements-d235c3ff71
Open

dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/pip/python-requirements-d235c3ff71

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Nov 1, 2026

Copy link
Copy Markdown
Contributor

Updates the requirements on python-dateutil, python-fsutil, python-slugify, coverage, mypy, pre-commit, pytest, tox and python-benedict to permit the latest version.
Updates python-dateutil from 2.9.0.post0 to 3.0.0

Release notes

Sourced from python-dateutil's releases.

3.0.0

This is the last major version of dateutil that will support any version of Python older than 3.11. The next release will be the 4.x series, which will support Python 3.11 and later. We may release fixes for serious bugs in the 3.0.x series, but there are no plans for new features there.

The biggest change in this release is a rewrite of tz.tzfile, which affects nearly every user of dateutil.tz and changes the UTC offset of nonexistent times (see below). dateutil also now depends on the tzdata package, and no longer ships its own time zone database.

Data updates

  • dateutil no longer bundles a copy of the IANA time zone database. Time zone data now comes from the system (see dateutil.tz.TZPATH) or, failing that, from the new tzdata dependency, so the data version is whatever version of tzdata is installed. (gh pr #1130)

Features

  • Rewrote tz.tzfile based on a backport of the zoneinfo module's pure-Python implementation. This adds support for Version 2 and Version 3 tzfile(5) binaries, resolving issues with timestamps beyond 2038 and "slim" format binaries. (gh issues #462, #1059, gh pr #1130)
  • Added dateutil.tz.TZPATH and dateutil.tz.reset_tzpath to allow for runtime configuration of the IANA time zone data search path. These replace the mutable dateutil.tz.TZPATHS list, which has been removed. (gh pr #1130)
  • dateutil now depends on the tzdata package, which gettz consults after the search path and before the Windows registry. On Windows this means that names that are both IANA keys and Windows time zone names, such as "UTC", now return a tzfile rather than a tzwin. (gh pr #1130)

Bugfixes

  • tz.tzfile now follows PEP 495 for times that fall in a gap: with fold=0 it uses the offset from before the transition, and with fold=1 the offset from after it. Previously it always used the offset from after the transition, so for example datetime(2003, 4, 6, 2, 30, tzinfo=tz.gettz("America/New_York")) had a UTC offset of -04:00, where it now has -05:00, the same as with zoneinfo. (gh pr #1130)
  • tz.tzfile objects for fixed-offset zones, such as tz.gettz("UTC"), now return their offset, DST offset and abbreviation when utcoffset, dst and tzname are called with None, as tz.tzutc, tz.tzoffset and zoneinfo.ZoneInfo do. This means that datetime.time objects with such a zone attached are now aware: time(12, tzinfo=tz.gettz("UTC")).isoformat() is now "12:00:00+00:00" rather than "12:00:00". (gh pr #1130)
  • tz.tzfile now infers dst() from the standard time on both sides of each DST period, rather than only the one before it, and does so for each transition rather than for each local time type. This fixes dst() for double summer time (e.g. in Europe/London in the 1940s), for half-hour DST (e.g. in Pacific/Rarotonga) and where the standard offset changed at the same time as a DST transition (e.g. in America/Bahia_Banderas in 2010). Against the standard offsets in the tz database source, the only remaining errors are in Europe/Paris in 1944 and 1945. (gh pr #1130)
  • Fixed rrulestr raising ValueError on experimental X- parameters in an RRULE line (such as GNOME Evolution's X-EVOLUTION-ENDDATE); these are now ignored as RFC 5545 permits. Fixed by @​yajo (gh pr #1374)
  • Enabled pickling and deepcopy of cached rrule and rruleset instances. The cache setting is preserved, and cached results are regenerated on demand without copying locks or generators. Reported by @​niccokunzmann (gh issue #1369). Fixed by @​Jay1023CN (gh pr #1600).
  • Fixed relativedelta.__ne__ raising TypeError when comparing against an unsupported type such as None; it now returns True. Reported and fixed by @​kevinkt1 (gh issue #1157, gh pr #1158)
  • Raised the minimum version of six to 1.6, fixing No module named 'six.moves' errors with older versions. Reported by @​skytreader (gh issue #1415), fixed by @​jdarias3 (gh pr #1424).

Deprecations

  • Deprecated the dateutil.zoneinfo module. The module now acts as a wrapper around the tzdata package and will be removed in a future version. Users are encouraged to migrate to dateutil.tz.gettz or the standard library's zoneinfo module. dateutil.zoneinfo.rebuild.rebuild no longer does anything, and by default raises RebuildDeprecationWarning as an error; filter the warning to call it as a no-op. (gh pr #1130)
  • Deprecated passing gettz a relative key that refers to a file outside of every directory on TZPATH, such as "../../etc/localtime". By default this now raises dateutil.tz.DeprecatedTzKeyWarning as an error; filter the warning to keep the old behavior for now, or pass an absolute path instead. (gh pr #1130)

Documentation changes

  • Added intersphinx to the docs build and cleaned up some broken links. (gh pr #1463)

Misc

Changelog

Sourced from python-dateutil's changelog.

Version 3.0.0 (2026-10-21)

This is the last major version of dateutil that will support any version of Python older than 3.11. The next release will be the 4.x series, which will support Python 3.11 and later. We may release fixes for serious bugs in the 3.0.x series, but there are no plans for new features there.

The biggest change in this release is a rewrite of tz.tzfile, which affects nearly every user of dateutil.tz and changes the UTC offset of nonexistent times (see below). dateutil also now depends on the tzdata package, and no longer ships its own time zone database.

Data updates

  • dateutil no longer bundles a copy of the IANA time zone database. Time zone data now comes from the system (see dateutil.tz.TZPATH) or, failing that, from the new tzdata dependency, so the data version is whatever version of tzdata is installed. (gh pr #1130)

Features

  • Rewrote tz.tzfile based on a backport of the zoneinfo module's pure-Python implementation. This adds support for Version 2 and Version 3 tzfile(5) binaries, resolving issues with timestamps beyond 2038 and "slim" format binaries. (gh issues #462, #1059, gh pr #1130)
  • Added dateutil.tz.TZPATH and dateutil.tz.reset_tzpath to allow for runtime configuration of the IANA time zone data search path. These replace the mutable dateutil.tz.TZPATHS list, which has been removed. (gh pr #1130)
  • dateutil now depends on the tzdata package, which gettz consults after the search path and before the Windows registry. On Windows this means that names that are both IANA keys and Windows time zone names, such as "UTC", now return a tzfile rather than a tzwin. (gh pr #1130)

Bugfixes

  • tz.tzfile now follows PEP 495 for times that fall in a gap: with fold=0 it uses the offset from before the transition, and with fold=1 the offset from after it. Previously it always used the offset from after the transition, so for example datetime(2003, 4, 6, 2, 30, tzinfo=tz.gettz("America/New_York")) had a UTC offset of -04:00, where it now has -05:00, the same as with zoneinfo. (gh pr #1130)
  • tz.tzfile objects for fixed-offset zones, such as tz.gettz("UTC"), now return their offset, DST offset and abbreviation when utcoffset, dst and tzname are called with None, as tz.tzutc, tz.tzoffset and

... (truncated)

Commits
  • 10f317f Prepare release 3.0.0
  • fabac8d Run the tests against a wheel built once on a recent Python
  • 21b6862 Allow pickling and deepcopy of cached recurrence rules (#1600)
  • bd5fd88 Remove deprecated setuptools usage from the build
  • 962f0a5 Don't fetch an unpinned setuptools_scm via setup_requires
  • db944cf Update the Python version classifiers
  • 3b07521 Test on Python 3.14t, 3.15 and 3.15t
  • 6899421 Fix dateutil/dateutil#1157
  • bc90ab4 Use trusted publishing to upload to PyPI
  • 950abb6 fix(rrule): don't die on experimental properties
  • Additional commits viewable in compare view

Updates python-fsutil from 0.16.1 to 0.18.0

Release notes

Sourced from python-fsutil's releases.

0.18.0

  • Add read_file_yaml and write_file_yaml (requires the optional PyYAML dependency). #196 (thanks to @​Gonghan-Princess)
  • Add support for compressed tar archives in extract_tar_file. #193 (thanks to @​Gonghan-Princess)
  • Fix read_file_lines ranges and negative indexes for UTF-16 and UTF-32 encoded files. #195 (thanks to @​Gonghan-Princess)
  • Bump requirements and pre-commit hooks.

0.17.0

  • Add support for file-like objects in get_file_hash.
  • Fix IndexError in convert_size_bytes_to_string for sizes >= 1024 YB. #186 (thanks to @​SAY-5)
  • Harden Content-Disposition filename sanitization in download_file to prevent path traversal. #181
  • Bump requirements and pre-commit hooks.
Changelog

Sourced from python-fsutil's changelog.

0.18.0 - 2026-10-08

  • Add read_file_yaml and write_file_yaml (requires the optional PyYAML dependency). #196 (thanks to @​Gonghan-Princess)
  • Add support for compressed tar archives in extract_tar_file. #193 (thanks to @​Gonghan-Princess)
  • Fix read_file_lines ranges and negative indexes for UTF-16 and UTF-32 encoded files. #195 (thanks to @​Gonghan-Princess)
  • Bump requirements and pre-commit hooks.

0.17.0 - 2026-07-07

  • Add support for file-like objects in get_file_hash.
  • Fix IndexError in convert_size_bytes_to_string for sizes >= 1024 YB. #186 (thanks to @​SAY-5)
  • Harden Content-Disposition filename sanitization in download_file to prevent path traversal. #181
  • Bump requirements and pre-commit hooks.
Commits

Updates python-slugify from 8.0.4 to 9.1.3

Release notes

Sourced from python-slugify's releases.

9.1.3

Patch for the modern algorithm. Legacy output is unchanged and remains the permanent default.

  • Modern mode only: preserve repeated and leading post-replacement delimiters during word-boundary truncation, instead of collapsing them to a single separator. Legacy output and public smart_truncate are unchanged (aarush, #204).
  • Add tests for CLI interruption and legacy backend error contracts. No output change (dyda5505-cloud, #203).

Full Changelog: un33k/python-slugify@v9.1.2...v9.1.3

🚀 Generated with Dojo ⛩️

9.1.2

Performance improvement with unchanged output under both algorithms. Legacy output is unchanged and remains the permanent default.

  • Skip the transliteration backend for ASCII-only input under both algorithms, avoiding the ~3 MB text-unidecode table import for the common ASCII case. Output is unchanged, including the frozen legacy differential (Rafael Borja, #201).

Full Changelog: un33k/python-slugify@v9.1.1...v9.1.2

🚀 Generated with Dojo ⛩️

9.1.1

Bug fix in the modern algorithm. Legacy output is unchanged and remains the permanent default.

  • Modern mode only: avoid emitting a trailing separator when a hard cut truncates through repeated post-replacement delimiters, keeping the delimiter run with the next word that fits. Legacy output and public smart_truncate are unchanged (曾楚笑, #200).

Full Changelog: un33k/python-slugify@v9.1.0...v9.1.1

🚀 Generated with Dojo ⛩️

9.1.0

Modern-algorithm improvements and fixes. Legacy output is unchanged and remains the permanent default.

  • Modern mode only: decode uppercase &#X..; hexadecimal references as HTML allows, in addition to lowercase &#x..; (Rupayon Haldar, #195).
  • Modern mode only: preserve post-replacement output when the whole slug already fits max_length, so intentional repeated/trailing delimiters are not collapsed at the length limit. Public smart_truncate is unchanged (emme1t, #193).
  • Fix add_uppercase_char to apply insertions atomically, leaving the input list unchanged if iteration fails. Built-in transliteration tables are unaffected (Cristian Ramirez, #194).
  • Modern mode only: validate argument types up front, raising TypeError for a bool/non-int max_length or a non-str separator. Legacy behavior is unchanged (Jon Bailey, #196).

Internal: the legacy pipeline is now frozen in slugify/_legacy.py with the public slugify() dispatching by algorithm; tests reorganized under tests/.

Full Changelog: un33k/python-slugify@v9.0.0...v9.1.0

🚀 Generated with Dojo ⛩️

9.0.0

Highlights

  • Preserve legacy slug output by default while adding explicit algorithm="modern" opt-in behavior.
  • Add explicit transliteration backend and replacement-stage controls, with matching CLI options.
  • Add opt-in AnyASCII support while preserving existing dependency and backend-selection behavior.
  • Fix CLI regex-pattern forwarding and modern-mode handling for entities, iterables, separators, and delimiters.
  • Add Python 3.14 support, packaging modernization, expanded compatibility checks, and migration guidance.

... (truncated)

Changelog

Sourced from python-slugify's changelog.

9.1.3

  • Modern mode only: preserve repeated and leading post-replacement delimiters during word-boundary truncation, instead of collapsing them to a single separator. Legacy output and public smart_truncate are unchanged (aarush, #204).
  • Add tests for CLI interruption and legacy backend error contracts. No output change (dyda5505-cloud, #203).

9.1.2

  • Skip the transliteration backend for ASCII-only input under both algorithms, avoiding the ~3 MB text-unidecode table import for the common ASCII case. Output is unchanged, including the frozen legacy differential (Rafael Borja, #201).

9.1.1

  • Modern mode only: avoid emitting a trailing separator when a hard cut truncates through repeated post-replacement delimiters, keeping the delimiter run with the next word that fits. Legacy output and public smart_truncate are unchanged (曾楚笑, #200).

9.1.0

  • Modern mode only: decode uppercase &#X..; hexadecimal references as HTML allows, in addition to lowercase &#x..;. Legacy output is unchanged (Rupayon Haldar, #195).
  • Modern mode only: preserve post-replacement output when the whole slug already fits max_length, so intentional repeated/trailing delimiters are not collapsed at the length limit. Public smart_truncate is unchanged (emme1t, #193).
  • Fix add_uppercase_char to apply insertions atomically, leaving the input list unchanged if iteration fails. Built-in transliteration tables are unaffected (Cristian Ramirez, #194).
  • Modern mode only: validate argument types up front, raising TypeError for a bool/non-int max_length (bool is an int subclass) or a non-str separator. Legacy behavior is unchanged and still treats max_length=True as its historical single-character truncation (Jon Bailey, #196).

9.0.0 — unreleased

  • Add keyword-only algorithm='legacy' (permanent default) and explicit algorithm='modern' opt-in, plus CLI --algorithm. Preserve historical default entity ordering, numeric handling, iterator consumption, separator truncation, and public smart_truncate behavior.

  • Preserve legacy auto backend selection and two-pass replacement defaults; add explicit backend and replacement_stage keyword-only options and matching CLI flags.

  • Add opt-in AnyASCII extra without removing or changing the base text-unidecode dependency.

  • Forward CLI --regex-pattern (Jacobo de Vera, #176; report by @​peter-bloomfield, #175).

  • Modern mode only: decode entities before transliteration; handle invalid numeric references per match, including surrogate references (#178, #181, #187).

  • Modern mode only: materialize replacement rules and stopword iterables consistently; preserve bytes/bytearray UTF-8 input with clear rejection of unsupported types (#183, #190).

  • Modern mode only: budget internal tokens using emitted separator widths, support empty separators, and preserve literal word characters that match delimiters. Public smart_truncate remains unchanged (#47, #185, #186).

  • Add regression coverage for whitespace, ordinals, backend-specific output, replacement stages, CLI execution, and installed artifacts.

  • Move package metadata to pyproject.toml, retain the typed marker and source tests, and remove the unsafe publish/upload/tag shortcut.

  • Document output changes, backend license distinctions, compatibility limits, and migration precautions in docs/release-9/migration.md.

  • Support Python 3.14.

  • Drop support for Python 3.9 and lower.

  • Use tox for local test runs and in CI.

  • Test the project against both unidecode and text_unidecode.

  • Fix type annotation issues identified by mypy.

  • Run CI against pull requests.

  • Fix package build warnings.

Commits
  • f0010f9 Release 9.1.3: preserve modern word-boundary replacement delimiters (#206)
  • 007ddd7 Add the missing blank lines in the new contributor tests (#205)
  • c9e9698 Preserve modern word-boundary replacement delimiters (#204)
  • b910814 Add tests for CLI interruption and legacy backend error contracts (#203)
  • 866401e Rename DOJO.md to AGENTS.md and ignore local build artifacts (#202)
  • 18a28da Release 9.1.2: skip transliteration backend for ASCII input (#201)
  • cf6cd3d Skip the transliteration backend for ASCII text (#201)
  • 2fe6cec Reword Dojo badge to 'maintained with' for a 15-year-old library
  • bbfdff2 Recolor Dojo badge to dark slate for readability
  • 87ce191 Add 'Built with Dojo' badge to README
  • Additional commits viewable in compare view

Updates coverage to 7.17.0

Release notes

Sourced from coverage's releases.

7.17.0

Version 7.17.0 — 2026-10-22

  • Dropped support for Python 3.10.
  • Binary wheels are now provided for iOS and Android. This allows the use of the optimized C tracer on mobile platforms.
  • Fix: three or more levels of nested with statements could make a with line look like a branch with an exit that can never happen. Using the sys.monitoring core, these phantom branches were reported as partial. Other cores hid the problem but still counted the phantom branches in the total. Closes issue 1987.
  • Fix: a comment or string that merely mentioned if True: or while True: could mark its line as a branch that is known to be partial, so a branch that never ran was reported as taken. These built-in patterns now only match at the start of the statement. Closes issue 2314.
  • Fix: region detection missed functions defined in unusual places, such as else and except clauses. This is now fixed.
  • Fix: recent versions of the lcov tool complain if the same function name appears more than once in a report. Python can have multiple same-named functions in a few ways, for example, getters/setters or conditionally defined functions. These are now disambiguated by adding a @<line number> suffix to the function name. Fixes issue 2335.
  • Fix: The “Can’t combine statement coverage data with branch data” error now names the two data files it couldn’t combine. The error description in the docs now lists common causes and how to find the process that wrote the file.
  • Fix: at coverage totals close to 0 or 100, the XML report could get incorrect line-rate values like 8.333e-05 or 1. This is now fixed, closing issue 2293 and issue 2294.
  • Fix: a parallel data file saved more than once kept the hash of its first save in its file name. Combining could then skip it as a duplicate of another file that had the same data at that point, and delete it, losing the data recorded after the first save. Each save now updates the hash. This had been a problem since 7.13.1. Fixes issue 2338.
  • Fixes for obscure but legal file names:
    • File names (and plugin names) can contain control characters, which are legal in POSIX paths but unsafe in reports: in XML 1.0 they make the document non-well-formed, and in a terminal they act as escape sequences (colors, title/clipboard sequences, cursor moves that forge output). Now the XML report, the text and Markdown summary reports, and coverage debug data replace non-printable characters in names. Printable names are unchanged.
    • A file pattern (from include, omit, or a [paths] alias) containing a newline sent the glob-to-regex translation into an infinite loop, hanging the process. Newlines in patterns are now handled like any other character.
  • Fixes in the implementation of the C tracer:
    • If a plugin’s dynamic_source_filename method raised an exception, lines in that function could be recorded as belonging to a different file. Also fixed some minor memory leaks in the C tracer.
    • The refcount of None was mismanaged during function calls, including comprehensions. This was unlikely to cause an actual problem, but is now fixed. Thanks, Andrew Dalke.
    • The C tracer held borrowed references to dictionary values, which was unsafe on free-threaded Python. Now it takes its own references.
    • An internal error while recording a new file could be reported as a confusing SystemError instead of the actual exception.
  • Performance: the text summary report (coverage report) held on to every file’s parsed source until it finished, so its memory use grew with the size of the project: ten times or more what 7.14 used on large projects. Now it keeps only what it needs to print. Fixes issue 2277.
  • Performance: HTML reports should be about 5% faster to produce.
  • Kept the political banner in the README. Closes issue 2344.

➡️  PyPI page: coverage 7.17.0. :arrow_right:  To install: python3 -m pip install coverage==7.17.0

Changelog

Sourced from coverage's changelog.

Version 7.17.0 — 2026-10-22

  • Dropped support for Python 3.10.

  • Binary wheels are now provided for iOS and Android. This allows the use of the optimized C tracer on mobile platforms.

  • Fix: three or more levels of nested with statements could make a with line look like a branch with an exit that can never happen. Using the sys.monitoring core, these phantom branches were reported as partial. Other cores hid the problem but still counted the phantom branches in the total. Closes issue 1987_.

  • Fix: a comment or string that merely mentioned if True: or while True: could mark its line as a branch that is known to be partial, so a branch that never ran was reported as taken. These built-in patterns now only match at the start of the statement. Closes issue 2314_.

  • Fix: region detection missed functions defined in unusual places, such as else and except clauses. This is now fixed.

  • Fix: recent versions of the lcov tool complain if the same function name appears more than once in a report. Python can have multiple same-named functions in a few ways, for example, getters/setters or conditionally defined functions. These are now disambiguated by adding a @<line number> suffix to the function name. Fixes issue 2335.

  • Fix: The "Can't combine statement coverage data with branch data" error now names the two data files it couldn't combine. The :ref:error description <error_cant_combine> in the docs now lists common causes and how to find the process that wrote the file.

  • Fix: at coverage totals close to 0 or 100, the XML report could get incorrect line-rate values like 8.333e-05 or 1. This is now fixed, closing issue 2293_ and issue 2294_.

  • Fix: a parallel data file saved more than once kept the hash of its first save in its file name. Combining could then skip it as a duplicate of another file that had the same data at that point, and delete it, losing the data recorded after the first save. Each save now updates the hash. This had been a problem since 7.13.1. Fixes issue 2338_.

  • Fixes for obscure but legal file names:

    • File names (and plugin names) can contain control characters, which are legal in POSIX paths but unsafe in reports: in XML 1.0 they make the document non-well-formed, and in a terminal they act as escape sequences (colors, title/clipboard sequences, cursor moves that forge output). Now the XML report, the text and Markdown summary reports, and ``coverage debug

... (truncated)

Commits
  • 393ac71 docs: prep for 7.17.0
  • 14257d3 test: check that 100% files haven't lost coverage
  • db056ac docs: keep the ukraine banner #2344
  • 6033660 fix: update the data file hash when a parallel data file is saved again (#2339)
  • 99024b5 fix: clamp rate in XML report to prevent false 1.0/0.0 rounding and scientifi...
  • ff62a02 refactor: remove unused caching branches
  • 24d0b67 fix: KeyError for a with statement at the end of a finally clause (#2336)
  • 934f5b8 chore: upgrade pip==26.2.2 certifi==2026.10.19
  • f95c980 fix: triply nested with statements don't cause false branch misses #1987
  • 6aaa858 docs: more changelog gardening
  • Additional commits viewable in compare view

Updates mypy to 2.4.1

Changelog

Sourced from mypy's changelog.

Mypy 2.4.1

  • Process overloads as a whole in two-phase type checking (Ivan Levkivskyi, PR 22231)
  • Skip recursive setup for frame-private nested functions in mypyc (Piotr Sawicki, PR 22187)

Acknowledgements

Thanks to all mypy contributors who contributed to this release:

  • A5rocks
  • Adam Dangoor
  • Alex Waygood
  • Ali Hamdan
  • Brian Helba
  • Chad Dombrova
  • David Foster
  • dnwpark
  • Edgar Ramírez Mondragón
  • Giorgos Michas
  • Ivan Levkivskyi
  • Jelle Zijlstra
  • Jukka Lehtosalo
  • Marc Mueller
  • Michael R. Crusoe
  • NIYONSHUTI Emmanuel
  • Piotr Sawicki
  • Shantanu
  • themylogin
  • Vaggelis Danias
  • Willy Bruns

I'd also like to thank my employer, Dropbox, for supporting mypy development.

Mypy 2.3

We've just uploaded mypy 2.3.0 to the Python Package Index (PyPI). Mypy is a static type checker for Python. This release includes new features, performance improvements and bug fixes. You can install it as follows:

python3 -m pip install -U mypy

You can read the full documentation for this release on Read the Docs.

The Upcoming Switch to the New Native Parser

We are planning to enable the new native parser (--native-parser) by default soon. We recommend that you test the native parser in your projects and report any issues in the mypy issue tracker.

Mypyc Free-threading Memory Safety

... (truncated)

Commits

Updates pre-commit to 4.7.0

Release notes

Sourced from pre-commit's releases.

pre-commit v4.7.0

Fixes

Changelog

Sourced from pre-commit's changelog.

4.7.0 - 2026-10-12

Fixes

4.6.2 - 2026-08-10

Fixes

4.6.1 - 2026-07-21

Fixes

4.6.0 - 2026-04-21

Features

  • pre-commit hook-impl: allow --hook-dir to be missing to enable easier usage with git 2.54+ git hooks.

Fixes

  • pre-commit hook-impl: --hook-type is required.

... (truncated)

Commits
  • 65bb884 v4.7.0
  • 73926c1 Merge pull request #3774 from cbirkhold/node-no-git-env-npm-install
  • 860d07d don't leak GIT_* env into npm install for language: node
  • 9ad8a0a Merge pull request #3775 from pre-commit/contextlib-chdir
  • 9905e88 use contextlib.chdir
  • 59cb792 Merge pull request #3771 from pre-commit/all-repos_autofix_py311-plus
  • 2be1701 remove triple-nested withs for 3.14 coverage
  • 4c8d22a py311+
  • c429238 Merge pull request #3770 from pre-commit/pre-commit-ci-update-config
  • f49e251 [pre-commit.ci] pre-commit autoupdate
  • Additional commits viewable in compare view

Updates pytest to 9.2.0

Release notes

Sourced from pytest's releases.

9.2.0

pytest 9.2.0 (2026-10-27)

Removals and backward incompatible breaking changes

  • #14716: -c 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 FileNotFoundError.

  • #8593: The indirect, ids and scope arguments of Metafunc.parametrize() <pytest.Metafunc.parametrize> -- and therefore of @pytest.mark.parametrize <pytest.mark.parametrize ref> -- are now keyword-only.

    Passing them positionally was a common source of confusing errors, e.g. parametrize("arg1", "arg2", [(1, 2)]) made the argvalues land in indirect and failed with indirect fixture '(1, 2)' doesn't exist; such mistakes now fail with an understandable TypeError. The type annotations have always declared these arguments as keyword-only.

  • #993: Plugin import failures at startup are now reported and classified instead of escaping as a raw traceback with the accidental exit code 1:

    • a plugin that cannot be found -- via -p, pytest_plugins or PYTEST_PLUGINS -- exits with pytest.ExitCode USAGE_ERROR (4), like a conftest.py that fails to import;
    • a plugin that is found but raises while importing -- including a broken pytest11 entry point or a missing plugin dependency -- exits with pytest.ExitCode INTERNAL_ERROR (3), with the traceback preserved.

    pytest.main now returns these codes instead of raising ImportError. Also fixed an IndexError from pytest's own internals when the plugin raised an exception with no arguments.

Deprecations (removal in next major release)

  • #14742: The private _pytest.python.CallSpec2 name has been renamed to CallSpec. The old CallSpec2 alias remains available for now and will be removed in pytest 10 or 11.

  • #14755: Schedule yield_fixture decorator for removal in pytest 10 or 11.

  • #14774: Similarly to the deprecation of class-scoped fixtures defined as instance methods in pytest 9.1, all higher-scoped fixtures (module, package, and session) defined as instance methods are now deprecated.

    They suffer from the same issue the original deprecation only fixed for class-scoped fixtures, see 10819 and 14011.

  • #14808: Passing a non-string value to a string-typed ini option now emits a pytest.PytestRemovedIn10Warning. This affects [tool.pytest.ini_options] in pyproject.toml. In pytest 10 this will raise a TypeError, matching the behavior of the corresponding TOML config path.

  • #7323: Passing bytes to TerminalReporter.write_line() is now deprecated, pass a str instead.

New features

  • #14743: Full diff: now contains a legend explaining the + & - symbols in diff output.
  • #2781: When strict_markers is enabled, marker names used in -m expressions are now validated against registered markers.
  • #6881: Added the parametrize_long_str_id_strategy configuration option to control how long str/bytes parameter values are handled in auto-generated test IDs. Explicit IDs set via ids=[...] or pytest.param(..., id=...) are not affected. Available strategies: short (default, values over 100 chars fall back to argname+index), sha256 (SHA-256 hex digest), legacy (keep full value), and disallow (error requesting explicit IDs).

Improvements in existing functionality

  • #10745: A RecursionError 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 --full-trace to see every frame.

... (truncated)

Commits
  • ae1d0ff Prepare release version 9.2.0
  • 143ce31 pre-commit: exclude codespell on generated release announcements
  • 532dc5f tox: add attrs dependency to regen, needed in reportingdemo.rst
  • a7b2446 Merge pull request #15245 from pytest-dev/claude/project-thread-9jcf91
  • 679d09c [pre-commit.ci] pre-commit autoupdate (#15266)
  • 41d12cd docs: clarify typing for yield fixtures
  • b9022ba Merge pull request #15182 from 1871698/docs/improve-getting-started-description
  • 16f87a7 docs: improve getting-started.rst test execution descri...

    Description has been truncated

Updates the requirements on [python-dateutil](https://github.com/dateutil/dateutil), [python-fsutil](https://github.com/fabiocaccamo/python-fsutil), [python-slugify](https://github.com/un33k/python-slugify), [coverage](https://github.com/coveragepy/coveragepy), [mypy](https://github.com/python/mypy), [pre-commit](https://github.com/pre-commit/pre-commit), [pytest](https://github.com/pytest-dev/pytest), [tox](https://github.com/tox-dev/tox) and [python-benedict](https://github.com/fabiocaccamo/python-benedict) to permit the latest version.

Updates `python-dateutil` from 2.9.0.post0 to 3.0.0
- [Release notes](https://github.com/dateutil/dateutil/releases)
- [Changelog](https://github.com/dateutil/dateutil/blob/master/NEWS)
- [Commits](dateutil/dateutil@2.9.0.post0...3.0.0)

Updates `python-fsutil` from 0.16.1 to 0.18.0
- [Release notes](https://github.com/fabiocaccamo/python-fsutil/releases)
- [Changelog](https://github.com/fabiocaccamo/python-fsutil/blob/main/CHANGELOG.md)
- [Commits](fabiocaccamo/python-fsutil@0.16.1...0.18.0)

Updates `python-slugify` from 8.0.4 to 9.1.3
- [Release notes](https://github.com/un33k/python-slugify/releases)
- [Changelog](https://github.com/un33k/python-slugify/blob/master/CHANGELOG.md)
- [Commits](un33k/python-slugify@v8.0.4...v9.1.3)

Updates `coverage` to 7.17.0
- [Release notes](https://github.com/coveragepy/coveragepy/releases)
- [Changelog](https://github.com/coveragepy/coveragepy/blob/main/CHANGES.rst)
- [Commits](coveragepy/coveragepy@7.13.0...7.17.0)

Updates `mypy` to 2.4.1
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](python/mypy@v1.20.0...v2.4.1)

Updates `pre-commit` to 4.7.0
- [Release notes](https://github.com/pre-commit/pre-commit/releases)
- [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md)
- [Commits](pre-commit/pre-commit@v4.6.0...v4.7.0)

Updates `pytest` to 9.2.0
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](pytest-dev/pytest@9.0.3...9.2.0)

Updates `tox` to 4.67.4
- [Release notes](https://github.com/tox-dev/tox/releases)
- [Changelog](https://github.com/tox-dev/tox/blob/main/docs/changelog.rst)
- [Commits](tox-dev/tox@4.53.0...4.67.4)

Updates `python-benedict` from 0.36.0 to 0.40.1
- [Release notes](https://github.com/fabiocaccamo/python-benedict/releases)
- [Changelog](https://github.com/fabiocaccamo/python-benedict/blob/main/CHANGELOG.md)
- [Commits](fabiocaccamo/python-benedict@0.36.0...0.40.1)

---
updated-dependencies:
- dependency-name: python-dateutil
  dependency-version: 3.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: python-requirements
- dependency-name: python-fsutil
  dependency-version: 0.18.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python-requirements
- dependency-name: python-slugify
  dependency-version: 9.1.3
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: python-requirements
- dependency-name: coverage
  dependency-version: 7.17.0
  dependency-type: direct:production
  dependency-group: python-requirements
- dependency-name: mypy
  dependency-version: 2.4.1
  dependency-type: direct:production
  dependency-group: python-requirements
- dependency-name: pre-commit
  dependency-version: 4.7.0
  dependency-type: direct:production
  dependency-group: python-requirements
- dependency-name: pytest
  dependency-version: 9.2.0
  dependency-type: direct:production
  dependency-group: python-requirements
- dependency-name: tox
  dependency-version: 4.67.4
  dependency-type: direct:production
  dependency-group: python-requirements
- dependency-name: python-benedict
  dependency-version: 0.40.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python-requirements
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file python Pull requests that update Python code labels Nov 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file python Pull requests that update Python code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants