From 9a7c96a2bca4342f70b05f5d1e00ad5be142bf24 Mon Sep 17 00:00:00 2001 From: Skip Montanaro Date: Wed, 22 Jan 2003 18:17:25 +0000 Subject: add support for Python's bool type to xmlrpclib - patch # 559288 --- Lib/xmlrpclib.py | 93 ++++++++++++++++++++++++++++++++++---------------------- Misc/NEWS | 2 ++ 2 files changed, 58 insertions(+), 37 deletions(-) diff --git a/Lib/xmlrpclib.py b/Lib/xmlrpclib.py index 5ef1cf9..0cb9ba6 100644 --- a/Lib/xmlrpclib.py +++ b/Lib/xmlrpclib.py @@ -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("%d\n" % self.value) + def encode(self, out): + out.write("%d\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 "" % id(self) - else: - return "" % id(self) + def __repr__(self): + if self.value: + return "" % id(self) + else: + return "" % 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("\n") dispatch[IntType] = dump_int + if _bool_is_builtin: + def dump_bool(self, value, write): + write("") + write(value and "1" or "0") + write("\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" diff --git a/Misc/NEWS b/Misc/NEWS index 0d49bf8..780bf5a 100644 --- 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. -- cgit v0.12