blob: df0209a7221dec503007a524f5cadd07a677b61e [file] [log] [blame]
Joe Gregorioc204b642010-09-21 12:01:23 -04001#!/usr/bin/env python
2#
3# Copyright 2007 Google Inc.
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16#
17
18__author__ = 'jcgregorio@google.com (Joe Gregorio)'
19
Joe Gregorioc5edb3c2011-03-18 10:54:10 -040020import httplib2
Joe Gregoriod44bb002010-09-21 14:34:44 -040021import inspect
Joe Gregorioc5edb3c2011-03-18 10:54:10 -040022import os
Joe Gregorioc204b642010-09-21 12:01:23 -040023import pydoc
24import re
25
26from apiclient.discovery import build
Joe Gregorioc5edb3c2011-03-18 10:54:10 -040027from apiclient.anyjson import simplejson
28from google.appengine.api import memcache
Joe Gregorioc204b642010-09-21 12:01:23 -040029from google.appengine.ext import webapp
Joe Gregorioc5edb3c2011-03-18 10:54:10 -040030from google.appengine.ext.webapp import template
Joe Gregorioc204b642010-09-21 12:01:23 -040031from google.appengine.ext.webapp import util
32
Joe Gregoriod44bb002010-09-21 14:34:44 -040033
Joe Gregorioc204b642010-09-21 12:01:23 -040034class MainHandler(webapp.RequestHandler):
35
36 def get(self):
Joe Gregorioc5edb3c2011-03-18 10:54:10 -040037 http = httplib2.Http(memcache)
38 resp, content = http.request('https://www.googleapis.com/discovery/v0.3/directory?preferred=true')
39 directory = simplejson.loads(content)['items']
40 path = os.path.join(os.path.dirname(__file__), 'index.html')
41 self.response.out.write(
42 template.render(
43 path, {'directory': directory,
44 }))
Joe Gregorioc204b642010-09-21 12:01:23 -040045
Joe Gregorio140062f2010-09-21 16:12:41 -040046
Joe Gregorioafc45f22011-02-20 16:11:28 -050047def render(resource):
48 obj, name = pydoc.resolve(type(resource))
49 return pydoc.html.page(
50 pydoc.describe(obj), pydoc.html.document(obj, name))
51
Joe Gregorioc204b642010-09-21 12:01:23 -040052
Joe Gregorio0fb19e12011-02-22 07:53:24 -050053class ResourceHandler(webapp.RequestHandler):
Joe Gregorioc204b642010-09-21 12:01:23 -040054
55 def get(self, service_name, version, collection):
Joe Gregorio0fb19e12011-02-22 07:53:24 -050056 resource = build(service_name, version)
Joe Gregorio20cfcda2010-10-26 11:58:08 -040057 # descend the object path
Joe Gregorio0fb19e12011-02-22 07:53:24 -050058 if collection:
59 path = collection.split('/')
60 if path:
61 for method in path:
62 resource = getattr(resource, method)()
63 page = render(resource)
Joe Gregorio20cfcda2010-10-26 11:58:08 -040064
Joe Gregorio0fb19e12011-02-22 07:53:24 -050065 collections = []
66 for name in dir(resource):
67 if not "_" in name and callable(getattr(resource, name)) and hasattr(
68 getattr(resource, name), '__is_resource__'):
69 collections.append(name)
Joe Gregorio20cfcda2010-10-26 11:58:08 -040070
Joe Gregorio0fb19e12011-02-22 07:53:24 -050071 if collection is None:
72 collection_path = ''
73 else:
74 collection_path = collection + '/'
75 for name in collections:
76 page = re.sub('strong>(%s)<' % name,
77 r'strong><a href="/%s/%s/%s">\1</a><' % (
78 service_name, version, collection_path + name), page)
Joe Gregorio20cfcda2010-10-26 11:58:08 -040079
Joe Gregorio0fb19e12011-02-22 07:53:24 -050080 # TODO(jcgregorio) breadcrumbs
81 # TODO(jcgregorio) sample code?
82 page = re.sub('<p>', r'<a href="/">Home</a><p>', page, 1)
Joe Gregorioc204b642010-09-21 12:01:23 -040083 self.response.out.write(page)
84
Joe Gregorio140062f2010-09-21 16:12:41 -040085
Joe Gregorioc204b642010-09-21 12:01:23 -040086def main():
87 application = webapp.WSGIApplication(
88 [
89 (r'/', MainHandler),
Joe Gregorio0fb19e12011-02-22 07:53:24 -050090 (r'/([^\/]*)/([^\/]*)(?:/(.*))?', ResourceHandler),
Joe Gregorioc204b642010-09-21 12:01:23 -040091 ],
92 debug=True)
93 util.run_wsgi_app(application)
94
95
96if __name__ == '__main__':
97 main()