opentrons 8.0.0a2__py2.py3-none-any.whl → 8.0.0a4__py2.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.
@@ -416,23 +416,48 @@ def _is_within_pipette_extents(
416
416
  pipette_bounding_box_at_loc: Tuple[Point, Point, Point, Point],
417
417
  ) -> bool:
418
418
  """Whether a given point is within the extents of a configured pipette on the specified robot."""
419
- mount = engine_state.pipettes.get_mount(pipette_id)
420
- robot_extent_per_mount = engine_state.geometry.absolute_deck_extents
421
- pip_back_left_bound, pip_front_right_bound, _, _ = pipette_bounding_box_at_loc
422
- pipette_bounds_offsets = engine_state.pipettes.get_pipette_bounding_box(pipette_id)
423
- from_back_right = (
424
- robot_extent_per_mount.back_right[mount]
425
- + pipette_bounds_offsets.back_right_corner
426
- )
427
- from_front_left = (
428
- robot_extent_per_mount.front_left[mount]
429
- + pipette_bounds_offsets.front_left_corner
430
- )
419
+ channels = engine_state.pipettes.get_channels(pipette_id)
420
+ robot_extents = engine_state.geometry.absolute_deck_extents
421
+ (
422
+ pip_back_left_bound,
423
+ pip_front_right_bound,
424
+ pip_back_right_bound,
425
+ pip_front_left_bound,
426
+ ) = pipette_bounding_box_at_loc
427
+
428
+ # Given the padding values accounted for against the deck extents,
429
+ # a pipette is within extents when all of the following are true:
430
+
431
+ # Each corner slot full pickup case:
432
+ # A1: Front right nozzle is within the rear and left-side padding limits
433
+ # D1: Back right nozzle is within the front and left-side padding limits
434
+ # A3 Front left nozzle is within the rear and right-side padding limits
435
+ # D3: Back left nozzle is within the front and right-side padding limits
436
+ # Thermocycler Column A2: Front right nozzle is within padding limits
437
+
438
+ if channels == 96:
439
+ return (
440
+ pip_front_right_bound.y
441
+ <= robot_extents.deck_extents.y + robot_extents.padding_rear
442
+ and pip_front_right_bound.x >= robot_extents.padding_left_side
443
+ and pip_back_right_bound.y >= robot_extents.padding_front
444
+ and pip_back_right_bound.x >= robot_extents.padding_left_side
445
+ and pip_front_left_bound.y
446
+ <= robot_extents.deck_extents.y + robot_extents.padding_rear
447
+ and pip_front_left_bound.x
448
+ <= robot_extents.deck_extents.x + robot_extents.padding_right_side
449
+ and pip_back_left_bound.y >= robot_extents.padding_front
450
+ and pip_back_left_bound.x
451
+ <= robot_extents.deck_extents.x + robot_extents.padding_right_side
452
+ )
453
+ # For 8ch pipettes we only check the rear and front extents
431
454
  return (
432
- from_back_right.x >= pip_back_left_bound.x >= from_front_left.x
433
- and from_back_right.y >= pip_back_left_bound.y >= from_front_left.y
434
- and from_back_right.x >= pip_front_right_bound.x >= from_front_left.x
435
- and from_back_right.y >= pip_front_right_bound.y >= from_front_left.y
455
+ pip_front_right_bound.y
456
+ <= robot_extents.deck_extents.y + robot_extents.padding_rear
457
+ and pip_back_right_bound.y >= robot_extents.padding_front
458
+ and pip_front_left_bound.y
459
+ <= robot_extents.deck_extents.y + robot_extents.padding_rear
460
+ and pip_back_left_bound.y >= robot_extents.padding_front
436
461
  )
437
462
 
438
463
 
@@ -268,7 +268,6 @@ class InstrumentContext(publisher.CommandPublisher):
268
268
  and self._96_tip_config_valid()
269
269
  ):
270
270
  self.require_liquid_presence(well=well)
271
- self.prepare_to_aspirate()
272
271
 
