Add support for .parent and .joinpath in zipfile.Path (#13213)

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 @@
             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 @@
             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 @@
     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 @@
             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())