diff --git a/apiclient/contrib/latitude/future.json b/apiclient/contrib/latitude/future.json index 3fef33a..e44d410 100644 --- a/apiclient/contrib/latitude/future.json +++ b/apiclient/contrib/latitude/future.json @@ -2,73 +2,73 @@ "data": { "latitude": { "v1": { - "baseUrl": "https://www.googleapis.com/", + "baseUrl": "https://www.googleapis.com/", "auth": { "request": { "url": "https://www.google.com/accounts/OAuthGetRequestToken", "parameters": { "xoauth_displayname": { "parameterType": "query", - "required": False + "required": false }, "domain": { "parameterType": "query", - "required": True + "required": true }, "scope": { "parameterType": "query", - "required": True - }, - }, + "required": true + } + } }, "authorize": { "url": "https://www.google.com/latitude/apps/OAuthAuthorizeToken", "parameters": { "oauth_token": { "parameterType": "query", - "required": True + "required": true }, "iconUrl": { "parameterType": "query", - "required": False + "required": false }, "domain": { "parameterType": "query", - "required": True + "required": true }, "scope": { "parameterType": "query", - "required": True - }, - }, + "required": true + } + } }, "access": { "url": "https://www.google.com/accounts/OAuthGetAccessToken", "parameters": { "domain": { "parameterType": "query", - "required": True + "required": true }, "scope": { "parameterType": "query", - "required": True - }, - }, - }, + "required": true + } + } + } }, "resources": { "currentLocation": { "methods": { - "delete": {}, - "get": {}, + "delete": {}, + "get": {}, "insert": {} } - }, + }, "location": { "methods": { - "delete": {}, - "get": {}, - "insert": {}, + "delete": {}, + "get": {}, + "insert": {}, "list": {} } } diff --git a/apiclient/discovery.py b/apiclient/discovery.py index 9ba279d..cbba1dc 100644 --- a/apiclient/discovery.py +++ b/apiclient/discovery.py @@ -108,13 +108,15 @@ class JsonModel(object): raise HttpError(simplejson.loads(content)['error']) -def build(serviceName, version, http=httplib2.Http(), +def build(serviceName, version, http=None, discoveryServiceUrl=DISCOVERY_URI, auth=None, model=JsonModel()): params = { 'api': serviceName, 'apiVersion': version } + if http is None: + http = httplib2.Http() requested_url = uritemplate.expand(discoveryServiceUrl, params) logging.info('URL being requested: %s' % requested_url) resp, content = http.request(requested_url) diff --git a/samples/helpdoc/apiclient b/samples/helpdoc/apiclient new file mode 120000 index 0000000..22e4c9c --- /dev/null +++ b/samples/helpdoc/apiclient @@ -0,0 +1 @@ +../../apiclient/ \ No newline at end of file diff --git a/samples/helpdoc/app.yaml b/samples/helpdoc/app.yaml new file mode 100644 index 0000000..5a357dc --- /dev/null +++ b/samples/helpdoc/app.yaml @@ -0,0 +1,12 @@ +application: api-python-client-doc +version: 1 +runtime: python +api_version: 1 + +handlers: +- url: /static + static_dir: static + +- url: .* + script: main.py + diff --git a/samples/helpdoc/httplib2 b/samples/helpdoc/httplib2 new file mode 120000 index 0000000..488ae9f --- /dev/null +++ b/samples/helpdoc/httplib2 @@ -0,0 +1 @@ +../../httplib2/ \ No newline at end of file diff --git a/samples/helpdoc/index.yaml b/samples/helpdoc/index.yaml new file mode 100644 index 0000000..a3b9e05 --- /dev/null +++ b/samples/helpdoc/index.yaml @@ -0,0 +1,11 @@ +indexes: + +# AUTOGENERATED + +# This index.yaml is automatically updated whenever the dev_appserver +# detects that a new type of query is run. If you want to manage the +# index.yaml file manually, remove the above marker line (the line +# saying "# AUTOGENERATED"). If you want to manage some indexes +# manually, move them above the marker line. The index.yaml file is +# automatically uploaded to the admin console when you next deploy +# your application using appcfg.py. diff --git a/samples/helpdoc/main.py b/samples/helpdoc/main.py new file mode 100755 index 0000000..ae87b3e --- /dev/null +++ b/samples/helpdoc/main.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python +# +# Copyright 2007 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +__author__ = 'jcgregorio@google.com (Joe Gregorio)' + + +import inspect +import pydoc +import re + +from apiclient.discovery import build + +from google.appengine.ext import webapp +from google.appengine.ext.webapp import util + +# Replicate render_doc here from pydoc.py as it isn't available in Python 2.5 +class _OldStyleClass: pass + +def render_doc(thing, title='Python Library Documentation: %s', forceload=0): + """Render text documentation, given an object or a path to an object.""" + object, name = pydoc.resolve(thing, forceload) + desc = pydoc.describe(object) + module = inspect.getmodule(object) + if name and '.' in name: + desc += ' in ' + name[:name.rfind('.')] + elif module and module is not object: + desc += ' in module ' + module.__name__ + if type(object) is type(_OldStyleClass()): + # If the passed object is an instance of an old-style class, + # document its available methods instead of its value. + object = object.__class__ + elif not (inspect.ismodule(object) or + inspect.isclass(object) or + inspect.isroutine(object) or + inspect.isgetsetdescriptor(object) or + inspect.ismemberdescriptor(object) or + isinstance(object, property)): + # If the passed object is a piece of data or an instance, + # document its available methods instead of its value. + object = type(object) + desc += ' object' + return title % desc + '\n\n' + pydoc.text.document(object, name) + + +class MainHandler(webapp.RequestHandler): + + def get(self): + self.response.out.write(""" +

Google API Client for Python Documentation

+ + """) + + +class ServiceHandler(webapp.RequestHandler): + + def get(self, service_name, version): + service = build(service_name, version) + page = "

Home

%s
" % pydoc.plain(render_doc(service)) + + collections = [] + for name in dir(service): + if not "_" in name and callable(getattr(service, name)): + collections.append(name) + + for name in collections: + page = re.sub('(%s) =' % name, r'\1 =' % (service_name, version, name), page) + + self.response.out.write(page) + + +class CollectionHandler(webapp.RequestHandler): + + def get(self, service_name, version, collection): + service = build(service_name, version) + page = "

Home

%s
" % pydoc.plain(render_doc(getattr(service, collection)())) + self.response.out.write(page) + + +def main(): + application = webapp.WSGIApplication( + [ + (r'/', MainHandler), + (r'/(\w*)/(\w*)', ServiceHandler), + (r'/(\w*)/(\w*)/(\w*)', CollectionHandler), + ], + debug=True) + util.run_wsgi_app(application) + + +if __name__ == '__main__': + main() diff --git a/samples/helpdoc/oauth2 b/samples/helpdoc/oauth2 new file mode 120000 index 0000000..af104cc --- /dev/null +++ b/samples/helpdoc/oauth2 @@ -0,0 +1 @@ +../../oauth2 \ No newline at end of file diff --git a/samples/helpdoc/simplejson b/samples/helpdoc/simplejson new file mode 120000 index 0000000..148c7cf --- /dev/null +++ b/samples/helpdoc/simplejson @@ -0,0 +1 @@ +../../simplejson/ \ No newline at end of file diff --git a/samples/helpdoc/uritemplate b/samples/helpdoc/uritemplate new file mode 120000 index 0000000..ce92dcb --- /dev/null +++ b/samples/helpdoc/uritemplate @@ -0,0 +1 @@ +../../uritemplate/ \ No newline at end of file