Coverage for src/lexigram/features/events.py: 100%
16 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-26 02:04 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-26 02:04 +0800
1"""Feature-flag domain events.
3Published to the :class:`~lexigram.contracts.events.protocols.EventBusProtocol`
4whenever a runtime flag override is applied. Consumers can subscribe to
5:class:`FlagChangeEvent` to react to flag toggles without polling.
7Example::
9 from lexigram.features.events import FlagChangeEvent
11 def on_flag_change(event: FlagChangeEvent) -> None:
12 print(f"{event.flag_name} -> {event.new_enabled}")
14 event_bus.subscribe(FlagChangeEvent, handler)
15"""
17from __future__ import annotations
19from dataclasses import dataclass
21from lexigram.contracts.domain.events import DomainEvent
24@dataclass(init=False, frozen=True)
25class FlagChangeEvent(DomainEvent):
26 """Published when a feature-flag runtime override is applied or cleared.
28 Attributes:
29 flag_name: Name of the feature flag that changed.
30 old_enabled: State before the change (``None`` if no prior override).
31 new_enabled: State after the change.
32 actor: Optional identifier of the entity that triggered the change.
33 """
35 flag_name: str = ""
36 old_enabled: bool | None = None
37 new_enabled: bool = False
38 actor: str | None = None
40 def __init__(
41 self,
42 flag_name: str,
43 old_enabled: bool | None,
44 new_enabled: bool,
45 actor: str | None = None,
46 ) -> None:
47 """Create a :class:`FlagChangeEvent`.
49 Args:
50 flag_name: Name of the feature flag that changed.
51 old_enabled: Prior override state (``None`` if no override was set).
52 new_enabled: New override state after the change.
53 actor: Optional identifier of who triggered the change.
54 """
55 super().__init__()
56 object.__setattr__(self, "flag_name", flag_name)
57 object.__setattr__(self, "old_enabled", old_enabled)
58 object.__setattr__(self, "new_enabled", new_enabled)
59 object.__setattr__(self, "actor", actor)
62__all__ = ["FlagChangeEvent"]