forked from osbuild/osbuild
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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`.
- Loading branch information
Showing
3 changed files
with
47 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
""" | ||
Test related utilities | ||
""" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
#!/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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
# | ||
# Tests for the 'osbuild.util.testutil' module. | ||
# | ||
import os.path | ||
import tempfile | ||
|
||
import pytest | ||
|
||
from osbuild.testutil.imports import import_module_from_path | ||
|
||
|
||
canary = "import-went-okay" | ||
|
||
|
||
def test_import_module_from_path_happy(): | ||
mod = import_module_from_path("myself", __file__) | ||
assert mod.canary == "import-went-okay" |