issue27186: fix fsencode/fsdecode and update tests; patch by Jelle Zijlstra
This commit is contained in:
parent
db780cffc8
commit
228c636908
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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():
|
||||||
|
|
Loading…
Reference in New Issue