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

1# /////////////////////////////////////////////////////////////// 

2# SERVICES.BOOTSTRAP - One-shot application boot sequence 

3# Project: ezqt_app 

4# /////////////////////////////////////////////////////////////// 

5 

6"""Bootstrap services — system configuration and initialization sequence.""" 

7 

8from __future__ import annotations 

9 

10# /////////////////////////////////////////////////////////////// 

11# IMPORTS 

12# /////////////////////////////////////////////////////////////// 

13# Standard library imports 

14from pathlib import Path 

15from typing import Any 

16 

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 

25 

26 

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). 

42 

43 Parameters 

44 ---------- 

45 mk_theme: 

46 Generate theme file (default: ``True``). 

47 verbose: 

48 Show progress output (default: ``True``). 

49 

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() 

67 

68 

69def setup_project(base_path: str | None = None) -> bool: 

70 """Scaffold a new EzQt_App project directory. 

71 

72 Parameters 

73 ---------- 

74 base_path: 

75 Target directory (defaults to current working directory). 

76 """ 

77 from pathlib import Path 

78 

79 from ..application.file_service import FileService 

80 

81 return FileService(Path(base_path) if base_path else None).setup_project() 

82 

83 

84def generate_assets() -> bool: 

85 """Generate all required asset files.""" 

86 from ..application.file_service import FileService 

87 

88 return FileService().generate_all_assets() 

89 

90 

91def configure_startup() -> None: 

92 """Run system-level startup configuration (encoding, locale, env).""" 

93 StartupConfig().configure() 

94 

95 

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]