Skip to content

chore(deps): update all dependencies - #18798

Open
renovate-bot wants to merge 1 commit into
googleapis:mainfrom
renovate-bot:renovate/all
Open

renovate-bot wants to merge 1 commit into
googleapis:mainfrom
renovate-bot:renovate/all

Conversation

@renovate-bot

@renovate-bot renovate-bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Change Age Confidence Type Update
SQLAlchemy (changelog) ==2.1.5 → ==2.1.6 age confidence patch
actions/setup-python (changelog) 5fda3b9 → 6d4fd22 action digest
alembic (changelog) ==1.20.0 → ==1.20.1 age confidence patch
bigquery-magics (source) ==0.15.1 → ==0.15.2 age confidence patch
bigquery_magics (source) ==0.15.1 → ==0.15.2 age confidence patch
certifi ==2026.10.19 → ==2026.10.23 age confidence patch
db-dtypes ==1.8.0 → ==1.9.0 age confidence minor
google-api-core ==2.42.0 → ==2.43.0 age confidence minor
googleapis-common-protos (source) ==1.75.5 → ==1.76.0 age confidence minor
grpc-google-iam-v1 ==0.14.5 → ==0.14.6 age confidence patch
grpcio ==1.84.0 → ==1.85.0 age confidence minor
grpcio-status ==1.84.0 → ==1.85.0 age confidence minor
mcr.microsoft.com/devcontainers/python 3.14 → 3.15 age confidence final minor
multidict ==7.1.0 → ==7.2.1 age confidence minor
pandas (changelog) ==3.0.6 → ==3.1.0 age confidence minor
platformdirs (changelog) ==4.13.5 → ==4.14.0 age confidence minor
pyasn1 (changelog) ==0.6.4 → ==0.6.5 age confidence patch
pycparser ==3.11 → ==3.12 age confidence minor
pytest (changelog) ==9.1.1 → ==9.2.0 age confidence minor
pytest-asyncio (changelog) ==1.4.0 → ==1.4.1 age confidence patch
python-dateutil ==2.9.0.post0 → ==3.0.0 age confidence major
python-discovery (changelog) ==1.6.4 → ==1.6.7 age confidence patch
ruff (source, changelog) ==0.17.1 → ==0.17.3 age confidence patch
virtualenv (changelog) ==21.14.12 → ==21.15.1 age confidence minor

Release Notes

googleapis/google-cloud-python (bigquery-magics)

v0.15.2: bigquery-magics: v0.15.2

Compare Source

