Coverage for src / lexigram / admin / __init__.py: 53%
17 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-13 22:09 +0800
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-13 22:09 +0800
1"""Lexigram Admin — Administrative panel for Lexigram applications."""
3from __future__ import annotations
5__path__ = __import__("pkgutil").extend_path(__path__, __name__)
7import importlib.metadata
8from typing import TYPE_CHECKING, Any
10from lexigram.admin.constants import __version__ as __version__
12if TYPE_CHECKING:
13 from lexigram.admin.contributors.base import BaseAdminContributor
14 from lexigram.admin.contributors.core import CoreAdminContributor
15 from lexigram.admin.contributors.registry import ContributorRegistry
16 from lexigram.admin.di.bundle_provider import AdminProvider
17 from lexigram.admin.exceptions import (
18 AdminError,
19 AdminValidationError,
20 ConflictError,
21 DataError,
22 ErrorCode,
23 NotFoundError,
24 NotificationError,
25 PermissionDeniedError,
26 )
27 from lexigram.admin.module import AdminModule
28 from lexigram.admin.types import AdminStatus, AdminUser
29 from lexigram.contracts.admin.protocols import (
30 AdminContributorProtocol,
31 AdminContributorRegistryProtocol,
32 AdminDashboardProtocol,
33 )
35_LAZY_IMPORTS: dict[str, str] = {
36 # Exceptions
37 "AdminError": "lexigram.admin.exceptions",
38 "AdminValidationError": "lexigram.admin.exceptions",
39 "ConflictError": "lexigram.admin.exceptions",
40 "DataError": "lexigram.admin.exceptions",
41 "ErrorCode": "lexigram.admin.exceptions",
42 "NotFoundError": "lexigram.admin.exceptions",
43 "NotificationError": "lexigram.admin.exceptions",
44 "PermissionDeniedError": "lexigram.admin.exceptions",
45 # DI
46 "AdminProvider": "lexigram.admin.di.bundle_provider",
47 "AdminModule": "lexigram.admin.module",
48 # Contributors
49 "BaseAdminContributor": "lexigram.admin.contributors.base",
50 "CoreAdminContributor": "lexigram.admin.contributors.core",
51 "ContributorRegistry": "lexigram.admin.contributors.registry",
52 # Protocols (canonical locations in lexigram-contracts)
53 "AdminContributorProtocol": "lexigram.contracts.admin.protocols",
54 "AdminContributorRegistryProtocol": "lexigram.contracts.admin.protocols",
55 "AdminDashboardProtocol": "lexigram.contracts.admin.protocols",
56 # Types
57 "AdminStatus": "lexigram.admin.types",
58 "AdminUser": "lexigram.admin.types",
59 # Hooks
60 "AdminPanelStartedHook": "lexigram.admin.hooks",
61 "AdminPanelStoppedHook": "lexigram.admin.hooks",
62 "AdminResourceAccessedHook": "lexigram.admin.hooks",
63}
66def __getattr__(name: str) -> Any:
67 if name in _LAZY_IMPORTS:
68 import importlib
70 module = importlib.import_module(_LAZY_IMPORTS[name])
71 value = getattr(module, name)
72 globals()[name] = value
73 return value
74 raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
77def __dir__() -> list[str]:
78 return sorted(set(__all__) | set(_LAZY_IMPORTS.keys()))
81__all__ = [
82 "AdminContributorProtocol",
83 "AdminContributorRegistryProtocol",
84 "AdminDashboardProtocol",
85 "AdminError",
86 "AdminModule",
87 "AdminPanelStartedHook",
88 "AdminPanelStoppedHook",
89 "AdminProvider",
90 "AdminResourceAccessedHook",
91 "AdminStatus",
92 "AdminUser",
93 "AdminValidationError",
94 "BaseAdminContributor",
95 "ConflictError",
96 "ContributorRegistry",
97 "CoreAdminContributor",
98 "DataError",
99 "ErrorCode",
100 "NotFoundError",
101 "NotificationError",
102 "PermissionDeniedError",
103]