فهرست منبع

remove self setter set class

Toan Quach 1 سال پیش
والد
کامیت
eac4cedb20

+ 0 - 58
taipy/core/common/_self_setter_set.py

@@ -1,58 +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.abc import MutableSet
-from typing import Any, Iterable, Iterator
-
-
-class _SelfSetterSet(MutableSet):
-    def __init__(self, parent, data: Iterable):
-        self._parent = parent
-        self.data = set(data)
-
-    def __set_self(self):
-        from ... import core as tp
-
-        if hasattr(self, "_parent"):
-            tp.set(self._parent)
-
-    def __contains__(self, value: Any) -> bool:
-        return value in self.data
-
-    def __repr__(self) -> str:
-        return repr(self.data)
-
-    def __iter__(self) -> Iterator:
-        return iter(self.data)
-
-    def __len__(self) -> int:
-        return len(self.data)
-
-    def add(self, value: Any):
-        self.data.add(value)
-        self.__set_self()
-
-    def remove(self, value: Any):
-        self.data.remove(value)
-        self.__set_self()
-
-    def discard(self, value: Any):
-        self.data.discard(value)
-        self.__set_self()
-
-    def pop(self):
-        item = self.data.pop()
-        self.__set_self()
-        return item
-
-    def clear(self) -> None:
-        self.data.clear()
-        self.__set_self()

+ 6 - 7
taipy/core/submission/_submission_converter.py

@@ -12,7 +12,6 @@
 from datetime import datetime
 
 from .._repository._abstract_converter import _AbstractConverter
-from ..common._self_setter_set import _SelfSetterSet
 from ..job.job import Job, JobId
 from ..submission._submission_model import _SubmissionModel
 from ..submission.submission import Submission
@@ -35,9 +34,9 @@ class _SubmissionConverter(_AbstractConverter):
             is_abandoned=submission._is_abandoned,
             is_completed=submission._is_completed,
             is_canceled=submission._is_canceled,
-            running_jobs=list(submission._running_jobs.data),
-            blocked_jobs=list(submission._blocked_jobs.data),
-            pending_jobs=list(submission._pending_jobs.data),
+            running_jobs=list(submission._running_jobs),
+            blocked_jobs=list(submission._blocked_jobs),
+            pending_jobs=list(submission._pending_jobs),
         )
 
     @classmethod
@@ -58,8 +57,8 @@ class _SubmissionConverter(_AbstractConverter):
         submission._is_completed = model.is_completed
         submission._is_canceled = model.is_canceled
 
-        submission._running_jobs = _SelfSetterSet(submission, model.running_jobs)
-        submission._blocked_jobs = _SelfSetterSet(submission, model.blocked_jobs)
-        submission._pending_jobs = _SelfSetterSet(submission, model.pending_jobs)
+        submission._running_jobs = set(model.running_jobs)
+        submission._blocked_jobs = set(model.blocked_jobs)
+        submission._pending_jobs = set(model.pending_jobs)
 
         return submission

+ 47 - 53
taipy/core/submission/submission.py

@@ -19,7 +19,6 @@ from .._entity._labeled import _Labeled
 from .._entity._properties import _Properties
 from .._entity._reload import _Reloader, _self_reload, _self_setter
 from .._version._version_manager_factory import _VersionManagerFactory
-from ..common._self_setter_set import _SelfSetterSet
 from ..job.job import Job, JobId, Status
 from ..notification.event import Event, EventEntityType, EventOperation, _make_event
 from .submission_id import SubmissionId
@@ -73,9 +72,9 @@ class Submission(_Entity, _Labeled):
         self._is_completed = False
         self._is_canceled = False
 
-        self._running_jobs: _SelfSetterSet = _SelfSetterSet(self, list())
-        self._blocked_jobs: _SelfSetterSet = _SelfSetterSet(self, list())
-        self._pending_jobs: _SelfSetterSet = _SelfSetterSet(self, list())
+        self._running_jobs: Set = set()
+        self._blocked_jobs: Set = set()
+        self._pending_jobs: Set = set()
 
     @staticmethod
     def __new_id() -> str:
@@ -132,21 +131,6 @@ class Submission(_Entity, _Labeled):
 
         return jobs
 
