80 lines
3.3 KiB
Python
Executable File
80 lines
3.3 KiB
Python
Executable File
# [DEF:Dependencies:Module]
|
|
# @SEMANTICS: dependency, injection, singleton, factory
|
|
# @PURPOSE: Manages the creation and provision of shared application dependencies, such as the PluginLoader and TaskManager, to avoid circular imports.
|
|
# @LAYER: Core
|
|
# @RELATION: Used by the main app and API routers to get access to shared instances.
|
|
|
|
from pathlib import Path
|
|
from .core.plugin_loader import PluginLoader
|
|
from .core.task_manager import TaskManager
|
|
from .core.config_manager import ConfigManager
|
|
from .core.scheduler import SchedulerService
|
|
from .core.database import init_db
|
|
from .core.logger import logger, belief_scope
|
|
|
|
# Initialize singletons
|
|
# Use absolute path relative to this file to ensure plugins are found regardless of CWD
|
|
project_root = Path(__file__).parent.parent.parent
|
|
config_path = project_root / "config.json"
|
|
config_manager = ConfigManager(config_path=str(config_path))
|
|
|
|
# Initialize database before any other services that might use it
|
|
init_db()
|
|
|
|
# [DEF:get_config_manager:Function]
|
|
# @PURPOSE: Dependency injector for the ConfigManager.
|
|
# @PRE: Global config_manager must be initialized.
|
|
# @POST: Returns shared ConfigManager instance.
|
|
# @RETURN: ConfigManager - The shared config manager instance.
|
|
def get_config_manager() -> ConfigManager:
|
|
"""Dependency injector for the ConfigManager."""
|
|
with belief_scope("get_config_manager"):
|
|
return config_manager
|
|
# [/DEF:get_config_manager:Function]
|
|
|
|
plugin_dir = Path(__file__).parent / "plugins"
|
|
|
|
plugin_loader = PluginLoader(plugin_dir=str(plugin_dir))
|
|
logger.info(f"PluginLoader initialized with directory: {plugin_dir}")
|
|
logger.info(f"Available plugins: {[config.name for config in plugin_loader.get_all_plugin_configs()]}")
|
|
|
|
task_manager = TaskManager(plugin_loader)
|
|
logger.info("TaskManager initialized")
|
|
|
|
scheduler_service = SchedulerService(task_manager, config_manager)
|
|
logger.info("SchedulerService initialized")
|
|
|
|
# [DEF:get_plugin_loader:Function]
|
|
# @PURPOSE: Dependency injector for the PluginLoader.
|
|
# @PRE: Global plugin_loader must be initialized.
|
|
# @POST: Returns shared PluginLoader instance.
|
|
# @RETURN: PluginLoader - The shared plugin loader instance.
|
|
def get_plugin_loader() -> PluginLoader:
|
|
"""Dependency injector for the PluginLoader."""
|
|
with belief_scope("get_plugin_loader"):
|
|
return plugin_loader
|
|
# [/DEF:get_plugin_loader:Function]
|
|
|
|
# [DEF:get_task_manager:Function]
|
|
# @PURPOSE: Dependency injector for the TaskManager.
|
|
# @PRE: Global task_manager must be initialized.
|
|
# @POST: Returns shared TaskManager instance.
|
|
# @RETURN: TaskManager - The shared task manager instance.
|
|
def get_task_manager() -> TaskManager:
|
|
"""Dependency injector for the TaskManager."""
|
|
with belief_scope("get_task_manager"):
|
|
return task_manager
|
|
# [/DEF:get_task_manager:Function]
|
|
|
|
# [DEF:get_scheduler_service:Function]
|
|
# @PURPOSE: Dependency injector for the SchedulerService.
|
|
# @PRE: Global scheduler_service must be initialized.
|
|
# @POST: Returns shared SchedulerService instance.
|
|
# @RETURN: SchedulerService - The shared scheduler service instance.
|
|
def get_scheduler_service() -> SchedulerService:
|
|
"""Dependency injector for the SchedulerService."""
|
|
with belief_scope("get_scheduler_service"):
|
|
return scheduler_service
|
|
# [/DEF:get_scheduler_service:Function]
|
|
|
|
# [/DEF:Dependencies:Module] |