feat: add task tag
This commit is contained in:
+18
-11
@@ -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)
|
||||||
|
runned = True
|
||||||
|
for command in commands:
|
||||||
CommandExecutor(command).run(self._basepath)
|
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 +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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user