Coverage for src / mysingle / __init__.py: 35%

18 statements  

« prev     ^ index     » next       coverage.py v7.12.0, created at 2025-12-02 00:58 +0900

1"""mysingle package public API (lazy exports) 

2 

3이 패키지의 루트에서는 무거운 서브모듈을 즉시 import 하지 않고, 

4요청 시점에 지연 로딩하여 순환 참조와 초기화 비용을 줄입니다. 

5 

6외부 사용자는 기존과 동일하게 다음과 같이 사용할 수 있습니다: 

7 

8 from mysingle import get_logger, BaseDuckDBManager, create_fastapi_app 

9 

10내부적으로는 PEP 562의 __getattr__을 활용해 필요한 기호만 지연 import 합니다. 

11""" 

12 

13from __future__ import annotations 

14 

15import importlib 

16from typing import TYPE_CHECKING 

17 

18__version__ = "2.0.0-alpha" 

19 

20# 공개 심볼 목록(동일 유지) 

21__all__ = [ 

22 "__version__", 

23 # Core: Config 

24 "settings", 

25 "get_settings", 

26 "CommonSettings", 

27 # Core: Logging (consolidated) 

28 "get_logger", 

29 "setup_logging", 

30 # Core: Base (consolidated) 

31 "BaseDoc", 

32 "BaseTimeDoc", 

33 "BaseTimeDocWithUserId", 

34 "BaseResponseSchema", 

35 # Core: Metrics (consolidated) 

36 "MetricsCollector", 

37 "get_metrics_collector", 

38 # Core: Health (consolidated) 

39 "HealthChecker", 

40 "register_health_routes", 

41 # Core: Email (consolidated) 

42 "EmailService", 

43 "send_email", 

44 # Core: Audit (consolidated) 

45 "AuditLogger", 

46 "log_audit_event", 

47 # Core: Database 

48 "init_mongo", 

49 "get_mongodb_url", 

50 "get_database_name", 

51 # Core: FastAPI app factory 

52 "create_fastapi_app", 

53 "create_lifespan", 

54 # Database: DuckDB 

55 "BaseDuckDBManager", 

56 # Clients: gRPC Service Clients 

57 "BaseGrpcClient", 

58 # Constants: HTTP Headers 

59 "HEADER_AUTHORIZATION", 

60 "HEADER_USER_ID", 

61 "HEADER_CORRELATION_ID", 

62 "HEADER_KONG_USER_ID", 

63 "HEADER_KONG_REQUEST_ID", 

64 # Constants: gRPC Metadata 

65 "GRPC_METADATA_USER_ID", 

66 "GRPC_METADATA_AUTHORIZATION", 

67 "GRPC_METADATA_CORRELATION_ID", 

68 "GRPC_METADATA_REQUEST_ID", 

69 # gRPC: Interceptors 

70 "AuthInterceptor", 

71 "LoggingInterceptor", 

72 "MetadataInterceptor", 

73 "ClientAuthInterceptor", 

74] 

75 

76# 지연 로딩 매핑: 심볼명 -> (모듈경로, 속성명) 

