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
25 changes: 5 additions & 20 deletions src/miniflask/miniflask.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
from os import path, listdir, linesep, get_terminal_size
from importlib import import_module
from importlib.machinery import PathFinder as ImportPathFinder
from importlib.util import find_spec
from enum import Enum, EnumMeta
from argparse import ArgumentParser, REMAINDER as ARGPARSE_REMAINDER
from typing import List
Expand Down Expand Up @@ -179,33 +178,19 @@ def import_module(self, module_name):

# imports across filesystem
# (first we need to load the parent module, if available)
if "." in module_spec["importname"]:
parent_module_name, rest = module_spec["importname"].split(".", 1)
else:
parent_module_name, rest = module_spec["importname"], ""
spec = ImportPathFinder().find_spec(parent_module_name, [importpath])
parent_module_name, rest = "miniflask." + self._instance_id + "." + module_spec["base_id"], ""
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"]))
spec.loader.load_module()

# ensure sys.modules does not cache different miniflask instances
package_prefix = "miniflask." + self._instance_id + "."
spec.loader.name = package_prefix + spec.loader.name

# import parent module (repository base)
parent_module = spec.loader.load_module()

# if importing top-level package in repository, we are done
if not rest:
return parent_module

spec = find_spec(package_prefix + module_spec["importname"], package=parent_module)
if spec is None or spec.loader is None:
raise ValueError("Module named '%s' (defined in '%s') could not be imported." % (module_spec["id"], module_spec["importpath"]))
return spec.loader.load_module()
package_prefix = parent_module_name + "."
return import_module(package_prefix + module_spec["importname"])

# module event
def getModuleEvents(self, module_id, mf=None):
Expand Down
1 change: 1 addition & 0 deletions src/miniflask/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ def getModulesAvail(module_dirs, f=None):

# module found
f[module_name_id] = {
'base_id': base_module_name,
'id': module_name_id,
'lowpriority': path.exists(path.join(dirpath, ".lowpriority")),
'importname': local_import_name,
Expand Down
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file added tests/state/enums/__init__.py
Empty file.
Empty file.
Empty file.
12 changes: 12 additions & 0 deletions tests/state/enums/modules/module2/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from ..module1 import SIZE # noqa: E0401


def main(state, event):
del event # unused
if state["size"] not in list(SIZE):
raise ValueError("Enums do not match.")


def register(mf):
mf.load("module1")
mf.register_event('main', main, unique=False)
22 changes: 16 additions & 6 deletions tests/state/enums/test_enums.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
from pathlib import Path

import miniflask # noqa: E402

mf = miniflask.init(
module_dirs=str(Path(__file__).parent / "modules"),
debug=True
)


def test_enum():
mf = miniflask.init(
module_dirs=str(Path(__file__).parent / "modules"),
debug=True
)
mf.run(
modules=["module1"],
argv=["--module1.sizerequired", "SMALL",
"--module1.sizelist", "MEDIUM", "SMALL"]
)


def test_enum_relative_import():
mf = miniflask.init(
module_dirs=str(Path(__file__).parent / "modules"),
debug=True
)
mf.run(
modules=["module2"],
argv=["--module1.sizerequired", "SMALL",
"--module1.sizelist", "MEDIUM", "SMALL"]
)
Empty file.
Empty file.