iqm-station-control-client 11.1.0__tar.gz → 11.3.1__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.
Files changed (85) hide show
  1. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/CHANGELOG.rst +25 -0
  2. {iqm_station_control_client-11.1.0/src/iqm_station_control_client.egg-info → iqm_station_control_client-11.3.1}/PKG-INFO +2 -2
  3. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/requirements/base.in +1 -1
  4. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/requirements/base.txt +1 -1
  5. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/iqm_server_client.py +3 -16
  6. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/list_models.py +12 -2
  7. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/station_control.py +7 -7
  8. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/list_with_meta.py +8 -2
  9. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/dut.py +9 -10
  10. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/jobs.py +1 -1
  11. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/static_quantum_architecture.py +22 -1
  12. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/type_aliases.py +6 -6
  13. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/pydantic_base.py +1 -0
  14. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1/src/iqm_station_control_client.egg-info}/PKG-INFO +2 -2
  15. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm_station_control_client.egg-info/requires.txt +1 -1
  16. iqm_station_control_client-11.3.1/version.txt +1 -0
  17. iqm_station_control_client-11.1.0/version.txt +0 -1
  18. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/LICENSE.txt +0 -0
  19. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/MANIFEST.in +0 -0
  20. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/README.rst +0 -0
  21. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/API.rst +0 -0
  22. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/Makefile +0 -0
  23. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/_static/css/custom.css +0 -0
  24. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/_static/images/favicon.ico +0 -0
  25. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/_static/images/logo.png +0 -0
  26. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/_templates/autosummary-class-template.rst +0 -0
  27. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/_templates/autosummary-module-template.rst +0 -0
  28. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/changelog.rst +0 -0
  29. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/conf.py +0 -0
  30. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/index.rst +0 -0
  31. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/docs/license.rst +0 -0
  32. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/pyproject.toml +0 -0
  33. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/requirements/base.in.internal +0 -0
  34. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/setup.cfg +0 -0
  35. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/setup.py +0 -0
  36. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/__init__.py +0 -0
  37. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/__init__.py +0 -0
  38. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/error.py +0 -0
  39. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/grpc_utils.py +0 -0
  40. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/__init__.py +0 -0
  41. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/calibration_pb2.py +0 -0
  42. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/calibration_pb2.pyi +0 -0
  43. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/calibration_pb2_grpc.py +0 -0
  44. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/common_pb2.py +0 -0
  45. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/common_pb2.pyi +0 -0
  46. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/common_pb2_grpc.py +0 -0
  47. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/job_pb2.py +0 -0
  48. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/job_pb2.pyi +0 -0
  49. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/job_pb2_grpc.py +0 -0
  50. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/qc_pb2.py +0 -0
  51. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/qc_pb2.pyi +0 -0
  52. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/qc_pb2_grpc.py +0 -0
  53. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/uuid_pb2.py +0 -0
  54. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/uuid_pb2.pyi +0 -0
  55. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/proto/uuid_pb2_grpc.py +0 -0
  56. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/testing/__init__.py +0 -0
  57. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/iqm_server/testing/iqm_server_mock.py +0 -0
  58. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/py.typed +0 -0
  59. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/qon.py +0 -0
  60. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/__init__.py +0 -0
  61. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/channel_property_serializer.py +0 -0
  62. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/datetime_serializers.py +0 -0
  63. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/playlist_serializers.py +0 -0
  64. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/run_serializers.py +0 -0
  65. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/setting_node_serializer.py +0 -0
  66. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/struct_serializer.py +0 -0
  67. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/sweep_serializers.py +0 -0
  68. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/serializers/task_serializers.py +0 -0
  69. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/client/utils.py +0 -0
  70. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/__init__.py +0 -0
  71. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/__init__.py +0 -0
  72. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/dynamic_quantum_architecture.py +0 -0
  73. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/monitor.py +0 -0
  74. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/observation.py +0 -0
  75. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/observation_set.py +0 -0
  76. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/run.py +0 -0
  77. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/sequence.py +0 -0
  78. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/models/sweep.py +0 -0
  79. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/py.typed +0 -0
  80. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm/station_control/interface/station_control.py +0 -0
  81. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm_station_control_client.egg-info/SOURCES.txt +0 -0
  82. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm_station_control_client.egg-info/dependency_links.txt +0 -0
  83. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/src/iqm_station_control_client.egg-info/top_level.txt +0 -0
  84. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/tests/.pylintrc +0 -0
  85. {iqm_station_control_client-11.1.0 → iqm_station_control_client-11.3.1}/tests/__init__.py +0 -0
