84 lines
2.6 KiB
Python
84 lines
2.6 KiB
Python
# 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
|