opentrons 8.2.0a3__tar.gz → 8.3.0__tar.gz

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.

Files changed (565) hide show
  1. {opentrons-8.2.0a3 → opentrons-8.3.0}/PKG-INFO +6 -5
  2. {opentrons-8.2.0a3 → opentrons-8.3.0}/setup.py +3 -1
  3. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/deck_configuration.py +3 -3
  4. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/file_operators.py +3 -3
  5. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/helpers.py +3 -1
  6. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/ot2/models/v1.py +16 -29
  7. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/ot2/tip_length.py +7 -4
  8. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/ot3/models/v1.py +14 -23
  9. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/cli/analyze.py +18 -6
  10. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/config/defaults_ot3.py +1 -0
  11. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/asyncio/communication/__init__.py +2 -0
  12. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/asyncio/communication/errors.py +16 -3
  13. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/asyncio/communication/serial_connection.py +24 -9
  14. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/command_builder.py +2 -2
  15. opentrons-8.3.0/src/opentrons/drivers/flex_stacker/__init__.py +9 -0
  16. opentrons-8.3.0/src/opentrons/drivers/flex_stacker/abstract.py +89 -0
  17. opentrons-8.3.0/src/opentrons/drivers/flex_stacker/driver.py +260 -0
  18. opentrons-8.3.0/src/opentrons/drivers/flex_stacker/simulator.py +109 -0
  19. opentrons-8.3.0/src/opentrons/drivers/flex_stacker/types.py +138 -0
  20. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/heater_shaker/driver.py +18 -3
  21. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/temp_deck/driver.py +13 -3
  22. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/thermocycler/driver.py +17 -3
  23. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/execute.py +3 -1
  24. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/__init__.py +1 -2
  25. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/api.py +33 -21
  26. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/backends/flex_protocol.py +17 -7
  27. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/backends/ot3controller.py +213 -63
  28. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/backends/ot3simulator.py +18 -9
  29. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/backends/ot3utils.py +43 -15
  30. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/dev_types.py +4 -0
  31. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/heater_shaker.py +4 -0
  32. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/module_server/client.py +1 -1
  33. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/module_server/server.py +5 -3
  34. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/settings.py +3 -4
  35. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/instruments/ot2/instrument_calibration.py +2 -1
  36. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/instruments/ot2/pipette.py +15 -22
  37. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/instruments/ot2/pipette_handler.py +8 -1
  38. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/instruments/ot3/gripper.py +2 -2
  39. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/instruments/ot3/pipette.py +23 -22
  40. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py +10 -1
  41. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/modules/mod_abc.py +2 -2
  42. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/motion_utilities.py +68 -0
  43. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/nozzle_manager.py +39 -41
  44. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/ot3_calibration.py +1 -1
  45. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/ot3api.py +78 -31
  46. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/gripper_controller.py +3 -0
  47. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/hardware_manager.py +5 -1
  48. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/liquid_handler.py +22 -1
  49. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/motion_controller.py +7 -0
  50. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/robot_calibration.py +1 -1
  51. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/types.py +61 -0
  52. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/legacy_commands/commands.py +37 -0
  53. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/legacy_commands/types.py +39 -0
  54. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/__init__.py +20 -1
  55. opentrons-8.3.0/src/opentrons/protocol_api/_liquid.py +81 -0
  56. opentrons-8.3.0/src/opentrons/protocol_api/_liquid_properties.py +754 -0
  57. opentrons-8.3.0/src/opentrons/protocol_api/_types.py +43 -0
  58. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/common.py +2 -0
  59. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/engine/instrument.py +191 -10
  60. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/engine/labware.py +29 -7
  61. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/engine/protocol.py +130 -5
  62. opentrons-8.3.0/src/opentrons/protocol_api/core/engine/robot.py +139 -0
  63. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/engine/well.py +4 -1
  64. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/instrument.py +73 -4
  65. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/labware.py +13 -4
  66. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/legacy/legacy_instrument_core.py +87 -3
  67. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/legacy/legacy_labware_core.py +13 -4
  68. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/legacy/legacy_protocol_core.py +32 -1
  69. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +61 -3
  70. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/protocol.py +34 -1
  71. opentrons-8.3.0/src/opentrons/protocol_api/core/robot.py +51 -0
  72. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/instrument_context.py +299 -44
  73. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/labware.py +248 -9
  74. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/module_contexts.py +21 -17
  75. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/protocol_context.py +125 -4
  76. opentrons-8.3.0/src/opentrons/protocol_api/robot_context.py +261 -0
  77. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/validation.py +262 -3
  78. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/__init__.py +4 -0
  79. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/actions/actions.py +2 -3
  80. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/clients/sync_client.py +18 -0
  81. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/__init__.py +121 -0
  82. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +1 -3
  83. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/absorbance_reader/initialize.py +20 -6
  84. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +1 -2
  85. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/absorbance_reader/read.py +40 -10
  86. opentrons-8.3.0/src/opentrons/protocol_engine/commands/air_gap_in_place.py +160 -0
  87. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/aspirate.py +103 -53
  88. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/aspirate_in_place.py +55 -51
  89. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/blow_out.py +44 -39
  90. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/blow_out_in_place.py +21 -32
  91. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +13 -6
  92. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/calibration/calibrate_module.py +1 -1
  93. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +3 -3
  94. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +1 -1
  95. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/command.py +73 -66
  96. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/command_unions.py +140 -1
  97. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/comment.py +1 -1
  98. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/configure_for_volume.py +10 -3
  99. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/configure_nozzle_layout.py +6 -4
  100. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/custom.py +6 -12
  101. opentrons-8.3.0/src/opentrons/protocol_engine/commands/dispense.py +192 -0
  102. opentrons-8.3.0/src/opentrons/protocol_engine/commands/dispense_in_place.py +176 -0
  103. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/drop_tip.py +52 -31
  104. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/drop_tip_in_place.py +79 -8
  105. opentrons-8.3.0/src/opentrons/protocol_engine/commands/evotip_dispense.py +156 -0
  106. opentrons-8.3.0/src/opentrons/protocol_engine/commands/evotip_seal_pipette.py +331 -0
  107. opentrons-8.3.0/src/opentrons/protocol_engine/commands/evotip_unseal_pipette.py +160 -0
  108. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/generate_command_schema.py +4 -11
  109. opentrons-8.3.0/src/opentrons/protocol_engine/commands/get_next_tip.py +134 -0
  110. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/get_tip_presence.py +1 -1
  111. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +1 -1
  112. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +1 -1
  113. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +1 -1
  114. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +1 -1
  115. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +1 -1
  116. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +1 -1
  117. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +10 -4
  118. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/home.py +13 -4
  119. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/liquid_probe.py +125 -31
  120. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/load_labware.py +33 -6
  121. opentrons-8.3.0/src/opentrons/protocol_engine/commands/load_lid.py +146 -0
  122. opentrons-8.3.0/src/opentrons/protocol_engine/commands/load_lid_stack.py +189 -0
  123. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/load_liquid.py +12 -4
  124. opentrons-8.3.0/src/opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
  125. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/load_module.py +31 -10
  126. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/load_pipette.py +19 -8
  127. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/magnetic_module/disengage.py +1 -1
  128. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/magnetic_module/engage.py +1 -1
  129. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/move_labware.py +28 -6
  130. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/move_relative.py +35 -25
  131. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/move_to_addressable_area.py +40 -27
  132. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +53 -32
  133. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/move_to_coordinates.py +36 -22
  134. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/move_to_well.py +40 -24
  135. opentrons-8.3.0/src/opentrons/protocol_engine/commands/movement_common.py +338 -0
  136. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/pick_up_tip.py +49 -27
  137. opentrons-8.3.0/src/opentrons/protocol_engine/commands/pipetting_common.py +292 -0
  138. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/prepare_to_aspirate.py +24 -33
  139. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/reload_labware.py +1 -1
  140. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/retract_axis.py +1 -1
  141. opentrons-8.3.0/src/opentrons/protocol_engine/commands/robot/__init__.py +70 -0
  142. opentrons-8.3.0/src/opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +86 -0
  143. opentrons-8.3.0/src/opentrons/protocol_engine/commands/robot/common.py +18 -0
  144. opentrons-8.3.0/src/opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
  145. opentrons-8.3.0/src/opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
  146. opentrons-8.3.0/src/opentrons/protocol_engine/commands/robot/move_to.py +94 -0
  147. opentrons-8.3.0/src/opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +77 -0
  148. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/save_position.py +14 -5
  149. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/set_rail_lights.py +1 -1
  150. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/set_status_bar.py +1 -1
  151. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/temperature_module/deactivate.py +1 -1
  152. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +1 -1
  153. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +10 -4
  154. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/thermocycler/close_lid.py +1 -1
  155. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +1 -1
  156. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +1 -1
  157. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/thermocycler/open_lid.py +1 -1
  158. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +9 -3
  159. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/thermocycler/run_profile.py +9 -3
  160. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +11 -4
  161. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +1 -1
  162. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +1 -1
  163. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +1 -1
  164. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/touch_tip.py +65 -16
  165. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +5 -2
  166. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +13 -4
  167. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +2 -5
  168. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +1 -1
  169. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +4 -2
  170. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +2 -5
  171. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/verify_tip_presence.py +11 -4
  172. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/wait_for_duration.py +10 -3
  173. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/wait_for_resume.py +10 -3
  174. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/errors/__init__.py +12 -0
  175. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/errors/error_occurrence.py +19 -20
  176. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/errors/exceptions.py +76 -0
  177. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/command_executor.py +1 -1
  178. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/equipment.py +73 -5
  179. opentrons-8.3.0/src/opentrons/protocol_engine/execution/gantry_mover.py +686 -0
  180. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/hardware_stopper.py +7 -7
  181. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/movement.py +27 -0
  182. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/pipetting.py +5 -1
  183. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/tip_handler.py +34 -15
  184. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/notes/notes.py +1 -1
  185. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/protocol_engine.py +7 -6
  186. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/resources/labware_data_provider.py +1 -1
  187. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/resources/labware_validation.py +18 -0
  188. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/resources/module_data_provider.py +1 -1
  189. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/resources/pipette_data_provider.py +26 -0
  190. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/slot_standardization.py +9 -9
  191. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/_move_types.py +9 -5
  192. opentrons-8.3.0/src/opentrons/protocol_engine/state/_well_math.py +193 -0
  193. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/addressable_areas.py +25 -61
  194. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/command_history.py +12 -0
  195. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/commands.py +22 -14
  196. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/files.py +10 -12
  197. opentrons-8.3.0/src/opentrons/protocol_engine/state/fluid_stack.py +138 -0
  198. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/frustum_helpers.py +63 -69
  199. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/geometry.py +47 -1
  200. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/labware.py +92 -26
  201. opentrons-8.3.0/src/opentrons/protocol_engine/state/liquid_classes.py +82 -0
  202. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/liquids.py +16 -4
  203. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/modules.py +56 -71
  204. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/motion.py +6 -1
  205. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/pipettes.py +149 -58
  206. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/state.py +21 -2
  207. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/state_summary.py +4 -2
  208. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/tips.py +11 -44
  209. opentrons-8.3.0/src/opentrons/protocol_engine/state/update_types.py +719 -0
  210. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/wells.py +19 -11
  211. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/types.py +176 -28
  212. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_reader/extract_labware_definitions.py +5 -2
  213. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_reader/file_format_validator.py +5 -5
  214. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_runner/json_file_reader.py +9 -3
  215. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_runner/json_translator.py +51 -25
  216. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_runner/legacy_command_mapper.py +66 -64
  217. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_runner/protocol_runner.py +35 -4
  218. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_runner/python_protocol_wrappers.py +1 -1
  219. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_runner/run_orchestrator.py +13 -3
  220. opentrons-8.3.0/src/opentrons/protocols/advanced_control/common.py +38 -0
  221. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/advanced_control/mix.py +1 -1
  222. opentrons-8.3.0/src/opentrons/protocols/advanced_control/transfers/common.py +56 -0
  223. opentrons-8.2.0a3/src/opentrons/protocols/advanced_control/transfers.py → opentrons-8.3.0/src/opentrons/protocols/advanced_control/transfers/transfer.py +10 -85
  224. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/api_support/definitions.py +1 -1
  225. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/api_support/instrument.py +1 -1
  226. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/api_support/util.py +10 -0
  227. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/labware.py +70 -8
  228. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/models/json_protocol.py +5 -9
  229. opentrons-8.3.0/src/opentrons/py.typed +0 -0
  230. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/simulate.py +3 -1
  231. opentrons-8.3.0/src/opentrons/tools/__init__.py +0 -0
  232. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/types.py +162 -2
  233. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/util/entrypoint_util.py +2 -5
  234. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/util/logging_config.py +1 -1
  235. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons.egg-info/PKG-INFO +6 -5
  236. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons.egg-info/SOURCES.txt +31 -1
  237. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons.egg-info/requires.txt +5 -4
  238. opentrons-8.2.0a3/src/opentrons/protocol_api/_liquid.py +0 -106
  239. opentrons-8.2.0a3/src/opentrons/protocol_api/_types.py +0 -19
  240. opentrons-8.2.0a3/src/opentrons/protocol_api/robot_context.py +0 -89
  241. opentrons-8.2.0a3/src/opentrons/protocol_engine/commands/dispense.py +0 -158
  242. opentrons-8.2.0a3/src/opentrons/protocol_engine/commands/dispense_in_place.py +0 -156
  243. opentrons-8.2.0a3/src/opentrons/protocol_engine/commands/pipetting_common.py +0 -210
  244. opentrons-8.2.0a3/src/opentrons/protocol_engine/commands/robot/__init__.py +0 -1
  245. opentrons-8.2.0a3/src/opentrons/protocol_engine/execution/gantry_mover.py +0 -325
  246. opentrons-8.2.0a3/src/opentrons/protocol_engine/state/update_types.py +0 -424
  247. {opentrons-8.2.0a3 → opentrons-8.3.0}/MANIFEST.in +0 -0
  248. {opentrons-8.2.0a3 → opentrons-8.3.0}/README.rst +0 -0
  249. {opentrons-8.2.0a3 → opentrons-8.3.0}/setup.cfg +0 -0
  250. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/__init__.py +0 -0
  251. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/_version.py +0 -0
  252. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/__init__.py +0 -0
  253. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/encoder_decoder.py +0 -0
  254. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/ot2/__init__.py +0 -0
  255. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/ot2/deck_attitude.py +0 -0
  256. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/ot2/mark_bad_calibration.py +0 -0
  257. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/ot2/models/__init__.py +0 -0
  258. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/ot2/models/defaults.py +0 -0
  259. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/ot2/pipette_offset.py +0 -0
  260. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/ot3/__init__.py +0 -0
  261. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/ot3/deck_attitude.py +0 -0
  262. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/ot3/gripper_offset.py +0 -0
  263. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/ot3/models/__init__.py +0 -0
  264. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/ot3/models/defaults.py +0 -0
  265. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/ot3/module_offset.py +0 -0
  266. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/ot3/pipette_offset.py +0 -0
  267. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/calibration_storage/types.py +0 -0
  268. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/cli/__init__.py +0 -0
  269. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/cli/__main__.py +0 -0
  270. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/config/__init__.py +0 -0
  271. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/config/advanced_settings.py +0 -0
  272. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/config/defaults_ot2.py +0 -0
  273. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/config/feature_flags.py +0 -0
  274. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/config/gripper_config.py +0 -0
  275. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/config/reset.py +0 -0
  276. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/config/robot_configs.py +0 -0
  277. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/config/types.py +0 -0
  278. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/__init__.py +0 -0
  279. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/absorbance_reader/__init__.py +0 -0
  280. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/absorbance_reader/abstract.py +0 -0
  281. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/absorbance_reader/async_byonoy.py +0 -0
  282. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/absorbance_reader/driver.py +0 -0
  283. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/absorbance_reader/hid_protocol.py +0 -0
  284. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/absorbance_reader/simulator.py +0 -0
  285. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/asyncio/__init__.py +0 -0
  286. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/asyncio/communication/async_serial.py +0 -0
  287. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/heater_shaker/__init__.py +0 -0
  288. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/heater_shaker/abstract.py +0 -0
  289. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/heater_shaker/simulator.py +0 -0
  290. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/mag_deck/__init__.py +0 -0
  291. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/mag_deck/abstract.py +0 -0
  292. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/mag_deck/driver.py +0 -0
  293. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/mag_deck/simulator.py +0 -0
  294. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/rpi_drivers/__init__.py +0 -0
  295. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/rpi_drivers/dev_types.py +0 -0
  296. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/rpi_drivers/gpio.py +0 -0
  297. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/rpi_drivers/gpio_simulator.py +0 -0
  298. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/rpi_drivers/interfaces.py +0 -0
  299. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/rpi_drivers/types.py +0 -0
  300. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/rpi_drivers/usb.py +0 -0
  301. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/rpi_drivers/usb_simulator.py +0 -0
  302. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/serial_communication.py +0 -0
  303. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/smoothie_drivers/__init__.py +0 -0
  304. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/smoothie_drivers/connection.py +0 -0
  305. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/smoothie_drivers/constants.py +0 -0
  306. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/smoothie_drivers/driver_3_0.py +0 -0
  307. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/smoothie_drivers/errors.py +0 -0
  308. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/smoothie_drivers/parse_utils.py +0 -0
  309. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/smoothie_drivers/simulator.py +0 -0
  310. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/smoothie_drivers/types.py +0 -0
  311. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/temp_deck/__init__.py +0 -0
  312. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/temp_deck/abstract.py +0 -0
  313. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/temp_deck/simulator.py +0 -0
  314. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/thermocycler/__init__.py +0 -0
  315. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/thermocycler/abstract.py +0 -0
  316. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/thermocycler/simulator.py +0 -0
  317. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/types.py +0 -0
  318. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/drivers/utils.py +0 -0
  319. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/__main__.py +0 -0
  320. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/adapters.py +0 -0
  321. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/backends/__init__.py +0 -0
  322. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/backends/controller.py +0 -0
  323. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/backends/errors.py +0 -0
  324. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/backends/estop_state.py +0 -0
  325. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/backends/simulator.py +0 -0
  326. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/backends/status_bar_state.py +0 -0
  327. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/backends/subsystem_manager.py +0 -0
  328. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/backends/tip_presence_manager.py +0 -0
  329. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/backends/types.py +0 -0
  330. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/constants.py +0 -0
  331. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/__init__.py +0 -0
  332. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/abstract_emulator.py +0 -0
  333. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/app.py +0 -0
  334. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/connection_handler.py +0 -0
  335. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/magdeck.py +0 -0
  336. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/module_server/__init__.py +0 -0
  337. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/module_server/helpers.py +0 -0
  338. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/module_server/models.py +0 -0
  339. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/parser.py +0 -0
  340. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/proxy.py +0 -0
  341. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/run_emulator.py +0 -0
  342. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/scripts/__init__.py +0 -0
  343. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/scripts/run_app.py +0 -0
  344. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/scripts/run_module_emulator.py +0 -0
  345. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/scripts/run_smoothie.py +0 -0
  346. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/simulations.py +0 -0
  347. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/smoothie.py +0 -0
  348. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/tempdeck.py +0 -0
  349. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/thermocycler.py +0 -0
  350. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/types.py +0 -0
  351. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/emulation/util.py +0 -0
  352. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/errors.py +0 -0
  353. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/execution_manager.py +0 -0
  354. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/instruments/__init__.py +0 -0
  355. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/instruments/instrument_abc.py +0 -0
  356. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/instruments/ot2/__init__.py +0 -0
  357. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/instruments/ot3/__init__.py +0 -0
  358. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/instruments/ot3/gripper_handler.py +0 -0
  359. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/instruments/ot3/instrument_calibration.py +0 -0
  360. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/module_control.py +0 -0
  361. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/modules/__init__.py +0 -0
  362. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/modules/absorbance_reader.py +0 -0
  363. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/modules/errors.py +0 -0
  364. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/modules/heater_shaker.py +0 -0
  365. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/modules/lid_temp_status.py +0 -0
  366. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/modules/magdeck.py +0 -0
  367. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/modules/module_calibration.py +0 -0
  368. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/modules/plate_temp_status.py +0 -0
  369. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/modules/tempdeck.py +0 -0
  370. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/modules/thermocycler.py +0 -0
  371. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/modules/types.py +0 -0
  372. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/modules/update.py +0 -0
  373. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/modules/utils.py +0 -0
  374. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/pause_manager.py +0 -0
  375. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/poller.py +0 -0
  376. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/__init__.py +0 -0
  377. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/asyncio_configurable.py +0 -0
  378. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/calibratable.py +0 -0
  379. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/chassis_accessory_manager.py +0 -0
  380. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/configurable.py +0 -0
  381. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/event_sourcer.py +0 -0
  382. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/execution_controllable.py +0 -0
  383. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/flex_calibratable.py +0 -0
  384. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/flex_instrument_configurer.py +0 -0
  385. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/identifiable.py +0 -0
  386. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/instrument_configurer.py +0 -0
  387. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/module_provider.py +0 -0
  388. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/position_estimator.py +0 -0
  389. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/simulatable.py +0 -0
  390. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/stoppable.py +0 -0
  391. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/protocols/types.py +0 -0
  392. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/scripts/__init__.py +0 -0
  393. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/scripts/gripper_control.py +0 -0
  394. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/scripts/repl.py +0 -0
  395. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/scripts/tc_control.py +0 -0
  396. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/simulator_setup.py +0 -0
  397. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/thread_manager.py +0 -0
  398. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/threaded_async_lock.py +0 -0
  399. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/hardware_control/util.py +0 -0
  400. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/legacy_broker.py +0 -0
  401. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/legacy_commands/__init__.py +0 -0
  402. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/legacy_commands/helpers.py +0 -0
  403. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/legacy_commands/module_commands.py +0 -0
  404. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/legacy_commands/protocol_commands.py +0 -0
  405. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/legacy_commands/publisher.py +0 -0
  406. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/motion_planning/__init__.py +0 -0
  407. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/motion_planning/adjacent_slots_getters.py +0 -0
  408. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/motion_planning/deck_conflict.py +0 -0
  409. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/motion_planning/errors.py +0 -0
  410. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/motion_planning/types.py +0 -0
  411. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/motion_planning/waypoints.py +0 -0
  412. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/ordered_set.py +0 -0
  413. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/_nozzle_layout.py +0 -0
  414. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/_parameter_context.py +0 -0
  415. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/_parameters.py +0 -0
  416. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/config.py +0 -0
  417. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/__init__.py +0 -0
  418. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/core_map.py +0 -0
  419. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/engine/__init__.py +0 -0
  420. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/engine/deck_conflict.py +0 -0
  421. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/engine/exceptions.py +0 -0
  422. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/engine/load_labware_params.py +0 -0
  423. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/engine/module_core.py +0 -0
  424. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/engine/overlap_versions.py +0 -0
  425. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/engine/pipette_movement_conflict.py +0 -0
  426. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/engine/point_calculations.py +0 -0
  427. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/engine/stringify.py +0 -0
  428. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/legacy/__init__.py +0 -0
  429. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/legacy/deck.py +0 -0
  430. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/legacy/labware_offset_provider.py +0 -0
  431. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/legacy/legacy_module_core.py +0 -0
  432. /opentrons-8.2.0a3/src/opentrons/protocols/advanced_control/__init__.py → /opentrons-8.3.0/src/opentrons/protocol_api/core/legacy/legacy_robot_core.py +0 -0
  433. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/legacy/legacy_well_core.py +0 -0
  434. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/legacy/load_info.py +0 -0
  435. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/legacy/module_geometry.py +0 -0
  436. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/legacy/well_geometry.py +0 -0
  437. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/legacy_simulator/__init__.py +0 -0
  438. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +0 -0
  439. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/module.py +0 -0
  440. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/well.py +0 -0
  441. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/core/well_grid.py +0 -0
  442. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/create_protocol_context.py +0 -0
  443. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/deck.py +0 -0
  444. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/disposal_locations.py +0 -0
  445. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_api/module_validation_and_errors.py +0 -0
  446. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/actions/__init__.py +0 -0
  447. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/actions/action_dispatcher.py +0 -0
  448. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/actions/action_handler.py +0 -0
  449. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/actions/get_state_update.py +0 -0
  450. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/clients/__init__.py +0 -0
  451. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/clients/transports.py +0 -0
  452. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/absorbance_reader/__init__.py +0 -0
  453. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/calibration/__init__.py +0 -0
  454. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/hash_command_params.py +0 -0
  455. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/heater_shaker/__init__.py +0 -0
  456. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/magnetic_module/__init__.py +0 -0
  457. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/temperature_module/__init__.py +0 -0
  458. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/thermocycler/__init__.py +0 -0
  459. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/commands/unsafe/__init__.py +0 -0
  460. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/create_protocol_engine.py +0 -0
  461. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/engine_support.py +0 -0
  462. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/error_recovery_policy.py +0 -0
  463. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/__init__.py +0 -0
  464. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/create_queue_worker.py +0 -0
  465. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/door_watcher.py +0 -0
  466. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +0 -0
  467. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +0 -0
  468. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/labware_movement.py +0 -0
  469. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/queue_worker.py +0 -0
  470. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/rail_lights.py +0 -0
  471. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/run_control.py +0 -0
  472. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/status_bar.py +0 -0
  473. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +0 -0
  474. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +0 -0
  475. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/notes/__init__.py +0 -0
  476. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/plugins.py +0 -0
  477. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/resources/__init__.py +0 -0
  478. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/resources/deck_configuration_provider.py +0 -0
  479. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/resources/deck_data_provider.py +0 -0
  480. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/resources/file_provider.py +0 -0
  481. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/resources/fixture_validation.py +0 -0
  482. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/resources/model_utils.py +0 -0
  483. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/resources/ot3_validation.py +0 -0
  484. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/__init__.py +0 -0
  485. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/_abstract_store.py +0 -0
  486. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/config.py +0 -0
  487. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/module_substates/__init__.py +0 -0
  488. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +0 -0
  489. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +0 -0
  490. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +0 -0
  491. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +0 -0
  492. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +0 -0
  493. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +0 -0
  494. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_reader/__init__.py +0 -0
  495. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_reader/file_hasher.py +0 -0
  496. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_reader/file_identifier.py +0 -0
  497. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_reader/file_reader_writer.py +0 -0
  498. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_reader/input_file.py +0 -0
  499. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_reader/protocol_files_invalid_error.py +0 -0
  500. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_reader/protocol_reader.py +0 -0
  501. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_reader/protocol_source.py +0 -0
  502. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_reader/role_analyzer.py +0 -0
  503. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_runner/__init__.py +0 -0
  504. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_runner/create_simulating_orchestrator.py +0 -0
  505. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_runner/legacy_context_plugin.py +0 -0
  506. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocol_runner/task_queue.py +0 -0
  507. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/__init__.py +0 -0
  508. {opentrons-8.2.0a3/src/opentrons/protocols/api_support → opentrons-8.3.0/src/opentrons/protocols/advanced_control}/__init__.py +0 -0
  509. {opentrons-8.2.0a3/src/opentrons/protocols/execution → opentrons-8.3.0/src/opentrons/protocols/advanced_control/transfers}/__init__.py +0 -0
  510. {opentrons-8.2.0a3/src/opentrons/protocols/geometry → opentrons-8.3.0/src/opentrons/protocols/api_support}/__init__.py +0 -0
  511. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/api_support/constants.py +0 -0
  512. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/api_support/deck_type.py +0 -0
  513. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/api_support/labware_like.py +0 -0
  514. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/api_support/tip_tracker.py +0 -0
  515. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/api_support/types.py +0 -0
  516. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/bundle.py +0 -0
  517. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/duration/__init__.py +0 -0
  518. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/duration/errors.py +0 -0
  519. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/duration/estimator.py +0 -0
  520. {opentrons-8.2.0a3/src/opentrons/protocols/parameters → opentrons-8.3.0/src/opentrons/protocols/execution}/__init__.py +0 -0
  521. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/execution/dev_types.py +0 -0
  522. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/execution/errors.py +0 -0
  523. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/execution/execute.py +0 -0
  524. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/execution/execute_json_v3.py +0 -0
  525. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/execution/execute_json_v4.py +0 -0
  526. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/execution/execute_json_v5.py +0 -0
  527. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/execution/execute_python.py +0 -0
  528. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/execution/json_dispatchers.py +0 -0
  529. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/execution/types.py +0 -0
  530. {opentrons-8.2.0a3/src/opentrons/tools → opentrons-8.3.0/src/opentrons/protocols/geometry}/__init__.py +0 -0
  531. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/geometry/labware_geometry.py +0 -0
  532. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/geometry/planning.py +0 -0
  533. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/models/__init__.py +0 -0
  534. /opentrons-8.2.0a3/src/opentrons/py.typed → /opentrons-8.3.0/src/opentrons/protocols/parameters/__init__.py +0 -0
  535. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/parameters/csv_parameter_definition.py +0 -0
  536. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/parameters/csv_parameter_interface.py +0 -0
  537. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/parameters/exceptions.py +0 -0
  538. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/parameters/parameter_definition.py +0 -0
  539. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/parameters/types.py +0 -0
  540. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/parameters/validation.py +0 -0
  541. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/parse.py +0 -0
  542. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/protocols/types.py +0 -0
  543. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/resources/scripts/lpc21isp +0 -0
  544. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/resources/smoothie-edge-8414642.hex +0 -0
  545. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/system/__init__.py +0 -0
  546. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/system/camera.py +0 -0
  547. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/system/log_control.py +0 -0
  548. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/system/nmcli.py +0 -0
  549. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/system/resin.py +0 -0
  550. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/system/smoothie_update.py +0 -0
  551. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/system/wifi.py +0 -0
  552. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/tools/args_handler.py +0 -0
  553. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/tools/write_pipette_memory.py +0 -0
  554. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/util/__init__.py +0 -0
  555. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/util/async_helpers.py +0 -0
  556. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/util/broker.py +0 -0
  557. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/util/change_notifier.py +0 -0
  558. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/util/get_union_elements.py +0 -0
  559. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/util/helpers.py +0 -0
  560. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/util/linal.py +0 -0
  561. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons/util/performance_helpers.py +0 -0
  562. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons.egg-info/dependency_links.txt +0 -0
  563. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons.egg-info/entry_points.txt +0 -0
  564. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons.egg-info/not-zip-safe +0 -0
  565. {opentrons-8.2.0a3 → opentrons-8.3.0}/src/opentrons.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: opentrons