@@ -2,6 +2,31 @@
2
2
  Changelog
3
3
  =========
4
4
 
5
+ Version 11.3.1 (2025-10-27)
6
+ ===========================
7
+
8
+ - Bump version for 4.3.1 release. No functional changes.
9
+
10
+ Version 11.3.0 (2025-10-23)
11
+ ===========================
12
+
13
+ Bug fixes
14
+ ---------
15
+
16
+ - Fix issue with meth:`.IqmServerClient.get_job` which failed to convert the server status (int) correctly
17
+ to :class:`.JobExecutorStatus`.
18
+
19
+
20
+ Version 11.2.0 (2025-10-06)
21
+ ===========================
22
+
23
+ Features
24
+ --------
25
+
26
+ - Deprecate "application/octet-stream" for protobuf data, use "application/protobuf" instead.
27
+ - Deprecate "detail" in server errors, use "message" instead to be consistent with IQM Server.
28
+ - Update dependencies.
29
+
5
30
  Version 11.1.0 (2025-10-03)
6
31
  ===========================
7
32
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iqm-station-control-client
3
- Version: 11.1.0
3
+ Version: 11.3.1
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
@@ -214,7 +214,7 @@ Requires-Python: >=3.11
214
214
  Description-Content-Type: text/x-rst
215
215
  License-File: LICENSE.txt
216
216
  Requires-Dist: iqm-exa-common<28,>=27
217
- Requires-Dist: iqm-data-definitions<3.0,>=2.13
217
+ Requires-Dist: iqm-data-definitions<3.0,>=2.18
218
218
  Requires-Dist: opentelemetry-exporter-otlp<2.0,>=1.25.0
219
219
  Requires-Dist: protobuf<5.0,>=4.25.3
220
220
  Requires-Dist: types-protobuf
@@ -1,4 +1,4 @@
1
- iqm-data-definitions >= 2.13, < 3.0
1
+ iqm-data-definitions >= 2.18, < 3.0
2
2
  opentelemetry-exporter-otlp >= 1.25.0, < 2.0
3
3
  protobuf >= 4.25.3, < 5.0
4
4
  types-protobuf
@@ -1,5 +1,5 @@
1
1
  iqm-exa-common>=27,<28
2
- iqm-data-definitions >= 2.13, < 3.0
2
+ iqm-data-definitions >= 2.18, < 3.0
3
3
  opentelemetry-exporter-otlp >= 1.25.0, < 2.0
4
4
  protobuf >= 4.25.3, < 5.0
5
5
  types-protobuf
@@ -174,7 +174,7 @@ class IqmServerClient(_StationControlClientBase):
174
174
  modified_timestamp=to_datetime(job.updated_at),
175
175
  begin_timestamp=to_datetime(job.execution_started_at) if job.HasField("execution_started_at") else None,
176
176
  end_timestamp=to_datetime(job.execution_ended_at) if job.HasField("execution_ended_at") else None,
177
- job_status=to_job_status(job.status),
177
+ job_status=to_job_executor_status(job.status),
178
178
  # Sweep definition is a subclass of SweepBase so we can just copy all SweepBase fields
179
179
  # from the input sweep to the sweep data
180
180
  **{f.name: getattr(sweep, f.name) for f in dataclasses.fields(SweepBase)},
@@ -298,7 +298,7 @@ class IqmServerClient(_StationControlClientBase):
298
298
  job: proto.JobV1 = jobs.GetJobV1(proto.JobLookupV1(id=to_proto_uuid(job_id)))
