Chromium Code Reviews| Index: mojo/devtools/common/devtoolslib/shell_config.py |
| diff --git a/mojo/devtools/common/devtoolslib/shell_config.py b/mojo/devtools/common/devtoolslib/shell_config.py |
| index acc9c61719b4b2d8cce6cba7eb612bb334d6b61a..639d97cc0344193e8623a7fa5b86b40aab09601a 100644 |
| --- a/mojo/devtools/common/devtoolslib/shell_config.py |
| +++ b/mojo/devtools/common/devtoolslib/shell_config.py |
| @@ -9,9 +9,17 @@ arguments, applying any default paths inferred from the checkout, configuration |
| file, etc. |
| """ |
| +import ast |
| +import collections |
| + |
| from devtoolslib import paths |
| +class ShellConfigurationException(Exception): |
| + """Represents an error preventing creating a functional shell abstraction.""" |
| + pass |
| + |
| + |
| class ShellConfig(object): |
| """Configuration for the shell abstraction.""" |
| @@ -19,8 +27,9 @@ class ShellConfig(object): |
| self.android = None |
| self.shell_path = None |
| self.origin = None |
| - self.map_url_list = None |
| - self.map_origin_list = None |
| + self.map_url_list = [] |
| + self.map_origin_list = [] |
| + self.dev_servers = [] |
| self.sky = None |
| self.verbose = None |
| @@ -33,6 +42,15 @@ class ShellConfig(object): |
| self.use_osmesa = None |
| +class DevServerConfig(object): |
| + """Configuration for a development server running on a host and available to |
| + the shell. |
| + """ |
| + def __init__(self): |
| + self.host = None |
| + self.mappings = None |
| + |
| + |
| def add_shell_arguments(parser): |
| """Adds argparse arguments allowing to configure shell abstraction using |
| configure_shell() below. |
| @@ -68,22 +86,38 @@ def add_shell_arguments(parser): |
| help='Configure the native viewport service ' |
| 'for off-screen rendering.') |
| - # Arguments allowing to indicate the configuration we are targeting when |
| - # running within a Chromium-like checkout. These will go away once we have |
| - # devtools config files, see https://github.com/domokit/devtools/issues/28. |
| - chromium_config_group = parser.add_argument_group('Chromium configuration', |
| + config_file_group = parser.add_argument_group('Configuration file', |
| + 'These arguments allow to modify the behavior regarding the mojoconfig ' |
| + 'file.') |
| + config_file_group.add_argument('--config-file', type=file, |
| + help='Path of the configuration file to use.') |
| + |
| + # Arguments allowing to indicate the build directory we are targeting when |
| + # running within a Chromium-like checkout (e.g. Mojo checkout). These will go |
| + # away once we have devtools config files, see |
| + # https://github.com/domokit/devtools/issues/28. |
| + chromium_checkout_group = parser.add_argument_group( |
| + 'Chromium-like checkout configuration', |
| 'These arguments allow to infer paths to tools and build results ' |
| - 'when running withing a Chromium-like checkout') |
| - debug_group = chromium_config_group.add_mutually_exclusive_group() |
| + 'when running within a Chromium-like checkout') |
| + debug_group = chromium_checkout_group.add_mutually_exclusive_group() |
| debug_group.add_argument('--debug', help='Debug build (default)', |
| default=True, action='store_true') |
| debug_group.add_argument('--release', help='Release build', default=False, |
| dest='debug', action='store_false') |
| - chromium_config_group.add_argument('--target-cpu', |
| + chromium_checkout_group.add_argument('--target-cpu', |
| help='CPU architecture to run for.', |
| choices=['x64', 'x86', 'arm']) |
| +def _read_config_file(config_file, aliases): |
| + spec = config_file.read() |
| + for alias_pattern, alias_value in aliases: |
| + spec = spec.replace(alias_pattern, alias_value) |
| + config_dict = ast.literal_eval(spec) |
| + return collections.defaultdict(lambda: None, config_dict) |
|
qsr
2015/08/04 14:06:45
I do not think you need a defaultdict here.
ppi
2015/08/04 16:04:51
Done.
|
| + |
| + |
| def get_shell_config(script_args): |
| """Processes command-line options defined in add_shell_arguments(), applying |
| any inferred default paths and produces an instance of ShellConfig. |
| @@ -95,7 +129,6 @@ def get_shell_config(script_args): |
| # (--debug/--release, etc.), if running within a Chromium-like checkout. |
| inferred_paths = paths.infer_paths(script_args.android, script_args.debug, |
| script_args.target_cpu) |
| - |
| shell_config = ShellConfig() |
| shell_config.android = script_args.android |
| @@ -118,4 +151,31 @@ def get_shell_config(script_args): |
| if (shell_config.android and not shell_config.origin and |
| inferred_paths['build_dir_path']): |
| shell_config.origin = inferred_paths['build_dir_path'] |
| + |
| + # Read the mojoconfig file. |
| + mojoconfig = None |
| + if script_args.config_file: |
| + config_file_aliases = [] |
| + if inferred_paths['build_dir_path']: |
| + config_file_aliases.append(('@{BUILD_DIR}', |
| + inferred_paths['build_dir_path'])) |
| + |
| + try: |
| + mojoconfig = _read_config_file(script_args.config_file, |
| + config_file_aliases) |
| + except SyntaxError: |
| + raise ShellConfigurationException('Failed to parse the mojoconfig file.') |
| + |
| + if mojoconfig['dev_servers']: |
| + try: |
| + for dev_server_spec in mojoconfig['dev_servers']: |
| + dev_server_config = DevServerConfig() |
| + dev_server_config.host = dev_server_spec['host'] |
| + dev_server_config.mappings = [] |
| + for prefix, path in dev_server_spec['mappings']: |
| + dev_server_config.mappings.append((prefix, path)) |
| + shell_config.dev_servers.append(dev_server_config) |
| + except (ValueError, KeyError): |
| + raise ShellConfigurationException('Failed to parse dev_servers in ' |
| + 'the mojoconfig file.') |
| return shell_config |