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
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-02 00:58 +0900
1"""mysingle package public API (lazy exports)
3이 패키지의 루트에서는 무거운 서브모듈을 즉시 import 하지 않고,
4요청 시점에 지연 로딩하여 순환 참조와 초기화 비용을 줄입니다.
6외부 사용자는 기존과 동일하게 다음과 같이 사용할 수 있습니다:
8 from mysingle import get_logger, BaseDuckDBManager, create_fastapi_app
10내부적으로는 PEP 562의 __getattr__을 활용해 필요한 기호만 지연 import 합니다.
11"""
13from __future__ import annotations
15import importlib
16from typing import TYPE_CHECKING
18__version__ = "2.0.0-alpha"
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]
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}
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
152def __dir__(): # pragma: no cover
153 return sorted(list(globals().keys()) + list(__all__))
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