299
299
  return JobData(
300
300
  job_id=from_proto_uuid(job.id),
301
- job_status=job.status, # type: ignore[arg-type]
301
+ job_status=to_job_executor_status(job.status),
302
302
  job_result=JobResult(
303
303
  job_id=from_proto_uuid(job.id),
304
304
  parallel_sweep_progress=[],
@@ -458,7 +458,7 @@ def payload_to_sweep(job_payload: bytes) -> SweepDefinition:
458
458
  return sweep
459
459
 
460
460
 
461
- def to_job_status(job_status: proto.JobStatus) -> JobExecutorStatus:
461
+ def to_job_executor_status(job_status: proto.JobStatus) -> JobExecutorStatus:
462
462
  match job_status:
463
463
  case proto.JobStatus.IN_QUEUE:
464
464
  return JobExecutorStatus.PENDING_EXECUTION
@@ -475,19 +475,6 @@ def to_job_status(job_status: proto.JobStatus) -> JobExecutorStatus:
475
475
  raise ValueError(f"Unknown job status: '{job_status}'")
476
476
 
477
477
 
478
- def to_string_job_status(job_status: proto.JobStatus) -> str:
479
- match job_status:
480
- case proto.JobStatus.IN_QUEUE:
481
- return "PENDING"
482
- case proto.JobStatus.EXECUTING:
483
- return "STARTED"
484
- case proto.JobStatus.FAILED | proto.JobStatus.INTERRUPTED | proto.JobStatus.CANCELLED:
485
- return "FAILURE"
486
- case proto.JobStatus.COMPLETED:
487
- return "SUCCESS"
488
- raise ValueError(f"Unknown job status: '{job_status}'")
489
-
490
-
491
478
  def parse_json(data: bytes) -> Any:
492
479
  return json.load(BytesIO(data))
493
480
 
@@ -31,14 +31,20 @@ from iqm.station_control.interface.models import (
31
31
  ObservationUpdate,
32
32
  RunLite,
33
33
  SequenceMetadataData,
34
+ StaticQuantumArchitecture,
34
35
  )
35
36
  from iqm.station_control.interface.pydantic_base import PydanticBase
36
37
 
37
38
  T = TypeVar("T")
38
39
 
39
40
 
40
- class ResponseWithMeta(PydanticBase, Generic[T]):
41
- """Class used for query endpoints to return metadata in addition to the returned items."""
41
+ class ListWithMetaResponse(PydanticBase, Generic[T]):
42
+ """Class used for list endpoints to envelope the items to a dict with additional metadata.
43
+
44
+ This should be used only in REST API communication (JSON). For Python users,
45
+ this model should be deserialized to :class:`iqm.pulse.ListWithMeta`:,
46
+ which behaves like a standard list.
47
+ """
42
48
 
43
49
  items: list[T]
44
50
  meta: Meta | None = None
@@ -96,5 +102,9 @@ class SequenceMetadataDataList(ListModel):
96
102
  root: list[SequenceMetadataData]
97
103
 
98
104
 
105
+ class StaticQuantumArchitectureList(ListModel):
106
+ root: list[StaticQuantumArchitecture]
107
+
108
+
99
109
  class RunLiteList(ListModel):
100
110
  root: list[RunLite]
@@ -44,12 +44,12 @@ from iqm.station_control.client.list_models import (
44
44
  DutFieldDataList,
45
45
  DutList,
46
46
  ListModel,
47
+ ListWithMetaResponse,
47
48
  ObservationDataList,
48
49
  ObservationDefinitionList,
49
50
  ObservationLiteList,
50
51
  ObservationSetDataList,
51
52
  ObservationUpdateList,
52
- ResponseWithMeta,
53
53
  RunLiteList,
54
54
  SequenceMetadataDataList,
55
55
  )
@@ -181,7 +181,7 @@ class _StationControlClientBase(StationControlInterface):
181
181
  if not response.ok:
182
182
  try:
183
183
  response_json = response.json()
184
- error_message = response_json.get("message") or response_json["detail"]
184
+ error_message = response_json.get("message")
185
185
  except (json.JSONDecodeError, KeyError):
186
186
  error_message = response.text
187
187
 
@@ -215,7 +215,7 @@ class _StationControlClientBase(StationControlInterface):
215
215
  headers["Content-Type"] = "application/json; charset=UTF-8"
216
216
  elif octets is not None:
217
217
  data = octets
218
- headers["Content-Type"] = "application/octet-stream"
218
+ headers["Content-Type"] = "application/protobuf"
219
219
 
220
220
  if self._enable_opentelemetry:
221
221
  parent_span_context = trace.set_span_in_context(trace.get_current_span())
@@ -310,7 +310,7 @@ class StationControlClient(_StationControlClientBase):
310
310
 
311
311
  @cache
312
312
  def get_channel_properties(self) -> dict[str, ChannelProperties]:
313
- headers = {"accept": "application/octet-stream"}
313
+ headers = {"accept": "application/protobuf"}
314
314
  response = self._send_request(requests.get, "channel-properties", headers=headers)
315
315
  decoded_dict = unpack_channel_properties(response.content)
316
316
  return decoded_dict
@@ -620,11 +620,11 @@ class StationControlClient(_StationControlClientBase):
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 = ResponseWithMeta.model_validate_json(response.text)
624
- meta = response_with_meta.meta or Meta()
623
+ list_with_meta_response: ListWithMetaResponse = ListWithMetaResponse.model_validate_json(response.text)
624
+ meta = list_with_meta_response.meta or Meta()
625
625
  if meta and meta.errors:
626
626
  logger.warning("Errors in station control response:\n - %s", "\n - ".join(meta.errors))
627
- return ListWithMeta(model_class.model_validate(response_with_meta.items), meta=meta)
627
+ return ListWithMeta(model_class.model_validate(list_with_meta_response.items), meta=meta)
628
628
  model = model_class.model_validate_json(response.text)
629
629
  if isinstance(model, ListModel):
630
630
  return model.root
@@ -15,6 +15,7 @@
15
15
 
16
16
  from collections.abc import Iterable
17
17
  from dataclasses import dataclass
18
+ from typing import Generic, TypeVar
18
19
 
19
20
 
20
21
  @dataclass(kw_only=True)
@@ -28,9 +29,14 @@ class Meta:
28
29
  errors: list[str] | None = None
29
30
 
30
31
 
31
- class ListWithMeta(list):
32
+ T = TypeVar("T")
33
+
34
+
35
+ class ListWithMeta(list, Generic[T]):
32
36
  """Standard list extension holding optional metadata as well."""
33
37
 
34
- def __init__(self, items: Iterable, *, meta: Meta):
38
+ meta: Meta | None
39
+
40
+ def __init__(self, items: Iterable[T], *, meta: Meta | None = None):
35
41
  super().__init__(items)
36
42
  self.meta = meta
@@ -17,16 +17,6 @@ from iqm.station_control.interface.models.type_aliases import DutType
17
17
  from iqm.station_control.interface.pydantic_base import PydanticBase
18
18
 
19
19
 
20
- class DutData(PydanticBase):
21
- """Represents a Device Under Test, or DUT, for short."""
22
-
23
- label: str
24
- """DUT label of the device."""
25
- dut_type: DutType
26
- """String indicating the DUT type of the device
27
- Can be either 'chip' or 'twpa'."""
28
-
29
-
30
20
  class DutFieldData(PydanticBase):
31
21
  """A DUT field or path and its unit."""
32
22
 
@@ -34,3 +24,12 @@ class DutFieldData(PydanticBase):
34
24
  """DUT field or path."""
35
25
  unit: str
36
26
  """SI unit of the value. Empty string means the value is dimensionless."""
27
+
28
+
29
+ class DutData(PydanticBase):
30
+ """Represents a Device Under Test, or DUT, for short."""
31
+
32
+ label: str
33
+ """DUT label of the device."""
34
+ dut_type: DutType
35
+ """Type of the device."""
@@ -89,7 +89,7 @@ class JobExecutorStatus(Enum):
89
89
  COMPILATION_STARTED = "compilation_started"
90
90
  """The job is being compiled."""
91
91
  COMPILATION_ENDED = "compilation_ended"
92
- """The job has been succesfully compiled."""
92
+ """The job has been successfully compiled."""
93
93
 
94
94
  # Executing sweep
95
95
  SAVE_SWEEP_METADATA_STARTED = "save_sweep_metadata_started"
@@ -13,7 +13,10 @@
13
13
  # limitations under the License.
14
14
  """Static quantum architecture (SQA) related interface models."""
15
15
 
16
- from pydantic import Field
16
+ from typing import Any
17
+ import warnings
18
+
19
+ from pydantic import Field, model_validator
17
20
 
18
21
  from iqm.station_control.interface.pydantic_base import PydanticBase
19
22
 
@@ -24,6 +27,13 @@ class StaticQuantumArchitecture(PydanticBase):
24
27
  For example, the names of its components and the connections between them.
25
28
  """
26
29
 
30
+ # Optional *for now* since 2025-10-04 (backwards compatible)
31
+ dut_label: str | None = Field(
32
+ default=None,
33
+ json_schema_extra={"x-optional-deprecated": True},
34
+ )
35
+ """Identifies the QPU."""
36
+
27
37
  qubits: list[str] = Field(
28
38
  examples=[["QB1", "QB2"]],
29
39
  )
@@ -38,3 +48,14 @@ class StaticQuantumArchitecture(PydanticBase):
38
48
  examples=[[("QB1", "QB2"), ("QB1", "CR1")]],
39
49
  )
40
50
  """Components (qubits and computational resonators) connected by a coupler on the QPU, sorted."""
51
+
52
+ @model_validator(mode="before")
53
+ @classmethod
54
+ def _warn_missing_dut_label(cls, data: Any) -> Any:
55
+ if isinstance(data, dict) and "dut_label" not in data:
56
+ warnings.warn(
57
+ "Missing 'dut_label'. This field will become REQUIRED in a future release.",
58
+ DeprecationWarning,
59
+ stacklevel=2,
60
+ )
61
+ return data
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
  """Type hint aliases used in the station control interface."""
15
15
 
16
- from typing import Literal
16
+ from typing import Literal, TypeAlias
17
17
  from uuid import UUID
18
18
 
19
19
  import numpy as np
@@ -23,8 +23,8 @@ import numpy as np
23
23
  # and then deserialized back to UUID on the server side.
24
24
  StrUUID = str | UUID
25
25
 
26
- DutType = Literal["chip", "twpa"]
27
- GetObservationsMode = Literal["all_latest", "tags_and", "tags_or", "sequence"]
28
- SoftwareVersionSet = dict[str, str]
29
- Statuses = list[tuple[str, int, int]]
30
- SweepResults = dict[str, list[np.ndarray]]
26
+ DutType: TypeAlias = Literal["chip", "twpa"]
27
+ GetObservationsMode: TypeAlias = Literal["all_latest", "tags_and", "tags_or", "sequence"]
28
+ SoftwareVersionSet: TypeAlias = dict[str, str]
29
+ Statuses: TypeAlias = list[tuple[str, int, int]]
30
+ SweepResults: TypeAlias = dict[str, list[np.ndarray]]
@@ -18,6 +18,7 @@ from pydantic import BaseModel, ConfigDict
18
18
 
19
19
  class PydanticBase(BaseModel):
20
20
  """Pydantic base model to change the behaviour of pydantic globally.
21
+
21
22
  Note that setting model_config in child classes will merge the configs rather than override this one.
22
23
  https://docs.pydantic.dev/latest/concepts/config/#change-behaviour-globally
23
24
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iqm-station-control-client
3
- Version: 11.1.0
3
+ Version: 11.3.1
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
@@ -214,7 +214,7 @@ Requires-Python: >=3.11
214
214
  Description-Content-Type: text/x-rst
215
215
  License-File: LICENSE.txt
216
216
  Requires-Dist: iqm-exa-common<28,>=27
217
- Requires-Dist: iqm-data-definitions<3.0,>=2.13
217
+ Requires-Dist: iqm-data-definitions<3.0,>=2.18
218
218
  Requires-Dist: opentelemetry-exporter-otlp<2.0,>=1.25.0
219
219
  Requires-Dist: protobuf<5.0,>=4.25.3
220
220
  Requires-Dist: types-protobuf
@@ -1,5 +1,5 @@
1
1
  iqm-exa-common<28,>=27
2
- iqm-data-definitions<3.0,>=2.13
2
+ iqm-data-definitions<3.0,>=2.18
3
3
  opentelemetry-exporter-otlp<2.0,>=1.25.0
4
4
  protobuf<5.0,>=4.25.3
5
5
  types-protobuf
@@ -0,0 +1 @@
1
+ 11.3.1
@@ -1 +0,0 @@
1
- 11.1.0