Add checks for required parameters
diff --git a/TODO b/TODO
index 0152144..e4785c6 100644
--- a/TODO
+++ b/TODO
@@ -1,5 +1,6 @@
TODO
====
+
- Unit tests against copies of current discovery docs
- Flag required parameters
@@ -8,7 +9,11 @@
- OAuth cmdline sample should start local http server to catch response.
- - 'Extra Discovery' for pagination
+ - Caching of discovery doc
+
+ - Add in 'Extra Discovery' for pagination
+
+ - Layered user-agent header, ala 'my-buzz-client/1.0 google-api-python-client/0.2 httplib2/0.6'
- Implement requests as Command objects, either for immediate
execution, or for batching.
diff --git a/apiclient/discovery.py b/apiclient/discovery.py
index 0f9395d..71e901b 100644
--- a/apiclient/discovery.py
+++ b/apiclient/discovery.py
@@ -31,8 +31,8 @@
class HttpError(Exception):
pass
-DISCOVERY_URI = 'http://www.googleapis.com/discovery/0.1/describe' +
- '{?api,apiVersion}'
+DISCOVERY_URI = 'http://www.googleapis.com/discovery/0.1/describe\
+{?api,apiVersion}'
def key2method(key):
@@ -96,7 +96,7 @@
return simplejson.loads(content)['data']
else:
if resp['content-type'] != 'application/json':
- raise HttpError("%d %s" % (resp.status, resp.reason))
+ raise HttpError('%d %s' % (resp.status, resp.reason))
else:
raise HttpError(simplejson.loads(content)['error'])
@@ -150,6 +150,7 @@
pathUrl = re.sub(r'\{', r'{+', pathUrl)
httpMethod = methodDesc['httpMethod']
args = methodDesc['parameters'].keys()
+ required = [arg for arg in args if methodDesc['parameters'][arg].get('required', True)]
if httpMethod in ['PUT', 'POST']:
args.append('body')
argmap = dict([(key2param(key), key) for key in args])
@@ -161,11 +162,15 @@
params = dict(
[(argmap[key], value) for key, value in kwargs.iteritems()]
)
+ for name in required:
+ if name not in kwargs:
+ raise TypeError('Missing required parameter "%s"' % name)
headers = {}
headers, params, query, body = self._model.request(headers, params)
url = urlparse.urljoin(self._baseUrl,
uritemplate.expand(pathUrl, params) + query)
+
return self._model.response(*self._http.request(
url, method=httpMethod, headers=headers, body=body))
diff --git a/samples/cmdline/three_legged_dance.py b/samples/cmdline/three_legged_dance.py
index 8e85796..cc0ebf2 100644
--- a/samples/cmdline/three_legged_dance.py
+++ b/samples/cmdline/three_legged_dance.py
@@ -10,19 +10,21 @@
from cgi import parse_qs, parse_qsl
httplib2.debuglevel = 4
-headers = {"user-agent": "jcgregorio-buzz-client",
+headers = {'user-agent': 'google-api-client-python-buzz-cmdline/1.0',
'content-type': 'application/x-www-form-urlencoded'
}
consumer_key = 'anonymous'
consumer_secret = 'anonymous'
-request_token_url = 'https://www.google.com/accounts/OAuthGetRequestToken' +
- '?domain=anonymous&scope=https://www.googleapis.com/auth/buzz'
-access_token_url = 'https://www.google.com/accounts/OAuthGetAccessToken' +
- '?domain=anonymous&scope=https://www.googleapis.com/auth/buzz'
-authorize_url = 'https://www.google.com/buzz/api/auth/OAuthAuthorizeToken' +
- '?domain=anonymous&scope=https://www.googleapis.com/auth/buzz'
+request_token_url = 'https://www.google.com/accounts/OAuthGetRequestToken\
+?domain=anonymous&scope=https://www.googleapis.com/auth/buzz'
+
+access_token_url = 'https://www.google.com/accounts/OAuthGetAccessToken\
+?domain=anonymous&scope=https://www.googleapis.com/auth/buzz'
+
+authorize_url = 'https://www.google.com/buzz/api/auth/OAuthAuthorizeToken\
+?domain=anonymous&scope=https://www.googleapis.com/auth/buzz'
consumer = oauth.Consumer(consumer_key, consumer_secret)
client = oauth.Client(consumer)
@@ -31,17 +33,17 @@
# having the user authorize an access token and to sign the request to obtain
# said access token.
-resp, content = client.request(request_token_url, "POST", headers=headers,
- body="oauth_callback=oob")
+resp, content = client.request(request_token_url, 'POST', headers=headers,
+ body='oauth_callback=oob')
if resp['status'] != '200':
print content
- raise Exception("Invalid response %s." % resp['status'])
+ raise Exception('Invalid response %s.' % resp['status'])
request_token = dict(parse_qsl(content))
-print "Request Token:"
-print " - oauth_token = %s" % request_token['oauth_token']
-print " - oauth_token_secret = %s" % request_token['oauth_token_secret']
+print 'Request Token:'
+print ' - oauth_token = %s' % request_token['oauth_token']
+print ' - oauth_token_secret = %s' % request_token['oauth_token_secret']
print
# Step 2: Redirect to the provider. Since this is a CLI script we do not
@@ -58,7 +60,7 @@
urllib.urlencode(query, True), base_url.fragment)
authorize_url = urlparse.urlunparse(url)
-print "Go to the following link in your browser:"
+print 'Go to the following link in your browser:'
print authorize_url
print
@@ -81,14 +83,14 @@
token.set_verifier(oauth_verifier)
client = oauth.Client(consumer, token)
-resp, content = client.request(access_token_url, "POST", headers=headers)
+resp, content = client.request(access_token_url, 'POST', headers=headers)
access_token = dict(parse_qsl(content))
-print "Access Token:"
-print " - oauth_token = %s" % access_token['oauth_token']
-print " - oauth_token_secret = %s" % access_token['oauth_token_secret']
+print 'Access Token:'
+print ' - oauth_token = %s' % access_token['oauth_token']
+print ' - oauth_token_secret = %s' % access_token['oauth_token_secret']
print
-print "You may now access protected resources using the access tokens above."
+print 'You may now access protected resources using the access tokens above.'
print
d = dict(
@@ -98,6 +100,6 @@
d.update(access_token)
-f = open("oauth_token.dat", "w")
+f = open('oauth_token.dat', 'w')
f.write(simplejson.dumps(d))
f.close()