opentrons 8.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of opentrons might be problematic. Click here for more details.
- opentrons/__init__.py +150 -0
- opentrons/_version.py +34 -0
- opentrons/calibration_storage/__init__.py +54 -0
- opentrons/calibration_storage/deck_configuration.py +62 -0
- opentrons/calibration_storage/encoder_decoder.py +31 -0
- opentrons/calibration_storage/file_operators.py +142 -0
- opentrons/calibration_storage/helpers.py +103 -0
- opentrons/calibration_storage/ot2/__init__.py +34 -0
- opentrons/calibration_storage/ot2/deck_attitude.py +85 -0
- opentrons/calibration_storage/ot2/mark_bad_calibration.py +27 -0
- opentrons/calibration_storage/ot2/models/__init__.py +0 -0
- opentrons/calibration_storage/ot2/models/v1.py +149 -0
- opentrons/calibration_storage/ot2/pipette_offset.py +129 -0
- opentrons/calibration_storage/ot2/tip_length.py +281 -0
- opentrons/calibration_storage/ot3/__init__.py +31 -0
- opentrons/calibration_storage/ot3/deck_attitude.py +83 -0
- opentrons/calibration_storage/ot3/gripper_offset.py +156 -0
- opentrons/calibration_storage/ot3/models/__init__.py +0 -0
- opentrons/calibration_storage/ot3/models/v1.py +122 -0
- opentrons/calibration_storage/ot3/module_offset.py +138 -0
- opentrons/calibration_storage/ot3/pipette_offset.py +95 -0
- opentrons/calibration_storage/types.py +45 -0
- opentrons/cli/__init__.py +21 -0
- opentrons/cli/__main__.py +5 -0
- opentrons/cli/analyze.py +557 -0
- opentrons/config/__init__.py +631 -0
- opentrons/config/advanced_settings.py +871 -0
- opentrons/config/defaults_ot2.py +214 -0
- opentrons/config/defaults_ot3.py +499 -0
- opentrons/config/feature_flags.py +86 -0
- opentrons/config/gripper_config.py +55 -0
- opentrons/config/reset.py +203 -0
- opentrons/config/robot_configs.py +187 -0
- opentrons/config/types.py +183 -0
- opentrons/drivers/__init__.py +0 -0
- opentrons/drivers/absorbance_reader/__init__.py +11 -0
- opentrons/drivers/absorbance_reader/abstract.py +72 -0
- opentrons/drivers/absorbance_reader/async_byonoy.py +352 -0
- opentrons/drivers/absorbance_reader/driver.py +81 -0
- opentrons/drivers/absorbance_reader/hid_protocol.py +161 -0
- opentrons/drivers/absorbance_reader/simulator.py +84 -0
- opentrons/drivers/asyncio/__init__.py +0 -0
- opentrons/drivers/asyncio/communication/__init__.py +22 -0
- opentrons/drivers/asyncio/communication/async_serial.py +187 -0
- opentrons/drivers/asyncio/communication/errors.py +88 -0
- opentrons/drivers/asyncio/communication/serial_connection.py +557 -0
- opentrons/drivers/command_builder.py +102 -0
- opentrons/drivers/flex_stacker/__init__.py +13 -0
- opentrons/drivers/flex_stacker/abstract.py +214 -0
- opentrons/drivers/flex_stacker/driver.py +768 -0
- opentrons/drivers/flex_stacker/errors.py +68 -0
- opentrons/drivers/flex_stacker/simulator.py +309 -0
- opentrons/drivers/flex_stacker/types.py +367 -0
- opentrons/drivers/flex_stacker/utils.py +19 -0
- opentrons/drivers/heater_shaker/__init__.py +5 -0
- opentrons/drivers/heater_shaker/abstract.py +76 -0
- opentrons/drivers/heater_shaker/driver.py +204 -0
- opentrons/drivers/heater_shaker/simulator.py +94 -0
- opentrons/drivers/mag_deck/__init__.py +6 -0
- opentrons/drivers/mag_deck/abstract.py +44 -0
- opentrons/drivers/mag_deck/driver.py +208 -0
- opentrons/drivers/mag_deck/simulator.py +63 -0
- opentrons/drivers/rpi_drivers/__init__.py +33 -0
- opentrons/drivers/rpi_drivers/dev_types.py +94 -0
- opentrons/drivers/rpi_drivers/gpio.py +282 -0
- opentrons/drivers/rpi_drivers/gpio_simulator.py +127 -0
- opentrons/drivers/rpi_drivers/interfaces.py +15 -0
- opentrons/drivers/rpi_drivers/types.py +364 -0
- opentrons/drivers/rpi_drivers/usb.py +102 -0
- opentrons/drivers/rpi_drivers/usb_simulator.py +22 -0
- opentrons/drivers/serial_communication.py +151 -0
- opentrons/drivers/smoothie_drivers/__init__.py +4 -0
- opentrons/drivers/smoothie_drivers/connection.py +51 -0
- opentrons/drivers/smoothie_drivers/constants.py +121 -0
- opentrons/drivers/smoothie_drivers/driver_3_0.py +1933 -0
- opentrons/drivers/smoothie_drivers/errors.py +49 -0
- opentrons/drivers/smoothie_drivers/parse_utils.py +143 -0
- opentrons/drivers/smoothie_drivers/simulator.py +99 -0
- opentrons/drivers/smoothie_drivers/types.py +16 -0
- opentrons/drivers/temp_deck/__init__.py +10 -0
- opentrons/drivers/temp_deck/abstract.py +54 -0
- opentrons/drivers/temp_deck/driver.py +197 -0
- opentrons/drivers/temp_deck/simulator.py +57 -0
- opentrons/drivers/thermocycler/__init__.py +12 -0
- opentrons/drivers/thermocycler/abstract.py +99 -0
- opentrons/drivers/thermocycler/driver.py +395 -0
- opentrons/drivers/thermocycler/simulator.py +126 -0
- opentrons/drivers/types.py +107 -0
- opentrons/drivers/utils.py +222 -0
- opentrons/execute.py +742 -0
- opentrons/hardware_control/__init__.py +65 -0
- opentrons/hardware_control/__main__.py +77 -0
- opentrons/hardware_control/adapters.py +98 -0
- opentrons/hardware_control/api.py +1347 -0
- opentrons/hardware_control/backends/__init__.py +7 -0
- opentrons/hardware_control/backends/controller.py +400 -0
- opentrons/hardware_control/backends/errors.py +9 -0
- opentrons/hardware_control/backends/estop_state.py +164 -0
- opentrons/hardware_control/backends/flex_protocol.py +497 -0
- opentrons/hardware_control/backends/ot3controller.py +1930 -0
- opentrons/hardware_control/backends/ot3simulator.py +900 -0
- opentrons/hardware_control/backends/ot3utils.py +664 -0
- opentrons/hardware_control/backends/simulator.py +442 -0
- opentrons/hardware_control/backends/status_bar_state.py +240 -0
- opentrons/hardware_control/backends/subsystem_manager.py +431 -0
- opentrons/hardware_control/backends/tip_presence_manager.py +173 -0
- opentrons/hardware_control/backends/types.py +14 -0
- opentrons/hardware_control/constants.py +6 -0
- opentrons/hardware_control/dev_types.py +125 -0
- opentrons/hardware_control/emulation/__init__.py +0 -0
- opentrons/hardware_control/emulation/abstract_emulator.py +21 -0
- opentrons/hardware_control/emulation/app.py +56 -0
- opentrons/hardware_control/emulation/connection_handler.py +38 -0
- opentrons/hardware_control/emulation/heater_shaker.py +150 -0
- opentrons/hardware_control/emulation/magdeck.py +60 -0
- opentrons/hardware_control/emulation/module_server/__init__.py +8 -0
- opentrons/hardware_control/emulation/module_server/client.py +78 -0
- opentrons/hardware_control/emulation/module_server/helpers.py +130 -0
- opentrons/hardware_control/emulation/module_server/models.py +31 -0
- opentrons/hardware_control/emulation/module_server/server.py +110 -0
- opentrons/hardware_control/emulation/parser.py +74 -0
- opentrons/hardware_control/emulation/proxy.py +241 -0
- opentrons/hardware_control/emulation/run_emulator.py +68 -0
- opentrons/hardware_control/emulation/scripts/__init__.py +0 -0
- opentrons/hardware_control/emulation/scripts/run_app.py +54 -0
- opentrons/hardware_control/emulation/scripts/run_module_emulator.py +72 -0
- opentrons/hardware_control/emulation/scripts/run_smoothie.py +37 -0
- opentrons/hardware_control/emulation/settings.py +119 -0
- opentrons/hardware_control/emulation/simulations.py +133 -0
- opentrons/hardware_control/emulation/smoothie.py +192 -0
- opentrons/hardware_control/emulation/tempdeck.py +69 -0
- opentrons/hardware_control/emulation/thermocycler.py +128 -0
- opentrons/hardware_control/emulation/types.py +10 -0
- opentrons/hardware_control/emulation/util.py +38 -0
- opentrons/hardware_control/errors.py +43 -0
- opentrons/hardware_control/execution_manager.py +164 -0
- opentrons/hardware_control/instruments/__init__.py +5 -0
- opentrons/hardware_control/instruments/instrument_abc.py +39 -0
- opentrons/hardware_control/instruments/ot2/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot2/instrument_calibration.py +152 -0
- opentrons/hardware_control/instruments/ot2/pipette.py +777 -0
- opentrons/hardware_control/instruments/ot2/pipette_handler.py +995 -0
- opentrons/hardware_control/instruments/ot3/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot3/gripper.py +420 -0
- opentrons/hardware_control/instruments/ot3/gripper_handler.py +173 -0
- opentrons/hardware_control/instruments/ot3/instrument_calibration.py +214 -0
- opentrons/hardware_control/instruments/ot3/pipette.py +858 -0
- opentrons/hardware_control/instruments/ot3/pipette_handler.py +1030 -0
- opentrons/hardware_control/module_control.py +332 -0
- opentrons/hardware_control/modules/__init__.py +69 -0
- opentrons/hardware_control/modules/absorbance_reader.py +373 -0
- opentrons/hardware_control/modules/errors.py +7 -0
- opentrons/hardware_control/modules/flex_stacker.py +948 -0
- opentrons/hardware_control/modules/heater_shaker.py +426 -0
- opentrons/hardware_control/modules/lid_temp_status.py +35 -0
- opentrons/hardware_control/modules/magdeck.py +233 -0
- opentrons/hardware_control/modules/mod_abc.py +245 -0
- opentrons/hardware_control/modules/module_calibration.py +93 -0
- opentrons/hardware_control/modules/plate_temp_status.py +61 -0
- opentrons/hardware_control/modules/tempdeck.py +299 -0
- opentrons/hardware_control/modules/thermocycler.py +731 -0
- opentrons/hardware_control/modules/types.py +417 -0
- opentrons/hardware_control/modules/update.py +255 -0
- opentrons/hardware_control/modules/utils.py +73 -0
- opentrons/hardware_control/motion_utilities.py +318 -0
- opentrons/hardware_control/nozzle_manager.py +422 -0
- opentrons/hardware_control/ot3_calibration.py +1171 -0
- opentrons/hardware_control/ot3api.py +3227 -0
- opentrons/hardware_control/pause_manager.py +31 -0
- opentrons/hardware_control/poller.py +112 -0
- opentrons/hardware_control/protocols/__init__.py +106 -0
- opentrons/hardware_control/protocols/asyncio_configurable.py +11 -0
- opentrons/hardware_control/protocols/calibratable.py +45 -0
- opentrons/hardware_control/protocols/chassis_accessory_manager.py +90 -0
- opentrons/hardware_control/protocols/configurable.py +48 -0
- opentrons/hardware_control/protocols/event_sourcer.py +18 -0
- opentrons/hardware_control/protocols/execution_controllable.py +33 -0
- opentrons/hardware_control/protocols/flex_calibratable.py +96 -0
- opentrons/hardware_control/protocols/flex_instrument_configurer.py +52 -0
- opentrons/hardware_control/protocols/gripper_controller.py +55 -0
- opentrons/hardware_control/protocols/hardware_manager.py +51 -0
- opentrons/hardware_control/protocols/identifiable.py +16 -0
- opentrons/hardware_control/protocols/instrument_configurer.py +206 -0
- opentrons/hardware_control/protocols/liquid_handler.py +266 -0
- opentrons/hardware_control/protocols/module_provider.py +16 -0
- opentrons/hardware_control/protocols/motion_controller.py +243 -0
- opentrons/hardware_control/protocols/position_estimator.py +45 -0
- opentrons/hardware_control/protocols/simulatable.py +10 -0
- opentrons/hardware_control/protocols/stoppable.py +9 -0
- opentrons/hardware_control/protocols/types.py +27 -0
- opentrons/hardware_control/robot_calibration.py +224 -0
- opentrons/hardware_control/scripts/README.md +28 -0
- opentrons/hardware_control/scripts/__init__.py +1 -0
- opentrons/hardware_control/scripts/gripper_control.py +208 -0
- opentrons/hardware_control/scripts/ot3gripper +7 -0
- opentrons/hardware_control/scripts/ot3repl +7 -0
- opentrons/hardware_control/scripts/repl.py +187 -0
- opentrons/hardware_control/scripts/tc_control.py +97 -0
- opentrons/hardware_control/scripts/update_module_fw.py +274 -0
- opentrons/hardware_control/simulator_setup.py +260 -0
- opentrons/hardware_control/thread_manager.py +431 -0
- opentrons/hardware_control/threaded_async_lock.py +97 -0
- opentrons/hardware_control/types.py +792 -0
- opentrons/hardware_control/util.py +234 -0
- opentrons/legacy_broker.py +53 -0
- opentrons/legacy_commands/__init__.py +1 -0
- opentrons/legacy_commands/commands.py +483 -0
- opentrons/legacy_commands/helpers.py +153 -0
- opentrons/legacy_commands/module_commands.py +276 -0
- opentrons/legacy_commands/protocol_commands.py +54 -0
- opentrons/legacy_commands/publisher.py +155 -0
- opentrons/legacy_commands/robot_commands.py +51 -0
- opentrons/legacy_commands/types.py +1186 -0
- opentrons/motion_planning/__init__.py +32 -0
- opentrons/motion_planning/adjacent_slots_getters.py +168 -0
- opentrons/motion_planning/deck_conflict.py +501 -0
- opentrons/motion_planning/errors.py +35 -0
- opentrons/motion_planning/types.py +42 -0
- opentrons/motion_planning/waypoints.py +218 -0
- opentrons/ordered_set.py +138 -0
- opentrons/protocol_api/__init__.py +105 -0
- opentrons/protocol_api/_liquid.py +157 -0
- opentrons/protocol_api/_liquid_properties.py +814 -0
- opentrons/protocol_api/_nozzle_layout.py +31 -0
- opentrons/protocol_api/_parameter_context.py +300 -0
- opentrons/protocol_api/_parameters.py +31 -0
- opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
- opentrons/protocol_api/_types.py +43 -0
- opentrons/protocol_api/config.py +23 -0
- opentrons/protocol_api/core/__init__.py +23 -0
- opentrons/protocol_api/core/common.py +33 -0
- opentrons/protocol_api/core/core_map.py +74 -0
- opentrons/protocol_api/core/engine/__init__.py +22 -0
- opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
- opentrons/protocol_api/core/engine/deck_conflict.py +400 -0
- opentrons/protocol_api/core/engine/exceptions.py +19 -0
- opentrons/protocol_api/core/engine/instrument.py +2391 -0
- opentrons/protocol_api/core/engine/labware.py +238 -0
- opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
- opentrons/protocol_api/core/engine/module_core.py +1027 -0
- opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
- opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
- opentrons/protocol_api/core/engine/point_calculations.py +64 -0
- opentrons/protocol_api/core/engine/protocol.py +1153 -0
- opentrons/protocol_api/core/engine/robot.py +139 -0
- opentrons/protocol_api/core/engine/stringify.py +74 -0
- opentrons/protocol_api/core/engine/transfer_components_executor.py +1006 -0
- opentrons/protocol_api/core/engine/well.py +241 -0
- opentrons/protocol_api/core/instrument.py +459 -0
- opentrons/protocol_api/core/labware.py +151 -0
- opentrons/protocol_api/core/legacy/__init__.py +11 -0
- opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
- opentrons/protocol_api/core/legacy/deck.py +369 -0
- opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
- opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
- opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
- opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
- opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
- opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
- opentrons/protocol_api/core/legacy/load_info.py +67 -0
- opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
- opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
- opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
- opentrons/protocol_api/core/module.py +484 -0
- opentrons/protocol_api/core/protocol.py +311 -0
- opentrons/protocol_api/core/robot.py +51 -0
- opentrons/protocol_api/core/well.py +116 -0
- opentrons/protocol_api/core/well_grid.py +45 -0
- opentrons/protocol_api/create_protocol_context.py +177 -0
- opentrons/protocol_api/deck.py +223 -0
- opentrons/protocol_api/disposal_locations.py +244 -0
- opentrons/protocol_api/instrument_context.py +3272 -0
- opentrons/protocol_api/labware.py +1579 -0
- opentrons/protocol_api/module_contexts.py +1447 -0
- opentrons/protocol_api/module_validation_and_errors.py +61 -0
- opentrons/protocol_api/protocol_context.py +1688 -0
- opentrons/protocol_api/robot_context.py +303 -0
- opentrons/protocol_api/validation.py +761 -0
- opentrons/protocol_engine/__init__.py +155 -0
- opentrons/protocol_engine/actions/__init__.py +65 -0
- opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
- opentrons/protocol_engine/actions/action_handler.py +13 -0
- opentrons/protocol_engine/actions/actions.py +302 -0
- opentrons/protocol_engine/actions/get_state_update.py +38 -0
- opentrons/protocol_engine/clients/__init__.py +5 -0
- opentrons/protocol_engine/clients/sync_client.py +174 -0
- opentrons/protocol_engine/clients/transports.py +197 -0
- opentrons/protocol_engine/commands/__init__.py +757 -0
- opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
- opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
- opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
- opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
- opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
- opentrons/protocol_engine/commands/aspirate.py +244 -0
- opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
- opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
- opentrons/protocol_engine/commands/blow_out.py +146 -0
- opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
- opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
- opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
- opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
- opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
- opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
- opentrons/protocol_engine/commands/command.py +308 -0
- opentrons/protocol_engine/commands/command_unions.py +974 -0
- opentrons/protocol_engine/commands/comment.py +57 -0
- opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
- opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
- opentrons/protocol_engine/commands/custom.py +67 -0
- opentrons/protocol_engine/commands/dispense.py +194 -0
- opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
- opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
- opentrons/protocol_engine/commands/drop_tip.py +232 -0
- opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
- opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
- opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
- opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
- opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
- opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
- opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
- opentrons/protocol_engine/commands/flex_stacker/store.py +339 -0
- opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
- opentrons/protocol_engine/commands/get_next_tip.py +134 -0
- opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
- opentrons/protocol_engine/commands/hash_command_params.py +38 -0
- opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
- opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
- opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
- opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
- opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
- opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
- opentrons/protocol_engine/commands/home.py +100 -0
- opentrons/protocol_engine/commands/identify_module.py +86 -0
- opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
- opentrons/protocol_engine/commands/liquid_probe.py +464 -0
- opentrons/protocol_engine/commands/load_labware.py +210 -0
- opentrons/protocol_engine/commands/load_lid.py +154 -0
- opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
- opentrons/protocol_engine/commands/load_liquid.py +95 -0
- opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
- opentrons/protocol_engine/commands/load_module.py +223 -0
- opentrons/protocol_engine/commands/load_pipette.py +167 -0
- opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
- opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
- opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
- opentrons/protocol_engine/commands/move_labware.py +546 -0
- opentrons/protocol_engine/commands/move_relative.py +102 -0
- opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
- opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
- opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
- opentrons/protocol_engine/commands/move_to_well.py +119 -0
- opentrons/protocol_engine/commands/movement_common.py +338 -0
- opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
- opentrons/protocol_engine/commands/pipetting_common.py +443 -0
- opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
- opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
- opentrons/protocol_engine/commands/reload_labware.py +90 -0
- opentrons/protocol_engine/commands/retract_axis.py +75 -0
- opentrons/protocol_engine/commands/robot/__init__.py +70 -0
- opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
- opentrons/protocol_engine/commands/robot/common.py +18 -0
- opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
- opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
- opentrons/protocol_engine/commands/robot/move_to.py +94 -0
- opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
- opentrons/protocol_engine/commands/save_position.py +109 -0
- opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
- opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
- opentrons/protocol_engine/commands/set_status_bar.py +89 -0
- opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
- opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
- opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
- opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
- opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
- opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
- opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
- opentrons/protocol_engine/commands/touch_tip.py +189 -0
- opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
- opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
- opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
- opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
- opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
- opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
- opentrons/protocol_engine/create_protocol_engine.py +193 -0
- opentrons/protocol_engine/engine_support.py +28 -0
- opentrons/protocol_engine/error_recovery_policy.py +81 -0
- opentrons/protocol_engine/errors/__init__.py +191 -0
- opentrons/protocol_engine/errors/error_occurrence.py +182 -0
- opentrons/protocol_engine/errors/exceptions.py +1308 -0
- opentrons/protocol_engine/execution/__init__.py +50 -0
- opentrons/protocol_engine/execution/command_executor.py +216 -0
- opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
- opentrons/protocol_engine/execution/door_watcher.py +119 -0
- opentrons/protocol_engine/execution/equipment.py +819 -0
- opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
- opentrons/protocol_engine/execution/gantry_mover.py +686 -0
- opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
- opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
- opentrons/protocol_engine/execution/labware_movement.py +297 -0
- opentrons/protocol_engine/execution/movement.py +350 -0
- opentrons/protocol_engine/execution/pipetting.py +607 -0
- opentrons/protocol_engine/execution/queue_worker.py +86 -0
- opentrons/protocol_engine/execution/rail_lights.py +25 -0
- opentrons/protocol_engine/execution/run_control.py +33 -0
- opentrons/protocol_engine/execution/status_bar.py +34 -0
- opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
- opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
- opentrons/protocol_engine/execution/tip_handler.py +550 -0
- opentrons/protocol_engine/labware_offset_standardization.py +194 -0
- opentrons/protocol_engine/notes/__init__.py +17 -0
- opentrons/protocol_engine/notes/notes.py +59 -0
- opentrons/protocol_engine/plugins.py +104 -0
- opentrons/protocol_engine/protocol_engine.py +683 -0
- opentrons/protocol_engine/resources/__init__.py +26 -0
- opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
- opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
- opentrons/protocol_engine/resources/file_provider.py +161 -0
- opentrons/protocol_engine/resources/fixture_validation.py +68 -0
- opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
- opentrons/protocol_engine/resources/labware_validation.py +73 -0
- opentrons/protocol_engine/resources/model_utils.py +32 -0
- opentrons/protocol_engine/resources/module_data_provider.py +44 -0
- opentrons/protocol_engine/resources/ot3_validation.py +21 -0
- opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
- opentrons/protocol_engine/slot_standardization.py +128 -0
- opentrons/protocol_engine/state/__init__.py +1 -0
- opentrons/protocol_engine/state/_abstract_store.py +27 -0
- opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
- opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
- opentrons/protocol_engine/state/_move_types.py +83 -0
- opentrons/protocol_engine/state/_well_math.py +193 -0
- opentrons/protocol_engine/state/addressable_areas.py +699 -0
- opentrons/protocol_engine/state/command_history.py +309 -0
- opentrons/protocol_engine/state/commands.py +1164 -0
- opentrons/protocol_engine/state/config.py +39 -0
- opentrons/protocol_engine/state/files.py +57 -0
- opentrons/protocol_engine/state/fluid_stack.py +138 -0
- opentrons/protocol_engine/state/geometry.py +2408 -0
- opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
- opentrons/protocol_engine/state/labware.py +1432 -0
- opentrons/protocol_engine/state/liquid_classes.py +82 -0
- opentrons/protocol_engine/state/liquids.py +73 -0
- opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
- opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
- opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
- opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
- opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
- opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
- opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
- opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
- opentrons/protocol_engine/state/modules.py +1515 -0
- opentrons/protocol_engine/state/motion.py +373 -0
- opentrons/protocol_engine/state/pipettes.py +905 -0
- opentrons/protocol_engine/state/state.py +421 -0
- opentrons/protocol_engine/state/state_summary.py +36 -0
- opentrons/protocol_engine/state/tips.py +420 -0
- opentrons/protocol_engine/state/update_types.py +904 -0
- opentrons/protocol_engine/state/wells.py +290 -0
- opentrons/protocol_engine/types/__init__.py +310 -0
- opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
- opentrons/protocol_engine/types/command_annotations.py +53 -0
- opentrons/protocol_engine/types/deck_configuration.py +81 -0
- opentrons/protocol_engine/types/execution.py +96 -0
- opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
- opentrons/protocol_engine/types/instrument.py +47 -0
- opentrons/protocol_engine/types/instrument_sensors.py +47 -0
- opentrons/protocol_engine/types/labware.py +131 -0
- opentrons/protocol_engine/types/labware_movement.py +22 -0
- opentrons/protocol_engine/types/labware_offset_location.py +111 -0
- opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
- opentrons/protocol_engine/types/liquid.py +40 -0
- opentrons/protocol_engine/types/liquid_class.py +59 -0
- opentrons/protocol_engine/types/liquid_handling.py +13 -0
- opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
- opentrons/protocol_engine/types/location.py +194 -0
- opentrons/protocol_engine/types/module.py +310 -0
- opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
- opentrons/protocol_engine/types/run_time_parameters.py +133 -0
- opentrons/protocol_engine/types/tip.py +18 -0
- opentrons/protocol_engine/types/util.py +21 -0
- opentrons/protocol_engine/types/well_position.py +124 -0
- opentrons/protocol_reader/__init__.py +37 -0
- opentrons/protocol_reader/extract_labware_definitions.py +66 -0
- opentrons/protocol_reader/file_format_validator.py +152 -0
- opentrons/protocol_reader/file_hasher.py +27 -0
- opentrons/protocol_reader/file_identifier.py +284 -0
- opentrons/protocol_reader/file_reader_writer.py +90 -0
- opentrons/protocol_reader/input_file.py +16 -0
- opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
- opentrons/protocol_reader/protocol_reader.py +188 -0
- opentrons/protocol_reader/protocol_source.py +124 -0
- opentrons/protocol_reader/role_analyzer.py +86 -0
- opentrons/protocol_runner/__init__.py +26 -0
- opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
- opentrons/protocol_runner/json_file_reader.py +55 -0
- opentrons/protocol_runner/json_translator.py +314 -0
- opentrons/protocol_runner/legacy_command_mapper.py +852 -0
- opentrons/protocol_runner/legacy_context_plugin.py +116 -0
- opentrons/protocol_runner/protocol_runner.py +530 -0
- opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
- opentrons/protocol_runner/run_orchestrator.py +496 -0
- opentrons/protocol_runner/task_queue.py +95 -0
- opentrons/protocols/__init__.py +6 -0
- opentrons/protocols/advanced_control/__init__.py +0 -0
- opentrons/protocols/advanced_control/common.py +38 -0
- opentrons/protocols/advanced_control/mix.py +60 -0
- opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
- opentrons/protocols/advanced_control/transfers/common.py +180 -0
- opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
- opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
- opentrons/protocols/api_support/__init__.py +0 -0
- opentrons/protocols/api_support/constants.py +8 -0
- opentrons/protocols/api_support/deck_type.py +110 -0
- opentrons/protocols/api_support/definitions.py +18 -0
- opentrons/protocols/api_support/instrument.py +151 -0
- opentrons/protocols/api_support/labware_like.py +233 -0
- opentrons/protocols/api_support/tip_tracker.py +175 -0
- opentrons/protocols/api_support/types.py +32 -0
- opentrons/protocols/api_support/util.py +403 -0
- opentrons/protocols/bundle.py +89 -0
- opentrons/protocols/duration/__init__.py +4 -0
- opentrons/protocols/duration/errors.py +5 -0
- opentrons/protocols/duration/estimator.py +628 -0
- opentrons/protocols/execution/__init__.py +0 -0
- opentrons/protocols/execution/dev_types.py +181 -0
- opentrons/protocols/execution/errors.py +40 -0
- opentrons/protocols/execution/execute.py +84 -0
- opentrons/protocols/execution/execute_json_v3.py +275 -0
- opentrons/protocols/execution/execute_json_v4.py +359 -0
- opentrons/protocols/execution/execute_json_v5.py +28 -0
- opentrons/protocols/execution/execute_python.py +169 -0
- opentrons/protocols/execution/json_dispatchers.py +87 -0
- opentrons/protocols/execution/types.py +7 -0
- opentrons/protocols/geometry/__init__.py +0 -0
- opentrons/protocols/geometry/planning.py +297 -0
- opentrons/protocols/labware.py +312 -0
- opentrons/protocols/models/__init__.py +0 -0
- opentrons/protocols/models/json_protocol.py +679 -0
- opentrons/protocols/parameters/__init__.py +0 -0
- opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
- opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
- opentrons/protocols/parameters/exceptions.py +34 -0
- opentrons/protocols/parameters/parameter_definition.py +272 -0
- opentrons/protocols/parameters/types.py +17 -0
- opentrons/protocols/parameters/validation.py +267 -0
- opentrons/protocols/parse.py +671 -0
- opentrons/protocols/types.py +159 -0
- opentrons/py.typed +0 -0
- opentrons/resources/scripts/lpc21isp +0 -0
- opentrons/resources/smoothie-edge-8414642.hex +23010 -0
- opentrons/simulate.py +1065 -0
- opentrons/system/__init__.py +6 -0
- opentrons/system/camera.py +51 -0
- opentrons/system/log_control.py +59 -0
- opentrons/system/nmcli.py +856 -0
- opentrons/system/resin.py +24 -0
- opentrons/system/smoothie_update.py +15 -0
- opentrons/system/wifi.py +204 -0
- opentrons/tools/__init__.py +0 -0
- opentrons/tools/args_handler.py +22 -0
- opentrons/tools/write_pipette_memory.py +157 -0
- opentrons/types.py +618 -0
- opentrons/util/__init__.py +1 -0
- opentrons/util/async_helpers.py +166 -0
- opentrons/util/broker.py +84 -0
- opentrons/util/change_notifier.py +47 -0
- opentrons/util/entrypoint_util.py +278 -0
- opentrons/util/get_union_elements.py +26 -0
- opentrons/util/helpers.py +6 -0
- opentrons/util/linal.py +178 -0
- opentrons/util/logging_config.py +265 -0
- opentrons/util/logging_queue_handler.py +61 -0
- opentrons/util/performance_helpers.py +157 -0
- opentrons-8.6.0.dist-info/METADATA +37 -0
- opentrons-8.6.0.dist-info/RECORD +601 -0
- opentrons-8.6.0.dist-info/WHEEL +4 -0
- opentrons-8.6.0.dist-info/entry_points.txt +3 -0
- opentrons-8.6.0.dist-info/licenses/LICENSE +202 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"""CSV Parameter definition and associated classes/functions."""
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from opentrons.protocol_engine.types import (
|
|
5
|
+
RunTimeParameter,
|
|
6
|
+
CSVParameter as ProtocolEngineCSVParameter,
|
|
7
|
+
FileInfo,
|
|
8
|
+
)
|
|
9
|
+
from opentrons.protocols.api_support.types import APIVersion
|
|
10
|
+
|
|
11
|
+
from . import validation
|
|
12
|
+
from .parameter_definition import AbstractParameterDefinition
|
|
13
|
+
from .csv_parameter_interface import CSVParameter
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class CSVParameterDefinition(AbstractParameterDefinition[Optional[bytes]]):
|
|
17
|
+
"""The definition for a user defined CSV file parameter."""
|
|
18
|
+
|
|
19
|
+
def __init__(
|
|
20
|
+
self, display_name: str, variable_name: str, description: Optional[str]
|
|
21
|
+
) -> None:
|
|
22
|
+
"""Initializes a CSV file parameter.
|
|
23
|
+
|
|
24
|
+
Arguments:
|
|
25
|
+
display_name: The display name of the parameter as it would show up on the frontend.
|
|
26
|
+
variable_name: The variable name the parameter will be referred to in the run context.
|
|
27
|
+
description: An optional description for the parameter.
|
|
28
|
+
"""
|
|
29
|
+
self._display_name = validation.ensure_display_name(display_name)
|
|
30
|
+
self._variable_name = validation.ensure_variable_name(variable_name)
|
|
31
|
+
self._description = validation.ensure_description(description)
|
|
32
|
+
self._value: Optional[bytes] = None
|
|
33
|
+
self._file_info: Optional[FileInfo] = None
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
def variable_name(self) -> str:
|
|
37
|
+
"""The in-protocol variable name of the parameter."""
|
|
38
|
+
return self._variable_name
|
|
39
|
+
|
|
40
|
+
@property
|
|
41
|
+
def value(self) -> Optional[bytes]:
|
|
42
|
+
"""The current set file for the CSV parameter. Defaults to None on definition creation."""
|
|
43
|
+
return self._value
|
|
44
|
+
|
|
45
|
+
@value.setter
|
|
46
|
+
def value(self, contents: bytes) -> None:
|
|
47
|
+
self._value = contents
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def file_info(self) -> Optional[FileInfo]:
|
|
51
|
+
return self._file_info
|
|
52
|
+
|
|
53
|
+
@file_info.setter
|
|
54
|
+
def file_info(self, file_info: FileInfo) -> None:
|
|
55
|
+
self._file_info = file_info
|
|
56
|
+
|
|
57
|
+
def as_csv_parameter_interface(self, api_version: APIVersion) -> CSVParameter:
|
|
58
|
+
return CSVParameter(contents=self._value, api_version=api_version)
|
|
59
|
+
|
|
60
|
+
def as_protocol_engine_type(self) -> RunTimeParameter:
|
|
61
|
+
"""Returns CSV parameter as a Protocol Engine type to send to client."""
|
|
62
|
+
return ProtocolEngineCSVParameter(
|
|
63
|
+
displayName=self._display_name,
|
|
64
|
+
variableName=self._variable_name,
|
|
65
|
+
description=self._description,
|
|
66
|
+
file=self._file_info,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def create_csv_parameter(
|
|
71
|
+
display_name: str,
|
|
72
|
+
variable_name: str,
|
|
73
|
+
description: Optional[str] = None,
|
|
74
|
+
) -> CSVParameterDefinition:
|
|
75
|
+
return CSVParameterDefinition(
|
|
76
|
+
display_name=display_name, variable_name=variable_name, description=description
|
|
77
|
+
)
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import csv
|
|
2
|
+
from tempfile import NamedTemporaryFile
|
|
3
|
+
from typing import Optional, TextIO, Any, List
|
|
4
|
+
|
|
5
|
+
from opentrons.protocols.api_support.types import APIVersion
|
|
6
|
+
|
|
7
|
+
from .exceptions import ParameterValueError, RuntimeParameterRequired
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# TODO(jbl 2024-08-02) This is a public facing class and as such should be moved to the protocol_api folder
|
|
11
|
+
class CSVParameter:
|
|
12
|
+
def __init__(self, contents: Optional[bytes], api_version: APIVersion) -> None:
|
|
13
|
+
self._contents = contents
|
|
14
|
+
self._api_version = api_version
|
|
15
|
+
self._file: Optional[TextIO] = None
|
|
16
|
+
|
|
17
|
+
@property
|
|
18
|
+
def file(self) -> TextIO:
|
|
19
|
+
"""Returns the file handler for the CSV file.
|
|
20
|
+
|
|
21
|
+
The file is treated as read-only, UTF-8-encoded text.
|
|
22
|
+
"""
|
|
23
|
+
if self._file is None:
|
|
24
|
+
text = self.contents
|
|
25
|
+
temporary_file = NamedTemporaryFile("r+")
|
|
26
|
+
temporary_file.write(text)
|
|
27
|
+
temporary_file.flush()
|
|
28
|
+
|
|
29
|
+
# Open a new file handler for the temporary file with read-only permissions and close the other
|
|
30
|
+
self._file = open(temporary_file.name, "r")
|
|
31
|
+
temporary_file.close()
|
|
32
|
+
return self._file
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
def file_opened(self) -> bool:
|
|
36
|
+
"""Returns ``True`` if a file handler is open for the CSV parameter."""
|
|
37
|
+
return self._file is not None
|
|
38
|
+
|
|
39
|
+
@property
|
|
40
|
+
def contents(self) -> str:
|
|
41
|
+
"""Returns the full contents of the CSV file as a single string."""
|
|
42
|
+
if self._contents is None:
|
|
43
|
+
raise RuntimeParameterRequired(
|
|
44
|
+
"CSV parameter needs to be set to a file for full analysis or run."
|
|
45
|
+
)
|
|
46
|
+
return self._contents.decode("utf-8")
|
|
47
|
+
|
|
48
|
+
def parse_as_csv(
|
|
49
|
+
self, detect_dialect: bool = True, **kwargs: Any
|
|
50
|
+
) -> List[List[str]]:
|
|
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.
|
|
61
|
+
|
|
62
|
+
:param detect_dialect: If ``True``, examine the file and try to assign it a
|
|
63
|
+
:py:class:`csv.Dialect` to improve parsing behavior. Set this to ``False``
|
|
64
|
+
when using the file output of :py:meth:`.AbsorbanceReaderContext.read` as
|
|
65
|
+
a runtime parameter.
|
|
66
|
+
:param kwargs: For advanced CSV handling, you can pass any of the
|
|
67
|
+
`formatting parameters <https://docs.python.org/3/library/csv.html#csv-fmt-params>`_
|
|
68
|
+
accepted by :py:func:`csv.reader` from the Python standard library.
|
|
69
|
+
"""
|
|
70
|
+
rows: List[List[str]] = []
|
|
71
|
+
if detect_dialect:
|
|
72
|
+
try:
|
|
73
|
+
dialect = csv.Sniffer().sniff(self.contents[:1024])
|
|
74
|
+
reader = csv.reader(self.contents.split("\n"), dialect, **kwargs)
|
|
75
|
+
except (UnicodeDecodeError, csv.Error):
|
|
76
|
+
raise ParameterValueError(
|
|
77
|
+
"Cannot parse dialect or contents from provided CSV contents."
|
|
78
|
+
)
|
|
79
|
+
else:
|
|
80
|
+
try:
|
|
81
|
+
reader = csv.reader(self.contents.split("\n"), **kwargs)
|
|
82
|
+
except (UnicodeDecodeError, csv.Error):
|
|
83
|
+
raise ParameterValueError("Cannot parse provided CSV contents.")
|
|
84
|
+
try:
|
|
85
|
+
for row in reader:
|
|
86
|
+
rows.append(row)
|
|
87
|
+
except (UnicodeDecodeError, csv.Error):
|
|
88
|
+
raise ParameterValueError("Cannot parse provided CSV contents.")
|
|
89
|
+
return self._remove_trailing_empty_rows(rows)
|
|
90
|
+
|
|
91
|
+
@staticmethod
|
|
92
|
+
def _remove_trailing_empty_rows(rows: List[List[str]]) -> List[List[str]]:
|
|
93
|
+
"""Removes any trailing empty rows."""
|
|
94
|
+
while rows and rows[-1] == []:
|
|
95
|
+
rows.pop()
|
|
96
|
+
return rows
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from typing import Optional, Dict, Sequence
|
|
2
|
+
|
|
3
|
+
from opentrons_shared_data.errors import GeneralError, EnumeratedError, ErrorCodes
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class RuntimeParameterRequired(GeneralError):
|
|
7
|
+
"""An error raised when a parameter is required to be set for full analysis."""
|
|
8
|
+
|
|
9
|
+
def __init__(
|
|
10
|
+
self,
|
|
11
|
+
message: Optional[str] = None,
|
|
12
|
+
detail: Optional[Dict[str, str]] = None,
|
|
13
|
+
wrapping: Optional[Sequence[EnumeratedError]] = None,
|
|
14
|
+
) -> None:
|
|
15
|
+
"""Build an RuntimeParameterRequired."""
|
|
16
|
+
super().__init__(
|
|
17
|
+
ErrorCodes.RUNTIME_PARAMETER_VALUE_REQUIRED, message, detail, wrapping
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ParameterValueError(ValueError):
|
|
22
|
+
"""An error raised when a parameter value is not valid."""
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ParameterDefinitionError(ValueError):
|
|
26
|
+
"""An error raised when a parameter definition value is not valid."""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ParameterNameError(ValueError):
|
|
30
|
+
"""An error raised when a parameter name or description is not valid."""
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class IncompatibleParameterError(ValueError):
|
|
34
|
+
"""An error raised when a parameter conflicts with another parameter."""
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
"""Parameter definition and associated validators."""
|
|
2
|
+
from abc import abstractmethod, ABC
|
|
3
|
+
from typing import Generic, Optional, List, Set, Union
|
|
4
|
+
|
|
5
|
+
from opentrons.protocols.parameters.types import (
|
|
6
|
+
ParamType,
|
|
7
|
+
ParameterChoice,
|
|
8
|
+
PrimitiveAllowedTypes,
|
|
9
|
+
)
|
|
10
|
+
from opentrons.protocols.parameters.exceptions import (
|
|
11
|
+
ParameterValueError,
|
|
12
|
+
ParameterDefinitionError,
|
|
13
|
+
)
|
|
14
|
+
from opentrons.protocols.parameters import validation
|
|
15
|
+
from opentrons.protocol_engine.types import (
|
|
16
|
+
RunTimeParameter,
|
|
17
|
+
NumberParameter,
|
|
18
|
+
BooleanParameter,
|
|
19
|
+
EnumParameter,
|
|
20
|
+
EnumChoice,
|
|
21
|
+
)
|
|
22
|
+
from opentrons.util.get_union_elements import get_union_elements
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class AbstractParameterDefinition(ABC, Generic[ParamType]):
|
|
26
|
+
@property
|
|
27
|
+
@abstractmethod
|
|
28
|
+
def variable_name(self) -> str:
|
|
29
|
+
...
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
@abstractmethod
|
|
33
|
+
def value(self) -> ParamType:
|
|
34
|
+
...
|
|
35
|
+
|
|
36
|
+
@value.setter
|
|
37
|
+
@abstractmethod
|
|
38
|
+
def value(self, new_value: ParamType) -> None:
|
|
39
|
+
...
|
|
40
|
+
|
|
41
|
+
@abstractmethod
|
|
42
|
+
def as_protocol_engine_type(self) -> RunTimeParameter:
|
|
43
|
+
...
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class ParameterDefinition(AbstractParameterDefinition[PrimitiveAllowedTypes]):
|
|
47
|
+
"""The definition for a user defined parameter."""
|
|
48
|
+
|
|
49
|
+
def __init__(
|
|
50
|
+
self,
|
|
51
|
+
display_name: str,
|
|
52
|
+
variable_name: str,
|
|
53
|
+
parameter_type: type,
|
|
54
|
+
default: PrimitiveAllowedTypes,
|
|
55
|
+
minimum: Optional[PrimitiveAllowedTypes] = None,
|
|
56
|
+
maximum: Optional[PrimitiveAllowedTypes] = None,
|
|
57
|
+
choices: Optional[List[ParameterChoice]] = None,
|
|
58
|
+
description: Optional[str] = None,
|
|
59
|
+
unit: Optional[str] = None,
|
|
60
|
+
) -> None:
|
|
61
|
+
"""Initializes a parameter.
|
|
62
|
+
|
|
63
|
+
This stores the type, default values, range or list of possible values, and other information
|
|
64
|
+
that is defined when a parameter is created for a protocol, as well as validators for setting
|
|
65
|
+
a non-default value for the parameter.
|
|
66
|
+
|
|
67
|
+
Arguments:
|
|
68
|
+
display_name: The display name of the parameter as it would show up on the frontend.
|
|
69
|
+
variable_name: The variable name the parameter will be referred to in the run context.
|
|
70
|
+
parameter_type: Can be bool, int, float or str. Must match the type of default and all choices or
|
|
71
|
+
min and max values
|
|
72
|
+
default: The default value the parameter is set to. This will be used in initial analysis.
|
|
73
|
+
minimum: The minimum value the parameter can be set to (inclusive). Mutually exclusive with choices.
|
|
74
|
+
maximum: The maximum value the parameter can be set to (inclusive). Mutually exclusive with choices.
|
|
75
|
+
choices: A sequence of possible choices that this parameter can be set to.
|
|
76
|
+
Mutually exclusive with minimum and maximum.
|
|
77
|
+
description: An optional description for the parameter.
|
|
78
|
+
unit: An optional suffix for float and int type parameters.
|
|
79
|
+
"""
|
|
80
|
+
self._display_name = validation.ensure_display_name(display_name)
|
|
81
|
+
self._variable_name = validation.ensure_variable_name(variable_name)
|
|
82
|
+
self._description = validation.ensure_description(description)
|
|
83
|
+
self._unit = validation.ensure_unit_string_length(unit)
|
|
84
|
+
|
|
85
|
+
if parameter_type not in get_union_elements(PrimitiveAllowedTypes):
|
|
86
|
+
raise ParameterDefinitionError(
|
|
87
|
+
"Parameters can only be of type int, float, str, or bool."
|
|
88
|
+
)
|
|
89
|
+
self._type = parameter_type
|
|
90
|
+
|
|
91
|
+
self._choices: Optional[List[ParameterChoice]] = choices
|
|
92
|
+
self._allowed_values: Optional[Set[PrimitiveAllowedTypes]] = None
|
|
93
|
+
|
|
94
|
+
self._minimum: Optional[Union[int, float]] = None
|
|
95
|
+
self._maximum: Optional[Union[int, float]] = None
|
|
96
|
+
|
|
97
|
+
validation.validate_options(default, minimum, maximum, choices, parameter_type)
|
|
98
|
+
if choices is not None:
|
|
99
|
+
self._allowed_values = {choice["value"] for choice in choices}
|
|
100
|
+
else:
|
|
101
|
+
assert isinstance(minimum, (int, float)) and isinstance(
|
|
102
|
+
maximum, (int, float)
|
|
103
|
+
)
|
|
104
|
+
self._minimum = minimum
|
|
105
|
+
self._maximum = maximum
|
|
106
|
+
|
|
107
|
+
self._default: PrimitiveAllowedTypes = default
|
|
108
|
+
self.value: PrimitiveAllowedTypes = default
|
|
109
|
+
|
|
110
|
+
@property
|
|
111
|
+
def value(self) -> PrimitiveAllowedTypes:
|
|
112
|
+
"""The current value of the parameter."""
|
|
113
|
+
return self._value
|
|
114
|
+
|
|
115
|
+
@value.setter
|
|
116
|
+
def value(self, new_value: PrimitiveAllowedTypes) -> None:
|
|
117
|
+
validation.validate_type(new_value, self._type)
|
|
118
|
+
if self._allowed_values is not None and new_value not in self._allowed_values:
|
|
119
|
+
raise ParameterValueError(
|
|
120
|
+
f"Parameter must be set to one of the allowed values of {sorted(self._allowed_values)}."
|
|
121
|
+
)
|
|
122
|
+
elif (
|
|
123
|
+
isinstance(self._minimum, (int, float))
|
|
124
|
+
and isinstance(self._maximum, (int, float))
|
|
125
|
+
and isinstance(new_value, (int, float))
|
|
126
|
+
and not (self._minimum <= new_value <= self._maximum)
|
|
127
|
+
):
|
|
128
|
+
raise ParameterValueError(
|
|
129
|
+
f"Parameter must be between {self._minimum} and {self._maximum} inclusive."
|
|
130
|
+
)
|
|
131
|
+
self._value = new_value
|
|
132
|
+
|
|
133
|
+
@property
|
|
134
|
+
def variable_name(self) -> str:
|
|
135
|
+
"""The in-protocol variable name of the parameter."""
|
|
136
|
+
return self._variable_name
|
|
137
|
+
|
|
138
|
+
@property
|
|
139
|
+
def parameter_type(self) -> type:
|
|
140
|
+
"""The python type of the parameter."""
|
|
141
|
+
return self._type
|
|
142
|
+
|
|
143
|
+
def as_protocol_engine_type(self) -> RunTimeParameter:
|
|
144
|
+
"""Returns parameter as a Protocol Engine type to send to client."""
|
|
145
|
+
parameter: RunTimeParameter
|
|
146
|
+
if self._type is bool:
|
|
147
|
+
parameter = BooleanParameter(
|
|
148
|
+
displayName=self._display_name,
|
|
149
|
+
variableName=self._variable_name,
|
|
150
|
+
description=self._description,
|
|
151
|
+
value=bool(self._value),
|
|
152
|
+
default=bool(self._default),
|
|
153
|
+
)
|
|
154
|
+
elif self._choices is not None:
|
|
155
|
+
choices = [
|
|
156
|
+
EnumChoice(
|
|
157
|
+
displayName=str(choice["display_name"]),
|
|
158
|
+
value=choice["value"],
|
|
159
|
+
)
|
|
160
|
+
for choice in self._choices
|
|
161
|
+
]
|
|
162
|
+
parameter = EnumParameter(
|
|
163
|
+
type=validation.convert_type_string_for_enum(self._type),
|
|
164
|
+
displayName=self._display_name,
|
|
165
|
+
variableName=self._variable_name,
|
|
166
|
+
description=self._description,
|
|
167
|
+
choices=choices,
|
|
168
|
+
value=self._value,
|
|
169
|
+
default=self._default,
|
|
170
|
+
)
|
|
171
|
+
elif self._minimum is not None and self._maximum is not None:
|
|
172
|
+
parameter = NumberParameter(
|
|
173
|
+
type=validation.convert_type_string_for_num_param(self._type),
|
|
174
|
+
displayName=self._display_name,
|
|
175
|
+
variableName=self._variable_name,
|
|
176
|
+
description=self._description,
|
|
177
|
+
suffix=self._unit,
|
|
178
|
+
min=float(self._minimum),
|
|
179
|
+
max=float(self._maximum),
|
|
180
|
+
value=float(self._value),
|
|
181
|
+
default=float(self._default),
|
|
182
|
+
)
|
|
183
|
+
else:
|
|
184
|
+
raise ParameterDefinitionError(
|
|
185
|
+
f"Cannot resolve parameter {self._display_name} to protocol engine type."
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
return parameter
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def create_int_parameter(
|
|
192
|
+
display_name: str,
|
|
193
|
+
variable_name: str,
|
|
194
|
+
default: int,
|
|
195
|
+
minimum: Optional[int] = None,
|
|
196
|
+
maximum: Optional[int] = None,
|
|
197
|
+
choices: Optional[List[ParameterChoice]] = None,
|
|
198
|
+
description: Optional[str] = None,
|
|
199
|
+
unit: Optional[str] = None,
|
|
200
|
+
) -> ParameterDefinition:
|
|
201
|
+
"""Creates an integer parameter."""
|
|
202
|
+
return ParameterDefinition(
|
|
203
|
+
parameter_type=int,
|
|
204
|
+
display_name=display_name,
|
|
205
|
+
variable_name=variable_name,
|
|
206
|
+
default=default,
|
|
207
|
+
minimum=minimum,
|
|
208
|
+
maximum=maximum,
|
|
209
|
+
choices=choices,
|
|
210
|
+
description=description,
|
|
211
|
+
unit=unit,
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def create_float_parameter(
|
|
216
|
+
display_name: str,
|
|
217
|
+
variable_name: str,
|
|
218
|
+
default: float,
|
|
219
|
+
minimum: Optional[float] = None,
|
|
220
|
+
maximum: Optional[float] = None,
|
|
221
|
+
choices: Optional[List[ParameterChoice]] = None,
|
|
222
|
+
description: Optional[str] = None,
|
|
223
|
+
unit: Optional[str] = None,
|
|
224
|
+
) -> ParameterDefinition:
|
|
225
|
+
"""Creates a float parameter."""
|
|
226
|
+
return ParameterDefinition(
|
|
227
|
+
parameter_type=float,
|
|
228
|
+
display_name=display_name,
|
|
229
|
+
variable_name=variable_name,
|
|
230
|
+
default=default,
|
|
231
|
+
minimum=minimum,
|
|
232
|
+
maximum=maximum,
|
|
233
|
+
choices=choices,
|
|
234
|
+
description=description,
|
|
235
|
+
unit=unit,
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
def create_bool_parameter(
|
|
240
|
+
display_name: str,
|
|
241
|
+
variable_name: str,
|
|
242
|
+
default: bool,
|
|
243
|
+
choices: List[ParameterChoice],
|
|
244
|
+
description: Optional[str] = None,
|
|
245
|
+
) -> ParameterDefinition:
|
|
246
|
+
"""Creates a boolean parameter."""
|
|
247
|
+
return ParameterDefinition(
|
|
248
|
+
parameter_type=bool,
|
|
249
|
+
display_name=display_name,
|
|
250
|
+
variable_name=variable_name,
|
|
251
|
+
default=default,
|
|
252
|
+
choices=choices,
|
|
253
|
+
description=description,
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
def create_str_parameter(
|
|
258
|
+
display_name: str,
|
|
259
|
+
variable_name: str,
|
|
260
|
+
default: str,
|
|
261
|
+
choices: Optional[List[ParameterChoice]] = None,
|
|
262
|
+
description: Optional[str] = None,
|
|
263
|
+
) -> ParameterDefinition:
|
|
264
|
+
"""Creates a string parameter."""
|
|
265
|
+
return ParameterDefinition(
|
|
266
|
+
parameter_type=str,
|
|
267
|
+
display_name=display_name,
|
|
268
|
+
variable_name=variable_name,
|
|
269
|
+
default=default,
|
|
270
|
+
choices=choices,
|
|
271
|
+
description=description,
|
|
272
|
+
)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from typing import TypeVar, Union, TypedDict
|
|
2
|
+
|
|
3
|
+
from .csv_parameter_interface import CSVParameter
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
PrimitiveAllowedTypes = Union[str, int, float, bool]
|
|
7
|
+
AllAllowedTypes = Union[str, int, float, bool, bytes, None]
|
|
8
|
+
UserFacingTypes = Union[str, int, float, bool, CSVParameter]
|
|
9
|
+
|
|
10
|
+
ParamType = TypeVar("ParamType", bound=AllAllowedTypes)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ParameterChoice(TypedDict):
|
|
14
|
+
"""A parameter choice containing the display name and value."""
|
|
15
|
+
|
|
16
|
+
display_name: str
|
|
17
|
+
value: PrimitiveAllowedTypes
|