From f6e287c7fd80087a505aa7e31b0b1683cb5b91cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niko=20F=C3=B6hr?= Date: Tue, 23 Apr 2024 22:30:57 +0300 Subject: [PATCH] add .mode_name to MethodActivationResult --- src/wakepy/core/activationresult.py | 5 +++++ src/wakepy/core/method.py | 4 +++- src/wakepy/core/mode.py | 6 +++++- tests/unit/test_core/test_activationresult.py | 19 +++++++++++++++++++ .../test_core/test_method/test_activation.py | 9 ++++++++- tests/unit/test_core/test_mode.py | 9 ++++++++- 6 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/wakepy/core/activationresult.py b/src/wakepy/core/activationresult.py index b0397e34..0e69769d 100644 --- a/src/wakepy/core/activationresult.py +++ b/src/wakepy/core/activationresult.py @@ -22,6 +22,8 @@ if typing.TYPE_CHECKING: from typing import Optional + from .constants import ModeName + @dataclass class ActivationResult: @@ -216,6 +218,9 @@ class MethodActivationResult: method_name: str """The name of the :class:`Method` this result is for.""" + mode_name: ModeName | str + """The name of the mode of the :class:`Method` this result is for.""" + success: bool | None """Tells about the result of the activation: diff --git a/src/wakepy/core/method.py b/src/wakepy/core/method.py index e0f173c6..20dc9743 100644 --- a/src/wakepy/core/method.py +++ b/src/wakepy/core/method.py @@ -295,7 +295,9 @@ def activate_method(method: Method) -> Tuple[MethodActivationResult, Heartbeat | if method.is_unnamed(): raise ValueError("Methods without a name may not be used to activate modes!") - result = MethodActivationResult(success=False, method_name=method.name) + result = MethodActivationResult( + success=False, method_name=method.name, mode_name=method.mode_name + ) if not get_platform_supported(method, platform=CURRENT_PLATFORM): result.failure_stage = StageName.PLATFORM_SUPPORT diff --git a/src/wakepy/core/mode.py b/src/wakepy/core/mode.py index 5c8a0f68..6121c677 100644 --- a/src/wakepy/core/mode.py +++ b/src/wakepy/core/mode.py @@ -371,7 +371,11 @@ def _activate_one_of_methods( # Add unused methods to the results for method_cls in method_classes: - methodresults.append(MethodActivationResult(method_cls.name, success=None)) + methodresults.append( + MethodActivationResult( + method_cls.name, mode_name=method_cls.mode_name, success=None + ) + ) return methodresults, method, heartbeat diff --git a/tests/unit/test_core/test_activationresult.py b/tests/unit/test_core/test_activationresult.py index 4dd56153..b27288bd 100644 --- a/tests/unit/test_core/test_activationresult.py +++ b/tests/unit/test_core/test_activationresult.py @@ -14,6 +14,8 @@ fake_success_cls = get_method("WAKEPY_FAKE_SUCCESS") +TEST_MODE = "test-mode" + @pytest.fixture def mr_platform_support_fail() -> MethodActivationResult: @@ -21,6 +23,7 @@ def mr_platform_support_fail() -> MethodActivationResult: success=False, failure_stage=StageName.PLATFORM_SUPPORT, method_name="fail-platform", + mode_name=TEST_MODE, failure_reason="Platform XYZ not supported!", ) @@ -31,6 +34,7 @@ def mr_requirements_fail() -> MethodActivationResult: success=False, failure_stage=StageName.REQUIREMENTS, method_name="fail-requirements", + mode_name=TEST_MODE, failure_reason="Missing requirement: Some SW v.1.2.3", ) @@ -40,6 +44,7 @@ def mr_success_result() -> MethodActivationResult: return MethodActivationResult( success=True, method_name="a-successful-method", + mode_name=TEST_MODE, ) @@ -48,6 +53,7 @@ def mr_unused_result() -> MethodActivationResult: return MethodActivationResult( success=None, method_name="some-unused-method", + mode_name=TEST_MODE, ) @@ -57,6 +63,7 @@ def mr_wakepy_fake_notinuse() -> MethodActivationResult: success=False, failure_stage=StageName.ACTIVATION, method_name=fake_success_cls.name, + mode_name=TEST_MODE, ) @@ -66,6 +73,7 @@ def mr_wakepy_fake_success() -> MethodActivationResult: success=True, failure_stage=StageName.ACTIVATION, method_name=fake_success_cls.name, + mode_name=TEST_MODE, ) @@ -92,16 +100,19 @@ def method_activation_results2_manysuccess( MethodActivationResult( success=True, method_name="1st.successful.method", + mode_name=TEST_MODE, ), # Fails in Requirement stage mr_requirements_fail, MethodActivationResult( success=True, method_name="2nd-successful-method", + mode_name=TEST_MODE, ), MethodActivationResult( success=True, method_name="last-successful-method", + mode_name=TEST_MODE, ), ] @@ -113,12 +124,14 @@ def method_activation_results3_fail() -> List[MethodActivationResult]: success=False, failure_stage=StageName.PLATFORM_SUPPORT, method_name="fail-platform", + mode_name=TEST_MODE, failure_reason="Platform XYZ not supported!", ), MethodActivationResult( success=False, failure_stage=StageName.REQUIREMENTS, method_name="fail-requirements", + mode_name=TEST_MODE, failure_reason="Missing requirement: Some SW v.1.2.3", ), ] @@ -371,6 +384,7 @@ class TestMethodActivationResult: def a(self) -> MethodActivationResult: return MethodActivationResult( method_name="foo", + mode_name=TEST_MODE, success=False, failure_stage=StageName.REQUIREMENTS, failure_reason="some-text", @@ -380,6 +394,7 @@ def a(self) -> MethodActivationResult: def b(self) -> MethodActivationResult: return MethodActivationResult( method_name="foo", + mode_name=TEST_MODE, success=False, failure_stage=StageName.REQUIREMENTS, failure_reason="some-text", @@ -396,6 +411,7 @@ def test_equality_check_similar( def c_different_method_name(self) -> MethodActivationResult: return MethodActivationResult( method_name="bar", + mode_name=TEST_MODE, success=False, failure_stage=StageName.REQUIREMENTS, failure_reason="some-text", @@ -405,6 +421,7 @@ def c_different_method_name(self) -> MethodActivationResult: def c_different_success(self) -> MethodActivationResult: return MethodActivationResult( method_name="foo", + mode_name=TEST_MODE, success=True, failure_stage=StageName.REQUIREMENTS, failure_reason="some-text", @@ -414,6 +431,7 @@ def c_different_success(self) -> MethodActivationResult: def c_different_failure_stage(self) -> MethodActivationResult: return MethodActivationResult( method_name="foo", + mode_name=TEST_MODE, success=False, failure_stage=StageName.PLATFORM_SUPPORT, failure_reason="some-text", @@ -423,6 +441,7 @@ def c_different_failure_stage(self) -> MethodActivationResult: def c_different_failure_reason(self) -> MethodActivationResult: return MethodActivationResult( method_name="foo", + mode_name=TEST_MODE, success=False, failure_stage=StageName.REQUIREMENTS, failure_reason="some-other-text", diff --git a/tests/unit/test_core/test_method/test_activation.py b/tests/unit/test_core/test_method/test_activation.py index fafc0830..ddf964f4 100644 --- a/tests/unit/test_core/test_method/test_activation.py +++ b/tests/unit/test_core/test_method/test_activation.py @@ -384,12 +384,13 @@ def caniuse(self): @pytest.mark.parametrize( - "success, failure_stage, method_name, message, expected_string_representation", + "success, failure_stage, method_name, mode_name, message, expected_string_representation", # noqa: E501 [ ( False, StageName.PLATFORM_SUPPORT, "fail-platform", + "some-mode", "Platform XYZ not supported!", '(FAIL @PLATFORM_SUPPORT, fail-platform, "Platform XYZ not supported!")', ), @@ -397,6 +398,7 @@ def caniuse(self): False, StageName.REQUIREMENTS, "other-fail-method", + "some-mode", "Need SW X version >= 8.9!", '(FAIL @REQUIREMENTS, other-fail-method, "Need SW X version >= 8.9!")', ), @@ -404,6 +406,7 @@ def caniuse(self): True, None, "successfulMethod", + "some-mode", "", # Succesful methods do not print empty message "(SUCCESS, successfulMethod)", @@ -412,6 +415,7 @@ def caniuse(self): None, None, "SomeMethod", + "some-mode", "", # Unused methods do not print empty message "(UNUSED, SomeMethod)", @@ -422,17 +426,20 @@ def test_method_activation_result( success, failure_stage, method_name, + mode_name, message, expected_string_representation, ): mur = MethodActivationResult( success=success, + mode_name=mode_name, failure_stage=failure_stage, method_name=method_name, failure_reason=message, ) # These attributes are available assert mur.method_name == method_name + assert mur.mode_name == mode_name assert mur.success == success assert mur.failure_stage == failure_stage assert mur.failure_reason == message diff --git a/tests/unit/test_core/test_mode.py b/tests/unit/test_core/test_mode.py index a652ebec..3f7a4d74 100644 --- a/tests/unit/test_core/test_mode.py +++ b/tests/unit/test_core/test_mode.py @@ -412,10 +412,12 @@ def test_activate_function_success(self): assert res == [ MethodActivationResult( method_name=methodcls_success.name, + mode_name=methodcls_success.mode_name, success=True, ), MethodActivationResult( method_name=methodcls_fail.name, + mode_name=methodcls_success.mode_name, success=None, ), ] @@ -435,7 +437,11 @@ def test_activate_function_success_with_heartbeat(self): # The activation succeeded, and the method has heartbeat, so the # hearbeat must be instance of Heartbeate assert res == [ - MethodActivationResult(methodcls_success_with_hb.name, success=True) + MethodActivationResult( + methodcls_success_with_hb.name, + methodcls_success_with_hb.mode_name, + success=True, + ) ] assert isinstance(active_method, methodcls_success_with_hb) assert isinstance(heartbeat, Heartbeat) @@ -450,6 +456,7 @@ def test_activate_function_failure(self): assert res == [ MethodActivationResult( methodcls_fail.name, + methodcls_fail.mode_name, success=False, failure_stage=StageName.ACTIVATION, failure_reason=repr(exc),