pymmcore-plus 0.13.6__py3-none-any.whl → 0.14.0__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.
@@ -23,6 +23,7 @@ from pymmcore_plus._util import find_micromanager, print_tabular_data
23
23
  from pymmcore_plus.mda import MDAEngine, MDARunner, PMDAEngine
24
24
  from pymmcore_plus.metadata.functions import summary_metadata
25
25
 
26
+ from . import _device
26
27
  from ._adapter import DeviceAdapter
27
28
  from ._config import Configuration
28
29
  from ._config_group import ConfigGroup
@@ -31,26 +32,38 @@ from ._constants import (
31
32
  DeviceInitializationState,
32
33
  DeviceType,
33
34
  FocusDirection,
35
+ Keyword,
34
36
  PixelType,
35
37
  PropertyType,
36
38
  )
37
- from ._device import Device
38
39
  from ._metadata import Metadata
39
40
  from ._property import DeviceProperty
40
41
  from .events import CMMCoreSignaler, PCoreSignaler, _get_auto_core_callback_class
41
42
 
42
43
  if TYPE_CHECKING:
43
44
  from collections.abc import Iterable, Iterator, Sequence
44
- from typing import Literal, TypedDict, Unpack
45
+ from typing import Literal, TypeAlias, TypedDict, Union, Unpack
45
46
 
46
47
  import numpy as np
48
+ from pymmcore import DeviceLabel
47
49
  from useq import MDAEvent
48
50
 
49
51
  from pymmcore_plus.mda._runner import SingleOutput
50
52
  from pymmcore_plus.metadata.schema import SummaryMetaV1
51
53
 
52
54
  _T = TypeVar("_T")
55
+ _DT = TypeVar("_DT", bound=_device.Device)
53
56
  ListOrTuple = list[_T] | tuple[_T, ...]
57
+ DeviceTypesWithCurrent: TypeAlias = Union[
58
+ Literal[DeviceType.CameraDevice]
59
+ | Literal[DeviceType.ShutterDevice]
60
+ | Literal[DeviceType.StageDevice]
61
+ | Literal[DeviceType.XYStageDevice]
62
+ | Literal[DeviceType.AutoFocusDevice]
63
+ | Literal[DeviceType.SLMDevice]
64
+ | Literal[DeviceType.GalvoDevice]
65
+ | Literal[DeviceType.ImageProcessorDevice]
66
+ ]
54
67
 
55
68
  class PropertySchema(TypedDict, total=False):
56
69
  """JSON schema `dict` describing a device property."""
@@ -334,7 +347,12 @@ class CMMCorePlus(pymmcore.CMMCore):
334
347
  and the property Value has actually changed.
335
348
  """
336
349
  with self._property_change_emission_ensured(stateDeviceLabel, STATE_PROPS):
337
- super().setStateLabel(stateDeviceLabel, stateLabel)
350
+ try:
351
+ super().setStateLabel(stateDeviceLabel, stateLabel)
352
+ except RuntimeError as e: # pragma: no cover
353
+ state_labels = self.getStateLabels(stateDeviceLabel)
354
+ msg = f"{e}. Available Labels: {state_labels}"
355
+ raise RuntimeError(msg) from None
338
356
 
339
357
  def setDeviceAdapterSearchPaths(self, paths: Sequence[str]) -> None:
340
358
  """Set the device adapter search paths.
@@ -377,6 +395,9 @@ class CMMCorePlus(pymmcore.CMMCore):
377
395
  recognized by the specific plugin library. See
378
396
  [`pymmcore.CMMCore.getAvailableDevices`][] for a list of valid device names.
