mirror of
https://github.com/python/cpython.git
synced 2025-10-25 15:58:57 +00:00
GH-73991: pathlib ABC tests: add DummyPath.unlink() and rmdir() (#120715)
In preparation for the addition of `PathBase.rmtree()`, implement `DummyPath.unlink()` and `rmdir()`, and move corresponding tests into `test_pathlib_abc` so they're run against `DummyPath`.
This commit is contained in:
parent
b7f478948f
commit
9f741e55c1
2 changed files with 51 additions and 20 deletions
|
|
@ -764,25 +764,6 @@ class PathTest(test_pathlib_abc.DummyPathTest, PurePathTest):
|
||||||
self.assertEqual(expected_gid, gid_2)
|
self.assertEqual(expected_gid, gid_2)
|
||||||
self.assertEqual(expected_name, link.group(follow_symlinks=False))
|
self.assertEqual(expected_name, link.group(follow_symlinks=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)
|
|
||||||
|
|
||||||
@os_helper.skip_unless_hardlink
|
@os_helper.skip_unless_hardlink
|
||||||
def test_hardlink_to(self):
|
def test_hardlink_to(self):
|
||||||
P = self.cls(self.base)
|
P = self.cls(self.base)
|
||||||
|
|
|
||||||
|
|
@ -1496,7 +1496,7 @@ class DummyPath(PathBase):
|
||||||
if path in self._files:
|
if path in self._files:
|
||||||
raise NotADirectoryError(errno.ENOTDIR, "Not a directory", path)
|
raise NotADirectoryError(errno.ENOTDIR, "Not a directory", path)
|
||||||
elif path in self._directories:
|
elif path in self._directories:
|
||||||
return (self / name for name in self._directories[path])
|
return iter([self / name for name in self._directories[path]])
|
||||||
else:
|
else:
|
||||||
raise FileNotFoundError(errno.ENOENT, "File not found", path)
|
raise FileNotFoundError(errno.ENOENT, "File not found", path)
|
||||||
|
|
||||||
|
|
@ -1517,6 +1517,37 @@ class DummyPath(PathBase):
|
||||||
self.parent.mkdir(parents=True, exist_ok=True)
|
self.parent.mkdir(parents=True, exist_ok=True)
|
||||||
self.mkdir(mode, parents=False, exist_ok=exist_ok)
|
self.mkdir(mode, parents=False, exist_ok=exist_ok)
|
||||||
|
|
||||||
|
def unlink(self, missing_ok=False):
|
||||||
|
path_obj = self.parent.resolve(strict=True) / self.name
|
||||||
|
path = str(path_obj)
|
||||||
|
name = path_obj.name
|
||||||
|
parent = str(path_obj.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 path in self._symlinks:
|
||||||
|
self._directories[parent].remove(name)
|
||||||
|
del self._symlinks[path]
|
||||||
|
elif not missing_ok:
|
||||||
|
raise FileNotFoundError(errno.ENOENT, "File not found", path)
|
||||||
|
|
||||||
|
def rmdir(self):
|
||||||
|
path_obj = self.parent.resolve(strict=True) / self.name
|
||||||
|
path = str(path_obj)
|
||||||
|
if path in self._files or path in self._symlinks:
|
||||||
|
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 = path_obj.name
|
||||||
|
parent = str(path_obj.parent)
|
||||||
|
self._directories[parent].remove(name)
|
||||||
|
del self._directories[path]
|
||||||
|
|
||||||
|
|
||||||
class DummyPathTest(DummyPurePathTest):
|
class DummyPathTest(DummyPurePathTest):
|
||||||
"""Tests for PathBase methods that use stat(), open() and iterdir()."""
|
"""Tests for PathBase methods that use stat(), open() and iterdir()."""
|
||||||
|
|
@ -2400,6 +2431,25 @@ class DummyPathTest(DummyPurePathTest):
|
||||||
def test_complex_symlinks_relative_dot_dot(self):
|
def test_complex_symlinks_relative_dot_dot(self):
|
||||||
self._check_complex_symlinks(self.parser.join('dirA', '..'))
|
self._check_complex_symlinks(self.parser.join('dirA', '..'))
|
||||||
|
|
||||||
|
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 setUpWalk(self):
|
def setUpWalk(self):
|
||||||
# Build:
|
# Build:
|
||||||
# TESTFN/
|
# TESTFN/
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue