GH-127381: pathlib ABCs: remove `PathBase.cwd()` and `home()` (#127427)

https://github.com/python/cpython/commit/328187cc4fcdd578db42cf6a16c197c3382... commit: 328187cc4fcdd578db42cf6a16c197c3382157a7 branch: main author: Barney Gale <barney.gale@gmail.com> committer: barneygale <barney.gale@gmail.com> date: 2024-11-30T18:39:39Z summary: 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. files: M Lib/pathlib/_abc.py M Lib/pathlib/_local.py M Lib/test/test_pathlib/test_pathlib_abc.py diff --git a/Lib/pathlib/_abc.py b/Lib/pathlib/_abc.py index 697f32985ff652..2b314b6c9a16bf 100644 --- a/Lib/pathlib/_abc.py +++ b/Lib/pathlib/_abc.py @@ -735,27 +735,12 @@ def absolute(self): # 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 25c1e3f44ea7e8..b5d9dc49f58463 100644 --- a/Lib/pathlib/_local.py +++ b/Lib/pathlib/_local.py @@ -726,6 +726,14 @@ def absolute(self): 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 @@ def expanduser(self): 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 7ca35e3dc7ee00..af94ac039808f0 100644 --- a/Lib/test/test_pathlib/test_pathlib_abc.py +++ b/Lib/test/test_pathlib/test_pathlib_abc.py @@ -1371,9 +1371,7 @@ def test_unsupported_operation(self): 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')
participants (1)
-
barneygale