mirror of https://github.com/python/cpython
add support for Python's bool type to xmlrpclib - patch # 559288
This commit is contained in:
parent
32417e7dc1
commit
9a7c96a2bc
|
@ -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"
|
||||||
|
|
Loading…
Reference in New Issue