379
397
  """
398
+ if str(label).lower() == Keyword.CoreDevice.value.lower(): # pragma: no cover
399
+ raise ValueError(f"Label {label!r} is reserved.")
400
+
380
401
  try:
381
402
  super().loadDevice(label, moduleName, deviceName)
382
403
  except (RuntimeError, ValueError) as e:
@@ -850,7 +871,7 @@ class CMMCorePlus(pymmcore.CMMCore):
850
871
  device_adapter: str | re.Pattern | None = ...,
851
872
  *,
852
873
  as_object: Literal[True] = ...,
853
- ) -> Iterator[Device]: ...
874
+ ) -> Iterator[_device.Device]: ...
854
875
 
855
876
  def iterDevices(
856
877
  self,
@@ -859,7 +880,7 @@ class CMMCorePlus(pymmcore.CMMCore):
859
880
  device_adapter: str | re.Pattern | None = None,
860
881
  *,
861
882
  as_object: bool = True,
862
- ) -> Iterator[Device] | Iterator[str]:
883
+ ) -> Iterator[_device.Device] | Iterator[str]:
863
884
  """Iterate over currently loaded devices.
864
885
 
865
886
  :sparkles: *This method is new in `CMMCorePlus`.*
@@ -912,7 +933,7 @@ class CMMCorePlus(pymmcore.CMMCore):
912
933
  devices = [d for d in devices if ptrn.search(self.getDeviceLibrary(d))]
913
934
 
914
935
  for dev in devices:
915
- yield Device(dev, mmcore=self) if as_object else dev
936
+ yield _device.Device.create(dev, mmcore=self) if as_object else dev
916
937
 
917
938
  @overload
918
939
  def iterProperties(
@@ -1093,7 +1114,77 @@ class CMMCorePlus(pymmcore.CMMCore):
1093
1114
  """
1094
1115
  return DeviceAdapter(library_name, mmcore=self)
1095
1116
 
1096
- def getDeviceObject(self, device_label: str) -> Device:
1117
+ @overload
1118
+ def getDeviceObject(
1119
+ self, device_label: str, device_type: Literal[DeviceType.Camera]
1120
+ ) -> _device.CameraDevice: ...
1121
+ @overload
1122
+ def getDeviceObject(
1123
+ self, device_label: str, device_type: Literal[DeviceType.Stage]
1124
+ ) -> _device.StageDevice: ...
1125
+ @overload
1126
+ def getDeviceObject(
1127
+ self, device_label: str, device_type: Literal[DeviceType.State]
1128
+ ) -> _device.StateDevice: ...
1129
+ @overload
1130
+ def getDeviceObject(
1131
+ self, device_label: str, device_type: Literal[DeviceType.Shutter]
1132
+ ) -> _device.ShutterDevice: ...
1133
+ @overload
1134
+ def getDeviceObject(
1135
+ self, device_label: str, device_type: Literal[DeviceType.XYStage]
1136
+ ) -> _device.XYStageDevice: ...
1137
+ @overload
1138
+ def getDeviceObject(
1139
+ self, device_label: str, device_type: Literal[DeviceType.Serial]
1140
+ ) -> _device.SerialDevice: ...
1141
+ @overload
1142
+ def getDeviceObject(
1143
+ self, device_label: str, device_type: Literal[DeviceType.Generic]
1144
+ ) -> _device.GenericDevice: ...
1145
+ @overload
1146
+ def getDeviceObject(
1147
+ self, device_label: str, device_type: Literal[DeviceType.AutoFocus]
1148
+ ) -> _device.AutoFocusDevice: ...
1149
+ @overload
1150
+ def getDeviceObject(
1151
+ self, device_label: str, device_type: Literal[DeviceType.ImageProcessor]
1152
+ ) -> _device.ImageProcessorDevice: ...
1153
+ @overload
1154
+ def getDeviceObject(
1155
+ self, device_label: str, device_type: Literal[DeviceType.SignalIO]
1156
+ ) -> _device.SignalIODevice: ...
1157
+ @overload
1158
+ def getDeviceObject(
1159
+ self, device_label: str, device_type: Literal[DeviceType.Magnifier]
1160
+ ) -> _device.MagnifierDevice: ...
1161
+ @overload
1162
+ def getDeviceObject(
1163
+ self, device_label: str, device_type: Literal[DeviceType.SLM]
1164
+ ) -> _device.SLMDevice: ...
1165
+ @overload
1166
+ def getDeviceObject(
1167
+ self, device_label: str, device_type: Literal[DeviceType.Hub]
1168
+ ) -> _device.HubDevice: ...
1169
+ @overload
1170
+ def getDeviceObject(
1171
+ self, device_label: str, device_type: Literal[DeviceType.Galvo]
1172
+ ) -> _device.GalvoDevice: ...
1173
+ @overload
1174
+ def getDeviceObject(
1175
+ self,
1176
+ device_label: Literal[Keyword.CoreDevice],
1177
+ device_type: Literal[DeviceType.Core],
1178
+ ) -> _device.CoreDevice: ...
1179
+ @overload
1180
+ def getDeviceObject(
1181
+ self, device_label: str, device_type: DeviceType = ...
1182
+ ) -> _device.Device: ...
1183
+ @overload
1184
+ def getDeviceObject(self, device_label: str, device_type: type[_DT]) -> _DT: ...
1185
+ def getDeviceObject(
1186
+ self, device_label: str, device_type: type[_DT] | DeviceType = DeviceType.Any
1187
+ ) -> _DT | _device.Device:
1097
1188
  """Return a `Device` object bound to device_label on this core.
1098
1189
 
1099
1190
  :sparkles: *This method is new in `CMMCorePlus`.*
@@ -1136,7 +1227,18 @@ class CMMCorePlus(pymmcore.CMMCore):
1136
1227
  }
