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
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-24 23:39 +0800
1"""Admin module for dependency injection."""
3from __future__ import annotations
5from typing import Any
7from lexigram.di.module import DynamicModule, Module, module
10@module()
11class AdminModule(Module):
12 """Lexigram admin panel module.
14 Call :meth:`configure` to register the admin panel with its bundle
15 provider and contributor system.
17 Usage::
19 from lexigram.admin.config import AdminConfig
21 app.add_modules([
22 AdminModule.configure(
23 config=AdminConfig(title="My Admin"),
24 resources=[UserResource, ProductResource],
25 ),
26 ])
27 """
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.
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.
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 )
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 )
70 @classmethod
71 def stub(cls, config: Any = None) -> DynamicModule:
72 """Return a no-op AdminModule for testing.
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).
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 )
88 return DynamicModule(
89 module=cls,
90 providers=[AdminProvider(config=config)],
91 exports=[AdminContributorRegistryProtocol, AdminDashboardProtocol],
92 )
95__all__ = ["AdminModule"]