Files
project-manager/project_manager/preset/entry.py
T

45 lines
1.8 KiB
Python

from cmath import pi
from collections import defaultdict
from pathlib import Path
from typing import Optional
from ..entry import Entry, EntryDetector
from ..pipe.core import PipeParser, PipeRunner
from .resolve import PresetResolver, PresetResolverConfig
__all__ = ("PresetEntryDetector",)
class PresetEntryDetector(EntryDetector):
_PIPE_PARSER = PipeParser()
def __init__(self, preset_resolver_config: Optional[PresetResolverConfig] = None):
self._pipeparser = PipeParser()
self._preset_resolver_config = preset_resolver_config
def detect_entry(self, basepath: Path) -> Optional["Entry"]:
preset = PresetResolver(basepath, self._preset_resolver_config).resolve_preset()
piperunner = PipeRunner(basepath)
tasks = defaultdict(list)
for preset_name, preset in preset.presets.items():
if not piperunner.check_conditions(preset.conditions):
continue
for task_name, task_pack in preset.tasks.items():
for task_item_name, task in task_pack.items():
if piperunner.check_conditions(task.conditions):
variables = {
"entry_path": basepath,
}
if task.variables:
variables.update(
{
k: piperunner.resolve_value(v)
for k, v in task.variables.items()
}
)
tasks[task_name] += [
command.format(**variables) for command in task.commands
]
if tasks:
return Entry(tasks, basepath)