From bf47357511c6f13012e89f7e142c8c6b4bf413c0 Mon Sep 17 00:00:00 2001
From: Ran Benita <ran@unusedvar.com>
Date: Sun, 9 Apr 2023 00:49:26 +0300
Subject: [PATCH] Merge pull request #10881 from pytest-dev/release-7.3.0

Prepare release 7.3.0

(cherry picked from commit cec5bfe0588adaa2ca36c72c724378982db6410a)
---
 changelog/10226.improvement.rst   |   1 -
 changelog/10525.feature.rst       |   1 -
 changelog/10658.improvement.rst   |   3 -
 changelog/10669.trivial.rst       |   1 -
 changelog/10710.improvement.rst   |   1 -
 changelog/10727.improvement.rst   |   1 -
 changelog/10743.bugfix.rst        |   1 -
 changelog/10755.feature.rst       |   1 -
 changelog/10765.bugfix.rst        |   1 -
 changelog/10782.doc.rst           |   1 -
 changelog/10840.improvement.rst   |   1 -
 changelog/1904.bugfix.rst         |   1 -
 changelog/6267.improvement.rst    |   2 -
 changelog/7431.feature.rst        |   1 -
 changelog/8141.feature.rst        |   1 -
 doc/en/announce/index.rst         |   1 +
 doc/en/announce/release-7.3.0.rst | 130 ++++++++++++++++++++++++++++++
 doc/en/changelog.rst              |  70 ++++++++++++++++
 doc/en/example/parametrize.rst    |   8 +-
 doc/en/example/reportingdemo.rst  | 102 +++++++++++------------
 doc/en/getting-started.rst        |   2 +-
 21 files changed, 259 insertions(+), 72 deletions(-)
 delete mode 100644 changelog/10226.improvement.rst
 delete mode 100644 changelog/10525.feature.rst
 delete mode 100644 changelog/10658.improvement.rst
 delete mode 100644 changelog/10669.trivial.rst
 delete mode 100644 changelog/10710.improvement.rst
 delete mode 100644 changelog/10727.improvement.rst
 delete mode 100644 changelog/10743.bugfix.rst
 delete mode 100644 changelog/10755.feature.rst
 delete mode 100644 changelog/10765.bugfix.rst
 delete mode 100644 changelog/10782.doc.rst
 delete mode 100644 changelog/10840.improvement.rst
 delete mode 100644 changelog/1904.bugfix.rst
 delete mode 100644 changelog/6267.improvement.rst
 delete mode 100644 changelog/7431.feature.rst
 delete mode 100644 changelog/8141.feature.rst
 create mode 100644 doc/en/announce/release-7.3.0.rst

