Added TODO and did PEP 8 cleanup.
This commit is contained in:
4
Makefile
4
Makefile
@@ -1,2 +1,2 @@
|
||||
default:
|
||||
python discovery.py
|
||||
pep8:
|
||||
find apiclient samples -name "*.py" | xargs pep8 --ignore=E111,E202
|
||||
|
||||
21
TODO
Normal file
21
TODO
Normal file
@@ -0,0 +1,21 @@
|
||||
TODO
|
||||
====
|
||||
- Unit tests against copies of current discovery docs
|
||||
|
||||
- Flag required parameters
|
||||
|
||||
- Check the regex when accepting values
|
||||
|
||||
- OAuth cmdline sample should start local http server to catch response.
|
||||
|
||||
- 'Extra Discovery' for pagination
|
||||
|
||||
- Implement requests as Command objects, either for immediate
|
||||
execution, or for batching.
|
||||
|
||||
- Requests for multiple APIs at one time.
|
||||
|
||||
- 2.x and 3.x compatible
|
||||
|
||||
|
||||
|
||||
@@ -27,9 +27,12 @@ import simplejson
|
||||
import urlparse
|
||||
import uritemplate
|
||||
|
||||
class HttpError(Exception): pass
|
||||
|
||||
DISCOVERY_URI = 'http://www.googleapis.com/discovery/0.1/describe{?api,apiVersion}'
|
||||
class HttpError(Exception):
|
||||
pass
|
||||
|
||||
DISCOVERY_URI = 'http://www.googleapis.com/discovery/0.1/describe' +
|
||||
'{?api,apiVersion}'
|
||||
|
||||
|
||||
def key2method(key):
|
||||
@@ -73,6 +76,7 @@ def key2param(key):
|
||||
|
||||
|
||||
class JsonModel(object):
|
||||
|
||||
def request(self, headers, params):
|
||||
model = params.get('body', None)
|
||||
query = '?alt=json&prettyprint=true'
|
||||
@@ -86,7 +90,8 @@ class JsonModel(object):
|
||||
return (headers, params, query, simplejson.dumps(model))
|
||||
|
||||
def response(self, resp, content):
|
||||
# Error handling is TBD
|
||||
# Error handling is TBD, for example, do we retry
|
||||
# for some operation/error combinations?
|
||||
if resp.status < 300:
|
||||
return simplejson.loads(content)['data']
|
||||
else:
|
||||
@@ -117,6 +122,7 @@ def build(service, version, http=httplib2.Http(),
|
||||
self._model = model
|
||||
|
||||
def createMethod(theclass, methodName, methodDesc):
|
||||
|
||||
def method(self, **kwargs):
|
||||
return createResource(self._http, self._baseUrl, self._model,
|
||||
methodName, methodDesc)
|
||||
|
||||
@@ -10,38 +10,14 @@ A detailed description of discovery.
|
||||
|
||||
__author__ = 'jcgregorio@google.com (Joe Gregorio)'
|
||||
|
||||
# TODO
|
||||
# - Add normalize_ that converts max-results into MaxResults
|
||||
#
|
||||
# - Each 'resource' should be its own object accessible
|
||||
# from the service object returned from discovery.
|
||||
#
|
||||
# - Methods can either execute immediately or return
|
||||
# RestRequest objects which can be batched.
|
||||
#
|
||||
# - 'Body' parameter for non-GET requests
|
||||
#
|
||||
# - 2.x and 3.x compatible
|
||||
|
||||
# JS also has the idea of a TransportRequest and a Transport.
|
||||
# The Transport has a doRequest() method that takes a request
|
||||
# and a callback function.
|
||||
#
|
||||
|
||||
|
||||
# Discovery doc notes
|
||||
# - Which parameters are optional vs mandatory
|
||||
# - Is pattern a regex?
|
||||
# - Inconsistent naming max-results vs userId
|
||||
|
||||
|
||||
from apiclient.discovery import build
|
||||
|
||||
import httplib2
|
||||
import simplejson
|
||||
import re
|
||||
|
||||
import oauth2 as oauth
|
||||
import re
|
||||
import simplejson
|
||||
|
||||
|
||||
def oauth_wrap(consumer, token, http):
|
||||
"""
|
||||
@@ -68,7 +44,8 @@ def oauth_wrap(consumer, token, http):
|
||||
request_orig = http.request
|
||||
signer = oauth.SignatureMethod_HMAC_SHA1()
|
||||
|
||||
def new_request(uri, method="GET", body=None, headers=None, redirections=httplib2.DEFAULT_MAX_REDIRECTS, connection_type=None):
|
||||
def new_request(uri, method="GET", body=None, headers=None,
|
||||
redirections=httplib2.DEFAULT_MAX_REDIRECTS, connection_type=None):
|
||||
"""Modify the request headers to add the appropriate
|
||||
Authorization header."""
|
||||
req = oauth.Request.from_consumer_and_token(
|
||||
@@ -78,17 +55,21 @@ def oauth_wrap(consumer, token, http):
|
||||
headers = {}
|
||||
headers.update(req.to_header())
|
||||
headers['user-agent'] = 'jcgregorio-test-client'
|
||||
return request_orig(uri, method, body, headers, redirections, connection_type)
|
||||
return request_orig(uri, method, body, headers,
|
||||
redirections, connection_type)
|
||||
|
||||
http.request = new_request
|
||||
return http
|
||||
|
||||
|
||||
def get_wrapped_http():
|
||||
f = open("oauth_token.dat", "r")
|
||||
oauth_params = simplejson.loads(f.read())
|
||||
|
||||
consumer = oauth.Consumer(oauth_params['consumer_key'], oauth_params['consumer_secret'])
|
||||
token = oauth.Token(oauth_params['oauth_token'], oauth_params['oauth_token_secret'])
|
||||
consumer = oauth.Consumer(
|
||||
oauth_params['consumer_key'], oauth_params['consumer_secret'])
|
||||
token = oauth.Token(
|
||||
oauth_params['oauth_token'], oauth_params['oauth_token_secret'])
|
||||
|
||||
# Create a simple monkeypatch for httplib2.Http.request
|
||||
# just adds in the oauth authorization header and then calls
|
||||
|
||||
@@ -17,9 +17,12 @@ headers = {"user-agent": "jcgregorio-buzz-client",
|
||||
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)
|
||||
@@ -28,7 +31,8 @@ client = oauth.Client(consumer)
|
||||
# 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'])
|
||||
@@ -64,7 +68,8 @@ print
|
||||
accepted = 'n'
|
||||
while accepted.lower() == 'n':
|
||||
accepted = raw_input('Have you authorized me? (y/n) ')
|
||||
oauth_verifier = raw_input('What is the PIN? ')
|
||||
oauth_verifier = raw_input('What is the PIN? ').strip()
|
||||
|
||||
|
||||
# Step 3: Once the consumer has redirected the user back to the oauth_callback
|
||||
# URL you can request the access token the user has approved. You use the
|
||||
@@ -90,6 +95,7 @@ d = dict(
|
||||
consumer_key='anonymous',
|
||||
consumer_secret='anonymous'
|
||||
)
|
||||
|
||||
d.update(access_token)
|
||||
|
||||
f = open("oauth_token.dat", "w")
|
||||
|
||||
Reference in New Issue
Block a user