| Index: third_party/google-endpoints/apitools/gen/gen_client_lib.py
|
| diff --git a/third_party/google-endpoints/apitools/gen/gen_client_lib.py b/third_party/google-endpoints/apitools/gen/gen_client_lib.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..804476149e86ec122b929ccb02246d6b5bf9e067
|
| --- /dev/null
|
| +++ b/third_party/google-endpoints/apitools/gen/gen_client_lib.py
|
| @@ -0,0 +1,293 @@
|
| +#!/usr/bin/env python
|
| +#
|
| +# Copyright 2015 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.
|
| +
|
| +"""Simple tool for generating a client library.
|
| +
|
| +Relevant links:
|
| + https://developers.google.com/discovery/v1/reference/apis#resource
|
| +"""
|
| +
|
| +import datetime
|
| +
|
| +from six.moves import urllib_parse
|
| +
|
| +from apitools.gen import command_registry
|
| +from apitools.gen import message_registry
|
| +from apitools.gen import service_registry
|
| +from apitools.gen import util
|
| +
|
| +
|
| +def _ApitoolsVersion():
|
| + """Returns version of the currently installed google-apitools package."""
|
| + import pkg_resources
|
| + return pkg_resources.get_distribution('google-apitools').version
|
| +
|
| +
|
| +def _StandardQueryParametersSchema(discovery_doc):
|
| + """Sets up dict of standard query parameters."""
|
| + standard_query_schema = {
|
| + 'id': 'StandardQueryParameters',
|
| + 'type': 'object',
|
| + 'description': 'Query parameters accepted by all methods.',
|
| + 'properties': discovery_doc.get('parameters', {}),
|
| + }
|
| + # We add an entry for the trace, since Discovery doesn't.
|
| + standard_query_schema['properties']['trace'] = {
|
| + 'type': 'string',
|
| + 'description': ('A tracing token of the form "token:<tokenid>" '
|
| + 'to include in api requests.'),
|
| + 'location': 'query',
|
| + }
|
| + return standard_query_schema
|
| +
|
| +
|
| +def _ComputePaths(package, version, discovery_doc):
|
| + full_path = urllib_parse.urljoin(
|
| + discovery_doc['rootUrl'], discovery_doc['servicePath'])
|
| + api_path_component = '/'.join((package, version, ''))
|
| + if api_path_component not in full_path:
|
| + return full_path, ''
|
| + prefix, _, suffix = full_path.rpartition(api_path_component)
|
| + return prefix + api_path_component, suffix
|
| +
|
| +
|
| +class DescriptorGenerator(object):
|
| +
|
| + """Code generator for a given discovery document."""
|
| +
|
| + def __init__(self, discovery_doc, client_info, names, root_package, outdir,
|
| + base_package, protorpc_package, generate_cli=False,
|
| + use_proto2=False, unelidable_request_methods=None,
|
| + apitools_version=''):
|
| + self.__discovery_doc = discovery_doc
|
| + self.__client_info = client_info
|
| + self.__outdir = outdir
|
| + self.__use_proto2 = use_proto2
|
| + self.__description = util.CleanDescription(
|
| + self.__discovery_doc.get('description', ''))
|
| + self.__package = self.__client_info.package
|
| + self.__version = self.__client_info.version
|
| + self.__revision = discovery_doc.get('revision', '1')
|
| + self.__generate_cli = generate_cli
|
| + self.__root_package = root_package
|
| + self.__base_files_package = base_package
|
| + self.__protorpc_package = protorpc_package
|
| + self.__names = names
|
| + self.__base_url, self.__base_path = _ComputePaths(
|
| + self.__package, self.__client_info.url_version,
|
| + self.__discovery_doc)
|
| +
|
| + # Order is important here: we need the schemas before we can
|
| + # define the services.
|
| + self.__message_registry = message_registry.MessageRegistry(
|
| + self.__client_info, self.__names, self.__description,
|
| + self.__root_package, self.__base_files_package,
|
| + self.__protorpc_package)
|
| + schemas = self.__discovery_doc.get('schemas', {})
|
| + for schema_name, schema in schemas.items():
|
| + self.__message_registry.AddDescriptorFromSchema(
|
| + schema_name, schema)
|
| +
|
| + # We need to add one more message type for the global parameters.
|
| + standard_query_schema = _StandardQueryParametersSchema(
|
| + self.__discovery_doc)
|
| + self.__message_registry.AddDescriptorFromSchema(
|
| + standard_query_schema['id'], standard_query_schema)
|
| +
|
| + # Now that we know all the messages, we need to correct some
|
| + # fields from MessageFields to EnumFields.
|
| + self.__message_registry.FixupMessageFields()
|
| +
|
| + self.__command_registry = command_registry.CommandRegistry(
|
| + self.__package, self.__version, self.__client_info,
|
| + self.__message_registry, self.__root_package,
|
| + self.__base_files_package, self.__protorpc_package,
|
| + self.__base_url, self.__names)
|
| + self.__command_registry.AddGlobalParameters(
|
| + self.__message_registry.LookupDescriptorOrDie(
|
| + 'StandardQueryParameters'))
|
| +
|
| + self.__services_registry = service_registry.ServiceRegistry(
|
| + self.__client_info,
|
| + self.__message_registry,
|
| + self.__command_registry,
|
| + self.__base_url,
|
| + self.__base_path,
|
| + self.__names,
|
| + self.__root_package,
|
| + self.__base_files_package,
|
| + unelidable_request_methods or [])
|
| + services = self.__discovery_doc.get('resources', {})
|
| + for service_name, methods in sorted(services.items()):
|
| + self.__services_registry.AddServiceFromResource(
|
| + service_name, methods)
|
| + # We might also have top-level methods.
|
| + api_methods = self.__discovery_doc.get('methods', [])
|
| + if api_methods:
|
| + self.__services_registry.AddServiceFromResource(
|
| + 'api', {'methods': api_methods})
|
| + # pylint: disable=protected-access
|
| + self.__client_info = self.__client_info._replace(
|
| + scopes=self.__services_registry.scopes)
|
| +
|
| + # The apitools version that will be used in prerequisites for the
|
| + # generated packages.
|
| + self.__apitools_version = (
|
| + apitools_version if apitools_version else _ApitoolsVersion())
|
| +
|
| + @property
|
| + def client_info(self):
|
| + return self.__client_info
|
| +
|
| + @property
|
| + def discovery_doc(self):
|
| + return self.__discovery_doc
|
| +
|
| + @property
|
| + def names(self):
|
| + return self.__names
|
| +
|
| + @property
|
| + def outdir(self):
|
| + return self.__outdir
|
| +
|
| + @property
|
| + def package(self):
|
| + return self.__package
|
| +
|
| + @property
|
| + def use_proto2(self):
|
| + return self.__use_proto2
|
| +
|
| + @property
|
| + def apitools_version(self):
|
| + return self.__apitools_version
|
| +
|
| + def _GetPrinter(self, out):
|
| + printer = util.SimplePrettyPrinter(out)
|
| + return printer
|
| +
|
| + def WriteInit(self, out):
|
| + """Write a simple __init__.py for the generated client."""
|
| + printer = self._GetPrinter(out)
|
| + printer('"""Common imports for generated %s client library."""',
|
| + self.__client_info.package)
|
| + printer('# pylint:disable=wildcard-import')
|
| + printer()
|
| + printer('import pkgutil')
|
| + printer()
|
| + printer('from %s import *', self.__base_files_package)
|
| + if self.__root_package == '.':
|
| + import_prefix = ''
|
| + else:
|
| + import_prefix = '%s.' % self.__root_package
|
| + if self.__generate_cli:
|
| + printer('from %s%s import *',
|
| + import_prefix, self.__client_info.cli_rule_name)
|
| + printer('from %s%s import *',
|
| + import_prefix, self.__client_info.client_rule_name)
|
| + printer('from %s%s import *',
|
| + import_prefix, self.__client_info.messages_rule_name)
|
| + printer()
|
| + printer('__path__ = pkgutil.extend_path(__path__, __name__)')
|
| +
|
| + def WriteIntermediateInit(self, out):
|
| + """Write a simple __init__.py for an intermediate directory."""
|
| + printer = self._GetPrinter(out)
|
| + printer('#!/usr/bin/env python')
|
| + printer('"""Shared __init__.py for apitools."""')
|
| + printer()
|
| + printer('from pkgutil import extend_path')
|
| + printer('__path__ = extend_path(__path__, __name__)')
|
| +
|
| + def WriteSetupPy(self, out):
|
| + """Write a setup.py for upload to PyPI."""
|
| + printer = self._GetPrinter(out)
|
| + year = datetime.datetime.now().year
|
| + printer('# Copyright %s Google Inc. All Rights Reserved.' % year)
|
| + printer('#')
|
| + printer('# Licensed under the Apache License, Version 2.0 (the'
|
| + '"License");')
|
| + printer('# you may not use this file except in compliance with '
|
| + 'the License.')
|
| + printer('# You may obtain a copy of the License at')
|
| + printer('#')
|
| + printer('# http://www.apache.org/licenses/LICENSE-2.0')
|
| + printer('#')
|
| + printer('# Unless required by applicable law or agreed to in writing, '
|
| + 'software')
|
| + printer('# distributed under the License is distributed on an "AS IS" '
|
| + 'BASIS,')
|
| + printer('# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either '
|
| + 'express or implied.')
|
| + printer('# See the License for the specific language governing '
|
| + 'permissions and')
|
| + printer('# limitations under the License.')
|
| + printer()
|
| + printer('import setuptools')
|
| + printer('REQUIREMENTS = [')
|
| + with printer.Indent(indent=' '):
|
| + if self.apitools_version.startswith('0.4.'):
|
| + printer('"google-apitools>=0.4.8,<0.5",')
|
| + else:
|
| + printer('"google-apitools==%s",', self.apitools_version)
|
| + printer('"httplib2>=0.9",')
|
| + printer('"oauth2client>=1.4.12",')
|
| + printer(']')
|
| + printer('_PACKAGE = "apitools.clients.%s"' % self.__package)
|
| + printer()
|
| + printer('setuptools.setup(')
|
| + # TODO(craigcitro): Allow customization of these options.
|
| + with printer.Indent(indent=' '):
|
| + printer('name="google-apitools-%s-%s",',
|
| + self.__package, self.__version)
|
| + if self.apitools_version.startswith('0.4.'):
|
| + printer('version="0.4.%s",', self.__revision)
|
| + else:
|
| + printer('version="%s.%s",',
|
| + self.apitools_version, self.__revision)
|
| + printer('description="Autogenerated apitools library for %s",' % (
|
| + self.__package,))
|
| + printer('url="https://github.com/google/apitools",')
|
| + printer('author="Craig Citro",')
|
| + printer('author_email="craigcitro@google.com",')
|
| + printer('packages=setuptools.find_packages(),')
|
| + printer('install_requires=REQUIREMENTS,')
|
| + printer('classifiers=[')
|
| + with printer.Indent(indent=' '):
|
| + printer('"Programming Language :: Python :: 2.7",')
|
| + printer('"License :: OSI Approved :: Apache Software '
|
| + 'License",')
|
| + printer('],')
|
| + printer('license="Apache 2.0",')
|
| + printer('keywords="apitools apitools-%s %s",' % (
|
| + self.__package, self.__package))
|
| + printer(')')
|
| +
|
| + def WriteMessagesFile(self, out):
|
| + self.__message_registry.WriteFile(self._GetPrinter(out))
|
| +
|
| + def WriteMessagesProtoFile(self, out):
|
| + self.__message_registry.WriteProtoFile(self._GetPrinter(out))
|
| +
|
| + def WriteServicesProtoFile(self, out):
|
| + self.__services_registry.WriteProtoFile(self._GetPrinter(out))
|
| +
|
| + def WriteClientLibrary(self, out):
|
| + self.__services_registry.WriteFile(self._GetPrinter(out))
|
| +
|
| + def WriteCli(self, out):
|
| + self.__command_registry.WriteFile(self._GetPrinter(out))
|
|
|