Toan Quach 1 rok pred
rodič
commit
3e3d8402d7

+ 5 - 5
taipy/core/_entity/submittable.py

@@ -17,9 +17,9 @@ import networkx as nx
 
 from ..common._listattributes import _ListAttributes
 from ..common._utils import _Subscriber
-from ..data.data_node import DataNode
+from ..data.data_node import DataNode, _compute_if_dn_is_ready_for_reading
 from ..job.job import Job
-from ..notification._submittable_status_cache import SubmittableStatusCache
+from ..notification._ready_to_run_cache import _ReadyToRunCache
 from ..submission.submission import Submission
 from ..task.task import Task
 from ._dag import _DAG
@@ -88,10 +88,10 @@ class Submittable:
         Returns:
             True if the given entity is ready to be run. False otherwise.
         """
-        if self._submittable_id not in SubmittableStatusCache._submittable_id_datanodes:
+        if self._submittable_id not in _ReadyToRunCache._submittable_id_datanodes:
             for dn in self.get_inputs():
-                SubmittableStatusCache._compute_if_dn_is_ready_for_reading(dn)
-        return SubmittableStatusCache._check_submittable_is_ready_to_submit(self._submittable_id)
+                _compute_if_dn_is_ready_for_reading(dn)
+        return _ReadyToRunCache._check_submittable_is_ready_to_submit(self._submittable_id)
 
     def data_nodes_being_edited(self) -> Set[DataNode]:
         """Return the set of data nodes of the submittable entity that are being edited.

+ 14 - 5
taipy/core/data/data_node.py

@@ -30,20 +30,29 @@ from .._version._version_manager_factory import _VersionManagerFactory
 from ..common._warnings import _warn_deprecated
 from ..exceptions.exceptions import DataNodeIsBeingEdited, NoData
 from ..job.job_id import JobId
-from ..notification._submittable_status_cache import SubmittableStatusCache
+from ..notification._ready_to_run_cache import _ReadyToRunCache
 from ..notification.event import Event, EventEntityType, EventOperation, _make_event
 from ._filter import _FilterDataNode
 from .data_node_id import DataNodeId, Edit
 from .operator import JoinOperator
 
 
-def _recompute_submittable_cache_wrapper(fct):
+def _compute_if_dn_is_ready_for_reading(dn: "DataNode"):
+    if dn._edit_in_progress:
+        _ReadyToRunCache._add_parent_entities_to_submittable_cache(dn, f"DataNode {dn.id} is being edited")
+    elif not dn._last_edit_date:
+        _ReadyToRunCache._add_parent_entities_to_submittable_cache(dn, f"DataNode {dn.id} is not written")
+    elif dn.is_ready_for_reading:
+        _ReadyToRunCache._remove(dn.id)
+
+
+def _update_ready_for_reading(fct):
     # This decorator must be wrapped before self_setter decorator as self_setter will run the function twice.
 
     @functools.wraps(fct)
     def _recompute_is_ready_for_reading(dn: "DataNode", *args, **kwargs):
         fct(dn, *args, **kwargs)
-        SubmittableStatusCache._compute_if_dn_is_ready_for_reading(dn)
+        _compute_if_dn_is_ready_for_reading(dn)
 
     return _recompute_is_ready_for_reading
 
@@ -185,7 +194,7 @@ class DataNode(_Entity, _Labeled):
             return self._last_edit_date
 
     @last_edit_date.setter  # type: ignore
-    @_recompute_submittable_cache_wrapper
+    @_update_ready_for_reading
     @_self_setter(_MANAGER_NAME)
     def last_edit_date(self, val):
         self._last_edit_date = val
@@ -250,7 +259,7 @@ class DataNode(_Entity, _Labeled):
         return self._edit_in_progress
 
     @edit_in_progress.setter  # type: ignore
-    @_recompute_submittable_cache_wrapper
+    @_update_ready_for_reading
     @_self_setter(_MANAGER_NAME)
     def edit_in_progress(self, val):
         self._edit_in_progress = val

+ 88 - 0
taipy/core/notification/_ready_to_run_cache.py

