HPI/my/core/core_config.py

67 lines
2.3 KiB
Python

'''
Bindings for the 'core' HPI configuration
'''
import re
from typing import Sequence, Optional
from .common import PathIsh
try:
# FIXME support legacy 'common'?
from my.config import core as user_config # type: ignore[attr-defined]
except Exception as e:
# make it defensive, because it's pretty commonly used and would be annoying if it breaks hpi doctor etc.
# this way it'll at least use the defaults
# TODO add high warning
user_config = object # type: ignore[assignment, misc]
from dataclasses import dataclass
@dataclass
class Config(user_config):
# TODO if attr is set _and_ it's none, disable cache?
# todo or empty string?
# I guess flip the switch at some point when I'm confident in cachew
cache_dir: Optional[PathIsh] = None # FIXME use appdirs cache dir or something
# list of regexes/globs
# None means 'rely on disabled_modules'
enabled_modules : Optional[Sequence[str]] = None
# list of regexes/globs
# None means 'rely on enabled_modules'
disabled_modules: Optional[Sequence[str]] = None
def is_module_active(self, module: str) -> bool:
# todo might be nice to return the 'reason' too? e.g. which option has matched
should_enable = None
should_disable = None
def matches(specs: Sequence[str]) -> bool:
for spec in specs:
# not sure because . (packages separate) matches anything, but I guess unlikely to clash
if re.match(spec, module):
return True
return False
enabled = self.enabled_modules
disabled = self.disabled_modules
if enabled is None:
if disabled is None:
# by default, enable everything? not sure
return True
else:
# only disable the specified modules
return not matches(disabled)
else:
if disabled is None:
# only enabled the specifid modules
return matches(enabled)
else:
# ok, this means the config is inconsistent. better fallback onto the 'enable everything', then the user will notice?
# todo add medium warning?
return True
from .cfg import make_config
config = make_config(Config)