Chromium Code Reviews| Index: third_party/gsutil/gslib/command_runner.py |
| diff --git a/third_party/gsutil/gslib/command_runner.py b/third_party/gsutil/gslib/command_runner.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..d1b3fbd340ead85d1aade30f616323dce8cfa15d |
| --- /dev/null |
| +++ b/third_party/gsutil/gslib/command_runner.py |
| @@ -0,0 +1,101 @@ |
| +#!/usr/bin/env python |
| +# coding=utf8 |
| +# Copyright 2011 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. |
| + |
| +"""Class that runs a named gsutil command.""" |
| + |
| +import boto |
| +import os |
| + |
| +from boto.storage_uri import BucketStorageUri |
| +from gslib.command import Command |
| +from gslib.command import COMMAND_NAME |
| +from gslib.command import COMMAND_NAME_ALIASES |
| +from gslib.exception import CommandException |
| + |
| + |
| +class CommandRunner(object): |
| + |
| + def __init__(self, gsutil_bin_dir, boto_lib_dir, config_file_list, |
| + gsutil_ver, bucket_storage_uri_class=BucketStorageUri): |
| + """ |
| + Args: |
| + gsutil_bin_dir: Bin dir from which gsutil is running. |
| + boto_lib_dir: Lib dir where boto runs. |
| + config_file_list: Config file list returned by _GetBotoConfigFileList(). |
| + gsutil_ver: Version string of currently running gsutil command. |
| + bucket_storage_uri_class: Class to instantiate for cloud StorageUris. |
| + Settable for testing/mocking. |
| + """ |
| + self.gsutil_bin_dir = gsutil_bin_dir |
| + self.boto_lib_dir = boto_lib_dir |
| + self.config_file_list = config_file_list |
| + self.gsutil_ver = gsutil_ver |
| + self.bucket_storage_uri_class = bucket_storage_uri_class |
| + self.command_map = self._LoadCommandMap() |
| + |
| + def _LoadCommandMap(self): |
| + """Returns dict mapping each command_name to implementing class.""" |
| + # Walk gslib/commands and find all commands. |
| + commands_dir = os.path.join(self.gsutil_bin_dir, 'gslib', 'commands') |
|
Ryan Tseng
2013/03/15 01:52:53
gslib is assumbed to be nested under gsutil
M-A Ruel
2013/03/18 18:28:40
Lovely. :)
|
| + for f in os.listdir(commands_dir): |
| + # Handles no-extension files, etc. |
| + (module_name, ext) = os.path.splitext(f) |
| + if ext == '.py': |
| + __import__('gslib.commands.%s' % module_name) |
| + command_map = {} |
| + # Only include Command subclasses in the dict. |
| + for command in Command.__subclasses__(): |
| + command_map[command.command_spec[COMMAND_NAME]] = command |
| + for command_name_aliases in command.command_spec[COMMAND_NAME_ALIASES]: |
| + command_map[command_name_aliases] = command |
| + return command_map |
| + |
| + def RunNamedCommand(self, command_name, args=None, headers=None, debug=0, |
| + parallel_operations=False, test_method=None): |
| + """Runs the named command. Used by gsutil main, commands built atop |
| + other commands, and tests . |
| + |
| + Args: |
| + command_name: The name of the command being run. |
| + args: Command-line args (arg0 = actual arg, not command name ala bash). |
| + headers: Dictionary containing optional HTTP headers to pass to boto. |
| + debug: Debug level to pass in to boto connection (range 0..3). |
| + parallel_operations: Should command operations be executed in parallel? |
| + test_method: Optional general purpose method for testing purposes. |
| + Application and semantics of this method will vary by |
| + command and test type. |
| + |
| + Raises: |
| + CommandException: if errors encountered. |
| + """ |
| + if not args: |
| + args = [] |
| + |
| + # Include api_version header in all commands. |
| + api_version = boto.config.get_value('GSUtil', 'default_api_version', '1') |
| + if not headers: |
| + headers = {} |
| + headers['x-goog-api-version'] = api_version |
| + |
| + if command_name not in self.command_map: |
| + raise CommandException('Invalid command "%s".' % command_name) |
| + command_class = self.command_map[command_name] |
| + command_inst = command_class(self, args, headers, debug, |
| + parallel_operations, self.gsutil_bin_dir, |
| + self.boto_lib_dir, self.config_file_list, |
| + self.gsutil_ver, self.bucket_storage_uri_class, |
| + test_method) |
| + return command_inst.RunCommand() |