ophyd-async 0.3.1a1__py3-none-any.whl → 0.3.3__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.
@@ -1,8 +1,6 @@
1
1
  import asyncio
2
- from dataclasses import dataclass
3
- from enum import Enum
4
2
  from pathlib import Path
5
- from typing import Any, AsyncGenerator, AsyncIterator, Dict, List, Optional
3
+ from typing import AsyncGenerator, AsyncIterator, Dict, List, Optional
6
4
 
7
5
  from bluesky.protocols import DataKey, StreamAsset
8
6
  from p4p.client.thread import Context
@@ -10,98 +8,25 @@ from p4p.client.thread import Context
10
8
  from ophyd_async.core import (
11
9
  DEFAULT_TIMEOUT,
12
10
  DetectorWriter,
13
- Device,
14
11
  DirectoryProvider,
15
- NameProvider,
16
- SignalR,
17
12
  wait_for_value,
18
13
  )
19
14
  from ophyd_async.core.signal import observe_value
20
- from ophyd_async.panda import CommonPandaBlocks
21
15
 
16
+ from .._common_blocks import CommonPandaBlocks
22
17
  from ._panda_hdf_file import _HDFDataset, _HDFFile
23
18
 
24
19
 
25
- class Capture(str, Enum):
26
- # Capture signals for the HDF Panda
27
- No = "No"
28
- Value = "Value"
29
- Diff = "Diff"
30
- Sum = "Sum"
31
- Mean = "Mean"
32
- Min = "Min"
33
- Max = "Max"
34
- MinMax = "Min Max"
35
- MinMaxMean = "Min Max Mean"
36
-
37
-
38
- def get_capture_signals(
39
- block: Device, path_prefix: Optional[str] = ""
40
- ) -> Dict[str, SignalR]:
41
- """Get dict mapping a capture signal's name to the signal itself"""
42
- if not path_prefix:
43
- path_prefix = ""
44
- signals: Dict[str, SignalR[Any]] = {}
45
- for attr_name, attr in block.children():
46
- # Capture signals end in _capture, but num_capture is a red herring
47
- if attr_name == "num_capture":
48
- continue
49
- dot_path = f"{path_prefix}{attr_name}"
50
- if isinstance(attr, SignalR) and attr_name.endswith("_capture"):
51
- signals[dot_path] = attr
52
- attr_signals = get_capture_signals(attr, path_prefix=dot_path + ".")
53
- signals.update(attr_signals)
54
- return signals
55
-
56
-
57
- @dataclass
58
- class CaptureSignalWrapper:
59
- signal: SignalR
60
- capture_type: Capture
61
-
62
-
63
- # This should return a dictionary which contains a dict, containing the Capture
64
- # signal object, and the value of that signal
65
- async def get_signals_marked_for_capture(
66
- capture_signals: Dict[str, SignalR],
67
- ) -> Dict[str, CaptureSignalWrapper]:
68
- # Read signals to see if they should be captured
69
- do_read = [signal.get_value() for signal in capture_signals.values()]
70
-
71
- signal_values = await asyncio.gather(*do_read)
72
-
73
- assert len(signal_values) == len(
74
- capture_signals
75
- ), "Length of read signals are different to length of signals"
76
-
77
- signals_to_capture: Dict[str, CaptureSignalWrapper] = {}
78
- for signal_path, signal_object, signal_value in zip(
79
- capture_signals.keys(), capture_signals.values(), signal_values
80
- ):
81
- signal_path = signal_path.replace("_capture", "")
82
- if (signal_value in iter(Capture)) and (signal_value != Capture.No):
83
- signals_to_capture[signal_path] = CaptureSignalWrapper(
84
- signal_object,
85
- signal_value,
86
- )
87
-
88
- return signals_to_capture
89
-
90
-
91
20
  class PandaHDFWriter(DetectorWriter):
92
21
  _ctxt: Optional[Context] = None
93
22
 
94
23
  def __init__(
95
24
  self,
96
- prefix: str,
97
25
  directory_provider: DirectoryProvider,
98
- name_provider: NameProvider,
99
26
  panda_device: CommonPandaBlocks,
100
27
  ) -> None:
101
28
  self.panda_device = panda_device
102
- self._prefix = prefix
103
29
  self._directory_provider = directory_provider