1137
1228
  }
1138
1229
  """
1139
- return Device(device_label, mmcore=self)
1230
+ dev = _device.Device.create(device_label, mmcore=self)
1231
+ if (isinstance(device_type, type) and not isinstance(dev, device_type)) or (
1232
+ isinstance(device_type, DeviceType)
1233
+ and device_type not in {DeviceType.Any, DeviceType.Unknown}
1234
+ and dev.type() != device_type
1235
+ ):
1236
+ raise TypeError(
1237
+ f"{device_type!r} requested but device with label "
1238
+ f"{device_label!r} is a {dev.type()}."
1239
+ )
1240
+
1241
+ return dev
1140
1242
 
1141
1243
  def getConfigGroupObject(
1142
1244
  self, group_name: str, allow_missing: bool = False
@@ -1189,6 +1291,61 @@ class CMMCorePlus(pymmcore.CMMCore):
1189
1291
  for group in self.getAvailableConfigGroups():
1190
1292
  yield ConfigGroup(group, mmcore=self)
1191
1293
 
1294
+ def getCurrentDeviceOfType(
1295
+ self, device_type: DeviceTypesWithCurrent
1296
+ ) -> DeviceLabel | Literal[""]:
1297
+ """Return the current device of type `device_type`.
1298
+
1299
+ Only the following device types have a "current" device:
1300
+ - CameraDevice
1301
+ - ShutterDevice
1302
+ - StageDevice
1303
+ - XYStageDevice
1304
+ - AutoFocusDevice
1305
+ - SLMDevice
1306
+ - GalvoDevice
1307
+ - ImageProcessorDevice
1308
+
1309
+ Calling this method with any other device type will raise a `ValueError`.
1310
+
1311
+ :sparkles: *This method is new in `CMMCorePlus`.*
1312
+
1313
+ Parameters
1314
+ ----------
1315
+ device_type : DeviceType
1316
+ The type of device to get the current device for.
1317
+ See [`DeviceType`][pymmcore_plus.DeviceType] for a list of device types.
1318
+
1319
+ Returns
1320
+ -------
1321
+ str
1322
+ The label of the current device of type `device_type`.
1323
+ If no device of that type is currently set, an empty string is returned.
1324
+
1325
+ Raises
1326
+ ------
1327
+ ValueError
1328
+ If the core does not have the concept of a "current" device of the provided
1329
+ `device_type`.
1330
+ """
1331
+ if device_type == DeviceType.CameraDevice:
1332
+ return self.getCameraDevice()
1333
+ if device_type == DeviceType.ShutterDevice:
1334
+ return self.getShutterDevice()
1335
+ if device_type == DeviceType.StageDevice:
1336
+ return self.getFocusDevice()
1337
+ if device_type == DeviceType.XYStageDevice:
1338
+ return self.getXYStageDevice()
1339
+ if device_type == DeviceType.AutoFocusDevice:
1340
+ return self.getAutoFocusDevice()
1341
+ if device_type == DeviceType.SLMDevice:
1342
+ return self.getSLMDevice()
1343
+ if device_type == DeviceType.GalvoDevice:
1344
+ return self.getGalvoDevice()
1345
+ if device_type == DeviceType.ImageProcessorDevice:
1346
+ return self.getImageProcessorDevice()
1347
+ raise ValueError(f"'Current' {device_type.name} is undefined. ")
1348
+
1192
1349
  def getDeviceSchema(self, device_label: str) -> DeviceSchema:
1193
1350
  """Return JSON-schema describing device `device_label` and its properties.
1194
1351
 
@@ -320,7 +320,9 @@ class TensorStoreHandler:
320
320
  ]
321
321
 
322
322
  if self.ts_driver.startswith("zarr"):
323
- store.kvstore.write(".zattrs", json_dumps(metadata).decode("utf-8"))
323
+ store.kvstore.write(
324
+ ".zattrs", json_dumps(metadata).decode("utf-8")
325
+ ).result()
324
326
  elif self.ts_driver == "n5": # pragma: no cover
325
327
  attrs = json_loads(store.kvstore.read("attributes.json").result().value)
326
328
  attrs.update(metadata)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pymmcore-plus
3
- Version: 0.13.6
3
+ Version: 0.14.0
4
4
  Summary: pymmcore superset providing improved APIs, event handling, and a pure python acquisition engine
5
5
  Project-URL: Source, https://github.com/pymmcore-plus/pymmcore-plus
6
6
  Project-URL: Tracker, https://github.com/pymmcore-plus/pymmcore-plus/issues
@@ -25,57 +25,32 @@ Classifier: Topic :: System :: Hardware
25
25
  Classifier: Topic :: System :: Hardware :: Hardware Drivers
26
26
  Classifier: Topic :: Utilities
27
27
  Requires-Python: >=3.9
28
- Requires-Dist: numpy>=1.17.3
28
+ Requires-Dist: numpy>=1.25.2
29
+ Requires-Dist: numpy>=1.26.0; python_version >= '3.12'
30
+ Requires-Dist: numpy>=2.1.0; python_version >= '3.13'
29
31
  Requires-Dist: platformdirs>=3.0.0
30
- Requires-Dist: psygnal>=0.7
31
- Requires-Dist: pymmcore>=10.7.0.71.0
32
+ Requires-Dist: psygnal>=0.10
33
+ Requires-Dist: pymmcore>=11.2.1.71.0
32
34
  Requires-Dist: rich>=10.2.0
33
- Requires-Dist: tensorstore<=0.1.71
35
+ Requires-Dist: tensorstore!=0.1.72,>=0.1.67
36
+ Requires-Dist: tensorstore!=0.1.72,>=0.1.71; python_version >= '3.13'
34
37
  Requires-Dist: typer>=0.4.2
35
- Requires-Dist: typing-extensions
36
- Requires-Dist: useq-schema>=0.7.0
38
+ Requires-Dist: typing-extensions>=4
39
+ Requires-Dist: useq-schema>=0.7.2
37
40
  Provides-Extra: cli
38
41
  Requires-Dist: rich>=10.2.0; extra == 'cli'
39
42
  Requires-Dist: typer>=0.4.2; extra == 'cli'
