feat: add task tag

This commit is contained in:
2026-08-02 16:42:15 +03:00
parent 48f8b2d5a9
commit 91a85f7141
4 changed files with 34 additions and 25 deletions
+19 -12
View File
@@ -1,11 +1,11 @@
import logging import logging
from pathlib import Path from pathlib import Path
from typing import Iterable from typing import Iterable, NamedTuple
from .common.command import CommandExecutor from .common.command import CommandExecutor
__all__ = ( __all__ = (
"EntryTaskNotImplementedError", "TaskKey",
"Entry", "Entry",
"EntryDetector", "EntryDetector",
"EntryResolver", "EntryResolver",
@@ -14,8 +14,12 @@ __all__ = (
logger = logging.getLogger("entry") logger = logging.getLogger("entry")
class EntryTaskNotImplementedError(NotImplementedError): class TaskKey(NamedTuple):
pass name: str
tag: str
def __repr__(self) -> str:
return f"{self.name}:{self.tag}"
class Entry: class Entry:
@@ -23,7 +27,7 @@ class Entry:
def __init__( def __init__(
self, self,
tasks: dict[str, list[str]], tasks: dict[TaskKey, list[str]],
basepath: Path, basepath: Path,
): ):
self._tasks = tasks self._tasks = tasks
@@ -36,15 +40,18 @@ class Entry:
for command in commands: for command in commands:
self._logger.debug(" %s", command) self._logger.debug(" %s", command)
def run_task(self, task_name: str): def run_task(self, task_name: str, tag: str | None = None) -> bool:
if task_name == "show": if task_name == "show":
self.show() self.show()
return return True
if task_name not in self._tasks: runned = False
raise EntryTaskNotImplementedError(task_name) for task_key, commands in self._tasks.items():
self._logger.info("%s %s", task_name, self) if task_key.name == task_name and (tag is None or tag == task_key.tag):
for command in self._tasks[task_name]: self._logger.info("%s %s", task_key, self)
CommandExecutor(command).run(self._basepath) runned = True
for command in commands:
CommandExecutor(command).run(self._basepath)
return runned
def __repr__(self): def __repr__(self):
return f"{str(self._basepath)}" return f"{str(self._basepath)}"
+4 -7
View File
@@ -4,7 +4,7 @@ from pathlib import Path
from typing import Iterable from typing import Iterable
from .common.command import CommandError from .common.command import CommandError
from .entry import Entry, EntryResolver, EntryTaskNotImplementedError from .entry import Entry, EntryResolver
from .preset.entry import PresetEntryDetector from .preset.entry import PresetEntryDetector
__all__ = ("ProjectManager",) __all__ = ("ProjectManager",)
@@ -26,15 +26,12 @@ class ProjectManager:
def _iter_entries(self) -> Iterable[Entry]: def _iter_entries(self) -> Iterable[Entry]:
return self._resolver.resolve(self._basepaht) return self._resolver.resolve(self._basepaht)
def run_task(self, task_name: str) -> dict[str, int]: def run_task(self, task_name: str, tag: str | None = None) -> dict[str, int]:
counter = Counter() counter = Counter()
for entry in self._iter_entries(): for entry in self._iter_entries():
try: try:
entry.run_task(task_name) if entry.run_task(task_name, tag):
counter["success"] += 1 counter["success"] += 1
except EntryTaskNotImplementedError:
self._logger.warning("%s %s", task_name, entry)
counter["skipped"] += 1
except CommandError as error: except CommandError as error:
self._logger.error("%s\n%s", entry, error.output) self._logger.error("%s\n%s", entry, error.output)
counter["failed"] += 1 counter["failed"] += 1
+3 -3
View File
@@ -1,7 +1,7 @@
from collections import defaultdict from collections import defaultdict
from pathlib import Path from pathlib import Path
from ..entry import Entry, EntryDetector from ..entry import Entry, EntryDetector, TaskKey
from ..pipe.core import PipeParser, PipeRunner from ..pipe.core import PipeParser, PipeRunner
from .resolve import PresetResolver, PresetResolverConfig from .resolve import PresetResolver, PresetResolverConfig
@@ -21,7 +21,7 @@ class PresetEntryDetector(EntryDetector):
return None return None
piperunner = PipeRunner(basepath) piperunner = PipeRunner(basepath)
tasks = defaultdict(list) tasks = defaultdict(list)
for preset in preset.presets.values(): for tag, preset in preset.presets.items():
if not piperunner.check_conditions(preset.conditions): if not piperunner.check_conditions(preset.conditions):
continue continue
for task_name, task_pack in preset.tasks.items(): for task_name, task_pack in preset.tasks.items():
@@ -37,7 +37,7 @@ class PresetEntryDetector(EntryDetector):
for k, v in task.variables.items() for k, v in task.variables.items()
} }
) )
tasks[task_name] += [ tasks[TaskKey(task_name, tag)] += [
command.format(**variables) for command in task.commands command.format(**variables) for command in task.commands
] ]
if tasks: if tasks:
+8 -3
View File
@@ -9,9 +9,10 @@ from .manager import ProjectManager
class ProjectManagerRunner: class ProjectManagerRunner:
def __init__(self, path: Path, task: str, verbose: int = 0): def __init__(self, *, path: Path, task: str, tag: str | None, verbose: int = 0):
self._path = path self._path = path
self._task = task self._task = task
self._tag = tag
self._verbose = verbose self._verbose = verbose
@classmethod @classmethod
@@ -38,7 +39,7 @@ class ProjectManagerRunner:
def run(self): def run(self):
self._setup_logging(self._verbose) self._setup_logging(self._verbose)
manager = ProjectManager(self._path) manager = ProjectManager(self._path)
result = manager.run_task(self._task) result = manager.run_task(self._task, self._tag)
if result["failed"] > 0: if result["failed"] > 0:
sys.exit(1) sys.exit(1)
@@ -55,4 +56,8 @@ class ProjectManagerRunner:
parser.add_argument("-q", "--quiet", action="store_true") parser.add_argument("-q", "--quiet", action="store_true")
args = parser.parse_args() args = parser.parse_args()
verbose = -1 if args.quiet else args.verbose verbose = -1 if args.quiet else args.verbose
return cls(args.path, args.task, verbose) task = args.task
tag = None
if ":" in task:
task, tag = task.split(":")
return cls(path=args.path, task=task, tag=tag, verbose=verbose)