Coverage for src / ezqt_app / services / bootstrap / __init__.py: 65.22%
23 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-06 13:12 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-06 13:12 +0000
1# ///////////////////////////////////////////////////////////////
2# SERVICES.BOOTSTRAP - One-shot application boot sequence
3# Project: ezqt_app
4# ///////////////////////////////////////////////////////////////
6"""Bootstrap services — system configuration and initialization sequence."""
8from __future__ import annotations
10# ///////////////////////////////////////////////////////////////
11# IMPORTS
12# ///////////////////////////////////////////////////////////////
13# Standard library imports
14from pathlib import Path
15from typing import Any
17# Local imports
18from .._registry import ServiceRegistry
19from .contracts import InitOptions, InitStep, OverwritePolicy, StepStatus
20from .exceptions import BootstrapError, InitAlreadyInitializedError, InitStepError
21from .init_service import InitService
22from .initializer import Initializer
23from .sequence import InitializationSequence
24from .startup_config import StartupConfig
27# ///////////////////////////////////////////////////////////////
28# PUBLIC HELPERS
29# ///////////////////////////////////////////////////////////////
30def init(
31 mk_theme: bool = True,
32 verbose: bool = True,
33 project_root: str | None = None,
34 bin_path: str | None = None,
35 overwrite_policy: OverwritePolicy = OverwritePolicy.ASK,
36 mk_config: bool = True,
37 mk_translations: bool = True,
38 build_resources: bool = True,
39 generate_main: bool = False,
40) -> dict[str, Any]:
41 """Initialize the EzQt_App application (boot sequence).
43 Parameters
44 ----------
45 mk_theme:
46 Generate theme file (default: ``True``).
47 verbose:
48 Show progress output (default: ``True``).
50 Returns
51 -------
52 dict
53 Boot sequence summary.
54 """
55 options = InitOptions(
56 project_root=None if project_root is None else Path(project_root),
57 bin_path=None if bin_path is None else Path(bin_path),
58 mk_theme=mk_theme,
59 mk_config=mk_config,
60 mk_translations=mk_translations,
61 build_resources=build_resources,
62 generate_main=generate_main,
63 verbose=verbose,
64 overwrite_policy=overwrite_policy,
65 )
66 return ServiceRegistry.get(InitService, InitService).run(options).to_dict()
69def setup_project(base_path: str | None = None) -> bool:
70 """Scaffold a new EzQt_App project directory.
72 Parameters
73 ----------
74 base_path:
75 Target directory (defaults to current working directory).
76 """
77 from pathlib import Path
79 from ..application.file_service import FileService
81 return FileService(Path(base_path) if base_path else None).setup_project()
84def generate_assets() -> bool:
85 """Generate all required asset files."""
86 from ..application.file_service import FileService
88 return FileService().generate_all_assets()
91def configure_startup() -> None:
92 """Run system-level startup configuration (encoding, locale, env)."""
93 StartupConfig().configure()
96# ///////////////////////////////////////////////////////////////
97# PUBLIC API
98# ///////////////////////////////////////////////////////////////
99__all__ = [
100 "Initializer",
101 "InitOptions",
102 "OverwritePolicy",
103 "InitService",
104 "StartupConfig",
105 "InitializationSequence",
106 "InitStep",
107 "StepStatus",
108 "BootstrapError",
109 "InitAlreadyInitializedError",
110 "InitStepError",
111 "init",
112 "setup_project",
113 "generate_assets",
114 "configure_startup",
115]