Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions src/miniflask/miniflask.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,20 +177,26 @@ def import_module(self, module_name):
return import_module(module_spec["importname"])

# imports across filesystem
# the random id (_instance_id) ensures sys.modules does not cache different miniflask instances
# (first we need to load the parent module, if available)
parent_module_name, rest = "miniflask." + self._instance_id + "." + module_spec["base_id"], ""
parent_module_name, rest = "miniflask." + self._instance_id + "." + path.basename(path.abspath(module_spec["importpath"])), ""
spec = ImportPathFinder().find_spec(parent_module_name, [path.dirname(importpath)])
if spec is None:
if rest:
raise ValueError("Could not import parent Module named '%s'. This is needed for module named '%s' (defined in '%s')." % (parent_module_name, module_spec["id"], module_spec["importpath"]))
raise ValueError("Module named '%s' (defined in '%s') could not be imported." % (module_spec["id"], module_spec["importpath"]))
if spec.loader is None:
raise ValueError("Could not import parent Module named '%s'. This is needed for module named '%s' (defined in '%s'). Did you maybe miss to define a `__init__.py` file in any subfolder?" % (parent_module_name, module_spec["id"], module_spec["importpath"]))

# set parent module name to identifier given by dict (base_id)
parent_module_name = "miniflask." + self._instance_id + "." + module_spec["base_id"]
spec.loader.name = parent_module_name

# actually load the parent module
spec.loader.load_module()

# ensure sys.modules does not cache different miniflask instances
package_prefix = parent_module_name + "."
return import_module(package_prefix + module_spec["importname"])
# now load the requested module
return import_module(parent_module_name + "." + module_spec["importname"])

# module event
def getModuleEvents(self, module_id, mf=None):
Expand Down
1 change: 1 addition & 0 deletions tests/module_loading/modules/modules_b
1 change: 1 addition & 0 deletions tests/module_loading/modules_b
79 changes: 79 additions & 0 deletions tests/module_loading/test_basic_import_dict.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
from pathlib import Path
import pytest
import miniflask # noqa: E402


def init_mf():
return miniflask.init(module_dirs={"modules": str(Path(__file__).parent / "modules_b")}, debug=True)


def test_shortid():
mf = init_mf()
mf.run(argv=[], modules=["module1"])
assert "modules.parentdir.module1" in mf.modules_loaded
assert len(mf.modules_loaded) == 1


def test_partial_id():
mf = init_mf()
mf.run(argv=[], modules=["modules.module1"])
assert "modules.parentdir.module1" in mf.modules_loaded
assert len(mf.modules_loaded) == 1


def test_partial_id_2():
mf = init_mf()
mf.run(argv=[], modules=["parentdir.module1"])
assert "modules.parentdir.module1" in mf.modules_loaded
assert len(mf.modules_loaded) == 1


def test_full_id():
mf = init_mf()
mf.run(argv=[], modules=["modules.parentdir.module1"])
assert "modules.parentdir.module1" in mf.modules_loaded
assert len(mf.modules_loaded) == 1


def test_shortid_error():
mf = init_mf()
with pytest.raises(ValueError) as excinfo:
mf.run(argv=[], modules=["module2"])
assert "is not unique" in str(excinfo.value)
assert len(mf.modules_loaded) == 0


def test_partial_id_error():
mf = init_mf()
with pytest.raises(ValueError) as excinfo:
mf.run(argv=[], modules=["modules.module2"])
assert "is not unique" in str(excinfo.value)
assert len(mf.modules_loaded) == 0


def test_partial_id_3():
mf = init_mf()
mf.run(argv=[], modules=["modules.otherdir.module2"])
assert "modules.otherdir.module2" in mf.modules_loaded
assert len(mf.modules_loaded) == 1


def test_partial_id_4():
mf = init_mf()
mf.run(argv=[], modules=["modules.otherdir.module2"])
assert "modules.otherdir.module2" in mf.modules_loaded
assert len(mf.modules_loaded) == 1


def test_partial_id_5():
mf = init_mf()
mf.run(argv=[], modules=["parentdir.module2"])
assert "modules.parentdir.module2" in mf.modules_loaded
assert len(mf.modules_loaded) == 1


def test_partial_id_6():
mf = init_mf()
mf.run(argv=[], modules=["parentdir.module2"])
assert "modules.parentdir.module2" in mf.modules_loaded
assert len(mf.modules_loaded) == 1