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
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-26 02:04 +0800
1"""Configuration model for the feature-flag subsystem."""
3from __future__ import annotations
5from dataclasses import dataclass
6from typing import ClassVar
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
20@dataclass(init=False)
21class FeatureFlagsConfig(BaseConfig):
22 """Runtime configuration for the feature flag DI provider.
24 Values here control the default behaviour of the container-registered
25 :class:`~lexigram.feature_flags.manager.FlagManager` instance.
26 """
28 config_section: ClassVar[str] = "features"
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 )
36 enabled: bool = Field(
37 default=True, description="Enable the feature flags subsystem"
38 )
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 )
59__all__ = ["FeatureFlagsConfig"]