273
272
  with publisher.publish_context(
274
273
  broker=self.broker,
@@ -2064,6 +2063,8 @@ class InstrumentContext(publisher.CommandPublisher):
2064
2063
  NozzleLayout.QUADRANT,
2065
2064
  ]
2066
2065
  if style in disabled_layouts:
2066
+ # todo(mm, 2024-08-20): UnsupportedAPIError boils down to an API_REMOVED
2067
+ # error code, which is not correct here.
2067
2068
  raise UnsupportedAPIError(
2068
2069
  message=f"Nozzle layout configuration of style {style.value} is currently unsupported."
2069
2070
  )
@@ -2074,7 +2075,11 @@ class InstrumentContext(publisher.CommandPublisher):
2074
2075
  < _PARTIAL_NOZZLE_CONFIGURATION_SINGLE_ROW_PARTIAL_COLUMN_ADDED_IN
2075
2076
  ) and (style not in original_enabled_layouts):
2076
2077
  raise APIVersionError(
2077
- f"Nozzle layout configuration of style {style.value} is unsupported in API Versions lower than {_PARTIAL_NOZZLE_CONFIGURATION_SINGLE_ROW_PARTIAL_COLUMN_ADDED_IN}."
2078
+ api_element=f"Nozzle layout configuration of style {style.value}",
2079
+ until_version=str(
2080
+ _PARTIAL_NOZZLE_CONFIGURATION_SINGLE_ROW_PARTIAL_COLUMN_ADDED_IN
2081
+ ),
2082
+ current_version=str(self._api_version),
2078
2083
  )
2079
2084
 
2080
2085
  front_right_resolved = front_right
@@ -581,7 +581,7 @@ class Labware:
581
581
  api_element="Labware.set_calibration()",
582
582
  since_version=f"{ENGINE_CORE_API_VERSION}",
583
583
  current_version=f"{self._api_version}",
584
- message=" Try using the Opentrons App's Labware Position Check.",
584
+ extra_message="Try using the Opentrons App's Labware Position Check.",
585
585
  )
586
586
  self._core.set_calibration(delta)
587
587
 
@@ -632,7 +632,7 @@ class Labware:
632
632
  api_element="Labware.set_offset()",
633
633
  until_version=f"{SET_OFFSET_RESTORED_API_VERSION}",
634
634
  current_version=f"{self._api_version}",
635
- message=" This feature not available in versions 2.14 thorugh 2.17. You can also use the Opentrons App's Labware Position Check.",
635
+ extra_message="This feature not available in versions 2.14 thorugh 2.17. You can also use the Opentrons App's Labware Position Check.",
636
636
  )
637
637
  else:
638
638
  self._core.set_calibration(Point(x=x, y=y, z=z))
@@ -974,7 +974,7 @@ class Labware:
974
974
  api_element="Labware.use_tips",
975
975
  since_version=f"{ENGINE_CORE_API_VERSION}",
976
976
  current_version=f"{self._api_version}",
977
- message=" To modify tip state, use Labware.reset.",
977
+ extra_message="To modify tip state, use Labware.reset.",
978
978
  )
979
979
 
980
980
  assert num_channels > 0, "Bad call to use_tips: num_channels<=0"
@@ -1064,7 +1064,7 @@ class Labware:
1064
1064
  api_element="Labware.return_tips()",
1065
1065
  since_version=f"{ENGINE_CORE_API_VERSION}",
1066
1066
  current_version=f"{self._api_version}",
1067
- message=" Use Labware.reset() instead.",
1067
+ extra_message="Use Labware.reset() instead.",
1068
1068
  )
1069
1069
 
1070
1070
  # This logic is the inverse of :py:meth:`use_tips`
@@ -103,7 +103,7 @@ class ModuleContext(CommandPublisher):
103
103
  raise UnsupportedAPIError(
104
104
  api_element="`ModuleContext.load_labware_object`",
105
105
  since_version="2.14",
106
- message=" Use `ModuleContext.load_labware` or `load_labware_by_definition` instead.",
106
+ extra_message="Use `ModuleContext.load_labware` or `load_labware_by_definition` instead.",
107
107
  )
108
108
 
