Coverage for src/lexigram/admin/__init__.py: 88%

17 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-21 14:56 +0800

1"""Lexigram Admin — Administrative panel for Lexigram applications.""" 

2 

3from __future__ import annotations 

4 

5__path__ = __import__("pkgutil").extend_path(__path__, __name__) 

6 

7import importlib.metadata 

8from typing import TYPE_CHECKING, Any 

9 

10from lexigram.admin.constants import __version__ as __version__ 

11 

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 ) 

34 

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} 

64 

65 

66def __getattr__(name: str) -> Any: 

67 if name in _LAZY_IMPORTS: 

68 import importlib 

69 

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}") 

75 

76 

77def __dir__() -> list[str]: 

78 return sorted(set(__all__) | set(_LAZY_IMPORTS.keys())) 

79 

80 

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]