From 060270b85494214b1b0d5eb65d8ef760d8eb5460 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Wed, 28 Oct 2026 12:27:09 +0400 Subject: [PATCH] =?UTF-8?q?=D0=92=D0=B8=D0=BA=D0=B8:=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8F=20at/author/offset=20=D0=B2=20diff=20=D0=B8=20code/title?= =?UTF-8?q?=20=D0=B2=20versions=20(#140,=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8=203)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- src/sdlc_hub/modules/wiki/api.py | 4 ++-- src/sdlc_hub/modules/wiki/history.py | 7 ++++--- tests/test_wiki_history_api.py | 5 ++++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/sdlc_hub/modules/wiki/api.py b/src/sdlc_hub/modules/wiki/api.py index e6299ea..8a870d1 100644 --- a/src/sdlc_hub/modules/wiki/api.py +++ b/src/sdlc_hub/modules/wiki/api.py @@ -122,8 +122,8 @@ def _wiki_page(conn, label, code): def h_versions(hub, conn, m, q, body): label, _ = _project(conn, q) code = unquote(m.group(1)) - _wiki_page(conn, label, code) - return 200, {"versions": history.page_versions(conn, label, code)} + page_row = _wiki_page(conn, label, code) + return 200, {"code": code, "title": page_row["title"], "versions": history.page_versions(conn, label, code)} def h_diff(hub, conn, m, q, body): diff --git a/src/sdlc_hub/modules/wiki/history.py b/src/sdlc_hub/modules/wiki/history.py index a2d0e89..c4654ca 100644 --- a/src/sdlc_hub/modules/wiki/history.py +++ b/src/sdlc_hub/modules/wiki/history.py @@ -86,7 +86,7 @@ def page_versions(conn, label: str, code: str) -> list[dict]: def diff(conn, label: str, code: str, version: str | None, offset: int) -> dict: """Дифф версии относительно предыдущей (первой — относительно пустого текста); version None — последняя. Текст диффа режется по CHUNK символов, с offset; next_offset — где продолжить или None.""" - rows = conn.execute("SELECT code, created_at, markdown, added, removed FROM wiki_version " + rows = conn.execute("SELECT code, created_at, author_login, author_name, markdown, added, removed FROM wiki_version " "WHERE label = ? AND page_code = ? ORDER BY created_at, code", (label, code)).fetchall() if not rows: raise NoVersions() @@ -102,8 +102,9 @@ def diff(conn, label: str, code: str, version: str | None, offset: int) -> dict: fromfile=prev["code"] if prev else "", tofile=cur["code"], n=3, lineterm="") text = "".join(f"{x}\n" for x in lines) end = offset + CHUNK - return {"version": cur["code"], "index": idx + 1, "total": len(rows), "prev_version": prev["code"] if prev else None, - "added": cur["added"], "removed": cur["removed"], "diff": text[offset:end], + return {"version": cur["code"], "at": cur["created_at"], "author": _author(cur), "index": idx + 1, + "total": len(rows), "prev_version": prev["code"] if prev else None, "added": cur["added"], + "removed": cur["removed"], "offset": offset, "diff": text[offset:end], "next_offset": end if end < len(text) else None} diff --git a/tests/test_wiki_history_api.py b/tests/test_wiki_history_api.py index 58aa37b..f2dae7a 100644 --- a/tests/test_wiki_history_api.py +++ b/tests/test_wiki_history_api.py @@ -102,6 +102,7 @@ def test_changes_no_root_and_unknown(api): def test_versions_list(history): # новые первыми d = history.client.get("/wiki/pages/DOC-3/versions", project="AWPCA") + assert d["code"] == "DOC-3" and d["title"] == "Статусы" assert len(d["versions"]) == 2 and d["versions"][0]["at"] == "2026-10-27T15:02:00+00:00" assert d["versions"][0]["version"] == "DOCH-31" and d["versions"][0]["author"] == SOSNOV assert hub_error(history.client.get, "/wiki/pages/DOC-99/versions", project="AWPCA").status == 404 @@ -115,6 +116,7 @@ def test_diff_last(four): # сценарий «Ди assert d["index"] == 4 and d["total"] == 4 and d["prev_version"] == v3 and d["version"] == v4 assert d["diff"].startswith(f"--- {v3}\n+++ {v4}\n") and d["next_offset"] is None assert d["code"] == "DOC-3" and d["title"] == "Статусы" and d["path"] == "АРМ КА/01_Статусы" + assert d["at"] == "2026-10-27T20:48:02+00:00" and d["author"] == SOSNOV and d["offset"] == 0 def test_diff_first_version(history): @@ -137,8 +139,9 @@ def test_diff_chunks(api): # сценарий «Дл p0 = part(0) assert len(p0["diff"]) == 20000 and p0["next_offset"] == 20000 and p0["diff"] == full[:20000] + assert p0["offset"] == 0 p40 = part(40000) - assert p40["diff"] == full[40000:] and p40["next_offset"] is None + assert p40["diff"] == full[40000:] and p40["next_offset"] is None and p40["offset"] == 40000 assert p0["diff"] + part(20000)["diff"] + p40["diff"] == full for bad in ("-1", "x"): e = hub_error(api.client.get, "/wiki/pages/DOC-3/diff", project="AWPCA", offset=bad)