py3: Replace unicode with six.text_type

The unicode type was renamed to str in Python 3. Use six.text_type to
make the modified code compatible with Python 2 and Python 3.

The initial patch was generated by the unicode operation of the sixer
tool on: bin/* swift/ test/.

Change-Id: I9e13748ccde36ee8110756202d55d3ae945d4860
This commit is contained in:
Victor Stinner 2015-10-08 13:08:45 +02:00
parent 6a9b868ae6
commit f2cac20d17
18 changed files with 51 additions and 32 deletions

View File

@ -24,6 +24,7 @@ from hashlib import md5
import itertools import itertools
from eventlet import GreenPool, sleep, Timeout from eventlet import GreenPool, sleep, Timeout
import six
import swift.common.db import swift.common.db
from swift.account.backend import AccountBroker, DATADIR from swift.account.backend import AccountBroker, DATADIR
@ -387,7 +388,7 @@ class AccountReaper(Daemon):
self.logger.error('ERROR: invalid storage policy index: %r' self.logger.error('ERROR: invalid storage policy index: %r'
% policy_index) % policy_index)
for obj in objects: for obj in objects:
if isinstance(obj['name'], unicode): if isinstance(obj['name'], six.text_type):
obj['name'] = obj['name'].encode('utf8') obj['name'] = obj['name'].encode('utf8')
pool.spawn(self.reap_object, account, container, part, pool.spawn(self.reap_object, account, container, part,
nodes, obj['name'], policy_index) nodes, obj['name'], policy_index)

View File

@ -36,6 +36,7 @@ import socket
import eventlet import eventlet
from eventlet.green.httplib import CONTINUE, HTTPConnection, HTTPMessage, \ from eventlet.green.httplib import CONTINUE, HTTPConnection, HTTPMessage, \
HTTPResponse, HTTPSConnection, _UNKNOWN HTTPResponse, HTTPSConnection, _UNKNOWN
import six
httplib = eventlet.import_patched('httplib') httplib = eventlet.import_patched('httplib')
httplib._MAXHEADERS = constraints.MAX_HEADER_COUNT httplib._MAXHEADERS = constraints.MAX_HEADER_COUNT
@ -198,12 +199,12 @@ def http_connect(ipaddr, port, device, partition, method, path,
:param ssl: set True if SSL should be used (default: False) :param ssl: set True if SSL should be used (default: False)
:returns: HTTPConnection object :returns: HTTPConnection object
""" """
if isinstance(path, unicode): if isinstance(path, six.text_type):
try: try:
path = path.encode("utf-8") path = path.encode("utf-8")
except UnicodeError as e: except UnicodeError as e:
logging.exception(_('Error encoding to UTF-8: %s'), str(e)) logging.exception(_('Error encoding to UTF-8: %s'), str(e))
if isinstance(device, unicode): if isinstance(device, six.text_type):
try: try:
device = device.encode("utf-8") device = device.encode("utf-8")
except UnicodeError as e: except UnicodeError as e:

View File

@ -19,6 +19,7 @@ import urllib
import time import time
from urllib import unquote from urllib import unquote
import six
from six.moves.configparser import ConfigParser, NoSectionError, NoOptionError from six.moves.configparser import ConfigParser, NoSectionError, NoOptionError
from swift.common import utils, exceptions from swift.common import utils, exceptions
@ -333,7 +334,7 @@ def check_utf8(string):
if not string: if not string:
return False return False
try: try:
if isinstance(string, unicode): if isinstance(string, six.text_type):
string.encode('utf-8') string.encode('utf-8')
else: else:
decoded = string.decode('UTF-8') decoded = string.decode('UTF-8')
@ -422,7 +423,7 @@ def check_name_format(req, name, target_type):
raise HTTPPreconditionFailed( raise HTTPPreconditionFailed(
request=req, request=req,
body='%s name cannot be empty' % target_type) body='%s name cannot be empty' % target_type)
if isinstance(name, unicode): if isinstance(name, six.text_type):
name = name.encode('utf-8') name = name.encode('utf-8')
if '/' in name: if '/' in name:
raise HTTPPreconditionFailed( raise HTTPPreconditionFailed(

View File

@ -23,6 +23,7 @@ from uuid import uuid4
import sys import sys
import time import time
import errno import errno
import six
import six.moves.cPickle as pickle import six.moves.cPickle as pickle
from swift import gettext_ as _ from swift import gettext_ as _
from tempfile import mkstemp from tempfile import mkstemp
@ -48,11 +49,12 @@ PENDING_CAP = 131072
def utf8encode(*args): def utf8encode(*args):
return [(s.encode('utf8') if isinstance(s, unicode) else s) for s in args] return [(s.encode('utf8') if isinstance(s, six.text_type) else s)
for s in args]
def utf8encodekeys(metadata): def utf8encodekeys(metadata):
uni_keys = [k for k in metadata if isinstance(k, unicode)] uni_keys = [k for k in metadata if isinstance(k, six.text_type)]
for k in uni_keys: for k in uni_keys:
sv = metadata[k] sv = metadata[k]
del metadata[k] del metadata[k]

View File

@ -15,6 +15,7 @@
import os import os
import six
from six.moves.configparser import ConfigParser, NoSectionError, NoOptionError from six.moves.configparser import ConfigParser, NoSectionError, NoOptionError
from hashlib import md5 from hashlib import md5
@ -81,7 +82,7 @@ class GetContext(WSGIContext):
break break
seg_name = segment['name'] seg_name = segment['name']
if isinstance(seg_name, unicode): if isinstance(seg_name, six.text_type):
seg_name = seg_name.encode("utf-8") seg_name = seg_name.encode("utf-8")
# (obj path, etag, size, first byte, last byte) # (obj path, etag, size, first byte, last byte)

View File

@ -355,7 +355,7 @@ class SloGetContext(WSGIContext):
# Restore the first/last state # Restore the first/last state
self.first_byte, self.last_byte = orig_start, orig_end self.first_byte, self.last_byte = orig_start, orig_end
else: else:
if isinstance(seg_dict['name'], unicode): if isinstance(seg_dict['name'], six.text_type):
seg_dict['name'] = seg_dict['name'].encode("utf-8") seg_dict['name'] = seg_dict['name'].encode("utf-8")
yield (seg_dict, yield (seg_dict,
max(0, self.first_byte) + range_start, max(0, self.first_byte) + range_start,
@ -655,7 +655,7 @@ class StaticLargeObject(object):
last_obj_path = None last_obj_path = None
for index, seg_dict in enumerate(parsed_data): for index, seg_dict in enumerate(parsed_data):
obj_name = seg_dict['path'] obj_name = seg_dict['path']
if isinstance(obj_name, unicode): if isinstance(obj_name, six.text_type):
obj_name = obj_name.encode('utf-8') obj_name = obj_name.encode('utf-8')
obj_path = '/'.join(['', vrs, account, obj_name.lstrip('/')]) obj_path = '/'.join(['', vrs, account, obj_name.lstrip('/')])
if req.path == quote(obj_path): if req.path == quote(obj_path):

View File

@ -113,6 +113,7 @@ Disable versioning from a container (x is any value except empty)::
-H "X-Remove-Versions-Location: x" http://<storage_url>/container -H "X-Remove-Versions-Location: x" http://<storage_url>/container
""" """
import six
import time import time
from urllib import quote, unquote from urllib import quote, unquote
from swift.common.utils import get_logger, Timestamp, json, \ from swift.common.utils import get_logger, Timestamp, json, \
@ -412,7 +413,7 @@ class VersionedWritesMiddleware(object):
# for backwards compatibility feature is enabled. # for backwards compatibility feature is enabled.
object_versions = container_info.get( object_versions = container_info.get(
'sysmeta', {}).get('versions-location') 'sysmeta', {}).get('versions-location')
if object_versions and isinstance(object_versions, unicode): if object_versions and isinstance(object_versions, six.text_type):
object_versions = object_versions.encode('utf-8') object_versions = object_versions.encode('utf-8')
elif not object_versions: elif not object_versions:
object_versions = container_info.get('versions') object_versions = container_info.get('versions')

View File

@ -25,6 +25,9 @@ import itertools
import sys import sys
import time import time
from urllib import unquote from urllib import unquote
import six
from swift import gettext_ as _ from swift import gettext_ as _
from swift.common.storage_policy import POLICIES from swift.common.storage_policy import POLICIES
from swift.common.constraints import FORMAT2CONTENT_TYPE from swift.common.constraints import FORMAT2CONTENT_TYPE
@ -51,7 +54,7 @@ def get_param(req, name, default=None):
:raises: HTTPBadRequest if param not valid UTF-8 byte sequence :raises: HTTPBadRequest if param not valid UTF-8 byte sequence
""" """
value = req.params.get(name, default) value = req.params.get(name, default)
if value and not isinstance(value, unicode): if value and not isinstance(value, six.text_type):
try: try:
value.decode('utf8') # Ensure UTF8ness value.decode('utf8') # Ensure UTF8ness
except UnicodeDecodeError: except UnicodeDecodeError:

View File

@ -45,6 +45,7 @@ import random
import functools import functools
import inspect import inspect
import six
from six import BytesIO from six import BytesIO
from six import StringIO from six import StringIO
from six.moves import urllib from six.moves import urllib
@ -248,7 +249,7 @@ class HeaderEnvironProxy(MutableMapping):
def __setitem__(self, key, value): def __setitem__(self, key, value):
if value is None: if value is None:
self.environ.pop(self._normalize(key), None) self.environ.pop(self._normalize(key), None)
elif isinstance(value, unicode): elif isinstance(value, six.text_type):
self.environ[self._normalize(key)] = value.encode('utf-8') self.environ[self._normalize(key)] = value.encode('utf-8')
else: else:
self.environ[self._normalize(key)] = str(value) self.environ[self._normalize(key)] = str(value)
@ -293,7 +294,7 @@ class HeaderKeyDict(dict):
def __setitem__(self, key, value): def __setitem__(self, key, value):
if value is None: if value is None:
self.pop(key.title(), None) self.pop(key.title(), None)
elif isinstance(value, unicode): elif isinstance(value, six.text_type):
return dict.__setitem__(self, key.title(), value.encode('utf-8')) return dict.__setitem__(self, key.title(), value.encode('utf-8'))
else: else:
return dict.__setitem__(self, key.title(), str(value)) return dict.__setitem__(self, key.title(), str(value))
@ -332,7 +333,7 @@ def _resp_status_property():
self.status_int = value self.status_int = value
self.explanation = self.title = RESPONSE_REASONS[value][0] self.explanation = self.title = RESPONSE_REASONS[value][0]
else: else:
if isinstance(value, unicode): if isinstance(value, six.text_type):
value = value.encode('utf-8') value = value.encode('utf-8')
self.status_int = int(value.split(' ', 1)[0]) self.status_int = int(value.split(' ', 1)[0])
self.explanation = self.title = value.split(' ', 1)[1] self.explanation = self.title = value.split(' ', 1)[1]
@ -357,7 +358,7 @@ def _resp_body_property():
return self._body return self._body
def setter(self, value): def setter(self, value):
if isinstance(value, unicode): if isinstance(value, six.text_type):
value = value.encode('utf-8') value = value.encode('utf-8')
if isinstance(value, str): if isinstance(value, str):
self.content_length = len(value) self.content_length = len(value)
@ -753,7 +754,7 @@ def _req_environ_property(environ_field):
return self.environ.get(environ_field, None) return self.environ.get(environ_field, None)
def setter(self, value): def setter(self, value):
if isinstance(value, unicode): if isinstance(value, six.text_type):
self.environ[environ_field] = value.encode('utf-8') self.environ[environ_field] = value.encode('utf-8')
else: else:
self.environ[environ_field] = value self.environ[environ_field] = value
@ -847,7 +848,7 @@ class Request(object):
""" """
headers = headers or {} headers = headers or {}
environ = environ or {} environ = environ or {}
if isinstance(path, unicode): if isinstance(path, six.text_type):
path = path.encode('utf-8') path = path.encode('utf-8')
parsed_path = urllib.parse.urlparse(path) parsed_path = urllib.parse.urlparse(path)
server_name = 'localhost' server_name = 'localhost'

View File

@ -2760,7 +2760,7 @@ def get_valid_utf8_str(str_or_unicode):
:param str_or_unicode: a string or an unicode which can be invalid utf-8 :param str_or_unicode: a string or an unicode which can be invalid utf-8
""" """
if isinstance(str_or_unicode, unicode): if isinstance(str_or_unicode, six.text_type):
(str_or_unicode, _len) = utf8_encoder(str_or_unicode, 'replace') (str_or_unicode, _len) = utf8_encoder(str_or_unicode, 'replace')
(valid_utf8_str, _len) = utf8_decoder(str_or_unicode, 'replace') (valid_utf8_str, _len) = utf8_decoder(str_or_unicode, 'replace')
return valid_utf8_str.encode('utf-8') return valid_utf8_str.encode('utf-8')

View File

@ -19,8 +19,9 @@ Pluggable Back-ends for Container Server
import os import os
from uuid import uuid4 from uuid import uuid4
import time import time
import six.moves.cPickle as pickle
import six
import six.moves.cPickle as pickle
from six.moves import range from six.moves import range
import sqlite3 import sqlite3
@ -686,7 +687,7 @@ class ContainerBroker(DatabaseBroker):
:param source: if defined, update incoming_sync with the source :param source: if defined, update incoming_sync with the source
""" """
for item in item_list: for item in item_list:
if isinstance(item['name'], unicode): if isinstance(item['name'], six.text_type):
item['name'] = item['name'].encode('utf-8') item['name'] = item['name'].encode('utf-8')
def _really_merge_items(conn): def _really_merge_items(conn):

View File

@ -36,6 +36,7 @@ from urllib import quote
from eventlet import sleep from eventlet import sleep
from eventlet.timeout import Timeout from eventlet.timeout import Timeout
import six
from swift.common.wsgi import make_pre_authed_env from swift.common.wsgi import make_pre_authed_env
from swift.common.utils import Timestamp, config_true_value, \ from swift.common.utils import Timestamp, config_true_value, \
@ -469,7 +470,7 @@ def _get_info_cache(app, env, account, container=None):
info = memcache.get(cache_key) info = memcache.get(cache_key)
if info: if info:
for key in info: for key in info:
if isinstance(info[key], unicode): if isinstance(info[key], six.text_type):
info[key] = info[key].encode("utf-8") info[key] = info[key].encode("utf-8")
env[env_key] = info env[env_key] = info
return info return info

View File

@ -23,6 +23,7 @@ import functools
import sys import sys
from eventlet import Timeout from eventlet import Timeout
import six
from swift import __canonical_version__ as swift_version from swift import __canonical_version__ as swift_version
from swift.common import constraints from swift.common import constraints
@ -343,7 +344,7 @@ class Application(object):
try: try:
controller, path_parts = self.get_controller(req) controller, path_parts = self.get_controller(req)
p = req.path_info p = req.path_info
if isinstance(p, unicode): if isinstance(p, six.text_type):
p = p.encode('utf-8') p = p.encode('utf-8')
except APIVersionError: except APIVersionError:
self.logger.increment('errors') self.logger.increment('errors')

View File

@ -506,7 +506,7 @@ class TestContainer(Base):
def testSlashInName(self): def testSlashInName(self):
if Utils.create_name == Utils.create_utf8_name: if Utils.create_name == Utils.create_utf8_name:
cont_name = list(unicode(Utils.create_name(), 'utf-8')) cont_name = list(six.text_type(Utils.create_name(), 'utf-8'))
else: else:
cont_name = list(Utils.create_name()) cont_name = list(Utils.create_name())

View File

@ -23,6 +23,7 @@ import unittest
from logging import DEBUG from logging import DEBUG
from mock import patch, call, DEFAULT from mock import patch, call, DEFAULT
from contextlib import nested from contextlib import nested
import six
from swift.account import reaper from swift.account import reaper
from swift.account.backend import DATADIR from swift.account.backend import DATADIR
@ -173,7 +174,7 @@ class TestReaper(unittest.TestCase):
raise self.myexp raise self.myexp
objects = [{'name': 'o1'}, objects = [{'name': 'o1'},
{'name': 'o2'}, {'name': 'o2'},
{'name': unicode('o3')}, {'name': six.text_type('o3')},
{'name': ''}] {'name': ''}]
return None, objects return None, objects

View File

@ -21,6 +21,7 @@ import tarfile
import urllib import urllib
import zlib import zlib
import mock import mock
import six
from six import BytesIO from six import BytesIO
from shutil import rmtree from shutil import rmtree
from tempfile import mkdtemp from tempfile import mkdtemp
@ -102,7 +103,7 @@ def build_dir_tree(start_path, tree_obj):
dir_path = os.path.join(start_path, dir_name) dir_path = os.path.join(start_path, dir_name)
os.mkdir(dir_path) os.mkdir(dir_path)
build_dir_tree(dir_path, obj) build_dir_tree(dir_path, obj)
if isinstance(tree_obj, unicode): if isinstance(tree_obj, six.text_type):
tree_obj = tree_obj.encode('utf8') tree_obj = tree_obj.encode('utf8')
if isinstance(tree_obj, str): if isinstance(tree_obj, str):
obj_path = os.path.join(start_path, tree_obj) obj_path = os.path.join(start_path, tree_obj)
@ -121,7 +122,7 @@ def build_tar_tree(tar, start_path, tree_obj, base_path=''):
tar_info.type = tarfile.DIRTYPE tar_info.type = tarfile.DIRTYPE
tar.addfile(tar_info) tar.addfile(tar_info)
build_tar_tree(tar, dir_path, obj, base_path=base_path) build_tar_tree(tar, dir_path, obj, base_path=base_path)
if isinstance(tree_obj, unicode): if isinstance(tree_obj, six.text_type):
tree_obj = tree_obj.encode('utf8') tree_obj = tree_obj.encode('utf8')
if isinstance(tree_obj, str): if isinstance(tree_obj, str):
obj_path = os.path.join(start_path, tree_obj) obj_path = os.path.join(start_path, tree_obj)

View File

@ -29,6 +29,7 @@ import random
from eventlet import spawn, Timeout, listen from eventlet import spawn, Timeout, listen
import simplejson import simplejson
import six
from six import BytesIO from six import BytesIO
from six import StringIO from six import StringIO
@ -2090,11 +2091,11 @@ class TestContainerController(unittest.TestCase):
container = dom.getElementsByTagName('container')[0] container = dom.getElementsByTagName('container')[0]
self.assertTrue(len(container.getElementsByTagName('subdir')) == 1) self.assertTrue(len(container.getElementsByTagName('subdir')) == 1)
subdir = container.getElementsByTagName('subdir')[0] subdir = container.getElementsByTagName('subdir')[0]
self.assertEqual(unicode(subdir.attributes['name'].value), self.assertEqual(six.text_type(subdir.attributes['name'].value),
u'<\'sub\' "dir">/') u'<\'sub\' "dir">/')
self.assertTrue(len(subdir.getElementsByTagName('name')) == 1) self.assertTrue(len(subdir.getElementsByTagName('name')) == 1)
name = subdir.getElementsByTagName('name')[0] name = subdir.getElementsByTagName('name')[0]
self.assertEqual(unicode(name.childNodes[0].data), self.assertEqual(six.text_type(name.childNodes[0].data),
u'<\'sub\' "dir">/') u'<\'sub\' "dir">/')
def test_GET_path(self): def test_GET_path(self):

View File

@ -22,6 +22,7 @@ from tempfile import mkdtemp
from shutil import rmtree from shutil import rmtree
import mock import mock
import six
from swift.common import internal_client, utils from swift.common import internal_client, utils
from swift.obj import expirer from swift.obj import expirer
@ -153,10 +154,11 @@ class TestObjectExpirer(TestCase):
sum([len(self.containers[x]) for x in self.containers]) sum([len(self.containers[x]) for x in self.containers])
def iter_containers(self, *a, **kw): def iter_containers(self, *a, **kw):
return [{'name': unicode(x)} for x in self.containers.keys()] return [{'name': six.text_type(x)}
for x in self.containers.keys()]
def iter_objects(self, account, container): def iter_objects(self, account, container):
return [{'name': unicode(x)} return [{'name': six.text_type(x)}
for x in self.containers[container]] for x in self.containers[container]]
def delete_container(*a, **kw): def delete_container(*a, **kw):
@ -525,7 +527,7 @@ class TestObjectExpirer(TestCase):
got_unicode = [False] got_unicode = [False]
def delete_actual_object_test_for_unicode(actual_obj, timestamp): def delete_actual_object_test_for_unicode(actual_obj, timestamp):
if isinstance(actual_obj, unicode): if isinstance(actual_obj, six.text_type):
got_unicode[0] = True got_unicode[0] = True
fake_swift = InternalClient( fake_swift = InternalClient(