From c0a07ad8d33559927dcadb49b0a21c81f9efbd96 Mon Sep 17 00:00:00 2001 From: David Hartmann Date: Tue, 29 Dec 2020 11:55:44 +0100 Subject: [PATCH 1/5] tests: replaced pip install with link to current version --- .gitignore | 1 - tests/test_dynamic_state/miniflask | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) create mode 120000 tests/test_dynamic_state/miniflask diff --git a/.gitignore b/.gitignore index a68945cb..0e802c5b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -tests_deact .idea # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/tests/test_dynamic_state/miniflask b/tests/test_dynamic_state/miniflask new file mode 120000 index 00000000..f3e4f4fd --- /dev/null +++ b/tests/test_dynamic_state/miniflask @@ -0,0 +1 @@ +../../src/miniflask \ No newline at end of file From c09cf8c020fa73cc0d2deab9d59b4171bdc8bee0 Mon Sep 17 00:00:00 2001 From: David Hartmann Date: Tue, 29 Dec 2020 13:40:28 +0100 Subject: [PATCH 2/5] tests: fixed relative import test --- tests/test_import/test_relative_import.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_import/test_relative_import.py b/tests/test_import/test_relative_import.py index 349bf6cf..b607d61b 100644 --- a/tests/test_import/test_relative_import.py +++ b/tests/test_import/test_relative_import.py @@ -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(): From 1336938b68500a458f633da46237014d5a84b161 Mon Sep 17 00:00:00 2001 From: David Hartmann Date: Mon, 28 Dec 2020 11:05:58 +0100 Subject: [PATCH 3/5] tests: added parent autoload tests --- .../module3/submodule/subsubmodule/.module | 0 .../submodule/subsubmodule/__init__.py | 3 ++ .../parentdir/module3/submodule2/.module | 0 .../parentdir/module3/submodule2/__init__.py | 3 ++ .../submodule_with_folder_in_between/.module | 0 .../__init__.py | 4 ++ .../submodule_without_autoload/.module | 0 .../submodule_without_autoload/__init__.py | 7 +++ tests/test_import/test_parent_autoloading.py | 48 +++++++++++++++++++ 9 files changed, 65 insertions(+) create mode 100644 tests/test_import/modules/parentdir/module3/submodule/subsubmodule/.module create mode 100644 tests/test_import/modules/parentdir/module3/submodule/subsubmodule/__init__.py create mode 100644 tests/test_import/modules/parentdir/module3/submodule2/.module create mode 100644 tests/test_import/modules/parentdir/module3/submodule2/__init__.py create mode 100644 tests/test_import/modules/parentdir/module3/submodule_dir/submodule_with_folder_in_between/.module create mode 100644 tests/test_import/modules/parentdir/module3/submodule_dir/submodule_with_folder_in_between/__init__.py create mode 100644 tests/test_import/modules/parentdir/module3/submodule_without_autoload/.module create mode 100644 tests/test_import/modules/parentdir/module3/submodule_without_autoload/__init__.py create mode 100644 tests/test_import/test_parent_autoloading.py diff --git a/tests/test_import/modules/parentdir/module3/submodule/subsubmodule/.module b/tests/test_import/modules/parentdir/module3/submodule/subsubmodule/.module new file mode 100644 index 00000000..e69de29b diff --git a/tests/test_import/modules/parentdir/module3/submodule/subsubmodule/__init__.py b/tests/test_import/modules/parentdir/module3/submodule/subsubmodule/__init__.py new file mode 100644 index 00000000..99e6408b --- /dev/null +++ b/tests/test_import/modules/parentdir/module3/submodule/subsubmodule/__init__.py @@ -0,0 +1,3 @@ + +def register(mf): + mf.register_event("main", lambda: print("tests")) diff --git a/tests/test_import/modules/parentdir/module3/submodule2/.module b/tests/test_import/modules/parentdir/module3/submodule2/.module new file mode 100644 index 00000000..e69de29b diff --git a/tests/test_import/modules/parentdir/module3/submodule2/__init__.py b/tests/test_import/modules/parentdir/module3/submodule2/__init__.py new file mode 100644 index 00000000..99e6408b --- /dev/null +++ b/tests/test_import/modules/parentdir/module3/submodule2/__init__.py @@ -0,0 +1,3 @@ + +def register(mf): + mf.register_event("main", lambda: print("tests")) diff --git a/tests/test_import/modules/parentdir/module3/submodule_dir/submodule_with_folder_in_between/.module b/tests/test_import/modules/parentdir/module3/submodule_dir/submodule_with_folder_in_between/.module new file mode 100644 index 00000000..e69de29b diff --git a/tests/test_import/modules/parentdir/module3/submodule_dir/submodule_with_folder_in_between/__init__.py b/tests/test_import/modules/parentdir/module3/submodule_dir/submodule_with_folder_in_between/__init__.py new file mode 100644 index 00000000..159bdd26 --- /dev/null +++ b/tests/test_import/modules/parentdir/module3/submodule_dir/submodule_with_folder_in_between/__init__.py @@ -0,0 +1,4 @@ + + +def register(mf): + mf.register_event("main", lambda: print("tests")) diff --git a/tests/test_import/modules/parentdir/module3/submodule_without_autoload/.module b/tests/test_import/modules/parentdir/module3/submodule_without_autoload/.module new file mode 100644 index 00000000..e69de29b diff --git a/tests/test_import/modules/parentdir/module3/submodule_without_autoload/__init__.py b/tests/test_import/modules/parentdir/module3/submodule_without_autoload/__init__.py new file mode 100644 index 00000000..7811446d --- /dev/null +++ b/tests/test_import/modules/parentdir/module3/submodule_without_autoload/__init__.py @@ -0,0 +1,7 @@ + + +def register(mf): + mf.register_event("main", lambda: print("tests")) + + +register_parents = False diff --git a/tests/test_import/test_parent_autoloading.py b/tests/test_import/test_parent_autoloading.py new file mode 100644 index 00000000..73acea4d --- /dev/null +++ b/tests/test_import/test_parent_autoloading.py @@ -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 From 966c263cebaa65442be2b1f2b27e859f78b6f9bf Mon Sep 17 00:00:00 2001 From: David Hartmann Date: Mon, 28 Dec 2020 11:53:00 +0100 Subject: [PATCH 4/5] enabled autoload of module parents --- src/miniflask/miniflask.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/miniflask/miniflask.py b/src/miniflask/miniflask.py index c1de1d60..f6c2cd45 100644 --- a/src/miniflask/miniflask.py +++ b/src/miniflask/miniflask.py @@ -349,6 +349,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) @@ -879,7 +889,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): From 5382dde23867d60dd4be61148ee8904f7d1f8aec Mon Sep 17 00:00:00 2001 From: David Hartmann Date: Mon, 28 Dec 2020 12:37:31 +0100 Subject: [PATCH 5/5] print_recently_loaded: highlight autoloaded parents instead of listing separately --- src/miniflask/miniflask.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/miniflask/miniflask.py b/src/miniflask/miniflask.py index f6c2cd45..72413e3e 100644 --- a/src/miniflask/miniflask.py +++ b/src/miniflask/miniflask.py @@ -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 = "╰── " # "└── " @@ -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 #