summaryrefslogtreecommitdiffstats
path: root/python/mozbuild/mozbuild/dotproperties.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mozbuild/mozbuild/dotproperties.py')
-rw-r--r--python/mozbuild/mozbuild/dotproperties.py86
1 files changed, 86 insertions, 0 deletions
diff --git a/python/mozbuild/mozbuild/dotproperties.py b/python/mozbuild/mozbuild/dotproperties.py
new file mode 100644
index 0000000000..9b615cc43f
--- /dev/null
+++ b/python/mozbuild/mozbuild/dotproperties.py
@@ -0,0 +1,86 @@
+# 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
+
+import codecs
+import re
+import sys
+
+import six
+
+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