104
- self._name_provider = name_provider
105
30
  self._datasets: List[_HDFDataset] = []
106
31
  self._file: Optional[_HDFFile] = None
107
32
  self._multiplier = 1
@@ -110,14 +35,9 @@ class PandaHDFWriter(DetectorWriter):
110
35
  async def open(self, multiplier: int = 1) -> Dict[str, DataKey]:
111
36
  """Retrieve and get descriptor of all PandA signals marked for capture"""
112
37
 
113
- # Get capture PVs by looking at panda. Gives mapping of dotted attribute path
114
- # to Signal object
115
- self.capture_signals = get_capture_signals(self.panda_device)
116
-
117
38
  # Ensure flushes are immediate
118
39
  await self.panda_device.data.flush_period.set(0)
119
40
 
120
- to_capture = await get_signals_marked_for_capture(self.capture_signals)
121
41
  self._file = None
122
42
  info = self._directory_provider()
123
43
  # Set the initial values
@@ -133,36 +53,21 @@ class PandaHDFWriter(DetectorWriter):
133
53
 
134
54
  # Wait for it to start, stashing the status that tells us when it finishes
135
55
  await self.panda_device.data.capture.set(True)
136
- name = self._name_provider()
137
56
  if multiplier > 1:
138
57
  raise ValueError(
139
58
  "All PandA datasets should be scalar, multiplier should be 1"
140
59
  )
141
- self._datasets = []
142
- for attribute_path, capture_signal in to_capture.items():
143
- split_path = attribute_path.split(".")
144
- signal_name = split_path[-1]
145
- # Get block names from numbered blocks, eg INENC[1]
146
- block_name = (
147
- f"{split_path[-3]}{split_path[-2]}"
148
- if split_path[-2].isnumeric()
149
- else split_path[-2]
150
- )
151
60
 
152
- for suffix in capture_signal.capture_type.split(" "):
153
- self._datasets.append(
154
- _HDFDataset(
155
- name,
156
- block_name,
157
- f"{name}-{block_name}-{signal_name}-{suffix}",
158
- f"{block_name}-{signal_name}".upper() + f"-{suffix}",
159
- [1],
160
- multiplier=1,
161
- )
162
- )
61
+ return await self._describe()
163
62
 
