A decorator for caching properties in classes.

Overview

cached-property

Github Actions status PyPI Code style: black

A decorator for caching properties in classes.

Why?

  • Makes caching of time or computational expensive properties quick and easy.
  • Because I got tired of copy/pasting this code from non-web project to non-web project.
  • I needed something really simple that worked in Python 2 and 3.

How to use it

Let's define a class with an expensive property. Every time you stay there the price goes up by $50!

class Monopoly(object):

    def __init__(self):
        self.boardwalk_price = 500

    @property
    def boardwalk(self):
        # In reality, this might represent a database call or time
        # intensive task like calling a third-party API.
        self.boardwalk_price += 50
        return self.boardwalk_price

Now run it:

>>> monopoly = Monopoly()
>>> monopoly.boardwalk
550
>>> monopoly.boardwalk
600

Let's convert the boardwalk property into a cached_property.

from cached_property import cached_property

class Monopoly(object):

    def __init__(self):
        self.boardwalk_price = 500

    @cached_property
    def boardwalk(self):
        # Again, this is a silly example. Don't worry about it, this is
        #   just an example for clarity.
        self.boardwalk_price += 50
        return self.boardwalk_price

Now when we run it the price stays at $550.

>>> monopoly = Monopoly()
>>> monopoly.boardwalk
550
>>> monopoly.boardwalk
550
>>> monopoly.boardwalk
550

Why doesn't the value of monopoly.boardwalk change? Because it's a cached property!

Invalidating the Cache

Results of cached functions can be invalidated by outside forces. Let's demonstrate how to force the cache to invalidate:

>>> monopoly = Monopoly()
>>> monopoly.boardwalk
550
>>> monopoly.boardwalk
550
>>> # invalidate the cache
>>> del monopoly.__dict__['boardwalk']
>>> # request the boardwalk property again
>>> monopoly.boardwalk
600
>>> monopoly.boardwalk
600

Working with Threads

What if a whole bunch of people want to stay at Boardwalk all at once? This means using threads, which unfortunately causes problems with the standard cached_property. In this case, switch to using the threaded_cached_property:

from cached_property import threaded_cached_property

class Monopoly(object):

    def __init__(self):
        self.boardwalk_price = 500

    @threaded_cached_property
    def boardwalk(self):
        """threaded_cached_property is really nice for when no one waits
            for other people to finish their turn and rudely start rolling
            dice and moving their pieces."""

        sleep(1)
        self.boardwalk_price += 50
        return self.boardwalk_price

Now use it:

>>> from threading import Thread
>>> from monopoly import Monopoly
>>> monopoly = Monopoly()
>>> threads = []
>>> for x in range(10):
>>>     thread = Thread(target=lambda: monopoly.boardwalk)
>>>     thread.start()
>>>     threads.append(thread)

>>> for thread in threads:
>>>     thread.join()

>>> self.assertEqual(m.boardwalk, 550)

Working with async/await (Python 3.5+)

The cached property can be async, in which case you have to use await as usual to get the value. Because of the caching, the value is only computed once and then cached:

from cached_property import cached_property

class Monopoly(object):

    def __init__(self):
        self.boardwalk_price = 500

    @cached_property
    async def boardwalk(self):
        self.boardwalk_price += 50
        return self.boardwalk_price

Now use it:

>>> async def print_boardwalk():
...     monopoly = Monopoly()
...     print(await monopoly.boardwalk)
...     print(await monopoly.boardwalk)
...     print(await monopoly.boardwalk)
>>> import asyncio
>>> asyncio.get_event_loop().run_until_complete(print_boardwalk())
550
550
550

Note that this does not work with threading either, most asyncio objects are not thread-safe. And if you run separate event loops in each thread, the cached version will most likely have the wrong event loop. To summarize, either use cooperative multitasking (event loop) or threading, but not both at the same time.

Timing out the cache

Sometimes you want the price of things to reset after a time. Use the ttl versions of cached_property and threaded_cached_property.

import random
from cached_property import cached_property_with_ttl

class Monopoly(object):

    @cached_property_with_ttl(ttl=5) # cache invalidates after 5 seconds
    def dice(self):
        # I dare the reader to implement a game using this method of 'rolling dice'.
        return random.randint(2,12)

Now use it:

>>> monopoly = Monopoly()
>>> monopoly.dice
10
>>> monopoly.dice
10
>>> from time import sleep
>>> sleep(6) # Sleeps long enough to expire the cache
>>> monopoly.dice
3
>>> monopoly.dice
3

Note: The ttl tools do not reliably allow the clearing of the cache. This is why they are broken out into seperate tools. See https://github.com/pydanny/cached-property/issues/16.

Credits

  • Pip, Django, Werkzueg, Bottle, Pyramid, and Zope for having their own implementations. This package originally used an implementation that matched the Bottle version.
  • Reinout Van Rees for pointing out the cached_property decorator to me.
  • My awesome wife @audreyfeldroy who created cookiecutter, which meant rolling this out took me just 15 minutes.
  • @tinche for pointing out the threading issue and providing a solution.
  • @bcho for providing the time-to-expire feature
Comments
  • Contribute implementation to Python

    Contribute implementation to Python

    See http://bugs.python.org/issue21145. All we need to add is the TTL feature that other implementations like pip and werkzeug and Django have.

    This package already has some basic testing and it would be nice to start from there.

    opened by thedrow 18
  • Misc improvements

    Misc improvements

    • Fixed threaded_cached_property_with_ttl to actually be thread-safe.
    • Allow the del statement for resetting cached properties with ttl instead of del obj._cache[attr].
    • Overall code and test refactoring.
    opened by gsakkis 9
  • drop some non-ASCII characters from HISTORY.rst

    drop some non-ASCII characters from HISTORY.rst

    This file was using some odd unicode character instead of a normal apostrophe in a couple of places. Replace one occurrence with a normal apostrophe and remove the other (the possessive "its" does not contain an apostrophe).

    This could cause a problem when setup.py does this:

    history = open('HISTORY.rst').read().replace('.. :changelog:', '')
    

    In Python 3, when you do open().read(), a unicode decode occurs. The 'default' encoding used in this case depends on details of system configuration, for instance the locale. In some cases, it can be ASCII - and so when the file contains non-ASCII characters, this causes a traceback. (This was happening in the Fedora buildsystem; presumably our buildbots don't have a UTF-8 locale).

    We could do this:

    history = open('HISTORY.rst', encoding='utf-8').read().replace('.. :changelog:', '')
    

    but that's not valid in Python 2, open() does not have the encoding argument there. So at that point I figured it was easier to just find the non-ASCII characters and fix those than try and figure out a fix for reading non-ASCII chars that's safe for both Pythons.

    opened by AdamWill 7
  • versions >= 1.0.0: can't clear cached properties

    versions >= 1.0.0: can't clear cached properties

    Hi

    I've using cached_property since 0.1.5 - I see it's now declared 1.0.0 - I'm using it with python 2.7.8

    Well I had some regressions since I started using 1.0.0 - I can't seem to invalidate the cache - either through the way listed on pypy:

    del Instance[attribute]
    

    or the old tried and true way which worked when the data was not cached yet:

    try:
         delattr(instance, pname)
    except AttributeError:
         pass
    

    As of right now, the only way I could get it to invalidate the cached entries, whether or not they are populated is this:

         try:
            del instance._cache[pname]
        except KeyError as e:
             pass
    

    To be clear I haven't been able to clear the cache at all in any other way than the above direct mangling with _cache.

    Is this a regression on your side? Is the documentation up to date with how you expect to clear the cache?

    I think with something this big, if valid, needs to have the pypy package updated asap!

    opened by nevion 6
  • Better multithreading support

    Better multithreading support

    Example at https://gist.github.com/Tinche/e092adeb8171fd0843dd will print out "Cached method called 10 times" where ideally it would only be called once.

    I'd suggest documenting this fact or doing something about it :)

    enhancement 
    opened by Tinche 6
  • Facade for all cached property variants

    Facade for all cached property variants

    This PR hides all the various cached property implementations behind a single cachedproperty callable, which is easier to read, write and extend with more options in the future. I picked this name instead of cached_property to avoid the potential backwards incompatibility (in case some code out there relies on it being a descriptor class instead of a function) and also to be similar to staticmethod and classmethod that don't use underscores either, but I don't mind renaming to something else if you prefer.

    opened by gsakkis 5
  • cached_property is settable while property isn't

    cached_property is settable while property isn't

    A property without __set__ raises an AttributeError. Cached property does not raise an AttributeError when being set. Is that an implementation defect or intentional? Shouldn't it behave like a read-only property behaves in terms of writeability?

    question 
    opened by omerzimp 5
  • Also catch `SyntaxError` from asyncio import

    Also catch `SyntaxError` from asyncio import

    Apparently, asyncio is installable in python 2 and an import can trigger this:

    pip install asyncio cached-property
    python -c 'import cached_property'
    
    $ python -c 'import cached_property'
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/tmp/venv/lib/python2.7/site-packages/cached_property.py", line 12, in <module>
        import asyncio
      File "/private/tmp/venv/lib/python2.7/site-packages/asyncio/__init__.py", line 9, in <module>
        from . import selectors
      File "/private/tmp/venv/lib/python2.7/site-packages/asyncio/selectors.py", line 39
        "{!r}".format(fileobj)) from None
                                   ^
    SyntaxError: invalid syntax
    

    Originally seen in https://github.com/pre-commit/pre-commit/issues/766

    opened by asottile 4
  • Some test failing on python2 (Debian)

    Some test failing on python2 (Debian)

    I had to disable the tests on python 2.7 (building foor Debian) because of syntax errors in some tests. Could those tests be made aware of used Python version?

    Thanks, Mathias

    The relevant bits:

    dh_auto_test -O--buildsystem=pybuild I: pybuild base:217: cd /<>/.pybuild/cpython2_2.7_cached-property/build; python2.7 -m unittest discover -v tests.test_coroutine_cached_property (unittest.loader.ModuleImportFailure) ... ERROR tests.test_async_cached_property (unittest.loader.ModuleImportFailure) ... ERROR test_cached_property (tests.test_cached_property.TestCachedProperty) ... ok test_none_cached_property (tests.test_cached_property.TestCachedProperty) ... ok test_reset_cached_property (tests.test_cached_property.TestCachedProperty) ... ok test_set_cached_property (tests.test_cached_property.TestCachedProperty) ... ok test_threads (tests.test_cached_property.TestCachedProperty) ... ok test_cached_property (tests.test_cached_property.TestCachedPropertyWithTTL) ... ok test_none_cached_property (tests.test_cached_property.TestCachedPropertyWithTTL) ... ok test_reset_cached_property (tests.test_cached_property.TestCachedPropertyWithTTL) ... ok test_set_cached_property (tests.test_cached_property.TestCachedPropertyWithTTL) ... ok test_threads (tests.test_cached_property.TestCachedPropertyWithTTL) ... ok test_threads_ttl_expiry (tests.test_cached_property.TestCachedPropertyWithTTL) ... ok test_ttl_expiry (tests.test_cached_property.TestCachedPropertyWithTTL) ... ok test_cached_property (tests.test_cached_property.TestThreadedCachedProperty) ... ok test_none_cached_property (tests.test_cached_property.TestThreadedCachedProperty) ... ok test_reset_cached_property (tests.test_cached_property.TestThreadedCachedProperty) ... ok test_set_cached_property (tests.test_cached_property.TestThreadedCachedProperty) ... ok test_threads (tests.test_cached_property.TestThreadedCachedProperty) ... ok test_cached_property (tests.test_cached_property.TestThreadedCachedPropertyWithTTL) ... ok test_none_cached_property (tests.test_cached_property.TestThreadedCachedPropertyWithTTL) ... ok test_reset_cached_property (tests.test_cached_property.TestThreadedCachedPropertyWithTTL) ... ok test_set_cached_property (tests.test_cached_property.TestThreadedCachedPropertyWithTTL) ... ok test_threads (tests.test_cached_property.TestThreadedCachedPropertyWithTTL) ... ok test_threads_ttl_expiry (tests.test_cached_property.TestThreadedCachedPropertyWithTTL) ... ok test_ttl_expiry (tests.test_cached_property.TestThreadedCachedPropertyWithTTL) ... ok

    ====================================================================== ERROR: tests.test_coroutine_cached_property (unittest.loader.ModuleImportFailure)

    ImportError: Failed to import test module: tests.test_coroutine_cached_property Traceback (most recent call last): File "/usr/lib/python2.7/unittest/loader.py", line 254, in _find_tests module = self._get_module_from_name(name) File "/usr/lib/python2.7/unittest/loader.py", line 232, in _get_module_from_name import(name) File "tests/test_coroutine_cached_property.py", line 60 value = yield from check.add_control() ^ SyntaxError: invalid syntax

    ====================================================================== ERROR: tests.test_async_cached_property (unittest.loader.ModuleImportFailure)

    ImportError: Failed to import test module: tests.test_async_cached_property Traceback (most recent call last): File "/usr/lib/python2.7/unittest/loader.py", line 254, in _find_tests module = self._get_module_from_name(name) File "/usr/lib/python2.7/unittest/loader.py", line 232, in _get_module_from_name import(name) File "tests/test_async_cached_property.py", line 34 async def add_control(self): ^ SyntaxError: invalid syntax

    opened by mbehrle 4
  • Update pytest to 7.1.2

    Update pytest to 7.1.2

    This PR updates pytest from 3.8.2 to 7.1.2.

    Changelog

    7.1.2

    =========================
    
    Bug Fixes
    ---------
    
    - `9726 &lt;https://github.com/pytest-dev/pytest/issues/9726&gt;`_: An unnecessary ``numpy`` import inside :func:`pytest.approx` was removed.
    
    
    - `9820 &lt;https://github.com/pytest-dev/pytest/issues/9820&gt;`_: Fix comparison of  ``dataclasses`` with ``InitVar``.
    
    
    - `9869 &lt;https://github.com/pytest-dev/pytest/issues/9869&gt;`_: Increase ``stacklevel`` for the ``NODE_CTOR_FSPATH_ARG`` deprecation to point to the
    user&#x27;s code, not pytest.
    
    
    - `9871 &lt;https://github.com/pytest-dev/pytest/issues/9871&gt;`_: Fix a bizarre (and fortunately rare) bug where the `temp_path` fixture could raise
    an internal error while attempting to get the current user&#x27;s username.
    

    7.1.1

    =========================
    
    Bug Fixes
    ---------
    
    - `9767 &lt;https://github.com/pytest-dev/pytest/issues/9767&gt;`_: Fixed a regression in pytest 7.1.0 where some conftest.py files outside of the source tree (e.g. in the `site-packages` directory) were not picked up.
    

    7.1.0

    =========================
    
    Breaking Changes
    ----------------
    
    - `8838 &lt;https://github.com/pytest-dev/pytest/issues/8838&gt;`_: As per our policy, the following features have been deprecated in the 6.X series and are now
    removed:
    
    * ``pytest._fillfuncargs`` function.
    
    * ``pytest_warning_captured`` hook - use ``pytest_warning_recorded`` instead.
    
    * ``-k -foobar`` syntax - use ``-k &#x27;not foobar&#x27;`` instead.
    
    * ``-k foobar:`` syntax.
    
    * ``pytest.collect`` module - import from ``pytest`` directly.
    
    For more information consult
    `Deprecations and Removals &lt;https://docs.pytest.org/en/latest/deprecations.html&gt;`__ in the docs.
    
    
    - `9437 &lt;https://github.com/pytest-dev/pytest/issues/9437&gt;`_: Dropped support for Python 3.6, which reached `end-of-life &lt;https://devguide.python.org/#status-of-python-branches&gt;`__ at 2021-12-23.
    
    
    
    Improvements
    ------------
    
    - `5192 &lt;https://github.com/pytest-dev/pytest/issues/5192&gt;`_: Fixed test output for some data types where ``-v`` would show less information.
    
    Also, when showing diffs for sequences, ``-q`` would produce full diffs instead of the expected diff.
    
    
    - `9362 &lt;https://github.com/pytest-dev/pytest/issues/9362&gt;`_: pytest now avoids specialized assert formatting when it is detected that the default ``__eq__`` is overridden in ``attrs`` or ``dataclasses``.
    
    
    - `9536 &lt;https://github.com/pytest-dev/pytest/issues/9536&gt;`_: When ``-vv`` is given on command line, show skipping and xfail reasons in full instead of truncating them to fit the terminal width.
    
    
    - `9644 &lt;https://github.com/pytest-dev/pytest/issues/9644&gt;`_: More information about the location of resources that led Python to raise :class:`ResourceWarning` can now
    be obtained by enabling :mod:`tracemalloc`.
    
    See :ref:`resource-warnings` for more information.
    
    
    - `9678 &lt;https://github.com/pytest-dev/pytest/issues/9678&gt;`_: More types are now accepted in the ``ids`` argument to ``pytest.mark.parametrize``.
    Previously only `str`, `float`, `int` and `bool` were accepted;
    now `bytes`, `complex`, `re.Pattern`, `Enum` and anything with a `__name__` are also accepted.
    
    
    - `9692 &lt;https://github.com/pytest-dev/pytest/issues/9692&gt;`_: :func:`pytest.approx` now raises a :class:`TypeError` when given an unordered sequence (such as :class:`set`).
    
    Note that this implies that custom classes which only implement ``__iter__`` and ``__len__`` are no longer supported as they don&#x27;t guarantee order.
    
    
    
    Bug Fixes
    ---------
    
    - `8242 &lt;https://github.com/pytest-dev/pytest/issues/8242&gt;`_: The deprecation of raising :class:`unittest.SkipTest` to skip collection of
    tests during the pytest collection phase is reverted - this is now a supported
    feature again.
    
    
    - `9493 &lt;https://github.com/pytest-dev/pytest/issues/9493&gt;`_: Symbolic link components are no longer resolved in conftest paths.
    This means that if a conftest appears twice in collection tree, using symlinks, it will be executed twice.
    For example, given
    
       tests/real/conftest.py
       tests/real/test_it.py
       tests/link -&gt; tests/real
    
    running ``pytest tests`` now imports the conftest twice, once as ``tests/real/conftest.py`` and once as ``tests/link/conftest.py``.
    This is a fix to match a similar change made to test collection itself in pytest 6.0 (see :pull:`6523` for details).
    
    
    - `9626 &lt;https://github.com/pytest-dev/pytest/issues/9626&gt;`_: Fixed count of selected tests on terminal collection summary when there were errors or skipped modules.
    
    If there were errors or skipped modules on collection, pytest would mistakenly subtract those from the selected count.
    
    
    - `9645 &lt;https://github.com/pytest-dev/pytest/issues/9645&gt;`_: Fixed regression where ``--import-mode=importlib`` used together with :envvar:`PYTHONPATH` or :confval:`pythonpath` would cause import errors in test suites.
    
    
    - `9708 &lt;https://github.com/pytest-dev/pytest/issues/9708&gt;`_: :fixture:`pytester` now requests a :fixture:`monkeypatch` fixture instead of creating one internally. This solves some issues with tests that involve pytest environment variables.
    
    
    - `9730 &lt;https://github.com/pytest-dev/pytest/issues/9730&gt;`_: Malformed ``pyproject.toml`` files now produce a clearer error message.
    

    7.0.1

    =========================
    
    Bug Fixes
    ---------
    
    - `9608 &lt;https://github.com/pytest-dev/pytest/issues/9608&gt;`_: Fix invalid importing of ``importlib.readers`` in Python 3.9.
    
    
    - `9610 &lt;https://github.com/pytest-dev/pytest/issues/9610&gt;`_: Restore `UnitTestFunction.obj` to return unbound rather than bound method.
    Fixes a crash during a failed teardown in unittest TestCases with non-default `__init__`.
    Regressed in pytest 7.0.0.
    
    
    - `9636 &lt;https://github.com/pytest-dev/pytest/issues/9636&gt;`_: The ``pythonpath`` plugin was renamed to ``python_path``. This avoids a conflict with the ``pytest-pythonpath`` plugin.
    
    
    - `9642 &lt;https://github.com/pytest-dev/pytest/issues/9642&gt;`_: Fix running tests by id with ``::`` in the parametrize portion.
    
    
    - `9643 &lt;https://github.com/pytest-dev/pytest/issues/9643&gt;`_: Delay issuing a :class:`~pytest.PytestWarning` about diamond inheritance involving :class:`~pytest.Item` and
    :class:`~pytest.Collector` so it can be filtered using :ref:`standard warning filters &lt;warnings&gt;`.
    

    7.0.0

    =========================
    
    (**Please see the full set of changes for this release also in the 7.0.0rc1 notes below**)
    
    Deprecations
    ------------
    
    - `9488 &lt;https://github.com/pytest-dev/pytest/issues/9488&gt;`_: If custom subclasses of nodes like :class:`pytest.Item` override the
    ``__init__`` method, they should take ``**kwargs``. See
    :ref:`uncooperative-constructors-deprecated` for details.
    
    Note that a deprection warning is only emitted when there is a conflict in the
    arguments pytest expected to pass. This deprecation was already part of pytest
    7.0.0rc1 but wasn&#x27;t documented.
    
    
    
    Bug Fixes
    ---------
    
    - `9355 &lt;https://github.com/pytest-dev/pytest/issues/9355&gt;`_: Fixed error message prints function decorators when using assert in Python 3.8 and above.
    
    
    - `9396 &lt;https://github.com/pytest-dev/pytest/issues/9396&gt;`_: Ensure :attr:`pytest.Config.inifile` is available during the :func:`pytest_cmdline_main &lt;_pytest.hookspec.pytest_cmdline_main&gt;` hook (regression during ``7.0.0rc1``).
    
    
    
    Improved Documentation
    ----------------------
    
    - `9404 &lt;https://github.com/pytest-dev/pytest/issues/9404&gt;`_: Added extra documentation on alternatives to common misuses of `pytest.warns(None)` ahead of its deprecation.
    
    
    - `9505 &lt;https://github.com/pytest-dev/pytest/issues/9505&gt;`_: Clarify where the configuration files are located. To avoid confusions documentation mentions
    that configuration file is located in the root of the repository.
    
    
    
    Trivial/Internal Changes
    ------------------------
    
    - `9521 &lt;https://github.com/pytest-dev/pytest/issues/9521&gt;`_: Add test coverage to assertion rewrite path.
    

    7.0.0rc1

    ============================
    
    Breaking Changes
    ----------------
    
    - `7259 &lt;https://github.com/pytest-dev/pytest/issues/7259&gt;`_: The :ref:`Node.reportinfo() &lt;non-python tests&gt;` function first return value type has been expanded from `py.path.local | str` to `os.PathLike[str] | str`.
    
    Most plugins which refer to `reportinfo()` only define it as part of a custom :class:`pytest.Item` implementation.
    Since `py.path.local` is a `os.PathLike[str]`, these plugins are unaffacted.
    
    Plugins and users which call `reportinfo()`, use the first return value and interact with it as a `py.path.local`, would need to adjust by calling `py.path.local(fspath)`.
    Although preferably, avoid the legacy `py.path.local` and use `pathlib.Path`, or use `item.location` or `item.path`, instead.
    
    Note: pytest was not able to provide a deprecation period for this change.
    
    
    - `8246 &lt;https://github.com/pytest-dev/pytest/issues/8246&gt;`_: ``--version`` now writes version information to ``stdout`` rather than ``stderr``.
    
    
    - `8733 &lt;https://github.com/pytest-dev/pytest/issues/8733&gt;`_: Drop a workaround for `pyreadline &lt;https://github.com/pyreadline/pyreadline&gt;`__ that made it work with ``--pdb``.
    
    The workaround was introduced in `1281 &lt;https://github.com/pytest-dev/pytest/pull/1281&gt;`__ in 2015, however since then
    `pyreadline seems to have gone unmaintained &lt;https://github.com/pyreadline/pyreadline/issues/58&gt;`__, is `generating
    warnings &lt;https://github.com/pytest-dev/pytest/issues/8847&gt;`__, and will stop working on Python 3.10.
    
    
    - `9061 &lt;https://github.com/pytest-dev/pytest/issues/9061&gt;`_: Using :func:`pytest.approx` in a boolean context now raises an error hinting at the proper usage.
    
    It is apparently common for users to mistakenly use ``pytest.approx`` like this:
    
    .. code-block:: python
    
       assert pytest.approx(actual, expected)
    
    While the correct usage is:
    
    .. code-block:: python
    
       assert actual == pytest.approx(expected)
    
    The new error message helps catch those mistakes.
    
    
    - `9277 &lt;https://github.com/pytest-dev/pytest/issues/9277&gt;`_: The ``pytest.Instance`` collector type has been removed.
    Importing ``pytest.Instance`` or ``_pytest.python.Instance`` returns a dummy type and emits a deprecation warning.
    See :ref:`instance-collector-deprecation` for details.
    
    
    - `9308 &lt;https://github.com/pytest-dev/pytest/issues/9308&gt;`_: **PytestRemovedIn7Warning deprecation warnings are now errors by default.**
    
    Following our plan to remove deprecated features with as little disruption as
    possible, all warnings of type ``PytestRemovedIn7Warning`` now generate errors
    instead of warning messages by default.
    
    **The affected features will be effectively removed in pytest 7.1**, so please consult the
    :ref:`deprecations` section in the docs for directions on how to update existing code.
    
    In the pytest ``7.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:
    
    .. code-block:: ini
    
       [pytest]
       filterwarnings =
           ignore::pytest.PytestRemovedIn7Warning
    
    But this will stop working when pytest ``7.1`` is released.
    
    **If you have concerns** about the removal of a specific feature, please add a
    comment to :issue:`9308`.
    
    
    
    Deprecations
    ------------
    
    - `7259 &lt;https://github.com/pytest-dev/pytest/issues/7259&gt;`_: ``py.path.local`` arguments for hooks have been deprecated. See :ref:`the deprecation note &lt;legacy-path-hooks-deprecated&gt;` for full details.
    
    ``py.path.local`` arguments to Node constructors have been deprecated. See :ref:`the deprecation note &lt;node-ctor-fspath-deprecation&gt;` for full details.
    
    .. note::
       The name of the :class:`~_pytest.nodes.Node` arguments and attributes (the
       new attribute being ``path``) is **the opposite** of the situation for hooks
       (the old argument being ``path``).
    
       This is an unfortunate artifact due to historical reasons, which should be
       resolved in future versions as we slowly get rid of the :pypi:`py`
       dependency (see :issue:`9283` for a longer discussion).
    
    
    - `7469 &lt;https://github.com/pytest-dev/pytest/issues/7469&gt;`_: Directly constructing the following classes is now deprecated:
    
    - ``_pytest.mark.structures.Mark``
    - ``_pytest.mark.structures.MarkDecorator``
    - ``_pytest.mark.structures.MarkGenerator``
    - ``_pytest.python.Metafunc``
    - ``_pytest.runner.CallInfo``
    - ``_pytest._code.ExceptionInfo``
    - ``_pytest.config.argparsing.Parser``
    - ``_pytest.config.argparsing.OptionGroup``
    - ``_pytest.pytester.HookRecorder``
    
    These constructors have always been considered private, but now issue a deprecation warning, which may become a hard error in pytest 8.
    
    
    - `8242 &lt;https://github.com/pytest-dev/pytest/issues/8242&gt;`_: Raising :class:`unittest.SkipTest` to skip collection of tests during the
    pytest collection phase is deprecated. Use :func:`pytest.skip` instead.
    
    Note: This deprecation only relates to using :class:`unittest.SkipTest` during test
    collection. You are probably not doing that. Ordinary usage of
    :class:`unittest.SkipTest` / :meth:`unittest.TestCase.skipTest` /
    :func:`unittest.skip` in unittest test cases is fully supported.
    
    .. note:: This deprecation has been reverted in pytest 7.1.0.
    
    
    - `8315 &lt;https://github.com/pytest-dev/pytest/issues/8315&gt;`_: Several behaviors of :meth:`Parser.addoption &lt;pytest.Parser.addoption&gt;` are now
    scheduled for removal in pytest 8 (deprecated since pytest 2.4.0):
    
    - ``parser.addoption(..., help=&quot;.. %default ..&quot;)`` - use ``%(default)s`` instead.
    - ``parser.addoption(..., type=&quot;int/string/float/complex&quot;)`` - use ``type=int`` etc. instead.
    
    
    - `8447 &lt;https://github.com/pytest-dev/pytest/issues/8447&gt;`_: Defining a custom pytest node type which is both an :class:`pytest.Item &lt;Item&gt;` and a :class:`pytest.Collector &lt;Collector&gt;` (e.g. :class:`pytest.File &lt;File&gt;`) now issues a warning.
    It was never sanely supported and triggers hard to debug errors.
    
    See :ref:`the deprecation note &lt;diamond-inheritance-deprecated&gt;` for full details.
    
    
    - `8592 &lt;https://github.com/pytest-dev/pytest/issues/8592&gt;`_: :hook:`pytest_cmdline_preparse` has been officially deprecated.  It will be removed in a future release.  Use :hook:`pytest_load_initial_conftests` instead.
    
    See :ref:`the deprecation note &lt;cmdline-preparse-deprecated&gt;` for full details.
    
    
    - `8645 &lt;https://github.com/pytest-dev/pytest/issues/8645&gt;`_: :func:`pytest.warns(None) &lt;pytest.warns&gt;` is now deprecated because many people used
    it to mean &quot;this code does not emit warnings&quot;, but it actually had the effect of
    checking that the code emits at least one warning of any type - like ``pytest.warns()``
    or ``pytest.warns(Warning)``.
    
    
    - `8948 &lt;https://github.com/pytest-dev/pytest/issues/8948&gt;`_: :func:`pytest.skip(msg=...) &lt;pytest.skip&gt;`, :func:`pytest.fail(msg=...) &lt;pytest.fail&gt;` and :func:`pytest.exit(msg=...) &lt;pytest.exit&gt;`
    signatures now accept a ``reason`` argument instead of ``msg``.  Using ``msg`` still works, but is deprecated and will be removed in a future release.
    
    This was changed for consistency with :func:`pytest.mark.skip &lt;pytest.mark.skip&gt;` and  :func:`pytest.mark.xfail &lt;pytest.mark.xfail&gt;` which both accept
    ``reason`` as an argument.
    
    - `8174 &lt;https://github.com/pytest-dev/pytest/issues/8174&gt;`_: The following changes have been made to types reachable through :attr:`pytest.ExceptionInfo.traceback`:
    
    - The ``path`` property of ``_pytest.code.Code`` returns ``Path`` instead of ``py.path.local``.
    - The ``path`` property of ``_pytest.code.TracebackEntry`` returns ``Path`` instead of ``py.path.local``.
    
    There was no deprecation period for this change (sorry!).
    
    
    Features
    --------
    
    - `5196 &lt;https://github.com/pytest-dev/pytest/issues/5196&gt;`_: Tests are now ordered by definition order in more cases.
    
    In a class hierarchy, tests from base classes are now consistently ordered before tests defined on their subclasses (reverse MRO order).
    
    
    - `7132 &lt;https://github.com/pytest-dev/pytest/issues/7132&gt;`_: Added two environment variables :envvar:`PYTEST_THEME` and :envvar:`PYTEST_THEME_MODE` to let the users customize the pygments theme used.
    
    
    - `7259 &lt;https://github.com/pytest-dev/pytest/issues/7259&gt;`_: Added :meth:`cache.mkdir() &lt;pytest.Cache.mkdir&gt;`, which is similar to the existing :meth:`cache.makedir() &lt;pytest.Cache.makedir&gt;`,
    but returns a :class:`pathlib.Path` instead of a legacy ``py.path.local``.
    
    Added a ``paths`` type to :meth:`parser.addini() &lt;pytest.Parser.addini&gt;`,
    as in ``parser.addini(&quot;mypaths&quot;, &quot;my paths&quot;, type=&quot;paths&quot;)``,
    which is similar to the existing ``pathlist``,
    but returns a list of :class:`pathlib.Path` instead of legacy ``py.path.local``.
    
    
    - `7469 &lt;https://github.com/pytest-dev/pytest/issues/7469&gt;`_: The types of objects used in pytest&#x27;s API are now exported so they may be used in type annotations.
    
    The newly-exported types are:
    
    - ``pytest.Config`` for :class:`Config &lt;pytest.Config&gt;`.
    - ``pytest.Mark`` for :class:`marks &lt;pytest.Mark&gt;`.
    - ``pytest.MarkDecorator`` for :class:`mark decorators &lt;pytest.MarkDecorator&gt;`.
    - ``pytest.MarkGenerator`` for the :class:`pytest.mark &lt;pytest.MarkGenerator&gt;` singleton.
    - ``pytest.Metafunc`` for the :class:`metafunc &lt;pytest.MarkGenerator&gt;` argument to the :hook:`pytest_generate_tests` hook.
    - ``pytest.CallInfo`` for the :class:`CallInfo &lt;pytest.CallInfo&gt;` type passed to various hooks.
    - ``pytest.PytestPluginManager`` for :class:`PytestPluginManager &lt;pytest.PytestPluginManager&gt;`.
    - ``pytest.ExceptionInfo`` for the :class:`ExceptionInfo &lt;pytest.ExceptionInfo&gt;` type returned from :func:`pytest.raises` and passed to various hooks.
    - ``pytest.Parser`` for the :class:`Parser &lt;pytest.Parser&gt;` type passed to the :hook:`pytest_addoption` hook.
    - ``pytest.OptionGroup`` for the :class:`OptionGroup &lt;pytest.OptionGroup&gt;` type returned from the :func:`parser.addgroup &lt;pytest.Parser.getgroup&gt;` method.
    - ``pytest.HookRecorder`` for the :class:`HookRecorder &lt;pytest.HookRecorder&gt;` type returned from :class:`~pytest.Pytester`.
    - ``pytest.RecordedHookCall`` for the :class:`RecordedHookCall &lt;pytest.HookRecorder&gt;` type returned from :class:`~pytest.HookRecorder`.
    - ``pytest.RunResult`` for the :class:`RunResult &lt;pytest.RunResult&gt;` type returned from :class:`~pytest.Pytester`.
    - ``pytest.LineMatcher`` for the :class:`LineMatcher &lt;pytest.RunResult&gt;` type used in :class:`~pytest.RunResult` and others.
    - ``pytest.TestReport`` for the :class:`TestReport &lt;pytest.TestReport&gt;` type used in various hooks.
    - ``pytest.CollectReport`` for the :class:`CollectReport &lt;pytest.CollectReport&gt;` type used in various hooks.
    
    Constructing most of them directly is not supported; they are only meant for use in type annotations.
    Doing so will emit a deprecation warning, and may become a hard-error in pytest 8.0.
    
    Subclassing them is also not supported. This is not currently enforced at runtime, but is detected by type-checkers such as mypy.
    
    
    - `7856 &lt;https://github.com/pytest-dev/pytest/issues/7856&gt;`_: :ref:`--import-mode=importlib &lt;import-modes&gt;` now works with features that
    depend on modules being on :py:data:`sys.modules`, such as :mod:`pickle` and :mod:`dataclasses`.
    
    
    - `8144 &lt;https://github.com/pytest-dev/pytest/issues/8144&gt;`_: The following hooks now receive an additional ``pathlib.Path`` argument, equivalent to an existing ``py.path.local`` argument:
    
    - :hook:`pytest_ignore_collect` - The ``collection_path`` parameter (equivalent to existing ``path`` parameter).
    - :hook:`pytest_collect_file` - The ``file_path`` parameter (equivalent to existing ``path`` parameter).
    - :hook:`pytest_pycollect_makemodule` - The ``module_path`` parameter (equivalent to existing ``path`` parameter).
    - :hook:`pytest_report_header` - The ``start_path`` parameter (equivalent to existing ``startdir`` parameter).
    - :hook:`pytest_report_collectionfinish` - The ``start_path`` parameter (equivalent to existing ``startdir`` parameter).
    
    .. note::
       The name of the :class:`~_pytest.nodes.Node` arguments and attributes (the
       new attribute being ``path``) is **the opposite** of the situation for hooks
       (the old argument being ``path``).
    
       This is an unfortunate artifact due to historical reasons, which should be
       resolved in future versions as we slowly get rid of the :pypi:`py`
       dependency (see :issue:`9283` for a longer discussion).
    
    
    - `8251 &lt;https://github.com/pytest-dev/pytest/issues/8251&gt;`_: Implement ``Node.path`` as a ``pathlib.Path``. Both the old ``fspath`` and this new attribute gets set no matter whether ``path`` or ``fspath`` (deprecated) is passed to the constructor. It is a replacement for the ``fspath`` attribute (which represents the same path as ``py.path.local``). While ``fspath`` is not deprecated yet
    due to the ongoing migration of methods like :meth:`~_pytest.Item.reportinfo`, we expect to deprecate it in a future release.
    
    .. note::
       The name of the :class:`~_pytest.nodes.Node` arguments and attributes (the
       new attribute being ``path``) is **the opposite** of the situation for hooks
       (the old argument being ``path``).
    
       This is an unfortunate artifact due to historical reasons, which should be
       resolved in future versions as we slowly get rid of the :pypi:`py`
       dependency (see :issue:`9283` for a longer discussion).
    
    
    - `8421 &lt;https://github.com/pytest-dev/pytest/issues/8421&gt;`_: :func:`pytest.approx` now works on :class:`~decimal.Decimal` within mappings/dicts and sequences/lists.
    
    
    - `8606 &lt;https://github.com/pytest-dev/pytest/issues/8606&gt;`_: pytest invocations with ``--fixtures-per-test`` and ``--fixtures`` have been enriched with:
    
    - Fixture location path printed with the fixture name.
    - First section of the fixture&#x27;s docstring printed under the fixture name.
    - Whole of fixture&#x27;s docstring printed under the fixture name using ``--verbose`` option.
    
    
    - `8761 &lt;https://github.com/pytest-dev/pytest/issues/8761&gt;`_: New :ref:`version-tuple` attribute, which makes it simpler for users to do something depending on the pytest version (such as declaring hooks which are introduced in later versions).
    
    
    - `8789 &lt;https://github.com/pytest-dev/pytest/issues/8789&gt;`_: Switch TOML parser from ``toml`` to ``tomli`` for TOML v1.0.0 support in ``pyproject.toml``.
    
    
    - `8920 &lt;https://github.com/pytest-dev/pytest/issues/8920&gt;`_: Added :class:`pytest.Stash`, a facility for plugins to store their data on :class:`~pytest.Config` and :class:`~_pytest.nodes.Node`\s in a type-safe and conflict-free manner.
    See :ref:`plugin-stash` for details.
    
    
    - `8953 &lt;https://github.com/pytest-dev/pytest/issues/8953&gt;`_: :class:`RunResult &lt;_pytest.pytester.RunResult&gt;` method :meth:`assert_outcomes &lt;_pytest.pytester.RunResult.assert_outcomes&gt;` now accepts a
    ``warnings`` argument to assert the total number of warnings captured.
    
    
    - `8954 &lt;https://github.com/pytest-dev/pytest/issues/8954&gt;`_: ``--debug`` flag now accepts a :class:`str` file to route debug logs into, remains defaulted to `pytestdebug.log`.
    
    
    - `9023 &lt;https://github.com/pytest-dev/pytest/issues/9023&gt;`_: Full diffs are now always shown for equality assertions of iterables when
    `CI` or ``BUILD_NUMBER`` is found in the environment, even when ``-v`` isn&#x27;t
    used.
    
    
    - `9113 &lt;https://github.com/pytest-dev/pytest/issues/9113&gt;`_: :class:`RunResult &lt;_pytest.pytester.RunResult&gt;` method :meth:`assert_outcomes &lt;_pytest.pytester.RunResult.assert_outcomes&gt;` now accepts a
    ``deselected`` argument to assert the total number of deselected tests.
    
    
    - `9114 &lt;https://github.com/pytest-dev/pytest/issues/9114&gt;`_: Added :confval:`pythonpath` setting that adds listed paths to :data:`sys.path` for the duration of the test session. If you currently use the pytest-pythonpath or pytest-srcpaths plugins, you should be able to replace them with built-in `pythonpath` setting.
    
    
    
    Improvements
    ------------
    
    - `7480 &lt;https://github.com/pytest-dev/pytest/issues/7480&gt;`_: A deprecation scheduled to be removed in a major version X (e.g. pytest 7, 8, 9, ...) now uses warning category `PytestRemovedInXWarning`,
    a subclass of :class:`~pytest.PytestDeprecationWarning`,
    instead of :class:`PytestDeprecationWarning` directly.
    
    See :ref:`backwards-compatibility` for more details.
    
    
    - `7864 &lt;https://github.com/pytest-dev/pytest/issues/7864&gt;`_: Improved error messages when parsing warning filters.
    
    Previously pytest would show an internal traceback, which besides being ugly sometimes would hide the cause
    of the problem (for example an ``ImportError`` while importing a specific warning type).
    
    
    - `8335 &lt;https://github.com/pytest-dev/pytest/issues/8335&gt;`_: Improved :func:`pytest.approx` assertion messages for sequences of numbers.
    
    The assertion messages now dumps a table with the index and the error of each diff.
    Example::
    
       &gt;       assert [1, 2, 3, 4] == pytest.approx([1, 3, 3, 5])
       E       assert comparison failed for 2 values:
       E         Index | Obtained | Expected
       E         1     | 2        | 3 +- 3.0e-06
       E         3     | 4        | 5 +- 5.0e-06
    
    
    - `8403 &lt;https://github.com/pytest-dev/pytest/issues/8403&gt;`_: By default, pytest will truncate long strings in assert errors so they don&#x27;t clutter the output too much,
    currently at ``240`` characters by default.
    
    However, in some cases the longer output helps, or is even crucial, to diagnose a failure. Using ``-v`` will
    now increase the truncation threshold to ``2400`` characters, and ``-vv`` or higher will disable truncation entirely.
    
    
    - `8509 &lt;https://github.com/pytest-dev/pytest/issues/8509&gt;`_: Fixed issue where :meth:`unittest.TestCase.setUpClass` is not called when a test has `/` in its name since pytest 6.2.0.
    
    This refers to the path part in pytest node IDs, e.g. ``TestClass::test_it`` in the node ID ``tests/test_file.py::TestClass::test_it``.
    
    Now, instead of assuming that the test name does not contain ``/``, it is assumed that test path does not contain ``::``. We plan to hopefully make both of these work in the future.
    
    
    - `8803 &lt;https://github.com/pytest-dev/pytest/issues/8803&gt;`_: It is now possible to add colors to custom log levels on cli log.
    
    By using :func:`add_color_level &lt;_pytest.logging.add_color_level&gt;` from a ``pytest_configure`` hook, colors can be added::
    
       logging_plugin = config.pluginmanager.get_plugin(&#x27;logging-plugin&#x27;)
       logging_plugin.log_cli_handler.formatter.add_color_level(logging.INFO, &#x27;cyan&#x27;)
       logging_plugin.log_cli_handler.formatter.add_color_level(logging.SPAM, &#x27;blue&#x27;)
    
    See :ref:`log_colors` for more information.
    
    
    - `8822 &lt;https://github.com/pytest-dev/pytest/issues/8822&gt;`_: When showing fixture paths in `--fixtures` or `--fixtures-by-test`, fixtures coming from pytest itself now display an elided path, rather than the full path to the file in the `site-packages` directory.
    
    
    - `8898 &lt;https://github.com/pytest-dev/pytest/issues/8898&gt;`_: Complex numbers are now treated like floats and integers when generating parameterization IDs.
    
    
    - `9062 &lt;https://github.com/pytest-dev/pytest/issues/9062&gt;`_: ``--stepwise-skip`` now implicitly enables ``--stepwise`` and can be used on its own.
    
    
    - `9205 &lt;https://github.com/pytest-dev/pytest/issues/9205&gt;`_: :meth:`pytest.Cache.set` now preserves key order when saving dicts.
    
    
    
    Bug Fixes
    ---------
    
    - `7124 &lt;https://github.com/pytest-dev/pytest/issues/7124&gt;`_: Fixed an issue where ``__main__.py`` would raise an ``ImportError`` when ``--doctest-modules`` was provided.
    
    
    - `8061 &lt;https://github.com/pytest-dev/pytest/issues/8061&gt;`_: Fixed failing ``staticmethod`` test cases if they are inherited from a parent test class.
    
    
    - `8192 &lt;https://github.com/pytest-dev/pytest/issues/8192&gt;`_: ``testdir.makefile`` now silently accepts values which don&#x27;t start with ``.`` to maintain backward compatibility with older pytest versions.
    
    ``pytester.makefile`` now issues a clearer error if the ``.`` is missing in the ``ext`` argument.
    
    
    - `8258 &lt;https://github.com/pytest-dev/pytest/issues/8258&gt;`_: Fixed issue where pytest&#x27;s ``faulthandler`` support would not dump traceback on crashes
    if the :mod:`faulthandler` module was already enabled during pytest startup (using
    ``python -X dev -m pytest`` for example).
    
    
    - `8317 &lt;https://github.com/pytest-dev/pytest/issues/8317&gt;`_: Fixed an issue where illegal directory characters derived from ``getpass.getuser()`` raised an ``OSError``.
    
    
    - `8367 &lt;https://github.com/pytest-dev/pytest/issues/8367&gt;`_: Fix ``Class.from_parent`` so it forwards extra keyword arguments to the constructor.
    
    
    - `8377 &lt;https://github.com/pytest-dev/pytest/issues/8377&gt;`_: The test selection options ``pytest -k`` and ``pytest -m`` now support matching
    names containing forward slash (``/``) characters.
    
    
    - `8384 &lt;https://github.com/pytest-dev/pytest/issues/8384&gt;`_: The ``pytest.mark.skip`` decorator now correctly handles its arguments. When the ``reason`` argument is accidentally given both positional and as a keyword (e.g. because it was confused with ``skipif``), a ``TypeError`` now occurs. Before, such tests were silently skipped, and the positional argument ignored. Additionally, ``reason`` is now documented correctly as positional or keyword (rather than keyword-only).
    
    
    - `8394 &lt;https://github.com/pytest-dev/pytest/issues/8394&gt;`_: Use private names for internal fixtures that handle classic setup/teardown so that they don&#x27;t show up with the default ``--fixtures`` invocation (but they still show up with ``--fixtures -v``).
    
    
    - `8456 &lt;https://github.com/pytest-dev/pytest/issues/8456&gt;`_: The :confval:`required_plugins` config option now works correctly when pre-releases of plugins are installed, rather than falsely claiming that those plugins aren&#x27;t installed at all.
    
    
    - `8464 &lt;https://github.com/pytest-dev/pytest/issues/8464&gt;`_: ``-c &lt;config file&gt;`` now also properly defines ``rootdir`` as the directory that contains ``&lt;config file&gt;``.
    
    
    - `8503 &lt;https://github.com/pytest-dev/pytest/issues/8503&gt;`_: :meth:`pytest.MonkeyPatch.syspath_prepend` no longer fails when
    ``setuptools`` is not installed.
    It now only calls :func:`pkg_resources.fixup_namespace_packages` if
    ``pkg_resources`` was previously imported, because it is not needed otherwise.
    
    
    - `8548 &lt;https://github.com/pytest-dev/pytest/issues/8548&gt;`_: Introduce fix to handle precision width in ``log-cli-format`` in turn to fix output coloring for certain formats.
    
    
    - `8796 &lt;https://github.com/pytest-dev/pytest/issues/8796&gt;`_: Fixed internal error when skipping doctests.
    
    
    - `8983 &lt;https://github.com/pytest-dev/pytest/issues/8983&gt;`_: The test selection options ``pytest -k`` and ``pytest -m`` now support matching names containing backslash (`\\`) characters.
    Backslashes are treated literally, not as escape characters (the values being matched against are already escaped).
    
    
    - `8990 &lt;https://github.com/pytest-dev/pytest/issues/8990&gt;`_: Fix `pytest -vv` crashing with an internal exception `AttributeError: &#x27;str&#x27; object has no attribute &#x27;relative_to&#x27;` in some cases.
    
    
    - `9077 &lt;https://github.com/pytest-dev/pytest/issues/9077&gt;`_: Fixed confusing error message when ``request.fspath`` / ``request.path`` was accessed from a session-scoped fixture.
    
    
    - `9131 &lt;https://github.com/pytest-dev/pytest/issues/9131&gt;`_: Fixed the URL used by ``--pastebin`` to use `bpa.st &lt;http://bpa.st&gt;`__.
    
    
    - `9163 &lt;https://github.com/pytest-dev/pytest/issues/9163&gt;`_: The end line number and end column offset are now properly set for rewritten assert statements.
    
    
    - `9169 &lt;https://github.com/pytest-dev/pytest/issues/9169&gt;`_: Support for the ``files`` API from ``importlib.resources`` within rewritten files.
    
    
    - `9272 &lt;https://github.com/pytest-dev/pytest/issues/9272&gt;`_: The nose compatibility module-level fixtures `setup()` and `teardown()` are now only called once per module, instead of for each test function.
    They are now called even if object-level `setup`/`teardown` is defined.
    
    
    
    Improved Documentation
    ----------------------
    
    - `4320 &lt;https://github.com/pytest-dev/pytest/issues/4320&gt;`_: Improved docs for `pytester.copy_example`.
    
    
    - `5105 &lt;https://github.com/pytest-dev/pytest/issues/5105&gt;`_: Add automatically generated :ref:`plugin-list`. The list is updated on a periodic schedule.
    
    
    - `8337 &lt;https://github.com/pytest-dev/pytest/issues/8337&gt;`_: Recommend `numpy.testing &lt;https://numpy.org/doc/stable/reference/routines.testing.html&gt;`__ module on :func:`pytest.approx` documentation.
    
    
    - `8655 &lt;https://github.com/pytest-dev/pytest/issues/8655&gt;`_: Help text for ``--pdbcls`` more accurately reflects the option&#x27;s behavior.
    
    
    - `9210 &lt;https://github.com/pytest-dev/pytest/issues/9210&gt;`_: Remove incorrect docs about ``confcutdir`` being a configuration option: it can only be set through the ``--confcutdir`` command-line option.
    
    
    - `9242 &lt;https://github.com/pytest-dev/pytest/issues/9242&gt;`_: Upgrade readthedocs configuration to use a `newer Ubuntu version &lt;https://blog.readthedocs.com/new-build-specification/&gt;`__` with better unicode support for PDF docs.
    
    
    - `9341 &lt;https://github.com/pytest-dev/pytest/issues/9341&gt;`_: Various methods commonly used for :ref:`non-python tests` are now correctly documented in the reference docs. They were undocumented previously.
    
    
    
    Trivial/Internal Changes
    ------------------------
    
    - `8133 &lt;https://github.com/pytest-dev/pytest/issues/8133&gt;`_: Migrate to ``setuptools_scm`` 6.x to use ``SETUPTOOLS_SCM_PRETEND_VERSION_FOR_PYTEST`` for more robust release tooling.
    
    
    - `8174 &lt;https://github.com/pytest-dev/pytest/issues/8174&gt;`_: The following changes have been made to internal pytest types/functions:
    
    - The ``_pytest.code.getfslineno()`` function returns ``Path`` instead of ``py.path.local``.
    - The ``_pytest.python.path_matches_patterns()`` function takes ``Path`` instead of ``py.path.local``.
    - The ``_pytest._code.Traceback.cut()`` function accepts any ``os.PathLike[str]``, not just ``py.path.local``.
    
    
    - `8248 &lt;https://github.com/pytest-dev/pytest/issues/8248&gt;`_: Internal Restructure: let ``python.PyObjMixin`` inherit from ``nodes.Node`` to carry over typing information.
    
    
    - `8432 &lt;https://github.com/pytest-dev/pytest/issues/8432&gt;`_: Improve error message when :func:`pytest.skip` is used at module level without passing `allow_module_level=True`.
    
    
    - `8818 &lt;https://github.com/pytest-dev/pytest/issues/8818&gt;`_: Ensure ``regendoc`` opts out of ``TOX_ENV`` cachedir selection to ensure independent example test runs.
    
    
    - `8913 &lt;https://github.com/pytest-dev/pytest/issues/8913&gt;`_: The private ``CallSpec2._arg2scopenum`` attribute has been removed after an internal refactoring.
    
    
    - `8967 &lt;https://github.com/pytest-dev/pytest/issues/8967&gt;`_: :hook:`pytest_assertion_pass` is no longer considered experimental and
    future changes to it will be considered more carefully.
    
    
    - `9202 &lt;https://github.com/pytest-dev/pytest/issues/9202&gt;`_: Add github action to upload coverage report to codecov instead of bash uploader.
    
    
    - `9225 &lt;https://github.com/pytest-dev/pytest/issues/9225&gt;`_: Changed the command used to create sdist and wheel artifacts: using the build package instead of setup.py.
    
    
    - `9351 &lt;https://github.com/pytest-dev/pytest/issues/9351&gt;`_: Correct minor typos in doc/en/example/special.rst.
    

    6.2.5

    =========================
    
    
    Trivial/Internal Changes
    ------------------------
    
    - :issue:`8494`: Python 3.10 is now supported.
    
    
    - :issue:`9040`: Enable compatibility with ``pluggy 1.0`` or later.
    

    6.2.4

    =========================
    
    Bug Fixes
    ---------
    
    - :issue:`8539`: Fixed assertion rewriting on Python 3.10.
    

    6.2.3

    =========================
    
    Bug Fixes
    ---------
    
    - :issue:`8414`: pytest used to create directories under ``/tmp`` with world-readable
    permissions. This means that any user in the system was able to read
    information written by tests in temporary directories (such as those created by
    the ``tmp_path``/``tmpdir`` fixture). Now the directories are created with
    private permissions.
    
    pytest used to silently use a pre-existing ``/tmp/pytest-of-&lt;username&gt;`` directory,
    even if owned by another user. This means another user could pre-create such a
    directory and gain control of another user&#x27;s temporary directory. Now such a
    condition results in an error.
    

    6.2.2

    =========================
    
    Bug Fixes
    ---------
    
    - :issue:`8152`: Fixed &quot;(&lt;Skipped instance&gt;)&quot; being shown as a skip reason in the verbose test summary line when the reason is empty.
    
    
    - :issue:`8249`: Fix the ``faulthandler`` plugin for occasions when running with ``twisted.logger`` and using ``pytest --capture=no``.
    

    6.2.1

    =========================
    
    Bug Fixes
    ---------
    
    - :issue:`7678`: Fixed bug where ``ImportPathMismatchError`` would be raised for files compiled in
    the host and loaded later from an UNC mounted path (Windows).
    
    
    - :issue:`8132`: Fixed regression in ``approx``: in 6.2.0 ``approx`` no longer raises
    ``TypeError`` when dealing with non-numeric types, falling back to normal comparison.
    Before 6.2.0, array types like tf.DeviceArray fell through to the scalar case,
    and happened to compare correctly to a scalar if they had only one element.
    After 6.2.0, these types began failing, because they inherited neither from
    standard Python number hierarchy nor from ``numpy.ndarray``.
    
    ``approx`` now converts arguments to ``numpy.ndarray`` if they expose the array
    protocol and are not scalars. This treats array-like objects like numpy arrays,
    regardless of size.
    

    6.2.0

    =========================
    
    Breaking Changes
    ----------------
    
    - :issue:`7808`: pytest now supports python3.6+ only.
    
    
    
    Deprecations
    ------------
    
    - :issue:`7469`: Directly constructing/calling the following classes/functions is now deprecated:
    
    - ``_pytest.cacheprovider.Cache``
    - ``_pytest.cacheprovider.Cache.for_config()``
    - ``_pytest.cacheprovider.Cache.clear_cache()``
    - ``_pytest.cacheprovider.Cache.cache_dir_from_config()``
    - ``_pytest.capture.CaptureFixture``
    - ``_pytest.fixtures.FixtureRequest``
    - ``_pytest.fixtures.SubRequest``
    - ``_pytest.logging.LogCaptureFixture``
    - ``_pytest.pytester.Pytester``
    - ``_pytest.pytester.Testdir``
    - ``_pytest.recwarn.WarningsRecorder``
    - ``_pytest.recwarn.WarningsChecker``
    - ``_pytest.tmpdir.TempPathFactory``
    - ``_pytest.tmpdir.TempdirFactory``
    
    These have always been considered private, but now issue a deprecation warning, which may become a hard error in pytest 8.0.0.
    
    
    - :issue:`7530`: The ``--strict`` command-line option has been deprecated, use ``--strict-markers`` instead.
    
    We have plans to maybe in the future to reintroduce ``--strict`` and make it an encompassing flag for all strictness
    related options (``--strict-markers`` and ``--strict-config`` at the moment, more might be introduced in the future).
    
    
    - :issue:`7988`: The ``pytest.yield_fixture`` decorator/function is now deprecated. Use :func:`pytest.fixture` instead.
    
    ``yield_fixture`` has been an alias for ``fixture`` for a very long time, so can be search/replaced safely.
    
    
    
    Features
    --------
    
    - :issue:`5299`: pytest now warns about unraisable exceptions and unhandled thread exceptions that occur in tests on Python&gt;=3.8.
    See :ref:`unraisable` for more information.
    
    
    - :issue:`7425`: New :fixture:`pytester` fixture, which is identical to :fixture:`testdir` but its methods return :class:`pathlib.Path` when appropriate instead of ``py.path.local``.
    
    This is part of the movement to use :class:`pathlib.Path` objects internally, in order to remove the dependency to ``py`` in the future.
    
    Internally, the old :class:`Testdir &lt;_pytest.pytester.Testdir&gt;` is now a thin wrapper around :class:`Pytester &lt;_pytest.pytester.Pytester&gt;`, preserving the old interface.
    
    
    - :issue:`7695`: A new hook was added, `pytest_markeval_namespace` which should return a dictionary.
    This dictionary will be used to augment the &quot;global&quot; variables available to evaluate skipif/xfail/xpass markers.
    
    Pseudo example
    
    ``conftest.py``:
    
    .. code-block:: python
    
      def pytest_markeval_namespace():
          return {&quot;color&quot;: &quot;red&quot;}
    
    ``test_func.py``:
    
    .. code-block:: python
    
      pytest.mark.skipif(&quot;color == &#x27;blue&#x27;&quot;, reason=&quot;Color is not red&quot;)
      def test_func():
          assert False
    
    
    - :issue:`8006`: It is now possible to construct a :class:`~pytest.MonkeyPatch` object directly as ``pytest.MonkeyPatch()``,
    in cases when the :fixture:`monkeypatch` fixture cannot be used. Previously some users imported it
    from the private `_pytest.monkeypatch.MonkeyPatch` namespace.
    
    Additionally, :meth:`MonkeyPatch.context &lt;pytest.MonkeyPatch.context&gt;` is now a classmethod,
    and can be used as ``with MonkeyPatch.context() as mp: ...``. This is the recommended way to use
    ``MonkeyPatch`` directly, since unlike the ``monkeypatch`` fixture, an instance created directly
    is not ``undo()``-ed automatically.
    
    
    
    Improvements
    ------------
    
    - :issue:`1265`: Added an ``__str__`` implementation to the :class:`~pytest.pytester.LineMatcher` class which is returned from ``pytester.run_pytest().stdout`` and similar. It returns the entire output, like the existing ``str()`` method.
    
    
    - :issue:`2044`: Verbose mode now shows the reason that a test was skipped in the test&#x27;s terminal line after the &quot;SKIPPED&quot;, &quot;XFAIL&quot; or &quot;XPASS&quot;.
    
    
    - :issue:`7469` The types of builtin pytest fixtures are now exported so they may be used in type annotations of test functions.
    The newly-exported types are:
    
    - ``pytest.FixtureRequest`` for the :fixture:`request` fixture.
    - ``pytest.Cache`` for the :fixture:`cache` fixture.
    - ``pytest.CaptureFixture[str]`` for the :fixture:`capfd` and :fixture:`capsys` fixtures.
    - ``pytest.CaptureFixture[bytes]`` for the :fixture:`capfdbinary` and :fixture:`capsysbinary` fixtures.
    - ``pytest.LogCaptureFixture`` for the :fixture:`caplog` fixture.
    - ``pytest.Pytester`` for the :fixture:`pytester` fixture.
    - ``pytest.Testdir`` for the :fixture:`testdir` fixture.
    - ``pytest.TempdirFactory`` for the :fixture:`tmpdir_factory` fixture.
    - ``pytest.TempPathFactory`` for the :fixture:`tmp_path_factory` fixture.
    - ``pytest.MonkeyPatch`` for the :fixture:`monkeypatch` fixture.
    - ``pytest.WarningsRecorder`` for the :fixture:`recwarn` fixture.
    
    Constructing them is not supported (except for `MonkeyPatch`); they are only meant for use in type annotations.
    Doing so will emit a deprecation warning, and may become a hard-error in pytest 8.0.
    
    Subclassing them is also not supported. This is not currently enforced at runtime, but is detected by type-checkers such as mypy.
    
    
    - :issue:`7527`: When a comparison between :func:`namedtuple &lt;collections.namedtuple&gt;` instances of the same type fails, pytest now shows the differing field names (possibly nested) instead of their indexes.
    
    
    - :issue:`7615`: :meth:`Node.warn &lt;_pytest.nodes.Node.warn&gt;` now permits any subclass of :class:`Warning`, not just :class:`PytestWarning &lt;pytest.PytestWarning&gt;`.
    
    
    - :issue:`7701`: Improved reporting when using ``--collected-only``. It will now show the number of collected tests in the summary stats.
    
    
    - :issue:`7710`: Use strict equality comparison for non-numeric types in :func:`pytest.approx` instead of
    raising :class:`TypeError`.
    
    This was the undocumented behavior before 3.7, but is now officially a supported feature.
    
    
    - :issue:`7938`: New ``--sw-skip`` argument which is a shorthand for ``--stepwise-skip``.
    
    
    - :issue:`8023`: Added ``&#x27;node_modules&#x27;`` to default value for :confval:`norecursedirs`.
    
    
    - :issue:`8032`: :meth:`doClassCleanups &lt;unittest.TestCase.doClassCleanups&gt;` (introduced in :mod:`unittest` in Python and 3.8) is now called appropriately.
    
    
    
    Bug Fixes
    ---------
    
    - :issue:`4824`: Fixed quadratic behavior and improved performance of collection of items using autouse fixtures and xunit fixtures.
    
    
    - :issue:`7758`: Fixed an issue where some files in packages are getting lost from ``--lf`` even though they contain tests that failed. Regressed in pytest 5.4.0.
    
    
    - :issue:`7911`: Directories created by by :fixture:`tmp_path` and :fixture:`tmpdir` are now considered stale after 3 days without modification (previous value was 3 hours) to avoid deleting directories still in use in long running test suites.
    
    
    - :issue:`7913`: Fixed a crash or hang in :meth:`pytester.spawn &lt;_pytest.pytester.Pytester.spawn&gt;` when the :mod:`readline` module is involved.
    
    
    - :issue:`7951`: Fixed handling of recursive symlinks when collecting tests.
    
    
    - :issue:`7981`: Fixed symlinked directories not being followed during collection. Regressed in pytest 6.1.0.
    
    
    - :issue:`8016`: Fixed only one doctest being collected when using ``pytest --doctest-modules path/to/an/__init__.py``.
    
    
    
    Improved Documentation
    ----------------------
    
    - :issue:`7429`: Add more information and use cases about skipping doctests.
    
    
    - :issue:`7780`: Classes which should not be inherited from are now marked ``final class`` in the API reference.
    
    
    - :issue:`7872`: ``_pytest.config.argparsing.Parser.addini()`` accepts explicit ``None`` and ``&quot;string&quot;``.
    
    
    - :issue:`7878`: In pull request section, ask to commit after editing changelog and authors file.
    
    
    
    Trivial/Internal Changes
    ------------------------
    
    - :issue:`7802`: The ``attrs`` dependency requirement is now &gt;=19.2.0 instead of &gt;=17.4.0.
    
    
    - :issue:`8014`: `.pyc` files created by pytest&#x27;s assertion rewriting now conform to the newer :pep:`552` format on Python&gt;=3.7.
    (These files are internal and only interpreted by pytest itself.)
    

    6.1.2

    =========================
    
    Bug Fixes
    ---------
    
    - :issue:`7758`: Fixed an issue where some files in packages are getting lost from ``--lf`` even though they contain tests that failed. Regressed in pytest 5.4.0.
    
    
    - :issue:`7911`: Directories created by `tmpdir` are now considered stale after 3 days without modification (previous value was 3 hours) to avoid deleting directories still in use in long running test suites.
    
    
    
    Improved Documentation
    ----------------------
    
    - :issue:`7815`: Improve deprecation warning message for ``pytest._fillfuncargs()``.
    

    6.1.1

    =========================
    
    Bug Fixes
    ---------
    
    - :issue:`7807`: Fixed regression in pytest 6.1.0 causing incorrect rootdir to be determined in some non-trivial cases where parent directories have config files as well.
    
    
    - :issue:`7814`: Fixed crash in header reporting when :confval:`testpaths` is used and contains absolute paths (regression in 6.1.0).
    

    6.1.0

    =========================
    
    Breaking Changes
    ----------------
    
    - :issue:`5585`: As per our policy, the following features which have been deprecated in the 5.X series are now
    removed:
    
    * The ``funcargnames`` read-only property of ``FixtureRequest``, ``Metafunc``, and ``Function`` classes. Use ``fixturenames`` attribute.
    
    * ``pytest.fixture`` no longer supports positional arguments, pass all arguments by keyword instead.
    
    * Direct construction of ``Node`` subclasses now raise an error, use ``from_parent`` instead.
    
    * The default value for ``junit_family`` has changed to ``xunit2``. If you require the old format, add ``junit_family=xunit1`` to your configuration file.
    
    * The ``TerminalReporter`` no longer has a ``writer`` attribute. Plugin authors may use the public functions of the ``TerminalReporter`` instead of accessing the ``TerminalWriter`` object directly.
    
    * The ``--result-log`` option has been removed. Users are recommended to use the `pytest-reportlog &lt;https://github.com/pytest-dev/pytest-reportlog&gt;`__ plugin instead.
    
    
    For more information consult :std:doc:`deprecations` in the docs.
    
    
    
    Deprecations
    ------------
    
    - :issue:`6981`: The ``pytest.collect`` module is deprecated: all its names can be imported from ``pytest`` directly.
    
    
    - :issue:`7097`: The ``pytest._fillfuncargs`` function is deprecated. This function was kept
    for backward compatibility with an older plugin.
    
    It&#x27;s functionality is not meant to be used directly, but if you must replace
    it, use `function._request._fillfixtures()` instead, though note this is not
    a public API and may break in the future.
    
    
    - :issue:`7210`: The special ``-k &#x27;-expr&#x27;`` syntax to ``-k`` is deprecated. Use ``-k &#x27;not expr&#x27;``
    instead.
    
    The special ``-k &#x27;expr:&#x27;`` syntax to ``-k`` is deprecated. Please open an issue
    if you use this and want a replacement.
    
    
    - :issue:`7255`: The :hook:`pytest_warning_captured` hook is deprecated in favor
    of :hook:`pytest_warning_recorded`, and will be removed in a future version.
    
    
    - :issue:`7648`: The ``gethookproxy()`` and ``isinitpath()`` methods of ``FSCollector`` and ``Package`` are deprecated;
    use ``self.session.gethookproxy()`` and ``self.session.isinitpath()`` instead.
    This should work on all pytest versions.
    
    
    
    Features
    --------
    
    - :issue:`7667`: New ``--durations-min`` command-line flag controls the minimal duration for inclusion in the slowest list of tests shown by ``--durations``. Previously this was hard-coded to ``0.005s``.
    
    
    
    Improvements
    ------------
    
    - :issue:`6681`: Internal pytest warnings issued during the early stages of initialization are now properly handled and can filtered through :confval:`filterwarnings` or ``--pythonwarnings/-W``.
    
    This also fixes a number of long standing issues: :issue:`2891`, :issue:`7620`, :issue:`7426`.
    
    
    - :issue:`7572`: When a plugin listed in ``required_plugins`` is missing or an unknown config key is used with ``--strict-config``, a simple error message is now shown instead of a stacktrace.
    
    
    - :issue:`7685`: Added two new attributes :attr:`rootpath &lt;_pytest.config.Config.rootpath&gt;` and :attr:`inipath &lt;_pytest.config.Config.inipath&gt;` to :class:`Config &lt;_pytest.config.Config&gt;`.
    These attributes are :class:`pathlib.Path` versions of the existing :attr:`rootdir &lt;_pytest.config.Config.rootdir&gt;` and :attr:`inifile &lt;_pytest.config.Config.inifile&gt;` attributes,
    and should be preferred over them when possible.
    
    
    - :issue:`7780`: Public classes which are not designed to be inherited from are now marked :func:`final &lt;typing.final&gt;`.
    Code which inherits from these classes will trigger a type-checking (e.g. mypy) error, but will still work in runtime.
    Currently the ``final`` designation does not appear in the API Reference but hopefully will in the future.
    
    
    
    Bug Fixes
    ---------
    
    - :issue:`1953`: Fixed error when overwriting a parametrized fixture, while also reusing the super fixture value.
    
    .. code-block:: python
    
        conftest.py
       import pytest
    
    
       pytest.fixture(params=[1, 2])
       def foo(request):
           return request.param
    
    
        test_foo.py
       import pytest
    
    
       pytest.fixture
       def foo(foo):
           return foo * 2
    
    
    - :issue:`4984`: Fixed an internal error crash with ``IndexError: list index out of range`` when
    collecting a module which starts with a decorated function, the decorator
    raises, and assertion rewriting is enabled.
    
    
    - :issue:`7591`: pylint shouldn&#x27;t complain anymore about unimplemented abstract methods when inheriting from :ref:`File &lt;non-python tests&gt;`.
    
    
    - :issue:`7628`: Fixed test collection when a full path without a drive letter was passed to pytest on Windows (for example ``\projects\tests\test.py`` instead of ``c:\projects\tests\pytest.py``).
    
    
    - :issue:`7638`: Fix handling of command-line options that appear as paths but trigger an OS-level syntax error on Windows, such as the options used internally by ``pytest-xdist``.
    
    
    - :issue:`7742`: Fixed INTERNALERROR when accessing locals / globals with faulty ``exec``.
    
    
    
    Improved Documentation
    ----------------------
    
    - :issue:`1477`: Removed faq.rst and its reference in contents.rst.
    
    
    
    Trivial/Internal Changes
    ------------------------
    
    - :issue:`7536`: The internal ``junitxml`` plugin has rewritten to use ``xml.etree.ElementTree``.
    The order of attributes in XML elements might differ. Some unneeded escaping is
    no longer performed.
    
    
    - :issue:`7587`: The dependency on the ``more-itertools`` package has been removed.
    
    
    - :issue:`7631`: The result type of :meth:`capfd.readouterr() &lt;_pytest.capture.CaptureFixture.readouterr&gt;` (and similar) is no longer a namedtuple,
    but should behave like one in all respects. This was done for technical reasons.
    
    
    - :issue:`7671`: When collecting tests, pytest finds test classes and functions by examining the
    attributes of python objects (modules, classes and instances). To speed up this
    process, pytest now ignores builtin attributes (like ``__class__``,
    ``__delattr__`` and ``__new__``) without consulting the :confval:`python_classes` and
    :confval:`python_functions` configuration options and without passing them to plugins
    using the :hook:`pytest_pycollect_makeitem` hook.
    

    6.0.2

    =========================
    
    Bug Fixes
    ---------
    
    - :issue:`7148`: Fixed ``--log-cli`` potentially causing unrelated ``print`` output to be swallowed.
    
    
    - :issue:`7672`: Fixed log-capturing level restored incorrectly if ``caplog.set_level`` is called more than once.
    
    
    - :issue:`7686`: Fixed `NotSetType.token` being used as the parameter ID when the parametrization list is empty.
    Regressed in pytest 6.0.0.
    
    
    - :issue:`7707`: Fix internal error when handling some exceptions that contain multiple lines or the style uses multiple lines (``--tb=line`` for example).
    

    6.0.1

    =========================
    
    Bug Fixes
    ---------
    
    - :issue:`7394`: Passing an empty ``help`` value to ``Parser.add_option`` is now accepted instead of crashing when running ``pytest --help``.
    Passing ``None`` raises a more informative ``TypeError``.
    
    
    - :issue:`7558`: Fix pylint ``not-callable`` lint on ``pytest.mark.parametrize()`` and the other builtin marks:
    ``skip``, ``skipif``, ``xfail``, ``usefixtures``, ``filterwarnings``.
    
    
    - :issue:`7559`: Fix regression in plugins using ``TestReport.longreprtext`` (such as ``pytest-html``) when ``TestReport.longrepr`` is not a string.
    
    
    - :issue:`7569`: Fix logging capture handler&#x27;s level not reset on teardown after a call to ``caplog.set_level()``.
    

    6.0.0

    =========================
    
    (**Please see the full set of changes for this release also in the 6.0.0rc1 notes below**)
    
    Breaking Changes
    ----------------
    
    - :issue:`5584`: **PytestDeprecationWarning are now errors by default.**
    
    Following our plan to remove deprecated features with as little disruption as
    possible, all warnings of type ``PytestDeprecationWarning`` now generate errors
    instead of warning messages.
    
    **The affected features will be effectively removed in pytest 6.1**, so please consult the
    :std:doc:`deprecations` section in the docs for directions on how to update existing code.
    
    In the pytest ``6.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:
    
    .. code-block:: ini
    
       [pytest]
       filterwarnings =
           ignore::pytest.PytestDeprecationWarning
    
    But this will stop working when pytest ``6.1`` is released.
    
    **If you have concerns** about the removal of a specific feature, please add a
    comment to :issue:`5584`.
    
    
    - :issue:`7472`: The ``exec_()`` and ``is_true()`` methods of ``_pytest._code.Frame`` have been removed.
    
    
    
    Features
    --------
    
    - :issue:`7464`: Added support for :envvar:`NO_COLOR` and :envvar:`FORCE_COLOR` environment variables to control colored output.
    
    
    
    Improvements
    ------------
    
    - :issue:`7467`: ``--log-file`` CLI option and ``log_file`` ini marker now create subdirectories if needed.
    
    
    - :issue:`7489`: The :func:`pytest.raises` function has a clearer error message when ``match`` equals the obtained string but is not a regex match. In this case it is suggested to escape the regex.
    
    
    
    Bug Fixes
    ---------
    
    - :issue:`7392`: Fix the reported location of tests skipped with ``pytest.mark.skip`` when ``--runxfail`` is used.
    
    
    - :issue:`7491`: :fixture:`tmpdir` and :fixture:`tmp_path` no longer raise an error if the lock to check for
    stale temporary directories is not accessible.
    
    
    - :issue:`7517`: Preserve line endings when captured via ``capfd``.
    
    
    - :issue:`7534`: Restored the previous formatting of ``TracebackEntry.__str__`` which was changed by accident.
    
    
    
    Improved Documentation
    ----------------------
    
    - :issue:`7422`: Clarified when the ``usefixtures`` mark can apply fixtures to test.
    
    
    - :issue:`7441`: Add a note about ``-q`` option used in getting started guide.
    
    
    
    Trivial/Internal Changes
    ------------------------
    
    - :issue:`7389`: Fixture scope ``package`` is no longer considered experimental.
    

    6.0.0rc1

    ============================
    
    Breaking Changes
    ----------------
    
    - :issue:`1316`: ``TestReport.longrepr`` is now always an instance of ``ReprExceptionInfo``. Previously it was a ``str`` when a test failed with ``pytest.fail(..., pytrace=False)``.
    
    
    - :issue:`5965`: symlinks are no longer resolved during collection and matching `conftest.py` files with test file paths.
    
    Resolving symlinks for the current directory and during collection was introduced as a bugfix in 3.9.0, but it actually is a new feature which had unfortunate consequences in Windows and surprising results in other platforms.
    
    The team decided to step back on resolving symlinks at all, planning to review this in the future with a more solid solution (see discussion in
    :pull:`6523` for details).
    
    This might break test suites which made use of this feature; the fix is to create a symlink
    for the entire test tree, and not only to partial files/tress as it was possible previously.
    
    
    - :issue:`6505`: ``Testdir.run().parseoutcomes()`` now always returns the parsed nouns in plural form.
    
    Originally ``parseoutcomes()`` would always returns the nouns in plural form, but a change
    meant to improve the terminal summary by using singular form single items (``1 warning`` or ``1 error``)
    caused an unintended regression by changing the keys returned by ``parseoutcomes()``.
    
    Now the API guarantees to always return the plural form, so calls like this:
    
    .. code-block:: python
    
       result = testdir.runpytest()
       result.assert_outcomes(error=1)
    
    Need to be changed to:
    
    
    .. code-block:: python
    
       result = testdir.runpytest()
       result.assert_outcomes(errors=1)
    
    
    - :issue:`6903`: The ``os.dup()`` function is now assumed to exist. We are not aware of any
    supported Python 3 implementations which do not provide it.
    
    
    - :issue:`7040`: ``-k`` no longer matches against the names of the directories outside the test session root.
    
    Also, ``pytest.Package.name`` is now just the name of the directory containing the package&#x27;s
    ``__init__.py`` file, instead of the full path. This is consistent with how the other nodes
    are named, and also one of the reasons why ``-k`` would match against any directory containing
    the test suite.
    
    
    - :issue:`7122`: Expressions given to the ``-m`` and ``-k`` options are no longer evaluated using Python&#x27;s :func:`eval`.
    The format supports ``or``, ``and``, ``not``, parenthesis and general identifiers to match against.
    Python constants, keywords or other operators are no longer evaluated differently.
    
    
    - :issue:`7135`: Pytest now uses its own ``TerminalWriter`` class instead of using the one from the ``py`` library.
    Plugins generally access this class through ``TerminalReporter.writer``, ``TerminalReporter.write()``
    (and similar methods), or ``_pytest.config.create_terminal_writer()``.
    
    The following breaking changes were made:
    
    - Output (``write()`` method and others) no longer flush implicitly; the flushing behavior
     of the underlying file is respected. To flush explicitly (for example, if you
     want output to be shown before an end-of-line is printed), use ``write(flush=True)`` or
     ``terminal_writer.flush()``.
    - Explicit Windows console support was removed, delegated to the colorama library.
    - Support for writing ``bytes`` was removed.
    - The ``reline`` method and ``chars_on_current_line`` property were removed.
    - The ``stringio`` and ``encoding`` arguments was removed.
    - Support for passing a callable instead of a file was removed.
    
    
    - :issue:`7224`: The `item.catch_log_handler` and `item.catch_log_handlers` attributes, set by the
    logging plugin and never meant to be public, are no longer available.
    
    The deprecated ``--no-print-logs`` option and ``log_print`` ini option are removed. Use ``--show-capture`` instead.
    
    
    - :issue:`7226`: Removed the unused ``args`` parameter from ``pytest.Function.__init__``.
    
    
    - :issue:`7418`: Removed the `pytest_doctest_prepare_content` hook specification. This hook
    hasn&#x27;t been triggered by pytest for at least 10 years.
    
    
    - :issue:`7438`: Some changes were made to the internal ``_pytest._code.source``, listed here
    for the benefit of plugin authors who may be using it:
    
    - The ``deindent`` argument to ``Source()`` has been removed, now it is always true.
    - Support for zero or multiple arguments to ``Source()`` has been removed.
    - Support for comparing ``Source`` with an ``str`` has been removed.
    - The methods ``Source.isparseable()`` and ``Source.putaround()`` have been removed.
    - The method ``Source.compile()`` and function ``_pytest._code.compile()`` have
     been removed; use plain ``compile()`` instead.
    - The function ``_pytest._code.source.getsource()`` has been removed; use
     ``Source()`` directly instead.
    
    
    
    Deprecations
    ------------
    
    - :issue:`7210`: The special ``-k &#x27;-expr&#x27;`` syntax to ``-k`` is deprecated. Use ``-k &#x27;not expr&#x27;``
    instead.
    
    The special ``-k &#x27;expr:&#x27;`` syntax to ``-k`` is deprecated. Please open an issue
    if you use this and want a replacement.
    
    - :issue:`4049`: ``pytest_warning_captured`` is deprecated in favor of the ``pytest_warning_recorded`` hook.
    
    
    Features
    --------
    
    - :issue:`1556`: pytest now supports ``pyproject.toml`` files for configuration.
    
    The configuration options is similar to the one available in other formats, but must be defined
    in a ``[tool.pytest.ini_options]`` table to be picked up by pytest:
    
    .. code-block:: toml
    
        pyproject.toml
       [tool.pytest.ini_options]
       minversion = &quot;6.0&quot;
       addopts = &quot;-ra -q&quot;
       testpaths = [
           &quot;tests&quot;,
           &quot;integration&quot;,
       ]
    
    More information can be found :ref:`in the docs &lt;config file formats&gt;`.
    
    
    - :issue:`3342`: pytest now includes inline type annotations and exposes them to user programs.
    Most of the user-facing API is covered, as well as internal code.
    
    If you are running a type checker such as mypy on your tests, you may start
    noticing type errors indicating incorrect usage. If you run into an error that
    you believe to be incorrect, please let us know in an issue.
    
    The types were developed against mypy version 0.780. Versions before 0.750
    are known not to work. We recommend using the latest version. Other type
    checkers may work as well, but they are not officially verified to work by
    pytest yet.
    
    
    - :issue:`4049`: Introduced a new hook named `pytest_warning_recorded` to convey information about warnings captured by the internal `pytest` warnings plugin.
    
    This hook is meant to replace `pytest_warning_captured`, which is deprecated and will be removed in a future release.
    
    
    - :issue:`6471`: New command-line flags:
    
    * `--no-header`: disables the initial header, including platform, version, and plugins.
    * `--no-summary`: disables the final test summary, including warnings.
    
    
    - :issue:`6856`: A warning is now shown when an unknown key is read from a config INI file.
    
    The `--strict-config` flag has been added to treat these warnings as errors.
    
    
    - :issue:`6906`: Added `--code-highli
    opened by pyup-bot 3
  • Isn't there a way to empty cached results on according save operations?

    Isn't there a way to empty cached results on according save operations?

    Hey,

    I am wondering, why it wouldn't be smarter to let the decorator (somehow) clear related caches whenever a related model changes. Use Case:

    I have a big model with many related models and I need to filter them for a ListView Page. To display those values I would use cached_properties for data from other models like images. Since the related instances have not changed, we could use the cached_property. Now if we upload a new image, a signal could clear the cached_property used in the other model. The same goes for update or delete operations. That way the system would always be up to date, but max out the potential of caching where ever it makes sense.

    Is that clear? I am not an expert like you, but since I am currently learning about all this, I was curious.

    opened by oesah 3
  • Update coverage to 7.0.3

    Update coverage to 7.0.3

    This PR updates coverage from 4.4.2 to 7.0.3.

    Changelog

    7.0.3

    --------------------------
    
    - Fix: when using pytest-cov or pytest-xdist, or perhaps both, the combining
    step could fail with ``assert row is not None`` using 7.0.2.  This was due to
    a race condition that has always been possible and is still possible. In
    7.0.1 and before, the error was silently swallowed by the combining code.
    Now it will produce a message &quot;Couldn&#x27;t combine data file&quot; and ignore the
    data file as it used to do before 7.0.2.  Closes `issue 1522`_.
    
    .. _issue 1522: https://github.com/nedbat/coveragepy/issues/1522
    
    
    .. _changes_7-0-2:
    

    7.0.2

    --------------------------
    
    - Fix: when using the ``[run] relative_files = True`` setting, a relative
    ``[paths]`` pattern was still being made absolute.  This is now fixed,
    closing `issue 1519`_.
    
    - Fix: if Python doesn&#x27;t provide tomllib, then TOML configuration files can
    only be read if coverage.py is installed with the ``[toml]`` extra.
    Coverage.py will raise an error if TOML support is not installed when it sees
    your settings are in a .toml file. But it didn&#x27;t understand that
    ``[tools.coverage]`` was a valid section header, so the error wasn&#x27;t reported
    if you used that header, and settings were silently ignored.  This is now
    fixed, closing `issue 1516`_.
    
    - Fix: adjusted how decorators are traced on PyPy 7.3.10, fixing `issue 1515`_.
    
    - Fix: the ``coverage lcov`` report did not properly implement the
    ``--fail-under=MIN`` option.  This has been fixed.
    
    - Refactor: added many type annotations, including a number of refactorings.
    This should not affect outward behavior, but they were a bit invasive in some
    places, so keep your eyes peeled for oddities.
    
    - Refactor: removed the vestigial and long untested support for Jython and
    IronPython.
    
    .. _issue 1515: https://github.com/nedbat/coveragepy/issues/1515
    .. _issue 1516: https://github.com/nedbat/coveragepy/issues/1516
    .. _issue 1519: https://github.com/nedbat/coveragepy/issues/1519
    
    
    .. _changes_7-0-1:
    

    7.0.1

    --------------------------
    
    - When checking if a file mapping resolved to a file that exists, we weren&#x27;t
    considering files in .whl files.  This is now fixed, closing `issue 1511`_.
    
    - File pattern rules were too strict, forbidding plus signs and curly braces in
    directory and file names.  This is now fixed, closing `issue 1513`_.
    
    - Unusual Unicode or control characters in source files could prevent
    reporting.  This is now fixed, closing `issue 1512`_.
    
    - The PyPy wheel now installs on PyPy 3.7, 3.8, and 3.9, closing `issue 1510`_.
    
    .. _issue 1510: https://github.com/nedbat/coveragepy/issues/1510
    .. _issue 1511: https://github.com/nedbat/coveragepy/issues/1511
    .. _issue 1512: https://github.com/nedbat/coveragepy/issues/1512
    .. _issue 1513: https://github.com/nedbat/coveragepy/issues/1513
    
    
    .. _changes_7-0-0:
    

    7.0.0

    --------------------------
    
    Nothing new beyond 7.0.0b1.
    
    
    .. _changes_7-0-0b1:
    

    7.0.0b1

    &lt;changes_7-0-0b1_&gt;`_.)
    
    - Changes to file pattern matching, which might require updating your
    configuration:
    
    - Previously, ``*`` would incorrectly match directory separators, making
     precise matching difficult.  This is now fixed, closing `issue 1407`_.
    
    - Now ``**`` matches any number of nested directories, including none.
    
    - Improvements to combining data files when using the
    :ref:`config_run_relative_files` setting:
    
    - During ``coverage combine``, relative file paths are implicitly combined
     without needing a ``[paths]`` configuration setting.  This also fixed
     `issue 991`_.
    
    - A ``[paths]`` setting like ``*/foo`` will now match ``foo/bar.py`` so that
     relative file paths can be combined more easily.
    
    - The setting is properly interpreted in more places, fixing `issue 1280`_.
    
    - Fixed environment variable expansion in pyproject.toml files.  It was overly
    broad, causing errors outside of coverage.py settings, as described in `issue
    1481`_ and `issue 1345`_.  This is now fixed, but in rare cases will require
    changing your pyproject.toml to quote non-string values that use environment
    substitution.
    
    - Fixed internal logic that prevented coverage.py from running on
    implementations other than CPython or PyPy (`issue 1474`_).
    
    .. _issue 991: https://github.com/nedbat/coveragepy/issues/991
    .. _issue 1280: https://github.com/nedbat/coveragepy/issues/1280
    .. _issue 1345: https://github.com/nedbat/coveragepy/issues/1345
    .. _issue 1407: https://github.com/nedbat/coveragepy/issues/1407
    .. _issue 1474: https://github.com/nedbat/coveragepy/issues/1474
    .. _issue 1481: https://github.com/nedbat/coveragepy/issues/1481
    
    
    .. _changes_6-5-0:
    

    6.6.0

    - Changes to file pattern matching, which might require updating your
    configuration:
    
    - Previously, ``*`` would incorrectly match directory separators, making
     precise matching difficult.  This is now fixed, closing `issue 1407`_.
    
    - Now ``**`` matches any number of nested directories, including none.
    
    - Improvements to combining data files when using the
    :ref:`config_run_relative_files` setting, which might require updating your
    configuration:
    
    - During ``coverage combine``, relative file paths are implicitly combined
     without needing a ``[paths]`` configuration setting.  This also fixed
     `issue 991`_.
    
    - A ``[paths]`` setting like ``*/foo`` will now match ``foo/bar.py`` so that
     relative file paths can be combined more easily.
    
    - The :ref:`config_run_relative_files` setting is properly interpreted in
     more places, fixing `issue 1280`_.
    
    - When remapping file paths with ``[paths]``, a path will be remapped only if
    the resulting path exists.  The documentation has long said the prefix had to
    exist, but it was never enforced.  This fixes `issue 608`_, improves `issue
    649`_, and closes `issue 757`_.
    
    - Reporting operations now implicitly use the ``[paths]`` setting to remap file
    paths within a single data file.  Combining multiple files still requires the
    ``coverage combine`` step, but this simplifies some single-file situations.
    Closes `issue 1212`_ and `issue 713`_.
    
    - The ``coverage report`` command now has a ``--format=`` option.  The original
    style is now ``--format=text``, and is the default.
    
    - Using ``--format=markdown`` will write the table in Markdown format, thanks
     to `Steve Oswald &lt;pull 1479_&gt;`_, closing `issue 1418`_.
    
    - Using ``--format=total`` will write a single total number to the
     output.  This can be useful for making badges or writing status updates.
    
    - Combining data files with ``coverage combine`` now hashes the data files to
    skip files that add no new information.  This can reduce the time needed.
    Many details affect the speed-up, but for coverage.py&#x27;s own test suite,
    combining is about 40% faster. Closes `issue 1483`_.
    
    - When searching for completely un-executed files, coverage.py uses the
    presence of ``__init__.py`` files to determine which directories have source
    that could have been imported.  However, `implicit namespace packages`_ don&#x27;t
    require ``__init__.py``.  A new setting ``[report]
    include_namespace_packages`` tells coverage.py to consider these directories
    during reporting.  Thanks to `Felix Horvat &lt;pull 1387_&gt;`_ for the
    contribution.  Closes `issue 1383`_ and `issue 1024`_.
    
    - Fixed environment variable expansion in pyproject.toml files.  It was overly
    broad, causing errors outside of coverage.py settings, as described in `issue
    1481`_ and `issue 1345`_.  This is now fixed, but in rare cases will require
    changing your pyproject.toml to quote non-string values that use environment
    substitution.
    
    - An empty file has a coverage total of 100%, but used to fail with
    ``--fail-under``.  This has been fixed, closing `issue 1470`_.
    
    - The text report table no longer writes out two separator lines if there are
    no files listed in the table.  One is plenty.
    
    - Fixed a mis-measurement of a strange use of wildcard alternatives in
    match/case statements, closing `issue 1421`_.
    
    - Fixed internal logic that prevented coverage.py from running on
    implementations other than CPython or PyPy (`issue 1474`_).
    
    - The deprecated ``[run] note`` setting has been completely removed.
    
    .. _implicit namespace packages: https://peps.python.org/pep-0420/
    .. _issue 608: https://github.com/nedbat/coveragepy/issues/608
    .. _issue 649: https://github.com/nedbat/coveragepy/issues/649
    .. _issue 713: https://github.com/nedbat/coveragepy/issues/713
    .. _issue 757: https://github.com/nedbat/coveragepy/issues/757
    .. _issue 991: https://github.com/nedbat/coveragepy/issues/991
    .. _issue 1024: https://github.com/nedbat/coveragepy/issues/1024
    .. _issue 1212: https://github.com/nedbat/coveragepy/issues/1212
    .. _issue 1280: https://github.com/nedbat/coveragepy/issues/1280
    .. _issue 1345: https://github.com/nedbat/coveragepy/issues/1345
    .. _issue 1383: https://github.com/nedbat/coveragepy/issues/1383
    .. _issue 1407: https://github.com/nedbat/coveragepy/issues/1407
    .. _issue 1418: https://github.com/nedbat/coveragepy/issues/1418
    .. _issue 1421: https://github.com/nedbat/coveragepy/issues/1421
    .. _issue 1470: https://github.com/nedbat/coveragepy/issues/1470
    .. _issue 1474: https://github.com/nedbat/coveragepy/issues/1474
    .. _issue 1481: https://github.com/nedbat/coveragepy/issues/1481
    .. _issue 1483: https://github.com/nedbat/coveragepy/issues/1483
    .. _pull 1387: https://github.com/nedbat/coveragepy/pull/1387
    .. _pull 1479: https://github.com/nedbat/coveragepy/pull/1479
    
    
    
    .. _changes_6-6-0b1:
    

    6.6.0b1

    ----------------------------
    

    6.5.0

    --------------------------
    
    - The JSON report now includes details of which branches were taken, and which
    are missing for each file. Thanks, `Christoph Blessing &lt;pull 1438_&gt;`_. Closes
    `issue 1425`_.
    
    - Starting with coverage.py 6.2, ``class`` statements were marked as a branch.
    This wasn&#x27;t right, and has been reverted, fixing `issue 1449`_. Note this
    will very slightly reduce your coverage total if you are measuring branch
    coverage.
    
    - Packaging is now compliant with `PEP 517`_, closing `issue 1395`_.
    
    - A new debug option ``--debug=pathmap`` shows details of the remapping of
    paths that happens during combine due to the ``[paths]`` setting.
    
    - Fix an internal problem with caching of invalid Python parsing. Found by
    OSS-Fuzz, fixing their `bug 50381`_.
    
    .. _bug 50381: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=50381
    .. _PEP 517: https://peps.python.org/pep-0517/
    .. _issue 1395: https://github.com/nedbat/coveragepy/issues/1395
    .. _issue 1425: https://github.com/nedbat/coveragepy/issues/1425
    .. _issue 1449: https://github.com/nedbat/coveragepy/issues/1449
    .. _pull 1438: https://github.com/nedbat/coveragepy/pull/1438
    
    
    .. _changes_6-4-4:
    

    6.4.4

    --------------------------
    
    - Wheels are now provided for Python 3.11.
    
    
    .. _changes_6-4-3:
    

    6.4.3

    --------------------------
    
    - Fix a failure when combining data files if the file names contained glob-like
    patterns.  Thanks, `Michael Krebs and Benjamin Schubert &lt;pull 1405_&gt;`_.
    
    - Fix a messaging failure when combining Windows data files on a different
    drive than the current directory, closing `issue 1428`_.  Thanks, `Lorenzo
    Micò &lt;pull 1430_&gt;`_.
    
    - Fix path calculations when running in the root directory, as you might do in
    a Docker container. Thanks `Arthur Rio &lt;pull 1403_&gt;`_.
    
    - Filtering in the HTML report wouldn&#x27;t work when reloading the index page.
    This is now fixed.  Thanks, `Marc Legendre &lt;pull 1413_&gt;`_.
    
    - Fix a problem with Cython code measurement, closing `issue 972`_.  Thanks,
    `Matus Valo &lt;pull 1347_&gt;`_.
    
    .. _issue 972: https://github.com/nedbat/coveragepy/issues/972
    .. _issue 1428: https://github.com/nedbat/coveragepy/issues/1428
    .. _pull 1347: https://github.com/nedbat/coveragepy/pull/1347
    .. _pull 1403: https://github.com/nedbat/coveragepy/issues/1403
    .. _pull 1405: https://github.com/nedbat/coveragepy/issues/1405
    .. _pull 1413: https://github.com/nedbat/coveragepy/issues/1413
    .. _pull 1430: https://github.com/nedbat/coveragepy/pull/1430
    
    
    .. _changes_6-4-2:
    

    6.4.2

    --------------------------
    
    - Updated for a small change in Python 3.11.0 beta 4: modules now start with a
    line with line number 0, which is ignored.  This line cannot be executed, so
    coverage totals were thrown off.  This line is now ignored by coverage.py,
    but this also means that truly empty modules (like ``__init__.py``) have no
    lines in them, rather than one phantom line.  Fixes `issue 1419`_.
    
    - Internal debugging data added to sys.modules is now an actual module, to
    avoid confusing code that examines everything in sys.modules.  Thanks,
    `Yilei Yang &lt;pull 1399_&gt;`_.
    
    .. _issue 1419: https://github.com/nedbat/coveragepy/issues/1419
    .. _pull 1399: https://github.com/nedbat/coveragepy/pull/1399
    
    
    .. _changes_6-4-1:
    

    6.4.1

    --------------------------
    
    - Greatly improved performance on PyPy, and other environments that need the
    pure Python trace function.  Thanks, Carl Friedrich Bolz-Tereick (`pull
    1381`_ and `pull 1388`_).  Slightly improved performance when using the C
    trace function, as most environments do.  Closes `issue 1339`_.
    
    - The conditions for using tomllib from the standard library have been made
    more precise, so that 3.11 alphas will continue to work. Closes `issue
    1390`_.
    
    .. _issue 1339: https://github.com/nedbat/coveragepy/issues/1339
    .. _pull 1381: https://github.com/nedbat/coveragepy/pull/1381
    .. _pull 1388: https://github.com/nedbat/coveragepy/pull/1388
    .. _issue 1390: https://github.com/nedbat/coveragepy/issues/1390
    
    
    .. _changes_64:
    

    6.4

    ------------------------
    
    - A new setting, :ref:`config_run_sigterm`, controls whether a SIGTERM signal
    handler is used.  In 6.3, the signal handler was always installed, to capture
    data at unusual process ends.  Unfortunately, this introduced other problems
    (see `issue 1310`_).  Now the signal handler is only used if you opt-in by
    setting ``[run] sigterm = true``.
    
    - Small changes to the HTML report:
    
    - Added links to next and previous file, and more keyboard shortcuts: ``[``
     and ``]`` for next file and previous file; ``u`` for up to the index; and
     ``?`` to open/close the help panel.  Thanks, `J. M. F. Tsang
     &lt;pull 1364_&gt;`_.
    
    - The time stamp and version are displayed at the top of the report.  Thanks,
     `Ammar Askar &lt;pull 1354_&gt;`_. Closes `issue 1351`_.
    
    - A new debug option ``debug=sqldata`` adds more detail to ``debug=sql``,
    logging all the data being written to the database.
    
    - Previously, running ``coverage report`` (or any of the reporting commands) in
    an empty directory would create a .coverage data file.  Now they do not,
    fixing `issue 1328`_.
    
    - On Python 3.11, the ``[toml]`` extra no longer installs tomli, instead using
    tomllib from the standard library.  Thanks `Shantanu &lt;pull 1359_&gt;`_.
    
    - In-memory CoverageData objects now properly update(), closing `issue 1323`_.
    
    .. _issue 1310: https://github.com/nedbat/coveragepy/issues/1310
    .. _issue 1323: https://github.com/nedbat/coveragepy/issues/1323
    .. _issue 1328: https://github.com/nedbat/coveragepy/issues/1328
    .. _issue 1351: https://github.com/nedbat/coveragepy/issues/1351
    .. _pull 1354: https://github.com/nedbat/coveragepy/pull/1354
    .. _pull 1359: https://github.com/nedbat/coveragepy/pull/1359
    .. _pull 1364: https://github.com/nedbat/coveragepy/pull/1364
    
    
    .. _changes_633:
    

    6.3.3

    --------------------------
    
    - Fix: Coverage.py now builds successfully on CPython 3.11 (3.11.0b1) again.
    Closes `issue 1367`_.  Some results for generators may have changed.
    
    .. _issue 1367: https://github.com/nedbat/coveragepy/issues/1367
    
    
    .. _changes_632:
    

    6.3.2

    --------------------------
    
    - Fix: adapt to pypy3.9&#x27;s decorator tracing behavior.  It now traces function
    decorators like CPython 3.8: both the -line and the def-line are traced.
    Fixes `issue 1326`_.
    
    - Debug: added ``pybehave`` to the list of :ref:`coverage debug &lt;cmd_debug&gt;`
    and :ref:`cmd_run_debug` options.
    
    - Fix: show an intelligible error message if ``--concurrency=multiprocessing``
    is used without a configuration file.  Closes `issue 1320`_.
    
    .. _issue 1320: https://github.com/nedbat/coveragepy/issues/1320
    .. _issue 1326: https://github.com/nedbat/coveragepy/issues/1326
    
    
    .. _changes_631:
    

    6.3.1

    --------------------------
    
    - Fix: deadlocks could occur when terminating processes.  Some of these
    deadlocks (described in `issue 1310`_) are now fixed.
    
    - Fix: a signal handler was being set from multiple threads, causing an error:
    &quot;ValueError: signal only works in main thread&quot;.  This is now fixed, closing
    `issue 1312`_.
    
    - Fix: ``--precision`` on the command-line was being ignored while considering
    ``--fail-under``.  This is now fixed, thanks to
    `Marcelo Trylesinski &lt;pull 1317_&gt;`_.
    
    - Fix: releases no longer provide 3.11.0-alpha wheels. Coverage.py uses CPython
    internal fields which are moving during the alpha phase. Fixes `issue 1316`_.
    
    .. _issue 1310: https://github.com/nedbat/coveragepy/issues/1310
    .. _issue 1312: https://github.com/nedbat/coveragepy/issues/1312
    .. _issue 1316: https://github.com/nedbat/coveragepy/issues/1316
    .. _pull 1317: https://github.com/nedbat/coveragepy/pull/1317
    
    
    .. _changes_63:
    

    6.3

    ------------------------
    
    - Feature: Added the ``lcov`` command to generate reports in LCOV format.
    Thanks, `Bradley Burns &lt;pull 1289_&gt;`_. Closes issues `587 &lt;issue 587_&gt;`_
    and `626 &lt;issue 626_&gt;`_.
    
    - Feature: the coverage data file can now be specified on the command line with
    the ``--data-file`` option in any command that reads or writes data.  This is
    in addition to the existing ``COVERAGE_FILE`` environment variable.  Closes
    `issue 624`_. Thanks, `Nikita Bloshchanevich &lt;pull 1304_&gt;`_.
    
    - Feature: coverage measurement data will now be written when a SIGTERM signal
    is received by the process.  This includes
    :meth:`Process.terminate &lt;python:multiprocessing.Process.terminate&gt;`,
    and other ways to terminate a process.  Currently this is only on Linux and
    Mac; Windows is not supported.  Fixes `issue 1307`_.
    
    - Dropped support for Python 3.6, which reached end-of-life on 2021-12-23.
    
    - Updated Python 3.11 support to 3.11.0a4, fixing `issue 1294`_.
    
    - Fix: the coverage data file is now created in a more robust way, to avoid
    problems when multiple processes are trying to write data at once. Fixes
    issues `1303 &lt;issue 1303_&gt;`_ and `883 &lt;issue 883_&gt;`_.
    
    - Fix: a .gitignore file will only be written into the HTML report output
    directory if the directory is empty.  This should prevent certain unfortunate
    accidents of writing the file where it is not wanted.
    
    - Releases now have MacOS arm64 wheels for Apple Silicon, fixing `issue 1288`_.
    
    .. _issue 587: https://github.com/nedbat/coveragepy/issues/587
    .. _issue 624: https://github.com/nedbat/coveragepy/issues/624
    .. _issue 626: https://github.com/nedbat/coveragepy/issues/626
    .. _issue 883: https://github.com/nedbat/coveragepy/issues/883
    .. _issue 1288: https://github.com/nedbat/coveragepy/issues/1288
    .. _issue 1294: https://github.com/nedbat/coveragepy/issues/1294
    .. _issue 1303: https://github.com/nedbat/coveragepy/issues/1303
    .. _issue 1307: https://github.com/nedbat/coveragepy/issues/1307
    .. _pull 1289: https://github.com/nedbat/coveragepy/pull/1289
    .. _pull 1304: https://github.com/nedbat/coveragepy/pull/1304
    
    
    .. _changes_62:
    

    6.2

    ------------------------
    
    - Feature: Now the ``--concurrency`` setting can now have a list of values, so
    that threads and another lightweight threading package can be measured
    together, such as ``--concurrency=gevent,thread``.  Closes `issue 1012`_ and
    `issue 1082`_.
    
    - Fix: A module specified as the ``source`` setting is imported during startup,
    before the user program imports it.  This could cause problems if the rest of
    the program isn&#x27;t ready yet.  For example, `issue 1203`_ describes a Django
    setting that is accessed before settings have been configured.  Now the early
    import is wrapped in a try/except so errors then don&#x27;t stop execution.
    
    - Fix: A colon in a decorator expression would cause an exclusion to end too
    early, preventing the exclusion of the decorated function. This is now fixed.
    
    - Fix: The HTML report now will not overwrite a .gitignore file that already
    exists in the HTML output directory (follow-on for `issue 1244`_).
    
    - API: The exceptions raised by Coverage.py have been specialized, to provide
    finer-grained catching of exceptions by third-party code.
    
    - API: Using ``suffix=False`` when constructing a Coverage object with
    multiprocessing wouldn&#x27;t suppress the data file suffix (`issue 989`_).  This
    is now fixed.
    
    - Debug: The ``coverage debug data`` command will now sniff out combinable data
    files, and report on all of them.
    
    - Debug: The ``coverage debug`` command used to accept a number of topics at a
    time, and show all of them, though this was never documented.  This no longer
    works, to allow for command-line options in the future.
    
    .. _issue 989: https://github.com/nedbat/coveragepy/issues/989
    .. _issue 1012: https://github.com/nedbat/coveragepy/issues/1012
    .. _issue 1082: https://github.com/nedbat/coveragepy/issues/1082
    .. _issue 1203: https://github.com/nedbat/coveragepy/issues/1203
    
    
    .. _changes_612:
    

    6.1.2

    --------------------------
    
    - Python 3.11 is supported (tested with 3.11.0a2).  One still-open issue has to
    do with `exits through with-statements &lt;issue 1270_&gt;`_.
    
    - Fix: When remapping file paths through the ``[paths]`` setting while
    combining, the ``[run] relative_files`` setting was ignored, resulting in
    absolute paths for remapped file names (`issue 1147`_).  This is now fixed.
    
    - Fix: Complex conditionals over excluded lines could have incorrectly reported
    a missing branch (`issue 1271`_). This is now fixed.
    
    - Fix: More exceptions are now handled when trying to parse source files for
    reporting.  Problems that used to terminate coverage.py can now be handled
    with ``[report] ignore_errors``.  This helps with plugins failing to read
    files (`django_coverage_plugin issue 78`_).
    
    - Fix: Removed another vestige of jQuery from the source tarball
    (`issue 840`_).
    
    - Fix: Added a default value for a new-to-6.x argument of an internal class.
    This unsupported class is being used by coveralls (`issue 1273`_). Although
    I&#x27;d rather not &quot;fix&quot; unsupported interfaces, it&#x27;s actually nicer with a
    default value.
    
    .. _django_coverage_plugin issue 78: https://github.com/nedbat/django_coverage_plugin/issues/78
    .. _issue 1147: https://github.com/nedbat/coveragepy/issues/1147
    .. _issue 1270: https://github.com/nedbat/coveragepy/issues/1270
    .. _issue 1271: https://github.com/nedbat/coveragepy/issues/1271
    .. _issue 1273: https://github.com/nedbat/coveragepy/issues/1273
    
    
    .. _changes_611:
    

    6.1.1

    --------------------------
    
    - Fix: The sticky header on the HTML report didn&#x27;t work unless you had branch
    coverage enabled. This is now fixed: the sticky header works for everyone.
    (Do people still use coverage without branch measurement!? j/k)
    
    - Fix: When using explicitly declared namespace packages, the &quot;already imported
    a file that will be measured&quot; warning would be issued (`issue 888`_).  This
    is now fixed.
    
    .. _issue 888: https://github.com/nedbat/coveragepy/issues/888
    
    
    .. _changes_61:
    

    6.1

    ------------------------
    
    - Deprecated: The ``annotate`` command and the ``Coverage.annotate`` function
    will be removed in a future version, unless people let me know that they are
    using it.  Instead, the ``html`` command gives better-looking (and more
    accurate) output, and the ``report -m`` command will tell you line numbers of
    missing lines.  Please get in touch if you have a reason to use ``annotate``
    over those better options: nednedbatchelder.com.
    
    - Feature: Coverage now sets an environment variable, ``COVERAGE_RUN`` when
    running your code with the ``coverage run`` command.  The value is not
    important, and may change in the future.  Closes `issue 553`_.
    
    - Feature: The HTML report pages for Python source files now have a sticky
    header so the file name and controls are always visible.
    
    - Feature: The ``xml`` and ``json`` commands now describe what they wrote
    where.
    
    - Feature: The ``html``, ``combine``, ``xml``, and ``json`` commands all accept
    a ``-q/--quiet`` option to suppress the messages they write to stdout about
    what they are doing (`issue 1254`_).
    
    - Feature: The ``html`` command writes a ``.gitignore`` file into the HTML
    output directory, to prevent the report from being committed to git.  If you
    want to commit it, you will need to delete that file.  Closes `issue 1244`_.
    
    - Feature: Added support for PyPy 3.8.
    
    - Fix: More generated code is now excluded from measurement.  Code such as
    `attrs`_ boilerplate, or doctest code, was being measured though the
    synthetic line numbers meant they were never reported.  Once Cython was
    involved though, the generated .so files were parsed as Python, raising
    syntax errors, as reported in `issue 1160`_.  This is now fixed.
    
    - Fix: When sorting human-readable names, numeric components are sorted
    correctly: file10.py will appear after file9.py.  This applies to file names,
    module names, environment variables, and test contexts.
    
    - Performance: Branch coverage measurement is faster, though you might only
    notice on code that is executed many times, such as long-running loops.
    
    - Build: jQuery is no longer used or vendored (`issue 840`_ and `issue 1118`_).
    Huge thanks to Nils Kattenbeck (septatrix) for the conversion to vanilla
    JavaScript in `pull request 1248`_.
    
    .. _issue 553: https://github.com/nedbat/coveragepy/issues/553
    .. _issue 840: https://github.com/nedbat/coveragepy/issues/840
    .. _issue 1118: https://github.com/nedbat/coveragepy/issues/1118
    .. _issue 1160: https://github.com/nedbat/coveragepy/issues/1160
    .. _issue 1244: https://github.com/nedbat/coveragepy/issues/1244
    .. _pull request 1248: https://github.com/nedbat/coveragepy/pull/1248
    .. _issue 1254: https://github.com/nedbat/coveragepy/issues/1254
    .. _attrs: https://www.attrs.org/
    
    
    .. _changes_602:
    

    6.0.2

    --------------------------
    
    - Namespace packages being measured weren&#x27;t properly handled by the new code
    that ignores third-party packages. If the namespace package was installed, it
    was ignored as a third-party package.  That problem (`issue 1231`_) is now
    fixed.
    
    - Packages named as &quot;source packages&quot; (with ``source``, or ``source_pkgs``, or
    pytest-cov&#x27;s ``--cov``) might have been only partially measured.  Their
    top-level statements could be marked as un-executed, because they were
    imported by coverage.py before measurement began (`issue 1232`_).  This is
    now fixed, but the package will be imported twice, once by coverage.py, then
    again by your test suite.  This could cause problems if importing the package
    has side effects.
    
    - The :meth:`.CoverageData.contexts_by_lineno` method was documented to return
    a dict, but was returning a defaultdict.  Now it returns a plain dict.  It
    also no longer returns negative numbered keys.
    
    .. _issue 1231: https://github.com/nedbat/coveragepy/issues/1231
    .. _issue 1232: https://github.com/nedbat/coveragepy/issues/1232
    
    
    .. _changes_601:
    

    6.0.1

    --------------------------
    
    - In 6.0, the coverage.py exceptions moved from coverage.misc to
    coverage.exceptions. These exceptions are not part of the public supported
    API, CoverageException is. But a number of other third-party packages were
    importing the exceptions from coverage.misc, so they are now available from
    there again (`issue 1226`_).
    
    - Changed an internal detail of how tomli is imported, so that tomli can use
    coverage.py for their own test suite (`issue 1228`_).
    
    - Defend against an obscure possibility under code obfuscation, where a
    function can have an argument called &quot;self&quot;, but no local named &quot;self&quot;
    (`pull request 1210`_).  Thanks, Ben Carlsson.
    
    .. _pull request 1210: https://github.com/nedbat/coveragepy/pull/1210
    .. _issue 1226: https://github.com/nedbat/coveragepy/issues/1226
    .. _issue 1228: https://github.com/nedbat/coveragepy/issues/1228
    
    
    .. _changes_60:
    

    6.0

    ------------------------
    
    - The ``coverage html`` command now prints a message indicating where the HTML
    report was written.  Fixes `issue 1195`_.
    
    - The ``coverage combine`` command now prints messages indicating each data
    file being combined.  Fixes `issue 1105`_.
    
    - The HTML report now includes a sentence about skipped files due to
    ``skip_covered`` or ``skip_empty`` settings.  Fixes `issue 1163`_.
    
    - Unrecognized options in the configuration file are no longer errors. They are
    now warnings, to ease the use of coverage across versions.  Fixes `issue
    1035`_.
    
    - Fix handling of exceptions through context managers in Python 3.10. A missing
    exception is no longer considered a missing branch from the with statement.
    Fixes `issue 1205`_.
    
    - Fix another rarer instance of &quot;Error binding parameter 0 - probably
    unsupported type.&quot; (`issue 1010`_).
    
    - Creating a directory for the coverage data file now is safer against
    conflicts when two coverage runs happen simultaneously (`pull 1220`_).
    Thanks, Clément Pit-Claudel.
    
    .. _issue 1035: https://github.com/nedbat/coveragepy/issues/1035
    .. _issue 1105: https://github.com/nedbat/coveragepy/issues/1105
    .. _issue 1163: https://github.com/nedbat/coveragepy/issues/1163
    .. _issue 1195: https://github.com/nedbat/coveragepy/issues/1195
    .. _issue 1205: https://github.com/nedbat/coveragepy/issues/1205
    .. _pull 1220: https://github.com/nedbat/coveragepy/pull/1220
    
    
    .. _changes_60b1:
    

    6.0b1

    --------------------------
    
    - Dropped support for Python 2.7, PyPy 2, and Python 3.5.
    
    - Added support for the Python 3.10 ``match/case`` syntax.
    
    - Data collection is now thread-safe.  There may have been rare instances of
    exceptions raised in multi-threaded programs.
    
    - Plugins (like the `Django coverage plugin`_) were generating &quot;Already
    imported a file that will be measured&quot; warnings about Django itself.  These
    have been fixed, closing `issue 1150`_.
    
    - Warnings generated by coverage.py are now real Python warnings.
    
    - Using ``--fail-under=100`` with coverage near 100% could result in the
    self-contradictory message :code:`total of 100 is less than fail-under=100`.
    This bug (`issue 1168`_) is now fixed.
    
    - The ``COVERAGE_DEBUG_FILE`` environment variable now accepts ``stdout`` and
    ``stderr`` to write to those destinations.
    
    - TOML parsing now uses the `tomli`_ library.
    
    - Some minor changes to usually invisible details of the HTML report:
    
    - Use a modern hash algorithm when fingerprinting, for high-security
     environments (`issue 1189`_).  When generating the HTML report, we save the
     hash of the data, to avoid regenerating an unchanged HTML page. We used to
     use MD5 to generate the hash, and now use SHA-3-256.  This was never a
     security concern, but security scanners would notice the MD5 algorithm and
     raise a false alarm.
    
    - Change how report file names are generated, to avoid leading underscores
     (`issue 1167`_), to avoid rare file name collisions (`issue 584`_), and to
     avoid file names becoming too long (`issue 580`_).
    
    .. _Django coverage plugin: https://pypi.org/project/django-coverage-plugin/
    .. _issue 580: https://github.com/nedbat/coveragepy/issues/580
    .. _issue 584: https://github.com/nedbat/coveragepy/issues/584
    .. _issue 1150: https://github.com/nedbat/coveragepy/issues/1150
    .. _issue 1167: https://github.com/nedbat/coveragepy/issues/1167
    .. _issue 1168: https://github.com/nedbat/coveragepy/issues/1168
    .. _issue 1189: https://github.com/nedbat/coveragepy/issues/1189
    .. _tomli: https://pypi.org/project/tomli/
    
    
    .. _changes_56b1:
    

    5.6b1

    --------------------------
    
    Note: 5.6 final was never released. These changes are part of 6.0.
    
    - Third-party packages are now ignored in coverage reporting.  This solves a
    few problems:
    
    - Coverage will no longer report about other people&#x27;s code (`issue 876`_).
     This is true even when using ``--source=.`` with a venv in the current
     directory.
    
    - Coverage will no longer generate &quot;Already imported a file that will be
     measured&quot; warnings about coverage itself (`issue 905`_).
    
    - The HTML report uses j/k to move up and down among the highlighted chunks of
    code.  They used to highlight the current chunk, but 5.0 broke that behavior.
    Now the highlighting is working again.
    
    - The JSON report now includes ``percent_covered_display``, a string with the
    total percentage, rounded to the same number of decimal places as the other
    reports&#x27; totals.
    
    .. _issue 876: https://github.com/nedbat/coveragepy/issues/876
    .. _issue 905: https://github.com/nedbat/coveragepy/issues/905
    
    
    .. _changes_55:
    

    5.5

    ------------------------
    
    - ``coverage combine`` has a new option, ``--keep`` to keep the original data
    files after combining them.  The default is still to delete the files after
    they have been combined.  This was requested in `issue 1108`_ and implemented
    in `pull request 1110`_.  Thanks, Éric Larivière.
    
    - When reporting missing branches in ``coverage report``, branches aren&#x27;t
    reported that jump to missing lines.  This adds to the long-standing behavior
    of not reporting branches from missing lines.  Now branches are only reported
    if both the source and destination lines are executed.  Closes both `issue
    1065`_ and `issue 955`_.
    
    - Minor improvements to the HTML report:
    
    - The state of the line visibility selector buttons is saved in local storage
     so you don&#x27;t have to fiddle with them so often, fixing `issue 1123`_.
    
    - It has a little more room for line numbers so that 4-digit numbers work
     well, fixing `issue 1124`_.
    
    - Improved the error message when combining line and branch data, so that users
    will be more likely to understand what&#x27;s happening, closing `issue 803`_.
    
    .. _issue 803: https://github.com/nedbat/coveragepy/issues/803
    .. _issue 955: https://github.com/nedbat/coveragepy/issues/955
    .. _issue 1065: https://github.com/nedbat/coveragepy/issues/1065
    .. _issue 1108: https://github.com/nedbat/coveragepy/issues/1108
    .. _pull request 1110: https://github.com/nedbat/coveragepy/pull/1110
    .. _issue 1123: https://github.com/nedbat/coveragepy/issues/1123
    .. _issue 1124: https://github.com/nedbat/coveragepy/issues/1124
    
    
    .. _changes_54:
    

    5.4

    ------------------------
    
    - The text report produced by ``coverage report`` now always outputs a TOTAL
    line, even if only one Python file is reported.  This makes regex parsing
    of the output easier.  Thanks, Judson Neer.  This had been requested a number
    of times (`issue 1086`_, `issue 922`_, `issue 732`_).
    
    - The ``skip_covered`` and ``skip_empty`` settings in the configuration file
    can now be specified in the ``[html]`` section, so that text reports and HTML
    reports can use separate settings.  The HTML report will still use the
    ``[report]`` settings if there isn&#x27;t a value in the ``[html]`` section.
    Closes `issue 1090`_.
    
    - Combining files on Windows across drives now works properly, fixing `issue
    577`_.  Thanks, `Valentin Lab &lt;pr1080_&gt;`_.
    
    - Fix an obscure warning from deep in the _decimal module, as reported in
    `issue 1084`_.
    
    - Update to support Python 3.10 alphas in progress, including `PEP 626: Precise
    line numbers for debugging and other tools &lt;pep626_&gt;`_.
    
    .. _issue 577: https://github.com/nedbat/coveragepy/issues/577
    .. _issue 732: https://github.com/nedbat/coveragepy/issues/732
    .. _issue 922: https://github.com/nedbat/coveragepy/issues/922
    .. _issue 1084: https://github.com/nedbat/coveragepy/issues/1084
    .. _issue 1086: https://github.com/nedbat/coveragepy/issues/1086
    .. _issue 1090: https://github.com/nedbat/coveragepy/issues/1090
    .. _pr1080: https://github.com/nedbat/coveragepy/pull/1080
    .. _pep626: https://www.python.org/dev/peps/pep-0626/
    
    
    .. _changes_531:
    

    5.3.1

    --------------------------
    
    - When using ``--source`` on a large source tree, v5.x was slower than previous
    versions.  This performance regression is now fixed, closing `issue 1037`_.
    
    - Mysterious SQLite errors can happen on PyPy, as reported in `issue 1010`_. An
    immediate retry seems to fix the problem, although it is an unsatisfying
    solution.
    
    - The HTML report now saves the sort order in a more widely supported way,
    fixing `issue 986`_.  Thanks, Sebastián Ramírez (`pull request 1066`_).
    
    - The HTML report pages now have a :ref:`Sleepy Snake &lt;sleepy&gt;` favicon.
    
    - Wheels are now provided for manylinux2010, and for PyPy3 (pp36 and pp37).
    
    - Continuous integration has moved from Travis and AppVeyor to GitHub Actions.
    
    .. _issue 986: https://github.com/nedbat/coveragepy/issues/986
    .. _issue 1037: https://github.com/nedbat/coveragepy/issues/1037
    .. _issue 1010: https://github.com/nedbat/coveragepy/issues/1010
    .. _pull request 1066: https://github.com/nedbat/coveragepy/pull/1066
    
    .. _changes_53:
    

    5.3

    ------------------------
    
    - The ``source`` setting has always been interpreted as either a file path or a
    module, depending on which existed.  If both interpretations were valid, it
    was assumed to be a file path.  The new ``source_pkgs`` setting can be used
    to name a package to disambiguate this case.  Thanks, Thomas Grainger. Fixes
    `issue 268`_.
    
    - If a plugin was disabled due to an exception, we used to still try to record
    its information, causing an exception, as reported in `issue 1011`_.  This is
    now fixed.
    
    .. _issue 268: https://github.com/nedbat/coveragepy/issues/268
    .. _issue 1011: https://github.com/nedbat/coveragepy/issues/1011
    
    
    .. endchangesinclude
    
    Older changes
    -------------
    
    The complete history is available in the `coverage.py docs`__.
    
    __ https://coverage.readthedocs.io/en/latest/changes.html
    
    Links
    • PyPI: https://pypi.org/project/coverage
    • Changelog: https://pyup.io/changelogs/coverage/
    • Repo: https://github.com/nedbat/coveragepy
    opened by pyup-bot 0
  • 1 test fails

    1 test fails

    ========================================================================================== FAILURES ==========================================================================================
    _____________________________________________________________________ TestCachedPropertyWithTTL.test_threads_ttl_expiry ______________________________________________________________________
    
    self = <tests.test_cached_property.TestCachedPropertyWithTTL testMethod=test_threads_ttl_expiry>
    
        def test_threads_ttl_expiry(self):
            Check = CheckFactory(self.cached_property_factory(ttl=100000), threadsafe=True)
            check = Check()
            num_threads = 5
        
            # Same as in test_threads
            check.run_threads(num_threads)
            self.assert_cached(check, num_threads)
            self.assert_cached(check, num_threads)
        
            # The cache expires in the future
            with freeze_time("9999-01-01"):
                check.run_threads(num_threads)
    >           self.assert_cached(check, 2 * num_threads)
    
    tests/test_cached_property.py:244: 
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
    tests/test_cached_property.py:71: in assert_cached
        self.assertEqual(check.add_cached, expected)
    E   AssertionError: 6 != 10
    ====================================================================================== warnings summary ======================================================================================
    
    opened by yurivict 0
  • [Snyk] Security upgrade setuptools from 39.0.1 to 65.5.1

    [Snyk] Security upgrade setuptools from 39.0.1 to 65.5.1

    Snyk has created this PR to fix one or more vulnerable packages in the `pip` dependencies of this project.

    Changes included in this PR

    • Changes to the following files to upgrade the vulnerable dependencies to a fixed version:
      • requirements.txt

    Vulnerabilities that will be fixed

    By pinning:

    Severity | Priority Score (*) | Issue | Upgrade | Breaking Change | Exploit Maturity :-------------------------:|-------------------------|:-------------------------|:-------------------------|:-------------------------|:------------------------- medium severity | 551/1000
    Why? Recently disclosed, Has a fix available, CVSS 5.3 | Regular Expression Denial of Service (ReDoS)
    SNYK-PYTHON-SETUPTOOLS-3180412 | setuptools:
    39.0.1 -> 65.5.1
    | No | No Known Exploit

    (*) Note that the real score may have changed since the PR was raised.

    Some vulnerabilities couldn't be fully fixed and so Snyk will still find them when the project is tested again. This may be because the vulnerability existed within more than one direct dependency, but not all of the affected dependencies could be upgraded.

    Check the changes in this PR to ensure they won't cause issues with your project.


    Note: You are seeing this because you or someone else with access to this repository has authorized Snyk to open fix PRs.

    For more information: 🧐 View latest project report

    🛠 Adjust project settings

    📚 Read more about Snyk's upgrade and patch logic


    Learn how to fix vulnerabilities with free interactive lessons:

    🦉 Regular Expression Denial of Service (ReDoS)

    opened by snyk-bot 0
  • [Snyk] Security upgrade setuptools from 39.0.1 to 65.5.1

    [Snyk] Security upgrade setuptools from 39.0.1 to 65.5.1

    This PR was automatically created by Snyk using the credentials of a real user.


    Snyk has created this PR to fix one or more vulnerable packages in the `pip` dependencies of this project.

    Changes included in this PR

    • Changes to the following files to upgrade the vulnerable dependencies to a fixed version:
      • requirements.txt
    ⚠️ Warning
    pytest-cov 2.6.0 requires coverage, which is not installed.
    
    

    Vulnerabilities that will be fixed

    By pinning:

    Severity | Priority Score (*) | Issue | Upgrade | Breaking Change | Exploit Maturity :-------------------------:|-------------------------|:-------------------------|:-------------------------|:-------------------------|:------------------------- low severity | 441/1000
    Why? Recently disclosed, Has a fix available, CVSS 3.1 | Regular Expression Denial of Service (ReDoS)
    SNYK-PYTHON-SETUPTOOLS-3113904 | setuptools:
    39.0.1 -> 65.5.1
    | No | No Known Exploit

    (*) Note that the real score may have changed since the PR was raised.

    Some vulnerabilities couldn't be fully fixed and so Snyk will still find them when the project is tested again. This may be because the vulnerability existed within more than one direct dependency, but not all of the affected dependencies could be upgraded.

    Check the changes in this PR to ensure they won't cause issues with your project.


    Note: You are seeing this because you or someone else with access to this repository has authorized Snyk to open fix PRs.

    For more information: 🧐 View latest project report

    🛠 Adjust project settings

    📚 Read more about Snyk's upgrade and patch logic


    Learn how to fix vulnerabilities with free interactive lessons:

    🦉 Regular Expression Denial of Service (ReDoS)

    opened by pydanny 0
  • ImportError: cannot import name 'cached_property' from 'functools' (/usr/lib/python3.7/functools.py)

    ImportError: cannot import name 'cached_property' from 'functools' (/usr/lib/python3.7/functools.py)

    Hello, is it possible to use cached_property using python 3.7 ? I'm facing the following problem, which I think is related to 3.7 but I am not sure. The setup.py file says that there's compatibility with python 3.7 so I'm curious

    To reproduce the error:

    • Open a Google Collaboratory session (or any fresh environment with 3.7)
    • Try to import cached property: from functools import cached_property
    • You might see this result: image
    opened by Gui-FernandesBR 1
  • Update pytest to 7.2.0

    Update pytest to 7.2.0

    This PR updates pytest from 3.8.2 to 7.2.0.

    Changelog

    7.1.3

    =========================
    
    Bug Fixes
    ---------
    
    - `10060 &lt;https://github.com/pytest-dev/pytest/issues/10060&gt;`_: When running with ``--pdb``, ``TestCase.tearDown`` is no longer called for tests when the *class* has been skipped via ``unittest.skip`` or ``pytest.mark.skip``.
    
    
    - `10190 &lt;https://github.com/pytest-dev/pytest/issues/10190&gt;`_: Invalid XML characters in setup or teardown error messages are now properly escaped for JUnit XML reports.
    
    
    - `10230 &lt;https://github.com/pytest-dev/pytest/issues/10230&gt;`_: Ignore ``.py`` files created by ``pyproject.toml``-based editable builds introduced in `pip 21.3 &lt;https://pip.pypa.io/en/stable/news/#v21-3&gt;`__.
    
    
    - `3396 &lt;https://github.com/pytest-dev/pytest/issues/3396&gt;`_: Doctests now respect the ``--import-mode`` flag.
    
    
    - `9514 &lt;https://github.com/pytest-dev/pytest/issues/9514&gt;`_: Type-annotate ``FixtureRequest.param`` as ``Any`` as a stop gap measure until :issue:`8073` is fixed.
    
    
    - `9791 &lt;https://github.com/pytest-dev/pytest/issues/9791&gt;`_: Fixed a path handling code in ``rewrite.py`` that seems to work fine, but was incorrect and fails in some systems.
    
    
    - `9917 &lt;https://github.com/pytest-dev/pytest/issues/9917&gt;`_: Fixed string representation for :func:`pytest.approx` when used to compare tuples.
    
    
    
    Improved Documentation
    ----------------------
    
    - `9937 &lt;https://github.com/pytest-dev/pytest/issues/9937&gt;`_: Explicit note that :fixture:`tmpdir` fixture is discouraged in favour of :fixture:`tmp_path`.
    
    
    
    Trivial/Internal Changes
    ------------------------
    
    - `10114 &lt;https://github.com/pytest-dev/pytest/issues/10114&gt;`_: Replace `atomicwrites &lt;https://github.com/untitaker/python-atomicwrites&gt;`__ dependency on windows with `os.replace`.
    

    7.1.2

    =========================
    
    Bug Fixes
    ---------
    
    - `9726 &lt;https://github.com/pytest-dev/pytest/issues/9726&gt;`_: An unnecessary ``numpy`` import inside :func:`pytest.approx` was removed.
    
    
    - `9820 &lt;https://github.com/pytest-dev/pytest/issues/9820&gt;`_: Fix comparison of  ``dataclasses`` with ``InitVar``.
    
    
    - `9869 &lt;https://github.com/pytest-dev/pytest/issues/9869&gt;`_: Increase ``stacklevel`` for the ``NODE_CTOR_FSPATH_ARG`` deprecation to point to the
    user&#x27;s code, not pytest.
    
    
    - `9871 &lt;https://github.com/pytest-dev/pytest/issues/9871&gt;`_: Fix a bizarre (and fortunately rare) bug where the `temp_path` fixture could raise
    an internal error while attempting to get the current user&#x27;s username.
    

    7.1.1

    =========================
    
    Bug Fixes
    ---------
    
    - `9767 &lt;https://github.com/pytest-dev/pytest/issues/9767&gt;`_: Fixed a regression in pytest 7.1.0 where some conftest.py files outside of the source tree (e.g. in the `site-packages` directory) were not picked up.
    

    7.1.0

    =========================
    
    Breaking Changes
    ----------------
    
    - `8838 &lt;https://github.com/pytest-dev/pytest/issues/8838&gt;`_: As per our policy, the following features have been deprecated in the 6.X series and are now
    removed:
    
    * ``pytest._fillfuncargs`` function.
    
    * ``pytest_warning_captured`` hook - use ``pytest_warning_recorded`` instead.
    
    * ``-k -foobar`` syntax - use ``-k &#x27;not foobar&#x27;`` instead.
    
    * ``-k foobar:`` syntax.
    
    * ``pytest.collect`` module - import from ``pytest`` directly.
    
    For more information consult
    `Deprecations and Removals &lt;https://docs.pytest.org/en/latest/deprecations.html&gt;`__ in the docs.
    
    
    - `9437 &lt;https://github.com/pytest-dev/pytest/issues/9437&gt;`_: Dropped support for Python 3.6, which reached `end-of-life &lt;https://devguide.python.org/#status-of-python-branches&gt;`__ at 2021-12-23.
    
    
    
    Improvements
    ------------
    
    - `5192 &lt;https://github.com/pytest-dev/pytest/issues/5192&gt;`_: Fixed test output for some data types where ``-v`` would show less information.
    
    Also, when showing diffs for sequences, ``-q`` would produce full diffs instead of the expected diff.
    
    
    - `9362 &lt;https://github.com/pytest-dev/pytest/issues/9362&gt;`_: pytest now avoids specialized assert formatting when it is detected that the default ``__eq__`` is overridden in ``attrs`` or ``dataclasses``.
    
    
    - `9536 &lt;https://github.com/pytest-dev/pytest/issues/9536&gt;`_: When ``-vv`` is given on command line, show skipping and xfail reasons in full instead of truncating them to fit the terminal width.
    
    
    - `9644 &lt;https://github.com/pytest-dev/pytest/issues/9644&gt;`_: More information about the location of resources that led Python to raise :class:`ResourceWarning` can now
    be obtained by enabling :mod:`tracemalloc`.
    
    See :ref:`resource-warnings` for more information.
    
    
    - `9678 &lt;https://github.com/pytest-dev/pytest/issues/9678&gt;`_: More types are now accepted in the ``ids`` argument to ``pytest.mark.parametrize``.
    Previously only `str`, `float`, `int` and `bool` were accepted;
    now `bytes`, `complex`, `re.Pattern`, `Enum` and anything with a `__name__` are also accepted.
    
    
    - `9692 &lt;https://github.com/pytest-dev/pytest/issues/9692&gt;`_: :func:`pytest.approx` now raises a :class:`TypeError` when given an unordered sequence (such as :class:`set`).
    
    Note that this implies that custom classes which only implement ``__iter__`` and ``__len__`` are no longer supported as they don&#x27;t guarantee order.
    
    
    
    Bug Fixes
    ---------
    
    - `8242 &lt;https://github.com/pytest-dev/pytest/issues/8242&gt;`_: The deprecation of raising :class:`unittest.SkipTest` to skip collection of
    tests during the pytest collection phase is reverted - this is now a supported
    feature again.
    
    
    - `9493 &lt;https://github.com/pytest-dev/pytest/issues/9493&gt;`_: Symbolic link components are no longer resolved in conftest paths.
    This means that if a conftest appears twice in collection tree, using symlinks, it will be executed twice.
    For example, given
    
       tests/real/conftest.py
       tests/real/test_it.py
       tests/link -&gt; tests/real
    
    running ``pytest tests`` now imports the conftest twice, once as ``tests/real/conftest.py`` and once as ``tests/link/conftest.py``.
    This is a fix to match a similar change made to test collection itself in pytest 6.0 (see :pull:`6523` for details).
    
    
    - `9626 &lt;https://github.com/pytest-dev/pytest/issues/9626&gt;`_: Fixed count of selected tests on terminal collection summary when there were errors or skipped modules.
    
    If there were errors or skipped modules on collection, pytest would mistakenly subtract those from the selected count.
    
    
    - `9645 &lt;https://github.com/pytest-dev/pytest/issues/9645&gt;`_: Fixed regression where ``--import-mode=importlib`` used together with :envvar:`PYTHONPATH` or :confval:`pythonpath` would cause import errors in test suites.
    
    
    - `9708 &lt;https://github.com/pytest-dev/pytest/issues/9708&gt;`_: :fixture:`pytester` now requests a :fixture:`monkeypatch` fixture instead of creating one internally. This solves some issues with tests that involve pytest environment variables.
    
    
    - `9730 &lt;https://github.com/pytest-dev/pytest/issues/9730&gt;`_: Malformed ``pyproject.toml`` files now produce a clearer error message.
    

    7.0.1

    =========================
    
    Bug Fixes
    ---------
    
    - `9608 &lt;https://github.com/pytest-dev/pytest/issues/9608&gt;`_: Fix invalid importing of ``importlib.readers`` in Python 3.9.
    
    
    - `9610 &lt;https://github.com/pytest-dev/pytest/issues/9610&gt;`_: Restore `UnitTestFunction.obj` to return unbound rather than bound method.
    Fixes a crash during a failed teardown in unittest TestCases with non-default `__init__`.
    Regressed in pytest 7.0.0.
    
    
    - `9636 &lt;https://github.com/pytest-dev/pytest/issues/9636&gt;`_: The ``pythonpath`` plugin was renamed to ``python_path``. This avoids a conflict with the ``pytest-pythonpath`` plugin.
    
    
    - `9642 &lt;https://github.com/pytest-dev/pytest/issues/9642&gt;`_: Fix running tests by id with ``::`` in the parametrize portion.
    
    
    - `9643 &lt;https://github.com/pytest-dev/pytest/issues/9643&gt;`_: Delay issuing a :class:`~pytest.PytestWarning` about diamond inheritance involving :class:`~pytest.Item` and
    :class:`~pytest.Collector` so it can be filtered using :ref:`standard warning filters &lt;warnings&gt;`.
    

    7.0.0

    =========================
    
    (**Please see the full set of changes for this release also in the 7.0.0rc1 notes below**)
    
    Deprecations
    ------------
    
    - `9488 &lt;https://github.com/pytest-dev/pytest/issues/9488&gt;`_: If custom subclasses of nodes like :class:`pytest.Item` override the
    ``__init__`` method, they should take ``**kwargs``. See
    :ref:`uncooperative-constructors-deprecated` for details.
    
    Note that a deprection warning is only emitted when there is a conflict in the
    arguments pytest expected to pass. This deprecation was already part of pytest
    7.0.0rc1 but wasn&#x27;t documented.
    
    
    
    Bug Fixes
    ---------
    
    - `9355 &lt;https://github.com/pytest-dev/pytest/issues/9355&gt;`_: Fixed error message prints function decorators when using assert in Python 3.8 and above.
    
    
    - `9396 &lt;https://github.com/pytest-dev/pytest/issues/9396&gt;`_: Ensure :attr:`pytest.Config.inifile` is available during the :func:`pytest_cmdline_main &lt;_pytest.hookspec.pytest_cmdline_main&gt;` hook (regression during ``7.0.0rc1``).
    
    
    
    Improved Documentation
    ----------------------
    
    - `9404 &lt;https://github.com/pytest-dev/pytest/issues/9404&gt;`_: Added extra documentation on alternatives to common misuses of `pytest.warns(None)` ahead of its deprecation.
    
    
    - `9505 &lt;https://github.com/pytest-dev/pytest/issues/9505&gt;`_: Clarify where the configuration files are located. To avoid confusions documentation mentions
    that configuration file is located in the root of the repository.
    
    
    
    Trivial/Internal Changes
    ------------------------
    
    - `9521 &lt;https://github.com/pytest-dev/pytest/issues/9521&gt;`_: Add test coverage to assertion rewrite path.
    

    7.0.0rc1

    ============================
    
    Breaking Changes
    ----------------
    
    - `7259 &lt;https://github.com/pytest-dev/pytest/issues/7259&gt;`_: The :ref:`Node.reportinfo() &lt;non-python tests&gt;` function first return value type has been expanded from `py.path.local | str` to `os.PathLike[str] | str`.
    
    Most plugins which refer to `reportinfo()` only define it as part of a custom :class:`pytest.Item` implementation.
    Since `py.path.local` is a `os.PathLike[str]`, these plugins are unaffacted.
    
    Plugins and users which call `reportinfo()`, use the first return value and interact with it as a `py.path.local`, would need to adjust by calling `py.path.local(fspath)`.
    Although preferably, avoid the legacy `py.path.local` and use `pathlib.Path`, or use `item.location` or `item.path`, instead.
    
    Note: pytest was not able to provide a deprecation period for this change.
    
    
    - `8246 &lt;https://github.com/pytest-dev/pytest/issues/8246&gt;`_: ``--version`` now writes version information to ``stdout`` rather than ``stderr``.
    
    
    - `8733 &lt;https://github.com/pytest-dev/pytest/issues/8733&gt;`_: Drop a workaround for `pyreadline &lt;https://github.com/pyreadline/pyreadline&gt;`__ that made it work with ``--pdb``.
    
    The workaround was introduced in `1281 &lt;https://github.com/pytest-dev/pytest/pull/1281&gt;`__ in 2015, however since then
    `pyreadline seems to have gone unmaintained &lt;https://github.com/pyreadline/pyreadline/issues/58&gt;`__, is `generating
    warnings &lt;https://github.com/pytest-dev/pytest/issues/8847&gt;`__, and will stop working on Python 3.10.
    
    
    - `9061 &lt;https://github.com/pytest-dev/pytest/issues/9061&gt;`_: Using :func:`pytest.approx` in a boolean context now raises an error hinting at the proper usage.
    
    It is apparently common for users to mistakenly use ``pytest.approx`` like this:
    
    .. code-block:: python
    
       assert pytest.approx(actual, expected)
    
    While the correct usage is:
    
    .. code-block:: python
    
       assert actual == pytest.approx(expected)
    
    The new error message helps catch those mistakes.
    
    
    - `9277 &lt;https://github.com/pytest-dev/pytest/issues/9277&gt;`_: The ``pytest.Instance`` collector type has been removed.
    Importing ``pytest.Instance`` or ``_pytest.python.Instance`` returns a dummy type and emits a deprecation warning.
    See :ref:`instance-collector-deprecation` for details.
    
    
    - `9308 &lt;https://github.com/pytest-dev/pytest/issues/9308&gt;`_: **PytestRemovedIn7Warning deprecation warnings are now errors by default.**
    
    Following our plan to remove deprecated features with as little disruption as
    possible, all warnings of type ``PytestRemovedIn7Warning`` now generate errors
    instead of warning messages by default.
    
    **The affected features will be effectively removed in pytest 7.1**, so please consult the
    :ref:`deprecations` section in the docs for directions on how to update existing code.
    
    In the pytest ``7.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:
    
    .. code-block:: ini
    
       [pytest]
       filterwarnings =
           ignore::pytest.PytestRemovedIn7Warning
    
    But this will stop working when pytest ``7.1`` is released.
    
    **If you have concerns** about the removal of a specific feature, please add a
    comment to :issue:`9308`.
    
    
    
    Deprecations
    ------------
    
    - `7259 &lt;https://github.com/pytest-dev/pytest/issues/7259&gt;`_: ``py.path.local`` arguments for hooks have been deprecated. See :ref:`the deprecation note &lt;legacy-path-hooks-deprecated&gt;` for full details.
    
    ``py.path.local`` arguments to Node constructors have been deprecated. See :ref:`the deprecation note &lt;node-ctor-fspath-deprecation&gt;` for full details.
    
    .. note::
       The name of the :class:`~_pytest.nodes.Node` arguments and attributes (the
       new attribute being ``path``) is **the opposite** of the situation for hooks
       (the old argument being ``path``).
    
       This is an unfortunate artifact due to historical reasons, which should be
       resolved in future versions as we slowly get rid of the :pypi:`py`
       dependency (see :issue:`9283` for a longer discussion).
    
    
    - `7469 &lt;https://github.com/pytest-dev/pytest/issues/7469&gt;`_: Directly constructing the following classes is now deprecated:
    
    - ``_pytest.mark.structures.Mark``
    - ``_pytest.mark.structures.MarkDecorator``
    - ``_pytest.mark.structures.MarkGenerator``
    - ``_pytest.python.Metafunc``
    - ``_pytest.runner.CallInfo``
    - ``_pytest._code.ExceptionInfo``
    - ``_pytest.config.argparsing.Parser``
    - ``_pytest.config.argparsing.OptionGroup``
    - ``_pytest.pytester.HookRecorder``
    
    These constructors have always been considered private, but now issue a deprecation warning, which may become a hard error in pytest 8.
    
    
    - `8242 &lt;https://github.com/pytest-dev/pytest/issues/8242&gt;`_: Raising :class:`unittest.SkipTest` to skip collection of tests during the
    pytest collection phase is deprecated. Use :func:`pytest.skip` instead.
    
    Note: This deprecation only relates to using :class:`unittest.SkipTest` during test
    collection. You are probably not doing that. Ordinary usage of
    :class:`unittest.SkipTest` / :meth:`unittest.TestCase.skipTest` /
    :func:`unittest.skip` in unittest test cases is fully supported.
    
    .. note:: This deprecation has been reverted in pytest 7.1.0.
    
    
    - `8315 &lt;https://github.com/pytest-dev/pytest/issues/8315&gt;`_: Several behaviors of :meth:`Parser.addoption &lt;pytest.Parser.addoption&gt;` are now
    scheduled for removal in pytest 8 (deprecated since pytest 2.4.0):
    
    - ``parser.addoption(..., help=&quot;.. %default ..&quot;)`` - use ``%(default)s`` instead.
    - ``parser.addoption(..., type=&quot;int/string/float/complex&quot;)`` - use ``type=int`` etc. instead.
    
    
    - `8447 &lt;https://github.com/pytest-dev/pytest/issues/8447&gt;`_: Defining a custom pytest node type which is both an :class:`pytest.Item &lt;Item&gt;` and a :class:`pytest.Collector &lt;Collector&gt;` (e.g. :class:`pytest.File &lt;File&gt;`) now issues a warning.
    It was never sanely supported and triggers hard to debug errors.
    
    See :ref:`the deprecation note &lt;diamond-inheritance-deprecated&gt;` for full details.
    
    
    - `8592 &lt;https://github.com/pytest-dev/pytest/issues/8592&gt;`_: :hook:`pytest_cmdline_preparse` has been officially deprecated.  It will be removed in a future release.  Use :hook:`pytest_load_initial_conftests` instead.
    
    See :ref:`the deprecation note &lt;cmdline-preparse-deprecated&gt;` for full details.
    
    
    - `8645 &lt;https://github.com/pytest-dev/pytest/issues/8645&gt;`_: :func:`pytest.warns(None) &lt;pytest.warns&gt;` is now deprecated because many people used
    it to mean &quot;this code does not emit warnings&quot;, but it actually had the effect of
    checking that the code emits at least one warning of any type - like ``pytest.warns()``
    or ``pytest.warns(Warning)``.
    
    
    - `8948 &lt;https://github.com/pytest-dev/pytest/issues/8948&gt;`_: :func:`pytest.skip(msg=...) &lt;pytest.skip&gt;`, :func:`pytest.fail(msg=...) &lt;pytest.fail&gt;` and :func:`pytest.exit(msg=...) &lt;pytest.exit&gt;`
    signatures now accept a ``reason`` argument instead of ``msg``.  Using ``msg`` still works, but is deprecated and will be removed in a future release.
    
    This was changed for consistency with :func:`pytest.mark.skip &lt;pytest.mark.skip&gt;` and  :func:`pytest.mark.xfail &lt;pytest.mark.xfail&gt;` which both accept
    ``reason`` as an argument.
    
    - `8174 &lt;https://github.com/pytest-dev/pytest/issues/8174&gt;`_: The following changes have been made to types reachable through :attr:`pytest.ExceptionInfo.traceback`:
    
    - The ``path`` property of ``_pytest.code.Code`` returns ``Path`` instead of ``py.path.local``.
    - The ``path`` property of ``_pytest.code.TracebackEntry`` returns ``Path`` instead of ``py.path.local``.
    
    There was no deprecation period for this change (sorry!).
    
    
    Features
    --------
    
    - `5196 &lt;https://github.com/pytest-dev/pytest/issues/5196&gt;`_: Tests are now ordered by definition order in more cases.
    
    In a class hierarchy, tests from base classes are now consistently ordered before tests defined on their subclasses (reverse MRO order).
    
    
    - `7132 &lt;https://github.com/pytest-dev/pytest/issues/7132&gt;`_: Added two environment variables :envvar:`PYTEST_THEME` and :envvar:`PYTEST_THEME_MODE` to let the users customize the pygments theme used.
    
    
    - `7259 &lt;https://github.com/pytest-dev/pytest/issues/7259&gt;`_: Added :meth:`cache.mkdir() &lt;pytest.Cache.mkdir&gt;`, which is similar to the existing :meth:`cache.makedir() &lt;pytest.Cache.makedir&gt;`,
    but returns a :class:`pathlib.Path` instead of a legacy ``py.path.local``.
    
    Added a ``paths`` type to :meth:`parser.addini() &lt;pytest.Parser.addini&gt;`,
    as in ``parser.addini(&quot;mypaths&quot;, &quot;my paths&quot;, type=&quot;paths&quot;)``,
    which is similar to the existing ``pathlist``,
    but returns a list of :class:`pathlib.Path` instead of legacy ``py.path.local``.
    
    
    - `7469 &lt;https://github.com/pytest-dev/pytest/issues/7469&gt;`_: The types of objects used in pytest&#x27;s API are now exported so they may be used in type annotations.
    
    The newly-exported types are:
    
    - ``pytest.Config`` for :class:`Config &lt;pytest.Config&gt;`.
    - ``pytest.Mark`` for :class:`marks &lt;pytest.Mark&gt;`.
    - ``pytest.MarkDecorator`` for :class:`mark decorators &lt;pytest.MarkDecorator&gt;`.
    - ``pytest.MarkGenerator`` for the :class:`pytest.mark &lt;pytest.MarkGenerator&gt;` singleton.
    - ``pytest.Metafunc`` for the :class:`metafunc &lt;pytest.MarkGenerator&gt;` argument to the :hook:`pytest_generate_tests` hook.
    - ``pytest.CallInfo`` for the :class:`CallInfo &lt;pytest.CallInfo&gt;` type passed to various hooks.
    - ``pytest.PytestPluginManager`` for :class:`PytestPluginManager &lt;pytest.PytestPluginManager&gt;`.
    - ``pytest.ExceptionInfo`` for the :class:`ExceptionInfo &lt;pytest.ExceptionInfo&gt;` type returned from :func:`pytest.raises` and passed to various hooks.
    - ``pytest.Parser`` for the :class:`Parser &lt;pytest.Parser&gt;` type passed to the :hook:`pytest_addoption` hook.
    - ``pytest.OptionGroup`` for the :class:`OptionGroup &lt;pytest.OptionGroup&gt;` type returned from the :func:`parser.addgroup &lt;pytest.Parser.getgroup&gt;` method.
    - ``pytest.HookRecorder`` for the :class:`HookRecorder &lt;pytest.HookRecorder&gt;` type returned from :class:`~pytest.Pytester`.
    - ``pytest.RecordedHookCall`` for the :class:`RecordedHookCall &lt;pytest.HookRecorder&gt;` type returned from :class:`~pytest.HookRecorder`.
    - ``pytest.RunResult`` for the :class:`RunResult &lt;pytest.RunResult&gt;` type returned from :class:`~pytest.Pytester`.
    - ``pytest.LineMatcher`` for the :class:`LineMatcher &lt;pytest.RunResult&gt;` type used in :class:`~pytest.RunResult` and others.
    - ``pytest.TestReport`` for the :class:`TestReport &lt;pytest.TestReport&gt;` type used in various hooks.
    - ``pytest.CollectReport`` for the :class:`CollectReport &lt;pytest.CollectReport&gt;` type used in various hooks.
    
    Constructing most of them directly is not supported; they are only meant for use in type annotations.
    Doing so will emit a deprecation warning, and may become a hard-error in pytest 8.0.
    
    Subclassing them is also not supported. This is not currently enforced at runtime, but is detected by type-checkers such as mypy.
    
    
    - `7856 &lt;https://github.com/pytest-dev/pytest/issues/7856&gt;`_: :ref:`--import-mode=importlib &lt;import-modes&gt;` now works with features that
    depend on modules being on :py:data:`sys.modules`, such as :mod:`pickle` and :mod:`dataclasses`.
    
    
    - `8144 &lt;https://github.com/pytest-dev/pytest/issues/8144&gt;`_: The following hooks now receive an additional ``pathlib.Path`` argument, equivalent to an existing ``py.path.local`` argument:
    
    - :hook:`pytest_ignore_collect` - The ``collection_path`` parameter (equivalent to existing ``path`` parameter).
    - :hook:`pytest_collect_file` - The ``file_path`` parameter (equivalent to existing ``path`` parameter).
    - :hook:`pytest_pycollect_makemodule` - The ``module_path`` parameter (equivalent to existing ``path`` parameter).
    - :hook:`pytest_report_header` - The ``start_path`` parameter (equivalent to existing ``startdir`` parameter).
    - :hook:`pytest_report_collectionfinish` - The ``start_path`` parameter (equivalent to existing ``startdir`` parameter).
    
    .. note::
       The name of the :class:`~_pytest.nodes.Node` arguments and attributes (the
       new attribute being ``path``) is **the opposite** of the situation for hooks
       (the old argument being ``path``).
    
       This is an unfortunate artifact due to historical reasons, which should be
       resolved in future versions as we slowly get rid of the :pypi:`py`
       dependency (see :issue:`9283` for a longer discussion).
    
    
    - `8251 &lt;https://github.com/pytest-dev/pytest/issues/8251&gt;`_: Implement ``Node.path`` as a ``pathlib.Path``. Both the old ``fspath`` and this new attribute gets set no matter whether ``path`` or ``fspath`` (deprecated) is passed to the constructor. It is a replacement for the ``fspath`` attribute (which represents the same path as ``py.path.local``). While ``fspath`` is not deprecated yet
    due to the ongoing migration of methods like :meth:`~_pytest.Item.reportinfo`, we expect to deprecate it in a future release.
    
    .. note::
       The name of the :class:`~_pytest.nodes.Node` arguments and attributes (the
       new attribute being ``path``) is **the opposite** of the situation for hooks
       (the old argument being ``path``).
    
       This is an unfortunate artifact due to historical reasons, which should be
       resolved in future versions as we slowly get rid of the :pypi:`py`
       dependency (see :issue:`9283` for a longer discussion).
    
    
    - `8421 &lt;https://github.com/pytest-dev/pytest/issues/8421&gt;`_: :func:`pytest.approx` now works on :class:`~decimal.Decimal` within mappings/dicts and sequences/lists.
    
    
    - `8606 &lt;https://github.com/pytest-dev/pytest/issues/8606&gt;`_: pytest invocations with ``--fixtures-per-test`` and ``--fixtures`` have been enriched with:
    
    - Fixture location path printed with the fixture name.
    - First section of the fixture&#x27;s docstring printed under the fixture name.
    - Whole of fixture&#x27;s docstring printed under the fixture name using ``--verbose`` option.
    
    
    - `8761 &lt;https://github.com/pytest-dev/pytest/issues/8761&gt;`_: New :ref:`version-tuple` attribute, which makes it simpler for users to do something depending on the pytest version (such as declaring hooks which are introduced in later versions).
    
    
    - `8789 &lt;https://github.com/pytest-dev/pytest/issues/8789&gt;`_: Switch TOML parser from ``toml`` to ``tomli`` for TOML v1.0.0 support in ``pyproject.toml``.
    
    
    - `8920 &lt;https://github.com/pytest-dev/pytest/issues/8920&gt;`_: Added :class:`pytest.Stash`, a facility for plugins to store their data on :class:`~pytest.Config` and :class:`~_pytest.nodes.Node`\s in a type-safe and conflict-free manner.
    See :ref:`plugin-stash` for details.
    
    
    - `8953 &lt;https://github.com/pytest-dev/pytest/issues/8953&gt;`_: :class:`RunResult &lt;_pytest.pytester.RunResult&gt;` method :meth:`assert_outcomes &lt;_pytest.pytester.RunResult.assert_outcomes&gt;` now accepts a
    ``warnings`` argument to assert the total number of warnings captured.
    
    
    - `8954 &lt;https://github.com/pytest-dev/pytest/issues/8954&gt;`_: ``--debug`` flag now accepts a :class:`str` file to route debug logs into, remains defaulted to `pytestdebug.log`.
    
    
    - `9023 &lt;https://github.com/pytest-dev/pytest/issues/9023&gt;`_: Full diffs are now always shown for equality assertions of iterables when
    `CI` or ``BUILD_NUMBER`` is found in the environment, even when ``-v`` isn&#x27;t
    used.
    
    
    - `9113 &lt;https://github.com/pytest-dev/pytest/issues/9113&gt;`_: :class:`RunResult &lt;_pytest.pytester.RunResult&gt;` method :meth:`assert_outcomes &lt;_pytest.pytester.RunResult.assert_outcomes&gt;` now accepts a
    ``deselected`` argument to assert the total number of deselected tests.
    
    
    - `9114 &lt;https://github.com/pytest-dev/pytest/issues/9114&gt;`_: Added :confval:`pythonpath` setting that adds listed paths to :data:`sys.path` for the duration of the test session. If you currently use the pytest-pythonpath or pytest-srcpaths plugins, you should be able to replace them with built-in `pythonpath` setting.
    
    
    
    Improvements
    ------------
    
    - `7480 &lt;https://github.com/pytest-dev/pytest/issues/7480&gt;`_: A deprecation scheduled to be removed in a major version X (e.g. pytest 7, 8, 9, ...) now uses warning category `PytestRemovedInXWarning`,
    a subclass of :class:`~pytest.PytestDeprecationWarning`,
    instead of :class:`PytestDeprecationWarning` directly.
    
    See :ref:`backwards-compatibility` for more details.
    
    
    - `7864 &lt;https://github.com/pytest-dev/pytest/issues/7864&gt;`_: Improved error messages when parsing warning filters.
    
    Previously pytest would show an internal traceback, which besides being ugly sometimes would hide the cause
    of the problem (for example an ``ImportError`` while importing a specific warning type).
    
    
    - `8335 &lt;https://github.com/pytest-dev/pytest/issues/8335&gt;`_: Improved :func:`pytest.approx` assertion messages for sequences of numbers.
    
    The assertion messages now dumps a table with the index and the error of each diff.
    Example::
    
       &gt;       assert [1, 2, 3, 4] == pytest.approx([1, 3, 3, 5])
       E       assert comparison failed for 2 values:
       E         Index | Obtained | Expected
       E         1     | 2        | 3 +- 3.0e-06
       E         3     | 4        | 5 +- 5.0e-06
    
    
    - `8403 &lt;https://github.com/pytest-dev/pytest/issues/8403&gt;`_: By default, pytest will truncate long strings in assert errors so they don&#x27;t clutter the output too much,
    currently at ``240`` characters by default.
    
    However, in some cases the longer output helps, or is even crucial, to diagnose a failure. Using ``-v`` will
    now increase the truncation threshold to ``2400`` characters, and ``-vv`` or higher will disable truncation entirely.
    
    
    - `8509 &lt;https://github.com/pytest-dev/pytest/issues/8509&gt;`_: Fixed issue where :meth:`unittest.TestCase.setUpClass` is not called when a test has `/` in its name since pytest 6.2.0.
    
    This refers to the path part in pytest node IDs, e.g. ``TestClass::test_it`` in the node ID ``tests/test_file.py::TestClass::test_it``.
    
    Now, instead of assuming that the test name does not contain ``/``, it is assumed that test path does not contain ``::``. We plan to hopefully make both of these work in the future.
    
    
    - `8803 &lt;https://github.com/pytest-dev/pytest/issues/8803&gt;`_: It is now possible to add colors to custom log levels on cli log.
    
    By using :func:`add_color_level &lt;_pytest.logging.add_color_level&gt;` from a ``pytest_configure`` hook, colors can be added::
    
       logging_plugin = config.pluginmanager.get_plugin(&#x27;logging-plugin&#x27;)
       logging_plugin.log_cli_handler.formatter.add_color_level(logging.INFO, &#x27;cyan&#x27;)
       logging_plugin.log_cli_handler.formatter.add_color_level(logging.SPAM, &#x27;blue&#x27;)
    
    See :ref:`log_colors` for more information.
    
    
    - `8822 &lt;https://github.com/pytest-dev/pytest/issues/8822&gt;`_: When showing fixture paths in `--fixtures` or `--fixtures-by-test`, fixtures coming from pytest itself now display an elided path, rather than the full path to the file in the `site-packages` directory.
    
    
    - `8898 &lt;https://github.com/pytest-dev/pytest/issues/8898&gt;`_: Complex numbers are now treated like floats and integers when generating parameterization IDs.
    
    
    - `9062 &lt;https://github.com/pytest-dev/pytest/issues/9062&gt;`_: ``--stepwise-skip`` now implicitly enables ``--stepwise`` and can be used on its own.
    
    
    - `9205 &lt;https://github.com/pytest-dev/pytest/issues/9205&gt;`_: :meth:`pytest.Cache.set` now preserves key order when saving dicts.
    
    
    
    Bug Fixes
    ---------
    
    - `7124 &lt;https://github.com/pytest-dev/pytest/issues/7124&gt;`_: Fixed an issue where ``__main__.py`` would raise an ``ImportError`` when ``--doctest-modules`` was provided.
    
    
    - `8061 &lt;https://github.com/pytest-dev/pytest/issues/8061&gt;`_: Fixed failing ``staticmethod`` test cases if they are inherited from a parent test class.
    
    
    - `8192 &lt;https://github.com/pytest-dev/pytest/issues/8192&gt;`_: ``testdir.makefile`` now silently accepts values which don&#x27;t start with ``.`` to maintain backward compatibility with older pytest versions.
    
    ``pytester.makefile`` now issues a clearer error if the ``.`` is missing in the ``ext`` argument.
    
    
    - `8258 &lt;https://github.com/pytest-dev/pytest/issues/8258&gt;`_: Fixed issue where pytest&#x27;s ``faulthandler`` support would not dump traceback on crashes
    if the :mod:`faulthandler` module was already enabled during pytest startup (using
    ``python -X dev -m pytest`` for example).
    
    
    - `8317 &lt;https://github.com/pytest-dev/pytest/issues/8317&gt;`_: Fixed an issue where illegal directory characters derived from ``getpass.getuser()`` raised an ``OSError``.
    
    
    - `8367 &lt;https://github.com/pytest-dev/pytest/issues/8367&gt;`_: Fix ``Class.from_parent`` so it forwards extra keyword arguments to the constructor.
    
    
    - `8377 &lt;https://github.com/pytest-dev/pytest/issues/8377&gt;`_: The test selection options ``pytest -k`` and ``pytest -m`` now support matching
    names containing forward slash (``/``) characters.
    
    
    - `8384 &lt;https://github.com/pytest-dev/pytest/issues/8384&gt;`_: The ``pytest.mark.skip`` decorator now correctly handles its arguments. When the ``reason`` argument is accidentally given both positional and as a keyword (e.g. because it was confused with ``skipif``), a ``TypeError`` now occurs. Before, such tests were silently skipped, and the positional argument ignored. Additionally, ``reason`` is now documented correctly as positional or keyword (rather than keyword-only).
    
    
    - `8394 &lt;https://github.com/pytest-dev/pytest/issues/8394&gt;`_: Use private names for internal fixtures that handle classic setup/teardown so that they don&#x27;t show up with the default ``--fixtures`` invocation (but they still show up with ``--fixtures -v``).
    
    
    - `8456 &lt;https://github.com/pytest-dev/pytest/issues/8456&gt;`_: The :confval:`required_plugins` config option now works correctly when pre-releases of plugins are installed, rather than falsely claiming that those plugins aren&#x27;t installed at all.
    
    
    - `8464 &lt;https://github.com/pytest-dev/pytest/issues/8464&gt;`_: ``-c &lt;config file&gt;`` now also properly defines ``rootdir`` as the directory that contains ``&lt;config file&gt;``.
    
    
    - `8503 &lt;https://github.com/pytest-dev/pytest/issues/8503&gt;`_: :meth:`pytest.MonkeyPatch.syspath_prepend` no longer fails when
    ``setuptools`` is not installed.
    It now only calls :func:`pkg_resources.fixup_namespace_packages` if
    ``pkg_resources`` was previously imported, because it is not needed otherwise.
    
    
    - `8548 &lt;https://github.com/pytest-dev/pytest/issues/8548&gt;`_: Introduce fix to handle precision width in ``log-cli-format`` in turn to fix output coloring for certain formats.
    
    
    - `8796 &lt;https://github.com/pytest-dev/pytest/issues/8796&gt;`_: Fixed internal error when skipping doctests.
    
    
    - `8983 &lt;https://github.com/pytest-dev/pytest/issues/8983&gt;`_: The test selection options ``pytest -k`` and ``pytest -m`` now support matching names containing backslash (`\\`) characters.
    Backslashes are treated literally, not as escape characters (the values being matched against are already escaped).
    
    
    - `8990 &lt;https://github.com/pytest-dev/pytest/issues/8990&gt;`_: Fix `pytest -vv` crashing with an internal exception `AttributeError: &#x27;str&#x27; object has no attribute &#x27;relative_to&#x27;` in some cases.
    
    
    - `9077 &lt;https://github.com/pytest-dev/pytest/issues/9077&gt;`_: Fixed confusing error message when ``request.fspath`` / ``request.path`` was accessed from a session-scoped fixture.
    
    
    - `9131 &lt;https://github.com/pytest-dev/pytest/issues/9131&gt;`_: Fixed the URL used by ``--pastebin`` to use `bpa.st &lt;http://bpa.st&gt;`__.
    
    
    - `9163 &lt;https://github.com/pytest-dev/pytest/issues/9163&gt;`_: The end line number and end column offset are now properly set for rewritten assert statements.
    
    
    - `9169 &lt;https://github.com/pytest-dev/pytest/issues/9169&gt;`_: Support for the ``files`` API from ``importlib.resources`` within rewritten files.
    
    
    - `9272 &lt;https://github.com/pytest-dev/pytest/issues/9272&gt;`_: The nose compatibility module-level fixtures `setup()` and `teardown()` are now only called once per module, instead of for each test function.
    They are now called even if object-level `setup`/`teardown` is defined.
    
    
    
    Improved Documentation
    ----------------------
    
    - `4320 &lt;https://github.com/pytest-dev/pytest/issues/4320&gt;`_: Improved docs for `pytester.copy_example`.
    
    
    - `5105 &lt;https://github.com/pytest-dev/pytest/issues/5105&gt;`_: Add automatically generated :ref:`plugin-list`. The list is updated on a periodic schedule.
    
    
    - `8337 &lt;https://github.com/pytest-dev/pytest/issues/8337&gt;`_: Recommend `numpy.testing &lt;https://numpy.org/doc/stable/reference/routines.testing.html&gt;`__ module on :func:`pytest.approx` documentation.
    
    
    - `8655 &lt;https://github.com/pytest-dev/pytest/issues/8655&gt;`_: Help text for ``--pdbcls`` more accurately reflects the option&#x27;s behavior.
    
    
    - `9210 &lt;https://github.com/pytest-dev/pytest/issues/9210&gt;`_: Remove incorrect docs about ``confcutdir`` being a configuration option: it can only be set through the ``--confcutdir`` command-line option.
    
    
    - `9242 &lt;https://github.com/pytest-dev/pytest/issues/9242&gt;`_: Upgrade readthedocs configuration to use a `newer Ubuntu version &lt;https://blog.readthedocs.com/new-build-specification/&gt;`__` with better unicode support for PDF docs.
    
    
    - `9341 &lt;https://github.com/pytest-dev/pytest/issues/9341&gt;`_: Various methods commonly used for :ref:`non-python tests` are now correctly documented in the reference docs. They were undocumented previously.
    
    
    
    Trivial/Internal Changes
    ------------------------
    
    - `8133 &lt;https://github.com/pytest-dev/pytest/issues/8133&gt;`_: Migrate to ``setuptools_scm`` 6.x to use ``SETUPTOOLS_SCM_PRETEND_VERSION_FOR_PYTEST`` for more robust release tooling.
    
    
    - `8174 &lt;https://github.com/pytest-dev/pytest/issues/8174&gt;`_: The following changes have been made to internal pytest types/functions:
    
    - The ``_pytest.code.getfslineno()`` function returns ``Path`` instead of ``py.path.local``.
    - The ``_pytest.python.path_matches_patterns()`` function takes ``Path`` instead of ``py.path.local``.
    - The ``_pytest._code.Traceback.cut()`` function accepts any ``os.PathLike[str]``, not just ``py.path.local``.
    
    
    - `8248 &lt;https://github.com/pytest-dev/pytest/issues/8248&gt;`_: Internal Restructure: let ``python.PyObjMixin`` inherit from ``nodes.Node`` to carry over typing information.
    
    
    - `8432 &lt;https://github.com/pytest-dev/pytest/issues/8432&gt;`_: Improve error message when :func:`pytest.skip` is used at module level without passing `allow_module_level=True`.
    
    
    - `8818 &lt;https://github.com/pytest-dev/pytest/issues/8818&gt;`_: Ensure ``regendoc`` opts out of ``TOX_ENV`` cachedir selection to ensure independent example test runs.
    
    
    - `8913 &lt;https://github.com/pytest-dev/pytest/issues/8913&gt;`_: The private ``CallSpec2._arg2scopenum`` attribute has been removed after an internal refactoring.
    
    
    - `8967 &lt;https://github.com/pytest-dev/pytest/issues/8967&gt;`_: :hook:`pytest_assertion_pass` is no longer considered experimental and
    future changes to it will be considered more carefully.
    
    
    - `9202 &lt;https://github.com/pytest-dev/pytest/issues/9202&gt;`_: Add github action to upload coverage report to codecov instead of bash uploader.
    
    
    - `9225 &lt;https://github.com/pytest-dev/pytest/issues/9225&gt;`_: Changed the command used to create sdist and wheel artifacts: using the build package instead of setup.py.
    
    
    - `9351 &lt;https://github.com/pytest-dev/pytest/issues/9351&gt;`_: Correct minor typos in doc/en/example/special.rst.
    

    6.2.5

    =========================
    
    
    Trivial/Internal Changes
    ------------------------
    
    - :issue:`8494`: Python 3.10 is now supported.
    
    
    - :issue:`9040`: Enable compatibility with ``pluggy 1.0`` or later.
    

    6.2.4

    =========================
    
    Bug Fixes
    ---------
    
    - :issue:`8539`: Fixed assertion rewriting on Python 3.10.
    

    6.2.3

    =========================
    
    Bug Fixes
    ---------
    
    - :issue:`8414`: pytest used to create directories under ``/tmp`` with world-readable
    permissions. This means that any user in the system was able to read
    information written by tests in temporary directories (such as those created by
    the ``tmp_path``/``tmpdir`` fixture). Now the directories are created with
    private permissions.
    
    pytest used to silently use a pre-existing ``/tmp/pytest-of-&lt;username&gt;`` directory,
    even if owned by another user. This means another user could pre-create such a
    directory and gain control of another user&#x27;s temporary directory. Now such a
    condition results in an error.
    

    6.2.2

    =========================
    
    Bug Fixes
    ---------
    
    - :issue:`8152`: Fixed &quot;(&lt;Skipped instance&gt;)&quot; being shown as a skip reason in the verbose test summary line when the reason is empty.
    
    
    - :issue:`8249`: Fix the ``faulthandler`` plugin for occasions when running with ``twisted.logger`` and using ``pytest --capture=no``.
    

    6.2.1

    =========================
    
    Bug Fixes
    ---------
    
    - :issue:`7678`: Fixed bug where ``ImportPathMismatchError`` would be raised for files compiled in
    the host and loaded later from an UNC mounted path (Windows).
    
    
    - :issue:`8132`: Fixed regression in ``approx``: in 6.2.0 ``approx`` no longer raises
    ``TypeError`` when dealing with non-numeric types, falling back to normal comparison.
    Before 6.2.0, array types like tf.DeviceArray fell through to the scalar case,
    and happened to compare correctly to a scalar if they had only one element.
    After 6.2.0, these types began failing, because they inherited neither from
    standard Python number hierarchy nor from ``numpy.ndarray``.
    
    ``approx`` now converts arguments to ``numpy.ndarray`` if they expose the array
    protocol and are not scalars. This treats array-like objects like numpy arrays,
    regardless of size.
    

    6.2.0

    =========================
    
    Breaking Changes
    ----------------
    
    - :issue:`7808`: pytest now supports python3.6+ only.
    
    
    
    Deprecations
    ------------
    
    - :issue:`7469`: Directly constructing/calling the following classes/functions is now deprecated:
    
    - ``_pytest.cacheprovider.Cache``
    - ``_pytest.cacheprovider.Cache.for_config()``
    - ``_pytest.cacheprovider.Cache.clear_cache()``
    - ``_pytest.cacheprovider.Cache.cache_dir_from_config()``
    - ``_pytest.capture.CaptureFixture``
    - ``_pytest.fixtures.FixtureRequest``
    - ``_pytest.fixtures.SubRequest``
    - ``_pytest.logging.LogCaptureFixture``
    - ``_pytest.pytester.Pytester``
    - ``_pytest.pytester.Testdir``
    - ``_pytest.recwarn.WarningsRecorder``
    - ``_pytest.recwarn.WarningsChecker``
    - ``_pytest.tmpdir.TempPathFactory``
    - ``_pytest.tmpdir.TempdirFactory``
    
    These have always been considered private, but now issue a deprecation warning, which may become a hard error in pytest 8.0.0.
    
    
    - :issue:`7530`: The ``--strict`` command-line option has been deprecated, use ``--strict-markers`` instead.
    
    We have plans to maybe in the future to reintroduce ``--strict`` and make it an encompassing flag for all strictness
    related options (``--strict-markers`` and ``--strict-config`` at the moment, more might be introduced in the future).
    
    
    - :issue:`7988`: The ``pytest.yield_fixture`` decorator/function is now deprecated. Use :func:`pytest.fixture` instead.
    
    ``yield_fixture`` has been an alias for ``fixture`` for a very long time, so can be search/replaced safely.
    
    
    
    Features
    --------
    
    - :issue:`5299`: pytest now warns about unraisable exceptions and unhandled thread exceptions that occur in tests on Python&gt;=3.8.
    See :ref:`unraisable` for more information.
    
    
    - :issue:`7425`: New :fixture:`pytester` fixture, which is identical to :fixture:`testdir` but its methods return :class:`pathlib.Path` when appropriate instead of ``py.path.local``.
    
    This is part of the movement to use :class:`pathlib.Path` objects internally, in order to remove the dependency to ``py`` in the future.
    
    Internally, the old :class:`Testdir &lt;_pytest.pytester.Testdir&gt;` is now a thin wrapper around :class:`Pytester &lt;_pytest.pytester.Pytester&gt;`, preserving the old interface.
    
    
    - :issue:`7695`: A new hook was added, `pytest_markeval_namespace` which should return a dictionary.
    This dictionary will be used to augment the &quot;global&quot; variables available to evaluate skipif/xfail/xpass markers.
    
    Pseudo example
    
    ``conftest.py``:
    
    .. code-block:: python
    
      def pytest_markeval_namespace():
          return {&quot;color&quot;: &quot;red&quot;}
    
    ``test_func.py``:
    
    .. code-block:: python
    
      pytest.mark.skipif(&quot;color == &#x27;blue&#x27;&quot;, reason=&quot;Color is not red&quot;)
      def test_func():
          assert False
    
    
    - :issue:`8006`: It is now possible to construct a :class:`~pytest.MonkeyPatch` object directly as ``pytest.MonkeyPatch()``,
    in cases when the :fixture:`monkeypatch` fixture cannot be used. Previously some users imported it
    from the private `_pytest.monkeypatch.MonkeyPatch` namespace.
    
    Additionally, :meth:`MonkeyPatch.context &lt;pytest.MonkeyPatch.context&gt;` is now a classmethod,
    and can be used as ``with MonkeyPatch.context() as mp: ...``. This is the recommended way to use
    ``MonkeyPatch`` directly, since unlike the ``monkeypatch`` fixture, an instance created directly
    is not ``undo()``-ed automatically.
    
    
    
    Improvements
    ------------
    
    - :issue:`1265`: Added an ``__str__`` implementation to the :class:`~pytest.pytester.LineMatcher` class which is returned from ``pytester.run_pytest().stdout`` and similar. It returns the entire output, like the existing ``str()`` method.
    
    
    - :issue:`2044`: Verbose mode now shows the reason that a test was skipped in the test&#x27;s terminal line after the &quot;SKIPPED&quot;, &quot;XFAIL&quot; or &quot;XPASS&quot;.
    
    
    - :issue:`7469` The types of builtin pytest fixtures are now exported so they may be used in type annotations of test functions.
    The newly-exported types are:
    
    - ``pytest.FixtureRequest`` for the :fixture:`request` fixture.
    - ``pytest.Cache`` for the :fixture:`cache` fixture.
    - ``pytest.CaptureFixture[str]`` for the :fixture:`capfd` and :fixture:`capsys` fixtures.
    - ``pytest.CaptureFixture[bytes]`` for the :fixture:`capfdbinary` and :fixture:`capsysbinary` fixtures.
    - ``pytest.LogCaptureFixture`` for the :fixture:`caplog` fixture.
    - ``pytest.Pytester`` for the :fixture:`pytester` fixture.
    - ``pytest.Testdir`` for the :fixture:`testdir` fixture.
    - ``pytest.TempdirFactory`` for the :fixture:`tmpdir_factory` fixture.
    - ``pytest.TempPathFactory`` for the :fixture:`tmp_path_factory` fixture.
    - ``pytest.MonkeyPatch`` for the :fixture:`monkeypatch` fixture.
    - ``pytest.WarningsRecorder`` for the :fixture:`recwarn` fixture.
    
    Constructing them is not supported (except for `MonkeyPatch`); they are only meant for use in type annotations.
    Doing so will emit a deprecation warning, and may become a hard-error in pytest 8.0.
    
    Subclassing them is also not supported. This is not currently enforced at runtime, but is detected by type-checkers such as mypy.
    
    
    - :issue:`7527`: When a comparison between :func:`namedtuple &lt;collections.namedtuple&gt;` instances of the same type fails, pytest now shows the differing field names (possibly nested) instead of their indexes.
    
    
    - :issue:`7615`: :meth:`Node.warn &lt;_pytest.nodes.Node.warn&gt;` now permits any subclass of :class:`Warning`, not just :class:`PytestWarning &lt;pytest.PytestWarning&gt;`.
    
    
    - :issue:`7701`: Improved reporting when using ``--collected-only``. It will now show the number of collected tests in the summary stats.
    
    
    - :issue:`7710`: Use strict equality comparison for non-numeric types in :func:`pytest.approx` instead of
    raising :class:`TypeError`.
    
    This was the undocumented behavior before 3.7, but is now officially a supported feature.
    
    
    - :issue:`7938`: New ``--sw-skip`` argument which is a shorthand for ``--stepwise-skip``.
    
    
    - :issue:`8023`: Added ``&#x27;node_modules&#x27;`` to default value for :confval:`norecursedirs`.
    
    
    - :issue:`8032`: :meth:`doClassCleanups &lt;unittest.TestCase.doClassCleanups&gt;` (introduced in :mod:`unittest` in Python and 3.8) is now called appropriately.
    
    
    
    Bug Fixes
    ---------
    
    - :issue:`4824`: Fixed quadratic behavior and improved performance of collection of items using autouse fixtures and xunit fixtures.
    
    
    - :issue:`7758`: Fixed an issue where some files in packages are getting lost from ``--lf`` even though they contain tests that failed. Regressed in pytest 5.4.0.
    
    
    - :issue:`7911`: Directories created by by :fixture:`tmp_path` and :fixture:`tmpdir` are now considered stale after 3 days without modification (previous value was 3 hours) to avoid deleting directories still in use in long running test suites.
    
    
    - :issue:`7913`: Fixed a crash or hang in :meth:`pytester.spawn &lt;_pytest.pytester.Pytester.spawn&gt;` when the :mod:`readline` module is involved.
    
    
    - :issue:`7951`: Fixed handling of recursive symlinks when collecting tests.
    
    
    - :issue:`7981`: Fixed symlinked directories not being followed during collection. Regressed in pytest 6.1.0.
    
    
    - :issue:`8016`: Fixed only one doctest being collected when using ``pytest --doctest-modules path/to/an/__init__.py``.
    
    
    
    Improved Documentation
    ----------------------
    
    - :issue:`7429`: Add more information and use cases about skipping doctests.
    
    
    - :issue:`7780`: Classes which should not be inherited from are now marked ``final class`` in the API reference.
    
    
    - :issue:`7872`: ``_pytest.config.argparsing.Parser.addini()`` accepts explicit ``None`` and ``&quot;string&quot;``.
    
    
    - :issue:`7878`: In pull request section, ask to commit after editing changelog and authors file.
    
    
    
    Trivial/Internal Changes
    ------------------------
    
    - :issue:`7802`: The ``attrs`` dependency requirement is now &gt;=19.2.0 instead of &gt;=17.4.0.
    
    
    - :issue:`8014`: `.pyc` files created by pytest&#x27;s assertion rewriting now conform to the newer :pep:`552` format on Python&gt;=3.7.
    (These files are internal and only interpreted by pytest itself.)
    

    6.1.2

    =========================
    
    Bug Fixes
    ---------
    
    - :issue:`7758`: Fixed an issue where some files in packages are getting lost from ``--lf`` even though they contain tests that failed. Regressed in pytest 5.4.0.
    
    
    - :issue:`7911`: Directories created by `tmpdir` are now considered stale after 3 days without modification (previous value was 3 hours) to avoid deleting directories still in use in long running test suites.
    
    
    
    Improved Documentation
    ----------------------
    
    - :issue:`7815`: Improve deprecation warning message for ``pytest._fillfuncargs()``.
    

    6.1.1

    =========================
    
    Bug Fixes
    ---------
    
    - :issue:`7807`: Fixed regression in pytest 6.1.0 causing incorrect rootdir to be determined in some non-trivial cases where parent directories have config files as well.
    
    
    - :issue:`7814`: Fixed crash in header reporting when :confval:`testpaths` is used and contains absolute paths (regression in 6.1.0).
    

    6.1.0

    =========================
    
    Breaking Changes
    ----------------
    
    - :issue:`5585`: As per our policy, the following features which have been deprecated in the 5.X series are now
    removed:
    
    * The ``funcargnames`` read-only property of ``FixtureRequest``, ``Metafunc``, and ``Function`` classes. Use ``fixturenames`` attribute.
    
    * ``pytest.fixture`` no longer supports positional arguments, pass all arguments by keyword instead.
    
    * Direct construction of ``Node`` subclasses now raise an error, use ``from_parent`` instead.
    
    * The default value for ``junit_family`` has changed to ``xunit2``. If you require the old format, add ``junit_family=xunit1`` to your configuration file.
    
    * The ``TerminalReporter`` no longer has a ``writer`` attribute. Plugin authors may use the public functions of the ``TerminalReporter`` instead of accessing the ``TerminalWriter`` object directly.
    
    * The ``--result-log`` option has been removed. Users are recommended to use the `pytest-reportlog &lt;https://github.com/pytest-dev/pytest-reportlog&gt;`__ plugin instead.
    
    
    For more information consult :std:doc:`deprecations` in the docs.
    
    
    
    Deprecations
    ------------
    
    - :issue:`6981`: The ``pytest.collect`` module is deprecated: all its names can be imported from ``pytest`` directly.
    
    
    - :issue:`7097`: The ``pytest._fillfuncargs`` function is deprecated. This function was kept
    for backward compatibility with an older plugin.
    
    It&#x27;s functionality is not meant to be used directly, but if you must replace
    it, use `function._request._fillfixtures()` instead, though note this is not
    a public API and may break in the future.
    
    
    - :issue:`7210`: The special ``-k &#x27;-expr&#x27;`` syntax to ``-k`` is deprecated. Use ``-k &#x27;not expr&#x27;``
    instead.
    
    The special ``-k &#x27;expr:&#x27;`` syntax to ``-k`` is deprecated. Please open an issue
    if you use this and want a replacement.
    
    
    - :issue:`7255`: The :hook:`pytest_warning_captured` hook is deprecated in favor
    of :hook:`pytest_warning_recorded`, and will be removed in a future version.
    
    
    - :issue:`7648`: The ``gethookproxy()`` and ``isinitpath()`` methods of ``FSCollector`` and ``Package`` are deprecated;
    use ``self.session.gethookproxy()`` and ``self.session.isinitpath()`` instead.
    This should work on all pytest versions.
    
    
    
    Features
    --------
    
    - :issue:`7667`: New ``--durations-min`` command-line flag controls the minimal duration for inclusion in the slowest list of tests shown by ``--durations``. Previously this was hard-coded to ``0.005s``.
    
    
    
    Improvements
    ------------
    
    - :issue:`6681`: Internal pytest warnings issued during the early stages of initialization are now properly handled and can filtered through :confval:`filterwarnings` or ``--pythonwarnings/-W``.
    
    This also fixes a number of long standing issues: :issue:`2891`, :issue:`7620`, :issue:`7426`.
    
    
    - :issue:`7572`: When a plugin listed in ``required_plugins`` is missing or an unknown config key is used with ``--strict-config``, a simple error message is now shown instead of a stacktrace.
    
    
    - :issue:`7685`: Added two new attributes :attr:`rootpath &lt;_pytest.config.Config.rootpath&gt;` and :attr:`inipath &lt;_pytest.config.Config.inipath&gt;` to :class:`Config &lt;_pytest.config.Config&gt;`.
    These attributes are :class:`pathlib.Path` versions of the existing :attr:`rootdir &lt;_pytest.config.Config.rootdir&gt;` and :attr:`inifile &lt;_pytest.config.Config.inifile&gt;` attributes,
    and should be preferred over them when possible.
    
    
    - :issue:`7780`: Public classes which are not designed to be inherited from are now marked :func:`final &lt;typing.final&gt;`.
    Code which inherits from these classes will trigger a type-checking (e.g. mypy) error, but will still work in runtime.
    Currently the ``final`` designation does not appear in the API Reference but hopefully will in the future.
    
    
    
    Bug Fixes
    ---------
    
    - :issue:`1953`: Fixed error when overwriting a parametrized fixture, while also reusing the super fixture value.
    
    .. code-block:: python
    
        conftest.py
       import pytest
    
    
       pytest.fixture(params=[1, 2])
       def foo(request):
           return request.param
    
    
        test_foo.py
       import pytest
    
    
       pytest.fixture
       def foo(foo):
           return foo * 2
    
    
    - :issue:`4984`: Fixed an internal error crash with ``IndexError: list index out of range`` when
    collecting a module which starts with a decorated function, the decorator
    raises, and assertion rewriting is enabled.
    
    
    - :issue:`7591`: pylint shouldn&#x27;t complain anymore about unimplemented abstract methods when inheriting from :ref:`File &lt;non-python tests&gt;`.
    
    
    - :issue:`7628`: Fixed test collection when a full path without a drive letter was passed to pytest on Windows (for example ``\projects\tests\test.py`` instead of ``c:\projects\tests\pytest.py``).
    
    
    - :issue:`7638`: Fix handling of command-line options that appear as paths but trigger an OS-level syntax error on Windows, such as the options used internally by ``pytest-xdist``.
    
    
    - :issue:`7742`: Fixed INTERNALERROR when accessing locals / globals with faulty ``exec``.
    
    
    
    Improved Documentation
    ----------------------
    
    - :issue:`1477`: Removed faq.rst and its reference in contents.rst.
    
    
    
    Trivial/Internal Changes
    ------------------------
    
    - :issue:`7536`: The internal ``junitxml`` plugin has rewritten to use ``xml.etree.ElementTree``.
    The order of attributes in XML elements might differ. Some unneeded escaping is
    no longer performed.
    
    
    - :issue:`7587`: The dependency on the ``more-itertools`` package has been removed.
    
    
    - :issue:`7631`: The result type of :meth:`capfd.readouterr() &lt;_pytest.capture.CaptureFixture.readouterr&gt;` (and similar) is no longer a namedtuple,
    but should behave like one in all respects. This was done for technical reasons.
    
    
    - :issue:`7671`: When collecting tests, pytest finds test classes and functions by examining the
    attributes of python objects (modules, classes and instances). To speed up this
    process, pytest now ignores builtin attributes (like ``__class__``,
    ``__delattr__`` and ``__new__``) without consulting the :confval:`python_classes` and
    :confval:`python_functions` configuration options and without passing them to plugins
    using the :hook:`pytest_pycollect_makeitem` hook.
    

    6.0.2

    =========================
    
    Bug Fixes
    ---------
    
    - :issue:`7148`: Fixed ``--log-cli`` potentially causing unrelated ``print`` output to be swallowed.
    
    
    - :issue:`7672`: Fixed log-capturing level restored incorrectly if ``caplog.set_level`` is called more than once.
    
    
    - :issue:`7686`: Fixed `NotSetType.token` being used as the parameter ID when the parametrization list is empty.
    Regressed in pytest 6.0.0.
    
    
    - :issue:`7707`: Fix internal error when handling some exceptions that contain multiple lines or the style uses multiple lines (``--tb=line`` for example).
    

    6.0.1

    =========================
    
    Bug Fixes
    ---------
    
    - :issue:`7394`: Passing an empty ``help`` value to ``Parser.add_option`` is now accepted instead of crashing when running ``pytest --help``.
    Passing ``None`` raises a more informative ``TypeError``.
    
    
    - :issue:`7558`: Fix pylint ``not-callable`` lint on ``pytest.mark.parametrize()`` and the other builtin marks:
    ``skip``, ``skipif``, ``xfail``, ``usefixtures``, ``filterwarnings``.
    
    
    - :issue:`7559`: Fix regression in plugins using ``TestReport.longreprtext`` (such as ``pytest-html``) when ``TestReport.longrepr`` is not a string.
    
    
    - :issue:`7569`: Fix logging capture handler&#x27;s level not reset on teardown after a call to ``caplog.set_level()``.
    

    6.0.0

    =========================
    
    (**Please see the full set of changes for this release also in the 6.0.0rc1 notes below**)
    
    Breaking Changes
    ----------------
    
    - :issue:`5584`: **PytestDeprecationWarning are now errors by default.**
    
    Following our plan to remove deprecated features with as little disruption as
    possible, all warnings of type ``PytestDeprecationWarning`` now generate errors
    instead of warning messages.
    
    **The affected features will be effectively removed in pytest 6.1**, so please consult the
    :std:doc:`deprecations` section in the docs for directions on how to update existing code.
    
    In the pytest ``6.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:
    
    .. code-block:: ini
    
       [pytest]
       filterwarnings =
           ignore::pytest.PytestDeprecationWarning
    
    But this will stop working when pytest ``6.1`` is released.
    
    **If you have concerns** about the removal of a specific feature, please add a
    comment to :issue:`5584`.
    
    
    - :issue:`7472`: The ``exec_()`` and ``is_true()`` methods of ``_pytest._code.Frame`` have been removed.
    
    
    
    Features
    --------
    
    - :issue:`7464`: Added support for :envvar:`NO_COLOR` and :envvar:`FORCE_COLOR` environment variables to control colored output.
    
    
    
    Improvements
    ------------
    
    - :issue:`7467`: ``--log-file`` CLI option and ``log_file`` ini marker now create subdirectories if needed.
    
    
    - :issue:`7489`: The :func:`pytest.raises` function has a clearer error message when ``match`` equals the obtained string but is not a regex match. In this case it is suggested to escape the regex.
    
    
    
    Bug Fixes
    ---------
    
    - :issue:`7392`: Fix the reported location of tests skipped with ``pytest.mark.skip`` when ``--runxfail`` is used.
    
    
    - :issue:`7491`: :fixture:`tmpdir` and :fixture:`tmp_path` no longer raise an error if the lock to check for
    stale temporary directories is not accessible.
    
    
    - :issue:`7517`: Preserve line endings when captured via ``capfd``.
    
    
    - :issue:`7534`: Restored the previous formatting of ``TracebackEntry.__str__`` which was changed by accident.
    
    
    
    Improved Documentation
    ----------------------
    
    - :issue:`7422`: Clarified when the ``usefixtures`` mark can apply fixtures to test.
    
    
    - :issue:`7441`: Add a note about ``-q`` option used in getting started guide.
    
    
    
    Trivial/Internal Changes
    ------------------------
    
    - :issue:`7389`: Fixture scope ``package`` is no longer considered experimental.
    

    6.0.0rc1

    ============================
    
    Breaking Changes
    ----------------
    
    - :issue:`1316`: ``TestReport.longrepr`` is now always an instance of ``ReprExceptionInfo``. Previously it was a ``str`` when a test failed with ``pytest.fail(..., pytrace=False)``.
    
    
    - :issue:`5965`: symlinks are no longer resolved during collection and matching `conftest.py` files with test file paths.
    
    Resolving symlinks for the current directory and during collection was introduced as a bugfix in 3.9.0, but it actually is a new feature which had unfortunate consequences in Windows and surprising results in other platforms.
    
    The team decided to step back on resolving symlinks at all, planning to review this in the future with a more solid solution (see discussion in
    :pull:`6523` for details).
    
    This might break test suites which made use of this feature; the fix is to create a symlink
    for the entire test tree, and not only to partial files/tress as it was possible previously.
    
    
    - :issue:`6505`: ``Testdir.run().parseoutcomes()`` now always returns the parsed nouns in plural form.
    
    Originally ``parseoutcomes()`` would always returns the nouns in plural form, but a change
    meant to improve the terminal summary by using singular form single items (``1 warning`` or ``1 error``)
    caused an unintended regression by changing the keys returned by ``parseoutcomes()``.
    
    Now the API guarantees to always return the plural form, so calls like this:
    
    .. code-block:: python
    
       result = testdir.runpytest()
       result.assert_outcomes(error=1)
    
    Need to be changed to:
    
    
    .. code-block:: python
    
       result = testdir.runpytest()
       result.assert_outcomes(errors=1)
    
    
    - :issue:`6903`: The ``os.dup()`` function is now assumed to exist. We are not aware of any
    supported Python 3 implementations which do not provide it.
    
    
    - :issue:`7040`: ``-k`` no longer matches against the names of the directories outside the test session root.
    
    Also, ``pytest.Package.name`` is now just the name of the directory containing the package&#x27;s
    ``__init__.py`` file, instead of the full path. This is consistent with how the other nodes
    are named, and also one of the reasons why ``-k`` would match against any directory containing
    the test suite.
    
    
    - :issue:`7122`: Expressions given to the ``-m`` and ``-k`` options are no longer evaluated using Python&#x27;s :func:`eval`.
    The format supports ``or``, ``and``, ``not``, parenthesis and general identifiers to match against.
    Python constants, keywords or other operators are no longer evaluated differently.
    
    
    - :issue:`7135`: Pytest now uses its own ``TerminalWriter`` class instead of using the one from the ``py`` library.
    Plugins generally access this class through ``TerminalReporter.writer``, ``TerminalReporter.write()``
    (and similar methods), or ``_pytest.config.create_terminal_writer()``.
    
    The following breaking changes were made:
    
    - Output (``write()`` method and others) no longer flush implicitly; the flushing behavior
     of the underlying file is respected. To flush explicitly (for example, if you
     want output to be shown before an end-of-line is printed), use ``write(flush=True)`` or
     ``terminal_writer.flush()``.
    - Explicit Windows console support was removed, delegated to the colorama library.
    - Support for writing ``bytes`` was removed.
    - The ``reline`` method and ``chars_on_current_line`` property were removed.
    - The ``stringio`` and ``encoding`` arguments was removed.
    - Support for passing a callable instead of a file was removed.
    
    
    - :issue:`7224`: The `item.catch_log_handler` and `item.catch_log_handlers` attributes, set by the
    logging plugin and never meant to be public, are no longer available.
    
    The deprecated ``--no-print-logs`` option and ``log_print`` ini option are removed. Use ``--show-capture`` instead.
    
    
    - :issue:`7226`: Removed the unused ``args`` parameter from ``pytest.Function.__init__``.
    
    
    - :issue:`7418`: Removed the `pytest_doctest_prepare_content` hook specification. This hook
    hasn&#x27;t been triggered by pytest for at least 10 years.
    
    
    - :issue:`7438`: Some changes were made to the internal ``_pytest._code.source``, listed here
    for the benefit of plugin authors who may be using it:
    
    - The ``deindent`` argument to ``Source()`` has been removed, now it is always true.
    - Support for zero or multiple arguments to ``Source()`` has been removed.
    - Support for comparing ``Source`` with an ``str`` has been removed.
    - The methods ``Source.isparseable()`` and ``Source.putaround()`` have been removed.
    - The method ``Source.compile()`` and function ``_pytest._code.compile()`` have
     been removed; use plain ``compile()`` instead.
    - The function ``_pytest._code.source.getsource()`` has been removed; use
     ``Source()`` directly instead.
    
    
    
    Deprecations
    ------------
    
    - :issue:`7210`: The special ``-k &#x27;-expr&#x27;`` syntax to ``-k`` is deprecated. Use ``-k &#x27;not expr&#x27;``
    instead.
    
    The special ``-k &#x27;expr:&#x27;`` syntax to ``-k`` is deprecated. Please open an issue
    if you use this and want a replacement.
    
    - :issue:`4049`: ``pytest_warning_captured`` is deprecated in favor of the ``pytest_warning_recorded`` hook.
    
    
    Features
    --------
    
    - :issue:`1556`: pytest now supports ``pyproject.toml`` files for configuration.
    
    The configura
    opened by pyup-bot 0
Releases(1.5.2)
  • 1.5.2(Sep 21, 2020)

    The last version of cached_property before we drop Python 2.7

    • Add formal support for Python 3.8
    • Remove formal support for Python 3.4
    • Switch from Travis to GitHub actions
    • Made tests pass flake8 for Python 2.7
    Source code(tar.gz)
    Source code(zip)
  • 1.3.0(Nov 25, 2015)

    • Dropped some non-ASCII characters from HISTORY.rst, thanks to @AdamWill
    • Added official support for Python 3.5, thanks to @pydanny and @audreyr
    • Removed confusingly placed lock from example, thanks to @ionelmc
    • Corrected invalidation cache documentation, thanks to @proofit404
    • Updated to latest Travis-CI environment, thanks to @audreyr
    Source code(tar.gz)
    Source code(zip)
  • 1.2.0(Apr 28, 2015)

    • Overall code and test refactoring, thanks to @gsakkis
    • Allow the del statement for resetting cached properties with ttl instead of del obj._cache[attr], thanks to @gsakkis.
    • Uncovered a bug in PyPy, https://bitbucket.org/pypy/pypy/issue/2033/attributeerror-object-attribute-is-read, thanks to @gsakkis
    • Fixed threaded_cached_property_with_ttl to actually be thread-safe, thanks to @gsakkis
    Source code(tar.gz)
    Source code(zip)
  • 1.1.0(Apr 28, 2015)

    • Regression: As the cache was not always clearing, we’ve broken out the time to expire feature to it’s own set of specific tools, thanks to @pydanny
    • Fixed typo in README, thanks to @zoidbergwill
    Source code(tar.gz)
    Source code(zip)
  • 1.0.0(Apr 28, 2015)

    • Added timed to expire feature to cached_property decorator.
    • Backwards incompatiblity: Changed del monopoly.boardwalk to del monopoly['boardwalk'] in order to support the new TTL feature.
    Source code(tar.gz)
    Source code(zip)
Owner
Daniel Roy Greenfeld
Husband of @audreyfeldroy 💘, father of Uma 🍼, President/COO of feldroy.com, Co-Author of Two Scoops of Django, formerly @nasa, currently at @octoenergy
Daniel Roy Greenfeld
A slick ORM cache with automatic granular event-driven invalidation.

Cacheops A slick app that supports automatic or manual queryset caching and automatic granular event-driven invalidation. It uses redis as backend for

Alexander Schepanovski 1.7k Dec 30, 2022
A decorator for caching properties in classes.

cached-property A decorator for caching properties in classes. Why? Makes caching of time or computational expensive properties quick and easy. Becaus

Daniel Roy Greenfeld 658 Dec 01, 2022
A Redis cache backend for django

Redis Django Cache Backend A Redis cache backend for Django Docs can be found at http://django-redis-cache.readthedocs.org/en/latest/. Changelog 3.0.0

Sean Bleier 1k Dec 15, 2022
CacheControl is a port of the caching algorithms in httplib2 for use with requests session object.

CacheControl CacheControl is a port of the caching algorithms in httplib2 for use with requests session object. It was written because httplib2's bett

Eric Larson 409 Dec 04, 2022
No effort, no worry, maximum performance.

Django Cachalot Caches your Django ORM queries and automatically invalidates them. Documentation: http://django-cachalot.readthedocs.io Table of Conte

NoriPyt 976 Dec 28, 2022
A caching extension for Flask

Flask-Caching Adds easy cache support to Flask. This is a fork of the Flask-Cache extension. Flask-Caching also includes the cache module from werkzeu

Peter Justin 774 Jan 02, 2023
Robust, highly tunable and easy-to-integrate in-memory cache solution written in pure Python, with no dependencies.

Omoide Cache Caching doesn't need to be hard anymore. With just a few lines of code Omoide Cache will instantly bring your Python services to the next

Leo Ertuna 2 Aug 14, 2022
Automatic caching and invalidation for Django models through the ORM.

Cache Machine Cache Machine provides automatic caching and invalidation for Django models through the ORM. For full docs, see https://cache-machine.re

846 Nov 26, 2022
Render template parts with extended cache control.

Render template parts with extended cache control. Installation Install django-viewlet in your python environment $ pip install django-viewlet Support

5 Monkeys 59 Apr 05, 2022
Caching for HTTPX

Caching for HTTPX. Note: Early development / alpha, use at your own risk. This package adds caching functionality to HTTPX Adapted from Eric Larson's

Johannes 51 Dec 04, 2022
Asynchronous cache manager designed for horizontally scaled web servers.

Introduction Asynchronous cache manager designed for horizontally scaled web applications. NOTE: Currently has implementation only for FastAPI using R

Serghei 23 Dec 01, 2022
Extensible memoizing collections and decorators

cachetools This module provides various memoizing collections and decorators, including variants of the Python Standard Library's @lru_cache function

Thomas Kemmer 1.5k Jan 05, 2023
Peerix is a peer-to-peer binary cache for nix derivations

Peerix Peerix is a peer-to-peer binary cache for nix derivations. Every participating node can pull derivations from each other instances' respective

92 Dec 13, 2022
RecRoom Library Cache Tool

RecRoom Library Cache Tool A handy tool to deal with the Library cache file. Features Parse Library cache Remove Library cache Parsing The script pars

Jesse 5 Jul 09, 2022
Asyncio cache manager for redis, memcached and memory

aiocache Asyncio cache supporting multiple backends (memory, redis and memcached). This library aims for simplicity over specialization. All caches co

aio-libs 764 Jan 02, 2023
An implementation of memoization technique for Django

django-memoize django-memoize is an implementation of memoization technique for Django. You can think of it as a cache for function or method results.

Unhaggle 118 Dec 09, 2022
Persistent, stale-free, local and cross-machine caching for Python functions.

Persistent, stale-free, local and cross-machine caching for Python functions.

Shay Palachy 420 Dec 22, 2022
Python disk-backed cache (Django-compatible). Faster than Redis and Memcached. Pure-Python.

DiskCache is an Apache2 licensed disk and file backed cache library, written in pure-Python, and compatible with Django.

Grant Jenks 1.7k Jan 05, 2023
An ORM cache for Django.

Django ORMCache A cache manager mixin that provides some caching of objects for the ORM. Installation / Setup / Usage TODO Testing Run the tests with:

Educreations, Inc 15 Nov 27, 2022
Aircache is an open-source caching and security solution that can be integrated with most decoupled apps that use REST APIs for communicating.

AirCache Aircache is an open-source caching and security solution that can be integrated with most decoupled apps that use REST APIs for communicating

AirCache 2 Dec 22, 2021