from collections import defaultdict from pathlib import Path from ..entry import Entry, EntryDetector, TaskKey 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: PresetResolverConfig | None = None): self._pipeparser = PipeParser() self._preset_resolver_config = preset_resolver_config def detect_entry(self, basepath: Path) -> Entry | None: preset = PresetResolver(basepath, self._preset_resolver_config).resolve_preset() if preset.skip: return None piperunner = PipeRunner(basepath) tasks = defaultdict(list) for tag, preset in preset.presets.items(): if not piperunner.check_conditions(preset.conditions): continue for task_name, task_pack in preset.tasks.items(): for task in task_pack.values(): 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[TaskKey(task_name, tag)] += [ command.format(**variables) for command in task.commands ] if tasks: return Entry(tasks, basepath) return None