8000 Pass json.loads strings so Python 3.3, 3.4, and 3.5 do not throw an e… · twilio/twilio-python@857565d · GitHub
[go: up one dir, main page]

Skip to content

Commit 857565d

Browse files
committed
Pass json.loads strings so Python 3.3, 3.4, and 3.5 do not throw an exception
1 parent b9a0b1b commit 857565d

File tree

6 files changed

+34
-13
lines changed

6 files changed

+34
-13
lines changed

tests/__init__.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import unittest
2+
import six
23

34
from tests.holodeck import Holodeck
45
from twilio.rest import Client
6+
from twilio.http.response import Response
57

68

79
class IntegrationTestCase(unittest.TestCase):
@@ -13,3 +15,12 @@ def setUp(self):
1315
self.client = Client(username=self.account_sid,
1416
password=self.auth_token,
1517
http_client=self.holodeck)
18+
19+
20+
class MockResponse(Response):
21+
def __init__(self, status, content):
22+
# Here we will convert content (a string type) to a bytes object in
23+
# Python 3 for consistency purposes
24+
if (six.PY3):
25+
content = bytes(content, 'utf-8')
26+
super(MockResponse, self).__init__(status, content)

tests/unit/http/test_validation_client.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
# -*- coding: utf-8 -*-
2-
3-
import six
4-
51
import unittest
62

73
import mock
@@ -10,6 +6,7 @@
106
from requests import Session
117

128
from twilio.http.validation_client import ValidationClient
9+
from tests import MockResponse
1310

1411

1512
class TestValidationClientHelpers(unittest.TestCase):
@@ -80,7 +77,7 @@ def setUp(self):
8077
self.request_mock = Mock()
8178

8279
self.session_mock.prepare_request.return_value = self.request_mock
83-
self.session_mock.send.return_value = Mock(status_code=200, content=six.u('testΩ'))
80+
self.session_mock.send.return_value = MockResponse(200, 'test, omega: \u03a9, pile of poop: \u1f4a9')
8481
self.validation_token.return_value.to_jwt.return_value = 'test-token'
8582
self.request_mock.headers = {}
8683

@@ -119,4 +116,4 @@ def test_request_with_unicode_response(self):
119116
self.assertEqual('other.twilio.com', self.request_mock.headers['Host'])
120117
self.assertEqual('test-token', self.request_mock.headers['Twilio-Client-Validation'])
121118
self.assertEqual(200, response.status_code)
122-
self.assertEqual(six.u('testΩ'), response.content)
119+
self.assertEqual('test, omega: \u03a9, pile of poop: \u1f4a9', response.content)

twilio/base/page.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import json
22

3+
from twilio.compat import string_compat
34
from twilio.base.exceptions import TwilioException
45

56

@@ -58,7 +59,7 @@ def process_response(self, response):
5859
if response.status_code != 200:
5960
raise TwilioException('Unable to fetch page', response)
6061

61-
return json.loads(response.content)
62+
return json.loads(string_compat(response.content))
6263

6364
def load_page(self, payload):
6465
"""

twilio/base/version.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import json
22
from math import ceil
33

4+
from twilio.compat import string_compat
45
from twilio.base import values
56
from twilio.base.exceptions import TwilioRestException
67

@@ -81,7 +82,7 @@ def fetch(self, method, uri, params=None, data=None, headers=None, auth=None, ti
8182
if response.status_code < 200 or response.status_code >= 300:
8283
raise self.exception(method, uri, response, 'Unable to fetch record')
8384

84-
return json.loads(response.content)
85+
return json.loads(string_compat(response.content))
8586

8687
def update(self, method, uri, params=None, data=None, headers=None, auth=None, timeout=None,
8788
allow_redirects=False):
@@ -102,7 +103,7 @@ def update(self, method, uri, params=None, data=None, headers=None, auth=None, t
102103
if response.status_code < 200 or response.status_code >= 300:
103104
raise self.exception(method, uri, response, 'Unable to update record')
104105

105-
return json.loads(response.content)
106+
return json.loads(string_compat(response.content))
106107

107108
def delete(self, method, uri, params=None, data=None, headers=None, auth=None, timeout=None,
108109
allow_redirects=False):
@@ -208,5 +209,4 @@ def create(self, method, uri, params=None, data=None, headers=None, auth=None, t
208209
if response.status_code < 200 or response.status_code >= 300:
209210
raise self.exception(method, uri, response, 'Unable to create record')
210211

211-
return json.loads(response.content)
212-
212+
return json.loads(string_compat(response.content))

twilio/compat.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import six
2+
13
# Those are not supported by the six library and needs to be done manually
24
try:
35
# python 3
@@ -15,3 +17,13 @@
1517
except ImportError:
1618
# python 3
1719
izip = zip
20+
21+
22+
def string_compat(s):
23+
if isinstance(s, six.binary_type):
24+
if (six.PY2):
25+
# s is `str` in Python 2
26+
return s
27+
elif (six.PY3):
28+
# s is `bytes` in Python 3
29+
return s.decode('utf-8')

twilio/http/validation_client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from requests import Request, Session
44

5-
from twilio.compat import urlparse
5+
from twilio.compat import urlparse, string_compat
66
from twilio.http import HttpClient, get_cert_file
77
from twilio.http.response import Response
88
from twilio.jwt.validation import ClientValidationJwt
@@ -69,7 +69,7 @@ def request(self, method, url, params=None, data=None, headers=None, auth=None,
6969
timeout=timeout,
7070
)
7171

72-
return Response(int(response.status_code), response.content)
72+
return Response(int(response.status_code), string_compat(response.content))
7373

7474
def _build_validation_payload(self, request):
7575
"""

0 commit comments

Comments
 (0)
0