63
+ async def _describe(self) -> Dict[str, DataKey]:
64
+ """
65
+ Return a describe based on the datasets PV
66
+ """
67
+
68
+ await self._update_datasets()
164
69
  describe = {
165
- ds.name: DataKey(
70
+ ds.data_key: DataKey(
166
71
  source=self.panda_device.data.hdf_directory.source,
167
72
  shape=ds.shape,
168
73
  dtype="array" if ds.shape != [1] else "number",
@@ -172,6 +77,18 @@ class PandaHDFWriter(DetectorWriter):
172
77
  }
173
78
  return describe
174
79
 
80
+ async def _update_datasets(self) -> None:
81
+ """
82
+ Load data from the datasets PV on the panda, update internal
83
+ representation of datasets that the panda will write.
84
+ """
85
+
86
+ capture_table = await self.panda_device.data.datasets.get_value()
87
+ self._datasets = [
88
+ _HDFDataset(dataset_name, "/" + dataset_name, [1], multiplier=1)
89
+ for dataset_name in capture_table["name"]
90
+ ]
91
+
175
92
  # Next few functions are exactly the same as AD writer. Could move as default
176
93
  # StandardDetector behavior
177
94
  async def wait_for_index(
@@ -9,10 +9,8 @@ from ophyd_async.core import DirectoryInfo
9
9
 
10
10
  @dataclass
11
11
  class _HDFDataset:
12
- device_name: str
13
- block: str
14
- name: str
15
- path: str
12
+ data_key: str
13
+ internal_path: str
16
14
  shape: List[int]
17
15
  multiplier: int
18
16
 
@@ -29,12 +27,10 @@ class _HDFFile:
29
27
  compose_stream_resource(
30
28
  spec="AD_HDF5_SWMR_SLICE",
31
29
  root=str(directory_info.root),
32
- data_key=ds.name,
30
+ data_key=ds.data_key,
33
31
  resource_path=(f"{str(directory_info.root)}/{full_file_name}"),
34
32
  resource_kwargs={
35
- "name": ds.name,
36
- "block": ds.block,
37
- "path": ds.path,
33
+ "path": ds.internal_path,
38
34
  "multiplier": ds.multiplier,
39
35
  "timestamps": "/entry/instrument/NDAttributes/NDArrayTimeStamp",
40
36
  },
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ophyd-async
3
- Version: 0.3.1a1
3
+ Version: 0.3.3
4
4
  Summary: Asynchronous Bluesky hardware abstraction code, compatible with control systems like EPICS and Tango
5
5
  Author-email: Tom Cobb <tom.cobb@diamond.ac.uk>
6
6
  License: BSD 3-Clause License
@@ -41,7 +41,7 @@ Requires-Python: >=3.10
41
41
  Description-Content-Type: text/markdown
42
42
  License-File: LICENSE
43
43
  Requires-Dist: networkx >=2.0
44
- Requires-Dist: numpy
44
+ Requires-Dist: numpy <2.0.0
45
45
  Requires-Dist: packaging
46
46
  Requires-Dist: pint
47
47
  Requires-Dist: bluesky >=1.13.0a3
@@ -1,27 +1,27 @@
1
1
  ophyd_async/__init__.py,sha256=v-rRiDOgZ3sQSMQKq0vgUQZvpeOkoHFXissAx6Ktg84,61
2
2
  ophyd_async/__main__.py,sha256=G-Zcv_G9zK7Nhx6o5L5w-wyhMxdl_WgyMELu8IMFqAE,328
3
- ophyd_async/_version.py,sha256=39a0mpBwpK0E4r9y1sT8m6uZMtoy7wbaTItax3Zomyc,413
3
+ ophyd_async/_version.py,sha256=FKnJIExgNrZG2xJ0y_dGNBpxGbGBYylvfat-jHhLUuM,411
4
4
  ophyd_async/log.py,sha256=DbMjt0bkfUOLHIinZYt0Q0FHZmCXXi5x8y0uFiEmqoQ,3587
5
5
  ophyd_async/protocols.py,sha256=EF2W9nfElV-0QNMYrX1zusL1PqDJR3kNsjlalR29j0I,3412
6
- ophyd_async/core/__init__.py,sha256=znjVeRfrDVJbGLEkUczeKMW46kV6HDrlE4lV0SqvZt4,2952
6
+ ophyd_async/core/__init__.py,sha256=xqO9riU_uKqGAOi0ty0cbcI4Oawi_J3XTYLtwNSXGOE,3061
7
7
  ophyd_async/core/_providers.py,sha256=LrlTMPHKXWOPVkpAOw-pqBq0kip-c3C9ZZPoFfiaV4M,2212
8
8
  ophyd_async/core/async_status.py,sha256=9TOgOXIAuH62RDo5t-Y5GdjrJ76d_6TFlBxYv-5_a88,4367
9
9
  ophyd_async/core/detector.py,sha256=NMX8y_yiViHbv3CaJ7LxzXYkH6tCWI3LocpQ3w4lGEQ,11176
10
10
  ophyd_async/core/device.py,sha256=280zFnLCoiMZAA-Dh1_AjUSnhxUfKYGgj4H_2S1njOA,7086
11
- ophyd_async/core/device_save_loader.py,sha256=RXA3dPUPihAR2ZGDStlGiA-TAsr_xqL0snsCjMsMnfA,9138
11
+ ophyd_async/core/device_save_loader.py,sha256=EK7FB5oWiLI_s2KZ1BNDQ2AUKVbFLlimMl0vXfsjcgo,8223
12
12
  ophyd_async/core/flyer.py,sha256=bIjzBkrl8HVAlKgsZ_FF0WL69Qvksyzp9ZWmTLl8Yrw,2304
13
13
  ophyd_async/core/mock_signal_backend.py,sha256=Ug6jK72wm9vM6EueoUrYgcXtiFzdPUEISRe86LdyYKc,2844
14
14
  ophyd_async/core/mock_signal_utils.py,sha256=LE8VxNq3jfaTePnHHpZpKCi1vwKi8EIg-g1jfw-Q5bQ,4726
15
- ophyd_async/core/signal.py,sha256=FbTb5qDPLhVxEbh6gimqXfkZwcqB4ymHTEYVXZVZYrk,16456
16
- ophyd_async/core/signal_backend.py,sha256=fT3q0WED3JHmNKYCs7PzDLCK4cUPVin3wQjDNPdHqAY,1525
17
- ophyd_async/core/soft_signal_backend.py,sha256=56zvcEi4c8n1yYbafTbp7X0VhSkhoehm3L8RBhu2fik,5596
15
+ ophyd_async/core/signal.py,sha256=hPpMcdq7zx6HOkyQCJrMD5F3uLBEJJTfwL6DsbcTELo,17601
16
+ ophyd_async/core/signal_backend.py,sha256=U9J6jzHXRNIrdtGiZBVxXTRtzeejXiXEEIOGRIQhiS8,2678
17
+ ophyd_async/core/soft_signal_backend.py,sha256=6ve1NWuEZFW4oFkAdSfTKFg06fv7rDLgr5IAEr_axeo,6262
18
18
  ophyd_async/core/standard_readable.py,sha256=fhq_WAZtLYWrw6DvvrFRYRAPOUP2_IcX4qLucoEEeOg,9049
19
19
  ophyd_async/core/utils.py,sha256=3oZcXNqAUHX4ZWMBH5gSuK6cFWEhSkZ9GSDYv0pf8jc,5783
20
20
  ophyd_async/epics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  ophyd_async/epics/_backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- ophyd_async/epics/_backend/_aioca.py,sha256=cpPNZmRMi7FnAh2-3ec5uklLVFOqsmEmpI1nh5Ud1Ls,8794
23
- ophyd_async/epics/_backend/_p4p.py,sha256=lIKx7kQ2o8h3M4wPwrq8JBo8xuDnasJxpDH2ATVBY78,12257
24
- ophyd_async/epics/_backend/common.py,sha256=16mAuxDwA3eZFjUW8DHMabaW3CtEI0Qe8DLpP2xlW7Y,814
22
+ ophyd_async/epics/_backend/_aioca.py,sha256=YsKHGaHtYjBte5Tz-AftTENaeV6UGRnonX-1UmAQGqg,11319
23
+ ophyd_async/epics/_backend/_p4p.py,sha256=oCT8MeVWlhmsxZ8YRSrelrY8W3NvfpXcMlfAKL_AUNY,14331
24
+ ophyd_async/epics/_backend/common.py,sha256=ffdcKhtUc8Mmm0AsV0K7cUoOttF6avcN6Kdd4QHjrSw,1833
25
25
  ophyd_async/epics/areadetector/__init__.py,sha256=ViKzx-wUxkRyNR33wfpL11QB97o0J47_KMyI2C_NphI,510
26
26
  ophyd_async/epics/areadetector/aravis.py,sha256=YklN4V0loqUQBs4swVX304N49JIGPvrNOk8iA5EWofg,2127
27
27
  ophyd_async/epics/areadetector/kinetix.py,sha256=7rE2MLnz9DEmeiN9pCekDfpXuZ2DErnMajRp_9eoLZY,1359
@@ -33,10 +33,10 @@ ophyd_async/epics/areadetector/controllers/__init__.py,sha256=af58ci7X2z2s_FyUwR
33
33
  ophyd_async/epics/areadetector/controllers/ad_sim_controller.py,sha256=mthZ6WxajMEgUKptq3bnkIctbLhjzTagV66i1auB8cg,1587
34
34
  ophyd_async/epics/areadetector/controllers/aravis_controller.py,sha256=CIfnZdq_NobO_UMC2TJoAfUEP9GlzZg5z5bz6Dn1DxY,2669
35
35
  ophyd_async/epics/areadetector/controllers/kinetix_controller.py,sha256=9QmydX85QOXfQL_UX49M9EQ2b2hUZPVzLxgGQn-A9Oc,1611
36
- ophyd_async/epics/areadetector/controllers/pilatus_controller.py,sha256=jJdY97JATz-bWtEPtmnyQ-Zyjvhy2M78i0wUuXO2dtE,2617
36
+ ophyd_async/epics/areadetector/controllers/pilatus_controller.py,sha256=6AiMz2yBA9xig-BrAIAc9CDxwM4Cjfebc4dd7QRutB0,2740
37
37
  ophyd_async/epics/areadetector/controllers/vimba_controller.py,sha256=Eh4Hr9rWgq1mKvE93JzgixntjPHxF3_07GTFqiOdZqE,2123
38
- ophyd_async/epics/areadetector/drivers/__init__.py,sha256=-Ib0Lz4fFQQmB7K0uFxMDvAerkLxadMQERH7lNAvrs4,495
39
- ophyd_async/epics/areadetector/drivers/ad_base.py,sha256=18WFAiWEUg0H2LcvTQHrKYj2wThGafQzDpiyAWki6vo,3411
38
+ ophyd_async/epics/areadetector/drivers/__init__.py,sha256=X-KdXw7YWNXpaUCXby2Spqvho2x2n72OavR-3mRlxzk,605
39
+ ophyd_async/epics/areadetector/drivers/ad_base.py,sha256=OMySyCE9dcFRcVLC5Q0wUkri3QtRljIbn4KFdkumI4M,4553
40
40
  ophyd_async/epics/areadetector/drivers/aravis_driver.py,sha256=PmIygsVNoxxYHvZZzFAbAm2DXmXFc13nAzL_DJB6YSU,1464
41
41
  ophyd_async/epics/areadetector/drivers/kinetix_driver.py,sha256=yIV23BkGBJ4i0VskLiLL7AFbadCCR6Ch1UwUDJ9r2YM,743
42
42
  ophyd_async/epics/areadetector/drivers/pilatus_driver.py,sha256=0DBBuiR_FtwzVVdDW0ifdSrdKZtnprWuy87g66o8RlQ,619
@@ -52,22 +52,22 @@ ophyd_async/epics/demo/demo_ad_sim_detector.py,sha256=06y65yvaqXvL2rDocjYyLz9kTV
52
52
  ophyd_async/epics/demo/mover.db,sha256=RFz0rxZue689Wh1sWTZwWeFMUrH04ttPq2u5xJH_Fp4,998
53
53
  ophyd_async/epics/demo/sensor.db,sha256=AVtiydrdtwAz2EFurO2Ult9SSRtre3r0akOBbL98LT0,554
54
54
  ophyd_async/epics/motion/__init__.py,sha256=tnmVRIwKa9PdN_xonJdAUD04UpEceh-hoD7XI62yDB0,46
55
- ophyd_async/epics/motion/motor.py,sha256=G8cc-okSXJ6s2fGxRO155xm7PrBbVImBmBMRWts895k,3630
55
+ ophyd_async/epics/motion/motor.py,sha256=tqLV4TaW2MIapZsmx4wxnGOdKfkhxKLUPbTHA4YLdYE,3514
56
56
  ophyd_async/epics/pvi/__init__.py,sha256=TbOQNY4enQWgtr1T7x129vpo2p7FIFlr8cyZqqv5Lk4,158
57
- ophyd_async/epics/pvi/pvi.py,sha256=PJdY3rCRyIQbsbHDru-TJ-IVOItyaQwCQKAC0Widu6A,11363
57
+ ophyd_async/epics/pvi/pvi.py,sha256=Kc3klnA9F82h_p2atFYXe-wFO9OzN5TV69Tc56tD2do,12204
58
58
  ophyd_async/epics/signal/__init__.py,sha256=JXKBSGpRL9y3auh27JRxsqDn_rBOXpJjtd4nCuDOX2g,261
59
59
  ophyd_async/epics/signal/_epics_transport.py,sha256=DEIL0iYUAWssysVEgWGu1fHSM1l-ATV2kjUgPtDN9LY,858
60
60
  ophyd_async/epics/signal/signal.py,sha256=M8ZVG_zLdYJfroCRX-u_w8c3yIhswSRw8e3RkW2szio,3166
61
61
  ophyd_async/panda/__init__.py,sha256=FuSnvp-RtdA0X4RcHEF0nTiXymRts2MNdFmF_1_i41w,775
62
- ophyd_async/panda/_common_blocks.py,sha256=n0PPc1rar43oDSIA-yNubTc8fR5YCW1tyjQU58whsg0,1038
63
- ophyd_async/panda/_hdf_panda.py,sha256=TWzBnyJcLmltQyOr5nXbCAZdVRqY633ogBX6pY06p3g,1375
62
+ ophyd_async/panda/_common_blocks.py,sha256=OrA_mSJslxuhjIAD8Liye1-1yTl3DihqFDBXvJGlPFs,1088
63
+ ophyd_async/panda/_hdf_panda.py,sha256=LWWQErG_cxM7zWqKG8c40O55ZpfTu3F70d4jVvRaeMo,1308
64
64
  ophyd_async/panda/_panda_controller.py,sha256=dIqcjmaIHVrki8UXSoDx46kk6I2Lhpe2o3sXNg5f-RQ,1238
65
- ophyd_async/panda/_table.py,sha256=dLoRP4zYNOkD_s0Vkp2wVYAwkjVG8nNdf8-FaXOTfPo,5655
65
+ ophyd_async/panda/_table.py,sha256=keCGT66y91feO_MD3a6aMsgx27JuLYWLrAkl0lRXUKY,5854
66
66
  ophyd_async/panda/_trigger.py,sha256=tBH8uq_4o1ASG9yofVxq3tjf5v8LPzniDTRL4yjramI,1195
67
67
  ophyd_async/panda/_utils.py,sha256=VHW5kPVISyEkmse_qQcyisBkkEwMO6GG2Ago-CH1AFA,487
68
68
  ophyd_async/panda/writers/__init__.py,sha256=xy7BguVQG4HNIDBfKPjMj0KQo1tptC9LbCpEuMcVGaM,70
69
- ophyd_async/panda/writers/_hdf_writer.py,sha256=vnyIg3JmlzMIIq75o0IDMfGzBm_GJAhOUisAZE_0cyg,7597
70
- ophyd_async/panda/writers/_panda_hdf_file.py,sha256=42iHaTax4JjOBpNC7d4nkNL9SM14OTnFPTIcXv2jg-4,1759
69
+ ophyd_async/panda/writers/_hdf_writer.py,sha256=SP71y2-LTKhlNIFxLIddmtjmrg6MDwGvuwQ7X-5OP98,4698
70
+ ophyd_async/panda/writers/_panda_hdf_file.py,sha256=WnGvNWuLe4KljhlmBLM4Y0HKSJCIBNWOwXxioPkGu6Y,1673
71
71
  ophyd_async/plan_stubs/__init__.py,sha256=nO9ELG9J7fYwfVTVRWVorz4kffeszYpwk1ROh6Ha--w,405
72
72
  ophyd_async/plan_stubs/ensure_connected.py,sha256=1MkDu8UqVRPHLnW9IXRn-QvKiG8-rCV8T4KDbjf9K6w,557
73
73
  ophyd_async/plan_stubs/fly.py,sha256=fQwBeLw57-NeBsroVxKDa8kpuu6fgTWYWimbsatCL28,4999
@@ -78,9 +78,9 @@ ophyd_async/sim/sim_pattern_detector_writer.py,sha256=ESpcVyHd1TP7Cojznv2hJAwLin
78
78
  ophyd_async/sim/sim_pattern_generator.py,sha256=L4jTnEVUFBRXIWq_UMHqx00YDdbGO2pjo_IuuVwpzXE,1258
79
79
  ophyd_async/sim/demo/__init__.py,sha256=9mxKpslrL89cfSj4g3og8Br3O--pMj3hhWZS-Xu6kyA,56
80
80
  ophyd_async/sim/demo/sim_motor.py,sha256=a2p5wnHXjF-V5zOFai7jnszk4kbGmrZRnUqBtkOgEfQ,3733
81
- ophyd_async-0.3.1a1.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
82
- ophyd_async-0.3.1a1.dist-info/METADATA,sha256=UzvVcuHH--IPgAEy0SCsfaBBUXHs6QcDJkzuw4l3eDs,6287
83
- ophyd_async-0.3.1a1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
84
- ophyd_async-0.3.1a1.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
85
- ophyd_async-0.3.1a1.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
86
- ophyd_async-0.3.1a1.dist-info/RECORD,,
81
+ ophyd_async-0.3.3.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
82
+ ophyd_async-0.3.3.dist-info/METADATA,sha256=Qxc3xG70gcEsnobVJlfDQzmkW5Y-sEAagHCNtcr_Lwk,6292
83
+ ophyd_async-0.3.3.dist-info/WHEEL,sha256=mguMlWGMX-VHnMpKOjjQidIo1ssRlCFu4a4mBpz1s2M,91
84
+ ophyd_async-0.3.3.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
85
+ ophyd_async-0.3.3.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
86
+ ophyd_async-0.3.3.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: setuptools (70.1.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5