77_EXPORTS = { 

78 # Core 

79 "settings": ("mysingle.core", "settings"), 

80 "get_settings": ("mysingle.core", "get_settings"), 

81 "CommonSettings": ("mysingle.core", "CommonSettings"), 

82 "create_fastapi_app": ("mysingle.core", "create_fastapi_app"), 

83 "create_lifespan": ("mysingle.core", "create_lifespan"), 

84 "init_mongo": ("mysingle.core", "init_mongo"), 

85 "get_mongodb_url": ("mysingle.core", "get_mongodb_url"), 

86 "get_database_name": ("mysingle.core", "get_database_name"), 

87 # Logging (consolidated to core) 

88 "get_logger": ("mysingle.core.logging", "get_logger"), 

89 "setup_logging": ("mysingle.core.logging", "setup_logging"), 

90 # Base (consolidated to core) 

91 "BaseDoc": ("mysingle.core.base", "BaseDoc"), 

92 "BaseTimeDoc": ("mysingle.core.base", "BaseTimeDoc"), 

93 "BaseTimeDocWithUserId": ("mysingle.core.base", "BaseTimeDocWithUserId"), 

94 "BaseResponseSchema": ("mysingle.core.base", "BaseResponseSchema"), 

95 # Metrics (consolidated to core) 

96 "MetricsCollector": ("mysingle.core.metrics", "MetricsCollector"), 

97 "get_metrics_collector": ("mysingle.core.metrics", "get_metrics_collector"), 

98 # Health (consolidated to core) 

99 "HealthChecker": ("mysingle.core.health", "HealthChecker"), 

100 "register_health_routes": ("mysingle.core.health", "register_health_routes"), 

101 # Email (consolidated to core) 

102 "EmailService": ("mysingle.core.email", "EmailService"), 

103 "send_email": ("mysingle.core.email", "send_email"), 

104 # Audit (consolidated to core) 

105 "AuditLogger": ("mysingle.core.audit", "AuditLogger"), 

106 "log_audit_event": ("mysingle.core.audit", "log_audit_event"), 

107 # Database 

108 "BaseDuckDBManager": ("mysingle.database", "BaseDuckDBManager"), 

109 # Clients: gRPC 

110 "BaseGrpcClient": ("mysingle.clients", "BaseGrpcClient"), 

111 # Constants: HTTP Headers 

112 "HEADER_AUTHORIZATION": ("mysingle.constants", "HEADER_AUTHORIZATION"), 

113 "HEADER_USER_ID": ("mysingle.constants", "HEADER_USER_ID"), 

114 "HEADER_CORRELATION_ID": ("mysingle.constants", "HEADER_CORRELATION_ID"), 

115 "HEADER_KONG_USER_ID": ("mysingle.constants", "HEADER_KONG_USER_ID"), 

116 "HEADER_KONG_REQUEST_ID": ("mysingle.constants", "HEADER_KONG_REQUEST_ID"), 

117 # Constants: gRPC Metadata 

118 "GRPC_METADATA_USER_ID": ("mysingle.constants", "GRPC_METADATA_USER_ID"), 

119 "GRPC_METADATA_AUTHORIZATION": ( 

120 "mysingle.constants", 

121 "GRPC_METADATA_AUTHORIZATION", 

122 ), 

123 "GRPC_METADATA_CORRELATION_ID": ( 

124 "mysingle.constants", 

125 "GRPC_METADATA_CORRELATION_ID", 

126 ), 

127 "GRPC_METADATA_REQUEST_ID": ("mysingle.constants", "GRPC_METADATA_REQUEST_ID"), 

128 # gRPC Interceptors 

129 "AuthInterceptor": ("mysingle.grpc", "AuthInterceptor"), 

130 "LoggingInterceptor": ("mysingle.grpc", "LoggingInterceptor"), 

131 "MetadataInterceptor": ("mysingle.grpc", "MetadataInterceptor"), 

132 "ClientAuthInterceptor": ("mysingle.grpc", "ClientAuthInterceptor"), 

133} 

134 

135 

136def __getattr__(name: str): 

137 target = _EXPORTS.get(name) 

138 if not target: 

139 raise AttributeError(f"module 'mysingle' has no attribute {name!r}") 

140 module_name, attr_name = target 

141 module = importlib.import_module(module_name) 

142 try: 

143 attr = getattr(module, attr_name) 

144 except AttributeError as e: 

145 raise AttributeError( 

146 f"Failed to resolve attribute {name!r} from {module_name}.{attr_name}" 

147 ) from e 

148 globals()[name] = attr # cache for future lookups 

149 return attr 

150 

151 

152def __dir__(): # pragma: no cover 

153 return sorted(list(globals().keys()) + list(__all__)) 

154 

155 

156if TYPE_CHECKING: # 타입체커를 위한 정적 import (런타임에는 지연 로딩) 

157 from .clients import BaseGrpcClient as BaseGrpcClient 

158 from .constants import GRPC_METADATA_AUTHORIZATION as GRPC_METADATA_AUTHORIZATION 

159 from .constants import GRPC_METADATA_CORRELATION_ID as GRPC_METADATA_CORRELATION_ID 

160 from .constants import GRPC_METADATA_REQUEST_ID as GRPC_METADATA_REQUEST_ID 

161 from .constants import GRPC_METADATA_USER_ID as GRPC_METADATA_USER_ID 

162 from .constants import HEADER_AUTHORIZATION as HEADER_AUTHORIZATION 

163 from .constants import HEADER_CORRELATION_ID as HEADER_CORRELATION_ID 

164 from .constants import HEADER_KONG_REQUEST_ID as HEADER_KONG_REQUEST_ID 

165 from .constants import HEADER_KONG_USER_ID as HEADER_KONG_USER_ID 

166 from .constants import HEADER_USER_ID as HEADER_USER_ID 

167 from .core import ( 

168 CommonSettings as CommonSettings, 

169 ) 

170 from .core import ( 

171 create_fastapi_app as create_fastapi_app, 

172 ) 

173 from .core import ( 

174 create_lifespan as create_lifespan, 

175 ) 

176 from .core import ( 

177 get_database_name as get_database_name, 

178 ) 

179 from .core import ( 

180 get_mongodb_url as get_mongodb_url, 

181 ) 

182 from .core import ( 

183 get_settings as get_settings, 

184 ) 

185 from .core import ( 

186 init_mongo as init_mongo, 

187 ) 

188 from .core import ( 

189 settings as settings, 

190 ) 

191 from .database import BaseDuckDBManager as BaseDuckDBManager 

192 from .grpc import AuthInterceptor as AuthInterceptor 

193 from .grpc import ClientAuthInterceptor as ClientAuthInterceptor 

194 from .grpc import LoggingInterceptor as LoggingInterceptor 

195 from .grpc import MetadataInterceptor as MetadataInterceptor 

196 from .logging import get_logger as get_logger