This commit is contained in:
Patrick Nisble
2026-06-01 09:56:50 +02:00
parent 7c6c3d7223
commit 5c2016a05c
14 changed files with 1140 additions and 261 deletions
+99
View File
@@ -0,0 +1,99 @@
from dataclasses import dataclass, field, fields
from functools import cached_property
from json import loads
from typing import Any
from pynvim import Nvim
from .requests import request
from .ui import Select
from .clickup import ClickupTask
from .env import EnvVar
@dataclass
class GitlabMergeRequest:
@property
def updateables(self) -> dict[str, Any]:
return {f.name: getattr(self, f.name, None) for f in fields(type(self)) if f.repr}
@dataclass(kw_only=True)
class GitlabIssue:
project: int | str = field(repr=False)
"""project id or url encoded path to project, e.g. `ope%2Fopepipeline`"""
title: str
assignee_id: int | None = None
description: str | None = None
labels: list[str] | None = None
milestone_id: int | None = None
@property
def updateables(self) -> dict[str, Any]:
return {f.name: getattr(self, f.name, None) for f in fields(type(self)) if f.repr}
@dataclass
class GitlabSession:
auth_key: str = field(
default_factory=EnvVar(
"GITLAB_AUTH",
"gitlab autho token is required to be set",
),
)
user_id: str = field(
default_factory=EnvVar(
"GITLAB_USER_ID",
"gitlab user id is required to be set",
),
)
base_url: str = "https://git.extoll.de/api/v4"
def _authed_request(
self,
method: str,
url: str,
data: dict[str, str] | None = None,
headers: dict[str, str] | None = None,
) -> str:
return request(
url,
method,
data=data,
headers=(headers or {}) | {"PRIVATE_TOKEN": self.auth_key},
)
@cached_property
def projects(self) -> list[str]:
return [
p["path_with_namespace"]
for p in loads(self._authed_request("GET", self.base_url + "/projects"))
]
def new_issue(self, nvim: Nvim, clickup_task: ClickupTask) -> GitlabIssue:
issue_new = GitlabIssue(
project=Select(nvim, self.projects)(),
title=clickup_task.name,
assignee_id=int(self.user_id),
description=f"#{clickup_task.id}",
)
self._authed_request(
"POST",
self.base_url + f"/projects/{issue_new.project}/issues",
data=issue_new.updateables,
)
return issue_new
def new_mr(self, from_issue: GitlabIssue) -> GitlabMergeRequest:
mr_new = GitlabMergeRequest()
self._authed_request(
"POST",
self.base_url + f"/projects/{from_issue.project}/merge_requests",
data=mr_new.updateables,
)
return mr_new
+8 -4
View File
@@ -5,6 +5,8 @@ from typing import Any
from pynvim import Nvim, command, plugin
from pynvim.api import Buffer
from .ui import Select
from .clickup import ClickupSession, ClickupTask
from .hints import JSONData
from .yaml import load, dump
@@ -119,7 +121,6 @@ class MrPyPlugin:
self.nvim.buffers[temp_buf.number].options["modified"] = False
self.nvim.api.win_set_buf(0, temp_buf)
@command("Mrpy", nargs="*")
def entry(self, args: Sequence[str] = ()) -> None:
match args:
case (str() as task_id,):
@@ -130,7 +131,6 @@ class MrPyPlugin:
case tags:
self.select_task_id(set(tags))
@command("MrpyPush", nargs="?")
def on_vbuf_write(self, args: Sequence[str] = ()) -> None:
match args:
case "0", *_:
@@ -153,7 +153,6 @@ class MrPyPlugin:
except ValueError:
pass
@command("MrpyNew", nargs=0)
def on_new_task(self) -> None:
task = ClickupTask(name="", status="backlog", markdown_content="", parent_list="")
temp_buf: Buffer = self.nvim.api.create_buf(True, False)
@@ -178,7 +177,6 @@ class MrPyPlugin:
self.nvim.buffers[temp_buf.number].options["modified"] = False
self.nvim.api.win_set_buf(0, temp_buf)
@command("MrpyPushNew", nargs=1)
def on_new_vbuf_write(self, buf_no: Sequence[Any] = ()) -> None:
buf_no = int(buf_no[0])
@@ -199,3 +197,9 @@ class MrPyPlugin:
self.entry([new_task_id])
except ValueError:
pass
def handle_test(self, choice: Any) -> None:
self.nvim.err_write(str(choice))
def test(self) -> None:
self.nvim.ui.select(["a", "b"], {"prompt": "hi"}, self.handle_test)
+17
View File
@@ -0,0 +1,17 @@
from dataclasses import dataclass
from pynvim import Nvim
@dataclass
class Select:
nvim: Nvim
options: list[str]
def __call__(self) -> str:
return self.nvim.call(
"""
return vim.fn.inputlist(...)
""",
self.options,
async_=False,
)