@@ -0,0 +1,88 @@
+# Copyright 2021-2024 Avaiga Private Limited
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+#        http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations under the License.
+
+from collections import defaultdict
+from typing import TYPE_CHECKING, Dict, Set, Union
+
+from . import EventOperation, Notifier, _make_event
+
+if TYPE_CHECKING:
+    from ..data.data_node import DataNode, DataNodeId
+    from ..scenario.scenario import ScenarioId
+    from ..sequence.sequence import SequenceId
+    from ..task.task import TaskId
+
+
+class _ReadyToRunCache:
+    IS_SUBMITTABLE_PROPERTY_NAME = "is_submittable"
+
+    # A dictionary of the data nodes not ready_to_read and their corresponding submittable entities.
+    _datanode_id_submittables: Dict["DataNodeId", Set[Union["ScenarioId", "SequenceId", "TaskId"]]] = defaultdict(set)
+
+    # A nested dictionary of the submittable entities (Scenario, Sequence, Task) and
+    # the data nodes that make it not ready_to_run with the reason(s)
+    _submittable_id_datanodes: Dict[Union["ScenarioId", "SequenceId", "TaskId"], Dict["DataNodeId", str]] = defaultdict(
+        defaultdict
+    )
+
+    @staticmethod
+    def _publish_submittable_property_event(
+        submittable_id: Union["ScenarioId", "SequenceId", "TaskId"], submittable_property
+    ):
+        from ..taipy import get as tp_get
+
+        Notifier.publish(
+            _make_event(
+                tp_get(submittable_id),
+                EventOperation.UPDATE,
+                attribute_name=_ReadyToRunCache.IS_SUBMITTABLE_PROPERTY_NAME,
+                attribute_value=submittable_property,
+            )
+        )
+
+    @classmethod
+    def _add(cls, submittable_id: Union["ScenarioId", "SequenceId", "TaskId"], datanode_id: "DataNodeId", reason: str):
+        cls._datanode_id_submittables[datanode_id].add(submittable_id)
+        cls._submittable_id_datanodes[submittable_id][datanode_id] = reason
+
+    @classmethod
+    def _remove(cls, datanode_id: "DataNodeId"):
+        submittable_ids: Set = cls._datanode_id_submittables.pop(datanode_id, set())
+        for submittable_id in submittable_ids:
+            cls._submittable_id_datanodes[submittable_id].pop(datanode_id, None)
+            if len(cls._submittable_id_datanodes[submittable_id]) == 0:
+                cls._publish_submittable_property_event(submittable_id, True)
+                cls._submittable_id_datanodes.pop(submittable_id, None)
+
+    @classmethod
+    def _check_submittable_is_ready_to_submit(cls, submittable_id: Union["ScenarioId", "SequenceId", "TaskId"]):
+        return len(_ReadyToRunCache._submittable_id_datanodes.get(submittable_id, [])) == 0
+
+    @classmethod
+    def _add_parent_entities_to_submittable_cache(cls, dn: "DataNode", reason: str):
+        from ..scenario.scenario import Scenario
+        from ..sequence.sequence import Sequence
+        from ..task.task import Task
+
+        parent_entities = dn.get_parents()
+
+        for scenario_parent in parent_entities.get(Scenario._MANAGER_NAME, []):
+            _ReadyToRunCache._add(scenario_parent.id, dn.id, reason)
+        for sequence_parent in parent_entities.get(Sequence._MANAGER_NAME, []):
+            _ReadyToRunCache._add(sequence_parent.id, dn.id, reason)
+        for task_parent in parent_entities.get(Task._MANAGER_NAME, []):
+            _ReadyToRunCache._add(task_parent.id, dn.id, reason)
+
+    @classmethod
+    def get_reason_submittable_is_not_ready_to_submit(cls, submittable_id: Union["ScenarioId", "SequenceId", "TaskId"]):
+        if reasons := list(cls._submittable_id_datanodes.get(submittable_id, {}).values()):
+            return "; ".join(reasons) + "."
+        return ""

+ 0 - 86
taipy/core/notification/_submittable_status_cache.py

@@ -1,86 +0,0 @@
-# Copyright 2021-2024 Avaiga Private Limited
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-#        http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
-# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations under the License.
-
-from collections import defaultdict
-from typing import TYPE_CHECKING, Dict, Set
-
-from ..notification import EventOperation, Notifier, _make_event
-
-if TYPE_CHECKING:
-    from ..data.data_node import DataNode, DataNodeId
-
-
-class SubmittableStatusCache:
-    IS_SUBMITTABLE_FCT_NAME = "is_submittable"
-
-    # A dictionary representing not ready_to_read datanode and its equivalent submittable entities
-    _datanode_id_submittables: Dict["DataNodeId", Set[str]] = defaultdict(lambda: set())
-
-    # A nested dictionary representing the submittable entities (Scenario, Sequence, Task) and
-    # its equivalent not ready_to_read input datanodes
-    _submittable_id_datanodes: Dict[str, Dict["DataNodeId", str]] = defaultdict(defaultdict)
-
-    @classmethod
-    def __add(cls, entity_id: str, datanode_id: "DataNodeId", reason: str):
-        cls._datanode_id_submittables[datanode_id].add(entity_id)
-        cls._submittable_id_datanodes[entity_id][datanode_id] = reason
-
-    @classmethod
-    def __remove(cls, datanode_id: "DataNodeId"):
-        from ..taipy import get as tp_get
-
-        submittable_ids: Set = cls._datanode_id_submittables.pop(datanode_id, set())
-        for submittable_id in submittable_ids:
-            cls._submittable_id_datanodes[submittable_id].pop(datanode_id, None)
-            if len(cls._submittable_id_datanodes[submittable_id]) == 0:
-                Notifier.publish(
-                    _make_event(
-                        tp_get(submittable_id),
-                        EventOperation.UPDATE,
-                        attribute_name=cls.IS_SUBMITTABLE_FCT_NAME,
-                        attribute_value=True,
-                    )
-                )
-                cls._submittable_id_datanodes.pop(submittable_id, None)
-
-    @classmethod
-    def _check_submittable_is_ready_to_submit(cls, entity_id: str):
-        return len(SubmittableStatusCache._submittable_id_datanodes.get(entity_id, [])) == 0
-
-    @classmethod
-    def __add_parent_entities_to_submittable_cache(cls, dn: "DataNode", reason: str):
-        from ..scenario.scenario import Scenario
-        from ..sequence.sequence import Sequence
-        from ..task.task import Task
-
-        parent_entities = dn.get_parents()
-
-        for scenario_parent in parent_entities.get(Scenario._MANAGER_NAME, []):
-            SubmittableStatusCache.__add(scenario_parent.id, dn.id, reason)
-        for sequence_parent in parent_entities.get(Sequence._MANAGER_NAME, []):
-            SubmittableStatusCache.__add(sequence_parent.id, dn.id, reason)
-        for task_parent in parent_entities.get(Task._MANAGER_NAME, []):
-            SubmittableStatusCache.__add(task_parent.id, dn.id, reason)
-
-    @classmethod
-    def _compute_if_dn_is_ready_for_reading(cls, dn: "DataNode"):
-        if dn._edit_in_progress:
-            cls.__add_parent_entities_to_submittable_cache(dn, f"DataNode {dn.id} is being edited")
-        elif not dn._last_edit_date:
-            cls.__add_parent_entities_to_submittable_cache(dn, f"DataNode {dn.id} is not written")
-        elif dn.is_ready_for_reading:
-            SubmittableStatusCache.__remove(dn.id)
-
-    @classmethod
-    def get_reason_submittable_is_not_ready_to_submit(cls, entity_id: str):
-        if reasons := list(cls._submittable_id_datanodes.get(entity_id, {}).values()):
-            return "; ".join(reasons) + "."
-        return ""

