Coverage for src/lexigram/admin/module.py: 0%

16 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-24 23:39 +0800

1"""Admin module for dependency injection.""" 

2 

3from __future__ import annotations 

4 

5from typing import Any 

6 

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

8 

9 

10@module() 

11class AdminModule(Module): 

12 """Lexigram admin panel module. 

13 

14 Call :meth:`configure` to register the admin panel with its bundle 

15 provider and contributor system. 

16 

17 Usage:: 

18 

19 from lexigram.admin.config import AdminConfig 

20 

21 app.add_modules([ 

22 AdminModule.configure( 

23 config=AdminConfig(title="My Admin"), 

24 resources=[UserResource, ProductResource], 

25 ), 

26 ]) 

27 """ 

28 

29 @classmethod 

30 def configure( 

31 cls, 

32 config: Any | None = None, 

33 auth_provider: Any | None = None, 

34 resources: list[type] | None = None, 

35 controllers: list[type] | None = None, 

36 **kwargs: Any, 

37 ) -> DynamicModule: 

38 """Create an AdminModule with explicit configuration. 

39 

40 Args: 

41 config: AdminConfig or None for defaults. 

42 auth_provider: Optional AuthProviderProtocol for auth integration. 

43 resources: List of Resource classes to register. 

44 controllers: List of controller classes to register. 

45 **kwargs: Forwarded to AdminProvider. 

46 

47 Returns: 

48 A DynamicModule descriptor. 

49 """ 

50 from lexigram.admin.di.bundle_provider import AdminProvider 

51 from lexigram.contracts.admin.protocols import ( 

52 AdminContributorRegistryProtocol, 

53 AdminDashboardProtocol, 

54 ) 

55 

56 return DynamicModule( 

57 module=cls, 

58 providers=[ 

59 AdminProvider( 

60 config=config, 

61 auth_provider=auth_provider, 

62 resources=resources, 

63 controllers=controllers, 

64 **kwargs, 

65 ), 

66 ], 

67 exports=[AdminContributorRegistryProtocol, AdminDashboardProtocol], 

68 ) 

69 

70 @classmethod 

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

72 """Return a no-op AdminModule for testing. 

73 

74 Args: 

75 config: Optional admin configuration; ``None`` uses defaults. 

76 Honored so test compositions can satisfy boot-time 

77 requirements (e.g. the setup-token guard). 

78 

79 Returns: 

80 A DynamicModule with the given (or default) admin configuration. 

81 """ 

82 from lexigram.admin.di.bundle_provider import AdminProvider 

83 from lexigram.contracts.admin.protocols import ( 

84 AdminContributorRegistryProtocol, 

85 AdminDashboardProtocol, 

86 ) 

87 

88 return DynamicModule( 

89 module=cls, 

90 providers=[AdminProvider(config=config)], 

91 exports=[AdminContributorRegistryProtocol, AdminDashboardProtocol], 

92 ) 

93 

94 

95__all__ = ["AdminModule"]