diff options
Diffstat (limited to 'python/mozbuild/mozbuild/dotproperties.py')
-rw-r--r-- | python/mozbuild/mozbuild/dotproperties.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/python/mozbuild/mozbuild/dotproperties.py b/python/mozbuild/mozbuild/dotproperties.py new file mode 100644 index 0000000000..3028a4187e --- /dev/null +++ b/python/mozbuild/mozbuild/dotproperties.py @@ -0,0 +1,88 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. + +# This file contains utility functions for reading .properties files, like +# region.properties. + +from __future__ import absolute_import, print_function, unicode_literals + +import codecs +import re +import six +import sys + +if sys.version_info[0] == 3: + str_type = str +else: + str_type = basestring + + +class DotProperties: + r"""A thin representation of a key=value .properties file.""" + + def __init__(self, file=None): + self._properties = {} + if file: + self.update(file) + + def update(self, file): + """Updates properties from a file name or file-like object. + + Ignores empty lines and comment lines.""" + + if isinstance(file, str_type): + f = codecs.open(file, "r", "utf-8") + else: + f = file + + for l in f.readlines(): + line = l.strip() + if not line or line.startswith("#"): + continue + (k, v) = re.split("\s*=\s*", line, 1) + self._properties[k] = v + + def get(self, key, default=None): + return self._properties.get(key, default) + + def get_list(self, prefix): + """Turns {'list.0':'foo', 'list.1':'bar'} into ['foo', 'bar']. + + Returns [] to indicate an empty or missing list.""" + + if not prefix.endswith("."): + prefix = prefix + "." + indexes = [] + for k, v in six.iteritems(self._properties): + if not k.startswith(prefix): + continue + key = k[len(prefix) :] + if "." in key: + # We have something like list.sublist.0. + continue + indexes.append(int(key)) + return [self._properties[prefix + str(index)] for index in sorted(indexes)] + + def get_dict(self, prefix, required_keys=[]): + """Turns {'foo.title':'title', ...} into {'title':'title', ...}. + + If ``|required_keys|`` is present, it must be an iterable of required key + names. If a required key is not present, ValueError is thrown. + + Returns {} to indicate an empty or missing dict.""" + + if not prefix.endswith("."): + prefix = prefix + "." + + D = dict( + (k[len(prefix) :], v) + for k, v in six.iteritems(self._properties) + if k.startswith(prefix) and "." not in k[len(prefix) :] + ) + + for required_key in required_keys: + if required_key not in D: + raise ValueError("Required key %s not present" % required_key) + + return D |