+ 5 - 5
tests/core/notification/test_submittable_status_cache.py

@@ -12,7 +12,7 @@
 from datetime import datetime
 
 from taipy.config import Config, Frequency
-from taipy.core.notification._submittable_status_cache import SubmittableStatusCache
+from taipy.core.notification._ready_to_run_cache import _ReadyToRunCache
 from taipy.core.scenario._scenario_manager_factory import _ScenarioManagerFactory
 
 
@@ -32,7 +32,7 @@ def test_get_reason_submittable_is_not_ready_to_submit():
     assert not scenario.is_ready_to_run()
     assert not scenario_manager._is_submittable(scenario)
     assert (
-        SubmittableStatusCache.get_reason_submittable_is_not_ready_to_submit(scenario.id)
+        _ReadyToRunCache.get_reason_submittable_is_not_ready_to_submit(scenario.id)
         == f"DataNode {dn_2.id} is being edited."
     )
 
@@ -40,7 +40,7 @@ def test_get_reason_submittable_is_not_ready_to_submit():
     assert not scenario.is_ready_to_run()
     assert not scenario_manager._is_submittable(scenario)
     assert (
-        SubmittableStatusCache.get_reason_submittable_is_not_ready_to_submit(scenario.id)
+        _ReadyToRunCache.get_reason_submittable_is_not_ready_to_submit(scenario.id)
         == f"DataNode {dn_2.id} is being edited; DataNode {dn_1.id} is not written."
     )
 
@@ -48,11 +48,11 @@ def test_get_reason_submittable_is_not_ready_to_submit():
     assert not scenario.is_ready_to_run()
     assert not scenario_manager._is_submittable(scenario)
     assert (
-        SubmittableStatusCache.get_reason_submittable_is_not_ready_to_submit(scenario.id)
+        _ReadyToRunCache.get_reason_submittable_is_not_ready_to_submit(scenario.id)
         == f"DataNode {dn_1.id} is not written."
     )
 
     dn_1.last_edit_date = datetime.now()
     assert scenario.is_ready_to_run()
     assert scenario_manager._is_submittable(scenario)
-    assert SubmittableStatusCache.get_reason_submittable_is_not_ready_to_submit(scenario.id) == ""
+    assert _ReadyToRunCache.get_reason_submittable_is_not_ready_to_submit(scenario.id) == ""

+ 28 - 36
tests/core/scenario/test_scenario_manager.py

@@ -38,7 +38,7 @@ from taipy.core.exceptions.exceptions import (
     UnauthorizedTagError,
 )
 from taipy.core.job._job_manager import _JobManager
-from taipy.core.notification._submittable_status_cache import SubmittableStatusCache
+from taipy.core.notification._ready_to_run_cache import _ReadyToRunCache
 from taipy.core.scenario._scenario_manager import _ScenarioManager
 from taipy.core.scenario._scenario_manager_factory import _ScenarioManagerFactory
 from taipy.core.scenario.scenario import Scenario
@@ -947,63 +947,55 @@ def test_is_submittable():
     dn_2 = scenario.dn_2
 
     assert len(_ScenarioManager._get_all()) == 1
-    assert scenario.id not in SubmittableStatusCache._submittable_id_datanodes
+    assert scenario.id not in _ReadyToRunCache._submittable_id_datanodes
     assert _ScenarioManager._is_submittable(scenario)
     assert _ScenarioManager._is_submittable(scenario.id)
     assert not _ScenarioManager._is_submittable("Scenario_temp")
 
     dn_1.edit_in_progress = True
