idea143-crisisguard-federat.../crisisguard/__init__.py

46 lines
1.5 KiB
Python

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('_')])