iqm-station-control-client 9.12.0__tar.gz → 9.14.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.
Files changed (84) hide show
  1. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/CHANGELOG.rst +15 -0
  2. {iqm_station_control_client-9.12.0/src/iqm_station_control_client.egg-info → iqm_station_control_client-9.14.0}/PKG-INFO +1 -1
  3. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/iqm_server_client.py +35 -3
  4. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/list_models.py +35 -10
  5. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/station_control.py +13 -12
  6. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/interface/list_with_meta.py +1 -1
  7. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0/src/iqm_station_control_client.egg-info}/PKG-INFO +1 -1
  8. iqm_station_control_client-9.14.0/version.txt +1 -0
  9. iqm_station_control_client-9.12.0/version.txt +0 -1
  10. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/LICENSE.txt +0 -0
  11. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/MANIFEST.in +0 -0
  12. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/README.rst +0 -0
  13. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/docs/API.rst +0 -0
  14. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/docs/Makefile +0 -0
  15. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/docs/_static/css/custom.css +0 -0
  16. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/docs/_static/images/favicon.ico +0 -0
  17. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/docs/_static/images/logo.png +0 -0
  18. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/docs/_templates/autosummary-class-template.rst +0 -0
  19. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/docs/_templates/autosummary-module-template.rst +0 -0
  20. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/docs/changelog.rst +0 -0
  21. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/docs/conf.py +0 -0
  22. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/docs/index.rst +0 -0
  23. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/docs/license.rst +0 -0
  24. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/pyproject.toml +0 -0
  25. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/requirements/base.in +0 -0
  26. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/requirements/base.txt +0 -0
  27. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/setup.cfg +0 -0
  28. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/setup.py +0 -0
  29. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/__init__.py +0 -0
  30. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/__init__.py +0 -0
  31. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/error.py +0 -0
  32. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/grpc_utils.py +0 -0
  33. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/proto/__init__.py +0 -0
  34. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/proto/calibration_pb2.py +0 -0
  35. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/proto/calibration_pb2.pyi +0 -0
  36. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/proto/calibration_pb2_grpc.py +0 -0
  37. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/proto/common_pb2.py +0 -0
  38. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/proto/common_pb2.pyi +0 -0
  39. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/proto/common_pb2_grpc.py +0 -0
  40. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/proto/job_pb2.py +0 -0
  41. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/proto/job_pb2.pyi +0 -0
  42. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/proto/job_pb2_grpc.py +0 -0
  43. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/proto/qc_pb2.py +0 -0
  44. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/proto/qc_pb2.pyi +0 -0
  45. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/proto/qc_pb2_grpc.py +0 -0
  46. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/proto/uuid_pb2.py +0 -0
  47. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/proto/uuid_pb2.pyi +0 -0
  48. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/proto/uuid_pb2_grpc.py +0 -0
  49. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/testing/__init__.py +0 -0
  50. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/iqm_server/testing/iqm_server_mock.py +0 -0
  51. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/py.typed +0 -0
  52. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/qon.py +0 -0
  53. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/serializers/__init__.py +0 -0
  54. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/serializers/channel_property_serializer.py +0 -0
  55. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/serializers/datetime_serializers.py +0 -0
  56. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/serializers/playlist_serializers.py +0 -0
  57. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/serializers/run_serializers.py +0 -0
  58. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/serializers/setting_node_serializer.py +0 -0
  59. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/serializers/struct_serializer.py +0 -0
  60. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/serializers/sweep_serializers.py +0 -0
  61. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/serializers/task_serializers.py +0 -0
  62. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/client/utils.py +0 -0
  63. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/interface/__init__.py +0 -0
  64. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/interface/models/__init__.py +0 -0
  65. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/interface/models/dut.py +0 -0
  66. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/interface/models/dynamic_quantum_architecture.py +0 -0
  67. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/interface/models/jobs.py +0 -0
  68. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/interface/models/monitor.py +0 -0
  69. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/interface/models/observation.py +0 -0
  70. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/interface/models/observation_set.py +0 -0
  71. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/interface/models/run.py +0 -0
  72. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/interface/models/sequence.py +0 -0
  73. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/interface/models/static_quantum_architecture.py +0 -0
  74. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/interface/models/sweep.py +0 -0
  75. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/interface/models/type_aliases.py +0 -0
  76. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/interface/py.typed +0 -0
  77. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/interface/pydantic_base.py +0 -0
  78. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm/station_control/interface/station_control.py +0 -0
  79. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm_station_control_client.egg-info/SOURCES.txt +0 -0
  80. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm_station_control_client.egg-info/dependency_links.txt +0 -0
  81. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm_station_control_client.egg-info/requires.txt +0 -0
  82. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/src/iqm_station_control_client.egg-info/top_level.txt +0 -0
  83. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/tests/.pylintrc +0 -0
  84. {iqm_station_control_client-9.12.0 → iqm_station_control_client-9.14.0}/tests/__init__.py +0 -0
