#9018: os.path.normcase() now raises a TypeError if the argument is not str or bytes.

This commit is contained in:
Ezio Melotti 2010-06-25 10:56:11 +00:00
parent 6186bfb735
commit 5a3ef5b22a
7 changed files with 27 additions and 7 deletions

View file

@ -201,6 +201,7 @@ applications should use string objects to access all files.
Normalize the case of a pathname. On Unix and Mac OS X, this returns the Normalize the case of a pathname. On Unix and Mac OS X, this returns the
path unchanged; on case-insensitive filesystems, it converts the path to path unchanged; on case-insensitive filesystems, it converts the path to
lowercase. On Windows, it also converts forward slashes to backward slashes. lowercase. On Windows, it also converts forward slashes to backward slashes.
Raise a TypeError if the type of *path* is not ``str`` or ``bytes``.
.. function:: normpath(path) .. function:: normpath(path)

View file

@ -32,6 +32,9 @@ def _get_colon(path):
# Normalize the case of a pathname. Dummy in Posix, but <s>.lower() here. # Normalize the case of a pathname. Dummy in Posix, but <s>.lower() here.
def normcase(path): def normcase(path):
if not isinstance(path, (bytes, str)):
raise TypeError("normcase() argument must be str or bytes, "
"not '{}'".format(path.__class__.__name__))
return path.lower() return path.lower()

View file

@ -78,6 +78,9 @@ def normcase(s):
"""Normalize case of pathname. """Normalize case of pathname.
Makes all characters lowercase and all slashes into backslashes.""" Makes all characters lowercase and all slashes into backslashes."""
if not isinstance(s, (bytes, str)):
raise TypeError("normcase() argument must be str or bytes, "
"not '{}'".format(s.__class__.__name__))
return s.replace(_get_altsep(s), _get_sep(s)).lower() return s.replace(_get_altsep(s), _get_sep(s)).lower()

View file

@ -36,6 +36,9 @@ def normcase(s):
"""Normalize case of pathname. """Normalize case of pathname.
Makes all characters lowercase and all altseps into seps.""" Makes all characters lowercase and all altseps into seps."""
if not isinstance(s, (bytes, str)):
raise TypeError("normcase() argument must be str or bytes, "
"not '{}'".format(s.__class__.__name__))
return s.replace('\\', '/').lower() return s.replace('\\', '/').lower()

View file

@ -49,6 +49,9 @@ def _get_sep(path):
def normcase(s): def normcase(s):
"""Normalize case of pathname. Has no effect under Posix""" """Normalize case of pathname. Has no effect under Posix"""
# TODO: on Mac OS X, this should really return s.lower(). # TODO: on Mac OS X, this should really return s.lower().
if not isinstance(s, (bytes, str)):
raise TypeError("normcase() argument must be str or bytes, "
"not '{}'".format(s.__class__.__name__))
return s return s

View file

@ -194,14 +194,18 @@ class CommonTest(GenericTest):
] ]
def test_normcase(self): def test_normcase(self):
# Check that normcase() is idempotent normcase = self.pathmodule.normcase
p = "FoO/./BaR" # check that normcase() is idempotent
p = self.pathmodule.normcase(p) for p in ["FoO/./BaR", b"FoO/./BaR"]:
self.assertEqual(p, self.pathmodule.normcase(p)) p = normcase(p)
self.assertEqual(p, normcase(p))
p = b"FoO/./BaR" self.assertEqual(normcase(''), '')
p = self.pathmodule.normcase(p) self.assertEqual(normcase(b''), b'')
self.assertEqual(p, self.pathmodule.normcase(p))
# check that normcase raises a TypeError for invalid types
for path in (None, True, 0, 2.5, [], bytearray(b''), {'o','o'}):
self.assertRaises(TypeError, normcase, path)
def test_splitdrive(self): def test_splitdrive(self):
# splitdrive for non-NT paths # splitdrive for non-NT paths

View file

@ -454,6 +454,9 @@ C-API
Library Library
------- -------
- Issue #9018: os.path.normcase() now raises a TypeError if the argument is
not ``str`` or ``bytes``.
- Issue #9075: In the ssl module, remove the setting of a ``debug`` flag - Issue #9075: In the ssl module, remove the setting of a ``debug`` flag
on an OpenSSL structure. on an OpenSSL structure.