Skip to content

Commit 2a32e25

Browse files
committed
Fix test bug that assumed staticmethod callability
staticmethod objects are descriptors that cause the same-named attribute on a class or its instances to be callable (and the first argument, representing a class or instance, not to be passed). But the actual staticmethod objects themselves are only callable starting in Python 3.10. This reorgnizes the just-added test code so it no longer wrongly relies on being able to call such objects.
1 parent d42cd72 commit 2a32e25

File tree

1 file changed

+26
-23
lines changed

1 file changed

+26
-23
lines changed

‎test/test_util.py

+26-23
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,30 @@ def __repr__(self):
8080
return "TestIterableMember(%r)" % self.name
8181

8282

83+
@contextlib.contextmanager
84+
def _tmpdir_to_force_permission_error():
85+
"""Context manager to test permission errors in situations where we do not fix them."""
86+
if sys.platform == "cygwin":
87+
raise SkipTest("Cygwin can't set the permissions that make the test meaningful.")
88+
if sys.version_info < (3, 8):
89+
raise SkipTest("In 3.7, TemporaryDirectory doesn't clean up after weird permissions.")
90+
91+
with tempfile.TemporaryDirectory() as parent:
92+
td = pathlib.Path(parent, "testdir")
93+
td.mkdir()
94+
(td / "x").write_bytes(b"")
95+
(td / "x").chmod(stat.S_IRUSR) # Set up PermissionError on Windows.
96+
td.chmod(stat.S_IRUSR | stat.S_IXUSR) # Set up PermissionError on Unix.
97+
yield td
98+
99+
100+
@contextlib.contextmanager
101+
def _tmpdir_for_file_not_found():
102+
"""Context manager to test errors deleting a directory that are not due to permissions."""
103+
with tempfile.TemporaryDirectory() as parent:
104+
yield pathlib.Path(parent, "testdir") # It is deliberately never created.
105+
106+
83107
@ddt.ddt
84108
class TestUtils(TestBase):
85109
def setup(self):
@@ -107,6 +131,7 @@ def test_rmtree_deletes_nested_dir_with_files(self):
107131
@skipIf(sys.platform == "cygwin", "Cygwin can't set the permissions that make the test meaningful.")
108132
def test_rmtree_deletes_dir_with_readonly_files(self):
109133
# Automatically works on Unix, but requires special handling on Windows.
134+
# Not to be confused with _tmpdir_to_force_permission_error (which is used below).
110135
with tempfile.TemporaryDirectory() as parent:
111136
td = pathlib.Path(parent, "testdir")
112137
for d in td, td / "sub":
@@ -122,31 +147,9 @@ def test_rmtree_deletes_dir_with_readonly_files(self):
122147

123148
self.assertFalse(td.exists())
124149

125-
@staticmethod
126-
@contextlib.contextmanager
127-
def _tmpdir_to_force_permission_error():
128-
if sys.platform == "cygwin":
129-
raise SkipTest("Cygwin can't set the permissions that make the test meaningful.")
130-
if sys.version_info < (3, 8):
131-
raise SkipTest("In 3.7, TemporaryDirectory doesn't clean up after weird permissions.")
132-
133-
with tempfile.TemporaryDirectory() as parent:
134-
td = pathlib.Path(parent, "testdir")
135-
td.mkdir()
136-
(td / "x").write_bytes(b"")
137-
(td / "x").chmod(stat.S_IRUSR) # Set up PermissionError on Windows.
138-
td.chmod(stat.S_IRUSR | stat.S_IXUSR) # Set up PermissionError on Unix.
139-
yield td
140-
141-
@staticmethod
142-
@contextlib.contextmanager
143-
def _tmpdir_for_file_not_found():
144-
with tempfile.TemporaryDirectory() as parent:
145-
yield pathlib.Path(parent, "testdir") # It is deliberately never created.
146-
147150
def test_rmtree_can_wrap_exceptions(self):
148151
"""Our rmtree wraps PermissionError when HIDE_WINDOWS_KNOWN_ERRORS is true."""
149-
with self._tmpdir_to_force_permission_error() as td:
152+
with _tmpdir_to_force_permission_error() as td:
150153
# Access the module through sys.modules so it is unambiguous which module's
151154
# attribute we patch: the original git.util, not git.index.util even though
152155
# git.index.util "replaces" git.util and is what "import git.util" gives us.

0 commit comments

Comments
 (0)