-    assert scenario.id in SubmittableStatusCache._submittable_id_datanodes
-    assert dn_1.id in SubmittableStatusCache._submittable_id_datanodes[scenario.id]
-    assert dn_1.id in SubmittableStatusCache._datanode_id_submittables
-    assert scenario.id in SubmittableStatusCache._datanode_id_submittables[dn_1.id]
-    assert (
-        SubmittableStatusCache._submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is being edited"
-    )
+    assert scenario.id in _ReadyToRunCache._submittable_id_datanodes
+    assert dn_1.id in _ReadyToRunCache._submittable_id_datanodes[scenario.id]
+    assert dn_1.id in _ReadyToRunCache._datanode_id_submittables
+    assert scenario.id in _ReadyToRunCache._datanode_id_submittables[dn_1.id]
+    assert _ReadyToRunCache._submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is being edited"
     assert not _ScenarioManager._is_submittable(scenario)
     assert not _ScenarioManager._is_submittable(scenario.id)
 
     dn_1.edit_in_progress = False
-    assert scenario.id not in SubmittableStatusCache._submittable_id_datanodes
-    assert dn_1.id not in SubmittableStatusCache._datanode_id_submittables
+    assert scenario.id not in _ReadyToRunCache._submittable_id_datanodes
+    assert dn_1.id not in _ReadyToRunCache._datanode_id_submittables
     assert _ScenarioManager._is_submittable(scenario)
     assert _ScenarioManager._is_submittable(scenario.id)
 
     dn_1.last_edit_date = None
     dn_2.edit_in_progress = True
-    assert scenario.id in SubmittableStatusCache._submittable_id_datanodes
-    assert dn_1.id in SubmittableStatusCache._submittable_id_datanodes[scenario.id]
-    assert dn_2.id in SubmittableStatusCache._submittable_id_datanodes[scenario.id]
-    assert dn_1.id in SubmittableStatusCache._datanode_id_submittables
-    assert scenario.id in SubmittableStatusCache._datanode_id_submittables[dn_1.id]
-    assert dn_2.id in SubmittableStatusCache._datanode_id_submittables
-    assert scenario.id in SubmittableStatusCache._datanode_id_submittables[dn_2.id]
-    assert (
-        SubmittableStatusCache._submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is not written"
-    )
-    assert (
-        SubmittableStatusCache._submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
-    )
+    assert scenario.id in _ReadyToRunCache._submittable_id_datanodes
+    assert dn_1.id in _ReadyToRunCache._submittable_id_datanodes[scenario.id]
+    assert dn_2.id in _ReadyToRunCache._submittable_id_datanodes[scenario.id]
+    assert dn_1.id in _ReadyToRunCache._datanode_id_submittables
+    assert scenario.id in _ReadyToRunCache._datanode_id_submittables[dn_1.id]
+    assert dn_2.id in _ReadyToRunCache._datanode_id_submittables
+    assert scenario.id in _ReadyToRunCache._datanode_id_submittables[dn_2.id]
+    assert _ReadyToRunCache._submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is not written"
+    assert _ReadyToRunCache._submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
     assert not _ScenarioManager._is_submittable(scenario)
     assert not _ScenarioManager._is_submittable(scenario.id)
 
     dn_1.last_edit_date = datetime.now()
-    assert scenario.id in SubmittableStatusCache._submittable_id_datanodes
-    assert dn_1.id not in SubmittableStatusCache._submittable_id_datanodes[scenario.id]
-    assert dn_2.id in SubmittableStatusCache._submittable_id_datanodes[scenario.id]
-    assert dn_1.id not in SubmittableStatusCache._datanode_id_submittables
-    assert dn_2.id in SubmittableStatusCache._datanode_id_submittables
-    assert scenario.id in SubmittableStatusCache._datanode_id_submittables[dn_2.id]
-    assert (
-        SubmittableStatusCache._submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
-    )
+    assert scenario.id in _ReadyToRunCache._submittable_id_datanodes
+    assert dn_1.id not in _ReadyToRunCache._submittable_id_datanodes[scenario.id]
+    assert dn_2.id in _ReadyToRunCache._submittable_id_datanodes[scenario.id]
+    assert dn_1.id not in _ReadyToRunCache._datanode_id_submittables
+    assert dn_2.id in _ReadyToRunCache._datanode_id_submittables
+    assert scenario.id in _ReadyToRunCache._datanode_id_submittables[dn_2.id]
+    assert _ReadyToRunCache._submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
     assert not _ScenarioManager._is_submittable(scenario)
     assert not _ScenarioManager._is_submittable(scenario.id)
 
     dn_2.edit_in_progress = False
-    assert dn_1.id not in SubmittableStatusCache._datanode_id_submittables
-    assert dn_2.id not in SubmittableStatusCache._datanode_id_submittables
-    assert scenario.id not in SubmittableStatusCache._submittable_id_datanodes
+    assert dn_1.id not in _ReadyToRunCache._datanode_id_submittables
+    assert dn_2.id not in _ReadyToRunCache._datanode_id_submittables
+    assert scenario.id not in _ReadyToRunCache._submittable_id_datanodes
     assert _ScenarioManager._is_submittable(scenario)
     assert _ScenarioManager._is_submittable(scenario.id)
 

+ 48 - 64
tests/core/sequence/test_sequence_manager.py

@@ -35,7 +35,7 @@ from taipy.core.exceptions.exceptions import (
     SequenceBelongsToNonExistingScenario,
 )
 from taipy.core.job._job_manager import _JobManager
