]> granicus.if.org Git - python/commitdiff
bpo-30618: add readlink to pathlib.Path (GH-8285)
authorGirts <girtsf@users.noreply.github.com>
Wed, 23 Oct 2019 21:18:40 +0000 (14:18 -0700)
committerMiss Skeleton (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 23 Oct 2019 21:18:40 +0000 (14:18 -0700)
This adds a "readlink" method to pathlib.Path objects that calls through
to os.readlink.

https://bugs.python.org/issue30618

Automerge-Triggered-By: @gpshead
Doc/library/pathlib.rst
Doc/whatsnew/3.9.rst
Lib/pathlib.py
Lib/test/test_pathlib.py
Misc/NEWS.d/next/Library/2018-07-14-13-48-56.bpo-30618.T5AUF6.rst [new file with mode: 0644]

index acbd0e48af24255fe53fc0506ef2faf84754e100..5906a33bdea118992674684493e062a5ddce2f70 100644 (file)
@@ -944,6 +944,19 @@ call fails (for example because the path doesn't exist).
    .. versionadded:: 3.5
 
 
+.. method:: Path.readlink()
+
+   Return the path to which the symbolic link points (as returned by
+   :func:`os.readlink`)::
+
+      >>> p = Path('mylink')
+      >>> p.symlink_to('setup.py')
+      >>> p.readlink()
+      PosixPath('setup.py')
+
+   .. versionadded:: 3.9
+
+
 .. method:: Path.rename(target)
 
    Rename this file or directory to the given *target*, and return a new Path
@@ -1153,6 +1166,7 @@ os and os.path                         pathlib
 :func:`os.path.isdir`                  :meth:`Path.is_dir`
 :func:`os.path.isfile`                 :meth:`Path.is_file`
 :func:`os.path.islink`                 :meth:`Path.is_symlink`
+:func:`os.readlink`                    :meth:`Path.readlink`
 :func:`os.stat`                        :meth:`Path.stat`,
                                        :meth:`Path.owner`,
                                        :meth:`Path.group`
index f203930fd1b7b7896cea3e242ad01aaee976e13e..b95b0999cb952410ec580407ffcb1a10b062eb80 100644 (file)
@@ -150,6 +150,13 @@ customization consistently by always using the value specified by
 case), and one used ``__VENV_NAME__`` instead.
 (Contributed by Brett Cannon in :issue:`37663`.)
 
+pathlib
+-------
+
+Added :meth:`~pathlib.Path.readlink()` which acts similar to
+:func:`~os.readlink`.
+(Contributed by Girts Folkmanis in :issue:`30618`)
+
 pprint
 ------
 
index 67b94e01545413280dc513dcdd7895cdb8cb0e1a..825533d8d5f976a853ed72cb7736d74f75501649 100644 (file)
@@ -1244,6 +1244,15 @@ class Path(PurePath):
         with self.open(mode='w', encoding=encoding, errors=errors) as f:
             return f.write(data)
 
+    def readlink(self):
+        """
+        Return the path to which the symbolic link points.
+        """
+        path = self._accessor.readlink(self)
+        obj = self._from_parts((path,), init=False)
+        obj._init(template=self)
+        return obj
+
     def touch(self, mode=0o666, exist_ok=True):
         """
         Create this file with the given access mode, if it doesn't exist.
index 221c2722d0a9d15ea498e1055bd3aa3fff424c97..058a201aebc1d81534f122224c854a53f0b44d0d 100644 (file)
@@ -1812,6 +1812,16 @@ class _BasePathTest(object):
         self.assertEqual(os.stat(r).st_size, size)
         self.assertFileNotFound(q.stat)
 
+    @support.skip_unless_symlink
+    def test_readlink(self):
+        P = self.cls(BASE)
+        self.assertEqual((P / 'linkA').readlink(), self.cls('fileA'))
+        self.assertEqual((P / 'brokenLink').readlink(),
+                         self.cls('non-existing'))
+        self.assertEqual((P / 'linkB').readlink(), self.cls('dirB'))
+        with self.assertRaises(OSError):
+            (P / 'fileA').readlink()
+
     def test_touch_common(self):
         P = self.cls(BASE)
         p = P / 'newfileA'
diff --git a/Misc/NEWS.d/next/Library/2018-07-14-13-48-56.bpo-30618.T5AUF6.rst b/Misc/NEWS.d/next/Library/2018-07-14-13-48-56.bpo-30618.T5AUF6.rst
new file mode 100644 (file)
index 0000000..35bdb4e
--- /dev/null
@@ -0,0 +1 @@
+Add :meth:`~pathlib.Path.readlink`. Patch by Girts Folkmanis.