-    @property
-    def running_jobs(self) -> Set[Job]:
-        self._running_jobs = _Reloader()._reload(self._MANAGER_NAME, self)._running_jobs
-        return self._running_jobs
-
-    @property
-    def blocked_jobs(self) -> Set[Job]:
-        self._blocked_jobs = _Reloader()._reload(self._MANAGER_NAME, self)._blocked_jobs
-        return self._blocked_jobs
-
-    @property
-    def pending_jobs(self) -> Set[Job]:
-        self._pending_jobs = _Reloader()._reload(self._MANAGER_NAME, self)._pending_jobs
-        return self._pending_jobs
-
     @jobs.setter  # type: ignore
     @_self_setter(_MANAGER_NAME)
     def jobs(self, jobs: Union[List[Job], List[JobId]]):
@@ -211,52 +195,62 @@ class Submission(_Entity, _Labeled):
         return self.creation_date.timestamp() >= other.creation_date.timestamp()
 
     def _update_submission_status(self, job: Job):
-        if self._submission_status == SubmissionStatus.FAILED:
-            return
+        from ._submission_manager_factory import _SubmissionManagerFactory
 
-        job_status = job.status
+        submission_manager = _SubmissionManagerFactory._build_manager()
 
-        if job_status == Status.FAILED:
-            self.submission_status = SubmissionStatus.FAILED  # type: ignore
+        submission = submission_manager._get(self)
+
+        if submission._submission_status == SubmissionStatus.FAILED:
             return
 
         with self.lock:
+            job_status = job.status
+
+            if job_status == Status.FAILED:
+                submission._submission_status = SubmissionStatus.FAILED
+                _SubmissionManagerFactory._build_manager()._set(submission)
+                return
             if job_status == Status.CANCELED:
-                self.is_canceled = True  # type: ignore
+                submission._is_canceled = True
             elif job_status == Status.BLOCKED:
-                self.blocked_jobs.add(job.id)
-                self.pending_jobs.discard(job.id)
+                submission._blocked_jobs.add(job.id)
+                submission._pending_jobs.discard(job.id)
             elif job_status == Status.PENDING or job_status == Status.SUBMITTED:
-                self.pending_jobs.add(job.id)
-                self.blocked_jobs.discard(job.id)
+                submission._pending_jobs.add(job.id)
+                submission._blocked_jobs.discard(job.id)
             elif job_status == Status.RUNNING:
-                self.running_jobs.add(job.id)
-                self.pending_jobs.discard(job.id)
+                submission._running_jobs.add(job.id)
+                submission._pending_jobs.discard(job.id)
             elif job_status == Status.COMPLETED or job_status == Status.SKIPPED:
-                self.is_completed = True  # type: ignore
-                self.blocked_jobs.discard(job.id)
-                self.pending_jobs.discard(job.id)
-                self.running_jobs.discard(job.id)
+                submission._is_completed = True  # type: ignore
+                submission._blocked_jobs.discard(job.id)
+                submission._pending_jobs.discard(job.id)
+                submission._running_jobs.discard(job.id)
             elif job_status == Status.ABANDONED:
-                self.is_abandoned = True  # type: ignore
-                self.running_jobs.discard(job.id)
-                self.blocked_jobs.discard(job.id)
-                self.pending_jobs.discard(job.id)
-
-        if self.is_canceled:
-            self.submission_status = SubmissionStatus.CANCELED  # type: ignore
-        elif self.is_abandoned:
-            self.submission_status = SubmissionStatus.UNDEFINED  # type: ignore
-        elif self.running_jobs:
-            self.submission_status = SubmissionStatus.RUNNING  # type: ignore
-        elif self.pending_jobs:
-            self.submission_status = SubmissionStatus.PENDING  # type: ignore
-        elif self.blocked_jobs:
-            self.submission_status = SubmissionStatus.BLOCKED  # type: ignore
-        elif self.is_completed:
-            self.submission_status = SubmissionStatus.COMPLETED  # type: ignore
+                submission._is_abandoned = True  # type: ignore
+                submission._running_jobs.discard(job.id)
+                submission._blocked_jobs.discard(job.id)
+                submission._pending_jobs.discard(job.id)
+
+        submission_manager._set(submission)
+
+        # The submission_status is set later to make sure notification for updating
+        # the submission_status attribute is triggered
+        if submission._is_canceled:
+            submission.submission_status = SubmissionStatus.CANCELED
+        elif submission._is_abandoned:
+            submission.submission_status = SubmissionStatus.UNDEFINED
+        elif submission._running_jobs:
+            submission.submission_status = SubmissionStatus.RUNNING
+        elif submission._pending_jobs:
+            submission.submission_status = SubmissionStatus.PENDING
+        elif submission._blocked_jobs:
+            submission.submission_status = SubmissionStatus.BLOCKED
+        elif submission._is_completed:
+            submission.submission_status = SubmissionStatus.COMPLETED
         else:
