Coverage for src/lexigram/admin/services/resource_manager_factory.py: 0%

19 statements  

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

1"""ResourceManagerFactory: factory for creating ResourceManager instances.""" 

2 

3from __future__ import annotations 

4 

5from typing import Any, TypeVar 

6 

7from lexigram.admin.services.resource_manager import ( 

8 DefaultAuthorizer, 

9 DefaultValidator, 

10 ResourceDataSourceProtocol, 

11 ResourceManager, 

12 Validator, 

13) 

14from lexigram.contracts.auth import AuthorizerProtocol 

15from lexigram.di.decorators import inject 

16 

17T = TypeVar("T") 

18 

19 

20@inject 

21class ResourceManagerFactory: 

22 """Factory for creating ResourceManager instances. 

23 

24 Useful for dependency injection and consistent configuration. 

25 

26 Example: 

27 >>> factory = ResourceManagerFactory( 

28 ... default_authorizer=role_authorizer, 

29 ... ) 

30 >>> user_manager = factory.create( 

31 ... "users", 

32 ... user_data_source, 

33 ... validator=user_validator, 

34 ... ) 

35 """ 

36 

37 def __init__( 

38 self, 

39 default_authorizer: AuthorizerProtocol | None = None, 

40 default_validator: Validator | None = None, 

41 ): 

42 """Initialize the factory. 

43 

44 Args: 

45 default_authorizer: Default authorizer for all managers 

46 default_validator: Default validator for all managers 

47 """ 

48 self.default_authorizer = default_authorizer 

49 self.default_validator = default_validator 

50 self._managers: dict[str, ResourceManager[Any]] = {} 

51 

52 def create( 

53 self, 

54 resource_name: str, 

55 data_source: ResourceDataSourceProtocol[T], 

56 *, 

57 validator: Validator | None = None, 

58 authorizer: AuthorizerProtocol | None = None, 

59 ) -> ResourceManager[T]: 

60 """Create a ResourceManager instance. 

61 

62 Args: 

63 resource_name: Name of the resource 

64 data_source: Data source for the resource 

65 validator: Optional validator (uses default if not provided) 

66 authorizer: Optional authorizer (uses default if not provided) 

67 

68 Returns: 

69 Configured ResourceManager instance 

70 """ 

71 manager: ResourceManager[T] = ResourceManager( 

72 resource_name=resource_name, 

73 data_source=data_source, 

74 validator=validator or self.default_validator, 

75 authorizer=authorizer or self.default_authorizer, 

76 ) 

77 self._managers[resource_name] = manager 

78 return manager 

79 

80 def get(self, resource_name: str) -> ResourceManager[Any] | None: 

81 """Get a previously created manager by name. 

82 

83 Args: 

84 resource_name: Name of the resource 

85 

86 Returns: 

87 ResourceManager if exists, None otherwise 

88 """ 

89 return self._managers.get(resource_name) 

90 

91 

92__all__ = [ 

93 "DefaultAuthorizer", 

94 "DefaultValidator", 

95 "ResourceDataSourceProtocol", 

96 "ResourceManager", 

97 "ResourceManagerFactory", 

98 "Validator", 

99]