]> granicus.if.org Git - python/commitdiff
#3426: os.path.abspath now returns unicode when its arg is unicode.
authorEzio Melotti <ezio.melotti@gmail.com>
Sat, 20 Feb 2010 08:09:39 +0000 (08:09 +0000)
committerEzio Melotti <ezio.melotti@gmail.com>
Sat, 20 Feb 2010 08:09:39 +0000 (08:09 +0000)
Lib/macpath.py
Lib/ntpath.py
Lib/os2emxpath.py
Lib/posixpath.py
Lib/test/test_macpath.py
Lib/test/test_ntpath.py
Lib/test/test_posixpath.py
Misc/NEWS

index 14e49a312e66054bd5f055969793b0c352f2ca92..15714c6c2cd55ed9d68cd6dca80a8c736db22430 100644 (file)
@@ -186,7 +186,11 @@ def walk(top, func, arg):
 def abspath(path):
     """Return an absolute path."""
     if not isabs(path):
-        path = join(os.getcwd(), path)
+        if isinstance(path, unicode):
+            cwd = os.getcwdu()
+        else:
+            cwd = os.getcwd()
+        path = join(cwd, path)
     return normpath(path)
 
 # realpath is a no-op on systems without islink support
index 02d8584736dea686276e668f66432c35bfecab87..a124dfd0c4343344740248102b023919528ef035 100644 (file)
@@ -449,7 +449,11 @@ except ImportError: # not running on Windows - mock up something sensible
     def abspath(path):
         """Return the absolute version of a path."""
         if not isabs(path):
-            path = join(os.getcwd(), path)
+            if isinstance(path, unicode):
+                cwd = os.getcwdu()
+            else:
+                cwd = os.getcwd()
+            path = join(cwd, path)
         return normpath(path)
 
 else:  # use native Windows method on Windows
@@ -461,6 +465,8 @@ else:  # use native Windows method on Windows
                 path = _getfullpathname(path)
             except WindowsError:
                 pass # Bad path - return unchanged.
+        elif isinstance(path, unicode):
+            path = os.getcwdu()
         else:
             path = os.getcwd()
         return normpath(path)
index 4e85c4d48dfc6b79e87dcddae08f61f2f9d0a075..1bed51d4fabbce40cefbba6e66f7add74a9d401c 100644 (file)
@@ -146,7 +146,11 @@ def normpath(path):
 def abspath(path):
     """Return the absolute version of a path"""
     if not isabs(path):
-        path = join(os.getcwd(), path)
+        if isinstance(path, unicode):
+            cwd = os.getcwdu()
+        else:
+            cwd = os.getcwd()
+        path = join(cwd, path)
     return normpath(path)
 
 # realpath is a no-op on systems without islink support
index 6be031b3427071e1727f46bffa72c1146b554bb2..b6438bdf674fe16cee8cc20eb88e6fa463ad87f9 100644 (file)
@@ -337,7 +337,11 @@ def normpath(path):
 def abspath(path):
     """Return an absolute path."""
     if not isabs(path):
-        path = join(os.getcwd(), path)
+        if isinstance(path, unicode):
+            cwd = os.getcwdu()
+        else:
+            cwd = os.getcwd()
+        path = join(cwd, path)
     return normpath(path)
 
 
index 4541eb9380a76fdaed807741aefdcdd5c1a8af1e..ff8da108c94606fee8344b5ceaea442c9fecc62a 100644 (file)
@@ -8,6 +8,16 @@ class MacPathTestCase(unittest.TestCase):
     def test_abspath(self):
         self.assertTrue(macpath.abspath("xx:yy") == "xx:yy")
 
+        # Issue 3426: check that abspath retuns unicode when the arg is unicode
+        # and str when it's str, with both ASCII and non-ASCII cwds
+        for cwd in (u'cwd', u'\xe7w\xf0'):
+            with test_support.temp_cwd(cwd):
+                for path in ('', 'foo', 'f\xf2\xf2', '/foo', 'C:\\'):
+                    self.assertIsInstance(macpath.abspath(path), str)
+                for upath in (u'', u'fuu', u'f\xf9\xf9', u'/fuu', u'U:\\'):
+                    self.assertIsInstance(macpath.abspath(upath), unicode)
+
+
     def test_isabs(self):
         isabs = macpath.isabs
         self.assertTrue(isabs("xx:yy"))
index 9e9b6ed8cabbd933fbbe5026bb02c39507108ef8..f5bc9520c84b8f505551b7e032125dc14197a0fe 100644 (file)
@@ -160,13 +160,25 @@ class TestNtpath(unittest.TestCase):
         # the rest of the tests for the ntpath module to be run to completion
         # on any platform, since most of the module is intended to be usable
         # from any platform.
+        # XXX this needs more tests
         try:
             import nt
         except ImportError:
-            pass
+            # check that the function is there even if we are not on Windows
+            ntpath.abspath
         else:
             tester('ntpath.abspath("C:\\")', "C:\\")
 
+            # Issue 3426: check that abspath retuns unicode when the arg is
+            # unicode and str when it's str, with both ASCII and non-ASCII cwds
+            for cwd in (u'cwd', u'\xe7w\xf0'):
+                with test_support.temp_cwd(cwd):
+                    for path in ('', 'foo', 'f\xf2\xf2', '/foo', 'C:\\'):
+                        self.assertIsInstance(ntpath.abspath(path), str)
+                    for upath in (u'', u'fuu', u'f\xf9\xf9', u'/fuu', u'U:\\'):
+                        self.assertIsInstance(ntpath.abspath(upath), unicode)
+
+
     def test_relpath(self):
         currentdir = os.path.split(os.getcwd())[-1]
         tester('ntpath.relpath("a")', 'a')
index 60a043c5f1264e5ba84cce60ef4389cfc7578d73..2315b256033cfa3d07f2e7f16656053a8773bfd3 100644 (file)
@@ -386,6 +386,15 @@ class PosixPathTest(unittest.TestCase):
     def test_abspath(self):
         self.assertTrue("foo" in posixpath.abspath("foo"))
 
+        # Issue 3426: check that abspath retuns unicode when the arg is unicode
+        # and str when it's str, with both ASCII and non-ASCII cwds
+        for cwd in (u'cwd', u'\xe7w\xf0'):
+            with test_support.temp_cwd(cwd):
+                for path in ('', 'foo', 'f\xf2\xf2', '/foo', 'C:\\'):
+                    self.assertIsInstance(posixpath.abspath(path), str)
+                for upath in (u'', u'fuu', u'f\xf9\xf9', u'/fuu', u'U:\\'):
+                    self.assertIsInstance(posixpath.abspath(upath), unicode)
+
         self.assertRaises(TypeError, posixpath.abspath)
 
     def test_realpath(self):
index b548a9164e1598d8499093747fd2b1a120330146..6d7ba8a225063b4b01da1b3079c98be75fde29d4 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -15,6 +15,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #3426: ``os.path.abspath`` now returns unicode when its arg is unicode.
+
 - Issue #7633: In the decimal module, Context class methods (with the
   exception of canonical and is_canonical) now accept instances of int
   and long wherever a Decimal instance is accepted, and implicitly
@@ -28,7 +30,7 @@ Library
   argument added to the TextTestRunner constructor allowing a different result
   class to be used without having to subclass.
 
-- Issue 7588: ``unittest.TextTestResult.getDescription`` now includes the test
+- Issue #7588: ``unittest.TextTestResult.getDescription`` now includes the test
   name in failure reports even if the test has a docstring.
 
 Extension Modules