summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEthan Furman <ethan@stoneleaf.us>2016-06-02 22:06:09 (GMT)
committerEthan Furman <ethan@stoneleaf.us>2016-06-02 22:06:09 (GMT)
commitcdc0879d3a550ee7f339d149c451e2ebee1906f9 (patch)
treed2ee559bac76d8fae019310c2d5c96d0260fc24c
parent1f56e5f6afa137300d655a40e00675195e0248fe (diff)
downloadcpython-cdc0879d3a550ee7f339d149c451e2ebee1906f9.zip
cpython-cdc0879d3a550ee7f339d149c451e2ebee1906f9.tar.gz
cpython-cdc0879d3a550ee7f339d149c451e2ebee1906f9.tar.bz2
issue27186 -- initial docs, tests, and python version of os.fspath
-rw-r--r--Doc/library/os.rst9
-rw-r--r--Lib/os.py21
-rw-r--r--Lib/test/test_os.py21
3 files changed, 51 insertions, 0 deletions
diff --git a/Doc/library/os.rst b/Doc/library/os.rst
index 1b0ad17..4ed01dd 100644
--- a/Doc/library/os.rst
+++ b/Doc/library/os.rst
@@ -186,6 +186,15 @@ process and user.
.. versionadded:: 3.2
+.. function:: fspath(path)
+
+ Return the string representation of the path.
+
+ If :class:`str` or :class:`bytes` is passed in, it is returned unchanged;
+ otherwise, the result of calling ``type(path).__fspath__`` is returned, or an
+ exception is raised.
+
+
.. function:: getenv(key, default=None)
Return the value of the environment variable *key* if it exists, or
diff --git a/Lib/os.py b/Lib/os.py
index 90646a0..edd61ab 100644
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -1097,3 +1097,24 @@ def fdopen(fd, *args, **kwargs):
raise TypeError("invalid fd type (%s, expected integer)" % type(fd))
import io
return io.open(fd, *args, **kwargs)
+
+# Supply os.fspath()
+def fspath(path):
+ """Return the string representation of the path.
+
+ If str or bytes is passed in, it is returned unchanged.
+ """
+ if isinstance(path, (str, bytes)):
+ return path
+
+ # Work from the object's type to match method resolution of other magic
+ # methods.
+ path_type = type(path)
+ try:
+ return path_type.__fspath__(path)
+ except AttributeError:
+ if hasattr(path_type, '__fspath__'):
+ raise
+
+ raise TypeError("expected str, bytes or os.PathLike object, not "
+ + path_type.__name__)
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
index 01404ff..f52de28 100644
--- a/Lib/test/test_os.py
+++ b/Lib/test/test_os.py
@@ -3095,5 +3095,26 @@ class TestScandir(unittest.TestCase):
del iterator
+class TestPEP519(unittest.TestCase):
+ "os.fspath()"
+
+ def test_return_bytes(self):
+ for b in b'hello', b'goodbye', b'some/path/and/file':
+ self.assertEqual(b, os.fspath(b))
+
+ def test_return_string(self):
+ for s in 'hello', 'goodbye', 'some/path/and/file':
+ self.assertEqual(s, os.fspath(s))
+
+ def test_garbage_in_exception_out(self):
+ vapor = type('blah', (), {})
+ for o in int, type, os, vapor():
+ self.assertRaises(TypeError, os.fspath, o)
+
+ def test_argument_required(self):
+ with self.assertRaises(TypeError):
+ os.fspath()
+
+
if __name__ == "__main__":
unittest.main()