switch over to using discovery v0.3, now using descriptions if available

This commit is contained in:
Joe Gregorio
2011-02-18 13:53:54 -05:00
parent d81ecb05c9
commit 790bddd37c
3 changed files with 24 additions and 16 deletions

View File

@@ -43,8 +43,9 @@ from errors import UnknownLinkType
URITEMPLATE = re.compile('{[^}]*}') URITEMPLATE = re.compile('{[^}]*}')
VARNAME = re.compile('[a-zA-Z0-9_-]+') VARNAME = re.compile('[a-zA-Z0-9_-]+')
DISCOVERY_URI = ('https://www.googleapis.com/discovery/v0.2beta1/describe/' DISCOVERY_URI = ('https://www.googleapis.com/discovery/v0.3/describe/'
'{api}/{apiVersion}') '{api}/{apiVersion}')
DEFAULT_METHOD_DOC = 'A description of how to use this function'
def key2param(key): def key2param(key):
@@ -193,8 +194,11 @@ def createResource(http, baseUrl, model, requestBuilder,
argmap = {} argmap = {}
if httpMethod in ['PUT', 'POST']: if httpMethod in ['PUT', 'POST']:
argmap['body'] = 'body' if 'parameters' not in methodDesc:
methodDesc['parameters'] = {}
methodDesc['parameters']['body'] = {
'description': 'The request body.',
}
required_params = [] # Required parameters required_params = [] # Required parameters
pattern_params = {} # Parameters that must match a regex pattern_params = {} # Parameters that must match a regex
@@ -273,12 +277,16 @@ def createResource(http, baseUrl, model, requestBuilder,
headers=headers, headers=headers,
methodId=methodId) methodId=methodId)
docs = ['A description of how to use this function\n\n'] docs = [methodDesc.get('description', DEFAULT_METHOD_DOC), '\n\n']
if len(argmap) > 0:
docs.append("Args:\n")
for arg in argmap.iterkeys(): for arg in argmap.iterkeys():
required = "" required = ""
if arg in required_params: if arg in required_params:
required = " (required)" required = " (required)"
docs.append('%s - A parameter%s\n' % (arg, required)) paramdoc = methodDesc['parameters'][argmap[arg]].get(
'description', 'A parameter')
docs.append(' %s: %s%s\n' % (arg, paramdoc, required))
setattr(method, '__doc__', ''.join(docs)) setattr(method, '__doc__', ''.join(docs))
setattr(theclass, methodName, method) setattr(theclass, methodName, method)
@@ -286,7 +294,7 @@ def createResource(http, baseUrl, model, requestBuilder,
def createNextMethod(theclass, methodName, methodDesc, futureDesc): def createNextMethod(theclass, methodName, methodDesc, futureDesc):
methodId = methodDesc['rpcMethod'] + '.next' methodId = methodDesc['rpcMethod'] + '.next'
def method(self, previous): def methodNext(self, previous):
""" """
Takes a single argument, 'body', which is the results Takes a single argument, 'body', which is the results
from the last call, and returns the next set of items from the last call, and returns the next set of items
@@ -326,7 +334,7 @@ def createResource(http, baseUrl, model, requestBuilder,
headers=headers, headers=headers,
methodId=methodId) methodId=methodId)
setattr(theclass, methodName, method) setattr(theclass, methodName, methodNext)
# Add basic methods to Resource # Add basic methods to Resource
if 'methods' in resourceDesc: if 'methods' in resourceDesc:
@@ -340,24 +348,23 @@ def createResource(http, baseUrl, model, requestBuilder,
# Add in nested resources # Add in nested resources
if 'resources' in resourceDesc: if 'resources' in resourceDesc:
def createMethod(theclass, methodName, methodDesc, futureDesc): def createResourceMethod(theclass, methodName, methodDesc, futureDesc):
def method(self): def methodResource(self):
return createResource(self._http, self._baseUrl, self._model, return createResource(self._http, self._baseUrl, self._model,
self._requestBuilder, self._developerKey, self._requestBuilder, self._developerKey,
methodDesc, futureDesc) methodDesc, futureDesc)
setattr(method, '__doc__', 'A description of how to use this function') setattr(methodResource, '__doc__', 'A collection resource.')
setattr(method, '__is_resource__', True) setattr(methodResource, '__is_resource__', True)
setattr(theclass, methodName, method) setattr(theclass, methodName, methodResource)
for methodName, methodDesc in resourceDesc['resources'].iteritems(): for methodName, methodDesc in resourceDesc['resources'].iteritems():
if futureDesc and 'resources' in futureDesc: if futureDesc and 'resources' in futureDesc:
future = futureDesc['resources'].get(methodName, {}) future = futureDesc['resources'].get(methodName, {})
else: else:
future = {} future = {}
createMethod(Resource, methodName, methodDesc, createResourceMethod(Resource, methodName, methodDesc, future)
future)
# Add <m>_next() methods to Resource # Add <m>_next() methods to Resource
if futureDesc and 'methods' in futureDesc: if futureDesc and 'methods' in futureDesc:

View File

@@ -88,7 +88,8 @@ class ServiceHandler(webapp.RequestHandler):
collections = [] collections = []
for name in dir(service): for name in dir(service):
if not "_" in name and callable(getattr(service, name)): if not "_" in name and callable(getattr(service, name)) and hasattr(
getattr(service, name), '__is_resource__'):
collections.append(name) collections.append(name)
for name in collections: for name in collections:

View File

@@ -35,7 +35,7 @@ def main():
flow = FlowThreeLegged(buzz_discovery, flow = FlowThreeLegged(buzz_discovery,
consumer_key='anonymous', consumer_key='anonymous',
consumer_secret='anonymous', consumer_secret='anonymous',
user_agent='google-api-client-python-buzz-cmdline/1.0', user_agent='python-buzz-sample/1.0',
domain='anonymous', domain='anonymous',
scope='https://www.googleapis.com/auth/buzz', scope='https://www.googleapis.com/auth/buzz',
xoauth_displayname='Google API Client Example App') xoauth_displayname='Google API Client Example App')