iqm-station-control-client 2.16__py3-none-any.whl → 2.17__py3-none-any.whl

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.
@@ -6,7 +6,7 @@
6
6
  # is prohibited without IQM Finland Oy’s prior written permission.
7
7
  # ********************************************************************************
8
8
  """Serializers and deserializers for :class:`~iqm.models.channel_properties.channel_properties.ChannelProperties`"""
9
- # pylint: disable=protected-access,no-member
9
+
10
10
 
11
11
  from collections.abc import Iterable
12
12
 
@@ -34,6 +34,7 @@ def serialize_channel_properties(
34
34
 
35
35
  Returns:
36
36
  ``ChannelPropertyDictionary``
37
+
37
38
  """
38
39
  pb_channel_prop_dict = pb.ChannelPropertyDictionary()
39
40
  for name, channel_properties in channel_property_dictionary.items():
@@ -98,6 +99,7 @@ def deserialize_channel_properties(
98
99
 
99
100
  Returns:
100
101
  dictionary of channel properties
102
+
101
103
  """
102
104
  channel_prop_dict = {}
103
105
  for name, props in channel_property_dictionary.channel_property_mapping.items():
@@ -141,6 +143,7 @@ def unpack_channel_properties(payload: bytes, convert_instructions: bool = True)
141
143
  payload: protobuf serialised payload of channel property dictionary.
142
144
  convert_instructions: whether to convert string representation of instruction types to actual
143
145
  python types.
146
+
144
147
  """
145
148
  pb_channel_properties = pb.ChannelPropertyDictionary()
146
149
  pb_channel_properties.ParseFromString(payload)
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  """Serializers and deserializers for :class:`~iqm.models.playlist.playlist.Playlist`"""
15
- # pylint: disable=protected-access,no-member
15
+
16
16
 
17
17
  import iqm.data_definitions.common.v1.playlist_pb2 as pb
18
18
  from iqm.models.playlist import ChannelDescription, IQChannelConfig, RealChannelConfig, Segment, instructions, waveforms
@@ -147,6 +147,7 @@ def pack_playlist(playlist: Playlist) -> pb.Playlist:
147
147
 
148
148
  Returns:
149
149
  ``playlist`` in protobuf format
150
+
150
151
  """
151
152
  proto_playlist = pb.Playlist()
152
153
 
@@ -236,7 +237,7 @@ def _proto_to_acqusition_method(
236
237
 
237
238
 
238
239
  def _proto_to_waveform(waveform: pb.Waveform) -> waveforms.CanonicalWaveform:
239
- # pylint: disable=too-many-return-statements
240
+
240
241
  wf_type = waveform.WhichOneof("waveform_description")
241
242
  match wf_type:
242
243
  case "samples":
@@ -350,6 +351,7 @@ def unpack_playlist(proto_playlist: pb.Playlist) -> Playlist:
350
351
 
351
352
  Returns:
352
353
  ``proto_playlist`` in runtime representation
354
+
353
355
  """
354
356
  playlist = Playlist()
355
357
  for channel in proto_playlist.channels.values():
@@ -14,15 +14,13 @@
14
14
  """Serializers and deserializers for run related models."""
15
15
  import uuid
16
16
 
17
- from exa.common.api import proto_serialization
18
- from exa.common.sweep.database_serialization import decode_and_validate_sweeps, encode_nd_sweeps
19
- from exa.common.sweep.util import convert_sweeps_to_list_of_tuples
20
-
21
17
  # FIXME: Re-enable `no-name-in-module` after pylint supports .pyi files: https://github.com/PyCQA/pylint/issues/4987
22
- # pylint: disable=no-name-in-module
23
18
  from iqm.data_definitions.station_control.v1.sweep_request_pb2 import SweepRequest as SweepDefinitionProto
24
19
  from iqm.data_definitions.station_control.v2.run_definition_pb2 import RunDefinition as RunDefinitionProto
25
20
 
21
+ from exa.common.api import proto_serialization
22
+ from exa.common.sweep.database_serialization import decode_and_validate_sweeps, encode_nd_sweeps
23
+ from exa.common.sweep.util import convert_sweeps_to_list_of_tuples
26
24
  from iqm.station_control.client.serializers.datetime_serializers import deserialize_datetime, serialize_datetime
27
25
  from iqm.station_control.client.serializers.struct_serializer import deserialize_struct, serialize_struct
28
26
  from iqm.station_control.client.serializers.sweep_serializers import (
@@ -12,13 +12,12 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  """Serializers and deserializers for setting node related models."""
15
- from exa.common.api import proto_serialization
16
- from exa.common.data.setting_node import SettingNode
17
-
18
15
  # FIXME: Re-enable `no-name-in-module` after pylint supports .pyi files: https://github.com/PyCQA/pylint/issues/4987
19
- # pylint: disable=no-name-in-module
20
16
  from iqm.data_definitions.common.v1.setting_pb2 import SettingNode as SettingNodeProto
21
17
 
18
+ from exa.common.api import proto_serialization
19
+ from exa.common.data.setting_node import SettingNode
20
+
22
21
 
23
22
  def deserialize_setting_node(setting_node_str: bytes) -> SettingNode:
24
23
  """Convert binary string into SettingNode."""
@@ -16,7 +16,7 @@
16
16
  We use custom Struct model instead of standard Struct from protobuf,
17
17
  since standard Struct doesn't support integers but instead casts them always to floats.
18
18
  """
19
- # pylint: disable=no-member
19
+
20
20
  import iqm.data_definitions.common.v1.struct_pb2 as pb
21
21
 
22
22
 
@@ -35,7 +35,6 @@ def deserialize_struct(proto: pb.Struct) -> dict:
35
35
 
36
36
  def _serialize_value(value: None | float | str | bool | dict | list | int) -> pb.Value:
37
37
  """Serialize a value into a Value protobuf representation."""
38
- # pylint: disable=too-many-return-statements
39
38
  if value is None:
40
39
  return pb.Value(null_value=True)
41
40
  if isinstance(value, float):
@@ -55,7 +54,6 @@ def _serialize_value(value: None | float | str | bool | dict | list | int) -> pb
55
54
 
56
55
  def _deserialize_value(proto: pb.Value) -> None | float | str | bool | dict | list | int:
57
56
  """Deserialize a Value protobuf representation into a value."""
58
- # pylint: disable=too-many-return-statements
59
57
  which = proto.WhichOneof("kind")
60
58
  if which == "null_value":
61
59
  return None
@@ -15,17 +15,15 @@
15
15
  import json
16
16
  import uuid
17
17
 
18
- from exa.common.api import proto_serialization
19
- from exa.common.api.model.setting_node_model import SettingNodeModel
20
- from exa.common.api.proto_serialization import array
21
- from exa.common.sweep.database_serialization import decode_and_validate_sweeps, encode_nd_sweeps
22
-
23
18
  # FIXME: Re-enable `no-name-in-module` after pylint supports .pyi files: https://github.com/PyCQA/pylint/issues/4987
24
- # pylint: disable=no-name-in-module
25
19
  from iqm.data_definitions.common.v1.data_types_pb2 import Arrays as ArraysProto
26
20
  from iqm.data_definitions.station_control.v1.sweep_request_pb2 import SweepRequest as SweepDefinitionProto
27
21
  from iqm.data_definitions.station_control.v2.task_service_pb2 import SweepResultsResponse as SweepResultsResponseProto
28
22
 
23
+ from exa.common.api import proto_serialization
24
+ from exa.common.api.model.setting_node_model import SettingNodeModel
25
+ from exa.common.api.proto_serialization import array
26
+ from exa.common.sweep.database_serialization import decode_and_validate_sweeps, encode_nd_sweeps
29
27
  from iqm.station_control.client.serializers.datetime_serializers import deserialize_datetime, serialize_datetime
30
28
  from iqm.station_control.client.serializers.playlist_serializers import pack_playlist, unpack_playlist
31
29
  from iqm.station_control.interface.models import SweepData, SweepDefinition, SweepResults, SweepStatus
@@ -16,7 +16,6 @@ from typing import Any
16
16
  import uuid
17
17
 
18
18
  # FIXME: Re-enable `no-name-in-module` after pylint supports .pyi files: https://github.com/PyCQA/pylint/issues/4987
19
- # pylint: disable=no-name-in-module
20
19
  from iqm.data_definitions.station_control.v1.task_service_pb2 import SweepTaskRequest as SweepTaskRequestProto
21
20
 
22
21
  from iqm.station_control.client.serializers.run_serializers import serialize_run_definition
@@ -34,6 +33,7 @@ def serialize_run_task_request(run_definition: RunDefinition, queue_name: str) -
34
33
  Returns:
35
34
  :class:`~iqm.data_definitions.station_control.v1.task_service_pb2.SweepTaskRequest`
36
35
  encoded into a bitstring.
36
+
37
37
  """
38
38
  payload = serialize_run_definition(run_definition)
39
39
  return _serialize_task_request(payload, queue_name, run_definition.sweep_definition.sweep_id)
@@ -49,6 +49,7 @@ def serialize_sweep_task_request(sweep_definition: SweepDefinition, queue_name:
49
49
  Returns:
50
50
  :class:`~iqm.data_definitions.station_control.v1.task_service_pb2.SweepTaskRequest`
51
51
  encoded into a bitstring.
52
+
52
53
  """
53
54
  payload = serialize_sweep_definition(sweep_definition)
54
55
  return _serialize_task_request(payload, queue_name, sweep_definition.sweep_id)
@@ -13,8 +13,8 @@
13
13
  # limitations under the License.
14
14
  """Station control client implementation."""
15
15
  from collections.abc import Callable, Sequence
16
- from importlib.metadata import version
17
16
  from functools import cache
17
+ from importlib.metadata import version
18
18
  import json
19
19
  import logging
20
20
  import os
@@ -22,15 +22,15 @@ from time import sleep
22
22
  from typing import Any, TypeVar
23
23
  import uuid
24
24
 
25
- from exa.common.data.setting_node import SettingNode
26
- from exa.common.errors.exa_error import RequestError
27
- from exa.common.qcm_data.chad_model import CHAD
28
- from exa.common.qcm_data.qcm_data_client import QCMDataClient
29
25
  from iqm.models.channel_properties import ChannelProperties
30
26
  from opentelemetry import propagate, trace
31
27
  from packaging.version import Version, parse
32
28
  import requests
33
29
 
30
+ from exa.common.data.setting_node import SettingNode
31
+ from exa.common.errors.exa_error import RequestError
32
+ from exa.common.qcm_data.chad_model import CHAD
33
+ from exa.common.qcm_data.qcm_data_client import QCMDataClient
34
34
  from iqm.station_control.client.list_models import (
35
35
  DutFieldDataList,
36
36
  DutList,
@@ -84,7 +84,7 @@ logger = logging.getLogger(__name__)
84
84
  T = TypeVar("T")
85
85
 
86
86
 
87
- # pylint: disable=too-many-public-methods,method-cache-max-size-none)
87
+
88
88
  class StationControlClient:
89
89
  """Station control client implementation.
90
90
 
@@ -137,6 +137,7 @@ class StationControlClient:
137
137
  Generic query methods will return a list of objects, but with additional (optional) "meta" attribute,
138
138
  which contains metadata, like pagination details. The client can ignore this data,
139
139
  or use it to implement pagination logic for example to fetch all results available.
140
+
140
141
  """
141
142
 
142
143
  def __init__(self, root_url: str, get_token_callback: Callable[[], str] | None = None):
@@ -195,6 +196,7 @@ class StationControlClient:
195
196
 
196
197
  Returns:
197
198
  Mapping from channel name to AWGProperties or ReadoutProperties
199
+
198
200
  """
199
201
  headers = {"accept": "application/octet-stream"}
200
202
  response = self._send_request(requests.get, "channel-properties/", headers=headers)
@@ -254,6 +256,7 @@ class StationControlClient:
254
256
 
255
257
  Raises:
256
258
  RequestError if submitting a sweep failed.
259
+
257
260
  """
258
261
  data = serialize_sweep_task_request(sweep_definition, queue_name="sweeps")
259
262
  headers = {"Content-Type": "application/octet-stream"}
@@ -330,6 +333,7 @@ class StationControlClient:
330
333
 
331
334
  Returns:
332
335
  Queried runs with some query related metadata.
336
+
333
337
  """
334
338
  params = self._clean_query_parameters(RunData, **kwargs)
335
339
  response = self._send_request(requests.get, "runs", params=params)
@@ -346,12 +350,13 @@ class StationControlClient:
346
350
 
347
351
  Returns:
348
352
  Created observations, each including also the database created fields like ID and timestamps.
353
+
349
354
  """
350
355
  data = ObservationDefinitionList(observation_definitions).model_dump_json()
351
356
  response = self._send_request(requests.post, "observations", data=data)
352
357
  return self._create_list_with_meta(response, ObservationDataList)
353
358
 
354
- # pylint: disable=too-many-arguments
359
+
355
360
  def get_observations(
356
361
  self,
357
362
  *,
@@ -392,6 +397,7 @@ class StationControlClient:
392
397
 
393
398
  Returns:
394
399
  Observations, each including also the database created fields like ID and timestamps.
400
+
395
401
  """
396
402
  kwargs = {
397
403
  "mode": mode,
@@ -429,6 +435,7 @@ class StationControlClient:
429
435
 
430
436
  Returns:
431
437
  Queried observations with some query related metadata.
438
+
432
439
  """
433
440
  params = self._clean_query_parameters(ObservationData, **kwargs)
434
441
  response = self._send_request(requests.get, "observations", params=params)
@@ -443,6 +450,7 @@ class StationControlClient:
443
450
 
444
451
  Returns:
445
452
  Updated observations, each including also the database created fields like ID and timestamps.
453
+
446
454
  """
447
455
  data = ObservationUpdateList(observation_updates).model_dump_json()
448
456
  response = self._send_request(requests.patch, "observations", data=data)
@@ -467,6 +475,7 @@ class StationControlClient:
467
475
 
468
476
  Returns:
469
477
  Queried observation sets with some query related metadata
478
+
470
479
  """
471
480
  params = self._clean_query_parameters(ObservationSetData, **kwargs)
472
481
  response = self._send_request(requests.get, "observation-sets", params=params)
@@ -483,6 +492,7 @@ class StationControlClient:
483
492
 
484
493
  Raises:
485
494
  ExaError: If creation failed.
495
+
486
496
  """
487
497
  data = observation_set_definition.model_dump_json()
488
498
  response = self._send_request(requests.post, "observation-sets", data=data)
@@ -499,6 +509,7 @@ class StationControlClient:
499
509
 
500
510
  Raises:
501
511
  ExaError: If retrieval failed.
512
+
502
513
  """
503
514
  response = self._send_request(requests.get, f"observation-sets/{observation_set_id}")
504
515
  return ObservationSetData.model_validate(response.json())
@@ -514,6 +525,7 @@ class StationControlClient:
514
525
 
515
526
  Raises:
516
527
  ExaError: If updating failed.
528
+
517
529
  """
518
530
  data = observation_set_update.model_dump_json()
519
531
  response = self._send_request(requests.patch, "observation-sets", data=data)
@@ -529,6 +541,7 @@ class StationControlClient:
529
541
 
530
542
  Raises:
531
543
  ExaError: If finalization failed.
544
+
532
545
  """
533
546
  self._send_request(requests.post, f"observation-sets/{observation_set_id}/finalize")
534
547
 
@@ -540,6 +553,7 @@ class StationControlClient:
540
553
 
541
554
  Returns:
542
555
  Observations belonging to the given observation set.
556
+
543
557
  """
544
558
  response = self._send_request(requests.get, f"observation-sets/{observation_set_id}/observations")
545
559
  return ObservationLiteList.model_validate(response.json())
@@ -567,6 +581,7 @@ class StationControlClient:
567
581
 
568
582
  Returns:
569
583
  Sequence metadatas with some query related metadata.
584
+
570
585
  """
571
586
  params = self._clean_query_parameters(SequenceMetadataData, **kwargs)
572
587
  response = self._send_request(requests.get, "sequence-metadatas", params=params)
@@ -18,11 +18,8 @@ from typing import Any
18
18
  import uuid
19
19
 
20
20
  from exa.common.sweep.util import NdSweep
21
-
22
21
  from iqm.station_control.interface.models.sweep import SweepData, SweepDefinition
23
22
 
24
- # pylint: disable=too-many-instance-attributes
25
-
26
23
 
27
24
  @dataclass(kw_only=True)
28
25
  class RunBase:
@@ -18,9 +18,10 @@ from enum import Enum
18
18
  import uuid
19
19
  import warnings
20
20
 
21
+ from iqm.models.playlist import Playlist
22
+
21
23
  from exa.common.data.setting_node import SettingNode
22
24
  from exa.common.sweep.util import NdSweep
23
- from iqm.models.playlist import Playlist
24
25
 
25
26
 
26
27
  @dataclass(kw_only=True)
@@ -24,7 +24,8 @@ from pydantic_core import core_schema
24
24
  class PydanticBase(BaseModel):
25
25
  """Pydantic base model to change the behaviour of pydantic globally.
26
26
  Note that setting model_config in child classes will merge the configs rather than override this one.
27
- https://docs.pydantic.dev/latest/concepts/config/#change-behaviour-globally"""
27
+ https://docs.pydantic.dev/latest/concepts/config/#change-behaviour-globally
28
+ """
28
29
 
29
30
  model_config = ConfigDict(
30
31
  extra="ignore", # Ignore any extra attributes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iqm-station-control-client
3
- Version: 2.16
3
+ Version: 2.17
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
@@ -1,29 +1,29 @@
1
1
  iqm/station_control/client/__init__.py,sha256=Rc-GZ5J2SCAxsC4dYP4FwMuprYvzKXu6jDHxhJrFoxg,941
2
2
  iqm/station_control/client/list_models.py,sha256=ijfp7F8mHHUvAxNnZEUAIoQGzGTmWwdJjab4S0JYLyI,2334
3
- iqm/station_control/client/station_control.py,sha256=cvyd1xm9m4GNkQlCXWkZ50XCMMyd1vPeLEsuDLVRKpM,35116
3
+ iqm/station_control/client/station_control.py,sha256=QW9c9AWvoaCoGvBXbweiLsNOVJFzzC38mSbcCGTiqlw,35022
4
4
  iqm/station_control/client/utils.py,sha256=r30tFy16WS1CxLX_yNuvPICer5xCJ-swz3cot9A7cbk,1142
5
5
  iqm/station_control/client/serializers/__init__.py,sha256=cNrJ3e9uJ70BmnFQDkuL58A43GcwdUwqCkqcdTWW_Do,1437
6
- iqm/station_control/client/serializers/channel_property_serializer.py,sha256=JRdXcyQykxnKlq5TDmSa4uNbjgGPyckmWo-QQ8NcE1U,7163
6
+ iqm/station_control/client/serializers/channel_property_serializer.py,sha256=rjltcFdpJ_9ZU6v-ABRcN5RI3XF9w_CpyW6WHGBT-9w,7122
7
7
  iqm/station_control/client/serializers/datetime_serializers.py,sha256=3fBcrex1xqOcl6E1A7UPKVBOBMQqZ0TP9bMcA1ArqZU,1121
8
- iqm/station_control/client/serializers/playlist_serializers.py,sha256=t0vQ4V17apPCJ35BY9RDdWWsiUCZq1k42t5e08iu5ec,18178
9
- iqm/station_control/client/serializers/run_serializers.py,sha256=bFGNtRjcAGUN-uM2E6R09oqxpGPdwbQNGghlaIlU1d4,6734
10
- iqm/station_control/client/serializers/setting_node_serializer.py,sha256=XsE0acglaw_vlXh4Dh5RyVsaeI4OJfgA2NY6HZU0CY0,1232
11
- iqm/station_control/client/serializers/struct_serializer.py,sha256=V1OYECPSIkAAv89jU13YcVvlgrngpRn2QWF0nvVKCNA,3395
12
- iqm/station_control/client/serializers/sweep_serializers.py,sha256=EsqcX0A5AGFUFyXGM0ArezGgwkwDOU_u2N6zIDoFLhE,5816
13
- iqm/station_control/client/serializers/task_serializers.py,sha256=JGOu_lF4FOqSbBEiw5zWDjqJeQ96QfJEoH45-hbOLIo,2745
8
+ iqm/station_control/client/serializers/playlist_serializers.py,sha256=OEuM05LcsDtkUVUoBLCP2PdU_TBiC6PHAh9hMWkT1zg,18088
9
+ iqm/station_control/client/serializers/run_serializers.py,sha256=RiVDolpkog8tYWpeBYlnasj_xXL0RVgPBUKqTIGbm44,6697
10
+ iqm/station_control/client/serializers/setting_node_serializer.py,sha256=65Ss6XSNtz-NtNo6P_s_bspEdey53vG1_RqEuXXbAEE,1196
11
+ iqm/station_control/client/serializers/struct_serializer.py,sha256=QztBsbRlRG_UrtpQLE3bi0WKEVn48kVB91H1g26PvqQ,3270
12
+ iqm/station_control/client/serializers/sweep_serializers.py,sha256=ARUzd0jYkCsRwMJgf4F0BE1S8fQoPhv6Rn_UsLI7LZE,5779
13
+ iqm/station_control/client/serializers/task_serializers.py,sha256=1bSLcnPPJIW6dzh5GpOvcBuL6KJD3hphwE0T4U5MiRg,2711
14
14
  iqm/station_control/interface/__init__.py,sha256=MIQla-cBKPbZqBkp-LNyPfjiV0gzf-IFEwrMMhsnKlg,785
15
15
  iqm/station_control/interface/list_with_meta.py,sha256=p7oLA_cRsAKRe_T_eY-9JMDR2ALno_E8U4YUd_nLXmc,1184
16
- iqm/station_control/interface/pydantic_base.py,sha256=ScsBt1m9Ie36SK_rIXLJKiQrXiSg-JrJc1oqLwPNmH0,2980
16
+ iqm/station_control/interface/pydantic_base.py,sha256=4Gl9tnClnmwh2XQ0bJ0aN7w0QqX_lJf8l1Ybc4yL7eY,2985
17
17
  iqm/station_control/interface/models/__init__.py,sha256=PX4b8aU65tx55tFbhFIdgv1fLZq5zfy2rkePKl9ndb0,1526
18
18
  iqm/station_control/interface/models/dut.py,sha256=dd1SpcsBe4P057jvcPqv39SjzekewwP07hThFe5ulNA,1216
19
19
  iqm/station_control/interface/models/observation.py,sha256=Z-OZ0fzyODVRKW5FcNMb0LYUa-zrPQ_Y3G_xa_LyymM,3227
20
20
  iqm/station_control/interface/models/observation_set.py,sha256=W0rHj_9KCgaCecfk4tDFcTfDvxa26dtGCMta66cxkpQ,3030
21
- iqm/station_control/interface/models/run.py,sha256=GQNSUHt-zvL4ns6P5zFL75UEPEYGaB_7revaIEb5M_M,4145
21
+ iqm/station_control/interface/models/run.py,sha256=fIN2tbetjd0UuOe0z7bz2I9xzOt9d4ykJfg7lbT9wrs,4096
22
22
  iqm/station_control/interface/models/sequence.py,sha256=1nRMHAbjY6uV4JgAZ5LiUiPoB_gBp8u1A8KAjxARyP8,2722
23
- iqm/station_control/interface/models/sweep.py,sha256=hVwZoudKsRPM5jPaVCM9yf3sBdzS5haUhQ3h7Uyz5sg,3742
23
+ iqm/station_control/interface/models/sweep.py,sha256=IF-m6R-OZx_dANdPlINur3W10PJYCIIZeoNkwoC4E-U,3743
24
24
  iqm/station_control/interface/models/type_aliases.py,sha256=MbYI-A024nqfr8hFj_2EoP8crOXSiOkWWzKUChOoAgo,1017
25
- iqm_station_control_client-2.16.dist-info/LICENSE.txt,sha256=R6Q7eUrLyoCQgWYorQ8WJmVmWKYU3dxA3jYUp0wwQAw,11332
26
- iqm_station_control_client-2.16.dist-info/METADATA,sha256=-8Dn6iufRkfZIdZcYes_8EbiVDxs51uPCJIDQMdzGlM,13971
27
- iqm_station_control_client-2.16.dist-info/WHEEL,sha256=y4mX-SOX4fYIkonsAGA5N0Oy-8_gI4FXw5HNI1xqvWg,91
28
- iqm_station_control_client-2.16.dist-info/top_level.txt,sha256=NB4XRfyDS6_wG9gMsyX-9LTU7kWnTQxNvkbzIxGv3-c,4
29
- iqm_station_control_client-2.16.dist-info/RECORD,,
25
+ iqm_station_control_client-2.17.dist-info/LICENSE.txt,sha256=R6Q7eUrLyoCQgWYorQ8WJmVmWKYU3dxA3jYUp0wwQAw,11332
26
+ iqm_station_control_client-2.17.dist-info/METADATA,sha256=Cue7aIzCbCAT_z9qwABEx7tI7vGV6D8A2FyMR86IzLg,13971
27
+ iqm_station_control_client-2.17.dist-info/WHEEL,sha256=y4mX-SOX4fYIkonsAGA5N0Oy-8_gI4FXw5HNI1xqvWg,91
28
+ iqm_station_control_client-2.17.dist-info/top_level.txt,sha256=NB4XRfyDS6_wG9gMsyX-9LTU7kWnTQxNvkbzIxGv3-c,4
29
+ iqm_station_control_client-2.17.dist-info/RECORD,,