Coverage for src / lexigram / ui / module.py: 87%
15 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-10 04:11 +0800
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-10 04:11 +0800
1"""UI module for dependency injection."""
3from __future__ import annotations
5from typing import Any
7from lexigram.di.module import DynamicModule, Module, module
8from lexigram.ui.protocols import RenderableProtocol
11@module()
12class UIModule(Module):
13 """HTMX/htpy component library module.
15 Call :meth:`configure` to configure and register the UI component
16 system for injection.
18 Usage::
20 from lexigram.ui.config import UIConfig
22 @module(
23 imports=[UIModule.configure(UIConfig(default_theme="default"))]
24 )
25 class AppModule(Module):
26 pass
27 """
29 @classmethod
30 def configure(cls, config: Any | None = None, **kwargs: Any) -> DynamicModule:
31 """Create a UIModule with explicit configuration.
33 Args:
34 config: :class:`~lexigram.ui.config.UIConfig` or ``None``
35 to use defaults.
36 **kwargs: Additional keyword arguments forwarded to
37 :class:`~lexigram.ui.di.provider.UIProvider`.
39 Returns:
40 A :class:`~lexigram.di.module.DynamicModule` descriptor.
41 """
42 from lexigram.ui.di.provider import UIProvider
44 return DynamicModule(
45 module=cls,
46 providers=[UIProvider(config=config, **kwargs)],
47 exports=[RenderableProtocol],
48 )
50 @classmethod
51 def stub(cls, config: Any = None) -> DynamicModule:
52 """Return a no-op UIModule for testing.
54 Registers the UI provider with default configuration.
55 No real rendering backends are configured.
57 Args:
58 config: Optional UIConfig override (passed to UIProvider).
60 Returns:
61 A DynamicModule with default UI configuration.
62 """
63 from lexigram.ui.di.provider import UIProvider
65 return DynamicModule(
66 module=cls,
67 providers=[UIProvider(config=config)],
68 exports=[RenderableProtocol],
69 )
72__all__ = ["UIModule"]