From d433b2a89ecf8099812f770f94f81eca2edb8a5b Mon Sep 17 00:00:00 2001 From: Joe Gregorio Date: Tue, 22 Feb 2011 10:51:51 -0500 Subject: [PATCH] Now using the dataWrapper features flag to control serialization of JSON requests. --- apiclient/discovery.py | 6 ++++-- apiclient/http.py | 2 +- apiclient/model.py | 12 ++++++++++++ tests/test_json_model.py | 33 ++++++++++++++++++++++++--------- 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/apiclient/discovery.py b/apiclient/discovery.py index b7bc823..7ae6a8a 100644 --- a/apiclient/discovery.py +++ b/apiclient/discovery.py @@ -68,7 +68,7 @@ def build(serviceName, version, http=None, discoveryServiceUrl=DISCOVERY_URI, developerKey=None, - model=JsonModel(), + model=None, requestBuilder=HttpRequest): """Construct a Resource for interacting with an API. @@ -125,7 +125,7 @@ def build_from_document( future=None, http=None, developerKey=None, - model=JsonModel(), + model=None, requestBuilder=HttpRequest): """Create a Resource for interacting with an API. @@ -160,6 +160,8 @@ def build_from_document( future = {} auth_discovery = {} + if model is None: + model = JsonModel('dataWrapper' in service.get('features', [])) resource = createResource(http, base, model, requestBuilder, developerKey, service, future) diff --git a/apiclient/http.py b/apiclient/http.py index f713ec8..094271f 100644 --- a/apiclient/http.py +++ b/apiclient/http.py @@ -150,7 +150,7 @@ class RequestMockBuilder(object): resp, content = self.responses[methodId] return HttpRequestMock(resp, content, postproc) else: - model = JsonModel() + model = JsonModel(False) return HttpRequestMock(None, '{}', model.response) diff --git a/apiclient/model.py b/apiclient/model.py index 58cd624..55bcc94 100644 --- a/apiclient/model.py +++ b/apiclient/model.py @@ -73,6 +73,14 @@ class JsonModel(Model): 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): """Updates outgoing requests with JSON bodies. @@ -97,6 +105,10 @@ class JsonModel(Model): else: headers['user-agent'] = '' 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: return (headers, path_params, query, None) else: diff --git a/tests/test_json_model.py b/tests/test_json_model.py index 084e0a9..fa7ad05 100644 --- a/tests/test_json_model.py +++ b/tests/test_json_model.py @@ -36,7 +36,7 @@ except ImportError: class Model(unittest.TestCase): def test_json_no_body(self): - model = JsonModel() + model = JsonModel(data_wrapper=False) headers = {} path_params = {} @@ -51,7 +51,7 @@ class Model(unittest.TestCase): self.assertEqual(body, None) def test_json_body(self): - model = JsonModel() + model = JsonModel(data_wrapper=False) headers = {} path_params = {} @@ -65,9 +65,24 @@ class Model(unittest.TestCase): self.assertNotEqual(query, '') 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): """Test that a 'data' wrapper doesn't get added if one is already present.""" - model = JsonModel() + model = JsonModel(data_wrapper=True) headers = {} path_params = {} @@ -82,7 +97,7 @@ class Model(unittest.TestCase): self.assertEqual(body, '{"data": "foo"}') def test_json_build_query(self): - model = JsonModel() + model = JsonModel(data_wrapper=False) headers = {} path_params = {} @@ -100,7 +115,7 @@ class Model(unittest.TestCase): self.assertEqual(body, '{}') def test_user_agent(self): - model = JsonModel() + model = JsonModel(data_wrapper=False) headers = {'user-agent': 'my-test-app/1.23.4'} 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') def test_bad_response(self): - model = JsonModel() + model = JsonModel(data_wrapper=False) resp = httplib2.Response({'status': '401'}) resp.reason = 'Unauthorized' content = '{"error": {"message": "not authorized"}}' @@ -133,7 +148,7 @@ class Model(unittest.TestCase): def test_good_response(self): - model = JsonModel() + model = JsonModel(data_wrapper=True) resp = httplib2.Response({'status': '200'}) resp.reason = 'OK' content = '{"data": "is good"}' @@ -142,7 +157,7 @@ class Model(unittest.TestCase): self.assertEqual(content, 'is good') def test_good_response_wo_data(self): - model = JsonModel() + model = JsonModel(data_wrapper=False) resp = httplib2.Response({'status': '200'}) resp.reason = 'OK' content = '{"foo": "is good"}' @@ -151,7 +166,7 @@ class Model(unittest.TestCase): self.assertEqual(content, {'foo': 'is good'}) def test_good_response_wo_data_str(self): - model = JsonModel() + model = JsonModel(data_wrapper=False) resp = httplib2.Response({'status': '200'}) resp.reason = 'OK' content = '"data goes here"'