From 064ae818b8c1ebc5eb1073d072b1b77f6d5ffae7 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Tue, 4 Aug 2026 14:24:22 +0100 Subject: [PATCH] readded the loggin method and its call --- playbook/__init__.py | 64 ++++++++------------------------------ playbook/logging_models.py | 15 +++++++-- 2 files changed, 26 insertions(+), 53 deletions(-) diff --git a/playbook/__init__.py b/playbook/__init__.py index 45af91f..2c29dd2 100644 --- a/playbook/__init__.py +++ b/playbook/__init__.py @@ -1,12 +1,13 @@ from __future__ import annotations from re import A +from tkinter.constants import E import yaml from abc import ABC, abstractmethod from pydantic import BaseModel from playbook.models import ActModel, PlaybookModel, StepModel, timed_run -from playbook.logging_models import PlaybookLog, Status, StepLogModel +from playbook.logging_models import PlaybookLog, Status, StepLogModel, log_file_name from playbook.action_registry import ActionFn, ActionRegistry @@ -21,49 +22,6 @@ class StepIF(ABC): """ Return a mapping of action roles (pre, play, post) to function names. """ pass -# def log_file_name(self, start_date_ns: int) -> str: -# """ Format to ISO 8601. """ -# seconds = start_date_ns // 1_000_000_000 -# ms = (start_date_ns % 1_000_000_000) // 1_000_000 -# -# dt = datetime.fromtimestamp(seconds, tz=timezone.utc).astimezone() -# -# return dt.strftime(f"{self.name}_%Y-%m-%d_%H-%M-%S.{ms:03d}.log") -# -# def _write_log(self, log: StepLogModel): -# try: -# with open(log.log_file_path, "w") as file: -# json.dump(asdict(log), file) -# except Exception as e: -# raise PlaybookError(f"failed to create log file {e}") from e -# return "" -# -# def _play_act(self) -> StepLogModel: -# playLog: StepLogModel = StepLogModel( -# step_name=self.name, -# status=Status.GOOD, -# duration_sec=0, -# msg="", -# error=[], -# substeps=[], -# ) -# -# for a in self._acts: -# log: StepLogModel = self._play_steps(self._acts[a]) -# -# if log.failed: -# playLog.error.append({ -# "status": "failed", -# "output": f"failed in step: {log.step_name}" -# }) -# playLog.status = Status.BAD -# break -# -# if playLog.status == Status.GOOD: -# playLog.msg = "success" -# -# return playLog - class PlaybookYAMLParser(): @staticmethod @@ -173,16 +131,20 @@ class Playbook(): def from_yaml(cls, fp: str) -> Playbook: return PlaybookYAMLParser.from_yaml(fp) + def _write_log(self, log: PlaybookLog): + try: + with open(log.log_file_path, "w") as file: + _ = file.write(log.model_dump_json()) + except Exception as e: + raise Exception(f"failed to create log file {e}") from e + return "" + def view_playbook(self) -> str: return self.model.model_dump_json() def run_play(self) -> PlaybookLog: log: PlaybookLog = self.model.run() - - # if self.model.log_dir != "": - # log.log_file_path = os.path.join( - # self.model.log_dir, self.log_file_name(log.start_date_timestamp) - # ) - # self._write_log(log) - + log.log_file_path = self.model.log_dir + \ + log_file_name(self.model.playbook_name, log.timing.start_date_timestamp) + self._write_log(log) return log diff --git a/playbook/logging_models.py b/playbook/logging_models.py index bbaa078..e8f13c8 100644 --- a/playbook/logging_models.py +++ b/playbook/logging_models.py @@ -1,6 +1,7 @@ from enum import StrEnum from dataclasses import field from pydantic import BaseModel +from datetime import datetime, timezone class Status(StrEnum): @@ -53,7 +54,7 @@ class PlaybookLog(BaseLog): @classmethod def ok(cls, name: str, logs: list[ActLog], msg: str = "success") -> PlaybookLog: return cls(name=name, status=Status.GOOD, summary=msg, act_logs=logs) - + @classmethod def fail(cls, name: str, logs: list[ActLog], err: list[str]) -> PlaybookLog: return cls(name=name, status=Status.BAD, errors=err, act_logs=logs) @@ -76,6 +77,16 @@ class StepLogModel(BaseLog): return cls(name=name, status=Status.GOOD, msg=msg, pipe_ctx=pipe_ctx, substeps_logs=substeps) - @ classmethod + @classmethod def fail(cls, name: str, err: str) -> StepLogModel: return cls(name=name, status=Status.BAD, error=err) + + +def log_file_name(name: str, start_date_ns: int) -> str: + """ Format to ISO 8601. """ + seconds = start_date_ns // 1_000_000_000 + ms = (start_date_ns % 1_000_000_000) // 1_000_000 + + dt = datetime.fromtimestamp(seconds, tz=timezone.utc).astimezone() + + return dt.strftime(f"{name}_%Y-%m-%d_%H-%M-%S.{ms:03d}.log")