opentrons 8.8.0a7__py3-none-any.whl → 8.8.0a8__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.

Potentially problematic release.


This version of opentrons might be problematic. Click here for more details.

opentrons/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '8.8.0a7'
32
- __version_tuple__ = version_tuple = (8, 8, 0, 'a7')
31
+ __version__ = version = '8.8.0a8'
32
+ __version_tuple__ = version_tuple = (8, 8, 0, 'a8')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -3089,6 +3089,7 @@ class OT3API(
3089
3089
  volume: float,
3090
3090
  rate: float = 1.0,
3091
3091
  movement_delay: Optional[float] = None,
3092
+ end_critical_point: Optional[CriticalPoint] = None,
3092
3093
  ) -> None:
3093
3094
  """
3094
3095
  Aspirate a volume of liquid (in microliters/uL) while moving the z axis synchronously.
@@ -3108,7 +3109,7 @@ class OT3API(
3108
3109
  end_position = target_position_from_absolute(
3109
3110
  realmount,
3110
3111
  end_point,
3111
- self.critical_point_for,
3112
+ partial(self.critical_point_for, cp_override=end_critical_point),
3112
3113
  top_types.Point(*self._config.left_mount_offset),
3113
3114
  top_types.Point(*self._config.right_mount_offset),
3114
3115
  top_types.Point(*self._config.gripper_mount_offset),
@@ -3123,6 +3124,9 @@ class OT3API(
3123
3124
  delay: Optional[Tuple[List[Axis], float]] = None
3124
3125
  if movement_delay is not None:
3125
3126
  delay = ([Axis.X, Axis.Y, Axis.Z_L, Axis.Z_R], movement_delay)
3127
+ self._log.info(
3128
+ f"aspirate_while_tracking: end at {end_point} {end_critical_point}, machine pos {end_position}, with plunger {target_pos}, delay {delay}"
3129
+ )
3126
3130
  try:
3127
3131
  await self._backend.set_active_current(
3128
3132
  {aspirate_spec.axis: aspirate_spec.current}
@@ -3158,6 +3162,7 @@ class OT3API(
3158
3162
  rate: float = 1.0,
3159
3163
  is_full_dispense: bool = False,
3160
3164
  movement_delay: Optional[float] = None,
3165
+ end_critical_point: Optional[CriticalPoint] = None,
3161
3166
  ) -> None:
3162
3167
  """
3163
3168
  Dispense a volume of liquid (in microliters/uL) while moving the z axis synchronously.