-            self.submission_status = SubmissionStatus.UNDEFINED  # type: ignore
+            submission.submission_status = SubmissionStatus.UNDEFINED
 
     def is_finished(self) -> bool:
         """Indicate if the submission is finished.

+ 3 - 4
tests/core/notification/test_events_published.py

@@ -175,16 +175,16 @@ def test_events_published_for_scenario_submission():
     # 1 submission update event for is_completed
     scenario.submit()
     snapshot = all_evts.capture()
-    assert len(snapshot.collected_events) == 18
+    assert len(snapshot.collected_events) == 17
     assert snapshot.entity_type_collected.get(EventEntityType.CYCLE, 0) == 0
     assert snapshot.entity_type_collected.get(EventEntityType.DATA_NODE, 0) == 7
     assert snapshot.entity_type_collected.get(EventEntityType.TASK, 0) == 0
     assert snapshot.entity_type_collected.get(EventEntityType.SEQUENCE, 0) == 0
     assert snapshot.entity_type_collected.get(EventEntityType.SCENARIO, 0) == 1
     assert snapshot.entity_type_collected.get(EventEntityType.JOB, 0) == 4
-    assert snapshot.entity_type_collected.get(EventEntityType.SUBMISSION, 0) == 6
+    assert snapshot.entity_type_collected.get(EventEntityType.SUBMISSION, 0) == 5
     assert snapshot.operation_collected.get(EventOperation.CREATION, 0) == 2
-    assert snapshot.operation_collected.get(EventOperation.UPDATE, 0) == 15
+    assert snapshot.operation_collected.get(EventOperation.UPDATE, 0) == 14
     assert snapshot.operation_collected.get(EventOperation.SUBMISSION, 0) == 1
 
     assert snapshot.attr_name_collected["last_edit_date"] == 1
@@ -194,7 +194,6 @@ def test_events_published_for_scenario_submission():
     assert snapshot.attr_name_collected["status"] == 3
     assert snapshot.attr_name_collected["jobs"] == 1
     assert snapshot.attr_name_collected["submission_status"] == 3
-    assert snapshot.attr_name_collected["is_completed"] == 1
 
     all_evts.stop()
 

+ 2 - 66
tests/core/submission/test_submission.py

@@ -353,72 +353,6 @@ def test_auto_set_and_reload():
     assert submission_2.submission_status == SubmissionStatus.PENDING
 
 
-def test_auto_set_and_reload_job_sets():
-    # pending_jobs, running_jobs, blocked_jobs have the same behavior
-    # so we will only test 1 attribute (pending_jobs) as representative
-
-    task = Task(config_id="name_1", properties={}, function=print, id=TaskId("task_1"))
-    submission_1 = Submission(task.id, task._ID_PREFIX, task.config_id, properties={})
-
-    _TaskManagerFactory._build_manager()._set(task)
-    _SubmissionManagerFactory._build_manager()._set(submission_1)
-
-    submission_2 = _SubmissionManagerFactory._build_manager()._get(submission_1)
-
-    # auto set & reload on pending_jobs attribute
-    assert len(submission_1.pending_jobs) == 0
-    assert len(submission_1.pending_jobs) == 0
-    submission_1.pending_jobs.add("job_id_1")
-    assert submission_1.pending_jobs.data == set(["job_id_1"])
-    assert submission_2.pending_jobs.data == set(["job_id_1"])
-
-    assert len(submission_1.pending_jobs) == 1
-    assert len(submission_1.pending_jobs) == 1
-    submission_2.pending_jobs.add("job_id_2")
-    assert submission_1.pending_jobs.data == set(["job_id_1", "job_id_2"])
-    assert submission_2.pending_jobs.data == set(["job_id_1", "job_id_2"])
-
-    submission_1.pending_jobs.add("job_id_tmp_1")
-    submission_2.pending_jobs.add("job_id_tmp_2")
-    assert submission_1.pending_jobs.data == set(["job_id_1", "job_id_2", "job_id_tmp_1", "job_id_tmp_2"])
-    assert submission_2.pending_jobs.data == set(["job_id_1", "job_id_2", "job_id_tmp_1", "job_id_tmp_2"])
-
-    submission_1.pending_jobs.remove("job_id_tmp_1")
-    assert submission_1.pending_jobs.data == set(["job_id_1", "job_id_2", "job_id_tmp_2"])
-    assert submission_2.pending_jobs.data == set(["job_id_1", "job_id_2", "job_id_tmp_2"])
-    submission_2.pending_jobs.remove("job_id_tmp_2")
-    assert submission_1.pending_jobs.data == set(["job_id_1", "job_id_2"])
-    assert submission_2.pending_jobs.data == set(["job_id_1", "job_id_2"])
-
-    submission_1.pending_jobs.add("job_id_tmp_1")
-    submission_2.pending_jobs.add("job_id_tmp_2")
-    assert submission_1.pending_jobs.data == set(["job_id_1", "job_id_2", "job_id_tmp_1", "job_id_tmp_2"])
-    assert submission_2.pending_jobs.data == set(["job_id_1", "job_id_2", "job_id_tmp_1", "job_id_tmp_2"])
-
-    submission_1.pending_jobs.discard("job_id_tmp_1")
-    assert submission_1.pending_jobs.data == set(["job_id_1", "job_id_2", "job_id_tmp_2"])
-    assert submission_2.pending_jobs.data == set(["job_id_1", "job_id_2", "job_id_tmp_2"])
-    submission_2.pending_jobs.discard("job_id_tmp_2")
-    assert submission_1.pending_jobs.data == set(["job_id_1", "job_id_2"])
-    assert submission_2.pending_jobs.data == set(["job_id_1", "job_id_2"])
-
-    submission_1.pending_jobs.add("job_id_tmp_1")
-    submission_2.pending_jobs.add("job_id_tmp_2")
-    assert submission_1.pending_jobs.data == set(["job_id_1", "job_id_2", "job_id_tmp_1", "job_id_tmp_2"])
-    assert submission_2.pending_jobs.data == set(["job_id_1", "job_id_2", "job_id_tmp_1", "job_id_tmp_2"])
-
-    submission_1.pending_jobs.pop()
-    assert len(submission_1.pending_jobs.data) == 3
-    assert len(submission_2.pending_jobs.data) == 3
-    submission_2.pending_jobs.pop()
-    assert len(submission_1.pending_jobs.data) == 2
-    assert len(submission_2.pending_jobs.data) == 2
-
-    submission_1.pending_jobs.clear()
-    assert len(submission_1.pending_jobs.data) == 0
-    assert len(submission_2.pending_jobs.data) == 0
-
-
 def test_auto_set_and_reload_properties():
     task = Task(config_id="name_1", properties={}, function=print, id=TaskId("task_1"))
     submission_1 = Submission(task.id, task._ID_PREFIX, task.config_id, properties={})
@@ -523,6 +457,7 @@ def test_auto_set_and_reload_properties():
 def test_update_submission_status_with_single_job_completed(job_statuses, expected_submission_statuses):
     job = MockJob("job_id", Status.SUBMITTED)
     submission = Submission("submission_id", "ENTITY_TYPE", "entity_config_id")
+    _SubmissionManagerFactory._build_manager()._set(submission)
 
     assert submission.submission_status == SubmissionStatus.SUBMITTED
 
@@ -535,6 +470,7 @@ def test_update_submission_status_with_single_job_completed(job_statuses, expect
 def __test_update_submission_status_with_two_jobs(job_ids, job_statuses, expected_submission_statuses):
     jobs = {job_id: MockJob(job_id, Status.SUBMITTED) for job_id in job_ids}
     submission = Submission("submission_id", "ENTITY_TYPE", "entity_config_id")
+    _SubmissionManagerFactory._build_manager()._set(submission)
 
     assert submission.submission_status == SubmissionStatus.SUBMITTED