@@ -2,6 +2,21 @@
2
2
  Changelog
3
3
  =========
4
4
 
5
+ Version 9.14.0 (2025-08-14)
6
+ ===========================
7
+
8
+ Bug fixes
9
+ ---------
10
+ - Fixed an issue where the `IQMServerClient` was not correctly handling the retrieval of channel properties.
11
+
12
+ Version 9.13.0 (2025-08-12)
13
+ ===========================
14
+
15
+ Features
16
+ --------
17
+
18
+ - Fix Pydantic RootModel related mypy warnings.
19
+
5
20
  Version 9.12.0 (2025-08-08)
6
21
  ===========================
7
22
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iqm-station-control-client
3
- Version: 9.12.0
3
+ Version: 9.14.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
@@ -25,7 +25,7 @@ import uuid
25
25
  from uuid import UUID
26
26
 
27
27
  import grpc
28
- from iqm.models.channel_properties import ChannelProperties
28
+ from iqm.models.channel_properties import AWGProperties, ChannelProperties, ReadoutProperties
29
29
  import requests
30
30
 
31
31
  from exa.common.data.setting_node import SettingNode
@@ -43,7 +43,6 @@ from iqm.station_control.client.iqm_server.grpc_utils import (
43
43
  )
44
44
  from iqm.station_control.client.list_models import DutFieldDataList, DutList
45
45
  from iqm.station_control.client.serializers import deserialize_sweep_results, serialize_sweep_job_request
46
- from iqm.station_control.client.serializers.channel_property_serializer import unpack_channel_properties
47
46
  from iqm.station_control.client.serializers.setting_node_serializer import deserialize_setting_node
48
47
  from iqm.station_control.client.serializers.task_serializers import deserialize_sweep_job_request
49
48
  from iqm.station_control.client.station_control import _StationControlClientBase
@@ -129,7 +128,14 @@ class IqmServerClient(_StationControlClientBase):
129
128
  return self._get_resource(f"chip-design-records/{dut_label}", parse_json)
130
129
 
131
130
  def get_channel_properties(self) -> dict[str, ChannelProperties]:
132
- return self._get_resource("channel-properties", unpack_channel_properties)
131
+ def bytes_to_dict(data: bytes) -> dict[str, ChannelProperties]:
132
+ """Deserialize bytes to a dictionary of channel property values."""
133
+ json_props: dict[str, dict] = json.loads(data.decode("utf-8"))
134
+ # Convert JSON representation to pythonic ChannelProperties
135
+ return _convert_channel_property_json_to_python(json_props)
136
+
137
+ channel_props = self._get_resource("channel-properties", bytes_to_dict)
138
+ return channel_props
133
139
 
134
140
  def sweep(self, sweep_definition: SweepDefinition) -> dict:
135
141
  with wrap_error("Job submission failed"):
@@ -411,6 +417,32 @@ def subscribe_to_job_events(channel: grpc.Channel, job_id: uuid.UUID) -> Iterabl
411
417
  raise e
412
418
 
413
419
 