diff --git a/changelog/10226.improvement.rst b/changelog/10226.improvement.rst
deleted file mode 100644
index f1506eaf7..000000000
--- a/changelog/10226.improvement.rst
+++ /dev/null
@@ -1 +0,0 @@
-If multiple errors are raised in teardown, we now re-raise an ``ExceptionGroup`` of them instead of discarding all but the last.
diff --git a/changelog/10525.feature.rst b/changelog/10525.feature.rst
deleted file mode 100644
index 15652b024..000000000
--- a/changelog/10525.feature.rst
+++ /dev/null
@@ -1 +0,0 @@
-Test methods decorated with ``@classmethod`` can now be discovered as tests, following the same rules as normal methods. This fills the gap that static methods were discoverable as tests but not class methods.
diff --git a/changelog/10658.improvement.rst b/changelog/10658.improvement.rst
deleted file mode 100644
index 54e5ae84f..000000000
--- a/changelog/10658.improvement.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Allow ``-p`` arguments to include spaces (eg: ``-p no:logging`` instead of
-``-pno:logging``). Mostly useful in the ``addopts`` section of the configuration
-file.
diff --git a/changelog/10669.trivial.rst b/changelog/10669.trivial.rst
deleted file mode 100644
index 6cebe12ec..000000000
--- a/changelog/10669.trivial.rst
+++ /dev/null
@@ -1 +0,0 @@
-pytest no longer depends on the `attrs` package (don't worry, nice diffs for attrs classes are still supported).
diff --git a/changelog/10710.improvement.rst b/changelog/10710.improvement.rst
deleted file mode 100644
index a893eec02..000000000
--- a/changelog/10710.improvement.rst
+++ /dev/null
@@ -1 +0,0 @@
-Added ``start`` and ``stop`` timestamps to ``TestReport`` objects.
diff --git a/changelog/10727.improvement.rst b/changelog/10727.improvement.rst
deleted file mode 100644
index 92cb8cc33..000000000
--- a/changelog/10727.improvement.rst
+++ /dev/null
@@ -1 +0,0 @@
-Split the report header for ``rootdir``, ``config file`` and ``testpaths`` so each has its own line.
diff --git a/changelog/10743.bugfix.rst b/changelog/10743.bugfix.rst
deleted file mode 100644
index ad5c63e80..000000000
--- a/changelog/10743.bugfix.rst
+++ /dev/null
@@ -1 +0,0 @@
-The assertion rewriting mechanism now works correctly when assertion expressions contain the walrus operator.
diff --git a/changelog/10755.feature.rst b/changelog/10755.feature.rst
deleted file mode 100644
index 5fb5a97d4..000000000
--- a/changelog/10755.feature.rst
+++ /dev/null
@@ -1 +0,0 @@
-:confval:`console_output_style` now supports ``progress-even-when-capture-no`` to force the use of the progress output even when capture is disabled. This is useful in large test suites where capture may have significant performance impact.
diff --git a/changelog/10765.bugfix.rst b/changelog/10765.bugfix.rst
deleted file mode 100644
index 89391f1f0..000000000
--- a/changelog/10765.bugfix.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fixed :fixture:`tmp_path` fixture always raising :class:`OSError` on ``emscripten`` platform due to missing :func:`os.getuid`.
diff --git a/changelog/10782.doc.rst b/changelog/10782.doc.rst
deleted file mode 100644
index c2bd4af8c..000000000
--- a/changelog/10782.doc.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fixed the minimal example in :ref:`goodpractices`: ``pip install -e .`` requires a ``version`` entry in ``pyproject.toml`` to run successfully.
diff --git a/changelog/10840.improvement.rst b/changelog/10840.improvement.rst
deleted file mode 100644
index 17be0d07b..000000000
--- a/changelog/10840.improvement.rst
+++ /dev/null
@@ -1 +0,0 @@
-pytest should no longer crash on AST with pathological position attributes, for example testing AST produced by `Hylang <https://github.com/hylang/hy>__`.
diff --git a/changelog/1904.bugfix.rst b/changelog/1904.bugfix.rst
deleted file mode 100644
index dc8e0f342..000000000
--- a/changelog/1904.bugfix.rst
+++ /dev/null
@@ -1 +0,0 @@
-Correctly handle ``__tracebackhide__`` for chained exceptions.
diff --git a/changelog/6267.improvement.rst b/changelog/6267.improvement.rst
deleted file mode 100644
index ed551cecc..000000000
--- a/changelog/6267.improvement.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-The full output of a test is no longer truncated if the truncation message would be longer than
-the hidden text. The line number shown has also been fixed.
diff --git a/changelog/7431.feature.rst b/changelog/7431.feature.rst
deleted file mode 100644
index 24a64a2ae..000000000
--- a/changelog/7431.feature.rst
+++ /dev/null
@@ -1 +0,0 @@
-``--log-disable`` CLI option added to disable individual loggers.
diff --git a/changelog/8141.feature.rst b/changelog/8141.feature.rst
deleted file mode 100644
index b589ed2e9..000000000
--- a/changelog/8141.feature.rst
+++ /dev/null
@@ -1 +0,0 @@
-Added :confval:`tmp_path_retention_count` and :confval:`tmp_path_retention_policy` configuration options to control how directories created by the :fixture:`tmp_path` fixture are kept.
diff --git a/doc/en/announce/index.rst b/doc/en/announce/index.rst
index fa57ca5c8..96db2e248 100644
--- a/doc/en/announce/index.rst
+++ b/doc/en/announce/index.rst
@@ -6,6 +6,7 @@ Release announcements
    :maxdepth: 2
 
 
+   release-7.3.0
    release-7.2.2
    release-7.2.1
    release-7.2.0
diff --git a/doc/en/announce/release-7.3.0.rst b/doc/en/announce/release-7.3.0.rst
new file mode 100644
index 000000000..33258daba
--- /dev/null
+++ b/doc/en/announce/release-7.3.0.rst
@@ -0,0 +1,130 @@
+pytest-7.3.0
+=======================================
+
+The pytest team is proud to announce the 7.3.0 release!
+
+This release contains new features, improvements, and bug fixes,
+the full list of changes is available in the changelog:
+
+    https://docs.pytest.org/en/stable/changelog.html
+
+For complete documentation, please visit:
+
+    https://docs.pytest.org/en/stable/
+
+As usual, you can upgrade from PyPI via:
+
+    pip install -U pytest
+
+Thanks to all of the contributors to this release:
+
+* Aaron Berdy
+* Adam Turner
+* Albert Villanova del Moral
+* Alessio Izzo
+* Alex Hadley
+* Alice Purcell
+* Anthony Sottile
+* Anton Yakutovich
+* Ashish Kurmi
+* Babak Keyvani
+* Billy
+* Brandon Chinn
+* Bruno Oliveira
+* Cal Jacobson
+* Chanvin Xiao
+* Cheuk Ting Ho
+* Chris Wheeler
+* Daniel Garcia Moreno
+* Daniel Scheffler
+* Daniel Valenzuela
+* EmptyRabbit
+* Ezio Melotti
+* Felix Hofstätter
+* Florian Best
+* Florian Bruhin
+* Fredrik Berndtsson
+* Gabriel Landau
+* Garvit Shubham
+* Gergely Kalmár
+* HTRafal
+* Hugo van Kemenade
+* Ilya Konstantinov
+* Itxaso Aizpurua
+* James Gerity
+* Jay
+* John Litborn
+* Jon Parise
+* Jouke Witteveen
+* Kadino
+* Kevin C
+* Kian Eliasi
+* Klaus Rettinghaus
+* Kodi Arfer
+* Mahesh Vashishtha
+* Manuel Jacob
+* Marko Pacak
+* MatthewFlamm
+* Miro Hrončok
+* Nate Meyvis
+* Neil Girdhar
+* Nhieuvu1802
+* Nipunn Koorapati
+* Ofek Lev
+* Paul Kehrer
+* Paul Müller
+* Paul Reece
+* Pax
+* Pete Baughman
+* Peyman Salehi
+* Philipp A
+* Pierre Sassoulas
+* Prerak Patel
+* Ramsey
+* Ran Benita
+* Robert O'Shea
+* Ronny Pfannschmidt
+* Rowin
+* Ruth Comer
+* Samuel Colvin
+* Samuel Gaist
+* Sandro Tosi
+* Santiago Castro
+* Shantanu
+* Simon K
+* Stefanie Molin
+* Stephen Rosen
+* Sviatoslav Sydorenko
+* Tatiana Ovary
+* Teejay
+* Thierry Moisan
+* Thomas Grainger
+* Tim Hoffmann
+* Tobias Diez
+* Tony Narlock
+* Vivaan Verma
+* Wolfremium
+* Yannick PÉROUX
+* Yusuke Kadowaki
+* Zac Hatfield-Dodds
+* Zach OBrien
+* aizpurua23a
+* bitzge
+* bluthej
+* gresm
+* holesch
+* itxasos23
+* johnkangw
+* q0w
+* rdb
+* s-padmanaban
+* skhomuti
+* sommersoft
+* vin01
+* wim glenn
+* wodny
+* zx.qiu
+
+
+Happy testing,
+The pytest Development Team
diff --git a/doc/en/changelog.rst b/doc/en/changelog.rst
index 020e6289e..4fc959c6b 100644
--- a/doc/en/changelog.rst
+++ b/doc/en/changelog.rst
@@ -28,6 +28,76 @@ with advance notice in the **Deprecations** section of releases.
 
 .. towncrier release notes start
 
+pytest 7.3.0 (2023-04-08)
+=========================
+
+Features
+--------
+
+- `#10525 <https://github.com/pytest-dev/pytest/issues/10525>`_: Test methods decorated with ``@classmethod`` can now be discovered as tests, following the same rules as normal methods. This fills the gap that static methods were discoverable as tests but not class methods.
+
+
+- `#10755 <https://github.com/pytest-dev/pytest/issues/10755>`_: :confval:`console_output_style` now supports ``progress-even-when-capture-no`` to force the use of the progress output even when capture is disabled. This is useful in large test suites where capture may have significant performance impact.
+
+
+- `#7431 <https://github.com/pytest-dev/pytest/issues/7431>`_: ``--log-disable`` CLI option added to disable individual loggers.
+
+
+- `#8141 <https://github.com/pytest-dev/pytest/issues/8141>`_: Added :confval:`tmp_path_retention_count` and :confval:`tmp_path_retention_policy` configuration options to control how directories created by the :fixture:`tmp_path` fixture are kept.
+
+
+
+Improvements
+------------
+
+- `#10226 <https://github.com/pytest-dev/pytest/issues/10226>`_: If multiple errors are raised in teardown, we now re-raise an ``ExceptionGroup`` of them instead of discarding all but the last.
+
+
+- `#10658 <https://github.com/pytest-dev/pytest/issues/10658>`_: Allow ``-p`` arguments to include spaces (eg: ``-p no:logging`` instead of
+  ``-pno:logging``). Mostly useful in the ``addopts`` section of the configuration
+  file.
+
+
+- `#10710 <https://github.com/pytest-dev/pytest/issues/10710>`_: Added ``start`` and ``stop`` timestamps to ``TestReport`` objects.
+
+
+- `#10727 <https://github.com/pytest-dev/pytest/issues/10727>`_: Split the report header for ``rootdir``, ``config file`` and ``testpaths`` so each has its own line.
+
+
+- `#10840 <https://github.com/pytest-dev/pytest/issues/10840>`_: pytest should no longer crash on AST with pathological position attributes, for example testing AST produced by `Hylang <https://github.com/hylang/hy>__`.
+
+
+- `#6267 <https://github.com/pytest-dev/pytest/issues/6267>`_: The full output of a test is no longer truncated if the truncation message would be longer than
+  the hidden text. The line number shown has also been fixed.
+
+
+
+Bug Fixes
+---------
+
+- `#10743 <https://github.com/pytest-dev/pytest/issues/10743>`_: The assertion rewriting mechanism now works correctly when assertion expressions contain the walrus operator.
+
+
+- `#10765 <https://github.com/pytest-dev/pytest/issues/10765>`_: Fixed :fixture:`tmp_path` fixture always raising :class:`OSError` on ``emscripten`` platform due to missing :func:`os.getuid`.
+
+
+- `#1904 <https://github.com/pytest-dev/pytest/issues/1904>`_: Correctly handle ``__tracebackhide__`` for chained exceptions.
+
+
+
+Improved Documentation
+----------------------
+
+- `#10782 <https://github.com/pytest-dev/pytest/issues/10782>`_: Fixed the minimal example in :ref:`goodpractices`: ``pip install -e .`` requires a ``version`` entry in ``pyproject.toml`` to run successfully.
+
+
+
+Trivial/Internal Changes
+------------------------
+
+- `#10669 <https://github.com/pytest-dev/pytest/issues/10669>`_: pytest no longer depends on the `attrs` package (don't worry, nice diffs for attrs classes are still supported).
+
+
 pytest 7.2.2 (2023-03-03)
 =========================
 
diff --git a/doc/en/example/parametrize.rst b/doc/en/example/parametrize.rst
index 1b25dfaf7..df2859b14 100644
--- a/doc/en/example/parametrize.rst
+++ b/doc/en/example/parametrize.rst
@@ -502,8 +502,12 @@ Running it results in some skips if we don't have all the python interpreters in
 .. code-block:: pytest
 
    . $ pytest -rs -q multipython.py
-   ...........................                                          [100%]
-   27 passed in 0.12s
+   sssssssssssssssssssssssssss                                          [100%]
+   ========================= short test summary info ==========================
+   SKIPPED [9] multipython.py:69: 'python3.5' not found
+   SKIPPED [9] multipython.py:69: 'python3.6' not found
+   SKIPPED [9] multipython.py:69: 'python3.7' not found
+   27 skipped in 0.12s
 
 Indirect parametrization of optional implementations/imports
 --------------------------------------------------------------------
diff --git a/doc/en/example/reportingdemo.rst b/doc/en/example/reportingdemo.rst
index 20dc0a019..cb59c4b42 100644
--- a/doc/en/example/reportingdemo.rst
+++ b/doc/en/example/reportingdemo.rst
@@ -70,12 +70,12 @@ Here is a nice run of several failures and how ``pytest`` presents things:
 
     >       assert not f()
     E       assert not 42
-    E        +  where 42 = <function TestFailing.test_not.<locals>.f at 0xdeadbeef0002>()
+    E        +  where 42 = <function TestFailing.test_not.<locals>.f at 0xdeadbeef0006>()
 
     failure_demo.py:39: AssertionError
     _________________ TestSpecialisedExplanations.test_eq_text _________________
 
-    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0006>
+    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0007>
 
         def test_eq_text(self):
     >       assert "spam" == "eggs"
@@ -86,7 +86,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:44: AssertionError
     _____________ TestSpecialisedExplanations.test_eq_similar_text _____________
 
-    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0007>
+    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0008>
 
         def test_eq_similar_text(self):
     >       assert "foo 1 bar" == "foo 2 bar"
@@ -99,7 +99,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:47: AssertionError
     ____________ TestSpecialisedExplanations.test_eq_multiline_text ____________
 
-    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0008>
+    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0009>
 
         def test_eq_multiline_text(self):
     >       assert "foo\nspam\nbar" == "foo\neggs\nbar"
@@ -112,7 +112,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:50: AssertionError
     ______________ TestSpecialisedExplanations.test_eq_long_text _______________
 
-    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0009>
+    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef000a>
 
         def test_eq_long_text(self):
             a = "1" * 100 + "a" + "2" * 100
@@ -129,7 +129,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:55: AssertionError
     _________ TestSpecialisedExplanations.test_eq_long_text_multiline __________
 
-    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef000a>
+    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef000b>
 
         def test_eq_long_text_multiline(self):
             a = "1\n" * 100 + "a" + "2\n" * 100
@@ -149,7 +149,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:60: AssertionError
     _________________ TestSpecialisedExplanations.test_eq_list _________________
 
-    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef000b>
+    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef000c>
 
         def test_eq_list(self):
     >       assert [0, 1, 2] == [0, 1, 3]
@@ -160,7 +160,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:63: AssertionError
     ______________ TestSpecialisedExplanations.test_eq_list_long _______________
 
-    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef000c>
+    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef000d>
 
         def test_eq_list_long(self):
             a = [0] * 100 + [1] + [3] * 100
@@ -173,7 +173,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:68: AssertionError
     _________________ TestSpecialisedExplanations.test_eq_dict _________________
 
-    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef000d>
+    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef000e>
 
         def test_eq_dict(self):
     >       assert {"a": 0, "b": 1, "c": 0} == {"a": 0, "b": 2, "d": 0}
@@ -190,7 +190,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:71: AssertionError
     _________________ TestSpecialisedExplanations.test_eq_set __________________
 
-    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef000e>
+    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef000f>
 
         def test_eq_set(self):
     >       assert {0, 10, 11, 12} == {0, 20, 21}
@@ -207,7 +207,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:74: AssertionError
     _____________ TestSpecialisedExplanations.test_eq_longer_list ______________
 
-    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef000f>
+    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0010>
 
         def test_eq_longer_list(self):
     >       assert [1, 2] == [1, 2, 3]
@@ -218,7 +218,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:77: AssertionError
     _________________ TestSpecialisedExplanations.test_in_list _________________
 
-    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0010>
+    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0011>
 
         def test_in_list(self):
     >       assert 1 in [0, 2, 3, 4, 5]
@@ -227,7 +227,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:80: AssertionError
     __________ TestSpecialisedExplanations.test_not_in_text_multiline __________
 
-    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0011>
+    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0012>
 
         def test_not_in_text_multiline(self):
             text = "some multiline\ntext\nwhich\nincludes foo\nand a\ntail"
@@ -245,7 +245,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:84: AssertionError
     ___________ TestSpecialisedExplanations.test_not_in_text_single ____________
 
-    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0012>
+    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0013>
 
         def test_not_in_text_single(self):
             text = "single foo line"
@@ -258,7 +258,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:88: AssertionError
     _________ TestSpecialisedExplanations.test_not_in_text_single_long _________
 
-    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0013>
+    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0014>
 
         def test_not_in_text_single_long(self):
             text = "head " * 50 + "foo " + "tail " * 20
@@ -271,7 +271,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:92: AssertionError
     ______ TestSpecialisedExplanations.test_not_in_text_single_long_term _______
 
-    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0014>
+    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0015>
 
         def test_not_in_text_single_long_term(self):
             text = "head " * 50 + "f" * 70 + "tail " * 20
@@ -284,7 +284,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:96: AssertionError
     ______________ TestSpecialisedExplanations.test_eq_dataclass _______________
 
-    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0015>
+    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0016>
 
         def test_eq_dataclass(self):
             from dataclasses import dataclass
@@ -311,7 +311,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:108: AssertionError
     ________________ TestSpecialisedExplanations.test_eq_attrs _________________
 
-    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0016>
+    self = <failure_demo.TestSpecialisedExplanations object at 0xdeadbeef0017>
 
         def test_eq_attrs(self):
             import attr
@@ -345,7 +345,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
             i = Foo()
     >       assert i.b == 2
     E       assert 1 == 2
-    E        +  where 1 = <failure_demo.test_attribute.<locals>.Foo object at 0xdeadbeef0017>.b
+    E        +  where 1 = <failure_demo.test_attribute.<locals>.Foo object at 0xdeadbeef0018>.b
 
     failure_demo.py:128: AssertionError
     _________________________ test_attribute_instance __________________________
@@ -356,8 +356,8 @@ Here is a nice run of several failures and how ``pytest`` presents things:
 
     >       assert Foo().b == 2
     E       AssertionError: assert 1 == 2
-    E        +  where 1 = <failure_demo.test_attribute_instance.<locals>.Foo object at 0xdeadbeef0018>.b
-    E        +    where <failure_demo.test_attribute_instance.<locals>.Foo object at 0xdeadbeef0018> = <class 'failure_demo.test_attribute_instance.<locals>.Foo'>()
+    E        +  where 1 = <failure_demo.test_attribute_instance.<locals>.Foo object at 0xdeadbeef0019>.b
+    E        +    where <failure_demo.test_attribute_instance.<locals>.Foo object at 0xdeadbeef0019> = <class 'failure_demo.test_attribute_instance.<locals>.Foo'>()
 
     failure_demo.py:135: AssertionError
     __________________________ test_attribute_failure __________________________
@@ -375,7 +375,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:146:
     _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 
-    self = <failure_demo.test_attribute_failure.<locals>.Foo object at 0xdeadbeef0019>
+    self = <failure_demo.test_attribute_failure.<locals>.Foo object at 0xdeadbeef001a>
 
         def _get_b(self):
     >       raise Exception("Failed to get attrib")
@@ -393,15 +393,15 @@ Here is a nice run of several failures and how ``pytest`` presents things:
 
     >       assert Foo().b == Bar().b
     E       AssertionError: assert 1 == 2
-    E        +  where 1 = <failure_demo.test_attribute_multiple.<locals>.Foo object at 0xdeadbeef001a>.b
-    E        +    where <failure_demo.test_attribute_multiple.<locals>.Foo object at 0xdeadbeef001a> = <class 'failure_demo.test_attribute_multiple.<locals>.Foo'>()
-    E        +  and   2 = <failure_demo.test_attribute_multiple.<locals>.Bar object at 0xdeadbeef001b>.b
-    E        +    where <failure_demo.test_attribute_multiple.<locals>.Bar object at 0xdeadbeef001b> = <class 'failure_demo.test_attribute_multiple.<locals>.Bar'>()
+    E        +  where 1 = <failure_demo.test_attribute_multiple.<locals>.Foo object at 0xdeadbeef001b>.b
+    E        +    where <failure_demo.test_attribute_multiple.<locals>.Foo object at 0xdeadbeef001b> = <class 'failure_demo.test_attribute_multiple.<locals>.Foo'>()
+    E        +  and   2 = <failure_demo.test_attribute_multiple.<locals>.Bar object at 0xdeadbeef001c>.b
+    E        +    where <failure_demo.test_attribute_multiple.<locals>.Bar object at 0xdeadbeef001c> = <class 'failure_demo.test_attribute_multiple.<locals>.Bar'>()
 
     failure_demo.py:156: AssertionError
     __________________________ TestRaises.test_raises __________________________
 
-    self = <failure_demo.TestRaises object at 0xdeadbeef001c>
+    self = <failure_demo.TestRaises object at 0xdeadbeef001d>
 
         def test_raises(self):
             s = "qwe"
@@ -411,7 +411,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:166: ValueError
     ______________________ TestRaises.test_raises_doesnt _______________________
 
-    self = <failure_demo.TestRaises object at 0xdeadbeef001d>
+    self = <failure_demo.TestRaises object at 0xdeadbeef001e>
 
         def test_raises_doesnt(self):
     >       raises(OSError, int, "3")
@@ -420,7 +420,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:169: Failed
     __________________________ TestRaises.test_raise ___________________________
 
-    self = <failure_demo.TestRaises object at 0xdeadbeef001e>
+    self = <failure_demo.TestRaises object at 0xdeadbeef001f>
 
         def test_raise(self):
     >       raise ValueError("demo error")
@@ -429,7 +429,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:172: ValueError
     ________________________ TestRaises.test_tupleerror ________________________
 
-    self = <failure_demo.TestRaises object at 0xdeadbeef001f>
+    self = <failure_demo.TestRaises object at 0xdeadbeef0020>
 
         def test_tupleerror(self):
     >       a, b = [1]  # NOQA
@@ -438,7 +438,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:175: ValueError
     ______ TestRaises.test_reinterpret_fails_with_print_for_the_fun_of_it ______
 
-    self = <failure_demo.TestRaises object at 0xdeadbeef0020>
+    self = <failure_demo.TestRaises object at 0xdeadbeef0021>
 
         def test_reinterpret_fails_with_print_for_the_fun_of_it(self):
             items = [1, 2, 3]
@@ -451,7 +451,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     items is [1, 2, 3]
     ________________________ TestRaises.test_some_error ________________________
 
-    self = <failure_demo.TestRaises object at 0xdeadbeef0021>
+    self = <failure_demo.TestRaises object at 0xdeadbeef0022>
 
         def test_some_error(self):
     >       if namenotexi:  # NOQA
@@ -482,7 +482,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     abc-123:2: AssertionError
     ____________________ TestMoreErrors.test_complex_error _____________________
 
-    self = <failure_demo.TestMoreErrors object at 0xdeadbeef0022>
+    self = <failure_demo.TestMoreErrors object at 0xdeadbeef0023>
 
         def test_complex_error(self):
             def f():
@@ -508,7 +508,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:6: AssertionError
     ___________________ TestMoreErrors.test_z1_unpack_error ____________________
 
-    self = <failure_demo.TestMoreErrors object at 0xdeadbeef0023>
+    self = <failure_demo.TestMoreErrors object at 0xdeadbeef0024>
 
         def test_z1_unpack_error(self):
             items = []
@@ -518,7 +518,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:217: ValueError
     ____________________ TestMoreErrors.test_z2_type_error _____________________
 
-    self = <failure_demo.TestMoreErrors object at 0xdeadbeef0024>
+    self = <failure_demo.TestMoreErrors object at 0xdeadbeef0025>
 
         def test_z2_type_error(self):
             items = 3
@@ -528,20 +528,20 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:221: TypeError
     ______________________ TestMoreErrors.test_startswith ______________________
 
-    self = <failure_demo.TestMoreErrors object at 0xdeadbeef0025>
+    self = <failure_demo.TestMoreErrors object at 0xdeadbeef0026>
 
         def test_startswith(self):
             s = "123"
             g = "456"
     >       assert s.startswith(g)
     E       AssertionError: assert False
-    E        +  where False = <built-in method startswith of str object at 0xdeadbeef0026>('456')
-    E        +    where <built-in method startswith of str object at 0xdeadbeef0026> = '123'.startswith
+    E        +  where False = <built-in method startswith of str object at 0xdeadbeef0027>('456')
+    E        +    where <built-in method startswith of str object at 0xdeadbeef0027> = '123'.startswith
 
     failure_demo.py:226: AssertionError
     __________________ TestMoreErrors.test_startswith_nested ___________________
 
-    self = <failure_demo.TestMoreErrors object at 0xdeadbeef0027>
+    self = <failure_demo.TestMoreErrors object at 0xdeadbeef0028>
 
         def test_startswith_nested(self):
             def f():
@@ -552,15 +552,15 @@ Here is a nice run of several failures and how ``pytest`` presents things:
 
     >       assert f().startswith(g())
     E       AssertionError: assert False
-    E        +  where False = <built-in method startswith of str object at 0xdeadbeef0026>('456')
-    E        +    where <built-in method startswith of str object at 0xdeadbeef0026> = '123'.startswith
-    E        +      where '123' = <function TestMoreErrors.test_startswith_nested.<locals>.f at 0xdeadbeef0028>()
-    E        +    and   '456' = <function TestMoreErrors.test_startswith_nested.<locals>.g at 0xdeadbeef0029>()
+    E        +  where False = <built-in method startswith of str object at 0xdeadbeef0027>('456')
+    E        +    where <built-in method startswith of str object at 0xdeadbeef0027> = '123'.startswith
+    E        +      where '123' = <function TestMoreErrors.test_startswith_nested.<locals>.f at 0xdeadbeef0029>()
+    E        +    and   '456' = <function TestMoreErrors.test_startswith_nested.<locals>.g at 0xdeadbeef002a>()
 
     failure_demo.py:235: AssertionError
     _____________________ TestMoreErrors.test_global_func ______________________
 
-    self = <failure_demo.TestMoreErrors object at 0xdeadbeef002a>
+    self = <failure_demo.TestMoreErrors object at 0xdeadbeef002b>
 
         def test_global_func(self):
     >       assert isinstance(globf(42), float)
@@ -571,18 +571,18 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:238: AssertionError
     _______________________ TestMoreErrors.test_instance _______________________
 
-    self = <failure_demo.TestMoreErrors object at 0xdeadbeef002b>
+    self = <failure_demo.TestMoreErrors object at 0xdeadbeef002c>
 
         def test_instance(self):
             self.x = 6 * 7
     >       assert self.x != 42
     E       assert 42 != 42
-    E        +  where 42 = <failure_demo.TestMoreErrors object at 0xdeadbeef002b>.x
+    E        +  where 42 = <failure_demo.TestMoreErrors object at 0xdeadbeef002c>.x
 
     failure_demo.py:242: AssertionError
     _______________________ TestMoreErrors.test_compare ________________________
 
-    self = <failure_demo.TestMoreErrors object at 0xdeadbeef002c>
+    self = <failure_demo.TestMoreErrors object at 0xdeadbeef002d>
 
         def test_compare(self):
     >       assert globf(10) < 5
@@ -592,7 +592,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:245: AssertionError
     _____________________ TestMoreErrors.test_try_finally ______________________
 
-    self = <failure_demo.TestMoreErrors object at 0xdeadbeef002d>
+    self = <failure_demo.TestMoreErrors object at 0xdeadbeef002e>
 
         def test_try_finally(self):
             x = 1
@@ -603,7 +603,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:250: AssertionError
     ___________________ TestCustomAssertMsg.test_single_line ___________________
 
-    self = <failure_demo.TestCustomAssertMsg object at 0xdeadbeef002e>
+    self = <failure_demo.TestCustomAssertMsg object at 0xdeadbeef002f>
 
         def test_single_line(self):
             class A:
@@ -618,7 +618,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:261: AssertionError
     ____________________ TestCustomAssertMsg.test_multiline ____________________
 
-    self = <failure_demo.TestCustomAssertMsg object at 0xdeadbeef002f>
+    self = <failure_demo.TestCustomAssertMsg object at 0xdeadbeef0030>
 
         def test_multiline(self):
             class A:
@@ -637,7 +637,7 @@ Here is a nice run of several failures and how ``pytest`` presents things:
     failure_demo.py:268: AssertionError
     ___________________ TestCustomAssertMsg.test_custom_repr ___________________
 
-    self = <failure_demo.TestCustomAssertMsg object at 0xdeadbeef0030>
+    self = <failure_demo.TestCustomAssertMsg object at 0xdeadbeef0031>
 
         def test_custom_repr(self):
             class JSON:
diff --git a/doc/en/getting-started.rst b/doc/en/getting-started.rst
index 89bc1aa02..8c9c4e75a 100644
--- a/doc/en/getting-started.rst
+++ b/doc/en/getting-started.rst
@@ -22,7 +22,7 @@ Install ``pytest``
 .. code-block:: bash
 
     $ pytest --version
-    pytest 7.2.0.dev534+ga2c84caaa.d20230317
+    pytest 7.3.0
 
 .. _`simpletest`: