From a8cb4886de674a2f3f89ccd451549a7a4ee2922c Mon Sep 17 00:00:00 2001 From: Alexandra Bara Date: Thu, 19 Feb 2026 16:42:37 -0600 Subject: [PATCH 1/3] updates to taskresult --- nodescraper/models/taskresult.py | 35 +++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/nodescraper/models/taskresult.py b/nodescraper/models/taskresult.py index d04618f..cfedeb9 100644 --- a/nodescraper/models/taskresult.py +++ b/nodescraper/models/taskresult.py @@ -29,7 +29,13 @@ import os from typing import Any, Optional -from pydantic import BaseModel, Field, field_serializer, field_validator +from pydantic import ( + BaseModel, + Field, + field_serializer, + field_validator, + model_validator, +) from nodescraper.enums import EventPriority, ExecutionStatus from nodescraper.utils import get_unique_filename, pascal_to_snake @@ -54,6 +60,19 @@ class TaskResult(BaseModel): task: Optional[str] = None parent: Optional[str] = None artifacts: list[BaseModel] = Field(default_factory=list) + + @model_validator(mode="before") + @classmethod + def _source_source_type_aliases(cls, data: Any) -> Any: + """Accept source/source_type as aliases for task/parent""" + if isinstance(data, dict): + data = dict(data) + if "source" in data and "task" not in data: + data["task"] = data.pop("source") + if "source_type" in data and "parent" not in data: + data["parent"] = data.pop("source_type") + return data + events: list[Event] = Field(default_factory=list) start_time: datetime.datetime = Field(default_factory=datetime.datetime.now) end_time: datetime.datetime = Field(default_factory=datetime.datetime.now) @@ -107,14 +126,24 @@ def duration(self) -> Optional[str]: @property def source(self) -> str: - """Task/source name (alias for task for error-scraper compatibility).""" + """Task/source name.""" return self.task or "" + @source.setter + def source(self, value: str) -> None: + """Set task from source""" + self.task = value if value else None + @property def source_type(self) -> str: - """Task/source type (alias for parent for error-scraper compatibility).""" + """Task/source type.""" return self.parent or "" + @source_type.setter + def source_type(self, value: str) -> None: + """Set parent from source_type""" + self.parent = value if value else None + @property def summary_dict(self) -> dict: """Summary dict for logging/display (task_name, task_type, task_result, event_count, duration).""" From 1548ec929fa1d5324c1be49eae8c516b50d7352d Mon Sep 17 00:00:00 2001 From: Alexandra Bara Date: Fri, 20 Feb 2026 09:51:06 -0600 Subject: [PATCH 2/3] updates --- nodescraper/models/taskresult.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/nodescraper/models/taskresult.py b/nodescraper/models/taskresult.py index cfedeb9..7935eab 100644 --- a/nodescraper/models/taskresult.py +++ b/nodescraper/models/taskresult.py @@ -60,11 +60,12 @@ class TaskResult(BaseModel): task: Optional[str] = None parent: Optional[str] = None artifacts: list[BaseModel] = Field(default_factory=list) + details: dict = Field(default_factory=dict) @model_validator(mode="before") @classmethod def _source_source_type_aliases(cls, data: Any) -> Any: - """Accept source/source_type as aliases for task/parent""" + """Accept source/source_type.""" if isinstance(data, dict): data = dict(data) if "source" in data and "task" not in data: @@ -131,7 +132,7 @@ def source(self) -> str: @source.setter def source(self, value: str) -> None: - """Set task from source""" + """Set task from source.""" self.task = value if value else None @property @@ -141,7 +142,7 @@ def source_type(self) -> str: @source_type.setter def source_type(self, value: str) -> None: - """Set parent from source_type""" + """Set parent from source_type.""" self.parent = value if value else None @property From e231169a822e0e151e7370b0a3bf413b00c9515e Mon Sep 17 00:00:00 2001 From: Alexandra Bara Date: Fri, 20 Feb 2026 10:10:57 -0600 Subject: [PATCH 3/3] updates --- nodescraper/models/taskresult.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/nodescraper/models/taskresult.py b/nodescraper/models/taskresult.py index 7935eab..afb534e 100644 --- a/nodescraper/models/taskresult.py +++ b/nodescraper/models/taskresult.py @@ -238,6 +238,16 @@ def _get_event_summary(self) -> str: return "; ".join(summary_parts) + def _get_event_priorities(self) -> str: + warnings = sum(1 for e in self.events if e.priority == EventPriority.WARNING) + errors = sum(1 for e in self.events if e.priority >= EventPriority.ERROR) + parts = [] + if warnings: + parts.append(f"{warnings} warnings") + if errors: + parts.append(f"{errors} errors") + return "|".join(parts) + def _update_status(self) -> None: """Update overall status based on event priority""" self.status = ExecutionStatus.OK