aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/test/test_pathlib/test_pathlib_abc.py
diff options
context:
space:
mode:
authorBarney Gale <barney.gale@gmail.com>2024-12-08 18:45:09 +0000
committerGitHub <noreply@github.com>2024-12-08 18:45:09 +0000
commit7f8ec523021427a5c1ab3ce0cdd6e4bb909f1dc5 (patch)
tree7939eb62c8eb50421ab9024e0d9b27c0e04bf90c /Lib/test/test_pathlib/test_pathlib_abc.py
parent2367759212f609b8ddf3218003b3ccd8e72849ae (diff)
downloadcpython-7f8ec523021427a5c1ab3ce0cdd6e4bb909f1dc5.tar.gz
cpython-7f8ec523021427a5c1ab3ce0cdd6e4bb909f1dc5.zip
GH-127381: pathlib ABCs: remove `PathBase.unlink()` and `rmdir()` (#127736)
Virtual filesystems don't always make a distinction between deleting files and empty directories, and sometimes support deleting non-empty directories in a single operation. Here we remove `PathBase.unlink()` and `rmdir()`, leaving `_delete()` as the sole deletion method, now made abstract. I hope to drop the underscore prefix later on.
Diffstat (limited to 'Lib/test/test_pathlib/test_pathlib_abc.py')
-rw-r--r--Lib/test/test_pathlib/test_pathlib_abc.py56
1 files changed, 11 insertions, 45 deletions
diff --git a/Lib/test/test_pathlib/test_pathlib_abc.py b/Lib/test/test_pathlib/test_pathlib_abc.py
index bf9ae6cc8a2..675abf30a9f 100644
--- a/Lib/test/test_pathlib/test_pathlib_abc.py
+++ b/Lib/test/test_pathlib/test_pathlib_abc.py
@@ -1370,8 +1370,6 @@ class PathBaseTest(PurePathBaseTest):
self.assertRaises(e, p.touch)
self.assertRaises(e, p.chmod, 0o755)
self.assertRaises(e, p.lchmod, 0o755)
- self.assertRaises(e, p.unlink)
- self.assertRaises(e, p.rmdir)
self.assertRaises(e, p.owner)
self.assertRaises(e, p.group)
self.assertRaises(e, p.as_uri)
@@ -1493,31 +1491,18 @@ class DummyPath(PathBase):
self.parent.mkdir(parents=True, exist_ok=True)
self.mkdir(mode, parents=False, exist_ok=exist_ok)
- def unlink(self, missing_ok=False):
- path = str(self)
- name = self.name
- parent = str(self.parent)
- if path in self._directories:
- raise IsADirectoryError(errno.EISDIR, "Is a directory", path)
- elif path in self._files:
- self._directories[parent].remove(name)
- del self._files[path]
- elif not missing_ok:
- raise FileNotFoundError(errno.ENOENT, "File not found", path)
-
- def rmdir(self):
+ def _delete(self):
path = str(self)
if path in self._files:
- raise NotADirectoryError(errno.ENOTDIR, "Not a directory", path)
- elif path not in self._directories:
- raise FileNotFoundError(errno.ENOENT, "File not found", path)
- elif self._directories[path]:
- raise OSError(errno.ENOTEMPTY, "Directory not empty", path)
- else:
- name = self.name
- parent = str(self.parent)
- self._directories[parent].remove(name)
+ del self._files[path]
+ elif path in self._directories:
+ for name in list(self._directories[path]):
+ self.joinpath(name)._delete()
del self._directories[path]
+ else:
+ raise FileNotFoundError(errno.ENOENT, "File not found", path)
+ parent = str(self.parent)
+ self._directories[parent].remove(self.name)
class DummyPathTest(DummyPurePathTest):
@@ -2245,30 +2230,11 @@ class DummyPathTest(DummyPurePathTest):
self.assertIs((P / 'fileA\udfff').is_char_device(), False)
self.assertIs((P / 'fileA\x00').is_char_device(), False)
- def test_unlink(self):
- p = self.cls(self.base) / 'fileA'
- p.unlink()
- self.assertFileNotFound(p.stat)
- self.assertFileNotFound(p.unlink)
-
- def test_unlink_missing_ok(self):
- p = self.cls(self.base) / 'fileAAA'
- self.assertFileNotFound(p.unlink)
- p.unlink(missing_ok=True)
-
- def test_rmdir(self):
- p = self.cls(self.base) / 'dirA'
- for q in p.iterdir():
- q.unlink()
- p.rmdir()
- self.assertFileNotFound(p.stat)
- self.assertFileNotFound(p.unlink)
-
def test_delete_file(self):
p = self.cls(self.base) / 'fileA'
p._delete()
self.assertFileNotFound(p.stat)
- self.assertFileNotFound(p.unlink)
+ self.assertFileNotFound(p._delete)
def test_delete_dir(self):
base = self.cls(self.base)
@@ -2347,7 +2313,7 @@ class DummyPathWalkTest(unittest.TestCase):
def tearDown(self):
base = self.cls(self.base)
- base._rmtree()
+ base._delete()
def test_walk_topdown(self):
walker = self.walk_path.walk()