Skip to content

Conversation

@renovate
Copy link
Contributor

@renovate renovate bot commented Jan 20, 2026

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Change Age Confidence
cffi (changelog) ^1.16.0^2.0.0 age confidence
ops (changelog) >=2.21>=3.5.1 age confidence
pyOpenSSL (source) ^24.2.1^25.3.0 age confidence
pytest (changelog) ^8.1.1^9.0.2 age confidence
pytest-asyncio (changelog) ^0.21.1^1.3.0 age confidence

Release Notes

python-cffi/cffi (cffi)

v2.0.0

Compare Source

What's Changed

  • Add Python 3.14 support.
  • Add CPython free-threaded support (3.14t+ only) - huge thanks to the folks at Quansight Labs for all the work to get this one sorted!
  • Drop Python <= 3.8 support.
  • Fix order dependency affecting nested type size calculation (#​148).

Full Changelog: python-cffi/cffi@v1.17.1...v2.0.0

canonical/operator (ops)

v3.5.1

Compare Source

Fixes

  • Use parse_rfc3339 for datetime parsing to support Juju 4 (#​2264)
  • Correct the value of additional_properties in the action meta in Juju 4 (#​2250)
  • Prevent KeyError on auth-type when creating CloudCredential object (#​2268)
  • _checks_action should return empty list when there are no changes (#​2270)

Documentation

  • Provide examples in unit testing how-to, and other small improvements (#​2251)
  • Update the action how-to to explain the additionalProperties default flip (#​2249)
  • For state-transition tests, clarify about immutability and reusing state (#​2153)
  • Fix and clarify holistic example of handling storage (#​2098)
  • Remove comments from K8s tutorial and clarify about persisting data (#​2253)
  • Clarify handling of postgres relation data in K8s tutorial (#​2256)
  • Improve unit tests of httpbin demo charm (#​2254)
  • Add version information for tools in the charming ecosystem (#​2231)
  • Avoid emojis that render differently across platforms (#​2273)
  • Secrets over CMR comment added (#​2271)
  • Fix charm name in httpbin deploy command (#​2276)
  • Updated security@ubuntu.com PGP key (#​2286)

Tests

  • Remove unnecessary test module (#​2247)

CI

  • Replace git reference injection with wheel artifacts in charm test workflows (#​2252)
  • Explicitly provide the charmcraft repo location in CI (#​2277)
  • Remove outdated custom signature generation (#​2280)

v3.5.0

Compare Source

Features

  • Env var to control exception wrapping in tests (#​2142)
  • Deprecate testing.Context.charm_spec (#​2219)

Documentation

  • Fix charmcraft init command (#​2210)
  • Update CI examples to use uv and tox-uv (#​2213)
  • Update and clarify info about environment prep (#​2217)
  • Match Charmcraft profiles in tox.ini example for integration testing (#​2221)
  • Use base 24.04 for httpbin-demo charm (#​2222)
  • Clarify parts of the machine charm tutorial (#​2223)
  • Match Charmcraft profiles in "Write and structure charm code" (#​2220)
  • Use cosl binary in K8s tutorial charm to work around error (#​2232)
  • Fix URL issues by updating doc starter pack (#​2238)

Tests

  • Don't skip tests if ops[testing] isn't installed (#​2215)
  • Switch the integration test charms to use the uv plugin (#​2218)

CI

  • Avoid jitter in the best practice doc PRs (#​2193)
  • Ignore PERF401 (manual list comprehension) across the repo (#​2201)
  • The git commands need to be run in the operator directory as well (#​2197)
  • Have cycle in the sbomber manifests use the default value (#​2209)
  • Add pytest.warns to note an expected warning (#​2092)
  • Update release script to handle non-final versions (#​2199)
  • Add ops-tracing as a dependency for the observability tests (#​2239)
  • Add scheduled workflow for packing and integration testing example charms (#​2233)

v3.4.0

Compare Source

Breaking Changes

  • Fix: Change JujuContext.machine_id from int to str (#​2108)
  • Fix: Ensure that the testing context manager is exited when an exception occurs (#​2117)

Features

  • Add a low-level API for the Juju hook commands (#​2019)
  • Make PebbleClient file methods also accept pathlib.PurePath (#​2097)
  • Log the total number of deferred events (#​2161)
  • Allow setting the Juju availability zone and principal unit in the testing Context (#​2187)

Fixes

  • Allow actions without params or descriptions in ops[testing] (#​2090)
  • Ensure ops.Pebble.pull cleans up temporary files if it errors (#​2087)
  • Make secret info description visible to the charm in ops[testing] (#​2115)
  • Raise ActionFailed when using Context as a context manager (#​2121)
  • Detect categories with an exclamation mark indicating breaking changes (#​2132)
  • Normalise Secret.owner to 'app' for ops[testing] output state (#​2127)
  • Don't cache secret metadata in Ops (#​2143)
  • Secret-info-get cannot be provided with both an ID and a label (#​2170)
  • Minor hookcmds fixes (#​2175)

Documentation

  • Update referenced examples for managing interfaces (#​2068)
  • Tidy up spelling and formatting in several places (#​2060)
  • Add missing assignment to state_out in unit tests how-to (#​2075)
  • Update the holistic/delta explanation with the reconciler pattern (#​2029)
  • Fix broken setup/teardown links in README (#​2094)
  • Update info about release docs, mark testing changelog as not maintained (#​2074)
  • Switch to makefile for building the docs (#​2073)
  • Document how to extract the charm instance from the testing context (#​2084)
  • Add a how-to guide for migrating away from Harness (#​2062)
  • Rename hook tools to hook commands (#​2114)
  • Remove legacy how-to guide for Harness (#​2122)
  • Update the Juju release the metrics functionality is removed from 4.0 to 3.6.11 (#​2126)
  • Clarify that Context is the testing context not only the Juju context (#​2123)
  • Explain the Charmhub public listing process and add a reference list of best practices (#​1989)
  • Expand next steps for K8s tutorial (#​2034)
  • Remove mention of the simple Charmcraft profile (#​2138)
  • Expand landing pages with summaries of pages (#​2140)
  • Update environment setup for integration tests and K8s tutorial (#​2124)
  • Replace machine charm tutorial by an improved tutorial (#​2119)
  • Change HACKING.md instructions for maintaining Charmcraft profiles (#​2151)
  • In integration tests, use consistent approach to logging and packing (#​2150)
  • In integration testing how-to, clarify that Juju model is destroyed after all tests in the model complete (#​2154)
  • Remove Charmcraft channel specifier from machine charm tutorial (#​2148)
  • Add AI contribution note and style guideline for type annotation of return values (#​2168)
  • Add ops[testing] to the ops.testing docstring (#​2171)
  • Add links to the Juju hook from each event class (#​2176)
  • Add a short umask note (#​2184)

Tests

  • Re-enable testing consistency checks after disabling them (#​2141)
  • Expand secrets integration and state transition tests (#​2130)

Refactoring

  • Use ops.hookcmds in _ModelBackend (#​2116)
  • Don't get the storage details from --help (#​2172)
  • Drop 3.8 and 3.9 compatibility code (#​2173)
  • Use json.dumps to produce the YAML in relation-set and state-set (#​2174)
  • Rely on type annotations instead of casts in hookcmds (#​2179)

CI

  • Add integration and state transition tests for the secrets API (#​2078)
  • Temporarily disable tracing integration tests (#​2102)
  • Add secrets tests follow-up (#​2105)
  • Support monorepos in ops charm compatibility testing (#​2100)
  • Test both Charmcraft 3 and Charmcraft 4 profiles (#​2103)
  • Add automated doc checks (and related starter pack updates) (#​2099)
  • Clean up accidental workflow trigger (#​2144)
  • Test if package versions match dependency versions before publishing (#​2139)
  • Update spelling (#​2167)
  • Test against 4.0/stable (#​2186)
  • Store charmcraft logs if smoke tests fail (#​2192)
  • Use Juju channel 4/stable in Ops smoke tests (#​2190)

v3.3.1: : fix loading the Juju machine ID

Compare Source

This is a bug-fix release to fix an issue introduced in Ops 3.3.0 (in production) and Ops 3.2.0 (in testing), where loading the Juju machine ID would fail if the ID was not an integer.

The type of the machine ID (both in ops.JujuContext and testing.Context) is changed from int to str, so some code or tests may need to be adjusted to use the correct type.

What's Changed
Fixes
  • Change JujuContext.machine_id from int to str (#​2108)

Full Changelog: canonical/operator@3.3.0...3.3.1

v3.3.0

Compare Source

Features

  • Expose the Juju hook context in ops.JujuContext (#​1996)

Fixes

  • In testing, separate relation data cache from mock Juju backend (#​2052)

Documentation

  • Use uv for testing and packing the httpbin charm (#​2011)
  • Improve intro to ops.testing reference (#​2023)
  • In httpbin charm integration tests, add env var for charm file to deploy (#​2018)
  • Update get_cloud_spec doc now that credential-get works on K8s (#​2031)
  • Note that arbitrary_types_allowed is required when ops.Secret is used in a Pydantic class (#​2038)
  • Clean up Resources.fetch docstring, add ModelError exception (#​2039)
  • Note that the peer databag isn't usable during the install event (#​2051)
  • Fix testing code in actions how-to guide (#​2054)

CI

  • Nicer logging output in the release script using rich (#​2017)
  • Clean up PYTHONPATH in tox.ini (#​2058)

v3.2.0

Compare Source

Features

  • Add security event logging (#​1905)
  • Surface JUJU_MACHINE_ID envvar in testing env (#​1961)
  • Add a new log target type opentelemetry (#​1937)

Documentation

  • Update links and config for switch to documentation.ubuntu.com/ops (#​1940)
  • Update the required Python version and note the 2.x documentation site (#​1946)
  • Be consistent with recommending self.config (#​1947)
  • Use latest styles from starter pack and remove .html extensions (#​1951)
  • Remove .html extensions from hardcoded links (#​1955)
  • Fix broken URLs in sitemap (#​1956)
  • Add related doc links to homepage (#​1959)
  • Use classes from ops instead of ops. (#​1968)
  • Fix unstyled error pages (#​1969)
  • Add Google Analyics integration and cookie consent banner (#​1971)
  • Refresh docs homepage with more context about Ops (#​1964)
  • Update link to Charmlibs docs (#​1985)
  • Remove unnecessary pages from sitemap (#​1979)
  • Update the httpbin example charm to Jubilant (#​1987)
  • Update the Zero to Hero tutorial to Jubilant (#​1988)
  • Add model-config best practice note (#​1990)
  • Change some best practices to tips (#​2001)
  • Add integration test for invalid config in httpbin charm (#​2002)
  • Make a Layer instead of a LayerDict in the httpbin charm (#​2003)
  • Update how-to to feature Jubilant (#​2000, #​2004)
  • Use Charmcraft-style format and lint for example charms, not Ops-style (#​2008)
  • Update broken link to HookVars source code (#​2006)

CI

  • Fixes for the SBOM and security scan workflow, and trigger it on publishing (#​1916)
  • Store the charmcraft logs if packing fails (#​1936)
  • Install release dependencies for the TIOBE analysis (#​1930)
  • Add Juju 4/beta to the smoke test matrix (#​1963)
  • Adjust permissions block in publish workflow (#​1984)
  • Update actions/checkout to v5 (#​1993)
  • Enable doctests (#​1991)
  • Ignore juju/4 timeouts (#​1998)
  • Remove the token for SBOM and security scan workflow (#​2009)
  • Speed up integration test (#​1978)

v3.1.0

Compare Source

Features

  • Release automation script (#​1855)
  • Add app_name and unit_id attributes to testing.context (#​1920)

Fixes

  • If an event ends with _abort(0) tests should behave as if it ended successfully (#​1887)
  • If self.app is not actually set avoid a new crash location (#​1897)
  • Only add the remote unit for departed and broken relation events, fix ordering (#​1918)
  • Add the remote unit to relation.data but not relation.units (#​1925)

Documentation

  • Use load_config in the httpbin example charm (#​1852)
  • Update HACKING.md with how to bump ops version in Charmcraft profiles (#​1872)
  • Change title of docs site (#​1890)
  • Use config and action classes in the Kubernetes tutorial (#​1891)
  • Reference example charms from K8s tutorial and fix consistency (#​1898)
  • Update style guide (#​1720)
  • Fix issues in how-to guide for stored state (#​1901)
  • Link out to the 12-factor tutorials from the tutorial index page (#​1902)
  • Replace broken link in testing explanation (#​1913)
  • Expand the storage how-to with content from Juju docs scheduled for removal (#​1915)
  • Ops tracing how to (#​1853)
  • Add a security explanation doc (#​1904)

Tests

  • Replace Python version to 3.10 for observability charm tests (#​1914)

CI

  • Use httpbin demo charm for the Charmcraft pack test (#​1895)
  • Move TIOBE workflow to self-hosted runners (#​1912)
  • Add SBOM generation and secscan workflow (#​1906)
  • Build and publish in one step (#​1857)
  • Update the name and email when updating the charm pins (#​1924)
  • Drop smoke test against 20.04 (#​1923)

v3.0.0

Compare Source

The minimum version of Python for Ops 3.x is 3.10.

Documentation

  • Be consistent with recommending self.app and self.unit (#​1856)

CI

  • Hotfix, publish job for ops-tracing (#​1865)

v2.23.1: : Add the remote unit to Relation.data, but not Relation.units

Compare Source

This is a small bug-fix release for the 2.x series that addresses issues with the recent feature making relation data available in relation-departed events. Rather than inserting the remote unit into Relation.units, the data is available from Relation.data, without changing Relation.units.

What's Changed

Fixes
  • Add the remote unit to Relation.data but not Relation.units in #​1928
Documentation
  • Be consistent with recommending self.app and self.unit in #​1856
  • Add notice about ops 2 and ops 3 in #​1867
  • Update title and edit links for ops 2.23 docs in #​1885
CI
  • Hotfix, publish job for ops-tracing in #​1865

Full Changelog: canonical/operator@2.23.0...2.23.1

v2.23.0

Compare Source

Features

  • Support for config schema as Python classes (#​1741)
  • Support for action parameter schema as Python classes (#​1756)
  • Ops[tracing] compatibility with jhack (#​1806)
  • Support for relation data schema as Python classes (#​1701)
  • Add CheckInfo.successes field and .has_run property (#​1819)
  • Provide a method to create a testing.State from a testing.Context (#​1797)
  • Expose trace data in testing (#​1842)
  • Add a helper to generate a Layer from rockcraft.yaml (#​1831)

Fixes

  • Correctly load an empty Juju config options map (#​1778)
  • Fix type annotation of container check_infos in ops.testing (#​1784)
  • Restrict the version of a dependency, opentelemetry-sdk (#​1794)
  • Remote unit data is available in relation-departed (#​1364)
  • Juju allows access to the remote app databag in relation-broken, so Harness should too (#​1787)
  • Don't use private OpenTelemetry API (#​1798)
  • Do not return this unit in a mocked peer relation (#​1828)
  • Testing.PeerRelation properly defaults to no peers (#​1832)
  • In meter-status-changed JUJU_VERSION is not set (#​1840)
  • Only provide the units belonging to the app in Relation.units (#​1837)

Documentation

  • Remove two best practices, and drop two to tips (#​1758)
  • Update link to Charmcraft for managing app config (#​1763)
  • Update link to Juju documentation for setting up deployment (#​1781)
  • Fix external OTLP link (#​1786)
  • Distribute the ops-scenario README content across the ops docs (#​1773)
  • Improve testing.errors.UncaughtCharmError message (#​1795)
  • In the "manage the charm version" how-to, give an example of using override-build (#​1802)
  • Small adjustments to the 'how to trace charm code' doc (#​1792)
  • Replace Harness example and fix links in README (#​1820)
  • Add httpbin charm from Charmcraft as an example charm (#​1743)
  • Fix on_collect mistake in sample code (#​1829)
  • Update code in K8s tutorial, with source in repo (part 2) (#​1734)
  • Update Loki section on charming zero-to-hero tutorial (#​1847)
  • Remove expandable boxes of text (#​1844)
  • Improve httpbin charm by removing defer() and adding collect_status (#​1833)
  • Move {posargs} to the end of pytest command lines in tox.ini (#​1854)

CI

  • Install the ops[tracing] dependencies for the TIOBE action (#​1761)
  • Add ops-scenario and ops-tracing as explicit installs for TIOBE (#​1764)
  • Persist credentials for update-charm-pins workflow (#​1766)
  • Stop smoke testing Charmcraft 2 (#​1782)
  • Use Charmcraft 3.x for smoke testing 20.04 and 22.04 (#​1821)
  • Enable xdist for the 'unit' tox environments (#​1830)

v2.22.0

Compare Source

Features

Fixes

  • Turn on databag access validation in __init__ (#​1737)
  • Allow event suffixes to appear in event names in ops.testing (#​1754)

Documentation

  • Document how to manage metrics (#​1692)
  • Link to our docs from the top of our README (#​1710)
  • Update code in K8s tutorial, with source in repo (part 1) (#​1719)
  • Update links to juju.is/docs (#​1725)
  • Fix link in breakpoint output, remove link from Harness error message (#​1726)
  • Update Matrix channel name to Charm Tech (#​1740)
  • Rename configurations to configuration (#​1746)
  • Fix typos in code snippets by @​MattiaSarti (#​1750)

CI

  • Add ops[tracing] integration tests (#​1686)
  • Pin workflows by hash (#​1721)
  • Disable alertmanager compatibility tests until upstream fix (#​1745)
  • Remove explicit scopes and update HACKING.md (#​1748)
  • Pin trusted workflows by tag (#​1752)
  • Re-enable alertmanager-k8s-operator in observability charm tests (#​1753)
  • Fix reporting to TIOBE after ops[tracing] addition (#​1755)
pyca/pyopenssl (pyOpenSSL)

v25.3.0

Compare Source

Backward-incompatible changes:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Deprecations:
^^^^^^^^^^^^^

Changes:
^^^^^^^^

  • Maximum supported cryptography version is now 46.x.

v25.2.0

Compare Source

Backward-incompatible changes:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  • The minimum cryptography version is now 45.0.7.

Deprecations:
^^^^^^^^^^^^^

Changes:
^^^^^^^^

  • pyOpenSSL now sets SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER on connections by default, matching CPython's behavior.
  • Added OpenSSL.SSL.Context.clear_mode.
  • Added OpenSSL.SSL.Context.set_tls13_ciphersuites to set the allowed TLS 1.3 ciphers.
  • Added OpenSSL.SSL.Connection.set_info_callback

v25.1.0

Compare Source

Backward-incompatible changes:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Deprecations:
^^^^^^^^^^^^^

  • Attempting using any methods that mutate an OpenSSL.SSL.Context after it
    has been used to create an OpenSSL.SSL.Connection will emit a warning. In
    a future release, this will raise an exception.

Changes:
^^^^^^^^

  • cryptography maximum version has been increased to 45.0.x.

v25.0.0

Compare Source

Backward-incompatible changes:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Deprecations:
^^^^^^^^^^^^^

Changes:
^^^^^^^^

  • Corrected type annotations on Context.set_alpn_select_callback, Context.set_session_cache_mode, Context.set_options, Context.set_mode, X509.subject_name_hash, and X509Store.load_locations.
  • Deprecated APIs are now marked using warnings.deprecated. mypy will emit deprecation notices for them when used with --enable-error-code deprecated.
pytest-dev/pytest (pytest)

v9.0.2

Compare Source

pytest 9.0.2 (2025-12-06)

Bug fixes

  • #​13896: The terminal progress feature added in pytest 9.0.0 has been disabled by default, except on Windows, due to compatibility issues with some terminal emulators.

    You may enable it again by passing -p terminalprogress. We may enable it by default again once compatibility improves in the future.

    Additionally, when the environment variable TERM is dumb, the escape codes are no longer emitted, even if the plugin is enabled.

  • #​13904: Fixed the TOML type of the tmp_path_retention_count settings in the API reference from number to string.

  • #​13946: The private config.inicfg attribute was changed in a breaking manner in pytest 9.0.0.
    Due to its usage in the ecosystem, it is now restored to working order using a compatibility shim.
    It will be deprecated in pytest 9.1 and removed in pytest 10.

  • #​13965: Fixed quadratic-time behavior when handling unittest subtests in Python 3.10.

Improved documentation

  • #​4492: The API Reference now contains cross-reference-able documentation of pytest's command-line flags <command-line-flags>.

v9.0.1

Compare Source

pytest 9.0.1 (2025-11-12)

Bug fixes

  • #​13895: Restore support for skipping tests via raise unittest.SkipTest.
  • #​13896: The terminal progress plugin added in pytest 9.0 is now automatically disabled when iTerm2 is detected, it generated desktop notifications instead of the desired functionality.
  • #​13904: Fixed the TOML type of the verbosity settings in the API reference from number to string.
  • #​13910: Fixed UserWarning: Do not expect file_or_dir on some earlier Python 3.12 and 3.13 point versions.

Packaging updates and notes for downstreams

  • #​13933: The tox configuration has been adjusted to make sure the desired
    version string can be passed into its package_env through
    the SETUPTOOLS_SCM_PRETEND_VERSION_FOR_PYTEST environment
    variable as a part of the release process -- by webknjaz.

Contributor-facing changes

  • #​13891, #​13942: The CI/CD part of the release automation is now capable of
    creating GitHub Releases without having a Git checkout on
    disk -- by bluetech and webknjaz.
  • #​13933: The tox configuration has been adjusted to make sure the desired
    version string can be passed into its package_env through
    the SETUPTOOLS_SCM_PRETEND_VERSION_FOR_PYTEST environment
    variable as a part of the release process -- by webknjaz.

v9.0.0

Compare Source

pytest 9.0.0 (2025-11-05)

New features

  • #​1367: Support for subtests has been added.

    subtests <subtests> are an alternative to parametrization, useful in situations where the parametrization values are not all known at collection time.

    Example:

    def contains_docstring(p: Path) -> bool:
        """Return True if the given Python file contains a top-level docstring."""
        ...
    
    def test_py_files_contain_docstring(subtests: pytest.Subtests) -> None:
        for path in Path.cwd().glob("*.py"):
            with subtests.test(path=str(path)):
                assert contains_docstring(path)

    Each assert failure or error is caught by the context manager and reported individually, giving a clear picture of all files that are missing a docstring.

    In addition, unittest.TestCase.subTest is now also supported.

    This feature was originally implemented as a separate plugin in pytest-subtests, but since then has been merged into the core.

    [!NOTE]
    This feature is experimental and will likely evolve in future releases. By that we mean that we might change how subtests are reported on failure, but the functionality and how to use it are stable.

  • #​13743: Added support for native TOML configuration files.

    While pytest, since version 6, supports configuration in pyproject.toml files under [tool.pytest.ini_options],
    it does so in an "INI compatibility mode", where all configuration values are treated as strings or list of strings.
    Now, pytest supports the native TOML data model.

    In pyproject.toml, the native TOML configuration is under the [tool.pytest] table.

    # pyproject.toml
    [tool.pytest]
    minversion = "9.0"
    addopts = ["-ra", "-q"]
    testpaths = [
        "tests",
        "integration",
    ]

    The [tool.pytest.ini_options] table remains supported, but both tables cannot be used at the same time.

    If you prefer to use a separate configuration file, or don't use pyproject.toml, you can use pytest.toml or .pytest.toml:

    # pytest.toml or .pytest.toml
    [pytest]
    minversion = "9.0"
    addopts = ["-ra", "-q"]
    testpaths = [
        "tests",
        "integration",
    ]

    The documentation now (sometimes) shows configuration snippets in both TOML and INI formats, in a tabbed interface.

    See config file formats for full details.

  • #​13823: Added a "strict mode" enabled by the strict configuration option.

    When set to true, the strict option currently enables

    • strict_config
    • strict_markers
    • strict_parametrization_ids
    • strict_xfail

    The individual strictness options can be explicitly set to override the global strict setting.

    The previously-deprecated --strict command-line flag now enables strict mode.

    If pytest adds new strictness options in the future, they will also be enabled in strict mode.
    Therefore, you should only enable strict mode if you use a pinned/locked version of pytest,
    or if you want to proactively adopt new strictness options as they are added.

    See strict mode for more details.

  • #​13737: Added the strict_parametrization_ids configuration option.

    When set, pytest emits an error if it detects non-unique parameter set IDs,
    rather than automatically making the IDs unique by adding 0, 1, ... to them.
    This can be particularly useful for catching unintended duplicates.

  • #​13072: Added support for displaying test session progress in the terminal tab using the OSC 9;4; ANSI sequence.
    When pytest runs in a supported terminal emulator like ConEmu, Gnome Terminal, Ptyxis, Windows Terminal, Kitty or Ghostty,
    you'll see the progress in the terminal tab or window,
    allowing you to monitor pytest's progress at a glance.

    This feature is automatically enabled when running in a TTY. It is implemented as an internal plugin. If needed, it can be disabled as follows:

    • On a user level, using -p no:terminalprogress on the command line or via an environment variable PYTEST_ADDOPTS='-p no:terminalprogress'.
    • On a project configuration level, using addopts = "-p no:terminalprogress".
  • #​478: Support PEP420 (implicit namespace packages) as --pyargs target when consider_namespace_packages is true in the config.

    Previously, this option only impacted package imports, now it also impacts tests discovery.

  • #​13678: Added a new faulthandler_exit_on_timeout configuration option set to "false" by default to let faulthandler interrupt the pytest process after a timeout in case of deadlock.

    Previously, a faulthandler timeout would only dump the traceback of all threads to stderr, but would not interrupt the pytest process.

    -- by ogrisel.

  • #​13829: Added support for configuration option aliases via the aliases parameter in Parser.addini() <pytest.Parser.addini>.

    Plugins can now register alternative names for configuration options,
    allowing for more flexibility in configuration naming and supporting backward compatibility when renaming options.
    The canonical name always takes precedence if both the canonical name and an alias are specified in the configuration file.

Improvements in existing functionality

  • #​13330: Having pytest configuration spread over more than one file (for example having both a pytest.ini file and pyproject.toml with a [tool.pytest.ini_options] table) will now print a warning to make it clearer to the user that only one of them is actually used.

    -- by sgaist

  • #​13574: The single argument --version no longer loads the entire plugin infrastructure, making it faster and more reliable when displaying only the pytest version.

    Passing --version twice (e.g., pytest --version --version) retains the original behavior, showing both the pytest version and plugin information.

    [!NOTE]
    Since --version is now processed early, it only takes effect when passed directly via the command line. It will not work if set through other mechanisms, such as PYTEST_ADDOPTS or addopts.

  • #​13823: Added strict_xfail as an alias to the xfail_strict option,
    strict_config as an alias to the --strict-config flag,
    and strict_markers as an alias to the --strict-markers flag.
    This makes all strictness options consistently have configuration options with the prefix strict_.

  • #​13700: --junitxml no longer prints the generated xml file summary at the end of the pytest session when --quiet is given.

  • #​13732: Previously, when filtering warnings, pytest would fail if the filter referenced a class that could not be imported. Now, this only outputs a message indicating the problem.

  • #​13859: Clarify the error message for pytest.raises() when a regex match fails.

  • #​13861: Better sentence structure in a test's expected error message. Previously, the error message would be "expected exception must be <expected>, but got <actual>". Now, it is "Expected <expected>, but got <actual>".

Removals and backward incompatible breaking changes

  • #​12083: Fixed a bug where an invocation such as pytest a/ a/b would cause only tests from a/b to run, and not other tests under a/.

    The fix entails a few breaking changes to how such overlapping arguments and duplicates are handled:

    1. pytest a/b a/ or pytest a/ a/b are equivalent to pytest a; if an argument overlaps another arguments, only the prefix remains.
    2. pytest x.py x.py is equivalent to pytest x.py; previously such an invocation was taken as an explicit request to run the tests from the file twice.

    If you rely on these behaviors, consider using --keep-duplicates <duplicate-paths>, which retains its existing behavior (including the bug).

  • #​13719: Support for Python 3.9 is dropped following its end of life.

  • #​13766: Previously, pytest would assume it was running in a CI/CD environment if either of the environment variables $CI or $BUILD_NUMBER was defined;
    now, CI mode is only activated if at least one of those variables is defined and set to a non-empty value.

  • #​13779: PytestRemovedIn9Warning deprecation warnings are now errors by default.

    Following our plan to remove deprecated features with as little disruption as
    possible, all warnings of type PytestRemovedIn9Warning now generate errors
    instead of warning messages by default.

    The affected features will be effectively removed in pytest 9.1, so please consult the
    deprecations section in the docs for directions on how to update existing code.

    In the pytest 9.0.X series, it is possible to change the errors back into warnings as a
    stopgap measure by adding this to your pytest.ini file:

    [pytest]
    filterwarnings =
        ignore::pytest.PytestRemovedIn9Warning

    But this will stop working when pytest 9.1 is released.

    If you have concerns about the removal of a specific feature, please add a
    comment to 13779.

Deprecations (removal in next major release)

  • #​13807: monkeypatch.syspath_prepend() <pytest.MonkeyPatch.syspath_prepend> now issues a deprecation warning when the prepended path contains legacy namespace packages (those using pkg_resources.declare_namespace()).
    Users should migrate to native namespace packages (420).
    See monkeypatch-fixup-namespace-packages for details.

Bug fixes

  • #​13445: Made the type annotations of pytest.skip and friends more spec-complaint to have them work across more type checkers.

  • #​13537: Fixed a bug in which ExceptionGroup with only Skipped exceptions in teardown was not handled correctly and showed as error.

  • #​13598: Fixed possible collection confusion on Windows when short paths and symlinks are involved.

  • #​13716: Fixed a bug where a nonsensical invocation like pytest x.py[a] (a file cannot be parametrized) was silently treated as pytest x.py. This is now a usage error.

  • #​13722: Fixed a misleading assertion failure message when using pytest.approx on mappings with differing lengths.

  • #​13773: Fixed the static fixture closure calculation to properly consider transitive dependencies requested by overridden fixtures.

  • #​13816: Fixed pytest.approx which now returns a clearer error message when comparing mappings with different keys.

  • [#​13849](https://redirect.github.com/


Configuration

📅 Schedule: Branch creation - Between 01:00 AM and 05:59 AM, only on Tuesday ( * 1-5 * * 2 ) in timezone Etc/UTC, 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 renovate bot added the not bug or enhancement PR is not 'bug' or 'enhancement'. For release notes label Jan 20, 2026
@renovate
Copy link
Contributor Author

renovate bot commented Jan 20, 2026

⚠️ Artifact update problem

Renovate failed to update an artifact related to this branch. You probably do not want to merge this PR as-is.

♻ Renovate will retry this branch, including artifacts, only when one of the following happens:

  • any of the package files in this branch needs updating, or
  • the branch becomes conflicted, or
  • you click the rebase/retry checkbox if found above, or
  • you rename this PR's title to start with "rebase!" to trigger it manually

The artifact failure details are included below:

File name: poetry.lock
Updating dependencies
Resolving dependencies...


Because pyopenssl (25.3.0) depends on cryptography (>=45.0.7,<47)
 and no versions of pyopenssl match >25.3.0,<26.0.0, pyOpenSSL (>=25.3.0,<26.0.0) requires cryptography (>=45.0.7,<47).
So, because non-package-mode depends on both pyOpenSSL (^25.3.0) and cryptography (^42.0.5), version solving failed.

@renovate renovate bot force-pushed the renovate/major-python-dependencies branch from 79c019e to e4d4e41 Compare February 3, 2026 02:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

not bug or enhancement PR is not 'bug' or 'enhancement'. For release notes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants