diff options
-rw-r--r-- | Lib/test/test_zipfile.py | 14 | ||||
-rw-r--r-- | Lib/zipfile.py | 11 |
2 files changed, 24 insertions, 1 deletions
diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 538d4ee..bf5bb4d 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -2481,6 +2481,14 @@ class TestPath(unittest.TestCase): assert a.read_text() == "content of a" assert a.read_bytes() == b"content of a" + def test_joinpath(self): + for zipfile_abcde in self.zipfile_abcde(): + root = zipfile.Path(zipfile_abcde) + a = root.joinpath("a") + assert a.is_file() + e = root.joinpath("b").joinpath("d").joinpath("e.txt") + assert e.read_text() == "content of e" + def test_traverse_truediv(self): for zipfile_abcde in self.zipfile_abcde(): root = zipfile.Path(zipfile_abcde) @@ -2502,5 +2510,11 @@ class TestPath(unittest.TestCase): root = zipfile.Path(zipfile_abcde) root / pathlib.Path("a") + def test_parent(self): + for zipfile_abcde in self.zipfile_abcde(): + root = zipfile.Path(zipfile_abcde) + assert (root / 'a').parent.at == '' + assert (root / 'a' / 'b').parent.at == 'a/' + if __name__ == "__main__": unittest.main() diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 62475c7..8f8cb86 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -2218,12 +2218,14 @@ class Path: def __repr__(self): return self.__repr.format(self=self) - def __truediv__(self, add): + def joinpath(self, add): next = posixpath.join(self.at, add) next_dir = posixpath.join(self.at, add, "") names = self._names() return self._next(next_dir if next not in names and next_dir in names else next) + __truediv__ = joinpath + @staticmethod def _add_implied_dirs(names): return names + [ @@ -2232,6 +2234,13 @@ class Path: if name and name + "/" not in names ] + @property + def parent(self): + parent_at = posixpath.dirname(self.at) + if parent_at: + parent_at += '/' + return self._next(parent_at) + def _names(self): return self._add_implied_dirs(self.root.namelist()) |