109
109
  _log.warning(
@@ -305,7 +305,7 @@ class ModuleContext(CommandPublisher):
305
305
  raise UnsupportedAPIError(
306
306
  api_element="`ModuleContext.geometry`",
307
307
  since_version="2.14",
308
- message=" Use properties of the `ModuleContext` itself.",
308
+ extra_message="Use properties of the `ModuleContext` itself.",
309
309
  )
310
310
 
311
311
  def __repr__(self) -> str:
@@ -482,7 +482,7 @@ class MagneticModuleContext(ModuleContext):
482
482
  api_element="The height parameter of MagneticModuleContext.engage()",
483
483
  since_version=f"{_MAGNETIC_MODULE_HEIGHT_PARAM_REMOVED_IN}",
484
484
  current_version=f"{self._api_version}",
485
- message=" Use offset or height_from_base.",
485
+ extra_message="Use offset or height_from_base.",
486
486
  )
487
487
  self._core.engage(height_from_home=height)
488
488
 
@@ -279,7 +279,7 @@ class ProtocolContext(CommandPublisher):
279
279
  api_element="ProtocolContext.max_speeds",
280
280
  since_version=f"{ENGINE_CORE_API_VERSION}",
281
281
  current_version=f"{self._api_version}",
282
- message=" Set speeds using InstrumentContext.default_speed or the per-method 'speed' argument.",
282
+ extra_message="Set speeds using InstrumentContext.default_speed or the per-method 'speed' argument.",
283
283
  )
284
284
 
285
285
  return self._core.get_max_speeds()
@@ -915,6 +915,7 @@ class ProtocolContext(CommandPublisher):
915
915
  from the Opentrons App or touchscreen.
916
916
  :param bool liquid_presence_detection: If ``True``, enable automatic
917
917
  :ref:`liquid presence detection <lpd>` for Flex 1-, 8-, or 96-channel pipettes.
918
+
918
919
  .. versionadded:: 2.20
