Index: tools/telemetry/third_party/gsutil/third_party/protorpc/gen_protorpc.py |
diff --git a/tools/telemetry/third_party/gsutil/third_party/protorpc/gen_protorpc.py b/tools/telemetry/third_party/gsutil/third_party/protorpc/gen_protorpc.py |
deleted file mode 100644 |
index 101a70ff12f29bb6ecf5f0b6e0f8a7d5c5c04728..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/third_party/gsutil/third_party/protorpc/gen_protorpc.py |
+++ /dev/null |
@@ -1,300 +0,0 @@ |
-#!/usr/bin/env python |
-# |
-# Copyright 2011 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. |
-# |
- |
-"""Command line tool for generating ProtoRPC definitions from descriptors.""" |
- |
-import errno |
-import logging |
-import optparse |
-import os |
-import sys |
- |
-from protorpc import descriptor |
-from protorpc import generate_python |
-from protorpc import protobuf |
-from protorpc import registry |
-from protorpc import transport |
-from protorpc import util |
- |
-EXCLUDED_PACKAGES = frozenset(['protorpc.registry', |
- 'protorpc.messages', |
- 'protorpc.descriptor', |
- 'protorpc.message_types', |
- ]) |
- |
-commands = {} |
- |
- |
-def usage(): |
- """Print usage help and exit with an error code.""" |
- parser.print_help() |
- sys.exit(2) |
- |
- |
-def fatal_error(message): |
- """Print fatal error messages exit with an error code. |
- |
- Args: |
- message: Message to print to stderr before exit. |
- """ |
- sys.stderr.write(message) |
- sys.exit(1) |
- |
- |
-def open_input_file(filename): |
- """Open file for reading. |
- |
- Args: |
- filename: Name of input file to open or None to open stdin. |
- |
- Returns: |
- Opened file if string provided, stdin if filename is None. |
- """ |
- # TODO(rafek): Detect missing or invalid files, generating user friendly |
- # error messages. |
- if filename is None: |
- return sys.stdin |
- else: |
- try: |
- return open(filename, 'rb') |
- except IOError, err: |
- fatal_error(str(err)) |
- |
- |
-@util.positional(1) |
-def generate_file_descriptor(dest_dir, file_descriptor, force_overwrite): |
- """Generate a single file descriptor to destination directory. |
- |
- Will generate a single Python file from a file descriptor under dest_dir. |
- The sub-directory where the file is generated is determined by the package |
- name of descriptor. |
- |
- Descriptors without package names will not be generated. |
- |
- Descriptors that are part of the ProtoRPC distribution will not be generated. |
- |
- Args: |
- dest_dir: Directory under which to generate files. |
- file_descriptor: FileDescriptor instance to generate source code from. |
- force_overwrite: If True, existing files will be overwritten. |
- """ |
- package = file_descriptor.package |
- if not package: |
- # TODO(rafek): Option to cause an error on this condition. |
- logging.warn('Will not generate descriptor without package name') |
- return |
- |
- if package in EXCLUDED_PACKAGES: |
- logging.warn('Will not generate main ProtoRPC class %s' % package) |
- return |
- |
- package_path = package.split('.') |
- directory = package_path[:-1] |
- package_file_name = package_path[-1] |
- directory_name = os.path.join(dest_dir, *directory) |
- output_file_name = os.path.join(directory_name, |
- '%s.py' % (package_file_name,)) |
- |
- try: |
- os.makedirs(directory_name) |
- except OSError, err: |
- if err.errno != errno.EEXIST: |
- raise |
- |
- if not force_overwrite and os.path.exists(output_file_name): |
- logging.warn('Not overwriting %s with package %s', |
- output_file_name, package) |
- return |
- |
- output_file = open(output_file_name, 'w') |
- |
- logging.info('Writing package %s to %s', |
- file_descriptor.package, output_file_name) |
- generate_python.format_python_file(file_descriptor, output_file) |
- |
- |
-@util.positional(1) |
-def command(name, required=(), optional=()): |
- """Decorator used for declaring commands used on command line. |
- |
- Each command of this tool can have any number of sequential required |
- parameters and optional parameters. The required and optional parameters |
- will be displayed in the command usage. Arguments passed in to the command |
- are checked to ensure they have at least the required parameters and not |
- too many parameters beyond the optional ones. When there are not enough |
- or too few parameters the usage message is generated and the program exits |
- with an error code. |
- |
- Functions decorated thus are added to commands by their name. |
- |
- Resulting decorated functions will have required and optional attributes |
- assigned to them so that appear in the usage message. |
- |
- Args: |
- name: Name of command that will follow the program name on the command line. |
- required: List of required parameter names as displayed in the usage |
- message. |
- optional: List of optional parameter names as displayed in the usage |
- message. |
- """ |
- def check_params_decorator(function): |
- def check_params_wrapper(options, *args): |
- if not (len(required) <= len(args) <= len(required) + len(optional)): |
- sys.stderr.write("Incorrect usage for command '%s'\n\n" % name) |
- usage() |
- function(options, *args) |
- check_params_wrapper.required = required |
- check_params_wrapper.optional = optional |
- commands[name] = check_params_wrapper |
- return check_params_wrapper |
- return check_params_decorator |
- |
- |
-@command('file', optional=['input-filename', 'output-filename']) |
-def file_command(options, input_filename=None, output_filename=None): |
- """Generate a single descriptor file to Python. |
- |
- Args: |
- options: Parsed command line options. |
- input_filename: File to read protobuf FileDescriptor from. If None |
- will read from stdin. |
- output_filename: File to write Python source code to. If None will |
- generate to stdout. |
- """ |
- with open_input_file(input_filename) as input_file: |
- descriptor_content = input_file.read() |
- |
- if output_filename: |
- output_file = open(output_filename, 'w') |
- else: |
- output_file = sys.stdout |
- |
- file_descriptor = protobuf.decode_message(descriptor.FileDescriptor, |
- descriptor_content) |
- generate_python.format_python_file(file_descriptor, output_file) |
- |
- |
-@command('fileset', optional=['filename']) |
-def fileset_command(options, input_filename=None): |
- """Generate source directory structure from FileSet. |
- |
- Args: |
- options: Parsed command line options. |
- input_filename: File to read protobuf FileSet from. If None will read from |
- stdin. |
- """ |
- with open_input_file(input_filename) as input_file: |
- descriptor_content = input_file.read() |
- |
- dest_dir = os.path.expanduser(options.dest_dir) |
- |
- if not os.path.isdir(dest_dir) and os.path.exists(dest_dir): |
- fatal_error("Destination '%s' is not a directory" % dest_dir) |
- |
- file_set = protobuf.decode_message(descriptor.FileSet, |
- descriptor_content) |
- |
- for file_descriptor in file_set.files: |
- generate_file_descriptor(dest_dir, file_descriptor=file_descriptor, |
- force_overwrite=options.force) |
- |
- |
-@command('registry', |
- required=['host'], |
- optional=['service-name', 'registry-path']) |
-def registry_command(options, |
- host, |
- service_name=None, |
- registry_path='/protorpc'): |
- """Generate source directory structure from remote registry service. |
- |
- Args: |
- options: Parsed command line options. |
- host: Web service host where registry service is located. May include |
- port. |
- service_name: Name of specific service to read. Will generate only Python |
- files that service is dependent on. If None, will generate source code |
- for all services known by the registry. |
- registry_path: Path to find registry if not the default 'protorpc'. |
- """ |
- dest_dir = os.path.expanduser(options.dest_dir) |
- |
- url = 'http://%s%s' % (host, registry_path) |
- reg = registry.RegistryService.Stub(transport.HttpTransport(url)) |
- |
- if service_name is None: |
- service_names = [service.name for service in reg.services().services] |
- else: |
- service_names = [service_name] |
- |
- file_set = reg.get_file_set(names=service_names).file_set |
- |
- for file_descriptor in file_set.files: |
- generate_file_descriptor(dest_dir, file_descriptor=file_descriptor, |
- force_overwrite=options.force) |
- |
- |
-def make_opt_parser(): |
- """Create options parser with automatically generated command help. |
- |
- Will iterate over all functions in commands and generate an appropriate |
- usage message for them with all their required and optional parameters. |
- """ |
- command_descriptions = [] |
- for name in sorted(commands.iterkeys()): |
- command = commands[name] |
- params = ' '.join(['<%s>' % param for param in command.required] + |
- ['[<%s>]' % param for param in command.optional]) |
- command_descriptions.append('%%prog [options] %s %s' % (name, params)) |
- command_usage = 'usage: %s\n' % '\n '.join(command_descriptions) |
- |
- parser = optparse.OptionParser(usage=command_usage) |
- parser.add_option('-d', '--dest_dir', |
- dest='dest_dir', |
- default=os.getcwd(), |
- help='Write generated files to DIR', |
- metavar='DIR') |
- parser.add_option('-f', '--force', |
- action='store_true', |
- dest='force', |
- default=False, |
- help='Force overwrite of existing files') |
- return parser |
- |
-parser = make_opt_parser() |
- |
- |
-def main(): |
- # TODO(rafek): Customize verbosity. |
- logging.basicConfig(level=logging.INFO) |
- options, positional = parser.parse_args() |
- |
- if not positional: |
- usage() |
- |
- command_name = positional[0] |
- command = commands.get(command_name) |
- if not command: |
- sys.stderr.write("Unknown command '%s'\n\n" % command_name) |
- usage() |
- parameters = positional[1:] |
- |
- command(options, *parameters) |
- |
- |
-if __name__ == '__main__': |
- main() |