Skip to content

Commit

Permalink
osbuild: add new testutil.imports module to help test stages
Browse files Browse the repository at this point in the history
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
mvo5 committed Nov 6, 2023
1 parent 1eefb9b commit e9d5b01
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 0 deletions.
3 changes: 3 additions & 0 deletions osbuild/testutil/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
"""
Test related utilities
"""
27 changes: 27 additions & 0 deletions osbuild/testutil/imports.py
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
17 changes: 17 additions & 0 deletions test/mod/test_testutil_imports.py
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"

0 comments on commit e9d5b01

Please sign in to comment.