diff --git a/apiclient/discovery.py b/apiclient/discovery.py index 3d30fbd..0b441b1 100644 --- a/apiclient/discovery.py +++ b/apiclient/discovery.py @@ -28,6 +28,10 @@ import re import uritemplate import urllib import urlparse +try: + from urlparse import parse_qsl +except ImportError: + from cgi import parse_qsl from apiclient.http import HttpRequest try: # pragma: no cover @@ -109,7 +113,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 +145,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 +154,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 +164,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 +174,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 +229,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 +275,13 @@ def createResource(http, baseUrl, model, resourceName, resourceDesc, except (KeyError, TypeError): return None + if self._developerKey: + parsed = list(urlparse.urlparse(url)) + q = 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 c7f9990..2f0da84 100644 --- a/samples/cmdline/buzz.py +++ b/samples/cmdline/buzz.py @@ -19,6 +19,7 @@ sys.path.insert(0, os.getcwd()) from apiclient.discovery import build import httplib2 +httplib2.debuglevel = 4 import pickle import pprint @@ -30,7 +31,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 374e57c..8704e92 100644 --- a/tests/test_discovery.py +++ b/tests/test_discovery.py @@ -22,10 +22,16 @@ 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 +try: + from urlparse import parse_qs +except ImportError: + from cgi import parse_qs + +from apiclient.discovery import build, key2param DATA_DIR = os.path.join(os.path.dirname(__file__), 'data') @@ -102,12 +108,27 @@ class Discovery(unittest.TestCase): class Next(unittest.TestCase): def test_next_for_activities_list(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 = parse_qs(parsed[4]) + self.assertEqual(q['key'], ['foobie_bletch']) + def test_next_for_people_liked(self): self.http = HttpMock('buzz.json', {'status': '200'})