add support for Python's bool type to xmlrpclib - patch # 559288
authorSkip Montanaro <skip@pobox.com>
Wed, 22 Jan 2003 18:17:25 +0000 (18:17 +0000)
committerSkip Montanaro <skip@pobox.com>
Wed, 22 Jan 2003 18:17:25 +0000 (18:17 +0000)
Lib/xmlrpclib.py
Misc/NEWS

index 5ef1cf9300ccc2ff80b1530d284f995a4a420a7e..0cb9ba62c78ec61c7db50d38732f03283168d69f 100644 (file)
@@ -142,6 +142,11 @@ try:
 except NameError:
     unicode = None # unicode support not available
 
+try:
+    _bool_is_builtin = False.__class__.__name__ == "bool"
+except NameError:
+    _bool_is_builtin = 0
+
 def _decode(data, encoding, is8bit=re.compile("[\x80-\xff]").search):
     # decode non-ascii string (if possible)
     if unicode and encoding and is8bit(data):
@@ -266,51 +271,56 @@ class Fault(Error):
 # @param value A boolean value.  Any true value is interpreted as True,
 #              all other values are interpreted as False.
 
-class Boolean:
-    """Boolean-value wrapper.
+if _bool_is_builtin:
+    boolean = Boolean = bool
+    # to avoid breaking code which references xmlrpclib.{True,False}
+    True, False = True, False
+else:
+    class Boolean:
+        """Boolean-value wrapper.
 
-    Use True or False to generate a "boolean" XML-RPC value.
-    """
+        Use True or False to generate a "boolean" XML-RPC value.
+        """
 
-    def __init__(self, value = 0):
-        self.value = operator.truth(value)
+        def __init__(self, value = 0):
+            self.value = operator.truth(value)
 
-    def encode(self, out):
-        out.write("<value><boolean>%d</boolean></value>\n" % self.value)
+        def encode(self, out):
+            out.write("<value><boolean>%d</boolean></value>\n" % self.value)
 
-    def __cmp__(self, other):
-        if isinstance(other, Boolean):
-            other = other.value
-        return cmp(self.value, other)
+        def __cmp__(self, other):
+            if isinstance(other, Boolean):
+                other = other.value
+            return cmp(self.value, other)
 
-    def __repr__(self):
-        if self.value:
-            return "<Boolean True at %x>" % id(self)
-        else:
-            return "<Boolean False at %x>" % id(self)
+        def __repr__(self):
+            if self.value:
+                return "<Boolean True at %x>" % id(self)
+            else:
+                return "<Boolean False at %x>" % id(self)
 
-    def __int__(self):
-        return self.value
+        def __int__(self):
+            return self.value
 
-    def __nonzero__(self):
-        return self.value
+        def __nonzero__(self):
+            return self.value
 
-True, False = Boolean(1), Boolean(0)
+    True, False = Boolean(1), Boolean(0)
 
-##
-# Map true or false value to XML-RPC boolean values.
-#
-# @def boolean(value)
-# @param value A boolean value.  Any true value is mapped to True,
-#              all other values are mapped to False.
-# @return xmlrpclib.True or xmlrpclib.False.
-# @see Boolean
-# @see True
-# @see False
-
-def boolean(value, _truefalse=(False, True)):
-    """Convert any Python value to XML-RPC 'boolean'."""
-    return _truefalse[operator.truth(value)]
+    ##
+    # Map true or false value to XML-RPC boolean values.
+    #
+    # @def boolean(value)
+    # @param value A boolean value.  Any true value is mapped to True,
+    #              all other values are mapped to False.
+    # @return xmlrpclib.True or xmlrpclib.False.
+    # @see Boolean
+    # @see True
+    # @see False
+
+    def boolean(value, _truefalse=(False, True)):
+        """Convert any Python value to XML-RPC 'boolean'."""
+        return _truefalse[operator.truth(value)]
 
 ##
 # Wrapper for XML-RPC DateTime values.  This converts a time value to
@@ -411,7 +421,9 @@ def _binary(data):
     value.decode(data)
     return value
 
-WRAPPERS = DateTime, Binary, Boolean
+WRAPPERS = (DateTime, Binary)
+if not _bool_is_builtin:
+    WRAPPERS = WRAPPERS + (Boolean,)
 
 # --------------------------------------------------------------------
 # XML parsers
@@ -599,6 +611,13 @@ class Marshaller:
         write("</int></value>\n")
     dispatch[IntType] = dump_int
 
+    if _bool_is_builtin:
+        def dump_bool(self, value, write):
+            write("<value><boolean>")
+            write(value and "1" or "0")
+            write("</boolean></value>\n")
+        dispatch[bool] = dump_bool
+
     def dump_long(self, value, write):
         if value > MAXINT or value < MININT:
             raise OverflowError, "long int exceeds XML-RPC limits"
index 0d49bf8294a6f0a70db5694bc54b54e17d2a3e8e..780bf5ab7bec39d4e8cb49d0924b8dbe44991532 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -94,6 +94,8 @@ Extension modules
 Library
 -------
 
+- Xmlrpclib.py now supports the builtin boolean type.
+
 - py_compile has a new 'doraise' flag and a new PyCompileError
   exception.