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

1"""UI module for dependency injection.""" 

2 

3from __future__ import annotations 

4 

5from typing import Any 

6 

7from lexigram.di.module import DynamicModule, Module, module 

8from lexigram.ui.protocols import RenderableProtocol 

9 

10 

11@module() 

12class UIModule(Module): 

13 """HTMX/htpy component library module. 

14 

15 Call :meth:`configure` to configure and register the UI component 

16 system for injection. 

17 

18 Usage:: 

19 

20 from lexigram.ui.config import UIConfig 

21 

22 @module( 

23 imports=[UIModule.configure(UIConfig(default_theme="default"))] 

24 ) 

25 class AppModule(Module): 

26 pass 

27 """ 

28 

29 @classmethod 

30 def configure(cls, config: Any | None = None, **kwargs: Any) -> DynamicModule: 

31 """Create a UIModule with explicit configuration. 

32 

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

38 

39 Returns: 

40 A :class:`~lexigram.di.module.DynamicModule` descriptor. 

41 """ 

42 from lexigram.ui.di.provider import UIProvider 

43 

44 return DynamicModule( 

45 module=cls, 

46 providers=[UIProvider(config=config, **kwargs)], 

47 exports=[RenderableProtocol], 

48 ) 

49 

50 @classmethod 

51 def stub(cls, config: Any = None) -> DynamicModule: 

52 """Return a no-op UIModule for testing. 

53 

54 Registers the UI provider with default configuration. 

55 No real rendering backends are configured. 

56 

57 Args: 

58 config: Optional UIConfig override (passed to UIProvider). 

59 

60 Returns: 

61 A DynamicModule with default UI configuration. 

62 """ 

63 from lexigram.ui.di.provider import UIProvider 

64 

65 return DynamicModule( 

66 module=cls, 

67 providers=[UIProvider(config=config)], 

68 exports=[RenderableProtocol], 

69 ) 

70 

71 

72__all__ = ["UIModule"]