From 631e572d604d0665b596b122792542cef211dc58 Mon Sep 17 00:00:00 2001 From: Evgenii Alekseev Date: Sat, 8 Mar 2025 16:26:58 +0200 Subject: [PATCH] rename column in logs table, add coverters --- .../migrations/m015_logs_process_id.py | 3 ++ .../database/operations/logs_operations.py | 15 +++----- src/ahriman/core/status/web_client.py | 9 +---- src/ahriman/models/event.py | 2 +- src/ahriman/models/log_record.py | 38 +++++++++++++++++++ src/ahriman/web/views/v1/packages/logs.py | 8 +--- src/ahriman/web/views/v2/packages/logs.py | 9 +---- tests/ahriman/models/test_log_record.py | 13 +++++++ 8 files changed, 63 insertions(+), 34 deletions(-) diff --git a/src/ahriman/core/database/migrations/m015_logs_process_id.py b/src/ahriman/core/database/migrations/m015_logs_process_id.py index b0a9001b..81f29481 100644 --- a/src/ahriman/core/database/migrations/m015_logs_process_id.py +++ b/src/ahriman/core/database/migrations/m015_logs_process_id.py @@ -24,4 +24,7 @@ steps = [ """ alter table logs add column process_id text not null default '' """, + """ + alter table logs rename column record to message + """, ] diff --git a/src/ahriman/core/database/operations/logs_operations.py b/src/ahriman/core/database/operations/logs_operations.py index 975b5f62..4dc5d0e6 100644 --- a/src/ahriman/core/database/operations/logs_operations.py +++ b/src/ahriman/core/database/operations/logs_operations.py @@ -21,7 +21,6 @@ from sqlite3 import Connection from ahriman.core.database.operations.operations import Operations from ahriman.models.log_record import LogRecord -from ahriman.models.log_record_id import LogRecordId from ahriman.models.repository_id import RepositoryId @@ -48,10 +47,10 @@ class LogsOperations(Operations): def run(connection: Connection) -> list[LogRecord]: return [ - LogRecord(LogRecordId(package_base, row["version"], row["process_id"]), row["created"], row["record"]) + LogRecord.from_json(package_base, row) for row in connection.execute( """ - select created, record, version, process_id from ( + select created, message, version, process_id from ( select * from logs where package_base = :package_base and repository = :repository order by created desc limit :limit offset :offset @@ -81,18 +80,14 @@ class LogsOperations(Operations): connection.execute( """ insert into logs - (package_base, version, created, record, repository, process_id) + (package_base, version, created, message, repository, process_id) values - (:package_base, :version, :created, :record, :repository, :process_id) + (:package_base, :version, :created, :message, :repository, :process_id) """, { "package_base": log_record.log_record_id.package_base, - "version": log_record.log_record_id.version, - "created": log_record.created, - "record": log_record.message, "repository": repository_id.id, - "process_id": log_record.log_record_id.process_id, - } + } | log_record.view() ) return self.with_connection(run, commit=True) diff --git a/src/ahriman/core/status/web_client.py b/src/ahriman/core/status/web_client.py index 32414f4e..e492de18 100644 --- a/src/ahriman/core/status/web_client.py +++ b/src/ahriman/core/status/web_client.py @@ -30,7 +30,6 @@ from ahriman.models.dependencies import Dependencies from ahriman.models.event import Event, EventType from ahriman.models.internal_status import InternalStatus from ahriman.models.log_record import LogRecord -from ahriman.models.log_record_id import LogRecordId from ahriman.models.package import Package from ahriman.models.pkgbuild_patch import PkgbuildPatch from ahriman.models.repository_id import RepositoryId @@ -345,13 +344,7 @@ class WebClient(Client, SyncAhrimanClient): response = self.make_request("GET", self._logs_url(package_base), params=query) response_json = response.json() - return [ - LogRecord( - LogRecordId(package_base, record["version"], record["process_id"]), - record["created"], - record["message"] - ) for record in response_json - ] + return [LogRecord.from_json(package_base, record) for record in response_json] return [] diff --git a/src/ahriman/models/event.py b/src/ahriman/models/event.py index 3c3f4ea4..2f1281e7 100644 --- a/src/ahriman/models/event.py +++ b/src/ahriman/models/event.py @@ -78,7 +78,7 @@ class Event: dump(dict[str, Any]): json dump body Returns: - Self: dependencies object + Self: event object """ return cls( event=dump["event"], diff --git a/src/ahriman/models/log_record.py b/src/ahriman/models/log_record.py index c2eeca7d..1f6d9a25 100644 --- a/src/ahriman/models/log_record.py +++ b/src/ahriman/models/log_record.py @@ -18,6 +18,7 @@ # along with this program. If not, see . # from dataclasses import dataclass +from typing import Any, Self from ahriman.models.log_record_id import LogRecordId @@ -36,3 +37,40 @@ class LogRecord: log_record_id: LogRecordId created: float message: str + + @classmethod + def from_json(cls, package_base: str, dump: dict[str, Any]) -> Self: + """ + construct log record from the json dump + + Args: + package_base(str): package base for which log record belongs + dump(dict[str, Any]): json dump body + + Returns: + Self: log record object + """ + if "process_id" in dump: + log_record_id = LogRecordId(package_base, dump["version"], dump["process_id"]) + else: + log_record_id = LogRecordId(package_base, dump["version"]) + + return cls( + log_record_id=log_record_id, + created=dump["created"], + message=dump["message"], + ) + + def view(self) -> dict[str, Any]: + """ + generate json log record view + + Returns: + dict[str, Any]: json-friendly dictionary + """ + return { + "created": self.created, + "message": self.message, + "version": self.log_record_id.version, + "process_id": self.log_record_id.process_id, + } diff --git a/src/ahriman/web/views/v1/packages/logs.py b/src/ahriman/web/views/v1/packages/logs.py index 7985019d..cb82ff53 100644 --- a/src/ahriman/web/views/v1/packages/logs.py +++ b/src/ahriman/web/views/v1/packages/logs.py @@ -22,7 +22,6 @@ from aiohttp.web import HTTPBadRequest, HTTPNoContent, HTTPNotFound, Response, j from ahriman.core.exceptions import UnknownPackageError from ahriman.core.utils import pretty_datetime from ahriman.models.log_record import LogRecord -from ahriman.models.log_record_id import LogRecordId from ahriman.models.user_access import UserAccess from ahriman.web.apispec.decorators import apidocs from ahriman.web.schemas import LogSchema, LogsSchema, PackageNameSchema, PackageVersionSchema, RepositoryIdSchema @@ -123,15 +122,10 @@ class LogsView(StatusViewGuard, BaseView): try: data = await self.request.json() - created = data["created"] - record = data["message"] - version = data["version"] + log_record = LogRecord.from_json(package_base, data) except Exception as ex: raise HTTPBadRequest(reason=str(ex)) - # either read from process identifier from payload or assign to the current process identifier - process_id = data.get("process_id", LogRecordId("", "").process_id) - log_record = LogRecord(LogRecordId(package_base, version, process_id), created, record) self.service().package_logs_add(log_record) raise HTTPNoContent diff --git a/src/ahriman/web/views/v2/packages/logs.py b/src/ahriman/web/views/v2/packages/logs.py index 4355e016..0e9bfe40 100644 --- a/src/ahriman/web/views/v2/packages/logs.py +++ b/src/ahriman/web/views/v2/packages/logs.py @@ -63,12 +63,5 @@ class LogsView(StatusViewGuard, BaseView): logs = self.service(package_base=package_base).package_logs_get(package_base, limit, offset) - response = [ - { - "created": log_record.created, - "message": log_record.message, - "version": log_record.log_record_id.version, - "process_id": log_record.log_record_id.process_id, - } for log_record in logs - ] + response = [log_record.view() for log_record in logs] return json_response(response) diff --git a/tests/ahriman/models/test_log_record.py b/tests/ahriman/models/test_log_record.py index e69de29b..730463c3 100644 --- a/tests/ahriman/models/test_log_record.py +++ b/tests/ahriman/models/test_log_record.py @@ -0,0 +1,13 @@ +from ahriman.models.log_record import LogRecord +from ahriman.models.log_record_id import LogRecordId + + +def test_log_record_from_json_view() -> None: + """ + must construct same object from json + """ + log_record = LogRecord(LogRecordId("base", "version"), 0, "message") + assert LogRecord.from_json(log_record.log_record_id.package_base, log_record.view()) == log_record + + log_record = LogRecord(LogRecordId("base", "version", "process_id"), 0, "message") + assert LogRecord.from_json(log_record.log_record_id.package_base, log_record.view()) == log_record