Merged with the main repository. Added some conditional imports for compatibility with Python 2.5
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 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 @@
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 @@
self._http = http
self._baseUrl = base
self._model = model
+ self._developerKey = developerKey
def auth_discovery(self):
return auth_discovery
@@ -149,7 +154,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
"""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 @@
from apiclient.discovery import build
import httplib2
+httplib2.debuglevel = 4
import pickle
import pprint
@@ -30,7 +31,7 @@
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 @@
__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 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'})