919
920
  """
920
921
  instrument_name = validation.ensure_lowercase_name(instrument_name)
@@ -1048,7 +1049,7 @@ class ProtocolContext(CommandPublisher):
1048
1049
  api_element="A Python Protocol safely resuming itself after a pause",
1049
1050
  since_version=f"{ENGINE_CORE_API_VERSION}",
1050
1051
  current_version=f"{self._api_version}",
1051
- message=" To wait automatically for a period of time, use ProtocolContext.delay().",
1052
+ extra_message="To wait automatically for a period of time, use ProtocolContext.delay().",
1052
1053
  )
1053
1054
 
1054
1055
  # TODO(mc, 2023-02-13): this assert should be enough for mypy
@@ -1169,7 +1170,7 @@ class ProtocolContext(CommandPublisher):
1169
1170
  api_element="Fixed Trash",
1170
1171
  since_version="2.16",
1171
1172
  current_version=f"{self._api_version}",
1172
- message=" Fixed trash is no longer supported on Flex protocols.",
1173
+ extra_message="Fixed trash is no longer supported on Flex protocols.",
1173
1174
  )
1174
1175
  disposal_locations = self._core.get_disposal_locations()
1175
1176
  if len(disposal_locations) == 0:
@@ -1242,7 +1243,7 @@ class ProtocolContext(CommandPublisher):
1242
1243
  api_element="Calling `define_liquid()` without a `description`",
1243
1244
  current_version=str(self._api_version),
1244
1245
  until_version=str(desc_and_display_color_omittable_since),
1245
- message="Use a newer API version or explicitly supply `description=None`.",
1246
+ extra_message="Use a newer API version or explicitly supply `description=None`.",
1246
1247
  )
1247
1248
  else:
1248
1249
  description = None
@@ -1252,7 +1253,7 @@ class ProtocolContext(CommandPublisher):
1252
1253
  api_element="Calling `define_liquid()` without a `display_color`",
1253
1254
  current_version=str(self._api_version),
1254
1255
  until_version=str(desc_and_display_color_omittable_since),
1255
- message="Use a newer API version or explicitly supply `display_color=None`.",
1256
+ extra_message="Use a newer API version or explicitly supply `display_color=None`.",
1256
1257
  )
1257
1258
  else:
1258
1259
  display_color = None
@@ -208,7 +208,7 @@ def ensure_and_convert_deck_slot(
208
208
  api_element=f"Specifying a deck slot like '{deck_slot}'",
209
209
  until_version=f"{_COORDINATE_DECK_LABEL_VERSION_GATE}",
210
210
  current_version=f"{api_version}",
211
- message=f"Increase your protocol's apiLevel, or use slot '{alternative}' instead.",
211
+ extra_message=f"Increase your protocol's apiLevel, or use slot '{alternative}' instead.",
212
212
  )
213
213
 
214
214
  return parsed_slot.to_equivalent_for_robot_type(robot_type)
@@ -352,6 +352,20 @@ class AddressableAreaView(HasState[AddressableAreaState]):
352
352
  "right": Point(x=right_offset[0], y=right_offset[1], z=right_offset[2]),
353
353
  }
354
354
 
355
+ @cached_property
356
+ def padding_offsets(self) -> Dict[str, float]:
357
+ """The padding offsets to be applied to the deck extents of the robot."""
358
+ rear_offset = self.state.robot_definition["paddingOffsets"]["rear"]
359
+ front_offset = self.state.robot_definition["paddingOffsets"]["front"]
360
+ left_side_offset = self.state.robot_definition["paddingOffsets"]["leftSide"]
361
+ right_side_offset = self.state.robot_definition["paddingOffsets"]["rightSide"]
362
+ return {
363
+ "rear": rear_offset,
364
+ "front": front_offset,
365
+ "left_side": left_side_offset,
366
+ "right_side": right_side_offset,
367
+ }
368
+
355
369
  def get_addressable_area(self, addressable_area_name: str) -> AddressableArea:
356
370
  """Get addressable area."""
357
371
  if not self._state.use_simulated_deck_config:
@@ -77,6 +77,11 @@ class _GripperMoveType(enum.Enum):
77
77
  class _AbsoluteRobotExtents:
78
78
  front_left: Dict[MountType, Point]
79
79
  back_right: Dict[MountType, Point]
80
+ deck_extents: Point
81
+ padding_rear: float
82
+ padding_front: float
83
+ padding_left_side: float
84
+ padding_right_side: float
80
85
 
81
86
 
82
87
  _LabwareLocation = TypeVar("_LabwareLocation", bound=LabwareLocation)
@@ -118,7 +123,13 @@ class GeometryView:
118
123
  MountType.RIGHT: self._addressable_areas.deck_extents + right_offset,
119
124
  }
120
125
  return _AbsoluteRobotExtents(
121
- front_left=front_left_abs, back_right=back_right_abs
126
+ front_left=front_left_abs,
127
+ back_right=back_right_abs,
128
+ deck_extents=self._addressable_areas.deck_extents,
129
+ padding_rear=self._addressable_areas.padding_offsets["rear"],
130
+ padding_front=self._addressable_areas.padding_offsets["front"],
131
+ padding_left_side=self._addressable_areas.padding_offsets["left_side"],
132
+ padding_right_side=self._addressable_areas.padding_offsets["right_side"],
122
133
  )
123
134
 
124
135
  def get_labware_highest_z(self, labware_id: str) -> float:
@@ -845,8 +845,6 @@ class PipetteView(HasState[PipetteState]):
845
845
  - primary_nozzle_offset
846
846
  + pipette_bounds_offsets.front_right_corner
847
847
  )
848
- # TODO (spp, 2024-02-27): remove back right & front left;
849
- # return only back left and front right points.
850
848
  pip_back_right_bound = Point(
851
849
  pip_front_right_bound.x, pip_back_left_bound.y, pip_front_right_bound.z
852
850
  )
@@ -16,7 +16,10 @@ class CSVParameter:
16
16
 
17
17
  @property
18
18
  def file(self) -> TextIO:
19
- """Returns the file handler for the CSV file."""
19
+ """Returns the file handler for the CSV file.
20
+
21
+ The file is treated as read-only, UTF-8-encoded text.
22
+ """
20
23
  if self._file is None:
21
24
  text = self.contents
22
25
  temporary_file = NamedTemporaryFile("r+")
@@ -30,7 +33,7 @@ class CSVParameter:
30
33
 
31
34
  @property
32
35
  def file_opened(self) -> bool:
33
- """Return if a file handler has been opened for the CSV parameter."""
36
+ """Returns ``True`` if a file handler is open for the CSV parameter."""
34
37
  return self._file is not None
35
38
 
36
39
  @property
@@ -45,10 +48,22 @@ class CSVParameter:
45
48
  def parse_as_csv(
46
49
  self, detect_dialect: bool = True, **kwargs: Any
47
50
  ) -> List[List[str]]:
48
- """Returns a list of rows with each row represented as a list of column elements.
51
+ """Parses the CSV data and returns a list of lists.
52
+
53
+ Each item in the parent list corresponds to a row in the CSV file.
54
+ If the CSV has a header, that will be the first row in the list: ``.parse_as_csv()[0]``.
55
+
56
+ Each item in the child lists corresponds to a single cell within its row.
57
+ The data for each cell is represented as a string. You may need to trim whitespace
58
+ or otherwise validate string contents before passing them as inputs to other API methods.
59
+ For numeric data, cast these strings to integers or floating point numbers,
60
+ as appropriate.
49
61
 
50
- If there is a header for the CSV that will be the first row in the list (i.e. `.rows()[0]`).
51
- All elements will be represented as strings, even if they are numeric in nature.
62
+ :param detect_dialect: If ``True``, examine the file and try to assign it a
63
+ :py:class:`csv.Dialect` to improve parsing behavior.
64
+ :param kwargs: For advanced CSV handling, you can pass any of the
65
+ `formatting parameters <https://docs.python.org/3/library/csv.html#csv-fmt-params>`_
66
+ accepted by :py:func:`csv.reader` from the Python standard library.
52
67
  """
