From 5555ded3d4fa12ec96cf25e6c22f2f560e90e3f9 Mon Sep 17 00:00:00 2001 From: Eric Guo Date: Fri, 17 Jan 2014 21:34:39 +0800 Subject: [PATCH] Use six.string_types instead of basestring basestring only exists in Python 2. Use six.string_types to make code Python 3 compatible. See http://pythonhosted.org/six/#six.string_types Part of blueprint keystone-py3kcompat Change-Id: I5022259cfd648ba2680aabbb0fbc403f10c5dc7e --- keystone/assignment/controllers.py | 4 +++- keystone/clean.py | 5 ++++- keystone/common/controller.py | 4 +++- keystone/common/serializer.py | 6 ++++-- .../versions/010_normalize_identity_migration.py | 5 ++++- keystone/common/utils.py | 5 +++-- keystone/common/wsgi.py | 2 +- keystone/contrib/oauth1/validator.py | 4 +++- keystone/tests/core.py | 3 ++- keystone/tests/test_v3.py | 3 ++- keystone/token/backends/kvs.py | 4 +++- keystone/token/providers/common.py | 8 +++++--- keystone/trust/controllers.py | 4 +++- 13 files changed, 40 insertions(+), 17 deletions(-) diff --git a/keystone/assignment/controllers.py b/keystone/assignment/controllers.py index 5683e06f20..55a297fee6 100644 --- a/keystone/assignment/controllers.py +++ b/keystone/assignment/controllers.py @@ -22,6 +22,8 @@ import urllib import urlparse import uuid +import six + from keystone.common import controller from keystone.common import dependency from keystone import config @@ -828,7 +830,7 @@ class RoleAssignmentV3(controller.V3Controller): """ - if (isinstance(filter_value, basestring) and + if (isinstance(filter_value, six.string_types) and filter_value == '0'): val = False else: diff --git a/keystone/clean.py b/keystone/clean.py index bac4923e3e..eef20d4c9e 100644 --- a/keystone/clean.py +++ b/keystone/clean.py @@ -14,6 +14,8 @@ # License for the specific language governing permissions and limitations # under the License. +import six + from keystone import exception @@ -50,7 +52,8 @@ def check_enabled(property_name, enabled): def check_name(property_name, name, min_length=1, max_length=64): - check_type('%s name' % property_name, name, basestring, 'str or unicode') + check_type('%s name' % property_name, name, six.string_types, + 'str or unicode') name = name.strip() check_length('%s name' % property_name, name, min_length=min_length, max_length=max_length) diff --git a/keystone/common/controller.py b/keystone/common/controller.py index 88c3afd1a8..4832532a3b 100644 --- a/keystone/common/controller.py +++ b/keystone/common/controller.py @@ -18,6 +18,8 @@ import collections import functools import uuid +import six + from keystone.common import dependency from keystone.common import wsgi from keystone import config @@ -317,7 +319,7 @@ class V3Controller(wsgi.Application): """ if type(ref_attr) is bool: - if (isinstance(val_attr, basestring) and + if (isinstance(val_attr, six.string_types) and val_attr == '0'): val = False else: diff --git a/keystone/common/serializer.py b/keystone/common/serializer.py index 367551e647..156bd0afcb 100644 --- a/keystone/common/serializer.py +++ b/keystone/common/serializer.py @@ -25,6 +25,8 @@ by convention, with a few hardcoded exceptions. from lxml import etree import re +import six + DOCTYPE = '' XMLNS = 'http://docs.openstack.org/identity/api/v2.0' @@ -313,7 +315,7 @@ class XmlSerializer(object): self.populate_element(child, item) element.append(child) - elif isinstance(value, basestring): + elif isinstance(value, six.string_types): element.text = unicode(value) def _populate_sequence(self, element, l): @@ -339,7 +341,7 @@ class XmlSerializer(object): self._populate_list(element, k, v) elif isinstance(v, bool): self._populate_bool(element, k, v) - elif isinstance(v, basestring): + elif isinstance(v, six.string_types): self._populate_str(element, k, v) elif type(v) in [int, float, long, complex]: self._populate_number(element, k, v) diff --git a/keystone/common/sql/migrate_repo/versions/010_normalize_identity_migration.py b/keystone/common/sql/migrate_repo/versions/010_normalize_identity_migration.py index 4f0199de90..9c7485b0c7 100644 --- a/keystone/common/sql/migrate_repo/versions/010_normalize_identity_migration.py +++ b/keystone/common/sql/migrate_repo/versions/010_normalize_identity_migration.py @@ -16,6 +16,8 @@ import json +import six + from sqlalchemy import MetaData, Table from sqlalchemy.orm import sessionmaker @@ -27,7 +29,8 @@ def is_enabled(enabled): # no explicit value means enabled if enabled is True or enabled is None: return True - if isinstance(enabled, basestring) and enabled.lower() in DISABLED_VALUES: + if (isinstance(enabled, six.string_types) + and enabled.lower() in DISABLED_VALUES): return False return bool(enabled) diff --git a/keystone/common/utils.py b/keystone/common/utils.py index 8e4e4d879b..3f03421f09 100644 --- a/keystone/common/utils.py +++ b/keystone/common/utils.py @@ -26,6 +26,7 @@ import os import pwd import passlib.hash +import six from keystone.common import config from keystone.common import environment @@ -330,7 +331,7 @@ def get_unix_user(user=None): :return: tuple of (uid, name) ''' - if isinstance(user, basestring): + if isinstance(user, six.string_types): try: user_info = pwd.getpwnam(user) except KeyError: @@ -386,7 +387,7 @@ def get_unix_group(group=None): :return: tuple of (gid, name) ''' - if isinstance(group, basestring): + if isinstance(group, six.string_types): try: group_info = grp.getgrnam(group) except KeyError: diff --git a/keystone/common/wsgi.py b/keystone/common/wsgi.py index d2403fd867..399beb37f5 100644 --- a/keystone/common/wsgi.py +++ b/keystone/common/wsgi.py @@ -231,7 +231,7 @@ class Application(BaseApplication): if result is None: return render_response(status=(204, 'No Content')) - elif isinstance(result, basestring): + elif isinstance(result, six.string_types): return result elif isinstance(result, webob.Response): return result diff --git a/keystone/contrib/oauth1/validator.py b/keystone/contrib/oauth1/validator.py index 37a5ef0188..8a98a5dde5 100644 --- a/keystone/contrib/oauth1/validator.py +++ b/keystone/contrib/oauth1/validator.py @@ -16,6 +16,8 @@ """oAuthlib request validator.""" +import six + from keystone.common import dependency from keystone.contrib.oauth1 import core as oauth1 from keystone import exception @@ -151,7 +153,7 @@ class OAuthValidator(oauth1.RequestValidator): def verify_request_token(self, token, request): # there aren't strong expectations on the request token format - return isinstance(token, basestring) + return isinstance(token, six.string_types) def verify_realms(self, token, realms, request): return True diff --git a/keystone/tests/core.py b/keystone/tests/core.py index 82744a946c..f9fb37b3f9 100644 --- a/keystone/tests/core.py +++ b/keystone/tests/core.py @@ -28,6 +28,7 @@ import warnings import fixtures import logging from paste import deploy +import six import testtools from testtools import testcase @@ -471,7 +472,7 @@ class TestCase(testtools.TestCase): try: callable_obj(*args, **kwargs) except expected_exception as exc_value: - if isinstance(expected_regexp, basestring): + if isinstance(expected_regexp, six.string_types): expected_regexp = re.compile(expected_regexp) if isinstance(exc_value.args[0], gettextutils.Message): diff --git a/keystone/tests/test_v3.py b/keystone/tests/test_v3.py index de875c3412..7a6fd3b3cd 100644 --- a/keystone/tests/test_v3.py +++ b/keystone/tests/test_v3.py @@ -18,6 +18,7 @@ import datetime import uuid from lxml import etree +import six from keystone import auth from keystone.common import cache @@ -250,7 +251,7 @@ class RestfulTestCase(rest.RestfulTestCase): ref['impersonation'] = impersonation or False ref['project_id'] = project_id - if isinstance(expires, basestring): + if isinstance(expires, six.string_types): ref['expires_at'] = expires elif isinstance(expires, dict): ref['expires_at'] = timeutils.strtime( diff --git a/keystone/token/backends/kvs.py b/keystone/token/backends/kvs.py index dbbf4f3321..5eb4040d42 100644 --- a/keystone/token/backends/kvs.py +++ b/keystone/token/backends/kvs.py @@ -18,6 +18,8 @@ from __future__ import absolute_import import copy +import six + from keystone.common import kvs from keystone import config from keystone import exception @@ -192,7 +194,7 @@ class Token(token.Driver): current_time = self._get_current_time() expires = data['expires'] - if isinstance(expires, basestring): + if isinstance(expires, six.string_types): expires = timeutils.parse_isotime(expires) expires = timeutils.normalize_time(expires) diff --git a/keystone/token/providers/common.py b/keystone/token/providers/common.py index 233c613e91..17a00bc163 100644 --- a/keystone/token/providers/common.py +++ b/keystone/token/providers/common.py @@ -17,6 +17,8 @@ import json import sys +import six + from keystone.common import dependency from keystone import config from keystone import exception @@ -288,7 +290,7 @@ class V3TokenDataHelper(object): def _populate_token_dates(self, token_data, expires=None, trust=None): if not expires: expires = token.default_expire_time() - if not isinstance(expires, basestring): + if not isinstance(expires, six.string_types): expires = timeutils.isotime(expires, subsecond=True) token_data['expires_at'] = expires token_data['issued_at'] = timeutils.isotime(subsecond=True) @@ -359,7 +361,7 @@ class BaseProvider(provider.Provider): token_data['access']['token']['id'] = token_id try: expiry = token_data['access']['token']['expires'] - if isinstance(expiry, basestring): + if isinstance(expiry, six.string_types): expiry = timeutils.normalize_time( timeutils.parse_isotime(expiry)) data = dict(key=token_id, @@ -415,7 +417,7 @@ class BaseProvider(provider.Provider): token_id = self._get_token_id(token_data) try: expiry = token_data['token']['expires_at'] - if isinstance(expiry, basestring): + if isinstance(expiry, six.string_types): expiry = timeutils.normalize_time( timeutils.parse_isotime(expiry)) # FIXME(gyee): is there really a need to store roles in metadata? diff --git a/keystone/trust/controllers.py b/keystone/trust/controllers.py index 6026c192c2..79bf345078 100644 --- a/keystone/trust/controllers.py +++ b/keystone/trust/controllers.py @@ -16,6 +16,8 @@ import uuid +import six + from keystone import assignment from keystone.common import controller from keystone.common import dependency @@ -94,7 +96,7 @@ class TrustV3(controller.V3Controller): trust['roles'] = [] trust_full_roles = [] for trust_role in trust['roles']: - if isinstance(trust_role, basestring): + if isinstance(trust_role, six.string_types): trust_role = {'id': trust_role} matching_roles = [x for x in all_roles if x['id'] == trust_role['id']]