| Index: third_party/google_api_python_client/describe.py
|
| diff --git a/third_party/google_api_python_client/describe.py b/third_party/google_api_python_client/describe.py
|
| deleted file mode 100755
|
| index 5dcac904c61a559b6e78003d63576bfdb1759b15..0000000000000000000000000000000000000000
|
| --- a/third_party/google_api_python_client/describe.py
|
| +++ /dev/null
|
| @@ -1,390 +0,0 @@
|
| -#!/usr/bin/python
|
| -#
|
| -# Copyright 2014 Google Inc. All Rights Reserved.
|
| -#
|
| -# 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.
|
| -
|
| -"""Create documentation for generate API surfaces.
|
| -
|
| -Command-line tool that creates documentation for all APIs listed in discovery.
|
| -The documentation is generated from a combination of the discovery document and
|
| -the generated API surface itself.
|
| -"""
|
| -
|
| -__author__ = 'jcgregorio@google.com (Joe Gregorio)'
|
| -
|
| -import argparse
|
| -import json
|
| -import os
|
| -import re
|
| -import string
|
| -import sys
|
| -
|
| -from googleapiclient.discovery import DISCOVERY_URI
|
| -from googleapiclient.discovery import build
|
| -from googleapiclient.discovery import build_from_document
|
| -import httplib2
|
| -import uritemplate
|
| -
|
| -CSS = """<style>
|
| -
|
| -body, h1, h2, h3, div, span, p, pre, a {
|
| - margin: 0;
|
| - padding: 0;
|
| - border: 0;
|
| - font-weight: inherit;
|
| - font-style: inherit;
|
| - font-size: 100%;
|
| - font-family: inherit;
|
| - vertical-align: baseline;
|
| -}
|
| -
|
| -body {
|
| - font-size: 13px;
|
| - padding: 1em;
|
| -}
|
| -
|
| -h1 {
|
| - font-size: 26px;
|
| - margin-bottom: 1em;
|
| -}
|
| -
|
| -h2 {
|
| - font-size: 24px;
|
| - margin-bottom: 1em;
|
| -}
|
| -
|
| -h3 {
|
| - font-size: 20px;
|
| - margin-bottom: 1em;
|
| - margin-top: 1em;
|
| -}
|
| -
|
| -pre, code {
|
| - line-height: 1.5;
|
| - font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
|
| -}
|
| -
|
| -pre {
|
| - margin-top: 0.5em;
|
| -}
|
| -
|
| -h1, h2, h3, p {
|
| - font-family: Arial, sans serif;
|
| -}
|
| -
|
| -h1, h2, h3 {
|
| - border-bottom: solid #CCC 1px;
|
| -}
|
| -
|
| -.toc_element {
|
| - margin-top: 0.5em;
|
| -}
|
| -
|
| -.firstline {
|
| - margin-left: 2 em;
|
| -}
|
| -
|
| -.method {
|
| - margin-top: 1em;
|
| - border: solid 1px #CCC;
|
| - padding: 1em;
|
| - background: #EEE;
|
| -}
|
| -
|
| -.details {
|
| - font-weight: bold;
|
| - font-size: 14px;
|
| -}
|
| -
|
| -</style>
|
| -"""
|
| -
|
| -METHOD_TEMPLATE = """<div class="method">
|
| - <code class="details" id="$name">$name($params)</code>
|
| - <pre>$doc</pre>
|
| -</div>
|
| -"""
|
| -
|
| -COLLECTION_LINK = """<p class="toc_element">
|
| - <code><a href="$href">$name()</a></code>
|
| -</p>
|
| -<p class="firstline">Returns the $name Resource.</p>
|
| -"""
|
| -
|
| -METHOD_LINK = """<p class="toc_element">
|
| - <code><a href="#$name">$name($params)</a></code></p>
|
| -<p class="firstline">$firstline</p>"""
|
| -
|
| -BASE = 'docs/dyn'
|
| -
|
| -DIRECTORY_URI = 'https://www.googleapis.com/discovery/v1/apis?preferred=true'
|
| -
|
| -parser = argparse.ArgumentParser(description=__doc__)
|
| -
|
| -parser.add_argument('--discovery_uri_template', default=DISCOVERY_URI,
|
| - help='URI Template for discovery.')
|
| -
|
| -parser.add_argument('--discovery_uri', default='',
|
| - help=('URI of discovery document. If supplied then only '
|
| - 'this API will be documented.'))
|
| -
|
| -parser.add_argument('--directory_uri', default=DIRECTORY_URI,
|
| - help=('URI of directory document. Unused if --discovery_uri'
|
| - ' is supplied.'))
|
| -
|
| -parser.add_argument('--dest', default=BASE,
|
| - help='Directory name to write documents into.')
|
| -
|
| -
|
| -
|
| -def safe_version(version):
|
| - """Create a safe version of the verion string.
|
| -
|
| - Needed so that we can distinguish between versions
|
| - and sub-collections in URIs. I.e. we don't want
|
| - adsense_v1.1 to refer to the '1' collection in the v1
|
| - version of the adsense api.
|
| -
|
| - Args:
|
| - version: string, The version string.
|
| - Returns:
|
| - The string with '.' replaced with '_'.
|
| - """
|
| -
|
| - return version.replace('.', '_')
|
| -
|
| -
|
| -def unsafe_version(version):
|
| - """Undoes what safe_version() does.
|
| -
|
| - See safe_version() for the details.
|
| -
|
| -
|
| - Args:
|
| - version: string, The safe version string.
|
| - Returns:
|
| - The string with '_' replaced with '.'.
|
| - """
|
| -
|
| - return version.replace('_', '.')
|
| -
|
| -
|
| -def method_params(doc):
|
| - """Document the parameters of a method.
|
| -
|
| - Args:
|
| - doc: string, The method's docstring.
|
| -
|
| - Returns:
|
| - The method signature as a string.
|
| - """
|
| - doclines = doc.splitlines()
|
| - if 'Args:' in doclines:
|
| - begin = doclines.index('Args:')
|
| - if 'Returns:' in doclines[begin+1:]:
|
| - end = doclines.index('Returns:', begin)
|
| - args = doclines[begin+1: end]
|
| - else:
|
| - args = doclines[begin+1:]
|
| -
|
| - parameters = []
|
| - for line in args:
|
| - m = re.search('^\s+([a-zA-Z0-9_]+): (.*)', line)
|
| - if m is None:
|
| - continue
|
| - pname = m.group(1)
|
| - desc = m.group(2)
|
| - if '(required)' not in desc:
|
| - pname = pname + '=None'
|
| - parameters.append(pname)
|
| - parameters = ', '.join(parameters)
|
| - else:
|
| - parameters = ''
|
| - return parameters
|
| -
|
| -
|
| -def method(name, doc):
|
| - """Documents an individual method.
|
| -
|
| - Args:
|
| - name: string, Name of the method.
|
| - doc: string, The methods docstring.
|
| - """
|
| -
|
| - params = method_params(doc)
|
| - return string.Template(METHOD_TEMPLATE).substitute(
|
| - name=name, params=params, doc=doc)
|
| -
|
| -
|
| -def breadcrumbs(path, root_discovery):
|
| - """Create the breadcrumb trail to this page of documentation.
|
| -
|
| - Args:
|
| - path: string, Dot separated name of the resource.
|
| - root_discovery: Deserialized discovery document.
|
| -
|
| - Returns:
|
| - HTML with links to each of the parent resources of this resource.
|
| - """
|
| - parts = path.split('.')
|
| -
|
| - crumbs = []
|
| - accumulated = []
|
| -
|
| - for i, p in enumerate(parts):
|
| - prefix = '.'.join(accumulated)
|
| - # The first time through prefix will be [], so we avoid adding in a
|
| - # superfluous '.' to prefix.
|
| - if prefix:
|
| - prefix += '.'
|
| - display = p
|
| - if i == 0:
|
| - display = root_discovery.get('title', display)
|
| - crumbs.append('<a href="%s.html">%s</a>' % (prefix + p, display))
|
| - accumulated.append(p)
|
| -
|
| - return ' . '.join(crumbs)
|
| -
|
| -
|
| -def document_collection(resource, path, root_discovery, discovery, css=CSS):
|
| - """Document a single collection in an API.
|
| -
|
| - Args:
|
| - resource: Collection or service being documented.
|
| - path: string, Dot separated name of the resource.
|
| - root_discovery: Deserialized discovery document.
|
| - discovery: Deserialized discovery document, but just the portion that
|
| - describes the resource.
|
| - css: string, The CSS to include in the generated file.
|
| - """
|
| - collections = []
|
| - methods = []
|
| - resource_name = path.split('.')[-2]
|
| - html = [
|
| - '<html><body>',
|
| - css,
|
| - '<h1>%s</h1>' % breadcrumbs(path[:-1], root_discovery),
|
| - '<h2>Instance Methods</h2>'
|
| - ]
|
| -
|
| - # Which methods are for collections.
|
| - for name in dir(resource):
|
| - if not name.startswith('_') and callable(getattr(resource, name)):
|
| - if hasattr(getattr(resource, name), '__is_resource__'):
|
| - collections.append(name)
|
| - else:
|
| - methods.append(name)
|
| -
|
| -
|
| - # TOC
|
| - if collections:
|
| - for name in collections:
|
| - if not name.startswith('_') and callable(getattr(resource, name)):
|
| - href = path + name + '.html'
|
| - html.append(string.Template(COLLECTION_LINK).substitute(
|
| - href=href, name=name))
|
| -
|
| - if methods:
|
| - for name in methods:
|
| - if not name.startswith('_') and callable(getattr(resource, name)):
|
| - doc = getattr(resource, name).__doc__
|
| - params = method_params(doc)
|
| - firstline = doc.splitlines()[0]
|
| - html.append(string.Template(METHOD_LINK).substitute(
|
| - name=name, params=params, firstline=firstline))
|
| -
|
| - if methods:
|
| - html.append('<h3>Method Details</h3>')
|
| - for name in methods:
|
| - dname = name.rsplit('_')[0]
|
| - html.append(method(name, getattr(resource, name).__doc__))
|
| -
|
| - html.append('</body></html>')
|
| -
|
| - return '\n'.join(html)
|
| -
|
| -
|
| -def document_collection_recursive(resource, path, root_discovery, discovery):
|
| -
|
| - html = document_collection(resource, path, root_discovery, discovery)
|
| -
|
| - f = open(os.path.join(FLAGS.dest, path + 'html'), 'w')
|
| - f.write(html.encode('utf-8'))
|
| - f.close()
|
| -
|
| - for name in dir(resource):
|
| - if (not name.startswith('_')
|
| - and callable(getattr(resource, name))
|
| - and hasattr(getattr(resource, name), '__is_resource__')):
|
| - dname = name.rsplit('_')[0]
|
| - collection = getattr(resource, name)()
|
| - document_collection_recursive(collection, path + name + '.', root_discovery,
|
| - discovery['resources'].get(dname, {}))
|
| -
|
| -def document_api(name, version):
|
| - """Document the given API.
|
| -
|
| - Args:
|
| - name: string, Name of the API.
|
| - version: string, Version of the API.
|
| - """
|
| - service = build(name, version)
|
| - response, content = http.request(
|
| - uritemplate.expand(
|
| - FLAGS.discovery_uri_template, {
|
| - 'api': name,
|
| - 'apiVersion': version})
|
| - )
|
| - discovery = json.loads(content)
|
| -
|
| - version = safe_version(version)
|
| -
|
| - document_collection_recursive(
|
| - service, '%s_%s.' % (name, version), discovery, discovery)
|
| -
|
| -
|
| -def document_api_from_discovery_document(uri):
|
| - """Document the given API.
|
| -
|
| - Args:
|
| - uri: string, URI of discovery document.
|
| - """
|
| - http = httplib2.Http()
|
| - response, content = http.request(FLAGS.discovery_uri)
|
| - discovery = json.loads(content)
|
| -
|
| - service = build_from_document(discovery)
|
| -
|
| - name = discovery['version']
|
| - version = safe_version(discovery['version'])
|
| -
|
| - document_collection_recursive(
|
| - service, '%s_%s.' % (name, version), discovery, discovery)
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - FLAGS = parser.parse_args(sys.argv[1:])
|
| - if FLAGS.discovery_uri:
|
| - document_api_from_discovery_document(FLAGS.discovery_uri)
|
| - else:
|
| - http = httplib2.Http()
|
| - resp, content = http.request(
|
| - FLAGS.directory_uri,
|
| - headers={'X-User-IP': '0.0.0.0'})
|
| - if resp.status == 200:
|
| - directory = json.loads(content)['items']
|
| - for api in directory:
|
| - document_api(api['name'], api['version'])
|
| - else:
|
| - sys.exit("Failed to load the discovery document.")
|
|
|