53
68
  rows: List[List[str]] = []
54
69
  if detect_dialect:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: opentrons
3
- Version: 8.0.0a2
3
+ Version: 8.0.0a4
4
4
  Summary: The Opentrons API is a simple framework designed to make writing automated biology lab protocols easy.
5
5
  Author: Opentrons
6
6
  Author-email: engineering@opentrons.com
@@ -21,7 +21,7 @@ Classifier: Programming Language :: Python :: 3.10
21
21
  Classifier: Topic :: Scientific/Engineering
22
22
  Requires-Python: >=3.10
23
23
  License-File: ../LICENSE
24
- Requires-Dist: opentrons-shared-data ==8.0.0a2
24
+ Requires-Dist: opentrons-shared-data ==8.0.0a4
25
25
  Requires-Dist: aionotify ==0.3.1
26
26
  Requires-Dist: anyio <4.0.0,>=3.6.1
27
27
  Requires-Dist: jsonschema <4.18.0,>=3.0.1
@@ -33,9 +33,9 @@ Requires-Dist: click <9,>=8.0.0
33
33
  Requires-Dist: packaging >=21.0
34
34
  Requires-Dist: importlib-metadata >=1.0 ; python_version < "3.8"
35
35
  Provides-Extra: flex-hardware
36
- Requires-Dist: opentrons-hardware[flex] ==8.0.0a2 ; extra == 'flex-hardware'
36
+ Requires-Dist: opentrons-hardware[flex] ==8.0.0a4 ; extra == 'flex-hardware'
37
37
  Provides-Extra: ot2-hardware
38
- Requires-Dist: opentrons-hardware ==8.0.0a2 ; extra == 'ot2-hardware'
38
+ Requires-Dist: opentrons-hardware ==8.0.0a4 ; extra == 'ot2-hardware'
39
39
 
40
40
  .. _Full API Documentation: http://docs.opentrons.com
41
41
 
@@ -219,13 +219,13 @@ opentrons/protocol_api/config.py,sha256=r9lyvXjagTX_g3q5FGURPpcz2IA9sSF7Oa_1mKx-
219
219
  opentrons/protocol_api/create_protocol_context.py,sha256=wwsZje0L__oDnu1Yrihau320_f-ASloR9eL1QCtkOh8,7612
220
220
  opentrons/protocol_api/deck.py,sha256=94vFceg1SC1bAGd7TvC1ZpYwnJR-VlzurEZ6jkacYeg,8910
221
221
  opentrons/protocol_api/disposal_locations.py,sha256=NRiSGmDR0LnbyEkWSOM-o64uR2fUoB1NWJG7Y7SsJSs,7920
222
- opentrons/protocol_api/instrument_context.py,sha256=5xlOZ_3nuONDir7CpkDE3NoT_Hhnqw-rVd73Orc_NUk,95613
223
- opentrons/protocol_api/labware.py,sha256=AIapWimuZMOjeX-9PeOCskD99W-oPbFHSvI7yjZSxks,47703
224
- opentrons/protocol_api/module_contexts.py,sha256=NJTDW0Jj9bZnCwyGPkNvhJsi-DPJKGYBMFeW92eagqI,37310
222
+ opentrons/protocol_api/instrument_context.py,sha256=TqzML0qqGKBKaU4FUEJKZJ23c5kLzZXQR1sfamZaNJw,95810
223
+ opentrons/protocol_api/labware.py,sha256=cxJp5wWMv-OKLmryEXwPgFL6T6pu8T7SXYlGWaVmB-g,47723
224
+ opentrons/protocol_api/module_contexts.py,sha256=4uXWnO-w4Znbz27Y8m0uMJ_CR0U3Qy1r1ODntFbYMd0,37325
225
225
  opentrons/protocol_api/module_validation_and_errors.py,sha256=XL_m72P8rcvGO2fynY7UzXLcpGuI6X4s0V6Xf735Iyc,1464
226
- opentrons/protocol_api/protocol_context.py,sha256=1IsrVBsPAwif1BnMBjqucq7D_9m0nnXv8zVkaECXLAM,53575
226
+ opentrons/protocol_api/protocol_context.py,sha256=qaCMeIJIGSrGv_iORtkC8ANj5_36el1enBeB5BmJ9FM,53603
227
227
  opentrons/protocol_api/robot_context.py,sha256=vph_ZqfdmREOwLwpjSkXiSZSpI1HO0HuilhqjhgT7Rw,2660
228
- opentrons/protocol_api/validation.py,sha256=tjxNkrvm-1mzGZoiduZEsT99xb_Nkfhd4YMVjehUPGg,18367
228
+ opentrons/protocol_api/validation.py,sha256=p9kwYn340lIGHJ88q7L3RsfEgr25Nv1uTMuw4yly7T0,18373
229
229
  opentrons/protocol_api/core/__init__.py,sha256=-g74o8OtBB0LmmOvwkRvPgrHt7fF7T8FRHDj-x_-Onk,736
230
230
  opentrons/protocol_api/core/common.py,sha256=sXWlP8F4ZAEGcDh1WuavrVxkoi-FultBbpY6JW0_9ZY,1029
231
231
  opentrons/protocol_api/core/core_map.py,sha256=gq3CIYPxuPvozf8yj8FprqBfs3e4ZJGQ6s0ViPbwV08,1757
@@ -236,7 +236,7 @@ opentrons/protocol_api/core/protocol.py,sha256=C70tQe6ZTjYX56rvlSl8MW2CJl0Mb-yZt
236
236
  opentrons/protocol_api/core/well.py,sha256=quBAF0UjcsRcqZy_Cb13NIkfnx4y1VbEHZgGcDIl-wI,2393
237
237
  opentrons/protocol_api/core/well_grid.py,sha256=BU28DKaBgEU_JdZ6pEzrwNxmuh6TkO4zlg7Pq1Rf5Xk,1516
238
238
  opentrons/protocol_api/core/engine/__init__.py,sha256=B_5T7zgkWDb1mXPg4NbT-wBkQaK-WVokMMnJRNu7xiM,582
239
- opentrons/protocol_api/core/engine/deck_conflict.py,sha256=yKN7LbDuZ1ObUOHIQyV8L2lvNuEJKxjV0hx-vVnARb8,23376
239
+ opentrons/protocol_api/core/engine/deck_conflict.py,sha256=EBC15ROS9cEUSnKHzeaL9xOhN_WS3tSNic8S-kkFz-Q,24560
240
240
  opentrons/protocol_api/core/engine/exceptions.py,sha256=aZgNrmYEeuPZm21nX_KZYtvyjv5h_zPjxxgPkEV7_bw,725
