Coverage for /home/runner/work/bijux-cli/bijux-cli/src/bijux_cli/services/__init__.py: 100%
52 statements
« prev ^ index » next coverage.py v7.10.4, created at 2025-08-19 23:36 +0000
« prev ^ index » next coverage.py v7.10.4, created at 2025-08-19 23:36 +0000
1# SPDX-License-Identifier: MIT
2# Copyright © 2025 Bijan Mousavi
4"""Registers the default services for the Bijux CLI application.
6This module serves as the primary composition root for the application's
7service layer. It provides a single function, `register_default_services`,
8which is responsible for binding all core service protocols to their
9concrete implementations within the Dependency Injection (DI) container.
11This centralized registration is a key part of the application's Inversion of
12Control (IoC) architecture, allowing components to be easily swapped or mocked
13for testing.
14"""
16from __future__ import annotations
18from typing import TYPE_CHECKING
20from bijux_cli.contracts import (
21 AuditProtocol,
22 ConfigProtocol,
23 ContextProtocol,
24 DocsProtocol,
25 DoctorProtocol,
26 EmitterProtocol,
27 HistoryProtocol,
28 MemoryProtocol,
29 ObservabilityProtocol,
30 ProcessPoolProtocol,
31 RegistryProtocol,
32 RetryPolicyProtocol,
33 SerializerProtocol,
34 TelemetryProtocol,
35)
36from bijux_cli.core.enums import OutputFormat
38if TYPE_CHECKING:
39 from bijux_cli.core.di import DIContainer
40 from bijux_cli.core.enums import OutputFormat
43def register_default_services(
44 di: DIContainer, debug: bool, output_format: OutputFormat, quiet: bool
45) -> None:
46 """Registers all default service implementations with the DI container.
48 This function populates the container with lazy-loading factories for each
49 core service the application requires, from configuration and logging to
50 plugin management and command history.
52 Args:
53 di (DIContainer): The dependency injection container instance.
54 debug (bool): If True, services will be configured for debug mode.
55 output_format (OutputFormat): The default output format for services
56 like the emitter and serializer.
57 quiet (bool): If True, services will be configured to suppress output.
59 Returns:
60 None:
61 """
62 import bijux_cli.core.context
63 import bijux_cli.infra.emitter
64 import bijux_cli.infra.observability
65 import bijux_cli.infra.process
66 import bijux_cli.infra.retry
67 import bijux_cli.infra.serializer
68 import bijux_cli.infra.telemetry
69 import bijux_cli.services.audit
70 import bijux_cli.services.config
71 import bijux_cli.services.docs
72 import bijux_cli.services.doctor
73 import bijux_cli.services.history
74 import bijux_cli.services.memory
75 import bijux_cli.services.plugins.registry
77 obs_service = bijux_cli.infra.observability.Observability(debug=debug)
79 di.register(bijux_cli.infra.observability.Observability, lambda: obs_service)
80 di.register(
81 ObservabilityProtocol,
82 lambda: di.resolve(bijux_cli.infra.observability.Observability),
83 )
85 di.register(
86 bijux_cli.infra.telemetry.LoggingTelemetry,
87 lambda: bijux_cli.infra.telemetry.LoggingTelemetry(
88 observability=di.resolve(bijux_cli.infra.observability.Observability)
89 ),
90 )
91 di.register(
92 TelemetryProtocol,
93 lambda: di.resolve(bijux_cli.infra.telemetry.LoggingTelemetry),
94 )
96 di.register(
97 bijux_cli.infra.emitter.Emitter,
98 lambda: bijux_cli.infra.emitter.Emitter(
99 telemetry=di.resolve(bijux_cli.infra.telemetry.LoggingTelemetry),
100 format=output_format,
101 debug=debug,
102 quiet=quiet,
103 ),
104 )
105 di.register(EmitterProtocol, lambda: di.resolve(bijux_cli.infra.emitter.Emitter))
107 di.register(
108 bijux_cli.infra.serializer.OrjsonSerializer,
109 lambda: bijux_cli.infra.serializer.OrjsonSerializer(
110 telemetry=di.resolve(bijux_cli.infra.telemetry.LoggingTelemetry)
111 ),
112 )
113 di.register(
114 bijux_cli.infra.serializer.PyYAMLSerializer,
115 lambda: bijux_cli.infra.serializer.PyYAMLSerializer(
116 telemetry=di.resolve(bijux_cli.infra.telemetry.LoggingTelemetry)
117 ),
118 )
119 di.register(
120 SerializerProtocol,
121 lambda: (
122 di.resolve(bijux_cli.infra.serializer.OrjsonSerializer)
123 if output_format is OutputFormat.JSON
124 else di.resolve(bijux_cli.infra.serializer.PyYAMLSerializer)
125 ),
126 )
128 di.register(
129 bijux_cli.infra.process.ProcessPool,
130 lambda: bijux_cli.infra.process.ProcessPool(
131 observability=di.resolve(bijux_cli.infra.observability.Observability),
132 telemetry=di.resolve(bijux_cli.infra.telemetry.LoggingTelemetry),
133 ),
134 )
135 di.register(
136 ProcessPoolProtocol, lambda: di.resolve(bijux_cli.infra.process.ProcessPool)
137 )
139 di.register(
140 bijux_cli.infra.retry.TimeoutRetryPolicy,
141 lambda: bijux_cli.infra.retry.TimeoutRetryPolicy(
142 telemetry=di.resolve(bijux_cli.infra.telemetry.LoggingTelemetry)
143 ),
144 )
145 di.register(
146 bijux_cli.infra.retry.ExponentialBackoffRetryPolicy,
147 lambda: bijux_cli.infra.retry.ExponentialBackoffRetryPolicy(
148 telemetry=di.resolve(bijux_cli.infra.telemetry.LoggingTelemetry)
149 ),
150 )
151 di.register(
152 RetryPolicyProtocol,
153 lambda: di.resolve(bijux_cli.infra.retry.TimeoutRetryPolicy),
154 )
156 di.register(
157 bijux_cli.core.context.Context,
158 lambda: bijux_cli.core.context.Context(di),
159 )
160 di.register(ContextProtocol, lambda: di.resolve(bijux_cli.core.context.Context))
162 di.register(
163 bijux_cli.services.config.Config,
164 lambda: bijux_cli.services.config.Config(di),
165 )
166 di.register(ConfigProtocol, lambda: di.resolve(bijux_cli.services.config.Config))
168 di.register(
169 bijux_cli.services.plugins.registry.Registry,
170 lambda: bijux_cli.services.plugins.registry.Registry(
171 di.resolve(bijux_cli.infra.telemetry.LoggingTelemetry)
172 ),
173 )
174 di.register(
175 RegistryProtocol,
176 lambda: di.resolve(bijux_cli.services.plugins.registry.Registry),
177 )
179 di.register(
180 bijux_cli.services.audit.DryRunAudit,
181 lambda: bijux_cli.services.audit.DryRunAudit(
182 di.resolve(bijux_cli.infra.observability.Observability),
183 di.resolve(bijux_cli.infra.telemetry.LoggingTelemetry),
184 ),
185 )
186 di.register(
187 bijux_cli.services.audit.RealAudit,
188 lambda: bijux_cli.services.audit.RealAudit(
189 di.resolve(bijux_cli.infra.observability.Observability),
190 di.resolve(bijux_cli.infra.telemetry.LoggingTelemetry),
191 ),
192 )
193 di.register(
194 AuditProtocol,
195 lambda: bijux_cli.services.audit.get_audit_service(
196 observability=di.resolve(bijux_cli.infra.observability.Observability),
197 telemetry=di.resolve(bijux_cli.infra.telemetry.LoggingTelemetry),
198 dry_run=False,
199 ),
200 )
202 di.register(
203 bijux_cli.services.docs.Docs,
204 lambda: bijux_cli.services.docs.Docs(
205 observability=di.resolve(bijux_cli.infra.observability.Observability),
206 telemetry=di.resolve(bijux_cli.infra.telemetry.LoggingTelemetry),
207 ),
208 )
209 di.register(DocsProtocol, lambda: di.resolve(bijux_cli.services.docs.Docs))
211 di.register(
212 bijux_cli.services.doctor.Doctor,
213 lambda: bijux_cli.services.doctor.Doctor(),
214 )
215 di.register(DoctorProtocol, lambda: di.resolve(bijux_cli.services.doctor.Doctor))
217 di.register(
218 bijux_cli.services.history.History,
219 lambda: bijux_cli.services.history.History(
220 telemetry=di.resolve(bijux_cli.infra.telemetry.LoggingTelemetry),
221 observability=di.resolve(bijux_cli.infra.observability.Observability),
222 ),
223 )
224 di.register(HistoryProtocol, lambda: di.resolve(bijux_cli.services.history.History))
226 di.register(
227 bijux_cli.services.memory.Memory,
228 lambda: bijux_cli.services.memory.Memory(),
229 )
230 di.register(MemoryProtocol, lambda: di.resolve(bijux_cli.services.memory.Memory))
233__all__ = ["register_default_services"]