summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBarney Gale <barney.gale@gmail.com>2024-12-12 06:49:34 (GMT)
committerGitHub <noreply@github.com>2024-12-12 06:49:34 (GMT)
commit292afd1d51dd7aacb12a6165f596ae7bb58c9ba8 (patch)
treee2de2c8ea4260e39f3f591e4c659181986b52181
parent8bbd379ee30db0320ec3d31c37aee2a503902b0f (diff)
downloadcpython-292afd1d51dd7aacb12a6165f596ae7bb58c9ba8.zip
cpython-292afd1d51dd7aacb12a6165f596ae7bb58c9ba8.tar.gz
cpython-292afd1d51dd7aacb12a6165f596ae7bb58c9ba8.tar.bz2
GH-127381: pathlib ABCs: remove remaining uncommon `PathBase` methods (#127714)
Remove the following methods from `pathlib._abc.PathBase`: - `expanduser()` - `hardlink_to()` - `touch()` - `chmod()` - `lchmod()` - `owner()` - `group()` - `from_uri()` - `as_uri()` These operations aren't regularly supported in virtual filesystems, so they don't win a place in the `PathBase` interface. (Some of them probably don't deserve a place in `Path` :P.) They're quasi-abstract (except `lchmod()`), and they're not called by other `PathBase` methods.
-rw-r--r--Lib/pathlib/_abc.py54
-rw-r--r--Lib/pathlib/_local.py28
-rw-r--r--Lib/test/test_pathlib/test_pathlib_abc.py12
3 files changed, 27 insertions, 67 deletions
diff --git a/Lib/pathlib/_abc.py b/Lib/pathlib/_abc.py
index 02c6e05..b10aba8 100644
--- a/Lib/pathlib/_abc.py
+++ b/Lib/pathlib/_abc.py
@@ -571,12 +571,6 @@ class PathBase(PurePathBase):
yield path, dirnames, filenames
paths += [path.joinpath(d) for d in reversed(dirnames)]
- def expanduser(self):
- """ Return a new path with expanded ~ and ~user constructs
- (as returned by os.path.expanduser)
- """
- raise UnsupportedOperation(self._unsupported_msg('expanduser()'))
-
def readlink(self):
"""
Return the path to which the symbolic link points.
@@ -597,20 +591,6 @@ class PathBase(PurePathBase):
"""
self.symlink_to(link.readlink())
- def hardlink_to(self, target):
- """
- Make this path a hard link pointing to the same file as *target*.
-
- Note the order of arguments (self, target) is the reverse of os.link's.
- """
- raise UnsupportedOperation(self._unsupported_msg('hardlink_to()'))
-
- def touch(self, mode=0o666, exist_ok=True):
- """
- Create this file with the given access mode, if it doesn't exist.
- """
- raise UnsupportedOperation(self._unsupported_msg('touch()'))
-
def mkdir(self, mode=0o777, parents=False, exist_ok=False):
"""
Create a new directory at this given path.
@@ -729,37 +709,3 @@ class PathBase(PurePathBase):
else:
target = self.with_segments(target_dir, name)
return self.move(target)
-
- def chmod(self, mode, *, follow_symlinks=True):
- """
- Change the permissions of the path, like os.chmod().
- """
- raise UnsupportedOperation(self._unsupported_msg('chmod()'))
-
- def lchmod(self, mode):
- """
- Like chmod(), except if the path points to a symlink, the symlink's
- permissions are changed, rather than its target's.
- """
- self.chmod(mode, follow_symlinks=False)
-
- def owner(self, *, follow_symlinks=True):
- """
- Return the login name of the file owner.
- """
- raise UnsupportedOperation(self._unsupported_msg('owner()'))
-
- def group(self, *, follow_symlinks=True):
- """
- Return the group name of the file gid.
- """
- raise UnsupportedOperation(self._unsupported_msg('group()'))
-
- @classmethod
- def from_uri(cls, uri):
- """Return a new path from the given 'file' URI."""
- raise UnsupportedOperation(cls._unsupported_msg('from_uri()'))
-
- def as_uri(self):
- """Return the path as a URI."""
- raise UnsupportedOperation(self._unsupported_msg('as_uri()'))
diff --git a/Lib/pathlib/_local.py b/Lib/pathlib/_local.py
index 85437ec..0dfe9d2 100644
--- a/Lib/pathlib/_local.py
+++ b/Lib/pathlib/_local.py
@@ -526,7 +526,6 @@ class Path(PathBase, PurePath):
but cannot instantiate a WindowsPath on a POSIX system or vice versa.
"""
__slots__ = ()
- as_uri = PurePath.as_uri
@classmethod
def _unsupported_msg(cls, attribute):
@@ -813,6 +812,12 @@ class Path(PathBase, PurePath):
"""
uid = self.stat(follow_symlinks=follow_symlinks).st_uid
return pwd.getpwuid(uid).pw_name
+ else:
+ def owner(self, *, follow_symlinks=True):
+ """
+ Return the login name of the file owner.
+ """
+ raise UnsupportedOperation(self._unsupported_msg('owner()'))
if grp:
def group(self, *, follow_symlinks=True):
@@ -821,6 +826,12 @@ class Path(PathBase, PurePath):
"""
gid = self.stat(follow_symlinks=follow_symlinks).st_gid
return grp.getgrgid(gid).gr_name
+ else:
+ def group(self, *, follow_symlinks=True):
+ """
+ Return the group name of the file gid.
+ """
+ raise UnsupportedOperation(self._unsupported_msg('group()'))
if hasattr(os, "readlink"):
def readlink(self):
@@ -892,6 +903,13 @@ class Path(PathBase, PurePath):
"""
os.chmod(self, mode, follow_symlinks=follow_symlinks)
+ def lchmod(self, mode):
+ """
+ Like chmod(), except if the path points to a symlink, the symlink's
+ permissions are changed, rather than its target's.
+ """
+ self.chmod(mode, follow_symlinks=False)
+
def unlink(self, missing_ok=False):
"""
Remove this file or link.
@@ -988,6 +1006,14 @@ class Path(PathBase, PurePath):
Note the order of arguments (self, target) is the reverse of os.link's.
"""
os.link(target, self)
+ else:
+ def hardlink_to(self, target):
+ """
+ Make this path a hard link pointing to the same file as *target*.
+
+ Note the order of arguments (self, target) is the reverse of os.link's.
+ """
+ raise UnsupportedOperation(self._unsupported_msg('hardlink_to()'))
def expanduser(self):
""" Return a new path with expanded ~ and ~user constructs
diff --git a/Lib/test/test_pathlib/test_pathlib_abc.py b/Lib/test/test_pathlib/test_pathlib_abc.py
index f4c364c..d770b87 100644
--- a/Lib/test/test_pathlib/test_pathlib_abc.py
+++ b/Lib/test/test_pathlib/test_pathlib_abc.py
@@ -1312,21 +1312,9 @@ class PathBaseTest(PurePathBaseTest):
self.assertRaises(e, lambda: list(p.glob('*')))
self.assertRaises(e, lambda: list(p.rglob('*')))
self.assertRaises(e, lambda: list(p.walk()))
- self.assertRaises(e, p.expanduser)
self.assertRaises(e, p.readlink)
self.assertRaises(e, p.symlink_to, 'foo')
- self.assertRaises(e, p.hardlink_to, 'foo')
self.assertRaises(e, p.mkdir)
- self.assertRaises(e, p.touch)
- self.assertRaises(e, p.chmod, 0o755)
- self.assertRaises(e, p.lchmod, 0o755)
- self.assertRaises(e, p.owner)
- self.assertRaises(e, p.group)
- self.assertRaises(e, p.as_uri)
-
- def test_as_uri_common(self):
- e = UnsupportedOperation
- self.assertRaises(e, self.cls('').as_uri)
def test_fspath_common(self):
self.assertRaises(TypeError, os.fspath, self.cls(''))