Features
Bug Fixes
  • bigquery-magics: wait for graph server startup before returning from init (#​18763) (77e4d66)
  • validate Host header in graph_server request handlers (#​17932) (ea7299f)
certifi/python-certifi (certifi)

v2026.10.23

Compare Source

grpc/grpc (grpcio)

v1.85.0

Compare Source

This is release 1.85.0 (googol) of gRPC Core.

For gRPC documentation, see grpc.io. For previous releases, see Releases.

This release contains refinements, improvements, and bug fixes, with highlights listed below.

Core

  • [security] Update gRPC repo roots. (#​43717)
  • [experiments] Add map_host_header_to_authority experiment. (#​43561)
  • [Security] Add MLKEM1024 as a key exchange option. (#​43514)
  • Remove OpenSSL1.0.2 Support. (#​43466)
  • [Autosharding-LB][Part-1] Implementing A119. (#​43406)
  • [OpenSSL] Add support for OpenSSL 4. (#​41932)
  • [A110] Add child channel options. (#​43314)

C#

  • [Build] Disambiguate protobuf_version in templates. (#​43433)

Python

  • [Python][AIO] Fixed data race in PollerCompletionQueue. (#​43429)
  • [Python] Fix SyncServicerContext abort not raising exception. (#​43126)
  • [Python] Fixed channelz module leak. (#​43196)
  • [Python] Fixed CSDS memory leak. (#​43202)
  • [Python] Unpin Cython dependency for source builds. (#​43378)

v1.84.1

Compare Source

This is release gRPC Core 1.84.1 (gimbal).

For gRPC documentation, see grpc.io. For previous releases, see Releases.

This release contains refinements, improvements, and bug fixes, with highlights listed below.

Core

  • [Backport][v1.84.x][security] Update gRPC repo roots. (#​43700)
aio-libs/multidict (multidict)

v7.2.1

Compare Source

=====

(2026-10-24)

Bug fixes

  • Fixed a regression in 7.2.0 where a subclass of
    :class:~multidict.MultiDictProxy or :class:~multidict.CIMultiDictProxy
    that converted its argument in its own __init__() raised
    :exc:TypeError before that __init__() ran; such a subclass got an
    empty multidict until its __init__() set the proxied one
    -- by :user:asvetlov.

    Related issues and pull requests on GitHub:
    :issue:1824, :issue:1825.


v7.2.0

Compare Source

=====

(2026-10-23)

7.2.0 drops Python 3.10, fixes a crash in a proxy built without
__init__() and a :exc:MemoryError from a huge __length_hint__(),
and is otherwise a performance release for the C extension: lookups,
adds, updates and deletes each needed a few percent fewer instructions.

Bug fixes

  • Stopped a huge __length_hint__() from raising :exc:MemoryError in
    :meth:~multidict.MultiDict.extend, :meth:~multidict.MultiDict.update
    and :meth:~multidict.MultiDict.merge; the C extension capped the room
    it reserved for the hint at the largest table the constructor allocates
    up front -- by :user:asvetlov.

    Related issues and pull requests on GitHub:
    :issue:1767.

  • Fixed a segmentation fault when using a :class:~multidict.MultiDictProxy
    or :class:~multidict.CIMultiDictProxy built by __new__() without
    __init__(); __new__() started requiring the proxied multidict, the
    same argument as the constructor -- by :user:asvetlov.

    Related issues and pull requests on GitHub:
    :issue:1782.

Features

  • Sped up reading a multidict in the C extension. md[key],
    :meth:~multidict.MultiDict.get and :meth:~multidict.MultiDict.getone
    became up to 7% faster by returning the lookup's result by value instead
    of through a pointer to the caller's local, which had made
    -fstack-protector-strong add a stack canary to every call. On the GIL
    build a :meth:~multidict.MultiDict.get miss became 5% faster and
    key in md inlined its hash table lookup. On the free-threaded build
    :meth:~multidict.MultiDict.getall stopped taking the multidict's lock
    for a multidict without repeated keys, the way
    :meth:~multidict.MultiDict.get already avoided it. len(md.keys())
    and iterating over the keys of a multidict that holds a key more than
    once became 4% to 13% faster -- by :user:asvetlov.

    Related issues and pull requests on GitHub:
    :issue:1775, :issue:1776, :issue:1781, :issue:1800, :issue:1817.

  • Sped up building and updating a multidict in the C extension. On the GIL
    build, constructing a multidict from a sequence of pairs needed 8% to 10%
    fewer instructions and :meth:~multidict.MultiDict.update 3.5% to 4.5%
    fewer. On the free-threaded build, building a
    :class:~multidict.MultiDict became up to 14% faster, since a table that
    is both full and unable to hold the new key in its compact form was grown
    and moved in one rebuild, and :meth:~multidict.MultiDict.add,
    md[key] = value for a new key and
    :meth:~multidict.MultiDict.setdefault needed 2% to 3% fewer
    instructions, about 1% fewer on the GIL build. Updating a multidict with
    existing keys needed 1.5% to 2.9% fewer instructions, while adding a new
    key needed about 0.5% more on the GIL build -- by :user:asvetlov.

    Related issues and pull requests on GitHub:
    :issue:1763, :issue:1774, :issue:1780, :issue:1785, :issue:1802.

  • Sped up replacing and removing items in the C extension.
    :meth:~multidict.MultiDict.add, :meth:~multidict.MultiDict.getall,
    md[key] = value and del md[key] stopped computing the identity
    of a key that, or whose :class:~multidict.istr canonical form, already
    serves as one, as md[key] did, and checked a
    :class:~multidict.CIMultiDict key holding uppercase letters only once.
    On the GIL build del md[key] needed 4% to 5% fewer instructions,
    md[key] = value about 2% fewer and :meth:~multidict.MultiDict.pop
    1% fewer. Replacing a key that had duplicates needed 0.8% to 1.7% fewer
    instructions, and :meth:~multidict.MultiDict.clear became 6% faster on
    the free-threaded build -- by :user:asvetlov.

    Related issues and pull requests on GitHub:
    :issue:1769, :issue:1770, :issue:1779, :issue:1796, :issue:1809.

Removals and backward incompatible breaking changes

  • Dropped support for Python 3.10 as it has reached end of life
    -- by :user:asvetlov.

    Related issues and pull requests on GitHub:
    :issue:1777.

Improved documentation

  • Refreshed the instruction-count tables in the benchmarking reference
    against the current tree -- by :user:asvetlov.

    Related issues and pull requests on GitHub:
    :issue:1816, :issue:1818.

Packaging updates and notes for downstreams

  • Added the CPython 3.15 trove classifier and started testing the
    GIL and free-threaded 3.15 builds in CI -- by :user:asvetlov.

    Related issues and pull requests on GitHub:
    :issue:1766.

Contributor-facing changes

  • Split the release publishing and signing across four parallel jobs, so
    that each one finishes well within the lifetime of its short-lived PyPI
    upload token -- by :user:asvetlov.

    Related issues and pull requests on GitHub:
    :issue:1768, :issue:1822.

  • Changed the clear() benchmarks to clear a thousand prebuilt
    multidicts of 0 to 99 items each, copied outside the measured region,
    since the copy inside the timed loop and the single small table it
    measured made the result swing by up to 19% between runs of the same
    commit -- by :user:asvetlov.

    Related issues and pull requests on GitHub:
    :issue:1784.

  • Pinned Hypothesis in the MyPy pre-commit hooks and dropped a
    type: ignore comment from the Hypothesis tests that became unused
    once Hypothesis annotated run_state_machine_as_test(), which failed
    the MyPy lint job -- by :user:asvetlov.

    Related issues and pull requests on GitHub:
    :issue:1820.

  • Fixed a test of a huge __length_hint__() failing on 32-bit builds,
    where its 2**40 hint did not fit a Py_ssize_t
    -- by :user:asvetlov.

    Related issues and pull requests on GitHub:
    :issue:1821.

Miscellaneous internal changes

  • Split the C extension's helpers per table kind, so that the lookup
    loops of pop(), popall(), item replacement and update(), the
    table rebuild and the deferred delete of an entry call the helper for
    their own kind instead of testing it again, and moved the choice between
    overwriting and dropping each entry of a repeated key into the per-kind
    loops of update(). Folded helpers with a single caller into that
    caller: choosing the kind of a new table, reading a compact entry's
    identity and hash, filling a new entry, replacing a key's values,
    deleting a key and looking up the first value of a key that needs a
    computed identity. Merged the two per-kind checks for a deleted entry
    into one, and removed the separate watched copies of delete, pop and
    replace, folding the add that follows a missed replace into the replace
    itself -- by :user:asvetlov.

    Related issues and pull requests on GitHub:
    :issue:1771, :issue:1772, :issue:1773, :issue:1786, :issue:1788,
    :issue:1789, :issue:1790, :issue:1792, :issue:1804, :issue:1805,
    :issue:1810, :issue:1811.

  • Removed duplicated code from the C extension: the (key, default)
    methods shared their argument parsing and missing-key result, and one
    macro each replaced the copies of the lock-free compact entry match on
    the free-threaded build and of the per-kind dispatch of a single key
    lookup. Turned the watcher record, flush and pending check helpers and
    _growth_rate() into macros, so that a multidict without watchers
    skipped evaluating the event arguments, renamed the lowercase
    function-like macros to upper case, and dropped the leading underscore
    from the watcher functions that the macros call from other headers
    -- by :user:asvetlov.

    Related issues and pull requests on GitHub:
    :issue:1793, :issue:1794, :issue:1795, :issue:1806, :issue:1807,
    :issue:1808, :issue:1812.

  • Adjusted how the C extension spends GCC's inlining budget: marked most
    checks that lead to a raised exception as unlikely, so the compiler
    moves the error paths out of the hot code, kept the event name lookup of
    a failing watcher callback report and the cleanup of a dropped watcher
    event log out of line, and dropped the inline hint from the helpers
    that compute a table's size and that rebuild, build or free a table's
    keys -- by :user:asvetlov.

    Related issues and pull requests on GitHub:
    :issue:1783, :issue:1791, :issue:1801, :issue:1815.

  • Moved the C extension's repr() of multidicts, proxies and views and
    its equality comparison out of the hash table header, each into a header
    of its own -- by :user:asvetlov.

    Related issues and pull requests on GitHub:
    :issue:1778, :issue:1787.


pandas-dev/pandas (pandas)

v3.1.0: pandas 3.1.0

Compare Source

We are pleased to announce the release of pandas 3.1.0.
This release includes some new features, bug fixes, and performance improvements. We recommend that all users upgrade to this version.

Highlights include:

See the detailed release notes for a list of all the changes.

The release can be installed from PyPI:

python -m pip install --upgrade pandas

Or from conda-forge

conda install -c conda-forge pandas

Please report any issues with the release on the pandas issue tracker.

Thanks to all the contributors who made this release possible.

tox-dev/platformdirs (platformdirs)

v4.14.0

Compare Source

Features
  • Accept a keyword-only ensure_exists in the module-level media directory functions, such as user_documents_path, to create a directory set through XDG_*_DIR or user-dirs.dirs (#​656) by @​darrenhuai and @​gaborbernat.

Bug fixes
  • Return the media and fonts directories under root's home for root with use_site_for_root, ignoring the invoking user's XDG_*_DIR, user-dirs.dirs and XDG_DATA_HOME, and create no inherited media directory under ensure_exists (#​661) by @​gaborbernat.
  • Raise ValueError from site_data_dir and site_config_dir under multipath=True when appname or version contains os.pathsep, rather than returning a string that splits into a directory outside the site base (#​662) by @​gaborbernat.
  • Parse an unquoted user-dirs.dirs value with a long run of blanks in linear time, rather than in time quadratic in the run's length on every Unix media directory lookup (#​663) by @​gaborbernat.
  • Treat a relative HOME as unset on Unix, macOS and iOS, taking the home from the password database or raising RuntimeError, rather than resolving user directories against the working directory (#​664) by @​gaborbernat.
  • Refuse a symlink as XDG_RUNTIME_DIR in user_runtime_dir when the value ends with / or /., which made the check follow the link (#​665) by @​gaborbernat.
  • Redirect user_*_dir calls with use_site_for_root=True when the effective uid is 0, so a setuid-root process gets the site directories, and name and check the runtime directory by the effective uid (#​666) by @​gaborbernat.
  • Apply the XDG_RUNTIME_DIR check of the Unix user_runtime_dir to the macOS one, so it no longer uses a directory that is a symlink, owned by another user or not mode 0700 (#​667) by @​gaborbernat.
  • Reject an XDG_RUNTIME_DIR below a parent that another user can replace, such as their own entry in /tmp, instead of creating the runtime directory through it (#​668) by @​gaborbernat.
  • Stop accepting a Unix runtime directory that another user creates between the owner check and its use: ensure_exists and place_runtime_file create it before checking it, and find_runtime_file checks it again after a hit (#​669) by @​gaborbernat.
  • Raise PermissionError on macOS when ensure_exists would create the site cache through a /Library/Caches/$appname that is a symlink, not a directory, or owned by a user other than root and the current one (#​670) by @​gaborbernat.
  • With ensure_exists, raise FileExistsError when a configured media directory such as user_documents_dir is a regular file or a symlink to one, instead of returning the file's path. Dangling symlinks are still returned unchanged (#​672) by @​rupayon123 and @​gaborbernat.
New Contributors

PyPI release

Full Changelog

v4.13.7

Compare Source

Bug fixes
  • Fall back to the default media directories when user-dirs.dirs exists but cannot be read, rather than raising PermissionError or IsADirectoryError (#​632) by @​Debasishhh and @​gaborbernat.
  • Resolve the Windows Projects directory from USERPROFILE when HOME is empty, rather than raising RuntimeError (#​635) by @​pabszero and @​gaborbernat.
  • Resolve $HOME entries in user-dirs.dirs to /Documents instead of //Documents when the home directory is / (#​636) by @​darrenhuai and @​gaborbernat.
  • Print the error and keep listing directories in python -m platformdirs when the home directory is unknown, rather than stopping with RuntimeError (#​638) by @​tongwentao and @​gaborbernat.
  • Raise FileNotFoundError from the place_*_file methods when the user directory is on a missing Windows drive or network share, rather than recursing until RecursionError (#​639) by @​nk-batman21 and @​gaborbernat.
  • Search the directories of a subclass's overridden iter_*_paths method in find_*_file and find_*_files, rather than the base class ones (#​640) by @​KennyMcSimpson and @​gaborbernat.
  • Keep isolated_dirs paths under a relative root after the working directory changes, and yield the root as an absolute path (#​643) by @​0x5t4l1n and @​gaborbernat.
  • Ignore Windows folder overrides with a UNC path missing its server or share name, such as \\server, instead of treating the application name as the share (#​647) by @​RedCat888 and @​gaborbernat.

Documentation
  • Remove the literal /opt/homebrew from a macOS source comment. Homebrew replaces it with a placeholder when bottling on Apple Silicon but not on Linux, so formulae that bundle platformdirs could not share one bottle across both (#​644) by @​Moisan and @​gaborbernat.
New Contributors

PyPI release

Full Changelog

v4.13.6

Compare Source

Packaging
  • Releases now run on the shared tox-dev/github-workflows pipeline, with a locked release toolchain and generated GitHub Release notes (#​650) by @​gaborbernat.

🐍 PyPI release

📜 Full Changelog

pyasn1/pyasn1 (pyasn1)

v0.6.5

Compare Source

  • GHSA-mm57-4v3p-rchx: Decoded binary REAL mantissas in linear time
    instead of repeatedly shifting a growing integer and slicing the
    remaining bytes (thanks for reporting, manus-use, manus-pi, ucsurf,
    adriank31)
  • GHSA-2qm8-x737-gmw5: Reassembled constructed BIT STRING fragments
    in linear time while preserving their decoded bit values, including
    intermediate fragment padding (thanks for reporting, manus-use)
  • GHSA-9m75-vc3g-4x39: Reassembled constructed OCTET STRING and
    character-string fragments and indefinite-length ANY content in
    linear time. Nested constructed OCTET STRING fragments now contribute
    their decoded octets (thanks for reporting, alimony, manus-pi, adriank31)
  • GHSA-fm9c-5rcf-2q5p: Bounded schemaless container type tracking
    after two distinct tag sets to prevent quadratic CPU use from
    colliding long tag IDs (thanks for reporting, droideck)
eliben/pycparser (pycparser)

v3.12

Compare Source

pytest-dev/pytest (pytest)

v9.2.0

Compare Source

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.

  • #​10745: The line numbers of a module's statements are now computed once per traceback
    instead of once per traceback entry, which noticeably speeds up rendering
    failures raised from large test modules.

  • #​11418: The cached rewritten modules in __pycache__ are now invalidated by a hash of
    the source instead of its modification time, using the checked-hash pyc format
    from 552.

    Timestamps make the cache useless wherever source files get fresh modification
    times, most notably in CI: a checkout gives every file a new mtime, so a
    restored cache is discarded in full and every test module is rewritten again.
    Hashing the source costs roughly 15 microseconds per file and makes the cache
    survive that.

    Existing timestamp based caches are ignored and rewritten once.

  • #​12624: The pytest_plugins variable and the PYTEST_PLUGINS environment variable now also accept entry point names of installed plugins (e.g. xdist), in addition to importable module names, matching the behavior of the -p command-line option.

    As part of this change, plugins specified by entry point name through these mechanisms are now also listed in the plugins: line of the terminal header (12615).

    Based on the original implementation by Marcel Telka in 12616.

  • #​12697: Warnings emitted while importing plugins through -p, PYTEST_PLUGINS, or entry point autoloading are now captured, filtered, and reported like other warnings.

  • #​12860: Assertion diffs for dict.items() and dict.keys() comparisons (>=, <=, >, <, ==) now show which items are missing, the same way set comparisons do.

  • #​13354: Node.get_closest_marker <_pytest.nodes.Node.get_closest_marker> now also accepts a ~pytest.MarkDecorator as its default, for example item.get_closest_marker("foo", pytest.mark.foo(1)), and returns the wrapped ~pytest.Mark.

    Previously the only way to build a default was to instantiate ~pytest.Mark directly, which is private and warns.

  • #​13369: Improved the error from pytest.RunResult.assert_outcomes when a plugin changes or removes pytest's standard terminal summary, and documented how to isolate output-changing plugins.

  • #​13431: Exposed pytest.ParameterSet as the type of the return value of pytest.param().
    This can be used in type annotations and isinstance checks.

  • #​13564: Issue a warning when fixtures are wrapped with a decorator that prevents
    correct discovery, including @classmethod above @pytest.fixture and
    @staticmethod above @pytest.fixture. Put @pytest.fixture above
    those decorators on test classes.

  • #​14164: Exposed pytest.Approx as the type of the return value of pytest.approx().
    This can be used in type annotations and isinstance checks.

  • #​14463: Assertion diffs for mappings now match up keys the way the compared mappings match them themselves.

    Key comparison goes through the mappings' key views instead of plain sets of their keys, so a mapping
    with its own notion of key equivalence, such as case-insensitive header mappings, no longer
    reports its common keys as missing on either side.

  • #​14523: Large assertion comparison diffs are now built lazily and capped to the
    truncation budget, so a huge diff is no longer formatted in full just to
    be truncated. As a consequence, the truncation footer no longer
    reports the exact number of hidden lines.

  • #​14687: The default fd-level output capturing (--capture=fd) now skips reading the capture buffer for tests which produce no output, reducing per-test overhead in large test suites.

  • #​14724: --no-summary now only applies directly to pytest's own summary.

    The flag no longer skips the pytest_terminal_summary hook, so third-party
    plugins (for example coverage) can still write their terminal summaries.

  • #​14751: parser.addini <pytest.Parser.addini> now also accepts type expressions for its type argument, in addition to the existing string tags: the plain Python types str, bool, int, float, a Literal of strings, and unions of these (for example int | str or int | Literal["auto"]).

  • #​14754: pytest.approx() now rejects infinite relative tolerances for datetime.timedelta values with a clear ValueError instead of raising OverflowError.

  • #​14791: The junit_family, junit_logging, junit_duration_report, console_output_style, empty_parameter_set_mark, assertion_text_diff_style and tmp_path_retention_policy configuration options are now registered with the set of values they accept: an invalid value now fails with a clean usage error instead of being silently ignored or crashing later, and pytest --help lists the accepted values.

    config.getini <pytest.Config.getini> now raises pytest.UsageError instead of TypeError or ValueError when the value read from the configuration file does not match the registered type, so a bad value is always reported as a short usage error message instead of an internal error traceback. Asking for an option name that was never registered still raises ValueError.

  • #​15006: pytest.approx now emits pytest.PytestApproxDecimalToleranceWarning when a rel or abs tolerance is given as a float that cannot be represented exactly for a ~decimal.Decimal comparison, since such a tolerance is widened to the float's exact binary value.

  • #​14675, #​14953, #​15153, #​15132: The truncation_limit_lines, truncation_limit_chars, max_warnings, verbosity_assertions, verbosity_test_cases, verbosity_subtests, tmp_path_retention_count, log_level, log_cli_level, log_file_level,log_auto_indent and faulthandler_timeout configuration options now accept native integer (and, for log_auto_indent, boolean) values in TOML configuration files, while still accepting strings for backward compatibility.
    log_file_mode now reports invalid values as a usage error.

  • #​15254: tmp_path and TempPathFactory.mktemp <pytest.TempPathFactory.mktemp> no longer list the whole base temporary directory on every call, which made sessions with many temporary directories quadratically slow. Numbers are now handed out from a per-prefix counter, skipping names that already exist.

  • #​4569: Node.add_marker <_pytest.nodes.Node.add_marker> now stores a ~pytest.Mark in node.keywords, matching what marks applied during collection store. Previously it stored a ~pytest.MarkDecorator.

  • #​9436: Avoided formatting tracebacks for tests marked with xfail(run=False).

Bug fixes

  • #​10128: Configured warning filters now apply to warnings emitted by pytest_configure hooks.

  • #​10210: pytest.approx now raises a TypeError for any nested container, not
    only for one of the same type as its parent. Previously approx([{"k": 1}])
    and approx({"k": [1]}) were accepted and then compared unequal to every
    value, silently ignoring the tolerance, while approx([[1]]) correctly
    reported that nesting is unsupported.

  • #​10644: monkeypatch.setattr() no longer leaves a new entry in the instance __dict__ when it patches an attribute that the instance inherits from its class.

    Previously undo() assigned the inherited value onto the instance, which shadowed the class attribute -- permanently freezing the result for descriptors that resolve dynamically.

  • #​1139: Fixed tracebacks showing ??? instead of source lines for code compiled with a filename relative to a directory other than the current working directory -- e.g. compiled Cython modules, when running pytest from a subdirectory of the project root.
    The source lookup now falls back to searching sys.path for such filenames, as the standard traceback module does.

  • #​11502: The rootdir is no longer derived from a configuration file that is not a regular file, such as --config-file=/dev/null.

  • #​11783: Plugins installed in editable mode (660) are marked for assertion rewriting again.

    Such installs do not record the package's Python files in the distribution metadata, so pytest found nothing to rewrite and assertions inside the plugin lost their introspection. The plugin's entry point is now used to locate the package in that case.

  • #​11933: pytest.warns no longer re-emits unmatched warnings with module="warnings", which caused module-based warning filters to be applied to the wrong warnings. Since warnings.WarningMessage does not record the module a warning was emitted with, re-emitted warnings now use the standard warnings.warn_explicit default of deriving the module from the warning's filename.

  • #​12175: ExceptionInfo.exconly(tryshort=True) <pytest.ExceptionInfo.exconly> now strips the AssertionError: prefix of failed assert statements for ~pytest.ExceptionInfo objects created by pytest.raises, and failures inside unittest.TestCase.subTest report the same short crash line as regular tests.

  • #​12223: The message attribute of <failure> and <error> elements in --junitxml reports is now shortened to whole lines within 500 characters. When something is dropped, it ends with a note pointing to the element text, which still holds the full report. Previously, very verbose assertion output (e.g. with -vv) produced attributes tens of thousands of characters long, which some XML parsers fail on.

  • #​12307: Fixed truncation of long collections (lists, dicts, sets, etc.) in the "message" part of failed assertions (as in assert condition, msg) when using -vv: the message now uses the same unlimited repr as the rest of the assertion output, instead of eliding collection elements with ....

  • #​12824: Custom command-line options now fail with a clear error when their implicit
    destination conflicts with an existing option, avoiding silent overrides of
    built-in options such as -k.

  • #​13292: Fixed a stale rewritten module being used when a test file is modified twice
    within the same second without changing its size -- the pyc header could only
    record whole-second timestamps. The cache is now keyed on a hash of the source.

  • #​14036: __tracebackhide__ is now respected in ExceptionGroup tracebacks, both for the group itself and for its sub-exceptions.

  • #​14189: Nested usage of caplog.filtering <pytest.LogCaptureFixture.filtering> no longer removes filters early if they were already present.

  • #​14412: Fixed incorrect timing information for subtests and parent tests when console_output_style = "times".

  • #​14445: Assertion rewriting no longer evaluates walrus operator (:=) expressions more than once, which reported results the test never computed when the expression had side effects.

    An operand evaluated before a later walrus is now reported with the value it actually saw, so assert value != identity(value := value.lower()) keeps Python's left-to-right order.

  • #​14552: Fixed stale co_filename values after a test module or directory is moved. Assertion-rewrite caches are reused when the source hash still matches, and in-memory code objects are pointed at the current path.

  • #​14586: Negative values passed to log_auto_indent now correctly fall back to no indentation, matching the documented behavior.

  • #​14619: Fixed a crash in pytest.mark.parametrize when a non-sequence value is passed for a parameter set. It now provides a clear error message during collection.

  • #​14635: Fixed fixture resolution failures when specifying multiple test paths on the command line that share common parent directories. Parametrized fixtures defined in a conftest.py could be silently dropped depending on the order of the specified paths.

  • #​14637: Pytest now correctly skips identical trailing characters in assertion text diffs even when the compared strings differ at the beginning.

  • #​14638: Top-level options in pytest.toml and .pytest.toml files now raise an error instead of being silently ignored when no [pytest] table is present.

  • #​14683: Fixed a regression in pytest 9.1 where a conftest.py located in the rootdir was no longer visible to tests and doctests collected from outside the rootdir (for example when passing a parent directory of the rootdir as a collection argument, or setting --rootdir to a subdirectory).

    As a result, fixtures defined in such a conftest -- including doctest_namespace injections -- were not available, causing errors such as NameError in doctests.

  • #​14700: Fixed an internal error on Python 3.12 when a doctest on a fixture-decorated function was skipped.

  • #​14705: TOML configuration files passed via -c now also read their configuration from the [pytest] table, the one pytest's own configuration files use. The [tool.pytest] and [tool.pytest.ini_options] tables such files were previously restricted to keep working; using both styles in one file is an error.

  • #​14828: Exception groups raised from another exception now print their cause chain only once in the traceback output.

  • #​14864: Fixed collection on Windows collecting the whole suite instead of the given path, on file systems which do not support file IDs (st_ino is 0 for every file, as seen for exa

[!IMPORTANT]
✂ PR body was truncated to here.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate-bot
renovate-bot requested a review from a team as a code owner October 21, 2026 16:54
@trusted-contributions-gcf trusted-contributions-gcf Bot added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 21, 2026
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 21, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates the SQLAlchemy dependency in packages/sqlalchemy-spanner/requirements.txt from version 2.1.5 to 2.1.6, along with updating its associated cryptographic hashes. There are no review comments to address, and I have no additional feedback to provide.

@renovate-bot
renovate-bot requested review from a team as code owners October 22, 2026 03:06
@renovate-bot renovate-bot changed the title chore(deps): update dependency sqlalchemy to v2.1.6 chore(deps): update all dependencies Oct 22, 2026
@renovate-bot
renovate-bot requested review from tswast and removed request for a team October 22, 2026 03:06
@trusted-contributions-gcf trusted-contributions-gcf Bot added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 22, 2026
@yoshi-kokoro yoshi-kokoro removed kokoro:force-run Add this label to force Kokoro to re-run the tests. labels Oct 22, 2026
@renovate-bot
renovate-bot requested a review from a team as a code owner October 22, 2026 04:42
@trusted-contributions-gcf trusted-contributions-gcf Bot added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 22, 2026
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 22, 2026
@trusted-contributions-gcf trusted-contributions-gcf Bot added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 22, 2026
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 22, 2026
@trusted-contributions-gcf trusted-contributions-gcf Bot added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 22, 2026
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 22, 2026
@trusted-contributions-gcf trusted-contributions-gcf Bot added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 22, 2026
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 22, 2026
@trusted-contributions-gcf trusted-contributions-gcf Bot added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 23, 2026
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 23, 2026
@trusted-contributions-gcf trusted-contributions-gcf Bot added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 24, 2026
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 24, 2026
@trusted-contributions-gcf trusted-contributions-gcf Bot added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 25, 2026
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 25, 2026
@trusted-contributions-gcf trusted-contributions-gcf Bot added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 25, 2026
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 25, 2026
@trusted-contributions-gcf trusted-contributions-gcf Bot added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 25, 2026
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 25, 2026
@trusted-contributions-gcf trusted-contributions-gcf Bot added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 25, 2026
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 25, 2026
@trusted-contributions-gcf trusted-contributions-gcf Bot added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 26, 2026
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 26, 2026
@trusted-contributions-gcf trusted-contributions-gcf Bot added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 26, 2026
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 26, 2026
@trusted-contributions-gcf trusted-contributions-gcf Bot added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 26, 2026
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 26, 2026
@trusted-contributions-gcf trusted-contributions-gcf Bot added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 27, 2026
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 27, 2026
@trusted-contributions-gcf trusted-contributions-gcf Bot added the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 27, 2026
@yoshi-kokoro yoshi-kokoro removed the kokoro:force-run Add this label to force Kokoro to re-run the tests. label Oct 27, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants