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

1"""Feature-flag domain events. 

2 

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. 

6 

7Example:: 

8 

9 from lexigram.features.events import FlagChangeEvent 

10 

11 def on_flag_change(event: FlagChangeEvent) -> None: 

12 print(f"{event.flag_name} -> {event.new_enabled}") 

13 

14 event_bus.subscribe(FlagChangeEvent, handler) 

15""" 

16 

17from __future__ import annotations 

18 

19from dataclasses import dataclass 

20 

21from lexigram.contracts.domain.events import DomainEvent 

22 

23 

24@dataclass(init=False, frozen=True) 

25class FlagChangeEvent(DomainEvent): 

26 """Published when a feature-flag runtime override is applied or cleared. 

27 

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 """ 

34 

35 flag_name: str = "" 

36 old_enabled: bool | None = None 

37 new_enabled: bool = False 

38 actor: str | None = None 

39 

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`. 

48 

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) 

60 

61 

62__all__ = ["FlagChangeEvent"]