iqm-station-control-client 7.0.0__tar.gz → 8.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/CHANGELOG.rst +18 -0
- {iqm_station_control_client-7.0.0/src/iqm_station_control_client.egg-info → iqm_station_control_client-8.0.0}/PKG-INFO +1 -1
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/iqm_server_client.py +8 -8
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/serializers/sweep_serializers.py +2 -2
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/station_control.py +8 -8
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/interface/models/__init__.py +1 -1
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/interface/models/jobs.py +24 -24
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/interface/models/monitor.py +3 -3
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/interface/models/sweep.py +2 -2
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0/src/iqm_station_control_client.egg-info}/PKG-INFO +1 -1
- iqm_station_control_client-8.0.0/version.txt +1 -0
- iqm_station_control_client-7.0.0/version.txt +0 -1
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/LICENSE.txt +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/MANIFEST.in +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/README.rst +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/docs/API.rst +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/docs/Makefile +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/docs/_static/css/custom.css +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/docs/_static/images/favicon.ico +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/docs/_static/images/logo.png +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/docs/_templates/autosummary-class-template.rst +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/docs/_templates/autosummary-module-template.rst +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/docs/changelog.rst +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/docs/conf.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/docs/index.rst +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/docs/license.rst +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/pyproject.toml +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/requirements/base.in +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/requirements/base.txt +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/setup.cfg +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/setup.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/__init__.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/__init__.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/error.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/grpc_utils.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/meta_class.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/proto/__init__.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/proto/calibration_pb2.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/proto/calibration_pb2.pyi +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/proto/calibration_pb2_grpc.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/proto/common_pb2.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/proto/common_pb2.pyi +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/proto/common_pb2_grpc.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/proto/job_pb2.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/proto/job_pb2.pyi +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/proto/job_pb2_grpc.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/proto/qc_pb2.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/proto/qc_pb2.pyi +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/proto/qc_pb2_grpc.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/proto/uuid_pb2.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/proto/uuid_pb2.pyi +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/proto/uuid_pb2_grpc.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/testing/__init__.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/iqm_server/testing/iqm_server_mock.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/list_models.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/serializers/__init__.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/serializers/channel_property_serializer.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/serializers/datetime_serializers.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/serializers/playlist_serializers.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/serializers/run_serializers.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/serializers/setting_node_serializer.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/serializers/struct_serializer.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/serializers/task_serializers.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/client/utils.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/interface/__init__.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/interface/list_with_meta.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/interface/models/dut.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/interface/models/observation.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/interface/models/observation_set.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/interface/models/run.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/interface/models/sequence.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/interface/models/type_aliases.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm/station_control/interface/pydantic_base.py +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm_station_control_client.egg-info/SOURCES.txt +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm_station_control_client.egg-info/dependency_links.txt +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm_station_control_client.egg-info/requires.txt +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/src/iqm_station_control_client.egg-info/top_level.txt +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/tests/.pylintrc +0 -0
- {iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/tests/__init__.py +0 -0
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
Changelog
|
|
3
3
|
=========
|
|
4
4
|
|
|
5
|
+
Version 8.0.0 (2025-06-12)
|
|
6
|
+
==========================
|
|
7
|
+
|
|
8
|
+
Breaking changes
|
|
9
|
+
----------------
|
|
10
|
+
|
|
11
|
+
- Rename `JobStatus` to `JobExecutorStatus` in order to reduce confusion with CoCos models.
|
|
12
|
+
- Rename some `JobExecutorStatus` statuses to be more descriptive.
|
|
13
|
+
|
|
14
|
+
Version 7.1.0 (2025-06-10)
|
|
15
|
+
==========================
|
|
16
|
+
|
|
17
|
+
Features
|
|
18
|
+
--------
|
|
19
|
+
|
|
20
|
+
- Update dependency on exa-common
|
|
21
|
+
|
|
22
|
+
|
|
5
23
|
Version 7.0.0 (2025-06-02)
|
|
6
24
|
==========================
|
|
7
25
|
|
|
@@ -49,7 +49,7 @@ from iqm.station_control.client.station_control import StationControlClient
|
|
|
49
49
|
from iqm.station_control.interface.models import (
|
|
50
50
|
DutData,
|
|
51
51
|
DutFieldData,
|
|
52
|
-
|
|
52
|
+
JobExecutorStatus,
|
|
53
53
|
Statuses,
|
|
54
54
|
SweepData,
|
|
55
55
|
SweepDefinition,
|
|
@@ -292,20 +292,20 @@ def payload_to_sweep(job_payload: bytes) -> SweepDefinition:
|
|
|
292
292
|
return sweep
|
|
293
293
|
|
|
294
294
|
|
|
295
|
-
def to_job_status(job_status: proto.JobStatus) ->
|
|
295
|
+
def to_job_status(job_status: proto.JobStatus) -> JobExecutorStatus:
|
|
296
296
|
match job_status:
|
|
297
297
|
case proto.JobStatus.IN_QUEUE:
|
|
298
|
-
return
|
|
298
|
+
return JobExecutorStatus.PENDING_EXECUTION
|
|
299
299
|
case proto.JobStatus.EXECUTING:
|
|
300
|
-
return
|
|
300
|
+
return JobExecutorStatus.EXECUTION_STARTED
|
|
301
301
|
case proto.JobStatus.FAILED:
|
|
302
|
-
return
|
|
302
|
+
return JobExecutorStatus.FAILED
|
|
303
303
|
case proto.JobStatus.COMPLETED:
|
|
304
|
-
return
|
|
304
|
+
return JobExecutorStatus.READY
|
|
305
305
|
case proto.JobStatus.INTERRUPTED:
|
|
306
|
-
return
|
|
306
|
+
return JobExecutorStatus.ABORTED
|
|
307
307
|
case proto.JobStatus.CANCELLED:
|
|
308
|
-
return
|
|
308
|
+
return JobExecutorStatus.ABORTED
|
|
309
309
|
raise ValueError(f"Unknown job status: '{job_status}'")
|
|
310
310
|
|
|
311
311
|
|
|
@@ -28,7 +28,7 @@ from exa.common.sweep.database_serialization import decode_and_validate_sweeps,
|
|
|
28
28
|
from iqm.station_control.client.serializers.datetime_serializers import deserialize_datetime, serialize_datetime
|
|
29
29
|
from iqm.station_control.client.serializers.playlist_serializers import pack_playlist, unpack_playlist
|
|
30
30
|
from iqm.station_control.interface.models import SweepData, SweepDefinition, SweepResults
|
|
31
|
-
from iqm.station_control.interface.models.jobs import
|
|
31
|
+
from iqm.station_control.interface.models.jobs import JobExecutorStatus
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
def serialize_sweep_definition(sweep_definition: SweepDefinition) -> SweepDefinitionProto:
|
|
@@ -91,7 +91,7 @@ def deserialize_sweep_data(data: dict) -> SweepData:
|
|
|
91
91
|
modified_timestamp=deserialize_datetime(data["modified_timestamp"]),
|
|
92
92
|
begin_timestamp=deserialize_datetime(data["begin_timestamp"]),
|
|
93
93
|
end_timestamp=deserialize_datetime(data["end_timestamp"]),
|
|
94
|
-
job_status=
|
|
94
|
+
job_status=JobExecutorStatus(data["job_status"]),
|
|
95
95
|
)
|
|
96
96
|
|
|
97
97
|
|
|
@@ -34,10 +34,10 @@ import requests
|
|
|
34
34
|
from exa.common.data.setting_node import SettingNode
|
|
35
35
|
from exa.common.data.value import ObservationValue
|
|
36
36
|
from exa.common.errors.server_errors import (
|
|
37
|
-
STATUS_CODE_TO_ERROR_MAPPING,
|
|
38
37
|
InternalServerError,
|
|
39
38
|
NotFoundError,
|
|
40
39
|
StationControlError,
|
|
40
|
+
map_from_status_code_to_error,
|
|
41
41
|
)
|
|
42
42
|
from exa.common.qcm_data.qcm_data_client import QCMDataClient
|
|
43
43
|
from iqm.station_control.client.list_models import (
|
|
@@ -88,7 +88,7 @@ from iqm.station_control.interface.models import (
|
|
|
88
88
|
SweepDefinition,
|
|
89
89
|
SweepResults,
|
|
90
90
|
)
|
|
91
|
-
from iqm.station_control.interface.models.jobs import JobData,
|
|
91
|
+
from iqm.station_control.interface.models.jobs import JobData, JobExecutorStatus
|
|
92
92
|
from iqm.station_control.interface.pydantic_base import PydanticBase
|
|
93
93
|
|
|
94
94
|
logger = logging.getLogger(__name__)
|
|
@@ -684,7 +684,7 @@ class StationControlClient:
|
|
|
684
684
|
update_progress_callback = update_progress_callback or (lambda status: None)
|
|
685
685
|
try:
|
|
686
686
|
job_status = self._poll_job_status_until_execution_start(job_id, update_progress_callback)
|
|
687
|
-
if
|
|
687
|
+
if JobExecutorStatus(job_status) not in JobExecutorStatus.terminal_statuses():
|
|
688
688
|
self._poll_job_status_until_terminal(job_id, update_progress_callback)
|
|
689
689
|
except KeyboardInterrupt as exc:
|
|
690
690
|
logger.info("Caught %s, revoking job %s", exc, job_id)
|
|
@@ -694,12 +694,12 @@ class StationControlClient:
|
|
|
694
694
|
|
|
695
695
|
def _poll_job_status_until_execution_start(
|
|
696
696
|
self, job_id: str, update_progress_callback: Callable[[Statuses], None]
|
|
697
|
-
) ->
|
|
697
|
+
) -> JobExecutorStatus:
|
|
698
698
|
# Keep polling job status as long as it's PENDING, and update progress with `update_progress_callback`.
|
|
699
699
|
max_seen_position = 0
|
|
700
700
|
while True:
|
|
701
701
|
job = self._poll_job(job_id)
|
|
702
|
-
if job.job_status >=
|
|
702
|
+
if job.job_status >= JobExecutorStatus.EXECUTION_STARTED:
|
|
703
703
|
if max_seen_position:
|
|
704
704
|
update_progress_callback([("Progress in queue", max_seen_position, max_seen_position)])
|
|
705
705
|
return job.job_status
|
|
@@ -721,14 +721,14 @@ class StationControlClient:
|
|
|
721
721
|
while True:
|
|
722
722
|
job = self._poll_job(job_id)
|
|
723
723
|
update_progress_callback(job.job_result.parallel_sweep_progress)
|
|
724
|
-
if job.job_status in
|
|
724
|
+
if job.job_status in JobExecutorStatus.terminal_statuses():
|
|
725
725
|
return
|
|
726
726
|
sleep(1)
|
|
727
727
|
|
|
728
728
|
def _poll_job(self, job_id: str) -> JobData:
|
|
729
729
|
response = self._send_request(requests.get, f"jobs/{job_id}")
|
|
730
730
|
job = JobData.model_validate(response.json())
|
|
731
|
-
if job.job_status ==
|
|
731
|
+
if job.job_status == JobExecutorStatus.FAILED:
|
|
732
732
|
raise InternalServerError(f"Job: {job.job_id}\n{job.job_error}")
|
|
733
733
|
return job
|
|
734
734
|
|
|
@@ -820,7 +820,7 @@ class StationControlClient:
|
|
|
820
820
|
except json.JSONDecodeError:
|
|
821
821
|
error_message = response.text
|
|
822
822
|
|
|
823
|
-
error_class =
|
|
823
|
+
error_class = map_from_status_code_to_error(response.status_code)
|
|
824
824
|
raise error_class(error_message)
|
|
825
825
|
return response
|
|
826
826
|
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
from iqm.station_control.interface.models.dut import DutData, DutFieldData
|
|
17
17
|
from iqm.station_control.interface.models.jobs import (
|
|
18
|
-
|
|
18
|
+
JobExecutorStatus,
|
|
19
19
|
)
|
|
20
20
|
from iqm.station_control.interface.models.observation import (
|
|
21
21
|
ObservationData,
|
|
@@ -26,7 +26,7 @@ from iqm.station_control.interface.pydantic_base import PydanticBase
|
|
|
26
26
|
class TimelineEntry(PydanticBase):
|
|
27
27
|
"""Status and timestamp pair as described in a job timeline."""
|
|
28
28
|
|
|
29
|
-
status:
|
|
29
|
+
status: JobExecutorStatus
|
|
30
30
|
timestamp: datetime
|
|
31
31
|
|
|
32
32
|
|
|
@@ -49,16 +49,16 @@ class JobData(PydanticBase):
|
|
|
49
49
|
"""Job response data model"""
|
|
50
50
|
|
|
51
51
|
job_id: UUID
|
|
52
|
-
job_status:
|
|
52
|
+
job_status: JobExecutorStatus
|
|
53
53
|
job_result: JobResult
|
|
54
54
|
job_error: JobError | None
|
|
55
55
|
position: int | None
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
@functools.total_ordering
|
|
59
|
-
class
|
|
59
|
+
class JobExecutorStatus(Enum):
|
|
60
60
|
"""Enumeration of different states a job can be in. The ordering of these statuses is important,
|
|
61
|
-
and execution logic relies on it. Thus if a new status is added, ensure that it is slotted
|
|
61
|
+
and execution logic relies on it. Thus, if a new status is added, ensure that it is slotted
|
|
62
62
|
in at the appropriate place. See the __lt__ implementation for further details.
|
|
63
63
|
"""
|
|
64
64
|
|
|
@@ -66,24 +66,24 @@ class JobStatus(Enum):
|
|
|
66
66
|
RECEIVED = "received"
|
|
67
67
|
|
|
68
68
|
# Validating the job
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
PREPARING_CALIBRATION = "preparing_calibration"
|
|
69
|
+
VALIDATION_STARTED = "validation_started"
|
|
70
|
+
VALIDATION_ENDED = "validation_ended"
|
|
73
71
|
|
|
74
72
|
# Running PulLA
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
73
|
+
FETCH_CALIBRATION_STARTED = "fetch_calibration_started"
|
|
74
|
+
FETCH_CALIBRATION_ENDED = "fetch_calibration_ended"
|
|
75
|
+
COMPILATION_STARTED = "compilation_started"
|
|
76
|
+
COMPILATION_ENDED = "compilation_ended"
|
|
78
77
|
|
|
79
78
|
# Executing sweep
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
SAVE_SWEEP_METADATA_STARTED = "save_sweep_metadata_started"
|
|
80
|
+
SAVE_SWEEP_METADATA_ENDED = "save_sweep_metadata_ended"
|
|
82
81
|
PENDING_EXECUTION = "pending_execution"
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
82
|
+
EXECUTION_STARTED = "execution_started"
|
|
83
|
+
EXECUTION_ENDED = "execution_ended"
|
|
84
|
+
POST_PROCESSING_PENDING = "post_processing_pending"
|
|
85
|
+
POST_PROCESSING_STARTED = "post_processing_started"
|
|
86
|
+
POST_PROCESSING_ENDED = "post_processing_ended"
|
|
87
87
|
READY = "ready"
|
|
88
88
|
|
|
89
89
|
# Job failed, can happen at any stage
|
|
@@ -101,10 +101,10 @@ class JobStatus(Enum):
|
|
|
101
101
|
def __eq__(self, other):
|
|
102
102
|
if isinstance(other, str):
|
|
103
103
|
try:
|
|
104
|
-
other =
|
|
104
|
+
other = JobExecutorStatus(other.lower())
|
|
105
105
|
except ValueError:
|
|
106
106
|
return False
|
|
107
|
-
elif not isinstance(other,
|
|
107
|
+
elif not isinstance(other, JobExecutorStatus):
|
|
108
108
|
return NotImplemented
|
|
109
109
|
return self.name == other.name
|
|
110
110
|
|
|
@@ -112,21 +112,21 @@ class JobStatus(Enum):
|
|
|
112
112
|
"""Enable comparison according to definition order.
|
|
113
113
|
|
|
114
114
|
Examples:
|
|
115
|
-
>>>
|
|
115
|
+
>>> JobExecutorStatus.VALIDATION_ENDED < JobExecutorStatus.COMPILATION_ENDED
|
|
116
116
|
True
|
|
117
117
|
|
|
118
118
|
"""
|
|
119
119
|
if isinstance(other, str):
|
|
120
120
|
try:
|
|
121
|
-
other =
|
|
121
|
+
other = JobExecutorStatus(other.lower())
|
|
122
122
|
except ValueError:
|
|
123
123
|
return NotImplemented
|
|
124
|
-
elif not isinstance(other,
|
|
124
|
+
elif not isinstance(other, JobExecutorStatus):
|
|
125
125
|
return NotImplemented
|
|
126
|
-
members = list(
|
|
126
|
+
members = list(JobExecutorStatus.__members__.values())
|
|
127
127
|
return members.index(self) < members.index(other)
|
|
128
128
|
|
|
129
129
|
@classmethod
|
|
130
|
-
def terminal_statuses(cls) -> set[
|
|
130
|
+
def terminal_statuses(cls) -> set[JobExecutorStatus]:
|
|
131
131
|
"""Statuses from which the execution can't continue."""
|
|
132
132
|
return {cls.ABORTED, cls.FAILED, cls.READY}
|
|
@@ -18,7 +18,7 @@ from __future__ import annotations
|
|
|
18
18
|
from datetime import datetime
|
|
19
19
|
from uuid import UUID
|
|
20
20
|
|
|
21
|
-
from iqm.station_control.interface.models import
|
|
21
|
+
from iqm.station_control.interface.models import JobExecutorStatus
|
|
22
22
|
from iqm.station_control.interface.pydantic_base import PydanticBase
|
|
23
23
|
|
|
24
24
|
|
|
@@ -26,7 +26,7 @@ class JobStateTimestamp(PydanticBase):
|
|
|
26
26
|
"""Represents a single timestamped state for a job."""
|
|
27
27
|
|
|
28
28
|
job_id: UUID
|
|
29
|
-
status:
|
|
29
|
+
status: JobExecutorStatus
|
|
30
30
|
timestamp: datetime
|
|
31
31
|
|
|
32
32
|
|
|
@@ -40,6 +40,6 @@ class JobsInQueue(PydanticBase):
|
|
|
40
40
|
class QueueState(PydanticBase):
|
|
41
41
|
"""Describes the state of a single job queue."""
|
|
42
42
|
|
|
43
|
-
queue:
|
|
43
|
+
queue: JobExecutorStatus
|
|
44
44
|
jobs_in_queue: int
|
|
45
45
|
completed_jobs: int
|
|
@@ -21,7 +21,7 @@ from iqm.models.playlist import Playlist
|
|
|
21
21
|
|
|
22
22
|
from exa.common.data.setting_node import SettingNode
|
|
23
23
|
from exa.common.sweep.util import NdSweep
|
|
24
|
-
from iqm.station_control.interface.models.jobs import
|
|
24
|
+
from iqm.station_control.interface.models.jobs import JobExecutorStatus
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
@dataclass(kw_only=True)
|
|
@@ -62,5 +62,5 @@ class SweepData(SweepBase):
|
|
|
62
62
|
"""Time when the sweep began in the station control."""
|
|
63
63
|
end_timestamp: datetime | None
|
|
64
64
|
"""Time when the sweep ended in the station control."""
|
|
65
|
-
job_status:
|
|
65
|
+
job_status: JobExecutorStatus
|
|
66
66
|
"""Status of sweep execution."""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
8.0.0
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
7.0.0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/docs/_static/css/custom.css
RENAMED
|
File without changes
|
|
File without changes
|
{iqm_station_control_client-7.0.0 → iqm_station_control_client-8.0.0}/docs/_static/images/logo.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|