420
+ def _convert_channel_property_json_to_python(channel_property_json: dict[str, dict]) -> dict[str, ChannelProperties]:
421
+ """Convert the JSON representation of channel properties to a dictionary containing pythonic ChannelProperties."""
422
+ channel_properties: dict[str, ChannelProperties] = {}
423
+ for name, props in channel_property_json.items():
424
+ if "fast_feedback_sources" in props:
425
+ channel_properties[name] = AWGProperties(
426
+ sampling_rate=props.get("sampling_rate"),
427
+ instruction_duration_granularity=props.get("instruction_duration_granularity"),
428
+ instruction_duration_min=props.get("instruction_duration_min"),
429
+ fast_feedback_sources=props.get("fast_feedback_sources", []),
430
+ compatible_instructions=props.get("compatible_instructions", []),
431
+ local_oscillator=props.get("local_oscillator"),
432
+ mixer_correction=props.get("mixer_correction"),
433
+ )
434
+ if "integration_start_dead_time" in props:
435
+ channel_properties[name] = ReadoutProperties(
436
+ sampling_rate=props.get("sampling_rate"),
437
+ instruction_duration_granularity=props.get("instruction_duration_granularity"),
438
+ instruction_duration_min=props.get("instruction_duration_min"),
439
+ compatible_instructions=props.get("compatible_instructions", []),
440
+ integration_start_dead_time=props.get("integration_start_dead_time"),
441
+ integration_stop_dead_time=props.get("integration_stop_dead_time"),
442
+ )
443
+ return channel_properties
444
+
445
+
414
446
  def parse_calibration_set(cal_set_data: bytes) -> tuple[uuid.UUID, dict[str, ObservationValue]]:
415
447
  # IQM server calibration sets are in cocos calibration set JSON format, we can get
416
448
  # both id and observations from it
@@ -16,7 +16,7 @@
16
16
  These are used mainly for easy serialization and deserialization of list of objects.
