| Index: core/scripts/in_file.py
|
| diff --git a/core/scripts/in_file.py b/core/scripts/in_file.py
|
| deleted file mode 100644
|
| index d8d8235704b8f142d6e4fccbaa22ce1b0cb4b41b..0000000000000000000000000000000000000000
|
| --- a/core/scripts/in_file.py
|
| +++ /dev/null
|
| @@ -1,160 +0,0 @@
|
| -# Copyright (C) 2013 Google Inc. All rights reserved.
|
| -#
|
| -# Redistribution and use in source and binary forms, with or without
|
| -# modification, are permitted provided that the following conditions are
|
| -# met:
|
| -#
|
| -# * Redistributions of source code must retain the above copyright
|
| -# notice, this list of conditions and the following disclaimer.
|
| -# * Redistributions in binary form must reproduce the above
|
| -# copyright notice, this list of conditions and the following disclaimer
|
| -# in the documentation and/or other materials provided with the
|
| -# distribution.
|
| -# * Neither the name of Google Inc. nor the names of its
|
| -# contributors may be used to endorse or promote products derived from
|
| -# this software without specific prior written permission.
|
| -#
|
| -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| -
|
| -import copy
|
| -import os
|
| -
|
| -# NOTE: This has only been used to parse
|
| -# core/page/RuntimeEnabledFeatures.in and may not be capable
|
| -# of parsing other .in files correctly.
|
| -
|
| -# .in file format is:
|
| -# // comment
|
| -# name1 arg=value, arg2=value2, arg2=value3
|
| -#
|
| -# InFile must be passed a dictionary of default values
|
| -# with which to validate arguments against known names.
|
| -# Sequence types as default values will produce sequences
|
| -# as parse results.
|
| -# Bare arguments (no '=') are treated as names with value True.
|
| -# The first field will always be labeled 'name'.
|
| -#
|
| -# InFile.load_from_files(['file.in'], {'arg': None, 'arg2': []})
|
| -#
|
| -# Parsing produces an array of dictionaries:
|
| -# [ { 'name' : 'name1', 'arg' :' value', arg2=['value2', 'value3'] }
|
| -
|
| -def _is_comment(line):
|
| - return line.startswith("//") or line.startswith("#")
|
| -
|
| -class InFile(object):
|
| - def __init__(self, lines, defaults, valid_values=None, default_parameters=None):
|
| - self.name_dictionaries = []
|
| - self.parameters = copy.deepcopy(default_parameters if default_parameters else {})
|
| - self._defaults = defaults
|
| - self._valid_values = copy.deepcopy(valid_values if valid_values else {})
|
| - self._parse(map(str.strip, lines))
|
| -
|
| - @classmethod
|
| - def load_from_files(self, file_paths, defaults, valid_values, default_parameters):
|
| - lines = []
|
| - for path in file_paths:
|
| - with open(os.path.abspath(path)) as in_file:
|
| - lines += in_file.readlines()
|
| - return InFile(lines, defaults, valid_values, default_parameters)
|
| -
|
| - def _is_sequence(self, arg):
|
| - return (not hasattr(arg, "strip")
|
| - and hasattr(arg, "__getitem__")
|
| - or hasattr(arg, "__iter__"))
|
| -
|
| - def _parse(self, lines):
|
| - parsing_parameters = True
|
| - indices = {}
|
| - for line in lines:
|
| - if _is_comment(line):
|
| - continue
|
| - if not line:
|
| - parsing_parameters = False
|
| - continue
|
| - if parsing_parameters:
|
| - self._parse_parameter(line)
|
| - else:
|
| - entry = self._parse_line(line)
|
| - name = entry['name']
|
| - if name in indices:
|
| - entry = self._merge_entries(entry, self.name_dictionaries[indices[name]])
|
| - entry['name'] = name
|
| - self.name_dictionaries[indices[name]] = entry
|
| - else:
|
| - indices[name] = len(self.name_dictionaries)
|
| - self.name_dictionaries.append(entry)
|
| -
|
| -
|
| - def _merge_entries(self, one, two):
|
| - merged = {}
|
| - for key in one:
|
| - if key not in two:
|
| - self._fatal("Expected key '%s' not found in entry: %s" % (key, two))
|
| - if one[key] and two[key]:
|
| - val_one = one[key]
|
| - val_two = two[key]
|
| - if isinstance(val_one, list) and isinstance(val_two, list):
|
| - val = val_one + val_two
|
| - elif isinstance(val_one, list):
|
| - val = val_one + [val_two]
|
| - elif isinstance(val_two, list):
|
| - val = [val_one] + val_two
|
| - else:
|
| - val = [val_one, val_two]
|
| - merged[key] = val
|
| - elif one[key]:
|
| - merged[key] = one[key]
|
| - else:
|
| - merged[key] = two[key]
|
| - return merged
|
| -
|
| -
|
| - def _parse_parameter(self, line):
|
| - if '=' in line:
|
| - name, value = line.split('=')
|
| - else:
|
| - name, value = line, True
|
| - if not name in self.parameters:
|
| - self._fatal("Unknown parameter: '%s' in line:\n%s\nKnown parameters: %s" % (name, line, self.parameters.keys()))
|
| - self.parameters[name] = value
|
| -
|
| - def _parse_line(self, line):
|
| - args = copy.deepcopy(self._defaults)
|
| - parts = line.split(' ')
|
| - args['name'] = parts[0]
|
| - # re-join the rest of the line and split on ','
|
| - args_list = ' '.join(parts[1:]).strip().split(',')
|
| - for arg_string in args_list:
|
| - arg_string = arg_string.strip()
|
| - if not arg_string: # Ignore empty args
|
| - continue
|
| - if '=' in arg_string:
|
| - arg_name, arg_value = arg_string.split('=')
|
| - else:
|
| - arg_name, arg_value = arg_string, True
|
| - if arg_name not in self._defaults:
|
| - self._fatal("Unknown argument: '%s' in line:\n%s\nKnown arguments: %s" % (arg_name, line, self._defaults.keys()))
|
| - valid_values = self._valid_values.get(arg_name)
|
| - if valid_values and arg_value not in valid_values:
|
| - self._fatal("Unknown value: '%s' in line:\n%s\nKnown values: %s" % (arg_value, line, valid_values))
|
| - if self._is_sequence(args[arg_name]):
|
| - args[arg_name].append(arg_value)
|
| - else:
|
| - args[arg_name] = arg_value
|
| - return args
|
| -
|
| - def _fatal(self, message):
|
| - # FIXME: This should probably raise instead of exit(1)
|
| - print message
|
| - exit(1)
|
|
|