Coverage for src / lexigram / admin / services / resource_manager_factory.py: 79%
19 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-13 22:14 +0800
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-13 22:14 +0800
1"""ResourceManagerFactory: factory for creating ResourceManager instances."""
3from __future__ import annotations
5from typing import Any, TypeVar
7from lexigram.admin.services.resource_manager import (
8 DefaultAuthorizer,
9 DefaultValidator,
10 ResourceDataSourceProtocol,
11 ResourceManager,
12 Validator,
13)
14from lexigram.contracts.admin.authorizer import AdminAuthorizerProtocol
15from lexigram.di.decorators import inject
17T = TypeVar("T")
20@inject
21class ResourceManagerFactory:
22 """Factory for creating ResourceManager instances.
24 Useful for dependency injection and consistent configuration.
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 """
37 def __init__(
38 self,
39 default_authorizer: AdminAuthorizerProtocol | None = None,
40 default_validator: Validator | None = None,
41 ):
42 """Initialize the factory.
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]] = {}
52 def create(
53 self,
54 resource_name: str,
55 data_source: ResourceDataSourceProtocol[T],
56 *,
57 validator: Validator | None = None,
58 authorizer: AdminAuthorizerProtocol | None = None,
59 ) -> ResourceManager[T]:
60 """Create a ResourceManager instance.
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)
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
80 def get(self, resource_name: str) -> ResourceManager[Any] | None:
81 """Get a previously created manager by name.
83 Args:
84 resource_name: Name of the resource
86 Returns:
87 ResourceManager if exists, None otherwise
88 """
89 return self._managers.get(resource_name)
92__all__ = [
93 "AdminAuthorizerProtocol",
94 "DefaultAuthorizer",
95 "DefaultValidator",
96 "ResourceDataSourceProtocol",
97 "ResourceManager",
98 "ResourceManagerFactory",
99 "Validator",
100]