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'})