17
17
  """
18
18
 
19
- from typing import Generic, TypeAlias, TypeVar
19
+ from typing import Generic, TypeVar
20
20
 
21
21
  from pydantic import ConfigDict, RootModel
22
22
 
@@ -64,12 +64,37 @@ class ListModel(RootModel):
64
64
  )
65
65
 
66
66
 
67
- DutList: TypeAlias = ListModel[list[DutData]] # type: ignore[type-arg]
68
- DutFieldDataList: TypeAlias = ListModel[list[DutFieldData]] # type: ignore[type-arg]
69
- ObservationDataList: TypeAlias = ListModel[list[ObservationData]] # type: ignore[type-arg]
70
- ObservationDefinitionList: TypeAlias = ListModel[list[ObservationDefinition]] # type: ignore[type-arg]
71
- ObservationLiteList: TypeAlias = ListModel[list[ObservationLite]] # type: ignore[type-arg]
72
- ObservationUpdateList: TypeAlias = ListModel[list[ObservationUpdate]] # type: ignore[type-arg]
73
- ObservationSetDataList: TypeAlias = ListModel[list[ObservationSetData]] # type: ignore[type-arg]
74
- SequenceMetadataDataList: TypeAlias = ListModel[list[SequenceMetadataData]] # type: ignore[type-arg]
75
- RunLiteList: TypeAlias = ListModel[list[RunLite]] # type: ignore[type-arg]
67
+ class DutList(ListModel):
68
+ root: list[DutData]
69
+
70
+
71
+ class DutFieldDataList(ListModel):
72
+ root: list[DutFieldData]
73
+
74
+
75
+ class ObservationDataList(ListModel):
76
+ root: list[ObservationData]
77
+
78
+
79
+ class ObservationDefinitionList(ListModel):
80
+ root: list[ObservationDefinition]
81
+
82
+
83
+ class ObservationLiteList(ListModel):
84
+ root: list[ObservationLite]
85
+
86
+
87
+ class ObservationUpdateList(ListModel):
88
+ root: list[ObservationUpdate]
89
+
90
+
91
+ class ObservationSetDataList(ListModel):
92
+ root: list[ObservationSetData]
93
+
94
+
95
+ class SequenceMetadataDataList(ListModel):
96
+ root: list[SequenceMetadataData]
97
+
98
+
99
+ class RunLiteList(ListModel):
100
+ root: list[RunLite]
@@ -62,7 +62,7 @@ from iqm.station_control.client.serializers import (
62
62
  from iqm.station_control.client.serializers.channel_property_serializer import unpack_channel_properties
63
63
  from iqm.station_control.client.serializers.setting_node_serializer import deserialize_setting_node
64
64
  from iqm.station_control.client.serializers.sweep_serializers import deserialize_sweep_data
65
- from iqm.station_control.interface.list_with_meta import ListWithMeta
65
+ from iqm.station_control.interface.list_with_meta import ListWithMeta, Meta
66
66
  from iqm.station_control.interface.models import (
67
67
  DutData,
68
68
  DutFieldData,
@@ -358,7 +358,7 @@ class StationControlClient(_StationControlClientBase):
358
358
  def create_observations(
359
359
  self, observation_definitions: Sequence[ObservationDefinition]
360
360
  ) -> ListWithMeta[ObservationData]: # type: ignore[type-arg]
361
- json_str = self._serialize_model(ObservationDefinitionList(observation_definitions))
361
+ json_str = self._serialize_model(ObservationDefinitionList(list(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)
364
364
 
@@ -394,7 +394,7 @@ class StationControlClient(_StationControlClientBase):
394
394
  return self._deserialize_response(response, ObservationDataList, list_with_meta=True)
395
395
 
396
396
  def update_observations(self, observation_updates: Sequence[ObservationUpdate]) -> list[ObservationData]:
397
- json_str = self._serialize_model(ObservationUpdateList(observation_updates))
397
+ json_str = self._serialize_model(ObservationUpdateList(list(observation_updates)))
398
398
  response = self._send_request(requests.patch, "observations", json_str=json_str)
399
399
  return self._deserialize_response(response, ObservationDataList)
400
400
 
@@ -612,22 +612,23 @@ class StationControlClient(_StationControlClientBase):
612
612
  @staticmethod
613
613
  def _deserialize_response(
614
614
  response: requests.Response,
615
- model_class: type[TypePydanticBase | ListModel[list[TypePydanticBase]]], # type: ignore[type-arg]
615
+ model_class: type[TypePydanticBase | ListModel],
616
616
  *,
617
617
  list_with_meta: bool = False,
618
- ) -> TypePydanticBase | ListWithMeta[TypePydanticBase]: # type: ignore[type-arg]
618
+ ) -> TypePydanticBase | ListWithMeta:
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) # type: ignore[var-annotated]
624
- if response_with_meta.meta and response_with_meta.meta.errors:
625
- logger.warning(
626
- "Errors in station control response:\n - %s", "\n - ".join(response_with_meta.meta.errors)
627
- )
628
- return ListWithMeta(model_class.model_validate(response_with_meta.items), meta=response_with_meta.meta) # type: ignore[arg-type]
623
+ response_with_meta: ResponseWithMeta = ResponseWithMeta.model_validate_json(response.text)
624
+ meta = response_with_meta.meta or Meta()
625
+ if meta and meta.errors:
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)
629
628
  model = model_class.model_validate_json(response.text)
630
- return model # type: ignore[return-value]
629
+ if isinstance(model, ListModel):
630
+ return model.root
631
+ return model
631
632
 
632
633
 
633
634
  def _remove_empty_values(kwargs: dict[str, Any]) -> dict[str, Any]:
@@ -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
- """Models to extend standard list with metadata."""
14
+ """Models to extend a standard list with metadata."""
15
15
 
16
16
  from collections.abc import Iterable
17
17
  from dataclasses import dataclass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iqm-station-control-client
3
- Version: 9.12.0
3
+ Version: 9.14.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
@@ -0,0 +1 @@
1
+ 9.14.0
@@ -1 +0,0 @@
1
- 9.12.0