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`.
27 lines
982 B
Python
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
|