From 6af453336ed262910d1d9450cca04d3e6255092b Mon Sep 17 00:00:00 2001 From: Kui Shi Date: Mon, 14 Oct 2013 04:40:34 +0800 Subject: [PATCH] Sync jsonutils from oslo Synce the changes of jsonutils from oslo, following fixes are synced: Ia915f3175bee370d747e362cd9d35d8536c1b7b2 Id1aa7af26b0f5d929337cc373c6a4f802bba2cec Ic94f238a5f92f28ae1b6154fb56f00c4c9fa3283 I8b246f20f9001379fcb5ca3a84aabee3847cb945 Most of them are py33 fixes, and keystoneclient is required by a dozen of projects, we should update it to avoid py33 issue in dependent projects. Closes-Bug #1239602 Change-Id: I65c28896d1551fd537dd7774e87bc479a477a7ab --- keystoneclient/openstack/common/jsonutils.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/keystoneclient/openstack/common/jsonutils.py b/keystoneclient/openstack/common/jsonutils.py index 88088a13..af8c1ffd 100644 --- a/keystoneclient/openstack/common/jsonutils.py +++ b/keystoneclient/openstack/common/jsonutils.py @@ -38,14 +38,19 @@ import functools import inspect import itertools import json -import types -import xmlrpclib +try: + import xmlrpclib +except ImportError: + # NOTE(jd): xmlrpclib is not shipped with Python 3 + xmlrpclib = None -import netaddr import six +from keystoneclient.openstack.common import gettextutils +from keystoneclient.openstack.common import importutils from keystoneclient.openstack.common import timeutils +netaddr = importutils.try_import("netaddr") _nasty_type_tests = [inspect.ismodule, inspect.isclass, inspect.ismethod, inspect.isfunction, inspect.isgeneratorfunction, @@ -53,7 +58,8 @@ _nasty_type_tests = [inspect.ismodule, inspect.isclass, inspect.ismethod, inspect.iscode, inspect.isbuiltin, inspect.isroutine, inspect.isabstract] -_simple_types = (types.NoneType, int, basestring, bool, float, long) +_simple_types = (six.string_types + six.integer_types + + (type(None), bool, float)) def to_primitive(value, convert_instances=False, convert_datetime=True, @@ -125,11 +131,13 @@ def to_primitive(value, convert_instances=False, convert_datetime=True, # It's not clear why xmlrpclib created their own DateTime type, but # for our purposes, make it a datetime type which is explicitly # handled - if isinstance(value, xmlrpclib.DateTime): + if xmlrpclib and isinstance(value, xmlrpclib.DateTime): value = datetime.datetime(*tuple(value.timetuple())[:6]) if convert_datetime and isinstance(value, datetime.datetime): return timeutils.strtime(value) + elif isinstance(value, gettextutils.Message): + return value.data elif hasattr(value, 'iteritems'): return recursive(dict(value.iteritems()), level=level + 1) elif hasattr(value, '__iter__'): @@ -138,7 +146,7 @@ def to_primitive(value, convert_instances=False, convert_datetime=True, # Likely an instance of something. Watch for cycles. # Ignore class member vars. return recursive(value.__dict__, level=level + 1) - elif isinstance(value, netaddr.IPAddress): + elif netaddr and isinstance(value, netaddr.IPAddress): return six.text_type(value) else: if any(test(value) for test in _nasty_type_tests):