From: Barney Gale Date: Sat, 30 Nov 2024 18:39:39 +0000 (+0000) Subject: GH-127381: pathlib ABCs: remove `PathBase.cwd()` and `home()` (#127427) X-Git-Tag: v3.14.0a3~166 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=328187cc4fcdd578db42cf6a16c197c3382157a7;p=thirdparty%2FPython%2Fcpython.git GH-127381: pathlib ABCs: remove `PathBase.cwd()` and `home()` (#127427) These classmethods presume that the user has retained the original `__init__()` signature, which may not be the case. Also, many virtual filesystems don't provide current or home directories. --- diff --git a/Lib/pathlib/_abc.py b/Lib/pathlib/_abc.py index 697f32985ff6..2b314b6c9a16 100644 --- a/Lib/pathlib/_abc.py +++ b/Lib/pathlib/_abc.py @@ -735,27 +735,12 @@ class PathBase(PurePathBase): # Treat the root directory as the current working directory. return self.with_segments('/', *self._raw_paths) - @classmethod - def cwd(cls): - """Return a new path pointing to the current working directory.""" - # We call 'absolute()' rather than using 'os.getcwd()' directly to - # enable users to replace the implementation of 'absolute()' in a - # subclass and benefit from the new behaviour here. This works because - # os.path.abspath('.') == os.getcwd(). - return cls().absolute() - def expanduser(self): """ Return a new path with expanded ~ and ~user constructs (as returned by os.path.expanduser) """ raise UnsupportedOperation(self._unsupported_msg('expanduser()')) - @classmethod - def home(cls): - """Return a new path pointing to expanduser('~'). - """ - return cls("~").expanduser() - def readlink(self): """ Return the path to which the symbolic link points. diff --git a/Lib/pathlib/_local.py b/Lib/pathlib/_local.py index 25c1e3f44ea7..b5d9dc49f584 100644 --- a/Lib/pathlib/_local.py +++ b/Lib/pathlib/_local.py @@ -726,6 +726,14 @@ class Path(PathBase, PurePath): tail.extend(self._tail) return self._from_parsed_parts(drive, root, tail) + @classmethod + def cwd(cls): + """Return a new path pointing to the current working directory.""" + cwd = os.getcwd() + path = cls(cwd) + path._str = cwd # getcwd() returns a normalized path + return path + def resolve(self, strict=False): """ Make the path absolute, resolving all symlinks on the way and also @@ -907,6 +915,15 @@ class Path(PathBase, PurePath): return self + @classmethod + def home(cls): + """Return a new path pointing to expanduser('~'). + """ + homedir = os.path.expanduser("~") + if homedir == "~": + raise RuntimeError("Could not determine home directory.") + return cls(homedir) + @classmethod def from_uri(cls, uri): """Return a new path from the given 'file' URI.""" diff --git a/Lib/test/test_pathlib/test_pathlib_abc.py b/Lib/test/test_pathlib/test_pathlib_abc.py index 7ca35e3dc7ee..af94ac039808 100644 --- a/Lib/test/test_pathlib/test_pathlib_abc.py +++ b/Lib/test/test_pathlib/test_pathlib_abc.py @@ -1371,9 +1371,7 @@ class PathBaseTest(PurePathBaseTest): self.assertRaises(e, p.rglob, '*') self.assertRaises(e, lambda: list(p.walk())) self.assertRaises(e, p.absolute) - self.assertRaises(e, P.cwd) self.assertRaises(e, p.expanduser) - self.assertRaises(e, p.home) self.assertRaises(e, p.readlink) self.assertRaises(e, p.symlink_to, 'foo') self.assertRaises(e, p.hardlink_to, 'foo')