import importlib.util import os import sys # Dynamically load the real modules from src/crisisguard to keep packaging simple for tests ROOT_DIR = os.path.dirname(__file__) SRC_MODULES = { 'core': os.path.join(ROOT_DIR, '..', 'src', 'crisisguard', 'core.py'), 'registry': os.path.join(ROOT_DIR, '..', 'src', 'crisisguard', 'registry.py'), } def _load_module(name, path): spec = importlib.util.spec_from_file_location(name, path) mod = importlib.util.module_from_spec(spec) # Register in sys.modules before executing to help module-internal references sys.modules[name] = mod spec.loader.exec_module(mod) # type: ignore return mod _loaded = {} for _name, _path in SRC_MODULES.items(): if os.path.exists(_path): mod = _load_module(f"crisisguard.{_name}", _path) _loaded[_name] = mod # Expose as a real submodule for 'from crisisguard.core import ...' imports mod_name = f"crisisguard.{_name}" sys.modules[mod_name] = mod # Expose public API by re-exporting symbols if 'core' in _loaded: for _k in dir(_loaded['core']): if _k.startswith('_'): continue globals()[_k] = getattr(_loaded['core'], _k) if 'registry' in _loaded: for _k in dir(_loaded['registry']): if _k.startswith('_'): continue globals()[_k] = getattr(_loaded['registry'], _k) __all__ = [] for _mod in ('core', 'registry'): if _mod in _loaded: __all__.extend([name for name in dir(_loaded[_mod]) if not name.startswith('_')])