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