base.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. # -*- coding: utf-8 -*-
  2. """
  3. Basis-Klasse für Event-Daten.
  4. """
  5. import uuid
  6. from dataclasses import dataclass, field
  7. from datetime import datetime
  8. from typing import Any
  9. @dataclass
  10. class EventData:
  11. """
  12. Basisklasse für alle Event-Daten.
  13. Jedes Event trägt Metadaten wie eindeutige ID, Zeitstempel,
  14. Quelle und Abbruch-Status.
  15. Attributes:
  16. event_id: Eindeutige ID des Events
  17. timestamp: Zeitpunkt der Event-Erstellung
  18. source: Quelle des Events (z.B. Service-Name)
  19. cancelled: Ob das Event abgebrochen wurde
  20. metadata: Zusätzliche Metadaten
  21. """
  22. event_id: str = field(default_factory=lambda: str(uuid.uuid4()))
  23. timestamp: datetime = field(default_factory=datetime.now)
  24. source: str = ""
  25. cancelled: bool = field(default=False, repr=False)
  26. metadata: dict[str, Any] = field(default_factory=dict, repr=False)
  27. def cancel(self) -> None:
  28. """Bricht das Event ab (verhindert weitere Handler-Ausführung)."""
  29. self.cancelled = True
  30. def is_cancelled(self) -> bool:
  31. """Prüft, ob das Event abgebrochen wurde."""
  32. return self.cancelled
  33. # Dict-ähnlicher Zugriff auf metadata für einfache Nutzung
  34. def get(self, key: str, default: Any = None) -> Any:
  35. """Gibt einen Wert aus metadata zurück."""
  36. return self.metadata.get(key, default)
  37. def __getitem__(self, key: str) -> Any:
  38. """Ermöglicht data["key"] Zugriff."""
  39. return self.metadata[key]
  40. def __setitem__(self, key: str, value: Any) -> None:
  41. """Ermöglicht data["key"] = value."""
  42. self.metadata[key] = value
  43. def __contains__(self, key: str) -> bool:
  44. """Ermöglicht 'key' in data."""
  45. return key in self.metadata
  46. def keys(self):
  47. """Gibt die Schlüssel der metadata zurück."""
  48. return self.metadata.keys()
  49. def values(self):
  50. """Gibt die Werte der metadata zurück."""
  51. return self.metadata.values()
  52. def items(self):
  53. """Gibt die Items der metadata zurück."""
  54. return self.metadata.items()
  55. @classmethod
  56. def event_name(cls) -> str:
  57. """
  58. Gibt den kanonischen Event-Namen zurück.
  59. Standard: Klassenname in snake_case.
  60. Kann in Unterklassen überschrieben werden.
  61. """
  62. name = cls.__name__
  63. # CamelCase zu snake_case
  64. result = []
  65. for i, char in enumerate(name):
  66. if char.isupper() and i > 0:
  67. result.append("_")
  68. result.append(char.lower())
  69. return "".join(result)