-from taipy.core.notification._submittable_status_cache import SubmittableStatusCache
+from taipy.core.notification._ready_to_run_cache import _ReadyToRunCache
 from taipy.core.scenario._scenario_manager import _ScenarioManager
 from taipy.core.scenario.scenario import Scenario
 from taipy.core.sequence._sequence_manager import _SequenceManager
@@ -209,8 +209,8 @@ def test_is_submittable():
     scenario.add_sequences({"sequence": [task]})
     sequence = scenario.sequences["sequence"]
     assert len(_SequenceManager._get_all()) == 1
-    assert sequence.id not in SubmittableStatusCache._submittable_id_datanodes
-    assert scenario.id not in SubmittableStatusCache._submittable_id_datanodes
+    assert sequence.id not in _ReadyToRunCache._submittable_id_datanodes
+    assert scenario.id not in _ReadyToRunCache._submittable_id_datanodes
     assert _SequenceManager._is_submittable(sequence)
     assert _SequenceManager._is_submittable(sequence.id)
     assert _ScenarioManager._is_submittable(scenario)
@@ -218,88 +218,72 @@ def test_is_submittable():
     assert not _SequenceManager._is_submittable("SEQUENCE_temp_SCENARIO_scenario")
 
     dn_1.edit_in_progress = True
-    assert scenario.id in SubmittableStatusCache._submittable_id_datanodes
-    assert sequence.id in SubmittableStatusCache._submittable_id_datanodes
-    assert dn_1.id in SubmittableStatusCache._submittable_id_datanodes[scenario.id]
-    assert dn_1.id in SubmittableStatusCache._submittable_id_datanodes[sequence.id]
-    assert dn_1.id in SubmittableStatusCache._datanode_id_submittables
-    assert scenario.id in SubmittableStatusCache._datanode_id_submittables[dn_1.id]
-    assert sequence.id in SubmittableStatusCache._datanode_id_submittables[dn_1.id]
-    assert (
-        SubmittableStatusCache._submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is being edited"
-    )
-    assert (
-        SubmittableStatusCache._submittable_id_datanodes[sequence.id][dn_1.id] == f"DataNode {dn_1.id} is being edited"
-    )
+    assert scenario.id in _ReadyToRunCache._submittable_id_datanodes
+    assert sequence.id in _ReadyToRunCache._submittable_id_datanodes
+    assert dn_1.id in _ReadyToRunCache._submittable_id_datanodes[scenario.id]
+    assert dn_1.id in _ReadyToRunCache._submittable_id_datanodes[sequence.id]
+    assert dn_1.id in _ReadyToRunCache._datanode_id_submittables
+    assert scenario.id in _ReadyToRunCache._datanode_id_submittables[dn_1.id]
+    assert sequence.id in _ReadyToRunCache._datanode_id_submittables[dn_1.id]
+    assert _ReadyToRunCache._submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is being edited"
+    assert _ReadyToRunCache._submittable_id_datanodes[sequence.id][dn_1.id] == f"DataNode {dn_1.id} is being edited"
     assert not _ScenarioManager._is_submittable(scenario)
     assert not _SequenceManager._is_submittable(sequence)
     assert not _SequenceManager._is_submittable(sequence.id)
 
     dn_1.edit_in_progress = False
-    assert scenario.id not in SubmittableStatusCache._submittable_id_datanodes
-    assert sequence.id not in SubmittableStatusCache._submittable_id_datanodes
-    assert dn_1.id not in SubmittableStatusCache._datanode_id_submittables
+    assert scenario.id not in _ReadyToRunCache._submittable_id_datanodes
+    assert sequence.id not in _ReadyToRunCache._submittable_id_datanodes
+    assert dn_1.id not in _ReadyToRunCache._datanode_id_submittables
     assert _SequenceManager._is_submittable(sequence)
     assert _SequenceManager._is_submittable(sequence.id)
     assert _ScenarioManager._is_submittable(scenario)
 
     dn_1.last_edit_date = None
     dn_2.edit_in_progress = True
