add support for Python's bool type to xmlrpclib - patch # 559288

This commit is contained in:
Skip Montanaro 2003-01-22 18:17:25 +00:00
parent 32417e7dc1
commit 9a7c96a2bc
2 changed files with 57 additions and 36 deletions

View File

@ -142,6 +142,11 @@ try:
except NameError: except NameError:
unicode = None # unicode support not available 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): def _decode(data, encoding, is8bit=re.compile("[\x80-\xff]").search):
# decode non-ascii string (if possible) # decode non-ascii string (if possible)
if unicode and encoding and is8bit(data): 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, # @param value A boolean value. Any true value is interpreted as True,
# all other values are interpreted as False. # all other values are interpreted as False.
class Boolean: if _bool_is_builtin:
"""Boolean-value wrapper. 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): def __init__(self, value = 0):
self.value = operator.truth(value) self.value = operator.truth(value)
def encode(self, out): def encode(self, out):
out.write("<value><boolean>%d</boolean></value>\n" % self.value) out.write("<value><boolean>%d</boolean></value>\n" % self.value)
def __cmp__(self, other): def __cmp__(self, other):
if isinstance(other, Boolean): if isinstance(other, Boolean):
other = other.value other = other.value
return cmp(self.value, other) return cmp(self.value, other)
def __repr__(self): def __repr__(self):
if self.value: if self.value:
return "<Boolean True at %x>" % id(self) return "<Boolean True at %x>" % id(self)
else: else:
return "<Boolean False at %x>" % id(self) return "<Boolean False at %x>" % id(self)
def __int__(self): def __int__(self):
return self.value return self.value
def __nonzero__(self): def __nonzero__(self):
return self.value 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. # Map true or false value to XML-RPC boolean values.
# #
# @def boolean(value) # @def boolean(value)
# @param value A boolean value. Any true value is mapped to True, # @param value A boolean value. Any true value is mapped to True,
# all other values are mapped to False. # all other values are mapped to False.
# @return xmlrpclib.True or xmlrpclib.False. # @return xmlrpclib.True or xmlrpclib.False.
# @see Boolean # @see Boolean
# @see True # @see True
# @see False # @see False
def boolean(value, _truefalse=(False, True)): def boolean(value, _truefalse=(False, True)):
"""Convert any Python value to XML-RPC 'boolean'.""" """Convert any Python value to XML-RPC 'boolean'."""
return _truefalse[operator.truth(value)] return _truefalse[operator.truth(value)]
## ##
# Wrapper for XML-RPC DateTime values. This converts a time value to # Wrapper for XML-RPC DateTime values. This converts a time value to
@ -411,7 +421,9 @@ def _binary(data):
value.decode(data) value.decode(data)
return value return value
WRAPPERS = DateTime, Binary, Boolean WRAPPERS = (DateTime, Binary)
if not _bool_is_builtin:
WRAPPERS = WRAPPERS + (Boolean,)
# -------------------------------------------------------------------- # --------------------------------------------------------------------
# XML parsers # XML parsers
@ -599,6 +611,13 @@ class Marshaller:
write("</int></value>\n") write("</int></value>\n")
dispatch[IntType] = dump_int 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): def dump_long(self, value, write):
if value > MAXINT or value < MININT: if value > MAXINT or value < MININT:
raise OverflowError, "long int exceeds XML-RPC limits" raise OverflowError, "long int exceeds XML-RPC limits"

View File

@ -94,6 +94,8 @@ Extension modules
Library Library
------- -------
- Xmlrpclib.py now supports the builtin boolean type.
- py_compile has a new 'doraise' flag and a new PyCompileError - py_compile has a new 'doraise' flag and a new PyCompileError
exception. exception.