iqm-station-control-client 9.4.0__tar.gz → 9.6.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-9.4.0 → iqm_station_control_client-9.6.0}/CHANGELOG.rst +16 -0
- {iqm_station_control_client-9.4.0/src/iqm_station_control_client.egg-info → iqm_station_control_client-9.6.0}/PKG-INFO +4 -1
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/pyproject.toml +8 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/requirements/base.in +3 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/requirements/base.txt +4 -1
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/grpc_utils.py +1 -1
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/iqm_server_client.py +10 -9
- iqm_station_control_client-9.6.0/src/iqm/station_control/client/py.typed +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/serializers/run_serializers.py +7 -7
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/serializers/sweep_serializers.py +3 -3
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/station_control.py +32 -32
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/interface/models/jobs.py +32 -5
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/interface/models/observation.py +3 -3
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/interface/models/observation_set.py +3 -3
- iqm_station_control_client-9.6.0/src/iqm/station_control/interface/py.typed +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/interface/station_control.py +5 -5
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0/src/iqm_station_control_client.egg-info}/PKG-INFO +4 -1
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm_station_control_client.egg-info/SOURCES.txt +2 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm_station_control_client.egg-info/requires.txt +3 -0
- iqm_station_control_client-9.6.0/version.txt +1 -0
- iqm_station_control_client-9.4.0/version.txt +0 -1
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/LICENSE.txt +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/MANIFEST.in +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/README.rst +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/docs/API.rst +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/docs/Makefile +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/docs/_static/css/custom.css +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/docs/_static/images/favicon.ico +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/docs/_static/images/logo.png +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/docs/_templates/autosummary-class-template.rst +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/docs/_templates/autosummary-module-template.rst +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/docs/changelog.rst +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/docs/conf.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/docs/index.rst +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/docs/license.rst +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/setup.cfg +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/setup.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/__init__.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/__init__.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/error.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/proto/__init__.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/proto/calibration_pb2.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/proto/calibration_pb2.pyi +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/proto/calibration_pb2_grpc.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/proto/common_pb2.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/proto/common_pb2.pyi +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/proto/common_pb2_grpc.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/proto/job_pb2.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/proto/job_pb2.pyi +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/proto/job_pb2_grpc.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/proto/qc_pb2.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/proto/qc_pb2.pyi +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/proto/qc_pb2_grpc.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/proto/uuid_pb2.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/proto/uuid_pb2.pyi +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/proto/uuid_pb2_grpc.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/testing/__init__.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/iqm_server/testing/iqm_server_mock.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/list_models.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/serializers/__init__.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/serializers/channel_property_serializer.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/serializers/datetime_serializers.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/serializers/playlist_serializers.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/serializers/setting_node_serializer.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/serializers/struct_serializer.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/serializers/task_serializers.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/client/utils.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/interface/__init__.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/interface/list_with_meta.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/interface/models/__init__.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/interface/models/dut.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/interface/models/dynamic_quantum_architecture.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/interface/models/monitor.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/interface/models/run.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/interface/models/sequence.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/interface/models/static_quantum_architecture.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/interface/models/sweep.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/interface/models/type_aliases.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm/station_control/interface/pydantic_base.py +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm_station_control_client.egg-info/dependency_links.txt +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/src/iqm_station_control_client.egg-info/top_level.txt +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/tests/.pylintrc +0 -0
- {iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/tests/__init__.py +0 -0
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
Changelog
|
|
3
3
|
=========
|
|
4
4
|
|
|
5
|
+
Version 9.6.0 (2025-07-09)
|
|
6
|
+
==========================
|
|
7
|
+
|
|
8
|
+
Features
|
|
9
|
+
--------
|
|
10
|
+
|
|
11
|
+
- Enable mypy type checking in CI and add temporary type ignores to the source code. :issue:`SW-1615`
|
|
12
|
+
|
|
13
|
+
Version 9.5.0 (2025-07-07)
|
|
14
|
+
==========================
|
|
15
|
+
|
|
16
|
+
Features
|
|
17
|
+
--------
|
|
18
|
+
|
|
19
|
+
- Improve documentation.
|
|
20
|
+
|
|
5
21
|
Version 9.4.0 (2025-06-26)
|
|
6
22
|
==========================
|
|
7
23
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: iqm-station-control-client
|
|
3
|
-
Version: 9.
|
|
3
|
+
Version: 9.6.0
|
|
4
4
|
Summary: Python client for communicating with Station Control Service
|
|
5
5
|
Author-email: IQM Finland Oy <info@meetiqm.com>
|
|
6
6
|
License: Apache License
|
|
@@ -217,11 +217,14 @@ Requires-Dist: iqm-exa-common<27,>=26
|
|
|
217
217
|
Requires-Dist: iqm-data-definitions<3.0,>=2.13
|
|
218
218
|
Requires-Dist: opentelemetry-exporter-otlp==1.25.0
|
|
219
219
|
Requires-Dist: protobuf<5.0,>=4.25.3
|
|
220
|
+
Requires-Dist: types-protobuf
|
|
220
221
|
Requires-Dist: grpcio<2.0,>=1.65.4
|
|
221
222
|
Requires-Dist: pydantic<3.0,>=2.10.4
|
|
222
223
|
Requires-Dist: PyYAML==6.0
|
|
223
224
|
Requires-Dist: requests==2.32.3
|
|
225
|
+
Requires-Dist: types-requests
|
|
224
226
|
Requires-Dist: tqdm>=4.59.0
|
|
227
|
+
Requires-Dist: types-tqdm
|
|
225
228
|
|
|
226
229
|
Station control client library
|
|
227
230
|
==============================
|
|
@@ -21,6 +21,14 @@ file = "LICENSE.txt"
|
|
|
21
21
|
Documentation = "https://iqm-finland.github.io/docs/iqm-station-control-client/"
|
|
22
22
|
Homepage = "https://pypi.org/project/iqm-station-control-client/"
|
|
23
23
|
|
|
24
|
+
[tool.mypy]
|
|
25
|
+
explicit_package_bases = true
|
|
26
|
+
mypy_path = "$MYPY_CONFIG_FILE_DIR/src"
|
|
27
|
+
namespace_packages = true
|
|
28
|
+
[[tool.mypy.overrides]]
|
|
29
|
+
module = [ "iqm.data_definitions.*", "iqm.models.*", "daemon.*", "quimb.*", "qiskit.*", "qiskit_aer.*", "grpc.*", "lmfit.*", "emukit.*", "mockito.*", "sklearn.*", "dill.*", "uncertainties.*", "GPy.*", "pythonjsonlogger.*",]
|
|
30
|
+
ignore_missing_imports = true
|
|
31
|
+
|
|
24
32
|
[tool.ruff]
|
|
25
33
|
exclude = [ "*.ipynb", "*.rst",]
|
|
26
34
|
extend-exclude = [ "src/iqm/station_control/client/iqm_server/proto",]
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
iqm-data-definitions >= 2.13, < 3.0
|
|
2
2
|
opentelemetry-exporter-otlp == 1.25.0
|
|
3
3
|
protobuf >= 4.25.3, < 5.0
|
|
4
|
+
types-protobuf
|
|
4
5
|
grpcio >= 1.65.4, < 2.0
|
|
5
6
|
pydantic >= 2.10.4, <3.0
|
|
6
7
|
PyYAML == 6.0
|
|
7
8
|
requests == 2.32.3
|
|
9
|
+
types-requests
|
|
8
10
|
tqdm >= 4.59.0
|
|
11
|
+
types-tqdm
|
|
@@ -2,8 +2,11 @@ iqm-exa-common>=26,<27
|
|
|
2
2
|
iqm-data-definitions >= 2.13, < 3.0
|
|
3
3
|
opentelemetry-exporter-otlp == 1.25.0
|
|
4
4
|
protobuf >= 4.25.3, < 5.0
|
|
5
|
+
types-protobuf
|
|
5
6
|
grpcio >= 1.65.4, < 2.0
|
|
6
7
|
pydantic >= 2.10.4, <3.0
|
|
7
8
|
PyYAML == 6.0
|
|
8
9
|
requests == 2.32.3
|
|
9
|
-
|
|
10
|
+
types-requests
|
|
11
|
+
tqdm >= 4.59.0
|
|
12
|
+
types-tqdm
|
|
@@ -152,5 +152,5 @@ def extract_error(error: grpc.RpcError, title: str | None = None) -> IqmServerEr
|
|
|
152
152
|
message=f"{title}: {message}" if title else message,
|
|
153
153
|
status_code=status_code,
|
|
154
154
|
error_code=error_code,
|
|
155
|
-
details=details,
|
|
155
|
+
details=details, # type: ignore[arg-type]
|
|
156
156
|
)
|
|
@@ -146,7 +146,7 @@ class IqmServerClient(_StationControlClientBase):
|
|
|
146
146
|
# right after submitting it so we can cache reference to the submitted sweep here
|
|
147
147
|
# to avoid extra request to the server
|
|
148
148
|
job_id = from_proto_uuid(job.id)
|
|
149
|
-
self._latest_submitted_sweep = dataclasses.replace(sweep_definition, sweep_id=job_id)
|
|
149
|
+
self._latest_submitted_sweep = dataclasses.replace(sweep_definition, sweep_id=job_id) # type: ignore[assignment]
|
|
150
150
|
return {
|
|
151
151
|
"job_id": str(job_id),
|
|
152
152
|
}
|
|
@@ -194,12 +194,12 @@ class IqmServerClient(_StationControlClientBase):
|
|
|
194
194
|
def get_run(self, run_id: UUID) -> RunData:
|
|
195
195
|
raise NotImplementedError
|
|
196
196
|
|
|
197
|
-
def query_runs(self, **kwargs) -> ListWithMeta[RunLite]:
|
|
197
|
+
def query_runs(self, **kwargs) -> ListWithMeta[RunLite]: # type: ignore[type-arg]
|
|
198
198
|
raise NotImplementedError
|
|
199
199
|
|
|
200
200
|
def create_observations(
|
|
201
201
|
self, observation_definitions: Sequence[ObservationDefinition]
|
|
202
|
-
) -> ListWithMeta[ObservationData]:
|
|
202
|
+
) -> ListWithMeta[ObservationData]: # type: ignore[type-arg]
|
|
203
203
|
raise NotImplementedError
|
|
204
204
|
|
|
205
205
|
def get_observations(
|
|
@@ -216,13 +216,13 @@ class IqmServerClient(_StationControlClientBase):
|
|
|
216
216
|
) -> list[ObservationData]:
|
|
217
217
|
raise NotImplementedError
|
|
218
218
|
|
|
219
|
-
def query_observations(self, **kwargs) -> ListWithMeta[ObservationData]:
|
|
219
|
+
def query_observations(self, **kwargs) -> ListWithMeta[ObservationData]: # type: ignore[type-arg]
|
|
220
220
|
raise NotImplementedError
|
|
221
221
|
|
|
222
222
|
def update_observations(self, observation_updates: Sequence[ObservationUpdate]) -> list[ObservationData]:
|
|
223
223
|
raise NotImplementedError
|
|
224
224
|
|
|
225
|
-
def query_observation_sets(self, **kwargs) -> ListWithMeta[ObservationSetData]:
|
|
225
|
+
def query_observation_sets(self, **kwargs) -> ListWithMeta[ObservationSetData]: # type: ignore[type-arg]
|
|
226
226
|
raise NotImplementedError
|
|
227
227
|
|
|
228
228
|
def create_observation_set(self, observation_set_definition: ObservationSetDefinition) -> ObservationSetData:
|
|
@@ -260,14 +260,15 @@ class IqmServerClient(_StationControlClientBase):
|
|
|
260
260
|
raise NotImplementedError
|
|
261
261
|
|
|
262
262
|
def get_duts(self) -> list[DutData]:
|
|
263
|
-
return self._get_resource("duts", lambda data: DutList.model_validate(parse_json(data)))
|
|
263
|
+
return self._get_resource("duts", lambda data: DutList.model_validate(parse_json(data))) # type: ignore[arg-type,return-value]
|
|
264
264
|
|
|
265
265
|
def get_dut_fields(self, dut_label: str) -> list[DutFieldData]:
|
|
266
266
|
return self._get_resource(
|
|
267
|
-
f"dut-fields/{dut_label}",
|
|
267
|
+
f"dut-fields/{dut_label}",
|
|
268
|
+
lambda data: DutFieldDataList.model_validate(parse_json(data)), # type: ignore[arg-type,return-value]
|
|
268
269
|
)
|
|
269
270
|
|
|
270
|
-
def query_sequence_metadatas(self, **kwargs) -> ListWithMeta[SequenceMetadataData]:
|
|
271
|
+
def query_sequence_metadatas(self, **kwargs) -> ListWithMeta[SequenceMetadataData]: # type: ignore[type-arg]
|
|
271
272
|
raise NotImplementedError
|
|
272
273
|
|
|
273
274
|
def create_sequence_metadata(
|
|
@@ -291,7 +292,7 @@ class IqmServerClient(_StationControlClientBase):
|
|
|
291
292
|
job: proto.JobV1 = jobs.GetJobV1(proto.JobLookupV1(id=to_proto_uuid(job_id)))
|
|
292
293
|
return JobData(
|
|
293
294
|
job_id=from_proto_uuid(job.id),
|
|
294
|
-
job_status=job.status,
|
|
295
|
+
job_status=job.status, # type: ignore[arg-type]
|
|
295
296
|
job_result=JobResult(
|
|
296
297
|
job_id=from_proto_uuid(job.id),
|
|
297
298
|
parallel_sweep_progress=[],
|
|
File without changes
|
|
@@ -40,8 +40,8 @@ def serialize_run_definition(run_definition: RunDefinition) -> RunDefinitionProt
|
|
|
40
40
|
username=run_definition.username,
|
|
41
41
|
experiment_name=run_definition.experiment_name,
|
|
42
42
|
experiment_label=run_definition.experiment_label,
|
|
43
|
-
options=serialize_struct(run_definition.options),
|
|
44
|
-
additional_run_properties=serialize_struct(run_definition.additional_run_properties),
|
|
43
|
+
options=serialize_struct(run_definition.options), # type: ignore[arg-type]
|
|
44
|
+
additional_run_properties=serialize_struct(run_definition.additional_run_properties), # type: ignore[arg-type]
|
|
45
45
|
software_version_set_id=run_definition.software_version_set_id,
|
|
46
46
|
components=run_definition.components,
|
|
47
47
|
default_data_parameters=run_definition.default_data_parameters,
|
|
@@ -50,7 +50,7 @@ def serialize_run_definition(run_definition: RunDefinition) -> RunDefinitionProt
|
|
|
50
50
|
run_definition_proto.sweep_definition_payload.Pack(
|
|
51
51
|
serialize_sweep_definition(run_definition.sweep_definition), type_url_prefix="iqm-data-definitions"
|
|
52
52
|
)
|
|
53
|
-
for key, sweep in run_definition.hard_sweeps.items():
|
|
53
|
+
for key, sweep in run_definition.hard_sweeps.items(): # type: ignore[union-attr]
|
|
54
54
|
run_definition_proto.hard_sweeps[key].CopyFrom(proto_serialization.nd_sweep.pack(sweep, minimal=False))
|
|
55
55
|
return run_definition_proto
|
|
56
56
|
|
|
@@ -94,7 +94,7 @@ def serialize_run_data(run_data: RunData) -> dict:
|
|
|
94
94
|
"options": run_data.options,
|
|
95
95
|
"additional_run_properties": run_data.additional_run_properties,
|
|
96
96
|
"software_version_set_id": run_data.software_version_set_id,
|
|
97
|
-
"hard_sweeps": {key: encode_nd_sweeps(value) for key, value in run_data.hard_sweeps.items()},
|
|
97
|
+
"hard_sweeps": {key: encode_nd_sweeps(value) for key, value in run_data.hard_sweeps.items()}, # type: ignore[union-attr]
|
|
98
98
|
"components": run_data.components,
|
|
99
99
|
"default_data_parameters": run_data.default_data_parameters,
|
|
100
100
|
"default_sweep_parameters": run_data.default_sweep_parameters,
|
|
@@ -124,8 +124,8 @@ def deserialize_run_data(data: dict) -> RunData:
|
|
|
124
124
|
default_data_parameters=data["default_data_parameters"],
|
|
125
125
|
default_sweep_parameters=data["default_sweep_parameters"],
|
|
126
126
|
sweep_data=deserialize_sweep_data(data["sweep_data"]),
|
|
127
|
-
created_timestamp=deserialize_datetime(data["created_timestamp"]),
|
|
128
|
-
modified_timestamp=deserialize_datetime(data["modified_timestamp"]),
|
|
129
|
-
begin_timestamp=deserialize_datetime(data["begin_timestamp"]),
|
|
127
|
+
created_timestamp=deserialize_datetime(data["created_timestamp"]), # type: ignore[arg-type]
|
|
128
|
+
modified_timestamp=deserialize_datetime(data["modified_timestamp"]), # type: ignore[arg-type]
|
|
129
|
+
begin_timestamp=deserialize_datetime(data["begin_timestamp"]), # type: ignore[arg-type]
|
|
130
130
|
end_timestamp=deserialize_datetime(data["end_timestamp"]),
|
|
131
131
|
)
|
|
@@ -84,10 +84,10 @@ def deserialize_sweep_data(data: dict) -> SweepData:
|
|
|
84
84
|
sweep_id=uuid.UUID(data["sweep_id"]),
|
|
85
85
|
dut_label=data["dut_label"],
|
|
86
86
|
settings=SettingNode(**json.loads(data["settings"])),
|
|
87
|
-
sweeps=decode_and_validate_sweeps(data["sweeps"]),
|
|
87
|
+
sweeps=decode_and_validate_sweeps(data["sweeps"]), # type: ignore[arg-type]
|
|
88
88
|
return_parameters=data["return_parameters"],
|
|
89
|
-
created_timestamp=deserialize_datetime(data["created_timestamp"]),
|
|
90
|
-
modified_timestamp=deserialize_datetime(data["modified_timestamp"]),
|
|
89
|
+
created_timestamp=deserialize_datetime(data["created_timestamp"]), # type: ignore[arg-type]
|
|
90
|
+
modified_timestamp=deserialize_datetime(data["modified_timestamp"]), # type: ignore[arg-type]
|
|
91
91
|
begin_timestamp=deserialize_datetime(data["begin_timestamp"]),
|
|
92
92
|
end_timestamp=deserialize_datetime(data["end_timestamp"]),
|
|
93
93
|
job_status=JobExecutorStatus(data["job_status"]),
|
|
@@ -186,7 +186,7 @@ class _StationControlClientBase(StationControlInterface):
|
|
|
186
186
|
error_message = response.text
|
|
187
187
|
|
|
188
188
|
try:
|
|
189
|
-
error_class = map_from_status_code_to_error(response.status_code)
|
|
189
|
+
error_class = map_from_status_code_to_error(response.status_code) # type: ignore[arg-type]
|
|
190
190
|
except KeyError:
|
|
191
191
|
raise RuntimeError(f"Unexpected response status code {response.status_code}: {error_message}")
|
|
192
192
|
|
|
@@ -350,14 +350,14 @@ class StationControlClient(_StationControlClientBase):
|
|
|
350
350
|
response = self._send_request(requests.get, f"runs/{run_id}")
|
|
351
351
|
return deserialize_run_data(response.json())
|
|
352
352
|
|
|
353
|
-
def query_runs(self, **kwargs) -> ListWithMeta[RunLite]:
|
|
353
|
+
def query_runs(self, **kwargs) -> ListWithMeta[RunLite]: # type: ignore[type-arg]
|
|
354
354
|
params = self._clean_query_parameters(RunData, **kwargs)
|
|
355
355
|
response = self._send_request(requests.get, "runs", params=params)
|
|
356
356
|
return self._deserialize_response(response, RunLiteList, list_with_meta=True)
|
|
357
357
|
|
|
358
358
|
def create_observations(
|
|
359
359
|
self, observation_definitions: Sequence[ObservationDefinition]
|
|
360
|
-
) -> ListWithMeta[ObservationData]:
|
|
360
|
+
) -> ListWithMeta[ObservationData]: # type: ignore[type-arg]
|
|
361
361
|
json_str = self._serialize_model(ObservationDefinitionList(observation_definitions))
|
|
362
362
|
response = self._send_request(requests.post, "observations", json_str=json_str)
|
|
363
363
|
return self._deserialize_response(response, ObservationDataList, list_with_meta=True)
|
|
@@ -370,8 +370,8 @@ class StationControlClient(_StationControlClientBase):
|
|
|
370
370
|
dut_field: str | None = None,
|
|
371
371
|
tags: list[str] | None = None,
|
|
372
372
|
invalid: bool | None = False,
|
|
373
|
-
run_ids: list[StrUUID] | None = None,
|
|
374
|
-
sequence_ids: list[StrUUID] | None = None,
|
|
373
|
+
run_ids: list[StrUUID] | None = None, # type: ignore[override]
|
|
374
|
+
sequence_ids: list[StrUUID] | None = None, # type: ignore[override]
|
|
375
375
|
limit: int | None = None,
|
|
376
376
|
) -> list[ObservationData]:
|
|
377
377
|
kwargs = {
|
|
@@ -388,7 +388,7 @@ class StationControlClient(_StationControlClientBase):
|
|
|
388
388
|
response = self._send_request(requests.get, "observations", params=params)
|
|
389
389
|
return self._deserialize_response(response, ObservationDataList)
|
|
390
390
|
|
|
391
|
-
def query_observations(self, **kwargs) -> ListWithMeta[ObservationData]:
|
|
391
|
+
def query_observations(self, **kwargs) -> ListWithMeta[ObservationData]: # type: ignore[type-arg]
|
|
392
392
|
params = self._clean_query_parameters(ObservationData, **kwargs)
|
|
393
393
|
response = self._send_request(requests.get, "observations", params=params)
|
|
394
394
|
return self._deserialize_response(response, ObservationDataList, list_with_meta=True)
|
|
@@ -398,7 +398,7 @@ class StationControlClient(_StationControlClientBase):
|
|
|
398
398
|
response = self._send_request(requests.patch, "observations", json_str=json_str)
|
|
399
399
|
return self._deserialize_response(response, ObservationDataList)
|
|
400
400
|
|
|
401
|
-
def query_observation_sets(self, **kwargs) -> ListWithMeta[ObservationSetData]:
|
|
401
|
+
def query_observation_sets(self, **kwargs) -> ListWithMeta[ObservationSetData]: # type: ignore[type-arg]
|
|
402
402
|
params = self._clean_query_parameters(ObservationSetData, **kwargs)
|
|
403
403
|
response = self._send_request(requests.get, "observation-sets", params=params)
|
|
404
404
|
return self._deserialize_response(response, ObservationSetDataList, list_with_meta=True)
|
|
@@ -406,16 +406,16 @@ class StationControlClient(_StationControlClientBase):
|
|
|
406
406
|
def create_observation_set(self, observation_set_definition: ObservationSetDefinition) -> ObservationSetData:
|
|
407
407
|
json_str = self._serialize_model(observation_set_definition)
|
|
408
408
|
response = self._send_request(requests.post, "observation-sets", json_str=json_str)
|
|
409
|
-
return self._deserialize_response(response, ObservationSetData)
|
|
409
|
+
return self._deserialize_response(response, ObservationSetData) # type: ignore[return-value]
|
|
410
410
|
|
|
411
411
|
def get_observation_set(self, observation_set_id: StrUUID) -> ObservationSetData:
|
|
412
412
|
response = self._send_request(requests.get, f"observation-sets/{observation_set_id}")
|
|
413
|
-
return self._deserialize_response(response, ObservationSetData)
|
|
413
|
+
return self._deserialize_response(response, ObservationSetData) # type: ignore[return-value]
|
|
414
414
|
|
|
415
415
|
def update_observation_set(self, observation_set_update: ObservationSetUpdate) -> ObservationSetData:
|
|
416
416
|
json_str = self._serialize_model(observation_set_update)
|
|
417
417
|
response = self._send_request(requests.patch, "observation-sets", json_str=json_str)
|
|
418
|
-
return self._deserialize_response(response, ObservationSetData)
|
|
418
|
+
return self._deserialize_response(response, ObservationSetData) # type: ignore[return-value]
|
|
419
419
|
|
|
420
420
|
def finalize_observation_set(self, observation_set_id: StrUUID) -> None:
|
|
421
421
|
self._send_request(requests.post, f"observation-sets/{observation_set_id}/finalize")
|
|
@@ -426,7 +426,7 @@ class StationControlClient(_StationControlClientBase):
|
|
|
426
426
|
|
|
427
427
|
def get_default_calibration_set(self) -> ObservationSetData:
|
|
428
428
|
response = self._send_request(requests.get, "calibration-sets/default")
|
|
429
|
-
return self._deserialize_response(response, ObservationSetData)
|
|
429
|
+
return self._deserialize_response(response, ObservationSetData) # type: ignore[return-value]
|
|
430
430
|
|
|
431
431
|
def get_default_calibration_set_observations(self) -> list[ObservationLite]:
|
|
432
432
|
response = self._send_request(requests.get, "calibration-sets/default/observations")
|
|
@@ -434,22 +434,22 @@ class StationControlClient(_StationControlClientBase):
|
|
|
434
434
|
|
|
435
435
|
def get_default_dynamic_quantum_architecture(self) -> DynamicQuantumArchitecture:
|
|
436
436
|
response = self._send_request(requests.get, "calibration-sets/default/dynamic-quantum-architecture")
|
|
437
|
-
return self._deserialize_response(response, DynamicQuantumArchitecture)
|
|
437
|
+
return self._deserialize_response(response, DynamicQuantumArchitecture) # type: ignore[return-value]
|
|
438
438
|
|
|
439
439
|
@cache
|
|
440
440
|
def get_dynamic_quantum_architecture(self, calibration_set_id: StrUUID) -> DynamicQuantumArchitecture:
|
|
441
441
|
response = self._send_request(
|
|
442
442
|
requests.get, f"calibration-sets/{calibration_set_id}/dynamic-quantum-architecture"
|
|
443
443
|
)
|
|
444
|
-
return self._deserialize_response(response, DynamicQuantumArchitecture)
|
|
444
|
+
return self._deserialize_response(response, DynamicQuantumArchitecture) # type: ignore[return-value]
|
|
445
445
|
|
|
446
446
|
def get_default_calibration_set_quality_metrics(self) -> QualityMetrics:
|
|
447
447
|
response = self._send_request(requests.get, "calibration-sets/default/metrics")
|
|
448
|
-
return self._deserialize_response(response, QualityMetrics)
|
|
448
|
+
return self._deserialize_response(response, QualityMetrics) # type: ignore[return-value]
|
|
449
449
|
|
|
450
450
|
def get_calibration_set_quality_metrics(self, calibration_set_id: StrUUID) -> QualityMetrics:
|
|
451
451
|
response = self._send_request(requests.get, f"calibration-sets/{calibration_set_id}/metrics")
|
|
452
|
-
return self._deserialize_response(response, QualityMetrics)
|
|
452
|
+
return self._deserialize_response(response, QualityMetrics) # type: ignore[return-value]
|
|
453
453
|
|
|
454
454
|
def get_duts(self) -> list[DutData]:
|
|
455
455
|
response = self._send_request(requests.get, "duts")
|
|
@@ -460,7 +460,7 @@ class StationControlClient(_StationControlClientBase):
|
|
|
460
460
|
response = self._send_request(requests.get, "dut-fields", params=params)
|
|
461
461
|
return self._deserialize_response(response, DutFieldDataList)
|
|
462
462
|
|
|
463
|
-
def query_sequence_metadatas(self, **kwargs) -> ListWithMeta[SequenceMetadataData]:
|
|
463
|
+
def query_sequence_metadatas(self, **kwargs) -> ListWithMeta[SequenceMetadataData]: # type: ignore[type-arg]
|
|
464
464
|
params = self._clean_query_parameters(SequenceMetadataData, **kwargs)
|
|
465
465
|
response = self._send_request(requests.get, "sequence-metadatas", params=params)
|
|
466
466
|
return self._deserialize_response(response, SequenceMetadataDataList, list_with_meta=True)
|
|
@@ -470,7 +470,7 @@ class StationControlClient(_StationControlClientBase):
|
|
|
470
470
|
) -> SequenceMetadataData:
|
|
471
471
|
json_str = self._serialize_model(sequence_metadata_definition)
|
|
472
472
|
response = self._send_request(requests.post, "sequence-metadatas", json_str=json_str)
|
|
473
|
-
return self._deserialize_response(response, SequenceMetadataData)
|
|
473
|
+
return self._deserialize_response(response, SequenceMetadataData) # type: ignore[return-value]
|
|
474
474
|
|
|
475
475
|
def save_sequence_result(self, sequence_result_definition: SequenceResultDefinition) -> SequenceResultData:
|
|
476
476
|
# FIXME: We don't have information if the object was created or updated. Thus, server always responds 200 (OK).
|
|
@@ -478,20 +478,20 @@ class StationControlClient(_StationControlClientBase):
|
|
|
478
478
|
response = self._send_request(
|
|
479
479
|
requests.put, f"sequence-results/{sequence_result_definition.sequence_id}", json_str=json_str
|
|
480
480
|
)
|
|
481
|
-
return self._deserialize_response(response, SequenceResultData)
|
|
481
|
+
return self._deserialize_response(response, SequenceResultData) # type: ignore[return-value]
|
|
482
482
|
|
|
483
483
|
def get_sequence_result(self, sequence_id: StrUUID) -> SequenceResultData:
|
|
484
484
|
response = self._send_request(requests.get, f"sequence-results/{sequence_id}")
|
|
485
|
-
return self._deserialize_response(response, SequenceResultData)
|
|
485
|
+
return self._deserialize_response(response, SequenceResultData) # type: ignore[return-value]
|
|
486
486
|
|
|
487
487
|
@cache
|
|
488
488
|
def get_static_quantum_architecture(self, dut_label: str) -> StaticQuantumArchitecture:
|
|
489
489
|
response = self._send_request(requests.get, f"static-quantum-architectures/{dut_label}")
|
|
490
|
-
return self._deserialize_response(response, StaticQuantumArchitecture)
|
|
490
|
+
return self._deserialize_response(response, StaticQuantumArchitecture) # type: ignore[return-value]
|
|
491
491
|
|
|
492
492
|
def get_job(self, job_id: StrUUID) -> JobData:
|
|
493
493
|
response = self._send_request(requests.get, f"jobs/{job_id}")
|
|
494
|
-
return self._deserialize_response(response, JobData)
|
|
494
|
+
return self._deserialize_response(response, JobData) # type: ignore[return-value]
|
|
495
495
|
|
|
496
496
|
def abort_job(self, job_id: StrUUID) -> None:
|
|
497
497
|
self._send_request(requests.post, f"jobs/{job_id}/abort")
|
|
@@ -516,7 +516,7 @@ class StationControlClient(_StationControlClientBase):
|
|
|
516
516
|
max_seen_position = 0
|
|
517
517
|
while True:
|
|
518
518
|
job = self._poll_job(job_id)
|
|
519
|
-
if job.job_status >= JobExecutorStatus.EXECUTION_STARTED:
|
|
519
|
+
if job.job_status >= JobExecutorStatus.EXECUTION_STARTED: # type: ignore[operator]
|
|
520
520
|
if max_seen_position:
|
|
521
521
|
update_progress_callback([("Progress in queue", max_seen_position, max_seen_position)])
|
|
522
522
|
return job.job_status
|
|
@@ -525,8 +525,8 @@ class StationControlClient(_StationControlClientBase):
|
|
|
525
525
|
if position == 0:
|
|
526
526
|
sleep(1)
|
|
527
527
|
continue
|
|
528
|
-
max_seen_position = max(max_seen_position, position)
|
|
529
|
-
update_progress_callback([("Progress in queue", max_seen_position - position, max_seen_position)])
|
|
528
|
+
max_seen_position = max(max_seen_position, position) # type: ignore[type-var,assignment]
|
|
529
|
+
update_progress_callback([("Progress in queue", max_seen_position - position, max_seen_position)]) # type: ignore[operator]
|
|
530
530
|
sleep(1)
|
|
531
531
|
|
|
532
532
|
def _poll_job_status_until_terminal(
|
|
@@ -545,9 +545,9 @@ class StationControlClient(_StationControlClientBase):
|
|
|
545
545
|
def _poll_job(self, job_id: str) -> JobData:
|
|
546
546
|
response = self._send_request(requests.get, f"jobs/{job_id}")
|
|
547
547
|
job = self._deserialize_response(response, JobData)
|
|
548
|
-
if job.job_status == JobExecutorStatus.FAILED:
|
|
549
|
-
raise InternalServerError(f"Job: {job.job_id}\n{job.job_error}")
|
|
550
|
-
return job
|
|
548
|
+
if job.job_status == JobExecutorStatus.FAILED: # type: ignore[union-attr]
|
|
549
|
+
raise InternalServerError(f"Job: {job.job_id}\n{job.job_error}") # type: ignore[union-attr] # type: ignore[union-attr]
|
|
550
|
+
return job # type: ignore[return-value]
|
|
551
551
|
|
|
552
552
|
@staticmethod
|
|
553
553
|
def _serialize_model(model: BaseModel) -> str:
|
|
@@ -612,22 +612,22 @@ class StationControlClient(_StationControlClientBase):
|
|
|
612
612
|
@staticmethod
|
|
613
613
|
def _deserialize_response(
|
|
614
614
|
response: requests.Response,
|
|
615
|
-
model_class: type[TypePydanticBase | ListModel[list[TypePydanticBase]]],
|
|
615
|
+
model_class: type[TypePydanticBase | ListModel[list[TypePydanticBase]]], # type: ignore[type-arg]
|
|
616
616
|
*,
|
|
617
617
|
list_with_meta: bool = False,
|
|
618
|
-
) -> TypePydanticBase | ListWithMeta[TypePydanticBase]:
|
|
618
|
+
) -> TypePydanticBase | ListWithMeta[TypePydanticBase]: # type: ignore[type-arg]
|
|
619
619
|
# Use "model_validate_json(response.text)" instead of "model_validate(response.json())".
|
|
620
620
|
# This validates the provided data as a JSON string or bytes object.
|
|
621
621
|
# If your incoming data is a JSON payload, this is generally considered faster.
|
|
622
622
|
if list_with_meta:
|
|
623
|
-
response_with_meta = ResponseWithMeta.model_validate_json(response.text)
|
|
623
|
+
response_with_meta = ResponseWithMeta.model_validate_json(response.text) # type: ignore[var-annotated]
|
|
624
624
|
if response_with_meta.meta and response_with_meta.meta.errors:
|
|
625
625
|
logger.warning(
|
|
626
626
|
"Errors in station control response:\n - %s", "\n - ".join(response_with_meta.meta.errors)
|
|
627
627
|
)
|
|
628
|
-
return ListWithMeta(model_class.model_validate(response_with_meta.items), meta=response_with_meta.meta)
|
|
628
|
+
return ListWithMeta(model_class.model_validate(response_with_meta.items), meta=response_with_meta.meta) # type: ignore[arg-type]
|
|
629
629
|
model = model_class.model_validate_json(response.text)
|
|
630
|
-
return model
|
|
630
|
+
return model # type: ignore[return-value]
|
|
631
631
|
|
|
632
632
|
|
|
633
633
|
def _remove_empty_values(kwargs: dict[str, Any]) -> dict[str, Any]:
|
|
@@ -46,51 +46,78 @@ class JobError(PydanticBase):
|
|
|
46
46
|
|
|
47
47
|
|
|
48
48
|
class JobData(PydanticBase):
|
|
49
|
-
"""
|
|
49
|
+
"""Status, artifacts and metadata of a job."""
|
|
50
50
|
|
|
51
51
|
job_id: UUID
|
|
52
|
+
"""Unique ID of the job."""
|
|
52
53
|
job_status: JobExecutorStatus
|
|
54
|
+
"""Current job status."""
|
|
53
55
|
job_result: JobResult
|
|
56
|
+
"""Progress information for the job.""" # FIXME why is it called JobResult? can it be None?
|
|
57
|
+
# job_result: The output of a progressing or a successful job. This includes progress indicators.
|
|
54
58
|
job_error: JobError | None
|
|
59
|
+
"""Error message(s) for a failed job."""
|
|
55
60
|
position: int | None
|
|
61
|
+
"""If the job is not completed, its position in the current queue.
|
|
62
|
+
1 means this task will be executed next. In other cases the value is 0."""
|
|
56
63
|
|
|
57
64
|
|
|
58
65
|
@functools.total_ordering
|
|
59
66
|
class JobExecutorStatus(Enum):
|
|
60
|
-
"""
|
|
61
|
-
|
|
67
|
+
"""Different states a job can be in.
|
|
68
|
+
|
|
69
|
+
The ordering of these statuses is important, and execution logic relies on it.
|
|
70
|
+
Thus, if a new status is added, ensure that it is slotted
|
|
62
71
|
in at the appropriate place. See the :meth:`__lt__` implementation for further details.
|
|
63
72
|
"""
|
|
64
73
|
|
|
65
74
|
# Received by the server
|
|
66
75
|
RECEIVED = "received"
|
|
76
|
+
"""The job has been received by the server."""
|
|
67
77
|
|
|
68
78
|
# Validating the job
|
|
69
79
|
VALIDATION_STARTED = "validation_started"
|
|
80
|
+
"""The job is being validated."""
|
|
70
81
|
VALIDATION_ENDED = "validation_ended"
|
|
82
|
+
"""The job passed validation."""
|
|
71
83
|
|
|
72
84
|
# Running PulLA
|
|
73
85
|
FETCH_CALIBRATION_STARTED = "fetch_calibration_started"
|
|
86
|
+
"""Calibration data for the job is being fetched."""
|
|
74
87
|
FETCH_CALIBRATION_ENDED = "fetch_calibration_ended"
|
|
88
|
+
"""Calibration data for the job has been fetched."""
|
|
75
89
|
COMPILATION_STARTED = "compilation_started"
|
|
90
|
+
"""The job is being compiled."""
|
|
76
91
|
COMPILATION_ENDED = "compilation_ended"
|
|
92
|
+
"""The job has been succesfully compiled."""
|
|
77
93
|
|
|
78
94
|
# Executing sweep
|
|
79
95
|
SAVE_SWEEP_METADATA_STARTED = "save_sweep_metadata_started"
|
|
96
|
+
"""Metadata about the sweep is being stored to database."""
|
|
80
97
|
SAVE_SWEEP_METADATA_ENDED = "save_sweep_metadata_ended"
|
|
98
|
+
"""Metadata about the sweep has been stored to database."""
|
|
81
99
|
PENDING_EXECUTION = "pending_execution"
|
|
100
|
+
"""The job is ready for execution and is waiting for its turn in the queue."""
|
|
82
101
|
EXECUTION_STARTED = "execution_started"
|
|
102
|
+
"""The job has started executing on the instruments."""
|
|
83
103
|
EXECUTION_ENDED = "execution_ended"
|
|
104
|
+
"""The job has finished execution on the instruments."""
|
|
84
105
|
POST_PROCESSING_PENDING = "post_processing_pending"
|
|
106
|
+
"""The job has finished execution and is awaiting further processing."""
|
|
85
107
|
POST_PROCESSING_STARTED = "post_processing_started"
|
|
108
|
+
"""Execution artifacts are being constructed and persisted."""
|
|
86
109
|
POST_PROCESSING_ENDED = "post_processing_ended"
|
|
110
|
+
"""Execution artifacts have been constructed and persisted."""
|
|
111
|
+
|
|
87
112
|
READY = "ready"
|
|
113
|
+
"""The job has completed."""
|
|
88
114
|
|
|
89
115
|
# Job failed, can happen at any stage
|
|
90
116
|
FAILED = "failed"
|
|
117
|
+
"""The job has failed. Error message(s) may be available."""
|
|
91
118
|
|
|
92
|
-
# Job aborted
|
|
93
119
|
ABORTED = "aborted"
|
|
120
|
+
"""The job has been aborted."""
|
|
94
121
|
|
|
95
122
|
def __str__(self):
|
|
96
123
|
return self.name.lower()
|
|
@@ -109,7 +136,7 @@ class JobExecutorStatus(Enum):
|
|
|
109
136
|
return self.name == other.name
|
|
110
137
|
|
|
111
138
|
def __lt__(self, other):
|
|
112
|
-
"""
|
|
139
|
+
"""Comparison according to definition order.
|
|
113
140
|
|
|
114
141
|
:meta public:
|
|
115
142
|
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
-
"""Observation related
|
|
14
|
+
"""Observation related Station Control interface models."""
|
|
15
15
|
|
|
16
16
|
from datetime import datetime
|
|
17
17
|
from typing import Any
|
|
@@ -35,7 +35,7 @@ class ObservationBase(PydanticBase):
|
|
|
35
35
|
uncertainty: Uncertainty | None = None
|
|
36
36
|
"""Uncertainty of the observation value. ``None`` means unknown."""
|
|
37
37
|
invalid: bool = False
|
|
38
|
-
"""Flag indicating if the
|
|
38
|
+
"""Flag indicating if the observation is invalid. Automated systems must not use invalid observations."""
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
class ObservationDefinition(ObservationBase):
|
|
@@ -92,4 +92,4 @@ class ObservationUpdate(PydanticBase):
|
|
|
92
92
|
observation_id: int
|
|
93
93
|
"""Unique identifier of the observation."""
|
|
94
94
|
invalid: bool
|
|
95
|
-
"""Flag indicating if the
|
|
95
|
+
"""Flag indicating if the observation is invalid. Automated systems must not use invalid observations."""
|
|
@@ -33,7 +33,7 @@ class ObservationSetBase(PydanticBase):
|
|
|
33
33
|
describes_id: uuid.UUID | None = Field(default=None)
|
|
34
34
|
"""Unique identifier of the observation set this observation set describes."""
|
|
35
35
|
invalid: bool = Field(default=False)
|
|
36
|
-
"""Flag indicating if the
|
|
36
|
+
"""Flag indicating if the set is invalid. Automated systems must not use invalid sets."""
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
class ObservationSetDefinition(ObservationSetBase):
|
|
@@ -71,10 +71,10 @@ class ObservationSetUpdate(PydanticBase):
|
|
|
71
71
|
"""Database IDs of the observations belonging to the observation set.
|
|
72
72
|
|
|
73
73
|
This will only add new observations to the observation set, deleting existing ones is not possible.
|
|
74
|
-
Setting this to
|
|
74
|
+
Setting this to ``None`` or omitting it will leave existing :attr:`observation_ids` as is with no changes.
|
|
75
75
|
"""
|
|
76
76
|
invalid: bool
|
|
77
|
-
"""Flag indicating if the
|
|
77
|
+
"""Flag indicating if the set is invalid. Automated systems must not use invalid sets."""
|
|
78
78
|
|
|
79
79
|
|
|
80
80
|
class ObservationSetWithObservations(ObservationSetData):
|
|
File without changes
|
|
@@ -194,7 +194,7 @@ class StationControlInterface(ABC):
|
|
|
194
194
|
"""Get run data from the database."""
|
|
195
195
|
|
|
196
196
|
@abstractmethod
|
|
197
|
-
def query_runs(self, **kwargs) -> ListWithMeta[RunLite]:
|
|
197
|
+
def query_runs(self, **kwargs) -> ListWithMeta[RunLite]: # type: ignore[type-arg]
|
|
198
198
|
"""Query runs from the database.
|
|
199
199
|
|
|
200
200
|
Runs are queried by the given query parameters. Currently supported query parameters:
|
|
@@ -228,7 +228,7 @@ class StationControlInterface(ABC):
|
|
|
228
228
|
@abstractmethod
|
|
229
229
|
def create_observations(
|
|
230
230
|
self, observation_definitions: Sequence[ObservationDefinition]
|
|
231
|
-
) -> ListWithMeta[ObservationData]:
|
|
231
|
+
) -> ListWithMeta[ObservationData]: # type: ignore[type-arg]
|
|
232
232
|
"""Create observations in the database.
|
|
233
233
|
|
|
234
234
|
Args:
|
|
@@ -285,7 +285,7 @@ class StationControlInterface(ABC):
|
|
|
285
285
|
"""
|
|
286
286
|
|
|
287
287
|
@abstractmethod
|
|
288
|
-
def query_observations(self, **kwargs) -> ListWithMeta[ObservationData]:
|
|
288
|
+
def query_observations(self, **kwargs) -> ListWithMeta[ObservationData]: # type: ignore[type-arg]
|
|
289
289
|
"""Query observations from the database.
|
|
290
290
|
|
|
291
291
|
Observations are queried by the given query parameters. Currently supported query parameters:
|
|
@@ -324,7 +324,7 @@ class StationControlInterface(ABC):
|
|
|
324
324
|
"""
|
|
325
325
|
|
|
326
326
|
@abstractmethod
|
|
327
|
-
def query_observation_sets(self, **kwargs) -> ListWithMeta[ObservationSetData]:
|
|
327
|
+
def query_observation_sets(self, **kwargs) -> ListWithMeta[ObservationSetData]: # type: ignore[type-arg]
|
|
328
328
|
"""Query observation sets from the database.
|
|
329
329
|
|
|
330
330
|
Observation sets are queried by the given query parameters. Currently supported query parameters:
|
|
@@ -455,7 +455,7 @@ class StationControlInterface(ABC):
|
|
|
455
455
|
"""Get DUT fields for the specified DUT label from the database."""
|
|
456
456
|
|
|
457
457
|
@abstractmethod
|
|
458
|
-
def query_sequence_metadatas(self, **kwargs) -> ListWithMeta[SequenceMetadataData]:
|
|
458
|
+
def query_sequence_metadatas(self, **kwargs) -> ListWithMeta[SequenceMetadataData]: # type: ignore[type-arg]
|
|
459
459
|
"""Query sequence metadatas from the database.
|
|
460
460
|
|
|
461
461
|
Sequence metadatas are queried by the given query parameters. Currently supported query parameters:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: iqm-station-control-client
|
|
3
|
-
Version: 9.
|
|
3
|
+
Version: 9.6.0
|
|
4
4
|
Summary: Python client for communicating with Station Control Service
|
|
5
5
|
Author-email: IQM Finland Oy <info@meetiqm.com>
|
|
6
6
|
License: Apache License
|
|
@@ -217,11 +217,14 @@ Requires-Dist: iqm-exa-common<27,>=26
|
|
|
217
217
|
Requires-Dist: iqm-data-definitions<3.0,>=2.13
|
|
218
218
|
Requires-Dist: opentelemetry-exporter-otlp==1.25.0
|
|
219
219
|
Requires-Dist: protobuf<5.0,>=4.25.3
|
|
220
|
+
Requires-Dist: types-protobuf
|
|
220
221
|
Requires-Dist: grpcio<2.0,>=1.65.4
|
|
221
222
|
Requires-Dist: pydantic<3.0,>=2.10.4
|
|
222
223
|
Requires-Dist: PyYAML==6.0
|
|
223
224
|
Requires-Dist: requests==2.32.3
|
|
225
|
+
Requires-Dist: types-requests
|
|
224
226
|
Requires-Dist: tqdm>=4.59.0
|
|
227
|
+
Requires-Dist: types-tqdm
|
|
225
228
|
|
|
226
229
|
Station control client library
|
|
227
230
|
==============================
|
|
@@ -20,6 +20,7 @@ requirements/base.in
|
|
|
20
20
|
requirements/base.txt
|
|
21
21
|
src/iqm/station_control/client/__init__.py
|
|
22
22
|
src/iqm/station_control/client/list_models.py
|
|
23
|
+
src/iqm/station_control/client/py.typed
|
|
23
24
|
src/iqm/station_control/client/station_control.py
|
|
24
25
|
src/iqm/station_control/client/utils.py
|
|
25
26
|
src/iqm/station_control/client/iqm_server/__init__.py
|
|
@@ -55,6 +56,7 @@ src/iqm/station_control/client/serializers/sweep_serializers.py
|
|
|
55
56
|
src/iqm/station_control/client/serializers/task_serializers.py
|
|
56
57
|
src/iqm/station_control/interface/__init__.py
|
|
57
58
|
src/iqm/station_control/interface/list_with_meta.py
|
|
59
|
+
src/iqm/station_control/interface/py.typed
|
|
58
60
|
src/iqm/station_control/interface/pydantic_base.py
|
|
59
61
|
src/iqm/station_control/interface/station_control.py
|
|
60
62
|
src/iqm/station_control/interface/models/__init__.py
|
|
@@ -2,8 +2,11 @@ iqm-exa-common<27,>=26
|
|
|
2
2
|
iqm-data-definitions<3.0,>=2.13
|
|
3
3
|
opentelemetry-exporter-otlp==1.25.0
|
|
4
4
|
protobuf<5.0,>=4.25.3
|
|
5
|
+
types-protobuf
|
|
5
6
|
grpcio<2.0,>=1.65.4
|
|
6
7
|
pydantic<3.0,>=2.10.4
|
|
7
8
|
PyYAML==6.0
|
|
8
9
|
requests==2.32.3
|
|
10
|
+
types-requests
|
|
9
11
|
tqdm>=4.59.0
|
|
12
|
+
types-tqdm
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
9.6.0
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
9.4.0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.0}/docs/_static/css/custom.css
RENAMED
|
File without changes
|
|
File without changes
|
{iqm_station_control_client-9.4.0 → iqm_station_control_client-9.6.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
|