Python 3: Get compatible types from six

* Replace unicode with six.text_type
* Replace basestring with six.string_types
* The long type doesn't exist in Python 3 anymore: replace 1L with long(1) and
  only test this type with Python 2
* Fix quote(): quote the URL if the string is a byte string. Use "bytes" type
  instead of "str" to be Python 3 compatible.

Change-Id: I1df5aa85e4e7d07191fb5c654d52fc4bd8b9f440
This commit is contained in:
Victor Stinner 2014-03-24 18:16:51 +01:00 committed by Gerrit Code Review
parent cdf6f84c36
commit 12f86fdcc5
3 changed files with 15 additions and 9 deletions

@ -28,6 +28,7 @@ from requests.exceptions import RequestException, SSLError
from urllib import quote as _quote from urllib import quote as _quote
from urlparse import urlparse, urlunparse from urlparse import urlparse, urlunparse
from time import sleep, time from time import sleep, time
import six
from swiftclient.exceptions import ClientException, InvalidHeadersException from swiftclient.exceptions import ClientException, InvalidHeadersException
from swiftclient.utils import LengthWrapper from swiftclient.utils import LengthWrapper
@ -97,7 +98,7 @@ def quote(value, safe='/'):
Patched version of urllib.quote that encodes utf8 strings before quoting Patched version of urllib.quote that encodes utf8 strings before quoting
""" """
value = encode_utf8(value) value = encode_utf8(value)
if isinstance(value, str): if isinstance(value, bytes):
return _quote(value, safe) return _quote(value, safe)
else: else:
return value return value
@ -117,7 +118,7 @@ def validate_headers(headers):
def encode_utf8(value): def encode_utf8(value):
if isinstance(value, unicode): if isinstance(value, six.text_type):
value = value.encode('utf8') value = value.encode('utf8')
return value return value

@ -14,6 +14,8 @@
# limitations under the License. # limitations under the License.
"""Miscellaneous utility functions for use with Swift.""" """Miscellaneous utility functions for use with Swift."""
import six
TRUE_VALUES = set(('true', '1', 'yes', 'on', 't', 'y')) TRUE_VALUES = set(('true', '1', 'yes', 'on', 't', 'y'))
@ -24,7 +26,7 @@ def config_true_value(value):
This function come from swift.common.utils.config_true_value() This function come from swift.common.utils.config_true_value()
""" """
return value is True or \ return value is True or \
(isinstance(value, basestring) and value.lower() in TRUE_VALUES) (isinstance(value, six.string_types) and value.lower() in TRUE_VALUES)
def prt_bytes(bytes, human_flag): def prt_bytes(bytes, human_flag):

@ -177,9 +177,9 @@ class TestHttpHelpers(MockHttpTest):
def test_quote(self): def test_quote(self):
value = 'standard string' value = 'standard string'
self.assertEqual('standard%20string', c.quote(value)) self.assertEqual(b'standard%20string', c.quote(value))
value = u'\u0075nicode string' value = u'\u0075nicode string'
self.assertEqual('unicode%20string', c.quote(value)) self.assertEqual(b'unicode%20string', c.quote(value))
def test_http_connection(self): def test_http_connection(self):
url = 'http://www.test.com' url = 'http://www.test.com'
@ -204,7 +204,10 @@ class TestHttpHelpers(MockHttpTest):
headers) headers)
def test_validate_headers_with_other_than_str(self): def test_validate_headers_with_other_than_str(self):
for t in (None, 1, 1.0, 1L, u"A"): values = [None, 1, 1.0, u"A"]
if six.PY2:
values.append(long(1))
for t in values:
self.assertEqual(c.validate_headers({'key': t}), self.assertEqual(c.validate_headers({'key': t}),
None) None)
@ -572,7 +575,7 @@ class TestPutObject(MockHttpTest):
c.http_connection = self.fake_http_connection(200) c.http_connection = self.fake_http_connection(200)
args = ('http://www.test.com', 'asdf', 'asdf', 'asdf', 'asdf') args = ('http://www.test.com', 'asdf', 'asdf', 'asdf', 'asdf')
value = c.put_object(*args) value = c.put_object(*args)
self.assertTrue(isinstance(value, basestring)) self.assertTrue(isinstance(value, six.string_types))
def test_unicode_ok(self): def test_unicode_ok(self):
conn = c.http_connection(u'http://www.test.com/') conn = c.http_connection(u'http://www.test.com/')
@ -589,7 +592,7 @@ class TestPutObject(MockHttpTest):
conn[1].getresponse = resp.fake_response conn[1].getresponse = resp.fake_response
conn[1]._request = resp._fake_request conn[1]._request = resp._fake_request
value = c.put_object(*args, headers=headers, http_conn=conn) value = c.put_object(*args, headers=headers, http_conn=conn)
self.assertTrue(isinstance(value, basestring)) self.assertTrue(isinstance(value, six.string_types))
# Test for RFC-2616 encoded symbols # Test for RFC-2616 encoded symbols
self.assertTrue("a-b: .x:yz mn:fg:lp" in resp.buffer[0], self.assertTrue("a-b: .x:yz mn:fg:lp" in resp.buffer[0],
"[a-b: .x:yz mn:fg:lp] header is missing") "[a-b: .x:yz mn:fg:lp] header is missing")
@ -969,7 +972,7 @@ class TestLogging(MockHttpTest):
c.http_connection = self.fake_http_connection(200) c.http_connection = self.fake_http_connection(200)
args = ('http://www.test.com', 'asdf', 'asdf', 'asdf', 'asdf') args = ('http://www.test.com', 'asdf', 'asdf', 'asdf', 'asdf')
value = c.put_object(*args) value = c.put_object(*args)
self.assertTrue(isinstance(value, basestring)) self.assertTrue(isinstance(value, six.string_types))
def test_head_error(self): def test_head_error(self):
c.http_connection = self.fake_http_connection(500) c.http_connection = self.fake_http_connection(500)