blob: 972ff23299d044a1986663d7b2088247d0d71b87 [file] [log] [blame]
# 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, unicode_literals
import codecs
import re
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 self._properties.iteritems():
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 self._properties.iteritems()
if k.startswith(prefix) and '.' not in k[len(prefix):])
for required_key in required_keys:
if not required_key in D:
raise ValueError('Required key %s not present' % required_key)
return D