Now using the dataWrapper features flag to control serialization of JSON requests.

This commit is contained in:
Joe Gregorio
2011-02-22 10:51:51 -05:00
parent c2a7393581
commit d433b2a89e
4 changed files with 41 additions and 12 deletions

View File

@@ -68,7 +68,7 @@ def build(serviceName, version,
http=None, http=None,
discoveryServiceUrl=DISCOVERY_URI, discoveryServiceUrl=DISCOVERY_URI,
developerKey=None, developerKey=None,
model=JsonModel(), model=None,
requestBuilder=HttpRequest): requestBuilder=HttpRequest):
"""Construct a Resource for interacting with an API. """Construct a Resource for interacting with an API.
@@ -125,7 +125,7 @@ def build_from_document(
future=None, future=None,
http=None, http=None,
developerKey=None, developerKey=None,
model=JsonModel(), model=None,
requestBuilder=HttpRequest): requestBuilder=HttpRequest):
"""Create a Resource for interacting with an API. """Create a Resource for interacting with an API.
@@ -160,6 +160,8 @@ def build_from_document(
future = {} future = {}
auth_discovery = {} auth_discovery = {}
if model is None:
model = JsonModel('dataWrapper' in service.get('features', []))
resource = createResource(http, base, model, requestBuilder, developerKey, resource = createResource(http, base, model, requestBuilder, developerKey,
service, future) service, future)

View File

@@ -150,7 +150,7 @@ class RequestMockBuilder(object):
resp, content = self.responses[methodId] resp, content = self.responses[methodId]
return HttpRequestMock(resp, content, postproc) return HttpRequestMock(resp, content, postproc)
else: else:
model = JsonModel() model = JsonModel(False)
return HttpRequestMock(None, '{}', model.response) return HttpRequestMock(None, '{}', model.response)

View File

@@ -73,6 +73,14 @@ class JsonModel(Model):
object representation of HTTP request and response bodies. object representation of HTTP request and response bodies.
""" """
def __init__(self, data_wrapper):
"""Construct a JsonModel
Args:
data_wrapper: boolean, wrap requests and responses in a data wrapper
"""
self._data_wrapper = data_wrapper
def request(self, headers, path_params, query_params, body_value): def request(self, headers, path_params, query_params, body_value):
"""Updates outgoing requests with JSON bodies. """Updates outgoing requests with JSON bodies.
@@ -97,6 +105,10 @@ class JsonModel(Model):
else: else:
headers['user-agent'] = '' headers['user-agent'] = ''
headers['user-agent'] += 'google-api-python-client/1.0' headers['user-agent'] += 'google-api-python-client/1.0'
if (isinstance(body_value, dict) and 'data' not in body_value and
self._data_wrapper):
body_value = {'data': body_value}
if body_value is None: if body_value is None:
return (headers, path_params, query, None) return (headers, path_params, query, None)
else: else:

View File

@@ -36,7 +36,7 @@ except ImportError:
class Model(unittest.TestCase): class Model(unittest.TestCase):
def test_json_no_body(self): def test_json_no_body(self):
model = JsonModel() model = JsonModel(data_wrapper=False)
headers = {} headers = {}
path_params = {} path_params = {}
@@ -51,7 +51,7 @@ class Model(unittest.TestCase):
self.assertEqual(body, None) self.assertEqual(body, None)
def test_json_body(self): def test_json_body(self):
model = JsonModel() model = JsonModel(data_wrapper=False)
headers = {} headers = {}
path_params = {} path_params = {}
@@ -65,9 +65,24 @@ class Model(unittest.TestCase):
self.assertNotEqual(query, '') self.assertNotEqual(query, '')
self.assertEqual(body, '{}') self.assertEqual(body, '{}')
def test_json_body_data_wrapper(self):
model = JsonModel(data_wrapper=True)
headers = {}
path_params = {}
query_params = {}
body = {}
headers, params, query, body = model.request(headers, path_params, query_params, body)
self.assertEqual(headers['accept'], 'application/json')
self.assertEqual(headers['content-type'], 'application/json')
self.assertNotEqual(query, '')
self.assertEqual(body, '{"data": {}}')
def test_json_body_default_data(self): def test_json_body_default_data(self):
"""Test that a 'data' wrapper doesn't get added if one is already present.""" """Test that a 'data' wrapper doesn't get added if one is already present."""
model = JsonModel() model = JsonModel(data_wrapper=True)
headers = {} headers = {}
path_params = {} path_params = {}
@@ -82,7 +97,7 @@ class Model(unittest.TestCase):
self.assertEqual(body, '{"data": "foo"}') self.assertEqual(body, '{"data": "foo"}')
def test_json_build_query(self): def test_json_build_query(self):
model = JsonModel() model = JsonModel(data_wrapper=False)
headers = {} headers = {}
path_params = {} path_params = {}
@@ -100,7 +115,7 @@ class Model(unittest.TestCase):
self.assertEqual(body, '{}') self.assertEqual(body, '{}')
def test_user_agent(self): def test_user_agent(self):
model = JsonModel() model = JsonModel(data_wrapper=False)
headers = {'user-agent': 'my-test-app/1.23.4'} headers = {'user-agent': 'my-test-app/1.23.4'}
path_params = {} path_params = {}
@@ -112,7 +127,7 @@ class Model(unittest.TestCase):
self.assertEqual(headers['user-agent'], 'my-test-app/1.23.4 google-api-python-client/1.0') self.assertEqual(headers['user-agent'], 'my-test-app/1.23.4 google-api-python-client/1.0')
def test_bad_response(self): def test_bad_response(self):
model = JsonModel() model = JsonModel(data_wrapper=False)
resp = httplib2.Response({'status': '401'}) resp = httplib2.Response({'status': '401'})
resp.reason = 'Unauthorized' resp.reason = 'Unauthorized'
content = '{"error": {"message": "not authorized"}}' content = '{"error": {"message": "not authorized"}}'
@@ -133,7 +148,7 @@ class Model(unittest.TestCase):
def test_good_response(self): def test_good_response(self):
model = JsonModel() model = JsonModel(data_wrapper=True)
resp = httplib2.Response({'status': '200'}) resp = httplib2.Response({'status': '200'})
resp.reason = 'OK' resp.reason = 'OK'
content = '{"data": "is good"}' content = '{"data": "is good"}'
@@ -142,7 +157,7 @@ class Model(unittest.TestCase):
self.assertEqual(content, 'is good') self.assertEqual(content, 'is good')
def test_good_response_wo_data(self): def test_good_response_wo_data(self):
model = JsonModel() model = JsonModel(data_wrapper=False)
resp = httplib2.Response({'status': '200'}) resp = httplib2.Response({'status': '200'})
resp.reason = 'OK' resp.reason = 'OK'
content = '{"foo": "is good"}' content = '{"foo": "is good"}'
@@ -151,7 +166,7 @@ class Model(unittest.TestCase):
self.assertEqual(content, {'foo': 'is good'}) self.assertEqual(content, {'foo': 'is good'})
def test_good_response_wo_data_str(self): def test_good_response_wo_data_str(self):
model = JsonModel() model = JsonModel(data_wrapper=False)
resp = httplib2.Response({'status': '200'}) resp = httplib2.Response({'status': '200'})
resp.reason = 'OK' resp.reason = 'OK'
content = '"data goes here"' content = '"data goes here"'