40
- Provides-Extra: dev
41
- Requires-Dist: ipython; extra == 'dev'
42
- Requires-Dist: mypy; extra == 'dev'
43
- Requires-Dist: pdbpp; (sys_platform != 'win32') and extra == 'dev'
44
- Requires-Dist: pre-commit; extra == 'dev'
45
- Requires-Dist: ruff; extra == 'dev'
46
- Requires-Dist: tensorstore-stubs; extra == 'dev'
47
- Provides-Extra: docs
48
- Requires-Dist: mkdocs-autorefs==1.3.1; extra == 'docs'
49
- Requires-Dist: mkdocs-material; extra == 'docs'
50
- Requires-Dist: mkdocs-typer==0.0.3; extra == 'docs'
51
- Requires-Dist: mkdocs>=1.4; extra == 'docs'
52
- Requires-Dist: mkdocstrings-python==1.1.2; extra == 'docs'
53
- Requires-Dist: mkdocstrings==0.22.0; extra == 'docs'
54
43
  Provides-Extra: io
55
44
  Requires-Dist: tifffile>=2021.6.14; extra == 'io'
56
- Requires-Dist: zarr<3,>=2.2; extra == 'io'
45
+ Requires-Dist: zarr<3,>=2.15; extra == 'io'
57
46
  Provides-Extra: pyqt5
58
47
  Requires-Dist: pyqt5>=5.15.4; extra == 'pyqt5'
59
48
  Provides-Extra: pyqt6
60
- Requires-Dist: pyqt6<6.8,>=6.4.2; extra == 'pyqt6'
49
+ Requires-Dist: pyqt6>=6.4.2; extra == 'pyqt6'
61
50
  Provides-Extra: pyside2
62
- Requires-Dist: pyside2>=5.15; extra == 'pyside2'
51
+ Requires-Dist: pyside2>=5.15.2.1; extra == 'pyside2'
63
52
  Provides-Extra: pyside6
64
- Requires-Dist: pyside6<6.8,>=6.4.0; extra == 'pyside6'
65
- Provides-Extra: test
66
- Requires-Dist: mm-device-adapters; (sys_platform == 'darwin' and platform_machine == 'x86_64') and extra == 'test'
67
- Requires-Dist: mm-device-adapters; (sys_platform == 'win32') and extra == 'test'
68
- Requires-Dist: msgpack; extra == 'test'
69
- Requires-Dist: msgspec; extra == 'test'
70
- Requires-Dist: pytest-cov>=4; extra == 'test'
71
- Requires-Dist: pytest-qt>=4; extra == 'test'
72
- Requires-Dist: pytest>=7.3.2; extra == 'test'
73
- Requires-Dist: qtpy>=2; extra == 'test'
74
- Requires-Dist: rich; extra == 'test'
75
- Requires-Dist: tifffile>=2021.6.14; extra == 'test'
76
- Requires-Dist: typer>=0.4.2; extra == 'test'
77
- Requires-Dist: xarray; extra == 'test'
78
- Requires-Dist: zarr<3,>=2.2; extra == 'test'
53
+ Requires-Dist: pyside6==6.7.3; extra == 'pyside6'
79
54
  Description-Content-Type: text/markdown
80
55
 
81
56
  # pymmcore-plus
@@ -1,22 +1,23 @@
1
- pymmcore_plus/__init__.py,sha256=9-vK2P2jkJJ2REhCjFDBbJu0wrZM0jvDcf-d2GsjTk0,1415
1
+ pymmcore_plus/__init__.py,sha256=EEwtq7bwQ1NC0-wu1DoyA9kJQS7nHqZOlUoYmK3-FQI,1500
2
+ pymmcore_plus/_accumulator.py,sha256=WUgCrLW0U8_kWXfmhSRrC17ubWZNQNckkGVBiTp72F8,9205
2
3
  pymmcore_plus/_benchmark.py,sha256=YJICxXleFQVbOluJdq4OujnIcTkkuMVzeB8GJ8nUv5I,6011
3
4
  pymmcore_plus/_build.py,sha256=RPTAuwCZWGL5IDJj4JZo1DIIouUsIqS3vnbPbG2_bRE,10993