3
- Version: 8.2.0a3
3
+ Version: 8.3.0
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,12 +21,13 @@ 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.2.0a3
24
+ Requires-Dist: opentrons-shared-data==8.3.0
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
28
28
  Requires-Dist: numpy<2,>=1.20.0
29
- Requires-Dist: pydantic<2.0.0,>=1.10.9
29
+ Requires-Dist: pydantic<3,>=2.0.0
30
+ Requires-Dist: pydantic-settings<3,>=2
30
31
  Requires-Dist: pyserial>=3.5
31
32
  Requires-Dist: typing-extensions<5,>=4.0.0
32
33
  Requires-Dist: click<9,>=8.0.0
@@ -34,9 +35,9 @@ Requires-Dist: pyusb==1.2.1
34
35
  Requires-Dist: importlib-metadata>=1.0; python_version < "3.8"
35
36
  Requires-Dist: packaging>=21.0
36
37
  Provides-Extra: ot2-hardware
37
- Requires-Dist: opentrons-hardware==8.2.0a3; extra == "ot2-hardware"
38
+ Requires-Dist: opentrons-hardware==8.3.0; extra == "ot2-hardware"
38
39
  Provides-Extra: flex-hardware
39
- Requires-Dist: opentrons-hardware[FLEX]==8.2.0a3; extra == "flex-hardware"
40
+ Requires-Dist: opentrons-hardware[FLEX]==8.3.0; extra == "flex-hardware"
40
41
 