241
241
  opentrons/protocol_api/core/engine/instrument.py,sha256=r_2ZF3i_5FZqMdFipu0hXpgx9Pl5mM5_AfX7La8H_TU,35686
242
242
  opentrons/protocol_api/core/engine/labware.py,sha256=xb1osbmcHL80S9RLeqA9qKiA_CdyMNMW0In7Pukegf4,7008
@@ -392,17 +392,17 @@ opentrons/protocol_engine/resources/ot3_validation.py,sha256=0x81JoZBXcj2xUVcOF7
392
392
  opentrons/protocol_engine/resources/pipette_data_provider.py,sha256=NYcQGJYQ-aeEME5nilUlkHF6oWfrNZt0op52bUH0czo,14623
393
393
  opentrons/protocol_engine/state/__init__.py,sha256=l-VhTfs16xika3ZWPqfxovB1Z1GHuPRm-IHWrEOuzAw,1826
394
394
  opentrons/protocol_engine/state/abstract_store.py,sha256=b5cqKZhI6ERZj6gyL0kDutD6ogdQngR3T-JmPATvhi8,631
395
- opentrons/protocol_engine/state/addressable_areas.py,sha256=X1DKa2Cb2Xu1asYgXB0By67iSeToF1ZezmO7EcR3nSM,27553
395
+ opentrons/protocol_engine/state/addressable_areas.py,sha256=Al86_Qv-ikveekNPV4XS50yzFzXMGklUgEotvbg3O8s,28217
396
396
  opentrons/protocol_engine/state/command_history.py,sha256=aNB1Oye3LxAVOvGppCEohv4KT84buJckgngDcDXDvj8,10252
397
397
  opentrons/protocol_engine/state/commands.py,sha256=wNqBp-tb7rgzqp94mYy6vVjxshv50AearJ1y9QWvKi4,41287
398
398
  opentrons/protocol_engine/state/config.py,sha256=7jSGxC6Vqj1eA8fqZ2I3zjlxVXg8pxvcBYMztRIx9Mg,1515
399
- opentrons/protocol_engine/state/geometry.py,sha256=g1YuN5Gsno-AOseitK_rjAjGn_jVZPknq8a9o6r6Uf8,50601
399
+ opentrons/protocol_engine/state/geometry.py,sha256=YT3ILruOwRvAUtDt_C8EV8k_puXAm5oxmhe1wBnWi1I,51129
400
400
  opentrons/protocol_engine/state/labware.py,sha256=sKbX7uN26m3C_84WnSxM-BJ38n1PlPDlxWf6mkYsY_4,37285
401
401
  opentrons/protocol_engine/state/liquids.py,sha256=W7cf-mmVaZ3aNyiormFEy79aSvU__QwDfPVgjFb3lF4,1885
402
402
  opentrons/protocol_engine/state/modules.py,sha256=bylqsYZyVjrnx6BUhDjJb-TofnqPNk0EUYV8j12UINE,50673
403
403
  opentrons/protocol_engine/state/motion.py,sha256=nh0UGOVvmpYynOchGJkVLTyIyiJ9CszRTUvp4Czr_GI,13955
404
404
  opentrons/protocol_engine/state/move_types.py,sha256=zSQj_qYHBi7_-wrpaZBKmX_O-wNZCpLZkCzagOwI-zY,2132
405
- opentrons/protocol_engine/state/pipettes.py,sha256=MDbzNEr2sI80QvTdCwNfB3GqOdiLFFXRG14zLYA5lqs,36176
405
+ opentrons/protocol_engine/state/pipettes.py,sha256=wS7q9Sau86zK5vCcHiSGRdMhWNm26GPKUDNJnSEjEHw,36053
406
406
  opentrons/protocol_engine/state/state.py,sha256=jx044yBfXFV1YO5aqXhJmy7iFx-tXEQ5rIl3lMcrY04,13562
