From 15ddccf700ad1318c083eeb543f1c1a419dd1e96 Mon Sep 17 00:00:00 2001 From: Elijah DeLee Date: Fri, 4 Feb 2022 16:06:32 -0500 Subject: [PATCH 1/6] importlib.readers not valid until python 3.10 This exists https://github.com/python/cpython/blob/3.10/Lib/importlib/readers.py and FileReader is in there This is a 404 https://github.com/python/cpython/blob/3.9/Lib/importlib/readers.py This change needs to get backported to the 7.0.z branch(s) too Fixes https://github.com/pytest-dev/pytest/issues/9608 --- src/_pytest/assertion/rewrite.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_pytest/assertion/rewrite.py b/src/_pytest/assertion/rewrite.py index f0922870a..cc11e1d16 100644 --- a/src/_pytest/assertion/rewrite.py +++ b/src/_pytest/assertion/rewrite.py @@ -273,7 +273,7 @@ class AssertionRewritingHook(importlib.abc.MetaPathFinder, importlib.abc.Loader) with open(pathname, "rb") as f: return f.read() - if sys.version_info >= (3, 9): + if sys.version_info >= (3, 10): def get_resource_reader(self, name: str) -> importlib.abc.TraversableResources: # type: ignore from types import SimpleNamespace From 5f1a2f33daeab6a8efdc43bda8e5053a87aa47a8 Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Fri, 4 Feb 2022 18:50:48 -0300 Subject: [PATCH 2/6] Fix invalid importing of `importlib.reader` in Python 3.9 Fix #9608 --- changelog/9608.bugfix.rst | 1 + src/_pytest/assertion/rewrite.py | 7 +++---- 2 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 changelog/9608.bugfix.rst diff --git a/changelog/9608.bugfix.rst b/changelog/9608.bugfix.rst new file mode 100644 index 000000000..f6b02ef53 --- /dev/null +++ b/changelog/9608.bugfix.rst @@ -0,0 +1 @@ +Fix invalid importing of ``importlib.reader`` in Python 3.9. diff --git a/src/_pytest/assertion/rewrite.py b/src/_pytest/assertion/rewrite.py index cc11e1d16..ac461ba39 100644 --- a/src/_pytest/assertion/rewrite.py +++ b/src/_pytest/assertion/rewrite.py @@ -44,6 +44,8 @@ from _pytest.stash import StashKey if TYPE_CHECKING: from _pytest.assertion import AssertionState +if sys.version_info >= (3, 10): + from importlib.readers import FileReader assertstate_key = StashKey["AssertionState"]() @@ -276,10 +278,7 @@ class AssertionRewritingHook(importlib.abc.MetaPathFinder, importlib.abc.Loader) if sys.version_info >= (3, 10): def get_resource_reader(self, name: str) -> importlib.abc.TraversableResources: # type: ignore - from types import SimpleNamespace - from importlib.readers import FileReader - - return FileReader(SimpleNamespace(path=self._rewritten_names[name])) + return FileReader(types.SimpleNamespace(path=self._rewritten_names[name])) def _write_pyc_fp( From 66dc79efd48e87a420072df44ecb087ff7797358 Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Fri, 4 Feb 2022 18:56:44 -0300 Subject: [PATCH 3/6] Update changelog/9608.bugfix.rst Co-authored-by: Elijah DeLee --- changelog/9608.bugfix.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog/9608.bugfix.rst b/changelog/9608.bugfix.rst index f6b02ef53..4dda46bec 100644 --- a/changelog/9608.bugfix.rst +++ b/changelog/9608.bugfix.rst @@ -1 +1 @@ -Fix invalid importing of ``importlib.reader`` in Python 3.9. +Fix invalid importing of ``importlib.readers`` in Python 3.9. From f86a87a315d6130bdc9cbc19e4fefcf69836d813 Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Fri, 4 Feb 2022 19:07:52 -0300 Subject: [PATCH 4/6] Update src/_pytest/assertion/rewrite.py Co-authored-by: Ran Benita --- src/_pytest/assertion/rewrite.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/_pytest/assertion/rewrite.py b/src/_pytest/assertion/rewrite.py index ac461ba39..f4a08a065 100644 --- a/src/_pytest/assertion/rewrite.py +++ b/src/_pytest/assertion/rewrite.py @@ -44,7 +44,9 @@ from _pytest.stash import StashKey if TYPE_CHECKING: from _pytest.assertion import AssertionState -if sys.version_info >= (3, 10): +if sys.version_info >= (3, 11): + from importlib.resources.readers import FileReader +elif sys.version_info >= (3, 10): from importlib.readers import FileReader assertstate_key = StashKey["AssertionState"]() From d45a19cfdeb0afc767bb641522a436a00903e1ca Mon Sep 17 00:00:00 2001 From: Elijah DeLee Date: Mon, 7 Feb 2022 11:39:19 -0500 Subject: [PATCH 5/6] move function specific imports to function re: review from @asottile that this should only get imported in the function modify the else/if logic since inside the function we already know the python version is >= 3.10, and just have to know if it is 3.11 or greater --- src/_pytest/assertion/rewrite.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/_pytest/assertion/rewrite.py b/src/_pytest/assertion/rewrite.py index f4a08a065..eac7bb79e 100644 --- a/src/_pytest/assertion/rewrite.py +++ b/src/_pytest/assertion/rewrite.py @@ -43,11 +43,7 @@ from _pytest.stash import StashKey if TYPE_CHECKING: from _pytest.assertion import AssertionState - -if sys.version_info >= (3, 11): - from importlib.resources.readers import FileReader -elif sys.version_info >= (3, 10): - from importlib.readers import FileReader + assertstate_key = StashKey["AssertionState"]() @@ -280,6 +276,11 @@ class AssertionRewritingHook(importlib.abc.MetaPathFinder, importlib.abc.Loader) if sys.version_info >= (3, 10): def get_resource_reader(self, name: str) -> importlib.abc.TraversableResources: # type: ignore + if sys.version_info < (3, 11): + from importlib.readers import FileReader + else: + from importlib.resources.readers import FileReader + return FileReader(types.SimpleNamespace(path=self._rewritten_names[name])) From 2073cce10518c4f04ee5c5d8a7b6697cbbb3688e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 7 Feb 2022 16:40:52 +0000 Subject: [PATCH 6/6] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/_pytest/assertion/rewrite.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/_pytest/assertion/rewrite.py b/src/_pytest/assertion/rewrite.py index eac7bb79e..81096764e 100644 --- a/src/_pytest/assertion/rewrite.py +++ b/src/_pytest/assertion/rewrite.py @@ -43,7 +43,7 @@ from _pytest.stash import StashKey if TYPE_CHECKING: from _pytest.assertion import AssertionState - + assertstate_key = StashKey["AssertionState"]() @@ -280,7 +280,7 @@ class AssertionRewritingHook(importlib.abc.MetaPathFinder, importlib.abc.Loader) from importlib.readers import FileReader else: from importlib.resources.readers import FileReader - + return FileReader(types.SimpleNamespace(path=self._rewritten_names[name]))