debian-forge/osbuild/testutil/imports.py
Michael Vogt 061501d4c2 osbuild: add new testutil.imports module to help test stages
This commit adds `osbuild.testutil.imports.import_module_from_path`
that can be used to import arbitrary python source files. This
allows importing files from the stages directory that have a
non python friendly filename like `org.osbuild.kickstart`.
2023-11-07 15:12:08 +01:00

27 lines
982 B
Python

#!/usr/bin/python3
"""
Import related utilities
"""
import importlib
from types import ModuleType
def import_module_from_path(fullname, path: str) -> ModuleType:
"""import_module_from_path imports the given path as a python module
This helper is useful when importing things that are not in the
import path or have invalid python import filenames, e.g. all
filenames in the stages/ dir of osbuild.
Keyword arguments:
fullname -- The absolute name of the module (can be arbitrary, used on in ModuleSpec.name)
path -- The full path to the python file
"""
loader = importlib.machinery.SourceFileLoader(fullname, path)
spec = importlib.util.spec_from_loader(loader.name, loader)
if spec is None:
# mypy warns that spec might be None so handle it
raise ImportError(f"cannot import {fullname} from {path}, got None as the spec")
mod = importlib.util.module_from_spec(spec)
loader.exec_module(mod)
return mod