46 lines
1.5 KiB
Python
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('_')])
|