From 0607da6aaff6c63090ab896fc19b3346770ff373 Mon Sep 17 00:00:00 2001 From: Hugh Ramsden Date: Wed, 24 Jul 2024 14:42:33 +0100 Subject: [PATCH 1/3] added tests --- cassini/core.py | 19 ++++++++++++ tests/test_extensibility.py | 58 +++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 tests/test_extensibility.py diff --git a/cassini/core.py b/cassini/core.py index bbcd296..58ca960 100644 --- a/cassini/core.py +++ b/cassini/core.py @@ -18,6 +18,7 @@ Dict, ClassVar, Optional, + Callable, cast, ) from warnings import warn @@ -831,6 +832,12 @@ def __init__( self._rank_map: Dict[Type[TierABC], int] = {} self._hierarchy: List[Type[TierABC]] = [] + self.__before_setup_files__: List[Callable[[Project], None]] = [] + self.__after_setup_files__: List[Callable[[Project], None]] = [] + + self.__before_launch__: List[Callable[[Project, Union[LabApp, None]], None]] = [] + self.__after_launch__: List[Callable[[Project, Union[LabApp, None]], None]] = [] + self.hierarchy: List[Type[TierABC]] = hierarchy project_folder_path = Path(project_folder).resolve() @@ -950,6 +957,9 @@ def setup_files(self) -> TierABC: Will put everything you need in `project_folder` to get going. """ + for func in self.__before_setup_files__: + func(self) + home = self.home if home.exists(): @@ -978,6 +988,9 @@ def setup_files(self) -> TierABC: home.setup_files() print("Success") + for func in self.__after_setup_files__: + func(self) + return home def launch( @@ -998,6 +1011,9 @@ def launch( patch_pythonpath : bool Add `self.project_folder` to the `PYTHONPATH`? (defaults to `True`) """ + for func in self.__before_launch__: + func(self, app) + self.setup_files() if patch_pythonpath: @@ -1012,6 +1028,9 @@ def launch( app.launch_instance() + for func in self.__after_launch__: + func(self, app) + return app def parse_name(self, name: str) -> Tuple[str, ...]: diff --git a/tests/test_extensibility.py b/tests/test_extensibility.py new file mode 100644 index 0000000..945e31d --- /dev/null +++ b/tests/test_extensibility.py @@ -0,0 +1,58 @@ +from unittest.mock import Mock +from typing import Any + +from utils import patch_project + + +def test_setup_files_hook(patch_project): + Tier, project = patch_project + + home = project.home + + call_order = [] + + def stamp_call(label): + def wrapped(*args, **kwargs): + call_order.append(label) + return wrapped + + home.setup_files = Mock(side_effect=stamp_call('home')) + + before_mock = Mock(side_effect=stamp_call('before')) + after_mock = Mock(side_effect=stamp_call('after')) + + project.__before_setup_files__.append(before_mock) + project.__after_setup_files__.append(after_mock) + + project.setup_files() + + assert after_mock.call_args.args == (project,) + assert before_mock.call_args.args == (project,) + assert call_order == ['before', 'home', 'after'] + + +def test_launch_hook(patch_project): + Tier, project = patch_project + + call_order = [] + + def stamp_call(label): + def wrapped(*args, **kwargs): + call_order.append(label) + return wrapped + + project.setup_files = Mock(side_effect=stamp_call('project')) + + before_mock = Mock(side_effect=stamp_call('before')) + after_mock = Mock(side_effect=stamp_call('after')) + + project.__before_launch__.append(before_mock) + project.__after_launch__.append(after_mock) + + app = Mock() + + project.launch(app) + + assert after_mock.call_args.args == (project, app) + assert before_mock.call_args.args == (project, app) + assert call_order == ['before', 'project', 'after'] From 0d1b69e036e4c3b7e230ce612085166cb2a4cda1 Mon Sep 17 00:00:00 2001 From: Hugh Ramsden Date: Wed, 24 Jul 2024 14:44:16 +0100 Subject: [PATCH 2/3] black formatting --- cassini/core.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cassini/core.py b/cassini/core.py index 58ca960..b2d693e 100644 --- a/cassini/core.py +++ b/cassini/core.py @@ -835,7 +835,9 @@ def __init__( self.__before_setup_files__: List[Callable[[Project], None]] = [] self.__after_setup_files__: List[Callable[[Project], None]] = [] - self.__before_launch__: List[Callable[[Project, Union[LabApp, None]], None]] = [] + self.__before_launch__: List[ + Callable[[Project, Union[LabApp, None]], None] + ] = [] self.__after_launch__: List[Callable[[Project, Union[LabApp, None]], None]] = [] self.hierarchy: List[Type[TierABC]] = hierarchy @@ -1013,7 +1015,7 @@ def launch( """ for func in self.__before_launch__: func(self, app) - + self.setup_files() if patch_pythonpath: From c3d13cd58d4c24add7004cf2b9dd5ace37238d73 Mon Sep 17 00:00:00 2001 From: Hugh Ramsden Date: Wed, 24 Jul 2024 14:55:33 +0100 Subject: [PATCH 3/3] fixed slightly concerning flakey test issue RE home.exists() --- tests/test_extensibility.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/test_extensibility.py b/tests/test_extensibility.py index 945e31d..3763dfc 100644 --- a/tests/test_extensibility.py +++ b/tests/test_extensibility.py @@ -8,6 +8,7 @@ def test_setup_files_hook(patch_project): Tier, project = patch_project home = project.home + home.exists = lambda: False call_order = [] @@ -26,13 +27,14 @@ def wrapped(*args, **kwargs): project.setup_files() - assert after_mock.call_args.args == (project,) assert before_mock.call_args.args == (project,) + assert after_mock.call_args.args == (project,) assert call_order == ['before', 'home', 'after'] def test_launch_hook(patch_project): Tier, project = patch_project + project.exists = lambda self: False call_order = [] @@ -53,6 +55,6 @@ def wrapped(*args, **kwargs): project.launch(app) - assert after_mock.call_args.args == (project, app) assert before_mock.call_args.args == (project, app) + assert after_mock.call_args.args == (project, app) assert call_order == ['before', 'project', 'after']