4
- pymmcore_plus/_cli.py,sha256=ofh7Yac4VqVuWrEYZ9ZpY4jR8FYzzxfjihvs1_gOqpM,16768
5
+ pymmcore_plus/_cli.py,sha256=wmqlG8UGBNiTefRppSnRHwnD3w-5DAhN168lIBujbRA,16831
5
6
  pymmcore_plus/_logger.py,sha256=d7ldqxY0rGWORKdIzNUiFc9BW6cFBx57kHWtXyY1HE0,5416
6
7
  pymmcore_plus/_pymmcore.py,sha256=tcWtTRte9AFQznLGn6CmwLW0W3Rsse8N8NQ5L7JwKCc,630
7
- pymmcore_plus/_util.py,sha256=oeJiDgt5_EoC8srmGz-QH_yNCgsxJ4k0C43qrAspL2A,22706
8
+ pymmcore_plus/_util.py,sha256=VGcb_nQu6BBWZsQihed0TrCHdTRADKlBo_qSnIbeF0Q,22814
8
9
  pymmcore_plus/install.py,sha256=U4TbQXbUc12aMtGRF_SkinNOTDCuuzIhME5Oup_4ds0,10768
9
10
  pymmcore_plus/mocks.py,sha256=jNUfmffD1OArtIvEmqWsy7GCrtTpssVF03flH8cEYx8,1867
10
11
  pymmcore_plus/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
12
  pymmcore_plus/seq_tester.py,sha256=ielLx2ZUJrOXVCojk64UXTeKDoARxt8QkQjt5AE5Gng,3776
12
- pymmcore_plus/core/__init__.py,sha256=rYHv5JQVMVDlwYD1wodCc5L9ZbpVld1C_swGx4CRogA,1011
13
+ pymmcore_plus/core/__init__.py,sha256=gCZMmUjvCh4GX3dwKPxiPzt6NQokFtuHl0-tBUG7B9g,1620
13
14
  pymmcore_plus/core/_adapter.py,sha256=eu2BhGe_dnoQrIsh-u3poxWXsiF2Y8pfbKIGWbUgOk8,2857
14
15
  pymmcore_plus/core/_config.py,sha256=yWwOnW6f37lLt83MnodNce04az-g8YDjyo7BvMiTc8s,10672
15
16
  pymmcore_plus/core/_config_group.py,sha256=R-o4xuPDBPQAC3s-mFsiKwHVKWR38L9qq_aoWdPrAq8,8542
16
17
  pymmcore_plus/core/_constants.py,sha256=yS_YVRZQkpvTuQdOPFJdetaFpvXh4CTvd7i0qDIiAuA,13200
17
- pymmcore_plus/core/_device.py,sha256=Pz9Ekhss2c9IBA3B7WyMU2cCwc19Dp_dGVhMkzqUaIE,7762
18
+ pymmcore_plus/core/_device.py,sha256=v58TcROSuvxE5ALBjzS474Dx430e0iMA61OuBSnc2rE,33197
18
19
  pymmcore_plus/core/_metadata.py,sha256=L8x1gX_zXPz02BUqc7eqJM_Bey2G0RyX30SOBs2aBNc,2755
19
- pymmcore_plus/core/_mmcore_plus.py,sha256=15_QvUuURNP23rtN_nkWcqVOx6ohwizZyYPEta6O7ww,94187
20
+ pymmcore_plus/core/_mmcore_plus.py,sha256=Qel61qHKIo-CM4fhji-PZusjs_YuSSkm5n37EO6ESPY,100368
20
21
  pymmcore_plus/core/_property.py,sha256=QsQEzqOAedR24zEJ1Ge4kwScfT_7NOApVcgz6QxBJrI,8265
21
22
  pymmcore_plus/core/_sequencing.py,sha256=QmaCoyWzR9lX-3ldZxGYqAiEqOn8gts3X0qmskZXzQo,16887
22
23
  pymmcore_plus/core/events/__init__.py,sha256=F8r10LEBLrAV8qfkXScSkpqfExdT2XoOx92OqSturpc,1078
