Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions nodescraper/interfaces/task.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import copy
import datetime
import logging
import uuid
from typing import Any, Optional, Union

from nodescraper.constants import DEFAULT_LOGGER
Expand Down Expand Up @@ -54,6 +55,7 @@ def __init__(
max_event_priority_level: Union[EventPriority, str] = EventPriority.CRITICAL,
parent: Optional[str] = None,
task_result_hooks: Optional[list[TaskResultHook]] = None,
session_id: Optional[str] = None,
**kwargs: dict[str, Any],
):
if logger is None:
Expand All @@ -65,6 +67,16 @@ def __init__(
if not task_result_hooks:
task_result_hooks = []
self.task_result_hooks = task_result_hooks

if session_id is None and "session_id" in kwargs:
session_id = kwargs.pop("session_id") # type: ignore[assignment]
if session_id is not None:
try:
uuid.UUID(str(session_id))
except (ValueError, TypeError, AttributeError):
raise ValueError("session_id must be a valid UUID") from None
self.session_id: Optional[str] = str(session_id) if session_id is not None else None

self.result: TaskResult = self._init_result()

@property
Expand Down Expand Up @@ -115,6 +127,9 @@ def _build_event(
if self.parent:
data["parent"] = self.parent

if self.session_id is not None:
data["session_id"] = self.session_id

if self.system_info.metadata:
data["system_metadata"] = copy.copy(self.system_info.metadata)

Expand Down
21 changes: 14 additions & 7 deletions nodescraper/models/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
import re
import uuid
from enum import Enum
from typing import Any, Optional, Union
from typing import Any, Optional, Union, cast

from pydantic import BaseModel, Field, field_serializer, field_validator

Expand Down Expand Up @@ -113,15 +113,22 @@ def validate_category(cls, category: Optional[Union[str, Enum]]) -> str:

@field_validator("priority", mode="before")
@classmethod
def validate_priority(cls, priority: Union[str, EventPriority]) -> EventPriority:
"""Allow priority to be set via string priority name
def validate_priority(cls, priority: Union[str, int, EventPriority]) -> EventPriority:
"""Allow priority as EventPriority, enum name string, or IntEnum value (unknown int -> ERROR).

Args:
priority (Union[str, EventPriority]): event priority string or enum
priority: EventPriority, name string, integer matching a level, or unknown int (maps to ERROR).

Raises:
ValueError: if priority string is an invalid value
Returns:
EventPriority: priority enum
ValueError: if priority string is invalid, or if a boolean is passed.
"""
if type(priority) is bool:
raise ValueError("priority must not be a boolean")
if isinstance(priority, int):
try:
return cast(EventPriority, EventPriority(priority))
except ValueError:
return EventPriority.ERROR
if isinstance(priority, str):
try:
return getattr(EventPriority, priority.upper())
Expand Down
Loading
Loading