import os
class PreconfigManager(object):
_preconfigs = {}
_is_init = False
def _get_preconfig_path(self, suffix):
"""\
Get the absolute path to a prefix directory or file.
suffix: list of suffixes after the 'preconfigs' directory to navigate to
E.g., ['metrics', 'abc'] gives the path to
<tko>/preconfigs/metrics/abc
"""
rel_path = os.path.join(os.path.dirname(__file__), 'preconfigs',
*suffix)
return os.path.abspath(rel_path)
def _init_preconfigs(self):
"""\
Read the names of all the preconfigs from disk and store them in the
_preconfigs dictionary.
"""
if not self._is_init:
# Read the data
self._preconfigs['metrics'] = dict.fromkeys(
os.listdir(self._get_preconfig_path(['metrics'])))
self._preconfigs['qual'] = dict.fromkeys(
os.listdir(self._get_preconfig_path(['qual'])))
self._is_init = True
def _read_preconfig(self, name, type):
"""\
Populate the _preconfigs dictionary entry for the preconfig described
by the given parameters. If the preconfig has already been loaded,
do nothing.
name: specific name of the preconfig
type: 'metrics' or 'qual'
"""
if self._preconfigs[type][name] is not None:
return
self._preconfigs[type][name] = {}
path = self._get_preconfig_path([type, name])
config = open(path)
try:
for line in config:
parts = line.split(':')
self._preconfigs[type][name][parts[0]] = parts[1].strip()
finally:
config.close()
def get_preconfig(self, name, type):
self._init_preconfigs()
self._read_preconfig(name, type)
return self._preconfigs[type][name]
def all_preconfigs(self):
self._init_preconfigs()
return dict(self._preconfigs)
manager = PreconfigManager()