]> granicus.if.org Git - python/commitdiff
Issue 22189: Add missing methods to UserString
authorRaymond Hettinger <python@rcn.com>
Fri, 22 May 2015 23:56:32 +0000 (16:56 -0700)
committerRaymond Hettinger <python@rcn.com>
Fri, 22 May 2015 23:56:32 +0000 (16:56 -0700)
Lib/collections/__init__.py
Lib/test/test_collections.py
Misc/NEWS

index 9fd3532158c876e706fc097a60534006ea9e49ab..fc60e13daad034ecd33e667e2bfdb444a7d09007 100644 (file)
@@ -1060,6 +1060,8 @@ class UserString(Sequence):
     def __float__(self): return float(self.data)
     def __complex__(self): return complex(self.data)
     def __hash__(self): return hash(self.data)
+    def __getnewargs__(self):
+        return (self.data[:],)
 
     def __eq__(self, string):
         if isinstance(string, UserString):
@@ -1104,9 +1106,13 @@ class UserString(Sequence):
     __rmul__ = __mul__
     def __mod__(self, args):
         return self.__class__(self.data % args)
+    def __rmod__(self, format):
+        return self.__class__(format % args)
 
     # the following methods are defined in alphabetical order:
     def capitalize(self): return self.__class__(self.data.capitalize())
+    def casefold(self):
+        return self.__class__(self.data.casefold())
     def center(self, width, *args):
         return self.__class__(self.data.center(width, *args))
     def count(self, sub, start=0, end=_sys.maxsize):
@@ -1129,6 +1135,8 @@ class UserString(Sequence):
         return self.data.find(sub, start, end)
     def format(self, *args, **kwds):
         return self.data.format(*args, **kwds)
+    def format_map(self, mapping):
+        return self.data.format_map(mapping)
     def index(self, sub, start=0, end=_sys.maxsize):
         return self.data.index(sub, start, end)
     def isalpha(self): return self.data.isalpha()
@@ -1138,6 +1146,7 @@ class UserString(Sequence):
     def isidentifier(self): return self.data.isidentifier()
     def islower(self): return self.data.islower()
     def isnumeric(self): return self.data.isnumeric()
+    def isprintable(self): return self.data.isprintable()
     def isspace(self): return self.data.isspace()
     def istitle(self): return self.data.istitle()
     def isupper(self): return self.data.isupper()
@@ -1146,6 +1155,7 @@ class UserString(Sequence):
         return self.__class__(self.data.ljust(width, *args))
     def lower(self): return self.__class__(self.data.lower())
     def lstrip(self, chars=None): return self.__class__(self.data.lstrip(chars))
+    maketrans = str.maketrans
     def partition(self, sep):
         return self.data.partition(sep)
     def replace(self, old, new, maxsplit=-1):
index d96eae7458945f052d2b0c62963fe489cf397dd2..a15651fd7d2b54fbabb95c98236ea2357266fd45 100644 (file)
@@ -12,7 +12,7 @@ import keyword
 import re
 import sys
 import types
-from collections import UserDict
+from collections import UserDict, UserString, UserList
 from collections import ChainMap
 from collections import deque
 from collections.abc import Awaitable, Coroutine, AsyncIterator, AsyncIterable
@@ -24,6 +24,26 @@ from collections.abc import Sequence, MutableSequence
 from collections.abc import ByteString
 
 
+class TestUserObjects(unittest.TestCase):
+    def _superset_test(self, a, b):
+        self.assertGreaterEqual(
+            set(dir(a)),
+            set(dir(b)),
+            '{a} should have all the methods of {b}'.format(
+                a=a.__name__,
+                b=b.__name__,
+            ),
+        )
+    def test_str_protocol(self):
+        self._superset_test(UserString, str)
+
+    def test_list_protocol(self):
+        self._superset_test(UserList, list)
+
+    def test_dict_protocol(self):
+        self._superset_test(UserDict, dict)
+
+
 ################################################################################
 ### ChainMap (helper class for configparser and the string module)
 ################################################################################
@@ -1848,7 +1868,8 @@ def test_main(verbose=None):
     NamedTupleDocs = doctest.DocTestSuite(module=collections)
     test_classes = [TestNamedTuple, NamedTupleDocs, TestOneTrickPonyABCs,
                     TestCollectionABCs, TestCounter, TestChainMap,
-                    TestOrderedDict, GeneralMappingTests, SubclassMappingTests]
+                    TestOrderedDict, GeneralMappingTests, SubclassMappingTests,
+                    TestUserObjects]
     support.run_unittest(*test_classes)
     support.run_doctest(collections, verbose)
 
index 918c6a4d96f8db09f98f02434f27acce7b0017fa..02ce0e77667f2cd00ef72aa67b50f1edfa4af575 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -64,6 +64,10 @@ Library
 - Issue 24230: The tempfile module now accepts bytes for prefix, suffix and dir
   parameters and returns bytes in such situations (matching the os module APIs).
 
+- Issue #22189: collections.UserString now supports __getnewargs__(),
+  __rmod__(), casefold(), format_map(), isprintable(), and maketrans().
+  Patch by Joe Jevnik.
+
 - Issue 24244: Prevents termination when an invalid format string is
   encountered on Windows in strftime.