-    assert scenario.id in SubmittableStatusCache._submittable_id_datanodes
-    assert sequence.id in SubmittableStatusCache._submittable_id_datanodes
-    assert dn_1.id in SubmittableStatusCache._submittable_id_datanodes[scenario.id]
-    assert dn_1.id in SubmittableStatusCache._submittable_id_datanodes[sequence.id]
-    assert dn_2.id in SubmittableStatusCache._submittable_id_datanodes[scenario.id]
-    assert dn_2.id in SubmittableStatusCache._submittable_id_datanodes[sequence.id]
-    assert dn_1.id in SubmittableStatusCache._datanode_id_submittables
-    assert scenario.id in SubmittableStatusCache._datanode_id_submittables[dn_1.id]
-    assert sequence.id in SubmittableStatusCache._datanode_id_submittables[dn_1.id]
-    assert dn_2.id in SubmittableStatusCache._datanode_id_submittables
-    assert scenario.id in SubmittableStatusCache._datanode_id_submittables[dn_2.id]
-    assert sequence.id in SubmittableStatusCache._datanode_id_submittables[dn_2.id]
-    assert (
-        SubmittableStatusCache._submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is not written"
-    )
-    assert (
-        SubmittableStatusCache._submittable_id_datanodes[sequence.id][dn_1.id] == f"DataNode {dn_1.id} is not written"
-    )
-    assert (
-        SubmittableStatusCache._submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
-    )
-    assert (
-        SubmittableStatusCache._submittable_id_datanodes[sequence.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
-    )
+    assert scenario.id in _ReadyToRunCache._submittable_id_datanodes
+    assert sequence.id in _ReadyToRunCache._submittable_id_datanodes
+    assert dn_1.id in _ReadyToRunCache._submittable_id_datanodes[scenario.id]
+    assert dn_1.id in _ReadyToRunCache._submittable_id_datanodes[sequence.id]
+    assert dn_2.id in _ReadyToRunCache._submittable_id_datanodes[scenario.id]
+    assert dn_2.id in _ReadyToRunCache._submittable_id_datanodes[sequence.id]
+    assert dn_1.id in _ReadyToRunCache._datanode_id_submittables
+    assert scenario.id in _ReadyToRunCache._datanode_id_submittables[dn_1.id]
+    assert sequence.id in _ReadyToRunCache._datanode_id_submittables[dn_1.id]
+    assert dn_2.id in _ReadyToRunCache._datanode_id_submittables
+    assert scenario.id in _ReadyToRunCache._datanode_id_submittables[dn_2.id]
+    assert sequence.id in _ReadyToRunCache._datanode_id_submittables[dn_2.id]
+    assert _ReadyToRunCache._submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is not written"
+    assert _ReadyToRunCache._submittable_id_datanodes[sequence.id][dn_1.id] == f"DataNode {dn_1.id} is not written"
+    assert _ReadyToRunCache._submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
+    assert _ReadyToRunCache._submittable_id_datanodes[sequence.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
     assert not _ScenarioManager._is_submittable(scenario)
     assert not _SequenceManager._is_submittable(sequence)
     assert not _SequenceManager._is_submittable(sequence.id)
 
     dn_1.last_edit_date = datetime.now()
-    assert scenario.id in SubmittableStatusCache._submittable_id_datanodes
-    assert sequence.id in SubmittableStatusCache._submittable_id_datanodes
-    assert dn_1.id not in SubmittableStatusCache._submittable_id_datanodes[scenario.id]
-    assert dn_1.id not in SubmittableStatusCache._submittable_id_datanodes[sequence.id]
-    assert dn_2.id in SubmittableStatusCache._submittable_id_datanodes[scenario.id]
-    assert dn_2.id in SubmittableStatusCache._submittable_id_datanodes[sequence.id]
-    assert dn_1.id not in SubmittableStatusCache._datanode_id_submittables
-    assert dn_2.id in SubmittableStatusCache._datanode_id_submittables
-    assert scenario.id in SubmittableStatusCache._datanode_id_submittables[dn_2.id]
-    assert sequence.id in SubmittableStatusCache._datanode_id_submittables[dn_2.id]
-    assert (
-        SubmittableStatusCache._submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
-    )
-    assert (
-        SubmittableStatusCache._submittable_id_datanodes[sequence.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
-    )
+    assert scenario.id in _ReadyToRunCache._submittable_id_datanodes
+    assert sequence.id in _ReadyToRunCache._submittable_id_datanodes
+    assert dn_1.id not in _ReadyToRunCache._submittable_id_datanodes[scenario.id]
+    assert dn_1.id not in _ReadyToRunCache._submittable_id_datanodes[sequence.id]
+    assert dn_2.id in _ReadyToRunCache._submittable_id_datanodes[scenario.id]
+    assert dn_2.id in _ReadyToRunCache._submittable_id_datanodes[sequence.id]
+    assert dn_1.id not in _ReadyToRunCache._datanode_id_submittables
+    assert dn_2.id in _ReadyToRunCache._datanode_id_submittables
+    assert scenario.id in _ReadyToRunCache._datanode_id_submittables[dn_2.id]
+    assert sequence.id in _ReadyToRunCache._datanode_id_submittables[dn_2.id]
+    assert _ReadyToRunCache._submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
+    assert _ReadyToRunCache._submittable_id_datanodes[sequence.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
     assert not _ScenarioManager._is_submittable(scenario)
     assert not _SequenceManager._is_submittable(sequence)
     assert not _SequenceManager._is_submittable(sequence.id)
 
     dn_2.edit_in_progress = False
-    assert scenario.id not in SubmittableStatusCache._submittable_id_datanodes
-    assert sequence.id not in SubmittableStatusCache._submittable_id_datanodes
-    assert dn_2.id not in SubmittableStatusCache._submittable_id_datanodes[scenario.id]
-    assert dn_2.id not in SubmittableStatusCache._submittable_id_datanodes[sequence.id]
-    assert dn_2.id not in SubmittableStatusCache._datanode_id_submittables
+    assert scenario.id not in _ReadyToRunCache._submittable_id_datanodes
+    assert sequence.id not in _ReadyToRunCache._submittable_id_datanodes
+    assert dn_2.id not in _ReadyToRunCache._submittable_id_datanodes[scenario.id]
+    assert dn_2.id not in _ReadyToRunCache._submittable_id_datanodes[sequence.id]
+    assert dn_2.id not in _ReadyToRunCache._datanode_id_submittables
     assert _ScenarioManager._is_submittable(scenario)
     assert _SequenceManager._is_submittable(sequence)
     assert _SequenceManager._is_submittable(sequence.id)

+ 48 - 56
tests/core/task/test_task_manager.py

@@ -23,7 +23,7 @@ from taipy.core._version._version_manager import _VersionManager
 from taipy.core.data._data_manager import _DataManager
 from taipy.core.data.in_memory import InMemoryDataNode
 from taipy.core.exceptions.exceptions import ModelNotFound, NonExistingTask
-from taipy.core.notification._submittable_status_cache import SubmittableStatusCache
+from taipy.core.notification._ready_to_run_cache import _ReadyToRunCache
 from taipy.core.scenario._scenario_manager_factory import _ScenarioManagerFactory
 from taipy.core.task._task_manager import _TaskManager
 from taipy.core.task._task_manager_factory import _TaskManagerFactory
@@ -323,8 +323,8 @@ def test_is_submittable():
     assert len(task_manager._get_all()) == 1
     assert len(scenario_manager._get_all()) == 1
 
-    assert scenario.id not in SubmittableStatusCache._submittable_id_datanodes
-    assert task.id not in SubmittableStatusCache._submittable_id_datanodes
+    assert scenario.id not in _ReadyToRunCache._submittable_id_datanodes
+    assert task.id not in _ReadyToRunCache._submittable_id_datanodes
     assert task_manager._is_submittable(task)
     assert task_manager._is_submittable(task.id)
     assert scenario_manager._is_submittable(scenario)
@@ -332,80 +332,72 @@ def test_is_submittable():
     assert not task_manager._is_submittable("Task_temp")
 
     dn_1.edit_in_progress = True
-    assert scenario.id in SubmittableStatusCache._submittable_id_datanodes
-    assert task.id in SubmittableStatusCache._submittable_id_datanodes
-    assert dn_1.id in SubmittableStatusCache._submittable_id_datanodes[scenario.id]
-    assert dn_1.id in SubmittableStatusCache._submittable_id_datanodes[task.id]
-    assert dn_1.id in SubmittableStatusCache._datanode_id_submittables
-    assert scenario.id in SubmittableStatusCache._datanode_id_submittables[dn_1.id]
-    assert task.id in SubmittableStatusCache._datanode_id_submittables[dn_1.id]
-    assert (
-        SubmittableStatusCache._submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is being edited"
-    )
-    assert SubmittableStatusCache._submittable_id_datanodes[task.id][dn_1.id] == f"DataNode {dn_1.id} is being edited"
+    assert scenario.id in _ReadyToRunCache._submittable_id_datanodes
+    assert task.id in _ReadyToRunCache._submittable_id_datanodes
+    assert dn_1.id in _ReadyToRunCache._submittable_id_datanodes[scenario.id]
+    assert dn_1.id in _ReadyToRunCache._submittable_id_datanodes[task.id]
+    assert dn_1.id in _ReadyToRunCache._datanode_id_submittables
+    assert scenario.id in _ReadyToRunCache._datanode_id_submittables[dn_1.id]
+    assert task.id in _ReadyToRunCache._datanode_id_submittables[dn_1.id]
+    assert _ReadyToRunCache._submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is being edited"
+    assert _ReadyToRunCache._submittable_id_datanodes[task.id][dn_1.id] == f"DataNode {dn_1.id} is being edited"
     assert not scenario_manager._is_submittable(scenario)
     assert not task_manager._is_submittable(task)
     assert not task_manager._is_submittable(task.id)
 
     dn_1.edit_in_progress = False
-    assert scenario.id not in SubmittableStatusCache._submittable_id_datanodes
-    assert task.id not in SubmittableStatusCache._submittable_id_datanodes
-    assert dn_1.id not in SubmittableStatusCache._datanode_id_submittables
+    assert scenario.id not in _ReadyToRunCache._submittable_id_datanodes
+    assert task.id not in _ReadyToRunCache._submittable_id_datanodes
+    assert dn_1.id not in _ReadyToRunCache._datanode_id_submittables
     assert scenario_manager._is_submittable(scenario)
     assert task_manager._is_submittable(task)
     assert task_manager._is_submittable(task.id)
 
     dn_1.last_edit_date = None
     dn_2.edit_in_progress = True
-    assert scenario.id in SubmittableStatusCache._submittable_id_datanodes
-    assert task.id in SubmittableStatusCache._submittable_id_datanodes
-    assert dn_1.id in SubmittableStatusCache._submittable_id_datanodes[scenario.id]
-    assert dn_1.id in SubmittableStatusCache._submittable_id_datanodes[task.id]
-    assert dn_2.id in SubmittableStatusCache._submittable_id_datanodes[scenario.id]
-    assert dn_2.id in SubmittableStatusCache._submittable_id_datanodes[task.id]
-    assert dn_1.id in SubmittableStatusCache._datanode_id_submittables
-    assert scenario.id in SubmittableStatusCache._datanode_id_submittables[dn_1.id]
-    assert task.id in SubmittableStatusCache._datanode_id_submittables[dn_1.id]
-    assert dn_2.id in SubmittableStatusCache._datanode_id_submittables
-    assert scenario.id in SubmittableStatusCache._datanode_id_submittables[dn_2.id]
-    assert task.id in SubmittableStatusCache._datanode_id_submittables[dn_2.id]
-    assert (
-        SubmittableStatusCache._submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is not written"
-    )
-    assert SubmittableStatusCache._submittable_id_datanodes[task.id][dn_1.id] == f"DataNode {dn_1.id} is not written"
-    assert (
-        SubmittableStatusCache._submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
-    )
-    assert SubmittableStatusCache._submittable_id_datanodes[task.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
+    assert scenario.id in _ReadyToRunCache._submittable_id_datanodes
+    assert task.id in _ReadyToRunCache._submittable_id_datanodes
+    assert dn_1.id in _ReadyToRunCache._submittable_id_datanodes[scenario.id]
+    assert dn_1.id in _ReadyToRunCache._submittable_id_datanodes[task.id]
+    assert dn_2.id in _ReadyToRunCache._submittable_id_datanodes[scenario.id]
+    assert dn_2.id in _ReadyToRunCache._submittable_id_datanodes[task.id]
+    assert dn_1.id in _ReadyToRunCache._datanode_id_submittables
+    assert scenario.id in _ReadyToRunCache._datanode_id_submittables[dn_1.id]
+    assert task.id in _ReadyToRunCache._datanode_id_submittables[dn_1.id]
+    assert dn_2.id in _ReadyToRunCache._datanode_id_submittables
+    assert scenario.id in _ReadyToRunCache._datanode_id_submittables[dn_2.id]
+    assert task.id in _ReadyToRunCache._datanode_id_submittables[dn_2.id]
+    assert _ReadyToRunCache._submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is not written"
+    assert _ReadyToRunCache._submittable_id_datanodes[task.id][dn_1.id] == f"DataNode {dn_1.id} is not written"
+    assert _ReadyToRunCache._submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
+    assert _ReadyToRunCache._submittable_id_datanodes[task.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
     assert not scenario_manager._is_submittable(scenario)
     assert not task_manager._is_submittable(task)
     assert not task_manager._is_submittable(task.id)
 
     dn_1.last_edit_date = datetime.now()
-    assert scenario.id in SubmittableStatusCache._submittable_id_datanodes
-    assert task.id in SubmittableStatusCache._submittable_id_datanodes
-    assert dn_1.id not in SubmittableStatusCache._submittable_id_datanodes[scenario.id]
-    assert dn_1.id not in SubmittableStatusCache._submittable_id_datanodes[task.id]
-    assert dn_2.id in SubmittableStatusCache._submittable_id_datanodes[scenario.id]
-    assert dn_2.id in SubmittableStatusCache._submittable_id_datanodes[task.id]
-    assert dn_1.id not in SubmittableStatusCache._datanode_id_submittables
-    assert dn_2.id in SubmittableStatusCache._datanode_id_submittables
-    assert scenario.id in SubmittableStatusCache._datanode_id_submittables[dn_2.id]
-    assert task.id in SubmittableStatusCache._datanode_id_submittables[dn_2.id]
-    assert (
-        SubmittableStatusCache._submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
-    )
-    assert SubmittableStatusCache._submittable_id_datanodes[task.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
+    assert scenario.id in _ReadyToRunCache._submittable_id_datanodes
+    assert task.id in _ReadyToRunCache._submittable_id_datanodes
+    assert dn_1.id not in _ReadyToRunCache._submittable_id_datanodes[scenario.id]
+    assert dn_1.id not in _ReadyToRunCache._submittable_id_datanodes[task.id]
+    assert dn_2.id in _ReadyToRunCache._submittable_id_datanodes[scenario.id]
+    assert dn_2.id in _ReadyToRunCache._submittable_id_datanodes[task.id]
+    assert dn_1.id not in _ReadyToRunCache._datanode_id_submittables
+    assert dn_2.id in _ReadyToRunCache._datanode_id_submittables
+    assert scenario.id in _ReadyToRunCache._datanode_id_submittables[dn_2.id]
+    assert task.id in _ReadyToRunCache._datanode_id_submittables[dn_2.id]
+    assert _ReadyToRunCache._submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
+    assert _ReadyToRunCache._submittable_id_datanodes[task.id][dn_2.id] == f"DataNode {dn_2.id} is being edited"
     assert not scenario_manager._is_submittable(scenario)
     assert not task_manager._is_submittable(task)
     assert not task_manager._is_submittable(task.id)
 
     dn_2.edit_in_progress = False
-    assert scenario.id not in SubmittableStatusCache._submittable_id_datanodes
-    assert task.id not in SubmittableStatusCache._submittable_id_datanodes
-    assert dn_2.id not in SubmittableStatusCache._submittable_id_datanodes[scenario.id]
-    assert dn_2.id not in SubmittableStatusCache._submittable_id_datanodes[task.id]
-    assert dn_2.id not in SubmittableStatusCache._datanode_id_submittables
+    assert scenario.id not in _ReadyToRunCache._submittable_id_datanodes
+    assert task.id not in _ReadyToRunCache._submittable_id_datanodes
+    assert dn_2.id not in _ReadyToRunCache._submittable_id_datanodes[scenario.id]
+    assert dn_2.id not in _ReadyToRunCache._submittable_id_datanodes[task.id]
+    assert dn_2.id not in _ReadyToRunCache._datanode_id_submittables
     assert scenario_manager._is_submittable(scenario)
     assert task_manager._is_submittable(task)
     assert task_manager._is_submittable(task.id)