@@ -49,7 +50,7 @@ pymmcore_plus/mda/handlers/__init__.py,sha256=TbgpRdcs3BRdCf6uXJlwo_IIbxM6xXaLoc
49
50
  pymmcore_plus/mda/handlers/_img_sequence_writer.py,sha256=XUJovvdWViTkn2VZr4XcovNIuBNZF4J4cCHIdwAs1WE,11639
50
51
  pymmcore_plus/mda/handlers/_ome_tiff_writer.py,sha256=pqqdl3KQd0tH5Gp4rHVgYqqh2Y8iwoKRXTjwq1JLy1E,6239
51
52
  pymmcore_plus/mda/handlers/_ome_zarr_writer.py,sha256=cKg3kJR7TId6M2qC1nJMLlxkv5vlfA5XEAlTIr9kt_E,12275
52
- pymmcore_plus/mda/handlers/_tensorstore_handler.py,sha256=rgLyuTJjV1m5j-O5tLm-BggIblJpdrHa_FB17_S7rug,15282
53
+ pymmcore_plus/mda/handlers/_tensorstore_handler.py,sha256=YrKwahypq1yoXP3cOcsJTGF-f4LOLrp4KuNHYzPBK64,15321
53
54
  pymmcore_plus/mda/handlers/_util.py,sha256=pZydpKAXtQ_gjq5x1yNK1D0hfS7NUL2nH9ivOBg4abc,1600
54
55
  pymmcore_plus/metadata/__init__.py,sha256=0o_v53kwR4U_RLlCnr7GD1G6OdFlVuUByIqXiaaM5uk,699
55
56
  pymmcore_plus/metadata/functions.py,sha256=Nw2zMbJx0c6aJs6I_uaLGz6cop0IIPfRZOR-qx-SQbc,12937
@@ -64,8 +65,8 @@ pymmcore_plus/model/_device.py,sha256=AX3rO2gbY7AXJyMN3FfI_n2jl2V0IAPuBh7MiDA5Sq
64
65
  pymmcore_plus/model/_microscope.py,sha256=69VV6cuevinOK_LhYEkQygHGesvCZefdn9YNt3mV618,11353
65
66
  pymmcore_plus/model/_pixel_size_config.py,sha256=RXk8AAwARe8clsXue0GZfOTb1bxyXIsO0ibcDLHM4_s,3889
66
67
  pymmcore_plus/model/_property.py,sha256=NQzNtnEzSCR9ogwx1cfi8X-qbJ_cBSJKdSBAaoKoPQ0,3720
67
- pymmcore_plus-0.13.6.dist-info/METADATA,sha256=LPZrzi2nVttLeRhGn-UlURw4NUoOVOG34fUn59_S3Yc,9961
68
- pymmcore_plus-0.13.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
69
- pymmcore_plus-0.13.6.dist-info/entry_points.txt,sha256=NtFyndrQzBpUNJyil-8e5hMGke2utAf7mkGavTLcLOY,51
70
- pymmcore_plus-0.13.6.dist-info/licenses/LICENSE,sha256=OHJjRpOPKKRc7FEnpehNWdR5LRBdBhUtIFG-ZI0dCEA,1522
71
- pymmcore_plus-0.13.6.dist-info/RECORD,,
68
+ pymmcore_plus-0.14.0.dist-info/METADATA,sha256=OzbM7QxgZUlFrhCR3w4lpdchrL7i4AGeANeLqwvl8J0,8835
69
+ pymmcore_plus-0.14.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
70
+ pymmcore_plus-0.14.0.dist-info/entry_points.txt,sha256=NtFyndrQzBpUNJyil-8e5hMGke2utAf7mkGavTLcLOY,51
71
+ pymmcore_plus-0.14.0.dist-info/licenses/LICENSE,sha256=OHJjRpOPKKRc7FEnpehNWdR5LRBdBhUtIFG-ZI0dCEA,1522
72
+ pymmcore_plus-0.14.0.dist-info/RECORD,,