feat: add preset resolver

This commit is contained in:
2023-03-21 20:19:27 +03:00
parent 81c704576a
commit 265c80f082
12 changed files with 183 additions and 126 deletions
+41
View File
@@ -0,0 +1,41 @@
__all__ = ("PresetResolver",)
from pathlib import Path
from typing import Dict, Iterable
import tomli
from ..util import merge_dicts
from .model import Preset
class PresetResolver:
_source_cache: Dict[Path, dict] = {}
def __init__(self, basepath: Path):
self._basepath = basepath
def iter_sources(self) -> Iterable[Path]:
for filepath in (Path(__file__).parent / "default").iterdir():
yield filepath
user_preset = Path.home() / ".preset.toml"
if user_preset.exists():
yield user_preset
projectpath = self._basepath
while projectpath.exists():
project_preset = projectpath / ".preset.toml"
if project_preset.exists():
yield project_preset
if projectpath.parent == projectpath:
break
projectpath = projectpath.parent
def resolve_preset(self) -> Preset:
result_preset_data = {}
for filepath in self.iter_sources():
if filepath not in self._source_cache:
with open(filepath, "rb") as fd:
self._source_cache[filepath] = tomli.load(fd)
merge_dicts(result_preset_data, self._source_cache[filepath])
return Preset(**result_preset_data)