Coverage for src/lexigram/features/config.py: 100%

17 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-26 02:04 +0800

1"""Configuration model for the feature-flag subsystem.""" 

2 

3from __future__ import annotations 

4 

5from dataclasses import dataclass 

6from typing import ClassVar 

7 

8from lexigram.config.base import BaseConfig 

9from lexigram.features.constants import ( 

10 DEFAULT_CACHE_TTL, 

11 DEFAULT_ENABLED, 

12 ENV_NESTED_DELIMITER, 

13) 

14from lexigram.features.constants import ( 

15 ENV_PREFIX as FLAG_ENV_PREFIX, 

16) 

17from lexigram.validation import ConfigDict, Field 

18 

19 

20@dataclass(init=False) 

21class FeatureFlagsConfig(BaseConfig): 

22 """Runtime configuration for the feature flag DI provider. 

23 

24 Values here control the default behaviour of the container-registered 

25 :class:`~lexigram.feature_flags.manager.FlagManager` instance. 

26 """ 

27 

28 config_section: ClassVar[str] = "features" 

29 

30 model_config: ClassVar[ConfigDict] = ConfigDict( # type: ignore[typeddict-unknown-key] 

31 env_prefix="LEX_FEATURES__", 

32 env_nested_delimiter=ENV_NESTED_DELIMITER, 

33 extra="ignore", 

34 ) 

35 

36 enabled: bool = Field( 

37 default=True, description="Enable the feature flags subsystem" 

38 ) 

39 

40 cache_ttl: int = Field( 

41 default=DEFAULT_CACHE_TTL, 

42 ge=0, 

43 description="Seconds to cache flag evaluations (0 = disabled).", 

44 ) 

45 default_enabled: bool = Field( 

46 default=DEFAULT_ENABLED, 

47 description="Default value when a flag is not found in the provider.", 

48 ) 

49 flag_env_prefix: str = Field( 

50 default=FLAG_ENV_PREFIX, 

51 description="Env var prefix used by EnvProvider when reading flag values.", 

52 ) 

53 initial_flags: dict[str, bool] = Field( 

54 default_factory=dict, 

55 description="Seed flags for the in-memory provider (name -> enabled).", 

56 ) 

57 

58 

59__all__ = ["FeatureFlagsConfig"]