407
407
  opentrons/protocol_engine/state/state_summary.py,sha256=8VCxEOBeUflx8IBYUYtgNdwcwgdVZv3R8rSfzsbai7U,923
408
408
  opentrons/protocol_engine/state/tips.py,sha256=gU2GsmaWPDyIIjWHj3KXv6NqxphfOd4eeNxF40hm5ok,22621
@@ -472,7 +472,7 @@ opentrons/protocols/models/__init__.py,sha256=KePRAkkKzFoc0lAz8y89cWnxru8ofe3mow
472
472
  opentrons/protocols/models/json_protocol.py,sha256=lteWlIBXgRM86k-wO1dKsx02G2_4kustSDeSoyc5N5U,20128
473
473
  opentrons/protocols/parameters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
474
474
  opentrons/protocols/parameters/csv_parameter_definition.py,sha256=xZhGtdfH2vXSWFK-aGET07_L0LODvHWkfNxf7pQoOmo,2762
475
- opentrons/protocols/parameters/csv_parameter_interface.py,sha256=Lyul1x93_MDcxloZubC60QVbsG_DI62j3zfO92h6zbc,2877
475
+ opentrons/protocols/parameters/csv_parameter_interface.py,sha256=XxQCcNgrtpvZR451nbnlCaQnlgZj_uNkwGIxnK9rk9Q,3684
476
476
  opentrons/protocols/parameters/exceptions.py,sha256=vQUeyy8Yk_fzP4bvT0r_zu3s7Aty3LM7PzTV6k2iXu0,1092
477
477
  opentrons/protocols/parameters/parameter_definition.py,sha256=OMtUCPKyFx5ZH3Jfcw05aF8pptWQ7XYzYttGMuSPu9k,9529
478
478
  opentrons/protocols/parameters/types.py,sha256=h7vaNmKbDHc1q_FzbZoIgoSVo0mvS64FeiLZDnv7xnQ,489
@@ -499,9 +499,9 @@ opentrons/util/helpers.py,sha256=3hr801bWGbxEcOFAS7f-iOhmnUhoK5qahbB8SIvaCfY,165
499
499
  opentrons/util/linal.py,sha256=IlKAP9HkNBBgULeSf4YVwSKHdx9jnCjSr7nvDvlRALg,5753
500
500
  opentrons/util/logging_config.py,sha256=g3TdzDKa1pL_N3eKhRYCdqPaZYe_hpLV-e8llObTcT4,5657
501
501
  opentrons/util/performance_helpers.py,sha256=ew7H8XD20iS6-2TJAzbQeyzStZkkE6PzHt_Adx3wbZQ,5172
502
- opentrons-8.0.0a2.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
503
- opentrons-8.0.0a2.dist-info/METADATA,sha256=8wPRIDTW_pRuroKtVwOpcrbZxYyac3qMDdYWqW6H8Kk,4990
504
- opentrons-8.0.0a2.dist-info/WHEEL,sha256=_4XEmVmaBFWtekSGrbfOGNjC2I5lUr0lZSRblBllIFA,109
505
- opentrons-8.0.0a2.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
506
- opentrons-8.0.0a2.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
507
- opentrons-8.0.0a2.dist-info/RECORD,,
502
+ opentrons-8.0.0a4.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
503
+ opentrons-8.0.0a4.dist-info/METADATA,sha256=gYJjRVCWBigp6_HZem-YgMle4g8vSdMAwswF53rXvUk,4990
504
+ opentrons-8.0.0a4.dist-info/WHEEL,sha256=_4XEmVmaBFWtekSGrbfOGNjC2I5lUr0lZSRblBllIFA,109
505
+ opentrons-8.0.0a4.dist-info/entry_points.txt,sha256=fTa6eGCYkvOtv0ov-KVE8LLGetgb35LQLF9x85OWPVw,106
506
+ opentrons-8.0.0a4.dist-info/top_level.txt,sha256=wk6whpbMZdBQpcK0Fg0YVfUGrAgVOFON7oQAhOMGMW8,10
507
+ opentrons-8.0.0a4.dist-info/RECORD,,