From 7c47d8fa8a46f89bed84657b153b8f8d38d2eb02 Mon Sep 17 00:00:00 2001 From: Joe Gregorio Date: Wed, 22 Sep 2010 11:47:49 -0400 Subject: [PATCH 1/2] Got test coverage to 97%. Added missing file. --- apiclient/discovery.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apiclient/discovery.py b/apiclient/discovery.py index 9eec549..765db3f 100644 --- a/apiclient/discovery.py +++ b/apiclient/discovery.py @@ -30,7 +30,7 @@ import urllib import urlparse from apiclient.http import HttpRequest -try: +try: # pragma: no cover import simplejson except ImportError: try: From 00cf1d994c26d4733a33ea9f86acdf39ebbafd9c Mon Sep 17 00:00:00 2001 From: Joe Gregorio Date: Mon, 27 Sep 2010 09:22:03 -0400 Subject: [PATCH 2/2] Added in support for developer keys --- apiclient/discovery.py | 20 ++++++++++++++++---- apiclient/http.py | 3 ++- samples/cmdline/buzz.py | 3 ++- tests/test_discovery.py | 23 ++++++++++++++++++++--- 4 files changed, 40 insertions(+), 9 deletions(-) diff --git a/apiclient/discovery.py b/apiclient/discovery.py index 3d30fbd..bb5c305 100644 --- a/apiclient/discovery.py +++ b/apiclient/discovery.py @@ -109,7 +109,7 @@ class JsonModel(object): def build(serviceName, version, http=None, - discoveryServiceUrl=DISCOVERY_URI, auth=None, model=JsonModel()): + discoveryServiceUrl=DISCOVERY_URI, developerKey=None, model=JsonModel()): params = { 'api': serviceName, 'apiVersion': version @@ -141,6 +141,7 @@ def build(serviceName, version, http=None, self._http = http self._baseUrl = base self._model = model + self._developerKey = developerKey def auth_discovery(self): return auth_discovery @@ -149,7 +150,7 @@ def build(serviceName, version, http=None, def method(self, **kwargs): return createResource(self._http, self._baseUrl, self._model, - methodName, methodDesc, futureDesc) + methodName, self._developerKey, methodDesc, futureDesc) setattr(method, '__doc__', 'A description of how to use this function') setattr(theclass, methodName, method) @@ -159,8 +160,8 @@ def build(serviceName, version, http=None, return Service() -def createResource(http, baseUrl, model, resourceName, resourceDesc, - futureDesc): +def createResource(http, baseUrl, model, resourceName, developerKey, + resourceDesc, futureDesc): class Resource(object): """A class for interacting with a resource.""" @@ -169,6 +170,7 @@ def createResource(http, baseUrl, model, resourceName, resourceDesc, self._http = http self._baseUrl = baseUrl self._model = model + self._developerKey = developerKey def createMethod(theclass, methodName, methodDesc, futureDesc): pathUrl = methodDesc['pathUrl'] @@ -223,6 +225,9 @@ def createResource(http, baseUrl, model, resourceName, resourceDesc, actual_path_params[argmap[key]] = value body_value = kwargs.get('body', None) + if self._developerKey: + actual_query_params['key'] = self._developerKey + headers = {} headers, params, query, body = self._model.request(headers, actual_path_params, actual_query_params, body_value) @@ -266,6 +271,13 @@ def createResource(http, baseUrl, model, resourceName, resourceDesc, except (KeyError, TypeError): return None + if self._developerKey: + parsed = list(urlparse.urlparse(url)) + q = urlparse.parse_qsl(parsed[4]) + q.append(('key', self._developerKey)) + parsed[4] = urllib.urlencode(q) + url = urlparse.urlunparse(parsed) + headers = {} headers, params, query, body = self._model.request(headers, {}, {}, None) diff --git a/apiclient/http.py b/apiclient/http.py index 16591fb..25d646e 100644 --- a/apiclient/http.py +++ b/apiclient/http.py @@ -12,7 +12,8 @@ class HttpRequest(object): """Encapsulate an HTTP request. """ - def __init__(self, http, uri, method="GET", body=None, headers=None, postproc=None): + def __init__(self, http, uri, method="GET", body=None, headers=None, + postproc=None): self.uri = uri self.method = method self.body = body diff --git a/samples/cmdline/buzz.py b/samples/cmdline/buzz.py index b692be5..92be46d 100644 --- a/samples/cmdline/buzz.py +++ b/samples/cmdline/buzz.py @@ -15,6 +15,7 @@ __author__ = 'jcgregorio@google.com (Joe Gregorio)' from apiclient.discovery import build import httplib2 +httplib2.debuglevel = 4 import pickle @@ -26,7 +27,7 @@ def main(): http = httplib2.Http() http = credentials.authorize(http) - p = build("buzz", "v1", http=http) + p = build("buzz", "v1", http=http, developerKey='AIzaSyDRRpR3GS1F1_jKNNM9HCNd2wJQyPG3oN0') activities = p.activities() activitylist = activities.list(max_results='2', scope='@self', userId='@me').execute() print activitylist['items'][0]['title'] diff --git a/tests/test_discovery.py b/tests/test_discovery.py index c44f1e4..fdca968 100644 --- a/tests/test_discovery.py +++ b/tests/test_discovery.py @@ -22,10 +22,12 @@ Unit tests for objects created from discovery documents. __author__ = 'jcgregorio@google.com (Joe Gregorio)' -from apiclient.discovery import build, key2param import httplib2 import os import unittest +import urlparse + +from apiclient.discovery import build, key2param DATA_DIR = os.path.join(os.path.dirname(__file__), 'data') @@ -102,12 +104,27 @@ class Discovery(unittest.TestCase): class Next(unittest.TestCase): def test_next(self): self.http = HttpMock('buzz.json', {'status': '200'}) - buzz = build('buzz', 'v1', self.http) + buzz = build('buzz', 'v1', self.http, developerKey='foobie_bletch') activities = {'links': {'next': [{'href': 'http://www.googleapis.com/next-link'}]}} request = buzz.activities().list_next(activities) - self.assertEqual(request.uri, 'http://www.googleapis.com/next-link') + self.assertEqual(request.uri, + 'http://www.googleapis.com/next-link?key=foobie_bletch') + + +class DeveloperKey(unittest.TestCase): + def test_param(self): + self.http = HttpMock('buzz.json', {'status': '200'}) + buzz = build('buzz', 'v1', self.http, developerKey='foobie_bletch') + activities = {'links': + {'next': + [{'href': 'http://www.googleapis.com/next-link'}]}} + request = buzz.activities().list_next(activities) + parsed = urlparse.urlparse(request.uri) + q = urlparse.parse_qs(parsed[4]) + self.assertEqual(q['key'], ['foobie_bletch']) + if __name__ == '__main__':