import logging from pathlib import Path from pprint import pformat from dependency_injector import containers from dependency_injector import providers from serial import Serial from .util import log_function_call DEFAULTS_DIR = Path(__file__).parent / "defaults" CONFIG_FILE = DEFAULTS_DIR / "config.yml" _logger = logging.getLogger(__name__) class Container(containers.DeclarativeContainer): config = providers.Configuration("config") serial = providers.Factory( Serial, port=config.device_id[config.role].required(), baudrate=config.baudrate.required(), ) @log_function_call def get_initialize_container() -> Container: logger = _logger.getChild("initialize_container") logger.debug("initialize container...") container = Container() logger.debug(f"initialize container with defaults from config file: {CONFIG_FILE}") container.config.from_yaml(CONFIG_FILE, required=True) current_dir = Path.cwd() is_searching = True while is_searching: config_file = current_dir / "monsun_config.yml" if config_file.is_file(): logger.debug(f"initialize container from user config file: {config_file}") container.config.from_yaml(config_file, required=True) break else: current_dir = current_dir.parent if str(current_dir) == current_dir.anchor: is_searching = False config_file = Path("/var/config/monsun_config.yml") if config_file.is_file(): logger.debug(f"initialize container from config file: {config_file}") container.config.from_yaml(config_file, required=True) logger.debug(f"container config:\n{pformat(container.config())}") return container