Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Parent autoload #56

Merged
merged 5 commits into from
Jan 3, 2021
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
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
tests_deact
.idea
# Byte-compiled / optimized / DLL files
__pycache__/
Expand Down
35 changes: 29 additions & 6 deletions src/miniflask/miniflask.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,18 @@ def print_heading(self, *args, color=fg('blue'), margin=8):
print(color + attr('bold') + line + attr('reset'))

def print_recently_loaded(self, prepend="", loading_text=highlight_loading):
last = ""
last_formatted = ""
for i, mod in enumerate(self._recently_loaded):
module_id = mod.miniflask_obj.module_id_initial
module_id = module_id_formatted = module_id = mod.miniflask_obj.module_id_initial

# if previously printed parent, make the module_id shorter
if module_id.startswith(last):
module_id_formatted = last_formatted + module_id[len(last):]

is_last = i == len(self._recently_loaded) - 1
has_children = len(mod.miniflask_obj._recently_loaded) > 0
part_of_next = i < len(self._recently_loaded) - 1 and self._recently_loaded[i + 1].miniflask_obj.module_id_initial.startswith(module_id)
if is_last:
tree_symb = " " # noqa: E221
tree_symb_current = "╰── " # "└── "
Expand All @@ -114,12 +122,15 @@ def print_recently_loaded(self, prepend="", loading_text=highlight_loading):
else:
tree_symb = "│ " # noqa: E221
tree_symb_current = "├── " # "├── "
if prepend == "":
print(loading_text(module_id))
else:
print(prepend + tree_symb_current + loading_text(module_id))
if not part_of_next:
if prepend == "":
print(loading_text(module_id_formatted))
else:
print(prepend + tree_symb_current + loading_text(module_id_formatted))
if len(mod.miniflask_obj._recently_loaded) > 0:
mod.miniflask_obj.print_recently_loaded(prepend + tree_symb, loading_text)
last = module_id
last_formatted = loading_text(module_id_formatted) if part_of_next else module_id

# ==================== #
# module introspection #
Expand Down Expand Up @@ -349,6 +360,16 @@ def load(self, module_name, verbose=True, auto_query=True, loading_text=highligh
mod.miniflask_obj = miniflask_wrapper(module_name, self)
mod.miniflask_obj.bind_events = bind_events

# first load all parents
# (starting with root parent, specializing with every step)
if not hasattr(mod, 'register_parents') or mod.register_parents:
module_path = module_name.split(".")
for depth in range(1, len(module_path)):
parent_module = ".".join(module_path[:depth])
if parent_module in self.modules_avail and parent_module not in self.modules_loaded:
parent_as_id = None if as_id is None else ".".join(as_id.split(".")[:-1])
self.load(parent_module, verbose=False, auto_query=False, loading_text=loading_text, as_id=parent_as_id, bind_events=bind_events)

# remember loaded modules
self.modules_loaded[module_name] = mod
self._recently_loaded.append(mod)
Expand Down Expand Up @@ -879,7 +900,9 @@ def load(self, module_name, as_id=None, auto_query=True, **kwargs):
auto_query = not was_relative

# call load (but ensure no querying is made if relative imports were given)
super().load(module_name, auto_query=auto_query, verbose=False, as_id=as_id, **kwargs)
if "verbose" in kwargs:
del kwargs["verbose"]
super().load(module_name, verbose=False, auto_query=auto_query, as_id=as_id, **kwargs)

# overwrite state defaults
def register_event(self, name, fn, **kwargs):
Expand Down
1 change: 1 addition & 0 deletions tests/test_dynamic_state/miniflask
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@

def register(mf):
mf.register_event("main", lambda: print("tests"))
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@

def register(mf):
mf.register_event("main", lambda: print("tests"))
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@


def register(mf):
mf.register_event("main", lambda: print("tests"))
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@


def register(mf):
mf.register_event("main", lambda: print("tests"))


register_parents = False
48 changes: 48 additions & 0 deletions tests/test_import/test_parent_autoloading.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
from pathlib import Path
import miniflask # noqa: E402


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


def test_parent_autoload_level1():
mf = init_mf()
mf.run(modules=["submodule"])
assert "modules.parentdir.module3.submodule" in mf.modules_loaded
assert "modules.parentdir.module3" in mf.modules_loaded
assert len(mf.modules_loaded) == 2


def test_parent_autoload_level1_two_children():
mf = init_mf()
mf.load("submodule2")
mf.run(modules=["submodule"])
assert "modules.parentdir.module3.submodule2" in mf.modules_loaded
assert "modules.parentdir.module3.submodule" in mf.modules_loaded
assert "modules.parentdir.module3" in mf.modules_loaded
assert len(mf.modules_loaded) == 3


def test_parent_autoload_skip():
mf = init_mf()
mf.run(modules=["submodule_without_autoload"])
assert "modules.parentdir.module3.submodule_without_autoload" in mf.modules_loaded
assert len(mf.modules_loaded) == 1


def test_parent_autoload_level2():
mf = init_mf()
mf.run(modules=["subsubmodule"])
assert "modules.parentdir.module3.submodule.subsubmodule" in mf.modules_loaded
assert "modules.parentdir.module3.submodule" in mf.modules_loaded
assert "modules.parentdir.module3" in mf.modules_loaded
assert len(mf.modules_loaded) == 3


def test_parent_autoload_level2_with_folder_in_between():
mf = init_mf()
mf.run(modules=["submodule_with_folder_in_between"])
assert "modules.parentdir.module3.submodule_dir.submodule_with_folder_in_between" in mf.modules_loaded
assert "modules.parentdir.module3" in mf.modules_loaded
assert len(mf.modules_loaded) == 3
3 changes: 2 additions & 1 deletion tests/test_import/test_relative_import.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ def test_passive_submodule_import():
def test_active_submodule_import():
mf = init_mf()
mf.run(argv=[], modules=["submodule"])
assert "modules.parentdir.module3" in mf.modules_loaded
assert "modules.parentdir.module3.submodule" in mf.modules_loaded
assert len(mf.modules_loaded) == 1
assert len(mf.modules_loaded) == 2


def test_relative_import():
Expand Down