41
42
  .. _Full API Documentation: http://docs.opentrons.com
42
43
 
@@ -59,9 +59,11 @@ INSTALL_REQUIRES = [
59
59
  f"opentrons-shared-data=={VERSION}",
60
60
  "aionotify==0.3.1",
61
61
  "anyio>=3.6.1,<4.0.0",
62
+ # todo(mm, 2024-12-14): investigate ref resolution problems caused by jsonschema>=4.18.1.
62
63
  "jsonschema>=3.0.1,<4.18.0",
63
64
  "numpy>=1.20.0,<2",
64
- "pydantic>=1.10.9,<2.0.0",
65
+ "pydantic>=2.0.0,<3",
66
+ "pydantic-settings>=2,<3",
65
67
  "pyserial>=3.5",
66
68
  "typing-extensions>=4.0.0,<5",
67
69
  "click>=8.0.0,<9",
@@ -10,7 +10,7 @@ from . import file_operators as io
10
10
  class _CutoutFixturePlacementModel(pydantic.BaseModel):
11
11
  cutoutId: str
12
12
  cutoutFixtureId: str
13
- opentronsModuleSerialNumber: Optional[str]
13
+ opentronsModuleSerialNumber: Optional[str] = None
14
14
 
15
15
 
16
16
  class _DeckConfigurationModel(pydantic.BaseModel):
@@ -24,9 +24,9 @@ def serialize_deck_configuration(
24
24
  cutout_fixture_placements: List[CutoutFixturePlacement], last_modified: datetime
25
25
  ) -> bytes:
26
26
  """Serialize a deck configuration for storing on the filesystem."""
27
- data = _DeckConfigurationModel.construct(
27
+ data = _DeckConfigurationModel.model_construct(
28
28
  cutoutFixtures=[
29
- _CutoutFixturePlacementModel.construct(
29
+ _CutoutFixturePlacementModel.model_construct(
30
30
  cutoutId=e.cutout_id,
31
31
  cutoutFixtureId=e.cutout_fixture_id,
32
32
  opentronsModuleSerialNumber=e.opentrons_module_serial_number,
@@ -103,7 +103,7 @@ def save_to_file(
103
103
  directory_path.mkdir(parents=True, exist_ok=True)
104
104
  file_path = directory_path / f"{file_name}.json"
105
105
  json_data = (
106
- data.json()
106
+ data.model_dump_json()
107
107
  if isinstance(data, pydantic.BaseModel)
108
108
  else json.dumps(data, cls=encoder)
109
109
  )
@@ -112,7 +112,7 @@ def save_to_file(
112
112
 
113
113
  def serialize_pydantic_model(data: pydantic.BaseModel) -> bytes:
114
114
  """Safely serialize data from a Pydantic model into a form suitable for storing on disk."""
115
- return data.json(by_alias=True).encode("utf-8")
115
+ return data.model_dump_json(by_alias=True).encode("utf-8")
116
116
 
117
117
 
118
118
  _ModelT = typing.TypeVar("_ModelT", bound=pydantic.BaseModel)
@@ -133,7 +133,7 @@ def deserialize_pydantic_model(
133
133
  Returns `None` if the file is missing or corrupt.
134
134
  """
135
135
  try:
136
- return model.parse_raw(serialized)
136
+ return model.model_validate_json(serialized)
137
137
  except json.JSONDecodeError:
138
138
  _log.warning("Data is not valid JSON.", exc_info=True)
139
139
  return None
@@ -31,7 +31,9 @@ def convert_to_dict(obj: Any) -> Dict[str, Any]:
31
31
  # https://github.com/python/mypy/issues/6568
32
32
  # Unfortunately, since it's not currently supported I have an
33
33
  # assert check instead.
34
- assert is_dataclass(obj), "This function is intended for dataclasses only"
34
+ assert is_dataclass(obj) and not isinstance(
35
+ obj, type
36
+ ), "This function is intended for dataclasses only"
35
37
  return asdict(obj, dict_factory=dict_filter_none)
36
38
 
37
39
 
@@ -1,7 +1,7 @@
1
1
  import typing
2
2
 
3
3
  from typing_extensions import Literal
4
- from pydantic import BaseModel, Field, validator
4
+ from pydantic import field_validator, BaseModel, Field, PlainSerializer
5
5
  from datetime import datetime
6
6
 
7
7
  from opentrons_shared_data.pipette.types import LabwareUri
@@ -9,11 +9,16 @@ from opentrons_shared_data.pipette.types import LabwareUri
9
9
  from opentrons.types import Point
10
10
  from opentrons.calibration_storage import types
11
11
 
12
+ DatetimeType = typing.Annotated[
13
+ datetime,
14
+ PlainSerializer(lambda x: x.isoformat(), when_used="json"),
15
+ ]
16
+
12
17
 
13
18
  class CalibrationStatus(BaseModel):
14
19
  markedBad: bool = False
15
20
  source: typing.Optional[types.SourceType] = None
16
- markedAt: typing.Optional[datetime] = None
21
+ markedAt: typing.Optional[DatetimeType] = None
17
22
 
18
23
 
19
24
  # Schemas used to store the data types
@@ -22,7 +27,7 @@ class CalibrationStatus(BaseModel):
22
27
  # they are currently saved in on the OT-2 to avoid a large migration.
23
28
  class TipLengthModel(BaseModel):
24
29
  tipLength: float = Field(..., description="Tip length data found from calibration.")
25
- lastModified: datetime = Field(
30
+ lastModified: DatetimeType = Field(
26
31
  ..., description="The last time this tip length was calibrated."
27
32
  )
28
33
  source: types.SourceType = Field(
@@ -40,22 +45,19 @@ class TipLengthModel(BaseModel):
40
45
  ..., description="The tiprack hash associated with the tip length data."
41
46
  )
42
47
 
43
- @validator("tipLength")
48
+ @field_validator("tipLength")
49
+ @classmethod
44
50
  def ensure_tip_length_positive(cls, tipLength: float) -> float:
45
51
  if tipLength < 0.0:
46
52
  raise ValueError("Tip Length must be a positive number")
47
53
  return tipLength
48
54
 
49
- class Config:
50
- json_encoders = {datetime: lambda obj: obj.isoformat()}
51
- json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)}
52
-
53
55
 
54
56
  class DeckCalibrationModel(BaseModel):
55
57
  attitude: types.AttitudeMatrix = Field(
56
58
  ..., description="Attitude matrix for deck found from calibration."
57
59
  )
58
- last_modified: typing.Optional[datetime] = Field(
60
+ last_modified: typing.Optional[DatetimeType] = Field(
59
61
  default=None, description="The last time this deck was calibrated."
60
62
  )
61
63
  source: types.SourceType = Field(
@@ -72,10 +74,6 @@ class DeckCalibrationModel(BaseModel):
72
74
  description="The status of the calibration data.",
73
75
  )
74
76
 
75
- class Config:
76
- json_encoders = {datetime: lambda obj: obj.isoformat()}
77
- json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)}
78
-
79
77
 
80
78
  class InstrumentOffsetModel(BaseModel):
81
79
  offset: Point = Field(..., description="Instrument offset found from calibration.")
@@ -83,7 +81,7 @@ class InstrumentOffsetModel(BaseModel):
83
81
  uri: str = Field(
84
82
  ..., description="The URI of the labware used for instrument offset"
85
83
  )
86
- last_modified: datetime = Field(
84
+ last_modified: DatetimeType = Field(
87
85
  ..., description="The last time this instrument was calibrated."
88
86
  )
89
87
  source: types.SourceType = Field(
@@ -94,10 +92,6 @@ class InstrumentOffsetModel(BaseModel):
94
92
  description="The status of the calibration data.",
95
93
  )
96
94
 
97
- class Config:
98
- json_encoders = {datetime: lambda obj: obj.isoformat()}
99
- json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)}
100
-
101
95
 
102
96
  # TODO(lc 09-19-2022) We need to refactor the calibration endpoints
103
97
  # so that we only need to use one data model schema. This model is a
@@ -112,7 +106,7 @@ class PipetteOffsetCalibration(BaseModel):
112
106
  uri: str = Field(
113
107
  ..., description="The URI of the labware used for instrument offset"
114
108
  )
115
- last_modified: datetime = Field(
109
+ last_modified: DatetimeType = Field(
116
110
  ..., description="The last time this instrument was calibrated."
117
111
  )
118
112
  source: types.SourceType = Field(
@@ -123,10 +117,6 @@ class PipetteOffsetCalibration(BaseModel):
123
117
  description="The status of the calibration data.",
124
118
  )
125
119
 
126
- class Config:
127
- json_encoders = {datetime: lambda obj: obj.isoformat()}
128
- json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)}
129
-
130
120
 
131
121
  # TODO(lc 09-19-2022) We need to refactor the calibration endpoints
132
122
  # so that we only need to use one data model schema. This model is a
@@ -137,7 +127,7 @@ class TipLengthCalibration(BaseModel):
137
127
  ..., description="The tiprack hash associated with this tip length data."
138
128
  )
139
129
  tipLength: float = Field(..., description="Tip length data found from calibration.")
140
- lastModified: datetime = Field(
130
+ lastModified: DatetimeType = Field(
141
131
  ..., description="The last time this tip length was calibrated."
142
132
  )
143
133
  source: types.SourceType = Field(
@@ -151,12 +141,9 @@ class TipLengthCalibration(BaseModel):
151
141
  ..., description="The tiprack URI associated with the tip length data."
152
142
  )
153
143
 
154
- @validator("tipLength")
144
+ @field_validator("tipLength")
145
+ @classmethod
155
146
  def ensure_tip_length_positive(cls, tipLength: float) -> float:
156
147
  if tipLength < 0.0:
157
148
  raise ValueError("Tip Length must be a positive number")
158
149
  return tipLength
159
-
160
- class Config:
161
- json_encoders = {datetime: lambda obj: obj.isoformat()}
162
- json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)}
@@ -24,13 +24,14 @@ log = logging.getLogger(__name__)
24
24
 
25
25
 
26
26
  def _convert_tip_length_model_to_dict(
27
- to_dict: typing.Dict[LabwareUri, v1.TipLengthModel]
27
+ to_dict: typing.Dict[LabwareUri, v1.TipLengthModel],
28
28
  ) -> typing.Dict[LabwareUri, typing.Any]:
29
+ # TODO[pydantic]: supported in Pydantic V2
29
30
  # This is a workaround since pydantic doesn't have a nice way to
30
31
  # add encoders when converting to a dict.
31
32
  dict_of_tip_lengths = {}
32
33
  for key, item in to_dict.items():
33
- dict_of_tip_lengths[key] = json.loads(item.json())
34
+ dict_of_tip_lengths[key] = json.loads(item.model_dump_json())
34
35
  return dict_of_tip_lengths
35
36
 
36
37
 
@@ -175,12 +176,14 @@ def delete_tip_length_calibration(
175
176
  io.save_to_file(tip_length_dir, pipette_id, dict_of_tip_lengths)
176
177
  else:
177
178
  io.delete_file(tip_length_dir / f"{pipette_id}.json")
178
- elif tiprack_hash and any(tiprack_hash in v.dict() for v in tip_lengths.values()):
179
+ elif tiprack_hash and any(
180
+ tiprack_hash in v.model_dump() for v in tip_lengths.values()
181
+ ):
179
182
  # NOTE this is for backwards compatibilty only
180
183
  # TODO delete this check once the tip_length DELETE router
181
184
  # no longer depends on a tiprack hash
182
185
  for k, v in tip_lengths.items():
183
- if tiprack_hash in v.dict():
186
+ if tiprack_hash in v.model_dump():
184
187
  tip_lengths.pop(k)
185
188
  if tip_lengths:
186
189
  dict_of_tip_lengths = _convert_tip_length_model_to_dict(tip_lengths)
@@ -3,7 +3,7 @@ import typing
3
3
  from typing_extensions import Literal
4
4
  from opentrons.hardware_control.modules.types import ModuleType
5
5
  from opentrons.hardware_control.types import OT3Mount
6
- from pydantic import BaseModel, Field, validator
6
+ from pydantic import field_validator, BaseModel, Field, PlainSerializer
7
7
  from datetime import datetime
8
8
 
9
9
  from opentrons_shared_data.pipette.types import LabwareUri
@@ -12,15 +12,21 @@ from opentrons.types import Point
12
12
  from opentrons.calibration_storage import types
13
13
 
14
14
 
15
+ DatetimeType = typing.Annotated[
16
+ datetime,
17
+ PlainSerializer(lambda x: x.isoformat(), when_used="json"),
18
+ ]
19
+
20
+
15
21
  class CalibrationStatus(BaseModel):
16
22
  markedBad: bool = False
17
23
  source: typing.Optional[types.SourceType] = None
18
- markedAt: typing.Optional[datetime] = None
24
+ markedAt: typing.Optional[DatetimeType] = None
19
25
 
20
26
 
21
27
  class TipLengthModel(BaseModel):
22
28
  tipLength: float = Field(..., description="Tip length data found from calibration.")
23
- lastModified: datetime = Field(
29
+ lastModified: DatetimeType = Field(
24
30
  ..., description="The last time this tip length was calibrated."
25
31
  )
26
32
  uri: typing.Union[LabwareUri, Literal[""]] = Field(
@@ -34,22 +40,19 @@ class TipLengthModel(BaseModel):
34
40
  description="The status of the calibration data.",
35
41
  )
36
42
 
37
- @validator("tipLength")
43
+ @field_validator("tipLength")
44
+ @classmethod
38
45
  def ensure_tip_length_positive(cls, tipLength: float) -> float:
39
46
  if tipLength < 0.0:
40
47
  raise ValueError("Tip Length must be a positive number")
41
48
  return tipLength
42
49
 
43
- class Config:
44
- json_encoders = {datetime: lambda obj: obj.isoformat()}
45
- json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)}
46
-
47
50
 
48
51
  class BeltCalibrationModel(BaseModel):
49
52
  attitude: types.AttitudeMatrix = Field(
50
53
  ..., description="Attitude matrix for belts found from calibration."
51
54
  )
52
- lastModified: datetime = Field(
55
+ lastModified: DatetimeType = Field(
53
56
  ..., description="The last time this deck was calibrated."
54
57
  )
55
58
  source: types.SourceType = Field(
@@ -63,14 +66,10 @@ class BeltCalibrationModel(BaseModel):
63
66
  description="The status of the calibration data.",
64
67
  )
65
68
 
66
- class Config:
67
- json_encoders = {datetime: lambda obj: obj.isoformat()}
68
- json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)}
69
-
70
69
 
71
70
  class InstrumentOffsetModel(BaseModel):
72
71
  offset: Point = Field(..., description="Instrument offset found from calibration.")
73
- lastModified: datetime = Field(
72
+ lastModified: DatetimeType = Field(
74
73
  ..., description="The last time this instrument was calibrated."
75
74
  )
76
75
  source: types.SourceType = Field(
@@ -81,10 +80,6 @@ class InstrumentOffsetModel(BaseModel):
81
80
  description="The status of the calibration data.",
82
81
  )
83
82
 
84
- class Config:
85
- json_encoders = {datetime: lambda obj: obj.isoformat()}
86
- json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)}
87
-
88
83
 
89
84
  class ModuleOffsetModel(BaseModel):
90
85
  offset: Point = Field(..., description="Module offset found from calibration.")
@@ -99,7 +94,7 @@ class ModuleOffsetModel(BaseModel):
99
94
  ...,
100
95
  description="The unique id of the instrument used to calibrate this module.",
101
96
  )
102
- lastModified: datetime = Field(
97
+ lastModified: DatetimeType = Field(
103
98
  ..., description="The last time this module was calibrated."
104
99
  )
105
100
  source: types.SourceType = Field(
@@ -109,7 +104,3 @@ class ModuleOffsetModel(BaseModel):
109
104
  default_factory=CalibrationStatus,
110
105
  description="The status of the calibration data.",
111
106
  )
112
-
113
- class Config:
114
- json_encoders = {datetime: lambda obj: obj.isoformat()}
115
- json_decoders = {datetime: lambda obj: datetime.fromisoformat(obj)}
@@ -53,9 +53,11 @@ from opentrons.protocol_engine import (
53
53
  LoadedPipette,
54
54
  LoadedModule,
55
55
  Liquid,
56
+ LiquidClassRecordWithId,
56
57
  StateSummary,
57
58
  )
58
59
  from opentrons.protocol_engine.protocol_engine import code_in_error_tree
60
+ from opentrons.protocol_engine.types import CommandAnnotation
59
61
 
60
62
  from opentrons_shared_data.robot.types import RobotType
61
63
 
@@ -333,8 +335,10 @@ async def _do_analyze(
333
335
  wells=[],
334
336
  hasEverEnteredErrorRecovery=False,
335
337
  files=[],
338
+ liquidClasses=[],
336
339
  ),
337
340
  parameters=[],
341
+ command_annotations=[],
338
342
  )
339
343
  return analysis
340
344
  return await orchestrator.run(deck_configuration=[])
@@ -378,16 +382,20 @@ async def _analyze(
378
382
  else:
379
383
  result = AnalysisResult.OK
380
384
 
381
- results = AnalyzeResults.construct(
385
+ results = AnalyzeResults.model_construct(
382
386
  createdAt=datetime.now(tz=timezone.utc),
383
387
  files=[
384
- ProtocolFile.construct(name=f.path.name, role=f.role)
388
+ ProtocolFile.model_construct(name=f.path.name, role=f.role)
385
389
  for f in protocol_source.files
386
390
  ],
387
391
  config=(
388
- JsonConfig.construct(schemaVersion=protocol_source.config.schema_version)
392
+ JsonConfig.model_construct(
393
+ schemaVersion=protocol_source.config.schema_version
394
+ )
389
395
  if isinstance(protocol_source.config, JsonProtocolConfig)
390
- else PythonConfig.construct(apiVersion=protocol_source.config.api_version)
396
+ else PythonConfig.model_construct(
397
+ apiVersion=protocol_source.config.api_version
398
+ )
391
399
  ),
392
400
  result=result,
393
401
  metadata=protocol_source.metadata,
@@ -399,20 +407,22 @@ async def _analyze(
399
407
  pipettes=analysis.state_summary.pipettes,
400
408
  modules=analysis.state_summary.modules,
401
409
  liquids=analysis.state_summary.liquids,
410
+ commandAnnotations=analysis.command_annotations,
411
+ liquidClasses=analysis.state_summary.liquidClasses,
402
412
  )
403
413
 
404
414
  _call_for_output_of_kind(
405
415
  "json",
406
416
  outputs,
407
417
  lambda to_file: to_file.write(
408
- results.json(exclude_none=True).encode("utf-8"),
418
+ results.model_dump_json(exclude_none=True).encode("utf-8"),
409
419
  ),
410
420
  )
411
421
  _call_for_output_of_kind(
412
422
  "human-json",
413
423
  outputs,
414
424
  lambda to_file: to_file.write(
415
- results.json(exclude_none=True, indent=2).encode("utf-8")
425
+ results.model_dump_json(exclude_none=True, indent=2).encode("utf-8")
416
426
  ),
417
427
  )
418
428
  if check:
@@ -486,4 +496,6 @@ class AnalyzeResults(BaseModel):
486
496
  pipettes: List[LoadedPipette]
487
497
  modules: List[LoadedModule]
488
498
  liquids: List[Liquid]
499
+ liquidClasses: List[LiquidClassRecordWithId]
489
500
  errors: List[ErrorOccurrence]
501
+ commandAnnotations: List[CommandAnnotation]
@@ -75,6 +75,7 @@ DEFAULT_RIGHT_MOUNT_OFFSET: Final[Offset] = (40.5, -60.5, 255.675)
75
75
  DEFAULT_GRIPPER_MOUNT_OFFSET: Final[Offset] = (84.55, -12.75, 93.85)
76
76
  DEFAULT_SAFE_HOME_DISTANCE: Final = 5
77
77
  DEFAULT_CALIBRATION_AXIS_MAX_SPEED: Final = 30
78
+ DEFAULT_EMULSIFYING_PIPETTE_AXIS_MAX_SPEED: Final = 90
78
79
 
79
80
  DEFAULT_MAX_SPEEDS: Final[ByGantryLoad[Dict[OT3AxisKind, float]]] = ByGantryLoad(
80
81
  high_throughput={
@@ -4,6 +4,7 @@ from opentrons.drivers.asyncio.communication.errors import (
4
4
  NoResponse,
5
5
  AlarmResponse,
6
6
  ErrorResponse,
7
+ UnhandledGcode,
7
8
  )
8
9
  from .async_serial import AsyncSerial
9
10
 
@@ -15,4 +16,5 @@ __all__ = [
15
16
  "NoResponse",
16
17
  "AlarmResponse",
17
18
  "ErrorResponse",
19
+ "UnhandledGcode",
18
20
  ]
@@ -1,23 +1,30 @@
1
1
  """Errors raised by serial connection."""
2
2
 
3
3
 
4
+ from enum import Enum
5
+
6
+
7
+ class ErrorCodes(Enum):
8
+ UNHANDLED_GCODE = "ERR003"
9
+
10
+
4
11
  class SerialException(Exception):
5
12
  """Base serial exception"""
6
13
 
7
- def __init__(self, port: str, description: str):
14
+ def __init__(self, port: str, description: str) -> None:
8
15
  super().__init__(f"{port}: {description}")
9
16
  self.port = port
10
17
  self.description = description
11
18
 
12
19
 
13
20
  class NoResponse(SerialException):
14
- def __init__(self, port: str, command: str):
21
+ def __init__(self, port: str, command: str) -> None:
15
22
  super().__init__(port=port, description=f"No response to '{command}'")
16
23
  self.command = command
17
24
 
18
25
 
19
26
  class FailedCommand(SerialException):
20
- def __init__(self, port: str, response: str):
27
+ def __init__(self, port: str, response: str) -> None:
21
28
  super().__init__(
22
29
  port=port, description=f"'Received error response '{response}'"
23
30
  )
@@ -30,3 +37,9 @@ class AlarmResponse(FailedCommand):
30
37
 
31
38
  class ErrorResponse(FailedCommand):
32
39
  pass
40
+
41
+
42
+ class UnhandledGcode(ErrorResponse):
43
+ def __init__(self, port: str, response: str, command: str) -> None:
44
+ self.command = command
45
+ super().__init__(port, response)
@@ -6,7 +6,7 @@ from typing import Optional, List
6
6
 
7
7
  from opentrons.drivers.command_builder import CommandBuilder
8
8
 
9
- from .errors import NoResponse, AlarmResponse, ErrorResponse
9
+ from .errors import NoResponse, AlarmResponse, ErrorResponse, UnhandledGcode, ErrorCodes
10
10
  from .async_serial import AsyncSerial
11
11
 
12
12
  log = logging.getLogger(__name__)
@@ -199,7 +199,7 @@ class SerialConnection:
199
199
  str_response = self.process_raw_response(
200
200
  command=data, response=response.decode()
201
201
  )
202
- self.raise_on_error(response=str_response)
202
+ self.raise_on_error(response=str_response, request=data)
203
203
  return str_response
204
204
 
205
205
  log.info(f"{self.name}: retry number {retry}/{retries}")
@@ -232,11 +232,12 @@ class SerialConnection:
232
232
  def send_data_lock(self) -> asyncio.Lock:
233
233
  return self._send_data_lock
234
234
 
235
- def raise_on_error(self, response: str) -> None:
235
+ def raise_on_error(self, response: str, request: str) -> None:
236
236
  """
237
237
  Raise an error if the response contains an error
238
238
 
239
239
  Args:
240
+ gcode: the requesting gocde
240
241
  response: response
241
242
 
242
243
  Returns: None
@@ -248,8 +249,13 @@ class SerialConnection:
248
249
  if self._alarm_keyword in lower:
249
250
  raise AlarmResponse(port=self._port, response=response)
250
251
 
251
- if self._error_keyword in lower:
252
- raise ErrorResponse(port=self._port, response=response)
252
+ if self._error_keyword.lower() in lower:
253
+ if ErrorCodes.UNHANDLED_GCODE.value.lower() in lower:
254
+ raise UnhandledGcode(
255
+ port=self._port, response=response, command=request
256
+ )
257
+ else:
258
+ raise ErrorResponse(port=self._port, response=response)
253
259
 
254
260
  async def on_retry(self) -> None:
255
261
  """
@@ -292,6 +298,7 @@ class AsyncResponseSerialConnection(SerialConnection):
292
298
  alarm_keyword: Optional[str] = None,
293
299
  reset_buffer_before_write: bool = False,
294
300
  async_error_ack: Optional[str] = None,
301
+ number_of_retries: int = 0,
295
302
  ) -> AsyncResponseSerialConnection:
296
303
  """
297
304
  Create a connection.
@@ -334,6 +341,7 @@ class AsyncResponseSerialConnection(SerialConnection):
334
341
  error_keyword=error_keyword or "err",
335
342
  alarm_keyword=alarm_keyword or "alarm",
336
343
  async_error_ack=async_error_ack or "async",
344
+ number_of_retries=number_of_retries,
337
345
  )
338
346
 
339
347
  def __init__(
@@ -346,6 +354,7 @@ class AsyncResponseSerialConnection(SerialConnection):
346
354
  error_keyword: str,
347
355
  alarm_keyword: str,
348
356
  async_error_ack: str,
357
+ number_of_retries: int = 0,
349
358
  ) -> None:
350
359
  """
351
360
  Constructor
@@ -377,6 +386,7 @@ class AsyncResponseSerialConnection(SerialConnection):
377
386
  self._name = name
378
387
  self._ack = ack.encode()
379
388
  self._retry_wait_time_seconds = retry_wait_time_seconds
389
+ self._number_of_retries = number_of_retries
380
390
  self._error_keyword = error_keyword.lower()
381
391
  self._alarm_keyword = alarm_keyword.lower()
382
392
  self._async_error_ack = async_error_ack.lower()
@@ -397,7 +407,9 @@ class AsyncResponseSerialConnection(SerialConnection):
397
407
  Raises: SerialException
398
408
  """
399
409
  return await self.send_data(
400
- data=command.build(), retries=retries, timeout=timeout
410
+ data=command.build(),
411
+ retries=retries or self._number_of_retries,
412
+ timeout=timeout,
401
413
  )
402
414
 
403
415
  async def send_data(
@@ -418,7 +430,9 @@ class AsyncResponseSerialConnection(SerialConnection):
418
430
  async with super().send_data_lock, self._serial.timeout_override(
419
431
  "timeout", timeout
420
432
  ):
421
- return await self._send_data(data=data, retries=retries)
433
+ return await self._send_data(
434
+ data=data, retries=retries or self._number_of_retries
435
+ )
422
436
 
423
437
  async def _send_data(self, data: str, retries: int = 0) -> str:
424
438
  """
@@ -433,6 +447,7 @@ class AsyncResponseSerialConnection(SerialConnection):
433
447
  Raises: SerialException
434
448
  """
435
449
  data_encode = data.encode()
450
+ retries = retries or self._number_of_retries
436
451
 
437
452
  for retry in range(retries + 1):
438
453
  log.debug(f"{self._name}: Write -> {data_encode!r}")
@@ -454,7 +469,7 @@ class AsyncResponseSerialConnection(SerialConnection):
454
469
  str_response = self.process_raw_response(
455
470
  command=data, response=ackless_response.decode()
456
471
  )
457
- self.raise_on_error(response=str_response)
472
+ self.raise_on_error(response=str_response, request=data)
458
473
 
459
474
  if self._ack in response[-1]:
460
475
  # Remove ack from response
@@ -462,7 +477,7 @@ class AsyncResponseSerialConnection(SerialConnection):
462
477
  str_response = self.process_raw_response(
463
478
  command=data, response=ackless_response.decode()
464
479
  )
465
- self.raise_on_error(response=str_response)
480
+ self.raise_on_error(response=str_response, request=data)
466
481
  return str_response
467
482
 
468
483
  log.info(f"{self._name}: retry number {retry}/{retries}")
@@ -6,7 +6,7 @@ from typing import List, Optional, Iterator
6
6
  class CommandBuilder:
7
7
  """Class used to build GCODE commands."""
8
8
 
9
- def __init__(self, terminator: str) -> None:
9
+ def __init__(self, terminator: str = "\n") -> None:
10
10
  """
11
11
  Construct a command builder.
12
12
 
@@ -17,7 +17,7 @@ class CommandBuilder:
17
17
  self._elements: List[str] = []
18
18
 
19
19
  def add_float(
20
- self, prefix: str, value: float, precision: Optional[int]
20
+ self, prefix: str, value: float, precision: Optional[int] = None
21
21
  ) -> CommandBuilder:
22
22
  """
23
23
  Add a float value.