@@ -3177,7 +3182,7 @@ class OT3API(
3177
3182
  end_position = target_position_from_absolute(
3178
3183
  realmount,
3179
3184
  end_point,
3180
- self.critical_point_for,
3185
+ partial(self.critical_point_for, cp_override=end_critical_point),
3181
3186
  top_types.Point(*self._config.left_mount_offset),
3182
3187
  top_types.Point(*self._config.right_mount_offset),
3183
3188
  top_types.Point(*self._config.gripper_mount_offset),
@@ -3192,7 +3197,9 @@ class OT3API(
3192
3197
  delay: Optional[Tuple[List[Axis], float]] = None
3193
3198
  if movement_delay is not None:
3194
3199
  delay = ([Axis.X, Axis.Y, Axis.Z_L, Axis.Z_R], movement_delay)
3195
-
3200
+ self._log.info(
3201
+ f"dispense_while_tracking: end at {end_point} {end_critical_point}, machine pos {end_position}, with plunger {target_pos}, delay {delay}"
3202
+ )
3196
3203
  try:
3197
3204
  await self._backend.set_active_current(
3198
3205
  {dispense_spec.axis: dispense_spec.current}
@@ -129,15 +129,17 @@ class LiquidHandler(
129
129
  volume: float,
130
130
  flow_rate: float = 1.0,
131
131
  movement_delay: Optional[float] = None,
132
+ end_critical_point: Optional[CriticalPoint] = None,
132
133
  ) -> None:
133
134
  """
134
135
  Aspirate a volume of liquid (in microliters/uL) while moving the z axis synchronously.
135
136
 
136
137
  :param mount: A robot mount that the instrument is on.
137
- :param z_distance: The distance the z axis will move during apsiration.
138
+ :param end_point: The deck coordinate point to move the tip to during the aspirate.
138
139
  :param volume: The volume of liquid to be aspirated.
139
140
  :param flow_rate: The flow rate to aspirate with.
140
141
  :param movement_delay: Time to wait after the pipette starts aspirating before x/y/z movement.
142
+ :param end_critical_point: The critical point for the end_point position.
141
143
  """
142
144
  ...
143
145
 
@@ -172,15 +174,17 @@ class LiquidHandler(
172
174
  flow_rate: float = 1.0,
173
175
  is_full_dispense: bool = False,
174
176
  movement_delay: Optional[float] = None,
177
+ end_critical_point: Optional[CriticalPoint] = None,
175
178
  ) -> None:
176
179
  """
177
180
  Dispense a volume of liquid (in microliters/uL) while moving the z axis synchronously.
178
181
 
179
182
  :param mount: A robot mount that the instrument is on.
180
- :param z_distance: The distance the z axis will move during dispensing.
183
+ :param end_point: The deck coordinate point to move the tip to during the dispense.
181
184
  :param volume: The volume of liquid to be dispensed.
182
185
  :param flow_rate: The flow rate to dispense with.
183
186
  :param movement_delay: Time to wait after the pipette starts dispensing before x/y/z movement.
187
+ :param end_critical_point: The critical point for the end_point position.
184
188
  """
185
189
  ...
186
190
 
@@ -1,8 +1,8 @@
1
1
  """A Protocol-Engine-friendly wrapper for opentrons.motion_planning.deck_conflict."""
2
+
2
3
  from __future__ import annotations
3
4
  import logging
4
5
  from typing import (
5
- Optional,
6
6
  Tuple,
7
7
  Union,
8
8
  List,
@@ -12,7 +12,6 @@ from opentrons_shared_data.errors.exceptions import MotionPlanningFailureError
12
12
  from opentrons.protocol_engine.errors import LocationIsStagingSlotError
13
13
  from opentrons_shared_data.module import FLEX_TC_LID_COLLISION_ZONE
14
14
 
15
- from opentrons.hardware_control import CriticalPoint
16
15
  from opentrons.motion_planning import adjacent_slots_getters
17
16
 
18
17
  from opentrons.protocol_engine import (
@@ -101,7 +100,9 @@ def check_safe_for_pipette_movement( # noqa: C901
101
100
  )
102
101
  primary_nozzle = engine_state.pipettes.get_primary_nozzle(pipette_id)
103
102
 
104
- destination_cp = _get_critical_point_to_use(engine_state, labware_id)
103
+ destination_cp = engine_state.motion.get_critical_point_for_wells_in_labware(
104
+ labware_id
105
+ )
105
106
  pipette_bounds_at_well_location = (
106
107
  engine_state.pipettes.get_pipette_bounds_at_specified_move_to_position(
107
108
  pipette_id=pipette_id,
@@ -189,21 +190,6 @@ def check_safe_for_pipette_movement( # noqa: C901
189
190
  )
190
191
 
191
192
 
192
- def _get_critical_point_to_use(
193
- engine_state: StateView, labware_id: str
194
- ) -> Optional[CriticalPoint]:
195
- """Return the critical point to use when accessing the given labware."""
196
- # TODO (spp, 2024-09-17): looks like Y_CENTER of column is the same as its XY_CENTER.
197
- # I'm using this if-else ladder to be consistent with what we do in
198
- # `MotionPlanning.get_movement_waypoints_to_well()`.
199
- # We should probably use only XY_CENTER in both places.
200
- if engine_state.labware.get_should_center_column_on_target_well(labware_id):
201
- return CriticalPoint.Y_CENTER
202
- elif engine_state.labware.get_should_center_pipette_on_target_well(labware_id):
203
- return CriticalPoint.XY_CENTER
204
- return None
205
-
206
-
207
193
  def _slot_has_potential_colliding_object(
208
194
  engine_state: StateView,
209
195
  pipette_bounds: Tuple[Point, Point, Point, Point],
@@ -1,4 +1,5 @@
1
1
  """Pipetting command handling."""
2
+
2
3
  from typing import Optional, Iterator, Tuple
3
4
  from typing_extensions import Protocol as TypingProtocol
4
5
  from contextlib import contextmanager
@@ -208,6 +209,9 @@ class HardwarePipettingHandler(PipettingHandler):
208
209
  end_point=end_point,
209
210
  volume=adjusted_volume,
210
211
  movement_delay=movement_delay,
212
+ end_critical_point=self.get_state_view().motion.get_critical_point_for_wells_in_labware(
213
+ labware_id
214
+ ),
211
215
  )
212
216
  return adjusted_volume
213
217
 
@@ -239,6 +243,9 @@ class HardwarePipettingHandler(PipettingHandler):
239
243
  push_out=push_out,
240
244
  is_full_dispense=is_full_dispense,
241
245
  movement_delay=movement_delay,
246
+ end_critical_point=self.get_state_view().motion.get_critical_point_for_wells_in_labware(
247
+ labware_id
248
+ ),
242
249
  )
243
250
  return adjusted_volume
244
251
 
@@ -1,4 +1,5 @@
1
1
  """Motion state store and getters."""
2
+
2
3
  from dataclasses import dataclass
3
4
  from typing import List, Optional, Union
4
5
  import logging
@@ -78,14 +79,9 @@ class MotionView:
78
79
  isinstance(current_location, CurrentWell)
79
80
  and current_location.pipette_id == pipette_id
80
81
  ):
81
- if self._labware.get_should_center_column_on_target_well(
82
- current_location.labware_id
83
- ):
84
- critical_point = CriticalPoint.Y_CENTER
85
- elif self._labware.get_should_center_pipette_on_target_well(
82
+ critical_point = self.get_critical_point_for_wells_in_labware(
86
83
  current_location.labware_id
87
- ):
88
- critical_point = CriticalPoint.XY_CENTER
84
+ )
89
85
  return PipetteLocationData(mount=mount, critical_point=critical_point)
90
86
 
91
87
  def _get_pipette_offset_for_reservoirs(
@@ -124,6 +120,17 @@ class MotionView:
124
120
  x_offset = -1 * well_x_dim / 24
125
121
  return Point(x=x_offset, y=y_offset)
126
122
 
123
+ def get_critical_point_for_wells_in_labware(
124
+ self, labware_id: str
125
+ ) -> CriticalPoint | None:
126
+ """Get the appropriate critical point override for this labware."""
127
+ if self._labware.get_should_center_column_on_target_well(labware_id):
128
+ return CriticalPoint.Y_CENTER
129
+ elif self._labware.get_should_center_pipette_on_target_well(labware_id):
130
+ return CriticalPoint.XY_CENTER
131
+ else:
132
+ return None
133
+
127
134
  def get_movement_waypoints_to_well(
128
135
  self,
129
136
  pipette_id: str,
@@ -142,11 +149,7 @@ class MotionView:
142
149
  """Calculate waypoints to a destination that's specified as a well."""
143
150
  location = current_well or self._pipettes.get_current_location()
144
151
 
145
- destination_cp: Optional[CriticalPoint] = None
146
- if self._labware.get_should_center_column_on_target_well(labware_id):
147
- destination_cp = CriticalPoint.Y_CENTER
148
- elif self._labware.get_should_center_pipette_on_target_well(labware_id):
149
- destination_cp = CriticalPoint.XY_CENTER
152
+ destination_cp = self.get_critical_point_for_wells_in_labware(labware_id)
150
153
 
151
154
  destination = self._geometry.get_well_position(
152
155
  labware_id=labware_id,
@@ -397,12 +400,7 @@ class MotionView:
397
400
  mm_from_edge=mm_from_edge,
398
401
  edge_path_type=edge_path_type,
399
402
  )
400
- critical_point: Optional[CriticalPoint] = None
401
-
402
- if self._labware.get_should_center_column_on_target_well(labware_id):
403
- critical_point = CriticalPoint.Y_CENTER
404
- elif self._labware.get_should_center_pipette_on_target_well(labware_id):
405
- critical_point = CriticalPoint.XY_CENTER
403
+ critical_point = self.get_critical_point_for_wells_in_labware(labware_id)
406
404
 
407
405
  return [
408
406
  motion_planning.Waypoint(position=p, critical_point=critical_point)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opentrons
3
- Version: 8.8.0a7
3
+ Version: 8.8.0a8
4
4
  Summary: The Opentrons API is a simple framework designed to make writing automated biology lab protocols easy.
5
5
  Project-URL: opentrons.com, https://www.opentrons.com
6
6
  Project-URL: Source Code On Github, https://github.com/Opentrons/opentrons/tree/edge/api
@@ -24,7 +24,7 @@ Requires-Dist: click<9,>=8.0.0
24
24
  Requires-Dist: importlib-metadata>=1.0; python_version < '3.8'
25
25
  Requires-Dist: jsonschema<4.18.0,>=3.0.1
26
26
  Requires-Dist: numpy<2,>=1.20.0
27
- Requires-Dist: opentrons-shared-data==8.8.0a7
27
+ Requires-Dist: opentrons-shared-data==8.8.0a8
28
28
  Requires-Dist: packaging>=21.0
29
29
  Requires-Dist: pydantic-settings<3,>=2
30
30
  Requires-Dist: pydantic<3,>=2.0.0
@@ -32,6 +32,6 @@ Requires-Dist: pyserial>=3.5
32
32
  Requires-Dist: pyusb==1.2.1
33
33
  Requires-Dist: typing-extensions<5,>=4.0.0
34
34
  Provides-Extra: flex-hardware
35
- Requires-Dist: opentrons-hardware[flex]==8.8.0a7; extra == 'flex-hardware'
35
+ Requires-Dist: opentrons-hardware[flex]==8.8.0a8; extra == 'flex-hardware'
36
36
  Provides-Extra: ot2-hardware
37
- Requires-Dist: opentrons-hardware==8.8.0a7; extra == 'ot2-hardware'
37
+ Requires-Dist: opentrons-hardware==8.8.0a8; extra == 'ot2-hardware'
@@ -1,5 +1,5 @@
1
1
  opentrons/__init__.py,sha256=TQ_Ca_zzAM3iLzAysWKkFkQHG8-imihxDPQbLCYrf-E,4533
2
- opentrons/_version.py,sha256=3_09fbZUs-VXMGXA5MWazmEhOw8hSkQkzbw2loEdOUY,712
2
+ opentrons/_version.py,sha256=rgcVnPkCP2h4fiGvNa8Mz1WTKaprmgMzufDaYDLbJ7E,712
3
3
  opentrons/execute.py,sha256=J7kZFRxpbrj_e5XS37Zc9fsliBqxZBMrITT7jdUgJvw,29478
4
4
  opentrons/legacy_broker.py,sha256=XnuEBBlrHCThc31RFW2UR0tGqctqWZ-CZ9vSC4L9whU,1553
5
5
  opentrons/ordered_set.py,sha256=g-SB3qA14yxHu9zjGyc2wC7d2TUCBE6fKZlHAtbPzI8,4082
@@ -111,7 +111,7 @@ opentrons/hardware_control/module_control.py,sha256=id1W3xqT-W-zyt2PVodo2Abx127t
111
111
  opentrons/hardware_control/motion_utilities.py,sha256=aIaT-qzkRpZaSmfTTSqs1wl6m7LBxwKHIhgkFean01o,10274
112
112
  opentrons/hardware_control/nozzle_manager.py,sha256=AG4HKrV4n0Bm0UOEsaAYAURtkJwuEyk97e9Nqv2_nD0,17021
113
113
  opentrons/hardware_control/ot3_calibration.py,sha256=vHB17U-FBzytvM8QeEu5kRYPo8lFwAo31ZEpiU4yf_0,45000
114
- opentrons/hardware_control/ot3api.py,sha256=r2CeWSwBcXEUtyyBa3UFW3c_aHja82LpiegKla-i03s,130824
114
+ opentrons/hardware_control/ot3api.py,sha256=TNZnoe-52kobBcc622VAOdPByhw2DWl4H5_eO4fp9ag,131393
115
115
  opentrons/hardware_control/pause_manager.py,sha256=wmNmraimE2yZQVqCxX_rtQHUWRzpzyQEaym9fLMgyww,888
116
116
  opentrons/hardware_control/poller.py,sha256=6aqR0UM36w-Fk1ozjp-74VHthZTfT8Yurh5Zb4OnZX8,4392
117
117
  opentrons/hardware_control/robot_calibration.py,sha256=ilszGjZPspKiEk8MQPaHm2B-ljeisAYflKl8UyQ_D0U,7155
@@ -198,7 +198,7 @@ opentrons/hardware_control/protocols/gripper_controller.py,sha256=EEfL-KUzegZBm_
198
198
  opentrons/hardware_control/protocols/hardware_manager.py,sha256=S9BSJ0XsnU5A9nFLMDZfmiizx3T41WhU_91VYj4bUVE,1629
199
199
  opentrons/hardware_control/protocols/identifiable.py,sha256=YmhScb4Tr4mxVObL1i7pI-EouTMAmV-2oqKbovhdnrE,575
200
200
  opentrons/hardware_control/protocols/instrument_configurer.py,sha256=5zUCAchtoJ6QPFqcGRb7FOsnt2nxjxlRJdt18IidKqQ,7729
201
- opentrons/hardware_control/protocols/liquid_handler.py,sha256=_I__m4QFDNp1ZXNtanLFbu-LRqJkO7RoyJWyNAa9iF4,10457
201
+ opentrons/hardware_control/protocols/liquid_handler.py,sha256=OvGf1LSPZC3imLO0GsFitXA4GObhT-xUnArChuf-gm8,10765
202
202
  opentrons/hardware_control/protocols/module_provider.py,sha256=QDKCWqrW-6IeI91IICBTJClK0C__mgq3A0-M3Wa9ee8,487
203
203
  opentrons/hardware_control/protocols/motion_controller.py,sha256=mWUHVDqju9gcMDU9adk6UzueZ9i-x2nU5hmcd_fHHyk,9737
204
204
  opentrons/hardware_control/protocols/position_estimator.py,sha256=BrqK5AJn9747c4LX0ZWBJWgWHjyX977CHBI7WVvO-9Q,1922
@@ -268,7 +268,7 @@ opentrons/protocol_api/core/engine/labware.py,sha256=YUkoCogqLQpDee-wlcMPV90ZUi7
268
268
  opentrons/protocol_api/core/engine/load_labware_params.py,sha256=CxSbCBXVXHtBszP-3Ko8hsQTjvvogKRo0CCzCmMfIic,3003
269
269
  opentrons/protocol_api/core/engine/module_core.py,sha256=SBglcDmhwTrk_IfIgkzHsux9NEDQZ4OgzycAoO0qRdY,43222
270
270
  opentrons/protocol_api/core/engine/overlap_versions.py,sha256=PyGvQtQUg1wzNtkuGZtxwXm019PoIjq7em2JiWaxbXc,675
271
- opentrons/protocol_api/core/engine/pipette_movement_conflict.py,sha256=9BmtG1kg3vyrssBXflCNZrJIukGp6y5UJ_XqhIz73rI,18148
271
+ opentrons/protocol_api/core/engine/pipette_movement_conflict.py,sha256=vjKuEmKU67M43dTTNoRvRwjPFx1a6sDEHNDp-8KuiuI,17386
272
272
  opentrons/protocol_api/core/engine/point_calculations.py,sha256=C2eF0fvJQGMqQv3DzNhc1-m8HTAXTyTsHPJEPrEUEmo,2502
273
273
  opentrons/protocol_api/core/engine/protocol.py,sha256=nZCWd6vq6PAzZVU_0kl3PPtcgtshN3xgWE2ixhiRK2g,50017
274
274
  opentrons/protocol_api/core/engine/robot.py,sha256=bzUt23NG-clD-9-QFsV_6nm3fMgSmvYEG9DyyZI1xgw,5366
@@ -447,7 +447,7 @@ opentrons/protocol_engine/execution/hardware_stopper.py,sha256=ZlhVYEdFfuKqp5slZ
447
447
  opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py,sha256=BSFLzSSeELAYZCrCUfJZx5DdlrwU06Ur92TYd0T-hzM,9084
448
448
  opentrons/protocol_engine/execution/labware_movement.py,sha256=RJMkWHGvoKc0GXjEZ2ZXWo1v9cvPlmbEdFBs0szROfo,12965
449
449
  opentrons/protocol_engine/execution/movement.py,sha256=NJUs1mtC8R8qR1x2RVTI3q9hyVuLkvCvIM1SnD8sPH0,12899
450
- opentrons/protocol_engine/execution/pipetting.py,sha256=4E-s8_UUEYlkuNwS316yqSihHUeh25rGB0ztRpUqpgs,21756
450
+ opentrons/protocol_engine/execution/pipetting.py,sha256=0hRu_erRItLj_TYfKx-NTibprYKfzros8HWsbZRf_q8,22067
451
451
  opentrons/protocol_engine/execution/queue_worker.py,sha256=2cfyplUWdPyxxLbH3H8TbtB9Fvjx__ASluiJXyJBoqU,3537
452
452
  opentrons/protocol_engine/execution/rail_lights.py,sha256=eiJT6oI_kFk7rFuFkZzISZiLNnpf7Kkh86Kyk9wQ_Jo,590
453
453
  opentrons/protocol_engine/execution/run_control.py,sha256=Wn3FGuBZrYddf7Dzcz5v1hHF0DbzRxCykl6vs15BZP0,1450
@@ -489,7 +489,7 @@ opentrons/protocol_engine/state/labware.py,sha256=y-vZnirUS84RatzUu960CsbGb2lW9f
489
489
  opentrons/protocol_engine/state/liquid_classes.py,sha256=u_z75UYdiFAKG0yB3mr1il4T3qaS0Sotq8sL7KLODP8,2990
490
490
  opentrons/protocol_engine/state/liquids.py,sha256=NoesktcQdJUjIVmet1uqqJPf-rzbo4SGemXwQC295W0,2338
491
491
  opentrons/protocol_engine/state/modules.py,sha256=rL_Xm7vNQrYsa6F3VYUJZVrehMfAnwvf0wXPyPH19PU,63087
492
- opentrons/protocol_engine/state/motion.py,sha256=lEBwAeaIYNH38226IWy68m-EPhZvqq-wvQQhGVDCwLo,16983
492
+ opentrons/protocol_engine/state/motion.py,sha256=1pqxThXdUG7TQqYxyxUX3x49CUcdKqAAV-6o4jeKICo,16737
493
493
  opentrons/protocol_engine/state/pipettes.py,sha256=Q-aDiVvOVvUXq930vvMvAWhK7aZ06-8FLZB6jO95dwQ,38531
494
494
  opentrons/protocol_engine/state/preconditions.py,sha256=Qvv2Mnwdw2SzkVkfV1vcXNT-M9mbnITBPq9qkhZAa2o,2198
495
495
  opentrons/protocol_engine/state/state.py,sha256=-Lrag0Az9eh9A4xUcv1qE2sqC6ZX3nXnoElk2a3hZuI,17193
@@ -623,8 +623,8 @@ opentrons/util/linal.py,sha256=IlKAP9HkNBBgULeSf4YVwSKHdx9jnCjSr7nvDvlRALg,5753
623
623
  opentrons/util/logging_config.py,sha256=7et4YYuQdWdq_e50U-8vFS_QyNBRgdnqPGAQJm8qrIo,9954
624
624
  opentrons/util/logging_queue_handler.py,sha256=ZsSJwy-oV8DXwpYiZisQ1PbYwmK2cOslD46AcyJ1E4I,2484
625
625
  opentrons/util/performance_helpers.py,sha256=ew7H8XD20iS6-2TJAzbQeyzStZkkE6PzHt_Adx3wbZQ,5172
626
- opentrons-8.8.0a7.dist-info/METADATA,sha256=lGSD5Lc1xtgleVQngABrjaNTduCFHlkeit36g7bKeE4,1607
627
- opentrons-8.8.0a7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
628
- opentrons-8.8.0a7.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
629
- opentrons-8.8.0a7.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
630
- opentrons-8.8.0a7.dist-info/RECORD,,
626
+ opentrons-8.8.0a8.dist-info/METADATA,sha256=RbWSALk55kHIbYOKPyHbljRU4JjoOPBQTcqWmQAUa34,1607
627
+ opentrons-8.8.0a8.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
628
+ opentrons-8.8.0a8.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
629
+ opentrons-8.8.0a8.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
630
+ opentrons-8.8.0a8.dist-info/RECORD,,