From 2df0dc762fa7d33e0550c35dbd99b94a485e89d0 Mon Sep 17 00:00:00 2001 From: shmyga Date: Mon, 14 Sep 2026 22:53:35 +0300 Subject: [PATCH] feat: add version task --- project_manager/common/command.py | 3 ++- project_manager/common/template.py | 6 ++++++ project_manager/entry/resolver.py | 8 ++++++-- project_manager/preset/default/git.toml | 11 +++++++++++ project_manager/preset/default/global.toml | 5 +++++ project_manager/preset/default/nodejs.toml | 11 +++++++++++ project_manager/preset/default/python.toml | 5 +++++ project_manager/preset/detector.py | 11 +++++++++-- project_manager/preset/model.py | 1 + 9 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 project_manager/preset/default/git.toml create mode 100644 project_manager/preset/default/global.toml diff --git a/project_manager/common/command.py b/project_manager/common/command.py index a0fad09..fcc9cd7 100644 --- a/project_manager/common/command.py +++ b/project_manager/common/command.py @@ -49,10 +49,11 @@ class CommandExecutor: err_logger = CommandLogger(logging.TRACE) try: result = subprocess.run( - self._command.split(" "), + self._command, cwd=basepath, stdout=out_logger, # type: ignore stderr=err_logger, # type: ignore + shell=True, ) finally: out_logger.close() diff --git a/project_manager/common/template.py b/project_manager/common/template.py index d77f6a7..8c71aef 100644 --- a/project_manager/common/template.py +++ b/project_manager/common/template.py @@ -1,4 +1,5 @@ import json +import os import re import tomllib from pathlib import Path @@ -13,6 +14,10 @@ def do_bool(data: str | None) -> bool: return not (data is None or data.lower() in ["false", "null", "none", "0", ""]) +def do_env(key: str, default: str | None = None) -> str | None: + return os.environ.get(key=key.upper(), default=default) + + def _build_env(basepath: Path) -> Environment: env = Environment() @@ -65,6 +70,7 @@ def _build_env(basepath: Path) -> Environment: env.filters["search"] = do_search env.filters["key"] = do_key env.filters["bool"] = do_bool + env.filters["env"] = do_env return env diff --git a/project_manager/entry/resolver.py b/project_manager/entry/resolver.py index 72444f0..84b0886 100644 --- a/project_manager/entry/resolver.py +++ b/project_manager/entry/resolver.py @@ -14,7 +14,9 @@ class EntryResolver: self._ignore = ignore self._max_depth = max_depth - def _resolve(self, rootpath: Path, basepath: Path, depth: int = 0) -> Iterable[Entry]: + def _resolve( + self, rootpath: Path, basepath: Path, depth: int = 0 + ) -> Iterable[Entry]: if basepath.is_dir(): if basepath.name.startswith(".") or self._ignore.match_file(basepath): return @@ -30,4 +32,6 @@ class EntryResolver: yield from self._resolve(rootpath, path, depth + 1) def resolve(self, basepath: Path) -> Iterable[Entry]: - return self._resolve(basepath, basepath) + result = list(self._resolve(basepath, basepath)) + result.reverse() + return result diff --git a/project_manager/preset/default/git.toml b/project_manager/preset/default/git.toml new file mode 100644 index 0000000..620c694 --- /dev/null +++ b/project_manager/preset/default/git.toml @@ -0,0 +1,11 @@ +[presets.git] +conditions = ["{{ '.git/config' | file }}"] + +[presets.git.tasks.version.git] +priority = -1 +conditions = ["{{ version }}"] +commands = [ + "git add .", + "git commit -m 'ci(version): {{ version }}'", + "git tag '{{ version }}'", +] diff --git a/project_manager/preset/default/global.toml b/project_manager/preset/default/global.toml new file mode 100644 index 0000000..32e4e26 --- /dev/null +++ b/project_manager/preset/default/global.toml @@ -0,0 +1,5 @@ +[presets.'*'] +priority = 1000 +conditions = ["{{ true }}"] +variables.version = "{{ 'version' | env }}" +tasks = {} diff --git a/project_manager/preset/default/nodejs.toml b/project_manager/preset/default/nodejs.toml index ddc8c10..35200ff 100644 --- a/project_manager/preset/default/nodejs.toml +++ b/project_manager/preset/default/nodejs.toml @@ -1,26 +1,37 @@ [presets.nodejs] conditions = ["{{ 'package.json' | file }}"] +# install [presets.nodejs.tasks.setup.npm] conditions = ["{{ 'package-lock.json' | file }}"] commands = ["npm install-clean"] +# install legacy [presets.nodejs.tasks.setup.npm-legacy] conditions = ["{{ not ('package-lock.json' | file) }}"] commands = ["npm install"] +# test [presets.nodejs.tasks.test.jest] conditions = ["{{ 'node_modules/jest' | file }}"] commands = ["npx jest"] +# build [presets.nodejs.tasks.build.npm] conditions = ["{{ 'package.json' | read | get('scripts.build') }}"] commands = ["npm run build"] +# publish [presets.nodejs.tasks.publish.npm] conditions = ["{{ 'package.json' | read | get('scripts.publish') }}"] commands = ["npm run publish"] +# clean [presets.nodejs.tasks.clean.node_modules] conditions = ["{{ 'node_modules' | file }}"] commands = ["rm -rf node_modules"] + +# version +[presets.nodejs.tasks.version.npm] +conditions = ["{{ version }}"] +commands = ["npm version {{ version }} --allow-same-version"] diff --git a/project_manager/preset/default/python.toml b/project_manager/preset/default/python.toml index 041dd82..ed13e3d 100644 --- a/project_manager/preset/default/python.toml +++ b/project_manager/preset/default/python.toml @@ -53,3 +53,8 @@ commands = [".venv/bin/black ./"] [presets.python.tasks.clean.venv] conditions = ["{{ '.venv' | file }}"] commands = ["rm -rf .venv"] + +# version +[presets.python.tasks.version.poetry] +conditions = ["{{ python_poetry and version }}"] +commands = ["poetry version {{ version }}"] diff --git a/project_manager/preset/detector.py b/project_manager/preset/detector.py index ad77673..e11c616 100644 --- a/project_manager/preset/detector.py +++ b/project_manager/preset/detector.py @@ -1,4 +1,5 @@ import operator +from os import environ from pathlib import Path from ..common.template import PathTemplate @@ -19,9 +20,15 @@ class PresetEntryDetector(EntryDetector): if preset.skip: return ENTRY_SKIP tasks = [] - for tag, preset in preset.presets.items(): - preset_variables: Variables = {"entry_path": basepath} + global_variables = {f"env_{k.lower()}": v for k, v in environ.items()} + presets = sorted( + preset.presets.items(), key=lambda item: item[1].priority, reverse=True + ) + for tag, preset in presets: + preset_variables: Variables = {**global_variables, "entry_path": basepath} if preset.variables: + if tag == "*": + template.update_variables(preset.variables, global_variables) template.update_variables(preset.variables, preset_variables) if preset.conditions and not template.check_conditions( preset.conditions, preset_variables diff --git a/project_manager/preset/model.py b/project_manager/preset/model.py index ab84f8d..3114bf2 100644 --- a/project_manager/preset/model.py +++ b/project_manager/preset/model.py @@ -12,6 +12,7 @@ class TaskPreset(BaseModel): class EntryPreset(BaseModel): + priority: int = 0 conditions: list[str] | None = None variables: Variables | None = None tasks: dict[str, dict[str, TaskPreset]]