Issue #19775: Add a samefile() method to pathlib Path objects.

Initial patch by Vajrasky Kok.
This commit is contained in:
Antoine Pitrou 2014-05-13 10:50:15 +02:00
parent 38acd4c028
commit 43e3d9409d
4 changed files with 53 additions and 0 deletions

View file

@ -884,6 +884,25 @@ call fails (for example because the path doesn't exist):
Remove this directory. The directory must be empty. Remove this directory. The directory must be empty.
.. method:: Path.samefile(other_path)
Return whether this path points to the same file as *other_path*, which
can be either a Path object, or a string. The semantics are similar
to :func:`os.path.samefile` and :func:`os.path.samestat`.
An :exc:`OSError` can be raised if either file cannot be accessed for some
reason.
>>> p = Path('spam')
>>> q = Path('eggs')
>>> p.samefile(q)
False
>>> p.samefile('spam')
True
.. versionadded:: 3.5
.. method:: Path.symlink_to(target, target_is_directory=False) .. method:: Path.symlink_to(target, target_is_directory=False)
Make this path a symbolic link to *target*. Under Windows, Make this path a symbolic link to *target*. Under Windows,

View file

@ -961,6 +961,17 @@ class Path(PurePath):
""" """
return cls(os.getcwd()) return cls(os.getcwd())
def samefile(self, other_path):
"""Return whether `other_file` is the same or not as this file.
(as returned by os.path.samefile(file, other_file)).
"""
st = self.stat()
try:
other_st = other_path.stat()
except AttributeError:
other_st = os.stat(other_path)
return os.path.samestat(st, other_st)
def iterdir(self): def iterdir(self):
"""Iterate over the files in this directory. Does not yield any """Iterate over the files in this directory. Does not yield any
result for the special paths '.' and '..'. result for the special paths '.' and '..'.

View file

@ -1251,6 +1251,26 @@ class _BasePathTest(object):
p = self.cls.cwd() p = self.cls.cwd()
self._test_cwd(p) self._test_cwd(p)
def test_samefile(self):
fileA_path = os.path.join(BASE, 'fileA')
fileB_path = os.path.join(BASE, 'dirB', 'fileB')
p = self.cls(fileA_path)
pp = self.cls(fileA_path)
q = self.cls(fileB_path)
self.assertTrue(p.samefile(fileA_path))
self.assertTrue(p.samefile(pp))
self.assertFalse(p.samefile(fileB_path))
self.assertFalse(p.samefile(q))
# Test the non-existent file case
non_existent = os.path.join(BASE, 'foo')
r = self.cls(non_existent)
self.assertRaises(FileNotFoundError, p.samefile, r)
self.assertRaises(FileNotFoundError, p.samefile, non_existent)
self.assertRaises(FileNotFoundError, r.samefile, p)
self.assertRaises(FileNotFoundError, r.samefile, non_existent)
self.assertRaises(FileNotFoundError, r.samefile, r)
self.assertRaises(FileNotFoundError, r.samefile, non_existent)
def test_empty_path(self): def test_empty_path(self):
# The empty path points to '.' # The empty path points to '.'
p = self.cls('') p = self.cls('')

View file

@ -84,6 +84,9 @@ Core and Builtins
Library Library
------- -------
- Issue #19775: Add a samefile() method to pathlib Path objects. Initial
patch by Vajrasky Kok.
- Issue #21398: Fix an unicode error in the pydoc pager when the documentation - Issue #21398: Fix an unicode error in the pydoc pager when the documentation
contains characters not encodable to the stdout encoding. contains characters not encodable to the stdout encoding.