import os from .p3 import configparser # constant stuff (DFT = DEFAULT) MAIN_SECTION = 'papers' DFT_CONFIG_PATH = os.path.expanduser('~/.papersrc') try: DFT_EDIT_CMD = os.environ['EDITOR'] except KeyError: DFT_EDIT_CMD = 'vi' DFT_PLUGINS = '' DFT_CONFIG = {'papers_dir' : os.path.expanduser('~/.papers'), 'doc_dir' : 'doc', 'import_copy' : True, 'import_move' : False, 'color' : True, 'version' : 3, 'version_warning' : True, 'open_cmd' : 'open', 'edit_cmd' : DFT_EDIT_CMD, 'plugins' : DFT_PLUGINS } BOOLEANS = {'import_copy', 'import_move', 'color', 'version_warning'} # package-shared config that can be accessed using : # from configs import config _config = None def config(section=MAIN_SECTION): if _config is None: raise ValueError('not config instanciated yet') _config._section = section return _config class Config(object): def __init__(self, **kwargs): object.__setattr__(self, '_section', MAIN_SECTION) # active section object.__setattr__(self, '_cfg', configparser.SafeConfigParser()) self._cfg.add_section(self._section) for name, value in DFT_CONFIG.items(): self._cfg.set(self._section, name, str(value)) for name, value in kwargs.items(): self.__setattr__(name, value) def as_global(self): global _config _config = self def load(self, path=DFT_CONFIG_PATH): self._cfg.read(path) return self def save(self, path=DFT_CONFIG_PATH): with open(path, 'w') as f: self._cfg.write(f) def __setattr__(self, name, value): if name in ('_cfg', '_section'): object.__setattr__(self, name, value) else: if type(value) is bool: BOOLEANS.add(name) self._cfg.set(self._section, name, str(value)) def __getattr__(self, name): value = self._cfg.get(self._section, name) if name in BOOLEANS: value = str2bool(value) return value def get(self, name, default=None): try: return self.__getattr__(name) except (configparser.NoOptionError, configparser.NoSectionError): return default def items(self): for name, value in self._cfg.items(self._section): if name in BOOLEANS: value = str2bool(value) yield name, value def str2bool(s): return str(s).lower() in ('yes', 'true', 't', 'y', '1')