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 /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()