From d59c73bc8c4187e6c1b5105f261ea4e5e9a1e33d Mon Sep 17 00:00:00 2001 From: graepaul_amdeng Date: Wed, 7 Oct 2026 11:49:05 -0700 Subject: [PATCH 1/2] Update default TaskResult for DataPlugin so it includes parent and task always --- nodescraper/interfaces/dataplugin.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/nodescraper/interfaces/dataplugin.py b/nodescraper/interfaces/dataplugin.py index d81f3dc4..a8449c98 100644 --- a/nodescraper/interfaces/dataplugin.py +++ b/nodescraper/interfaces/dataplugin.py @@ -119,13 +119,18 @@ def __init__( **kwargs, ) self._validate_class_var() + collector = self.get_collector_classes() self.collection_result: TaskResult = TaskResult( status=ExecutionStatus.NOT_RAN, message=f"Data collection not ran for {self.__class__.__name__}", + parent=self.__class__.__name__, + task=collector[0].__name__ if collector else None, ) self.analysis_result: TaskResult = TaskResult( status=ExecutionStatus.NOT_RAN, message=f"Data analysis not ran for {self.__class__.__name__}", + parent=self.__class__.__name__, + task=self.ANALYZER.__name__ if self.ANALYZER is not None else None, ) self._data: Optional[TDataModel] = None From b236532493c67c56053bdd9785aff565cb77d649 Mon Sep 17 00:00:00 2001 From: graepaul_amdeng Date: Wed, 7 Oct 2026 12:58:18 -0700 Subject: [PATCH 2/2] Adding a test to make sure task and parent are not None for collection/analysis_result --- nodescraper/interfaces/dataplugin.py | 15 +++++++++++++-- test/unit/framework/test_dataplugin.py | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/nodescraper/interfaces/dataplugin.py b/nodescraper/interfaces/dataplugin.py index a8449c98..6604d3fe 100644 --- a/nodescraper/interfaces/dataplugin.py +++ b/nodescraper/interfaces/dataplugin.py @@ -63,6 +63,9 @@ dict[str, Type[CollectorArgs]], ] +NO_TASK_STR = "No {task_name} configured for {plugin_name}" +TASK_NOT_RAN_STR = "Data {task_name} not ran for {plugin_name}" + class DataPlugin( PluginInterface, @@ -122,13 +125,21 @@ def __init__( collector = self.get_collector_classes() self.collection_result: TaskResult = TaskResult( status=ExecutionStatus.NOT_RAN, - message=f"Data collection not ran for {self.__class__.__name__}", + message=( + TASK_NOT_RAN_STR.format(task_name="collection", plugin_name=self.__class__.__name__) + if collector + else NO_TASK_STR.format(task_name="collection", plugin_name=self.__class__.__name__) + ), parent=self.__class__.__name__, task=collector[0].__name__ if collector else None, ) self.analysis_result: TaskResult = TaskResult( status=ExecutionStatus.NOT_RAN, - message=f"Data analysis not ran for {self.__class__.__name__}", + message=( + TASK_NOT_RAN_STR.format(task_name="analysis", plugin_name=self.__class__.__name__) + if self.ANALYZER is not None + else NO_TASK_STR.format(task_name="analysis", plugin_name=self.__class__.__name__) + ), parent=self.__class__.__name__, task=self.ANALYZER.__name__ if self.ANALYZER is not None else None, ) diff --git a/test/unit/framework/test_dataplugin.py b/test/unit/framework/test_dataplugin.py index ac17b6ad..108d3a09 100644 --- a/test/unit/framework/test_dataplugin.py +++ b/test/unit/framework/test_dataplugin.py @@ -125,6 +125,20 @@ def test_data_property(self, plugin): assert isinstance(plugin.data, StandardDataModel) assert plugin.data.value == "dict_value" + def test_default_analysis_result_is_poplulated(self, plugin): + assert plugin.analysis_result.status == ExecutionStatus.NOT_RAN + assert "not ran" in plugin.analysis_result.message + assert "analysis" in plugin.analysis_result.message + assert plugin.analysis_result.parent is not None + assert plugin.analysis_result.task is not None + + def test_default_collection_result_is_poplulated(self, plugin): + assert plugin.collection_result.status == ExecutionStatus.NOT_RAN + assert "not ran" in plugin.collection_result.message + assert "collection" in plugin.collection_result.message + assert plugin.collection_result.parent is not None + assert plugin.collection_result.task is not None + def test_data_setter_error_names_expected_model(self, plugin): """Invalid data should report the expected DATA_MODEL name, not its metaclass.""" with pytest.raises(ValueError) as exc_info: