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.

Files changed (601) hide show
  1. opentrons/__init__.py +150 -0
  2. opentrons/_version.py +34 -0
  3. opentrons/calibration_storage/__init__.py +54 -0
  4. opentrons/calibration_storage/deck_configuration.py +62 -0
  5. opentrons/calibration_storage/encoder_decoder.py +31 -0
  6. opentrons/calibration_storage/file_operators.py +142 -0
  7. opentrons/calibration_storage/helpers.py +103 -0
  8. opentrons/calibration_storage/ot2/__init__.py +34 -0
  9. opentrons/calibration_storage/ot2/deck_attitude.py +85 -0
  10. opentrons/calibration_storage/ot2/mark_bad_calibration.py +27 -0
  11. opentrons/calibration_storage/ot2/models/__init__.py +0 -0
  12. opentrons/calibration_storage/ot2/models/v1.py +149 -0
  13. opentrons/calibration_storage/ot2/pipette_offset.py +129 -0
  14. opentrons/calibration_storage/ot2/tip_length.py +281 -0
  15. opentrons/calibration_storage/ot3/__init__.py +31 -0
  16. opentrons/calibration_storage/ot3/deck_attitude.py +83 -0
  17. opentrons/calibration_storage/ot3/gripper_offset.py +156 -0
  18. opentrons/calibration_storage/ot3/models/__init__.py +0 -0
  19. opentrons/calibration_storage/ot3/models/v1.py +122 -0
  20. opentrons/calibration_storage/ot3/module_offset.py +138 -0
  21. opentrons/calibration_storage/ot3/pipette_offset.py +95 -0
  22. opentrons/calibration_storage/types.py +45 -0
  23. opentrons/cli/__init__.py +21 -0
  24. opentrons/cli/__main__.py +5 -0
  25. opentrons/cli/analyze.py +557 -0
  26. opentrons/config/__init__.py +631 -0
  27. opentrons/config/advanced_settings.py +871 -0
  28. opentrons/config/defaults_ot2.py +214 -0
  29. opentrons/config/defaults_ot3.py +499 -0
  30. opentrons/config/feature_flags.py +86 -0
  31. opentrons/config/gripper_config.py +55 -0
  32. opentrons/config/reset.py +203 -0
  33. opentrons/config/robot_configs.py +187 -0
  34. opentrons/config/types.py +183 -0
  35. opentrons/drivers/__init__.py +0 -0
  36. opentrons/drivers/absorbance_reader/__init__.py +11 -0
  37. opentrons/drivers/absorbance_reader/abstract.py +72 -0
  38. opentrons/drivers/absorbance_reader/async_byonoy.py +352 -0
  39. opentrons/drivers/absorbance_reader/driver.py +81 -0
  40. opentrons/drivers/absorbance_reader/hid_protocol.py +161 -0
  41. opentrons/drivers/absorbance_reader/simulator.py +84 -0
  42. opentrons/drivers/asyncio/__init__.py +0 -0
  43. opentrons/drivers/asyncio/communication/__init__.py +22 -0
  44. opentrons/drivers/asyncio/communication/async_serial.py +187 -0
  45. opentrons/drivers/asyncio/communication/errors.py +88 -0
  46. opentrons/drivers/asyncio/communication/serial_connection.py +557 -0
  47. opentrons/drivers/command_builder.py +102 -0
  48. opentrons/drivers/flex_stacker/__init__.py +13 -0
  49. opentrons/drivers/flex_stacker/abstract.py +214 -0
  50. opentrons/drivers/flex_stacker/driver.py +768 -0
  51. opentrons/drivers/flex_stacker/errors.py +68 -0
  52. opentrons/drivers/flex_stacker/simulator.py +309 -0
  53. opentrons/drivers/flex_stacker/types.py +367 -0
  54. opentrons/drivers/flex_stacker/utils.py +19 -0
  55. opentrons/drivers/heater_shaker/__init__.py +5 -0
  56. opentrons/drivers/heater_shaker/abstract.py +76 -0
  57. opentrons/drivers/heater_shaker/driver.py +204 -0
  58. opentrons/drivers/heater_shaker/simulator.py +94 -0
  59. opentrons/drivers/mag_deck/__init__.py +6 -0
  60. opentrons/drivers/mag_deck/abstract.py +44 -0
  61. opentrons/drivers/mag_deck/driver.py +208 -0
  62. opentrons/drivers/mag_deck/simulator.py +63 -0
  63. opentrons/drivers/rpi_drivers/__init__.py +33 -0
  64. opentrons/drivers/rpi_drivers/dev_types.py +94 -0
  65. opentrons/drivers/rpi_drivers/gpio.py +282 -0
  66. opentrons/drivers/rpi_drivers/gpio_simulator.py +127 -0
  67. opentrons/drivers/rpi_drivers/interfaces.py +15 -0
  68. opentrons/drivers/rpi_drivers/types.py +364 -0
  69. opentrons/drivers/rpi_drivers/usb.py +102 -0
  70. opentrons/drivers/rpi_drivers/usb_simulator.py +22 -0
  71. opentrons/drivers/serial_communication.py +151 -0
  72. opentrons/drivers/smoothie_drivers/__init__.py +4 -0
  73. opentrons/drivers/smoothie_drivers/connection.py +51 -0
  74. opentrons/drivers/smoothie_drivers/constants.py +121 -0
  75. opentrons/drivers/smoothie_drivers/driver_3_0.py +1933 -0
  76. opentrons/drivers/smoothie_drivers/errors.py +49 -0
  77. opentrons/drivers/smoothie_drivers/parse_utils.py +143 -0
  78. opentrons/drivers/smoothie_drivers/simulator.py +99 -0
  79. opentrons/drivers/smoothie_drivers/types.py +16 -0
  80. opentrons/drivers/temp_deck/__init__.py +10 -0
  81. opentrons/drivers/temp_deck/abstract.py +54 -0
  82. opentrons/drivers/temp_deck/driver.py +197 -0
  83. opentrons/drivers/temp_deck/simulator.py +57 -0
  84. opentrons/drivers/thermocycler/__init__.py +12 -0
  85. opentrons/drivers/thermocycler/abstract.py +99 -0
  86. opentrons/drivers/thermocycler/driver.py +395 -0
  87. opentrons/drivers/thermocycler/simulator.py +126 -0
  88. opentrons/drivers/types.py +107 -0
  89. opentrons/drivers/utils.py +222 -0
  90. opentrons/execute.py +742 -0
  91. opentrons/hardware_control/__init__.py +65 -0
  92. opentrons/hardware_control/__main__.py +77 -0
  93. opentrons/hardware_control/adapters.py +98 -0
  94. opentrons/hardware_control/api.py +1347 -0
  95. opentrons/hardware_control/backends/__init__.py +7 -0
  96. opentrons/hardware_control/backends/controller.py +400 -0
  97. opentrons/hardware_control/backends/errors.py +9 -0
  98. opentrons/hardware_control/backends/estop_state.py +164 -0
  99. opentrons/hardware_control/backends/flex_protocol.py +497 -0
  100. opentrons/hardware_control/backends/ot3controller.py +1930 -0
  101. opentrons/hardware_control/backends/ot3simulator.py +900 -0
  102. opentrons/hardware_control/backends/ot3utils.py +664 -0
  103. opentrons/hardware_control/backends/simulator.py +442 -0
  104. opentrons/hardware_control/backends/status_bar_state.py +240 -0
  105. opentrons/hardware_control/backends/subsystem_manager.py +431 -0
  106. opentrons/hardware_control/backends/tip_presence_manager.py +173 -0
  107. opentrons/hardware_control/backends/types.py +14 -0
  108. opentrons/hardware_control/constants.py +6 -0
  109. opentrons/hardware_control/dev_types.py +125 -0
  110. opentrons/hardware_control/emulation/__init__.py +0 -0
  111. opentrons/hardware_control/emulation/abstract_emulator.py +21 -0
  112. opentrons/hardware_control/emulation/app.py +56 -0
  113. opentrons/hardware_control/emulation/connection_handler.py +38 -0
  114. opentrons/hardware_control/emulation/heater_shaker.py +150 -0
  115. opentrons/hardware_control/emulation/magdeck.py +60 -0
  116. opentrons/hardware_control/emulation/module_server/__init__.py +8 -0
  117. opentrons/hardware_control/emulation/module_server/client.py +78 -0
  118. opentrons/hardware_control/emulation/module_server/helpers.py +130 -0
  119. opentrons/hardware_control/emulation/module_server/models.py +31 -0
  120. opentrons/hardware_control/emulation/module_server/server.py +110 -0
  121. opentrons/hardware_control/emulation/parser.py +74 -0
  122. opentrons/hardware_control/emulation/proxy.py +241 -0
  123. opentrons/hardware_control/emulation/run_emulator.py +68 -0
  124. opentrons/hardware_control/emulation/scripts/__init__.py +0 -0
  125. opentrons/hardware_control/emulation/scripts/run_app.py +54 -0
  126. opentrons/hardware_control/emulation/scripts/run_module_emulator.py +72 -0
  127. opentrons/hardware_control/emulation/scripts/run_smoothie.py +37 -0
  128. opentrons/hardware_control/emulation/settings.py +119 -0
  129. opentrons/hardware_control/emulation/simulations.py +133 -0
  130. opentrons/hardware_control/emulation/smoothie.py +192 -0
  131. opentrons/hardware_control/emulation/tempdeck.py +69 -0
  132. opentrons/hardware_control/emulation/thermocycler.py +128 -0
  133. opentrons/hardware_control/emulation/types.py +10 -0
  134. opentrons/hardware_control/emulation/util.py +38 -0
  135. opentrons/hardware_control/errors.py +43 -0
  136. opentrons/hardware_control/execution_manager.py +164 -0
  137. opentrons/hardware_control/instruments/__init__.py +5 -0
  138. opentrons/hardware_control/instruments/instrument_abc.py +39 -0
  139. opentrons/hardware_control/instruments/ot2/__init__.py +0 -0
  140. opentrons/hardware_control/instruments/ot2/instrument_calibration.py +152 -0
  141. opentrons/hardware_control/instruments/ot2/pipette.py +777 -0
  142. opentrons/hardware_control/instruments/ot2/pipette_handler.py +995 -0
  143. opentrons/hardware_control/instruments/ot3/__init__.py +0 -0
  144. opentrons/hardware_control/instruments/ot3/gripper.py +420 -0
  145. opentrons/hardware_control/instruments/ot3/gripper_handler.py +173 -0
  146. opentrons/hardware_control/instruments/ot3/instrument_calibration.py +214 -0
  147. opentrons/hardware_control/instruments/ot3/pipette.py +858 -0
  148. opentrons/hardware_control/instruments/ot3/pipette_handler.py +1030 -0
  149. opentrons/hardware_control/module_control.py +332 -0
  150. opentrons/hardware_control/modules/__init__.py +69 -0
  151. opentrons/hardware_control/modules/absorbance_reader.py +373 -0
  152. opentrons/hardware_control/modules/errors.py +7 -0
  153. opentrons/hardware_control/modules/flex_stacker.py +948 -0
  154. opentrons/hardware_control/modules/heater_shaker.py +426 -0
  155. opentrons/hardware_control/modules/lid_temp_status.py +35 -0
  156. opentrons/hardware_control/modules/magdeck.py +233 -0
  157. opentrons/hardware_control/modules/mod_abc.py +245 -0
  158. opentrons/hardware_control/modules/module_calibration.py +93 -0
  159. opentrons/hardware_control/modules/plate_temp_status.py +61 -0
  160. opentrons/hardware_control/modules/tempdeck.py +299 -0
  161. opentrons/hardware_control/modules/thermocycler.py +731 -0
  162. opentrons/hardware_control/modules/types.py +417 -0
  163. opentrons/hardware_control/modules/update.py +255 -0
  164. opentrons/hardware_control/modules/utils.py +73 -0
  165. opentrons/hardware_control/motion_utilities.py +318 -0
  166. opentrons/hardware_control/nozzle_manager.py +422 -0
  167. opentrons/hardware_control/ot3_calibration.py +1171 -0
  168. opentrons/hardware_control/ot3api.py +3227 -0
  169. opentrons/hardware_control/pause_manager.py +31 -0
  170. opentrons/hardware_control/poller.py +112 -0
  171. opentrons/hardware_control/protocols/__init__.py +106 -0
  172. opentrons/hardware_control/protocols/asyncio_configurable.py +11 -0
  173. opentrons/hardware_control/protocols/calibratable.py +45 -0
  174. opentrons/hardware_control/protocols/chassis_accessory_manager.py +90 -0
  175. opentrons/hardware_control/protocols/configurable.py +48 -0
  176. opentrons/hardware_control/protocols/event_sourcer.py +18 -0
  177. opentrons/hardware_control/protocols/execution_controllable.py +33 -0
  178. opentrons/hardware_control/protocols/flex_calibratable.py +96 -0
  179. opentrons/hardware_control/protocols/flex_instrument_configurer.py +52 -0
  180. opentrons/hardware_control/protocols/gripper_controller.py +55 -0
  181. opentrons/hardware_control/protocols/hardware_manager.py +51 -0
  182. opentrons/hardware_control/protocols/identifiable.py +16 -0
  183. opentrons/hardware_control/protocols/instrument_configurer.py +206 -0
  184. opentrons/hardware_control/protocols/liquid_handler.py +266 -0
  185. opentrons/hardware_control/protocols/module_provider.py +16 -0
  186. opentrons/hardware_control/protocols/motion_controller.py +243 -0
  187. opentrons/hardware_control/protocols/position_estimator.py +45 -0
  188. opentrons/hardware_control/protocols/simulatable.py +10 -0
  189. opentrons/hardware_control/protocols/stoppable.py +9 -0
  190. opentrons/hardware_control/protocols/types.py +27 -0
  191. opentrons/hardware_control/robot_calibration.py +224 -0
  192. opentrons/hardware_control/scripts/README.md +28 -0
  193. opentrons/hardware_control/scripts/__init__.py +1 -0
  194. opentrons/hardware_control/scripts/gripper_control.py +208 -0
  195. opentrons/hardware_control/scripts/ot3gripper +7 -0
  196. opentrons/hardware_control/scripts/ot3repl +7 -0
  197. opentrons/hardware_control/scripts/repl.py +187 -0
  198. opentrons/hardware_control/scripts/tc_control.py +97 -0
  199. opentrons/hardware_control/scripts/update_module_fw.py +274 -0
  200. opentrons/hardware_control/simulator_setup.py +260 -0
  201. opentrons/hardware_control/thread_manager.py +431 -0
  202. opentrons/hardware_control/threaded_async_lock.py +97 -0
  203. opentrons/hardware_control/types.py +792 -0
  204. opentrons/hardware_control/util.py +234 -0
  205. opentrons/legacy_broker.py +53 -0
  206. opentrons/legacy_commands/__init__.py +1 -0
  207. opentrons/legacy_commands/commands.py +483 -0
  208. opentrons/legacy_commands/helpers.py +153 -0
  209. opentrons/legacy_commands/module_commands.py +276 -0
  210. opentrons/legacy_commands/protocol_commands.py +54 -0
  211. opentrons/legacy_commands/publisher.py +155 -0
  212. opentrons/legacy_commands/robot_commands.py +51 -0
  213. opentrons/legacy_commands/types.py +1186 -0
  214. opentrons/motion_planning/__init__.py +32 -0
  215. opentrons/motion_planning/adjacent_slots_getters.py +168 -0
  216. opentrons/motion_planning/deck_conflict.py +501 -0
  217. opentrons/motion_planning/errors.py +35 -0
  218. opentrons/motion_planning/types.py +42 -0
  219. opentrons/motion_planning/waypoints.py +218 -0
  220. opentrons/ordered_set.py +138 -0
  221. opentrons/protocol_api/__init__.py +105 -0
  222. opentrons/protocol_api/_liquid.py +157 -0
  223. opentrons/protocol_api/_liquid_properties.py +814 -0
  224. opentrons/protocol_api/_nozzle_layout.py +31 -0
  225. opentrons/protocol_api/_parameter_context.py +300 -0
  226. opentrons/protocol_api/_parameters.py +31 -0
  227. opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
  228. opentrons/protocol_api/_types.py +43 -0
  229. opentrons/protocol_api/config.py +23 -0
  230. opentrons/protocol_api/core/__init__.py +23 -0
  231. opentrons/protocol_api/core/common.py +33 -0
  232. opentrons/protocol_api/core/core_map.py +74 -0
  233. opentrons/protocol_api/core/engine/__init__.py +22 -0
  234. opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
  235. opentrons/protocol_api/core/engine/deck_conflict.py +400 -0
  236. opentrons/protocol_api/core/engine/exceptions.py +19 -0
  237. opentrons/protocol_api/core/engine/instrument.py +2391 -0
  238. opentrons/protocol_api/core/engine/labware.py +238 -0
  239. opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
  240. opentrons/protocol_api/core/engine/module_core.py +1027 -0
  241. opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
  242. opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
  243. opentrons/protocol_api/core/engine/point_calculations.py +64 -0
  244. opentrons/protocol_api/core/engine/protocol.py +1153 -0
  245. opentrons/protocol_api/core/engine/robot.py +139 -0
  246. opentrons/protocol_api/core/engine/stringify.py +74 -0
  247. opentrons/protocol_api/core/engine/transfer_components_executor.py +1006 -0
  248. opentrons/protocol_api/core/engine/well.py +241 -0
  249. opentrons/protocol_api/core/instrument.py +459 -0
  250. opentrons/protocol_api/core/labware.py +151 -0
  251. opentrons/protocol_api/core/legacy/__init__.py +11 -0
  252. opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
  253. opentrons/protocol_api/core/legacy/deck.py +369 -0
  254. opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
  255. opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
  256. opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
  257. opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
  258. opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
  259. opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
  260. opentrons/protocol_api/core/legacy/load_info.py +67 -0
  261. opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
  262. opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
  263. opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
  264. opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
  265. opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
  266. opentrons/protocol_api/core/module.py +484 -0
  267. opentrons/protocol_api/core/protocol.py +311 -0
  268. opentrons/protocol_api/core/robot.py +51 -0
  269. opentrons/protocol_api/core/well.py +116 -0
  270. opentrons/protocol_api/core/well_grid.py +45 -0
  271. opentrons/protocol_api/create_protocol_context.py +177 -0
  272. opentrons/protocol_api/deck.py +223 -0
  273. opentrons/protocol_api/disposal_locations.py +244 -0
  274. opentrons/protocol_api/instrument_context.py +3272 -0
  275. opentrons/protocol_api/labware.py +1579 -0
  276. opentrons/protocol_api/module_contexts.py +1447 -0
  277. opentrons/protocol_api/module_validation_and_errors.py +61 -0
  278. opentrons/protocol_api/protocol_context.py +1688 -0
  279. opentrons/protocol_api/robot_context.py +303 -0
  280. opentrons/protocol_api/validation.py +761 -0
  281. opentrons/protocol_engine/__init__.py +155 -0
  282. opentrons/protocol_engine/actions/__init__.py +65 -0
  283. opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
  284. opentrons/protocol_engine/actions/action_handler.py +13 -0
  285. opentrons/protocol_engine/actions/actions.py +302 -0
  286. opentrons/protocol_engine/actions/get_state_update.py +38 -0
  287. opentrons/protocol_engine/clients/__init__.py +5 -0
  288. opentrons/protocol_engine/clients/sync_client.py +174 -0
  289. opentrons/protocol_engine/clients/transports.py +197 -0
  290. opentrons/protocol_engine/commands/__init__.py +757 -0
  291. opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
  292. opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
  293. opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
  294. opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
  295. opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
  296. opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
  297. opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
  298. opentrons/protocol_engine/commands/aspirate.py +244 -0
  299. opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
  300. opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
  301. opentrons/protocol_engine/commands/blow_out.py +146 -0
  302. opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
  303. opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
  304. opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
  305. opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
  306. opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
  307. opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
  308. opentrons/protocol_engine/commands/command.py +308 -0
  309. opentrons/protocol_engine/commands/command_unions.py +974 -0
  310. opentrons/protocol_engine/commands/comment.py +57 -0
  311. opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
  312. opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
  313. opentrons/protocol_engine/commands/custom.py +67 -0
  314. opentrons/protocol_engine/commands/dispense.py +194 -0
  315. opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
  316. opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
  317. opentrons/protocol_engine/commands/drop_tip.py +232 -0
  318. opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
  319. opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
  320. opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
  321. opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
  322. opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
  323. opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
  324. opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
  325. opentrons/protocol_engine/commands/flex_stacker/store.py +339 -0
  326. opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
  327. opentrons/protocol_engine/commands/get_next_tip.py +134 -0
  328. opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
  329. opentrons/protocol_engine/commands/hash_command_params.py +38 -0
  330. opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
  331. opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
  332. opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
  333. opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
  334. opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
  335. opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
  336. opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
  337. opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
  338. opentrons/protocol_engine/commands/home.py +100 -0
  339. opentrons/protocol_engine/commands/identify_module.py +86 -0
  340. opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
  341. opentrons/protocol_engine/commands/liquid_probe.py +464 -0
  342. opentrons/protocol_engine/commands/load_labware.py +210 -0
  343. opentrons/protocol_engine/commands/load_lid.py +154 -0
  344. opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
  345. opentrons/protocol_engine/commands/load_liquid.py +95 -0
  346. opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
  347. opentrons/protocol_engine/commands/load_module.py +223 -0
  348. opentrons/protocol_engine/commands/load_pipette.py +167 -0
  349. opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
  350. opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
  351. opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
  352. opentrons/protocol_engine/commands/move_labware.py +546 -0
  353. opentrons/protocol_engine/commands/move_relative.py +102 -0
  354. opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
  355. opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
  356. opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
  357. opentrons/protocol_engine/commands/move_to_well.py +119 -0
  358. opentrons/protocol_engine/commands/movement_common.py +338 -0
  359. opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
  360. opentrons/protocol_engine/commands/pipetting_common.py +443 -0
  361. opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
  362. opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
  363. opentrons/protocol_engine/commands/reload_labware.py +90 -0
  364. opentrons/protocol_engine/commands/retract_axis.py +75 -0
  365. opentrons/protocol_engine/commands/robot/__init__.py +70 -0
  366. opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
  367. opentrons/protocol_engine/commands/robot/common.py +18 -0
  368. opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
  369. opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
  370. opentrons/protocol_engine/commands/robot/move_to.py +94 -0
  371. opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
  372. opentrons/protocol_engine/commands/save_position.py +109 -0
  373. opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
  374. opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
  375. opentrons/protocol_engine/commands/set_status_bar.py +89 -0
  376. opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
  377. opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
  378. opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
  379. opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
  380. opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
  381. opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
  382. opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
  383. opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
  384. opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
  385. opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
  386. opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
  387. opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
  388. opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
  389. opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
  390. opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
  391. opentrons/protocol_engine/commands/touch_tip.py +189 -0
  392. opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
  393. opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
  394. opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
  395. opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
  396. opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
  397. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
  398. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
  399. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
  400. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
  401. opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
  402. opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
  403. opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
  404. opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
  405. opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
  406. opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
  407. opentrons/protocol_engine/create_protocol_engine.py +193 -0
  408. opentrons/protocol_engine/engine_support.py +28 -0
  409. opentrons/protocol_engine/error_recovery_policy.py +81 -0
  410. opentrons/protocol_engine/errors/__init__.py +191 -0
  411. opentrons/protocol_engine/errors/error_occurrence.py +182 -0
  412. opentrons/protocol_engine/errors/exceptions.py +1308 -0
  413. opentrons/protocol_engine/execution/__init__.py +50 -0
  414. opentrons/protocol_engine/execution/command_executor.py +216 -0
  415. opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
  416. opentrons/protocol_engine/execution/door_watcher.py +119 -0
  417. opentrons/protocol_engine/execution/equipment.py +819 -0
  418. opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
  419. opentrons/protocol_engine/execution/gantry_mover.py +686 -0
  420. opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
  421. opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
  422. opentrons/protocol_engine/execution/labware_movement.py +297 -0
  423. opentrons/protocol_engine/execution/movement.py +350 -0
  424. opentrons/protocol_engine/execution/pipetting.py +607 -0
  425. opentrons/protocol_engine/execution/queue_worker.py +86 -0
  426. opentrons/protocol_engine/execution/rail_lights.py +25 -0
  427. opentrons/protocol_engine/execution/run_control.py +33 -0
  428. opentrons/protocol_engine/execution/status_bar.py +34 -0
  429. opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
  430. opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
  431. opentrons/protocol_engine/execution/tip_handler.py +550 -0
  432. opentrons/protocol_engine/labware_offset_standardization.py +194 -0
  433. opentrons/protocol_engine/notes/__init__.py +17 -0
  434. opentrons/protocol_engine/notes/notes.py +59 -0
  435. opentrons/protocol_engine/plugins.py +104 -0
  436. opentrons/protocol_engine/protocol_engine.py +683 -0
  437. opentrons/protocol_engine/resources/__init__.py +26 -0
  438. opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
  439. opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
  440. opentrons/protocol_engine/resources/file_provider.py +161 -0
  441. opentrons/protocol_engine/resources/fixture_validation.py +68 -0
  442. opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
  443. opentrons/protocol_engine/resources/labware_validation.py +73 -0
  444. opentrons/protocol_engine/resources/model_utils.py +32 -0
  445. opentrons/protocol_engine/resources/module_data_provider.py +44 -0
  446. opentrons/protocol_engine/resources/ot3_validation.py +21 -0
  447. opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
  448. opentrons/protocol_engine/slot_standardization.py +128 -0
  449. opentrons/protocol_engine/state/__init__.py +1 -0
  450. opentrons/protocol_engine/state/_abstract_store.py +27 -0
  451. opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
  452. opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
  453. opentrons/protocol_engine/state/_move_types.py +83 -0
  454. opentrons/protocol_engine/state/_well_math.py +193 -0
  455. opentrons/protocol_engine/state/addressable_areas.py +699 -0
  456. opentrons/protocol_engine/state/command_history.py +309 -0
  457. opentrons/protocol_engine/state/commands.py +1164 -0
  458. opentrons/protocol_engine/state/config.py +39 -0
  459. opentrons/protocol_engine/state/files.py +57 -0
  460. opentrons/protocol_engine/state/fluid_stack.py +138 -0
  461. opentrons/protocol_engine/state/geometry.py +2408 -0
  462. opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
  463. opentrons/protocol_engine/state/labware.py +1432 -0
  464. opentrons/protocol_engine/state/liquid_classes.py +82 -0
  465. opentrons/protocol_engine/state/liquids.py +73 -0
  466. opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
  467. opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
  468. opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
  469. opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
  470. opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
  471. opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
  472. opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
  473. opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
  474. opentrons/protocol_engine/state/modules.py +1515 -0
  475. opentrons/protocol_engine/state/motion.py +373 -0
  476. opentrons/protocol_engine/state/pipettes.py +905 -0
  477. opentrons/protocol_engine/state/state.py +421 -0
  478. opentrons/protocol_engine/state/state_summary.py +36 -0
  479. opentrons/protocol_engine/state/tips.py +420 -0
  480. opentrons/protocol_engine/state/update_types.py +904 -0
  481. opentrons/protocol_engine/state/wells.py +290 -0
  482. opentrons/protocol_engine/types/__init__.py +310 -0
  483. opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
  484. opentrons/protocol_engine/types/command_annotations.py +53 -0
  485. opentrons/protocol_engine/types/deck_configuration.py +81 -0
  486. opentrons/protocol_engine/types/execution.py +96 -0
  487. opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
  488. opentrons/protocol_engine/types/instrument.py +47 -0
  489. opentrons/protocol_engine/types/instrument_sensors.py +47 -0
  490. opentrons/protocol_engine/types/labware.py +131 -0
  491. opentrons/protocol_engine/types/labware_movement.py +22 -0
  492. opentrons/protocol_engine/types/labware_offset_location.py +111 -0
  493. opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
  494. opentrons/protocol_engine/types/liquid.py +40 -0
  495. opentrons/protocol_engine/types/liquid_class.py +59 -0
  496. opentrons/protocol_engine/types/liquid_handling.py +13 -0
  497. opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
  498. opentrons/protocol_engine/types/location.py +194 -0
  499. opentrons/protocol_engine/types/module.py +310 -0
  500. opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
  501. opentrons/protocol_engine/types/run_time_parameters.py +133 -0
  502. opentrons/protocol_engine/types/tip.py +18 -0
  503. opentrons/protocol_engine/types/util.py +21 -0
  504. opentrons/protocol_engine/types/well_position.py +124 -0
  505. opentrons/protocol_reader/__init__.py +37 -0
  506. opentrons/protocol_reader/extract_labware_definitions.py +66 -0
  507. opentrons/protocol_reader/file_format_validator.py +152 -0
  508. opentrons/protocol_reader/file_hasher.py +27 -0
  509. opentrons/protocol_reader/file_identifier.py +284 -0
  510. opentrons/protocol_reader/file_reader_writer.py +90 -0
  511. opentrons/protocol_reader/input_file.py +16 -0
  512. opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
  513. opentrons/protocol_reader/protocol_reader.py +188 -0
  514. opentrons/protocol_reader/protocol_source.py +124 -0
  515. opentrons/protocol_reader/role_analyzer.py +86 -0
  516. opentrons/protocol_runner/__init__.py +26 -0
  517. opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
  518. opentrons/protocol_runner/json_file_reader.py +55 -0
  519. opentrons/protocol_runner/json_translator.py +314 -0
  520. opentrons/protocol_runner/legacy_command_mapper.py +852 -0
  521. opentrons/protocol_runner/legacy_context_plugin.py +116 -0
  522. opentrons/protocol_runner/protocol_runner.py +530 -0
  523. opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
  524. opentrons/protocol_runner/run_orchestrator.py +496 -0
  525. opentrons/protocol_runner/task_queue.py +95 -0
  526. opentrons/protocols/__init__.py +6 -0
  527. opentrons/protocols/advanced_control/__init__.py +0 -0
  528. opentrons/protocols/advanced_control/common.py +38 -0
  529. opentrons/protocols/advanced_control/mix.py +60 -0
  530. opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
  531. opentrons/protocols/advanced_control/transfers/common.py +180 -0
  532. opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
  533. opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
  534. opentrons/protocols/api_support/__init__.py +0 -0
  535. opentrons/protocols/api_support/constants.py +8 -0
  536. opentrons/protocols/api_support/deck_type.py +110 -0
  537. opentrons/protocols/api_support/definitions.py +18 -0
  538. opentrons/protocols/api_support/instrument.py +151 -0
  539. opentrons/protocols/api_support/labware_like.py +233 -0
  540. opentrons/protocols/api_support/tip_tracker.py +175 -0
  541. opentrons/protocols/api_support/types.py +32 -0
  542. opentrons/protocols/api_support/util.py +403 -0
  543. opentrons/protocols/bundle.py +89 -0
  544. opentrons/protocols/duration/__init__.py +4 -0
  545. opentrons/protocols/duration/errors.py +5 -0
  546. opentrons/protocols/duration/estimator.py +628 -0
  547. opentrons/protocols/execution/__init__.py +0 -0
  548. opentrons/protocols/execution/dev_types.py +181 -0
  549. opentrons/protocols/execution/errors.py +40 -0
  550. opentrons/protocols/execution/execute.py +84 -0
  551. opentrons/protocols/execution/execute_json_v3.py +275 -0
  552. opentrons/protocols/execution/execute_json_v4.py +359 -0
  553. opentrons/protocols/execution/execute_json_v5.py +28 -0
  554. opentrons/protocols/execution/execute_python.py +169 -0
  555. opentrons/protocols/execution/json_dispatchers.py +87 -0
  556. opentrons/protocols/execution/types.py +7 -0
  557. opentrons/protocols/geometry/__init__.py +0 -0
  558. opentrons/protocols/geometry/planning.py +297 -0
  559. opentrons/protocols/labware.py +312 -0
  560. opentrons/protocols/models/__init__.py +0 -0
  561. opentrons/protocols/models/json_protocol.py +679 -0
  562. opentrons/protocols/parameters/__init__.py +0 -0
  563. opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
  564. opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
  565. opentrons/protocols/parameters/exceptions.py +34 -0
  566. opentrons/protocols/parameters/parameter_definition.py +272 -0
  567. opentrons/protocols/parameters/types.py +17 -0
  568. opentrons/protocols/parameters/validation.py +267 -0
  569. opentrons/protocols/parse.py +671 -0
  570. opentrons/protocols/types.py +159 -0
  571. opentrons/py.typed +0 -0
  572. opentrons/resources/scripts/lpc21isp +0 -0
  573. opentrons/resources/smoothie-edge-8414642.hex +23010 -0
  574. opentrons/simulate.py +1065 -0
  575. opentrons/system/__init__.py +6 -0
  576. opentrons/system/camera.py +51 -0
  577. opentrons/system/log_control.py +59 -0
  578. opentrons/system/nmcli.py +856 -0
  579. opentrons/system/resin.py +24 -0
  580. opentrons/system/smoothie_update.py +15 -0
  581. opentrons/system/wifi.py +204 -0
  582. opentrons/tools/__init__.py +0 -0
  583. opentrons/tools/args_handler.py +22 -0
  584. opentrons/tools/write_pipette_memory.py +157 -0
  585. opentrons/types.py +618 -0
  586. opentrons/util/__init__.py +1 -0
  587. opentrons/util/async_helpers.py +166 -0
  588. opentrons/util/broker.py +84 -0
  589. opentrons/util/change_notifier.py +47 -0
  590. opentrons/util/entrypoint_util.py +278 -0
  591. opentrons/util/get_union_elements.py +26 -0
  592. opentrons/util/helpers.py +6 -0
  593. opentrons/util/linal.py +178 -0
  594. opentrons/util/logging_config.py +265 -0
  595. opentrons/util/logging_queue_handler.py +61 -0
  596. opentrons/util/performance_helpers.py +157 -0
  597. opentrons-8.6.0.dist-info/METADATA +37 -0
  598. opentrons-8.6.0.dist-info/RECORD +601 -0
  599. opentrons-8.6.0.dist-info/WHEEL +4 -0
  600. opentrons-8.6.0.dist-info/entry_points.txt +3 -0
  601. opentrons-8.6.0.dist-info/licenses/LICENSE +202 -0
@@ -0,0 +1,871 @@
1
+ import json
2
+ import logging
3
+ import os
4
+ import sys
5
+ from functools import lru_cache
6
+ from typing import (
7
+ TYPE_CHECKING,
8
+ Any,
9
+ Dict,
10
+ Mapping,
11
+ Tuple,
12
+ Union,
13
+ Optional,
14
+ NamedTuple,
15
+ cast,
16
+ List,
17
+ )
18
+
19
+ from opentrons.config import CONFIG
20
+ from opentrons_shared_data.robot.types import RobotTypeEnum
21
+
22
+ if TYPE_CHECKING:
23
+ from pathlib import Path
24
+
25
+ log = logging.getLogger(__name__)
26
+
27
+
28
+ SettingsMap = Dict[str, Optional[bool]]
29
+
30
+
31
+ class SettingException(Exception):
32
+ def __init__(self, message: str, error: str) -> None:
33
+ super(Exception, self).__init__(message)
34
+ self.error = error
35
+
36
+
37
+ class SettingsData(NamedTuple):
38
+ settings_map: SettingsMap
39
+ version: int
40
+
41
+
42
+ class SettingDefinition:
43
+ def __init__(
44
+ self,
45
+ _id: str,
46
+ title: str,
47
+ description: str,
48
+ robot_type: List[RobotTypeEnum],
49
+ old_id: Optional[str] = None,
50
+ restart_required: bool = False,
51
+ show_if: Optional[Tuple[str, bool]] = None,
52
+ internal_only: bool = False,
53
+ default_true_on_robot_types: Optional[List[RobotTypeEnum]] = None,
54
+ ):
55
+ self.id = _id
56
+ #: The id of the setting for programmatic access through
57
+ #: get_adv_setting
58
+ self.old_id = old_id
59
+ #: the old id before migration, if any
60
+ self.title = title
61
+ #: User facing title
62
+ self.description = description
63
+ #: User facing description
64
+ self.restart_required = restart_required
65
+ #: True if the user must restart
66
+ self.show_if = show_if
67
+ #: A tuple of (other setting id, setting value) that must match reality
68
+ #: to show this setting in http endpoints
69
+ self.robot_type = robot_type
70
+ #: A list of RobotTypeEnums that are compatible with this feature flag.
71
+ self.internal_only = internal_only
72
+ #: A flag determining whether this setting is user-facing.
73
+ self.default_true_on_robot_types = default_true_on_robot_types or []
74
+ #: Robot types for which null/unset means the setting is activated
75
+
76
+ def __repr__(self) -> str:
77
+ return "{}: {}".format(self.__class__, self.id)
78
+
79
+ def should_show(self) -> bool:
80
+ """
81
+ Use show_if attribute to determine if setting should be presented
82
+ to users
83
+ """
84
+ if not self.show_if:
85
+ return True
86
+ return (
87
+ get_setting_with_env_overload(self.show_if[0], self.robot_type[0])
88
+ == self.show_if[1]
89
+ )
90
+
91
+ async def on_change(self, value: Optional[bool]) -> None:
92
+ """
93
+ An opportunity for side effects as a result of change a setting
94
+ value
95
+ """
96
+ if self.restart_required:
97
+ set_restart_required()
98
+
99
+
100
+ class Setting(NamedTuple):
101
+ value: Optional[bool]
102
+ definition: SettingDefinition
103
+
104
+
105
+ # If you add or remove any settings here BE SURE TO ADD A MIGRATION below.
106
+ # You will also need to update the migration tests in:
107
+ # api/tests/opentrons/config/test_advanced_settings_migration.py
108
+ settings = [
109
+ SettingDefinition(
110
+ _id="shortFixedTrash",
111
+ old_id="short-fixed-trash",
112
+ title="Short (55mm) fixed trash",
113
+ description="Trash box is 55mm tall (rather than the 77mm default)",
114
+ robot_type=[RobotTypeEnum.OT2],
115
+ ),
116
+ SettingDefinition(
117
+ _id="deckCalibrationDots",
118
+ old_id="dots-deck-type",
119
+ title="Deck calibration to dots",
120
+ description="Perform deck calibration to dots rather than crosses, for"
121
+ " robots that do not have crosses etched on the deck",
122
+ robot_type=[RobotTypeEnum.OT2],
123
+ ),
124
+ SettingDefinition(
125
+ _id="disableHomeOnBoot",
126
+ old_id="disable-home-on-boot",
127
+ title="Disable home on boot",
128
+ description="Prevent robot from homing motors on boot",
129
+ robot_type=[RobotTypeEnum.OT2, RobotTypeEnum.FLEX],
130
+ ),
131
+ SettingDefinition(
132
+ _id="useOldAspirationFunctions",
133
+ title="Use older aspirate behavior",
134
+ description="Aspirate with the less accurate volumetric calibrations"
135
+ " that were used before version 3.7.0. Use this if you"
136
+ " need consistency with pre-v3.7.0 results. This only"
137
+ " affects GEN1 P10S, P10M, P50S, P50M, and P300S pipettes.",
138
+ robot_type=[RobotTypeEnum.OT2],
139
+ ),
140
+ SettingDefinition(
141
+ _id="enableDoorSafetySwitch",
142
+ title="Enable robot door safety switch",
143
+ description="Automatically pause protocols when robot door opens. "
144
+ "Opening the robot door during a run will "
145
+ "pause your robot only after it has completed its "
146
+ "current motion.",
147
+ robot_type=[RobotTypeEnum.OT2],
148
+ default_true_on_robot_types=[RobotTypeEnum.FLEX],
149
+ ),
150
+ SettingDefinition(
151
+ _id="enableOT3HardwareController",
152
+ title="Enable experimental OT-3 hardware controller",
153
+ description=(
154
+ "Do not enable. This is an Opentrons-internal setting to test "
155
+ "new hardware."
156
+ ),
157
+ restart_required=True,
158
+ robot_type=[RobotTypeEnum.FLEX],
159
+ internal_only=True,
160
+ ),
161
+ SettingDefinition(
162
+ _id="rearPanelIntegration",
163
+ title="Enable robots with the new usb connected rear-panel board.",
164
+ description="This is an Opentrons-internal setting to test new rear-panel.",
165
+ robot_type=[RobotTypeEnum.FLEX],
166
+ internal_only=True,
167
+ ),
168
+ SettingDefinition(
169
+ _id="disableStallDetection",
170
+ title="Disable stall detection on the Flex.",
171
+ description="This is an Opentrons-internal setting for hardware-testing.",
172
+ robot_type=[RobotTypeEnum.FLEX],
173
+ ),
174
+ SettingDefinition(
175
+ _id="disableStatusBar",
176
+ title="Disable the LED status bar on the Flex.",
177
+ description="This setting disables the LED status bar on the Flex.",
178
+ robot_type=[RobotTypeEnum.FLEX],
179
+ ),
180
+ SettingDefinition(
181
+ _id="estopNotRequired",
182
+ title="If enabled, the Flex gantry can move with no estop attached.",
183
+ description="This setting allows the gantry on the Flex to move with no estop attached.",
184
+ show_if=(
185
+ "estopNotRequired",
186
+ True,
187
+ ), # Configured so this only shows if it has been set by a user
188
+ robot_type=[RobotTypeEnum.FLEX],
189
+ internal_only=True,
190
+ ),
191
+ SettingDefinition(
192
+ _id="disableOverpressureDetection",
193
+ title="Disable Flex pipette pressure sensing.",
194
+ description="When this setting is on, Flex will continue its activities regardless of pressure changes inside the pipette. Do not turn this setting on unless you are intentionally causing pressures over 8 kPa inside the pipette air channel.",
195
+ robot_type=[RobotTypeEnum.FLEX],
196
+ ),
197
+ SettingDefinition(
198
+ _id="enableErrorRecoveryExperiments",
199
+ title="Enable error recovery experiments",
200
+ description=(
201
+ "Do not enable."
202
+ " This is an Opentrons internal setting to enable additional,"
203
+ " in-development error recovery features."
204
+ ),
205
+ robot_type=[RobotTypeEnum.FLEX],
206
+ internal_only=True,
207
+ ),
208
+ SettingDefinition(
209
+ _id="enableOEMMode",
210
+ title="Enable OEM Mode",
211
+ description="This setting anonymizes Opentrons branding in the ODD app.",
212
+ robot_type=[RobotTypeEnum.FLEX],
213
+ ),
214
+ SettingDefinition(
215
+ _id="enablePerformanceMetrics",
216
+ title="Enable performance metrics",
217
+ description=(
218
+ "Do not enable."
219
+ " This is an Opentrons internal setting to collect performance metrics."
220
+ " Do not turn this on unless you are playing with the performance metrics system."
221
+ ),
222
+ robot_type=[RobotTypeEnum.OT2, RobotTypeEnum.FLEX],
223
+ internal_only=True,
224
+ ),
225
+ SettingDefinition(
226
+ _id="disableFlexStackerLabwareDetection",
227
+ title="Disable Flex Stacker's labware detection features",
228
+ description=(
229
+ "Flex Stackers will ignore labware's presence in the hopper and on the shuttle. Protocol runs will no longer raise the following recoverable errors: Hopper Empty, Shuttle Empty and Shuttle Occupied."
230
+ ),
231
+ robot_type=[RobotTypeEnum.FLEX],
232
+ ),
233
+ ]
234
+
235
+
236
+ settings_by_id: Dict[str, SettingDefinition] = {s.id: s for s in settings}
237
+ settings_by_old_id: Dict[str, SettingDefinition] = {
238
+ s.old_id: s for s in settings if s.old_id
239
+ }
240
+
241
+
242
+ def get_setting_definition(setting_id: str) -> Optional[SettingDefinition]:
243
+ clean = _clean_id(setting_id)
244
+ for setting in settings:
245
+ if setting.id == clean:
246
+ return setting
247
+ return None
248
+
249
+
250
+ def get_adv_setting(setting: str, robot_type: RobotTypeEnum) -> Optional[Setting]:
251
+ setting = _clean_id(setting)
252
+ s = get_all_adv_settings(robot_type, include_internal=True)
253
+ return s.get(setting, None)
254
+
255
+
256
+ def _filtered_key(
257
+ definition: SettingDefinition,
258
+ robot_type: RobotTypeEnum,
259
+ include_internal: bool,
260
+ ) -> bool:
261
+ if include_internal:
262
+ return robot_type in definition.robot_type
263
+ else:
264
+ return robot_type in definition.robot_type and not definition.internal_only
265
+
266
+
267
+ @lru_cache(maxsize=1)
268
+ def get_all_adv_settings(
269
+ robot_type: RobotTypeEnum, include_internal: bool = False
270
+ ) -> Dict[str, Setting]:
271
+ """Get all the advanced setting values and definitions"""
272
+ settings_file = CONFIG["feature_flags_file"]
273
+
274
+ values, _ = _read_settings_file(settings_file)
275
+
276
+ return {
277
+ key: Setting(value=value, definition=settings_by_id[key])
278
+ for key, value in values.items()
279
+ if key in settings_by_id
280
+ and _filtered_key(settings_by_id[key], robot_type, include_internal)
281
+ }
282
+
283
+
284
+ async def set_adv_setting(_id: str, value: Optional[bool]) -> None:
285
+ _id = _clean_id(_id)
286
+ settings_file = CONFIG["feature_flags_file"]
287
+ setting_data = _read_settings_file(settings_file)
288
+ if _id not in setting_data.settings_map:
289
+ raise ValueError(f"{_id} is not recognized")
290
+ # Side effecting
291
+ await settings_by_id[_id].on_change(value)
292
+
293
+ setting_data.settings_map[_id] = value
294
+ _write_settings_file(setting_data.settings_map, setting_data.version, settings_file)
295
+ # Clear the lru cache
296
+ get_all_adv_settings.cache_clear()
297
+
298
+
299
+ def _clean_id(_id: str) -> str:
300
+ if _id in settings_by_old_id.keys():
301
+ _id = settings_by_old_id[_id].id
302
+ return _id
303
+
304
+
305
+ def _read_json_file(path: Union[str, "Path"]) -> Dict[str, Any]:
306
+ try:
307
+ with open(path, "r") as fd:
308
+ data = json.load(fd)
309
+ except FileNotFoundError:
310
+ data = {}
311
+ except json.JSONDecodeError as e:
312
+ sys.stderr.write(f"Could not load advanced settings file {path}: {e}\n")
313
+ data = {}
314
+ return cast(Dict[str, Any], data)
315
+
316
+
317
+ def _read_settings_file(settings_file: "Path") -> SettingsData:
318
+ """
319
+ Read the settings file, which is a json object with settings IDs as keys
320
+ and boolean values. For each key, look up the `Settings` object with that
321
+ key. If the key is one of the old IDs (kebab case), replace it with the
322
+ new ID and rewrite the settings file
323
+
324
+ :param settings_file: the path to the settings file
325
+ :return: a dict with all new settings IDs as the keys, and boolean values
326
+ (the values stored in the settings file, or `False` if the key was not
327
+ found). Along with the version.
328
+ """
329
+ # Read settings from persistent file
330
+ data = _read_json_file(settings_file)
331
+ settings, version = _migrate(data)
332
+ settings = _ensure(settings)
333
+
334
+ if data.get("_version") != version:
335
+ _write_settings_file(settings, version, settings_file)
336
+
337
+ return SettingsData(settings_map=settings, version=version)
338
+
339
+
340
+ def _write_settings_file(
341
+ data: Mapping[str, Any],
342
+ version: int,
343
+ settings_file: "Path",
344
+ ) -> None:
345
+ try:
346
+ with settings_file.open("w") as fd:
347
+ json.dump({**data, "_version": version}, fd)
348
+ fd.flush()
349
+ os.fsync(fd.fileno())
350
+ except OSError:
351
+ log.exception(f"Failed to write advanced settings file to {settings_file}")
352
+
353
+
354
+ def _migrate0to1(previous: Mapping[str, Any]) -> SettingsMap:
355
+ """
356
+ Migrate to version 1 of the feature flags file. Replaces old IDs with new
357
+ IDs and sets any False values to None
358
+ """
359
+ next: SettingsMap = {}
360
+
361
+ for s in settings:
362
+ id = s.id
363
+ old_id = s.old_id
364
+
365
+ if previous.get(id) is True:
366
+ next[id] = True
367
+ elif old_id and previous.get(old_id) is True:
368
+ next[id] = True
369
+ else:
370
+ next[id] = None
371
+
372
+ return next
373
+
374
+
375
+ def _migrate1to2(previous: SettingsMap) -> SettingsMap:
376
+ """
377
+ Migration to version 2 of the feature flags file. Adds the
378
+ disableLogAggregation config element.
379
+ """
380
+ newmap = {k: v for k, v in previous.items()}
381
+ newmap["disableLogAggregation"] = None
382
+ return newmap
383
+
384
+
385
+ def _migrate2to3(previous: SettingsMap) -> SettingsMap:
386
+ """
387
+ Migration to version 3 of the feature flags file. Adds the
388
+ enableApi1BackCompat config element.
389
+ """
390
+ newmap = {k: v for k, v in previous.items()}
391
+ newmap["enableApi1BackCompat"] = None
392
+ newmap["useProtocolApi2"] = None
393
+ return newmap
394
+
395
+
396
+ def _migrate3to4(previous: SettingsMap) -> SettingsMap:
397
+ """
398
+ Migration to version 4 of the feature flags file. Adds the
399
+ useV1HttpApi config element.
400
+ """
401
+ newmap = {k: v for k, v in previous.items()}
402
+ newmap["useV1HttpApi"] = None
403
+ return newmap
404
+
405
+
406
+ def _migrate4to5(previous: SettingsMap) -> SettingsMap:
407
+ """
408
+ Migration to version 5 of the feature flags file. Adds the
409
+ enableDoorSafetyFeature config element.
410
+ """
411
+ newmap = {k: v for k, v in previous.items()}
412
+ newmap["enableDoorSafetySwitch"] = None
413
+ return newmap
414
+
415
+
416
+ def _migrate5to6(previous: SettingsMap) -> SettingsMap:
417
+ """
418
+ Migration to version 6 of the feature flags file. Adds the
419
+ enableTipLengthCalibration config element.
420
+ """
421
+ newmap = {k: v for k, v in previous.items()}
422
+ newmap["enableTipLengthCalibration"] = None
423
+ return newmap
424
+
425
+
426
+ def _migrate6to7(previous: SettingsMap) -> SettingsMap:
427
+ """
428
+ Migration to version 7 of the feature flags file. Adds the
429
+ enableHttpProtocolSessions config element.
430
+ """
431
+ newmap = {k: v for k, v in previous.items()}
432
+ newmap["enableHttpProtocolSessions"] = None
433
+ return newmap
434
+
435
+
436
+ def _migrate7to8(previous: SettingsMap) -> SettingsMap:
437
+ """
438
+ Migration to version 8 of the feature flags file. Adds the
439
+ enableFastProtocolUpload config element.
440
+ """
441
+ newmap = {k: v for k, v in previous.items()}
442
+ newmap["enableFastProtocolUpload"] = None
443
+ return newmap
444
+
445
+
446
+ def _migrate8to9(previous: SettingsMap) -> SettingsMap:
447
+ """Migrate to version 9 of the feature flags file.
448
+
449
+ - Adds the enableProtocolEngine config element.
450
+ """
451
+ newmap = {k: v for k, v in previous.items()}
452
+ newmap["enableProtocolEngine"] = None
453
+ return newmap
454
+
455
+
456
+ def _migrate9to10(previous: SettingsMap) -> SettingsMap:
457
+ """Migrate to version 10 of the feature flags file.
458
+
459
+ - Removes deprecated useProtocolApi2 option
460
+ - Removes deprecated enableApi1BackCompat option
461
+ - Removed deprecated useV1HttpApi option
462
+ - Removes deprecated enableTipLengthCalibration option
463
+ - Removes deprecated enableFastProtocolUpload option
464
+ - Adds disableFastProtocolUpload option
465
+ """
466
+ removals = [
467
+ "useProtocolApi2",
468
+ "enableApi1BackCompat",
469
+ "useV1HttpApi",
470
+ "enableTipLengthCalibration",
471
+ "enableFastProtocolUpload",
472
+ ]
473
+ newmap = {k: v for k, v in previous.items() if k not in removals}
474
+ newmap["disableFastProtocolUpload"] = None
475
+ return newmap
476
+
477
+
478
+ def _migrate10to11(previous: SettingsMap) -> SettingsMap:
479
+ """Migrate to version 11 of the feature flags file.
480
+
481
+ - Removes deprecated enableProtocolEngine option
482
+ """
483
+ removals = ["enableProtocolEngine"]
484
+ newmap = {k: v for k, v in previous.items() if k not in removals}
485
+ return newmap
486
+
487
+
488
+ def _migrate11to12(previous: SettingsMap) -> SettingsMap:
489
+ """Migrate to version 12 of the feature flags file.
490
+
491
+ - Adds the enableOT3HardwareController config element.
492
+ """
493
+ newmap = {k: v for k, v in previous.items()}
494
+ newmap["enableOT3HardwareController"] = None
495
+ return newmap
496
+
497
+
498
+ def _migrate12to13(previous: SettingsMap) -> SettingsMap:
499
+ """Migrate to version 13 of the feature flags file.
500
+
501
+ - Removes deprecated calibrateToBottom option
502
+ """
503
+ removals = ["calibrateToBottom"]
504
+ newmap = {k: v for k, v in previous.items() if k not in removals}
505
+ return newmap
506
+
507
+
508
+ def _migrate13to14(previous: SettingsMap) -> SettingsMap:
509
+ """Migrate to version 14 of the feature flags file.
510
+
511
+ - Removes deprecated enableHttpProtocolSessions option
512
+ """
513
+ removals = ["enableHttpProtocolSessions"]
514
+ newmap = {k: v for k, v in previous.items() if k not in removals}
515
+ return newmap
516
+
517
+
518
+ def _migrate14to15(previous: SettingsMap) -> SettingsMap:
519
+ """Migrate to version 15 of the feature flags file.
520
+
521
+ - adds enableHeaterShakerPAPI option
522
+ """
523
+ newmap = {k: v for k, v in previous.items()}
524
+ newmap["enableHeaterShakerPAPI"] = None
525
+ return newmap
526
+
527
+
528
+ def _migrate15to16(previous: SettingsMap) -> SettingsMap:
529
+ """Migrate to version 16 of the feature flags file.
530
+
531
+ - Removes deprecated enableHeaterShakerPAPI option
532
+ """
533
+ removals = ["enableHeaterShakerPAPI"]
534
+ newmap = {k: v for k, v in previous.items() if k not in removals}
535
+ return newmap
536
+
537
+
538
+ def _migrate16to17(previous: SettingsMap) -> SettingsMap:
539
+ """Migrate to version 17 of the advanced settings file.
540
+
541
+ - Adds enableProtocolEnginePAPICore option
542
+ """
543
+ newmap = {k: v for k, v in previous.items()}
544
+ newmap["enableProtocolEnginePAPICore"] = None
545
+ return newmap
546
+
547
+
548
+ def _migrate17to18(previous: SettingsMap) -> SettingsMap:
549
+ """Migrate to version 18 of the advanced settings file.
550
+
551
+ - Adds enableLoadLiquid option
552
+ """
553
+ newmap = {k: v for k, v in previous.items()}
554
+ newmap["enableLoadLiquid"] = None
555
+ return newmap
556
+
557
+
558
+ def _migrate18to19(previous: SettingsMap) -> SettingsMap:
559
+ """Migrate to version 19 of the feature flags file.
560
+
561
+ - Removes deprecated enableLoadLiquid option
562
+ """
563
+ removals = ["enableLoadLiquid"]
564
+ newmap = {k: v for k, v in previous.items() if k not in removals}
565
+ return newmap
566
+
567
+
568
+ def _migrate19to20(previous: SettingsMap) -> SettingsMap:
569
+ """Migrate to version 20 of the feature flags file.
570
+
571
+ - Adds the enableOT3FirmwareUpdates config element.
572
+ """
573
+ newmap = {k: v for k, v in previous.items()}
574
+ newmap["enableOT3FirmwareUpdates"] = None
575
+ return newmap
576
+
577
+
578
+ def _migrate20to21(previous: SettingsMap) -> SettingsMap:
579
+ """Migrate to version 21 of the feature flags file.
580
+
581
+ - Removes deprecated enableProtocolEnginePAPICore option
582
+ """
583
+ removals = ["enableProtocolEnginePAPICore"]
584
+ newmap = {k: v for k, v in previous.items() if k not in removals}
585
+ return newmap
586
+
587
+
588
+ def _migrate21to22(previous: SettingsMap) -> SettingsMap:
589
+ """Migrate to version 22 of the feature flags file.
590
+
591
+ - Removes deprecated enableOT3FirmwareUpdates option
592
+ """
593
+ removals = ["enableOT3FirmwareUpdates"]
594
+ newmap = {k: v for k, v in previous.items() if k not in removals}
595
+ return newmap
596
+
597
+
598
+ def _migrate22to23(previous: SettingsMap) -> SettingsMap:
599
+ """Migrate to version 23 of the feature flags file.
600
+
601
+ - Adds the rearPanelIntegration config element.
602
+ """
603
+ newmap = {k: v for k, v in previous.items()}
604
+ newmap["rearPanelIntegration"] = None
605
+ return newmap
606
+
607
+
608
+ def _migrate23to24(previous: SettingsMap) -> SettingsMap:
609
+ """Migrate to version 24 of the feature flags file.
610
+
611
+ - flips the rearPanelIntegration config element default to true.
612
+ """
613
+ newmap = {k: v for k, v in previous.items()}
614
+ newmap["rearPanelIntegration"] = True
615
+ return newmap
616
+
617
+
618
+ def _migrate24to25(previous: SettingsMap) -> SettingsMap:
619
+ """Migrate to version 25 of the feature flags file.
620
+
621
+ - Adds the disableStallDetection config element.
622
+ """
623
+ newmap = {k: v for k, v in previous.items()}
624
+ newmap["disableStallDetection"] = None
625
+ return newmap
626
+
627
+
628
+ def _migrate25to26(previous: SettingsMap) -> SettingsMap:
629
+ """Migrate to version 26 of the feature flags file.
630
+
631
+ - Adds the disableStatusBar config element.
632
+ """
633
+ newmap = {k: v for k, v in previous.items()}
634
+ newmap["disableStatusBar"] = None
635
+ return newmap
636
+
637
+
638
+ def _migrate26to27(previous: SettingsMap) -> SettingsMap:
639
+ """Migrate to version 27 of the feature flags file.
640
+
641
+ - Adds the disableOverpressureDetection config element.
642
+ """
643
+ newmap = {k: v for k, v in previous.items()}
644
+ newmap["disableOverpressureDetection"] = None
645
+ return newmap
646
+
647
+
648
+ def _migrate27to28(previous: SettingsMap) -> SettingsMap:
649
+ """Migrate to version 28 of the feature flags file.
650
+
651
+ - Adds the disableTipPresenceDetection config element.
652
+ """
653
+ newmap = {k: v for k, v in previous.items()}
654
+ newmap["disableTipPresenceDetection"] = None
655
+ return newmap
656
+
657
+
658
+ def _migrate28to29(previous: SettingsMap) -> SettingsMap:
659
+ """Migrate to version 29 of the feature flags file.
660
+
661
+ - Adds the estopNotRequired config element.
662
+ """
663
+ newmap = {k: v for k, v in previous.items()}
664
+ newmap["estopNotRequired"] = None
665
+ return newmap
666
+
667
+
668
+ def _migrate29to30(previous: SettingsMap) -> SettingsMap:
669
+ """Migrate to version 30 of the feature flags file.
670
+
671
+ - Removes the disableTipPresenceDetection flag.
672
+ """
673
+ return {k: v for k, v in previous.items() if "disableTipPresenceDetection" != k}
674
+
675
+
676
+ def _migrate30to31(previous: SettingsMap) -> SettingsMap:
677
+ """Migrate to version 31 of the feature flags file.
678
+
679
+ - Adds the enableErrorRecoveryExperiments config element.
680
+ """
681
+ newmap = {k: v for k, v in previous.items()}
682
+ newmap["enableErrorRecoveryExperiments"] = None
683
+ return newmap
684
+
685
+
686
+ def _migrate31to32(previous: SettingsMap) -> SettingsMap:
687
+ """Migrate to version 32 of the feature flags file.
688
+
689
+ - Adds the enableOEMMode config element.
690
+ """
691
+ newmap = {k: v for k, v in previous.items()}
692
+ newmap["enableOEMMode"] = None
693
+ return newmap
694
+
695
+
696
+ def _migrate32to33(previous: SettingsMap) -> SettingsMap:
697
+ """Migrate to version 33 of the feature flags file.
698
+
699
+ - Adds the enablePerformanceMetrics config element.
700
+ """
701
+ newmap = {k: v for k, v in previous.items()}
702
+ newmap["enablePerformanceMetrics"] = None
703
+ return newmap
704
+
705
+
706
+ def _migrate33to34(previous: SettingsMap) -> SettingsMap:
707
+ """Migrate to version 34 of the feature flags file.
708
+
709
+ - Removes disableFastProtocolUpload
710
+ """
711
+ removals = ["disableFastProtocolUpload"]
712
+ newmap = {k: v for k, v in previous.items() if k not in removals}
713
+ return newmap
714
+
715
+
716
+ def _migrate34to35(previous: SettingsMap) -> SettingsMap:
717
+ """Migrate to version 35 of the feature flags file.
718
+
719
+ - Removes disableLogAggregation
720
+ """
721
+ removals = ["disableLogAggregation"]
722
+ newmap = {k: v for k, v in previous.items() if k not in removals}
723
+ return newmap
724
+
725
+
726
+ def _migrate35to36(previous: SettingsMap) -> SettingsMap:
727
+ """Migrate to version 36 of the feature flags file.
728
+
729
+ - Adds the allowLiquidClasses config element.
730
+ """
731
+ newmap = {k: v for k, v in previous.items()}
732
+ newmap["allowLiquidClasses"] = None
733
+ return newmap
734
+
735
+
736
+ def _migrate36to37(previous: SettingsMap) -> SettingsMap:
737
+ """Migrate to version 37 of the feature flags file.
738
+
739
+ - Removes the allowLiquidClasses flag.
740
+ """
741
+ return {k: v for k, v in previous.items() if "allowLiquidClasses" != k}
742
+
743
+
744
+ def _migrate37to38(previous: SettingsMap) -> SettingsMap:
745
+ """Migrate to version 36 of the feature flags file.
746
+
747
+ - Adds the disableFlexStackerLabwareDetection config element.
748
+ """
749
+ newmap = {k: v for k, v in previous.items()}
750
+ newmap["disableFlexStackerLabwareDetection"] = None
751
+ return newmap
752
+
753
+
754
+ _MIGRATIONS = [
755
+ _migrate0to1,
756
+ _migrate1to2,
757
+ _migrate2to3,
758
+ _migrate3to4,
759
+ _migrate4to5,
760
+ _migrate5to6,
761
+ _migrate6to7,
762
+ _migrate7to8,
763
+ _migrate8to9,
764
+ _migrate9to10,
765
+ _migrate10to11,
766
+ _migrate11to12,
767
+ _migrate12to13,
768
+ _migrate13to14,
769
+ _migrate14to15,
770
+ _migrate15to16,
771
+ _migrate16to17,
772
+ _migrate17to18,
773
+ _migrate18to19,
774
+ _migrate19to20,
775
+ _migrate20to21,
776
+ _migrate21to22,
777
+ _migrate22to23,
778
+ _migrate23to24,
779
+ _migrate24to25,
780
+ _migrate25to26,
781
+ _migrate26to27,
782
+ _migrate27to28,
783
+ _migrate28to29,
784
+ _migrate29to30,
785
+ _migrate30to31,
786
+ _migrate31to32,
787
+ _migrate32to33,
788
+ _migrate33to34,
789
+ _migrate34to35,
790
+ _migrate35to36,
791
+ _migrate36to37,
792
+ _migrate37to38,
793
+ ]
794
+ """
795
+ List of all migrations to apply, indexed by (version - 1). See _migrate below
796
+ for how the migration functions are applied. Each migration function should
797
+ return a new dictionary (rather than modify their input)
798
+ """
799
+
800
+
801
+ def _migrate(data: Mapping[str, Any]) -> SettingsData:
802
+ """
803
+ Check the version integer of the JSON file data a run any necessary
804
+ migrations to get us to the latest file format. Returns dictionary of
805
+ settings and version migrated to
806
+ """
807
+ next = dict(data)
808
+ version = next.pop("_version", 0)
809
+ target_version = len(_MIGRATIONS)
810
+ migrations = _MIGRATIONS[version:]
811
+
812
+ if len(migrations) > 0:
813
+ log.info(
814
+ "Migrating advanced settings from version {} to {}".format(
815
+ version, target_version
816
+ )
817
+ )
818
+
819
+ for m in migrations:
820
+ next = m(next)
821
+
822
+ return SettingsData(settings_map=next, version=target_version)
823
+
824
+
825
+ def _ensure(data: Mapping[str, Any]) -> SettingsMap:
826
+ """Ensure config data is valid, regardless of version.
827
+
828
+ Even after migration, we may have an invalid file. For instance,
829
+ the user may have _downgraded_. Make sure all required keys are present,
830
+ regardless of config version.
831
+ """
832
+ newdata = {k: v for k, v in data.items()}
833
+ for s in settings:
834
+ if s.id not in newdata:
835
+ newdata[s.id] = None
836
+ return newdata
837
+
838
+
839
+ def get_setting_with_env_overload(setting_name: str, robot_type: RobotTypeEnum) -> bool:
840
+ env_name = "OT_API_FF_" + setting_name
841
+ defn = get_setting_definition(setting_name)
842
+ if env_name in os.environ:
843
+ return os.environ[env_name].lower() in {"1", "true", "on"}
844
+ else:
845
+ s = get_adv_setting(setting_name, robot_type)
846
+ if s is not None:
847
+ return s.value is True
848
+ if defn is None:
849
+ return False
850
+ if robot_type in defn.default_true_on_robot_types:
851
+ return True
852
+ return False
853
+
854
+
855
+ _SETTINGS_RESTART_REQUIRED = False
856
+ # This is a bit of global state that indicates whether a setting has changed
857
+ # that requires a restart. It's OK for this to be global because the behavior
858
+ # it's catching is global - changing the kind of setting that requires a
859
+ # a restart anywhere, even if you theoretically have two servers running in
860
+ # the same process, will require _all_ of them to be restarted.
861
+
862
+
863
+ def is_restart_required() -> bool:
864
+ return _SETTINGS_RESTART_REQUIRED
865
+
866
+
867
+ def set_restart_required() -> bool:
868
+ """Set the restart required flag."""
869
+ global _SETTINGS_RESTART_REQUIRED
870
+ _SETTINGS_RESTART_REQUIRED = True
871
+ return _SETTINGS_RESTART_REQUIRED