issue27186: fix fsencode/fsdecode and update tests; patch by Jelle Zijlstra

This commit is contained in:
Ethan Furman 2016-06-04 13:47:39 -07:00
parent db780cffc8
commit 228c636908
2 changed files with 15 additions and 8 deletions

View File

@ -889,7 +889,7 @@ def _fscodec():
return filename.encode(encoding, errors) return filename.encode(encoding, errors)
else: else:
raise TypeError("expected str, bytes or os.PathLike object, not " raise TypeError("expected str, bytes or os.PathLike object, not "
+ path_type.__name__) + type(filename).__name__)
def fsdecode(filename): def fsdecode(filename):
""" """
@ -905,7 +905,7 @@ def _fscodec():
return filename.decode(encoding, errors) return filename.decode(encoding, errors)
else: else:
raise TypeError("expected str, bytes or os.PathLike object, not " raise TypeError("expected str, bytes or os.PathLike object, not "
+ path_type.__name__) + type(filename).__name__)
return fsencode, fsdecode return fsencode, fsdecode

View File

@ -3107,29 +3107,36 @@ class TestPEP519(unittest.TestCase):
self.assertEqual(s, os.fspath(s)) self.assertEqual(s, os.fspath(s))
def test_fsencode_fsdecode_return_pathlike(self): def test_fsencode_fsdecode_return_pathlike(self):
class Pathlike: class PathLike:
def __init__(self, path): def __init__(self, path):
self.path = path self.path = path
def __fspath__(self): def __fspath__(self):
return self.path return self.path
for p in "path/like/object", b"path/like/object": for p in "path/like/object", b"path/like/object":
pathlike = Pathlike(p) pathlike = PathLike(p)
self.assertEqual(p, os.fspath(pathlike)) self.assertEqual(p, os.fspath(pathlike))
self.assertEqual(b"path/like/object", os.fsencode(pathlike)) self.assertEqual(b"path/like/object", os.fsencode(pathlike))
self.assertEqual("path/like/object", os.fsdecode(pathlike)) self.assertEqual("path/like/object", os.fsdecode(pathlike))
def test_fspathlike(self): def test_fspathlike(self):
class PathLike(object): class PathLike:
def __init__(self, path=''):
self.path = path
def __fspath__(self): def __fspath__(self):
return '#feelthegil' return self.path
self.assertEqual('#feelthegil', os.fspath(PathLike())) self.assertEqual('#feelthegil', os.fspath(PathLike('#feelthegil')))
self.assertTrue(issubclass(PathLike, os.PathLike)) self.assertTrue(issubclass(PathLike, os.PathLike))
self.assertTrue(isinstance(PathLike(), os.PathLike)) self.assertTrue(isinstance(PathLike(), os.PathLike))
message = 'expected str, bytes or os.PathLike object, not'
for fn in (os.fsencode, os.fsdecode):
for obj in PathLike(None), None:
with self.assertRaisesRegex(TypeError, message):
fn(obj)
def test_garbage_in_exception_out(self): def test_garbage_in_exception_out(self):
vapor = type('blah', (), {}) vapor = type('blah', (), {})
for o in int, type, os, vapor(): for o in int, type, os, vapor():