Skip to content

Commit 804ef14

Browse files
authored
Small refactor to use ByTipTypeSetting/TransferProperties as the classes to encapsulate liquid class properties in PAPI/PE. (#16689)
# Overview Followup to AUTH-835 / AUTH-837. We want a nice class to bundle together `AspirateProperties`/`SingleDispenseProperties`/`MultiDispenseProperties` plus any potential future liquid class properties. For Pydantic, we already have the the `ByTipTypeSetting` model that encapsulates all the liquid class properties, so let's use that. The upcoming `loadLiquidClass()` implementation will take a `ByTipTypeSetting` as part of its parameter. For the Python dataclass, we already have `TransferProperties`, so we'll continue to use that for the Python API. This is a small refactoring change that: - Moves `TransferProperties` to live with its friends in _liquid_properties.py, which contains the definitions of the other liquid class property classes. - Implements a `build_transfer_properties()` to turn a Pydantic `ByTipTypeSetting` into a dataclass `TransferProperties`, in the same way the other `build_*` functions turn the Pydantic object into its corresponding dataclass object. ## Test Plan and Hands on Testing I ran `make test` to run all the tests under `api/`. ## Review requests This is my first time making a change to our code! Please let me know if I'm missing anything. ## Risk assessment My understanding is that liquid classes is not finished and not in production at all, so any impact should be limited to our internal dev and testing.
1 parent 5973646 commit 804ef14

File tree

2 files changed

+40
-37
lines changed

2 files changed

+40
-37
lines changed

api/src/opentrons/protocol_api/_liquid.py

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,8 @@
88
)
99

1010
from ._liquid_properties import (
11-
AspirateProperties,
12-
SingleDispenseProperties,
13-
MultiDispenseProperties,
14-
build_aspirate_properties,
15-
build_single_dispense_properties,
16-
build_multi_dispense_properties,
11+
TransferProperties,
12+
build_transfer_properties,
1713
)
1814

1915

@@ -35,30 +31,6 @@ class Liquid:
3531
display_color: Optional[str]
3632

3733

38-
# TODO (spp, 2024-10-17): create PAPI-equivalent types for all the properties
39-
# and have validation on value updates with user-facing error messages
40-
@dataclass
41-
class TransferProperties:
42-
_aspirate: AspirateProperties
43-
_dispense: SingleDispenseProperties
44-
_multi_dispense: Optional[MultiDispenseProperties]
45-
46-
@property
47-
def aspirate(self) -> AspirateProperties:
48-
"""Aspirate properties."""
49-
return self._aspirate
50-
51-
@property
52-
def dispense(self) -> SingleDispenseProperties:
53-
"""Single dispense properties."""
54-
return self._dispense
55-
56-
@property
57-
def multi_dispense(self) -> Optional[MultiDispenseProperties]:
58-
"""Multi dispense properties."""
59-
return self._multi_dispense
60-
61-
6234
@dataclass
6335
class LiquidClass:
6436
"""A data class that contains properties of a specific class of liquids."""
@@ -75,13 +47,7 @@ def create(cls, liquid_class_definition: LiquidClassSchemaV1) -> "LiquidClass":
7547
for by_pipette in liquid_class_definition.byPipette:
7648
tip_settings: Dict[str, TransferProperties] = {}
7749
for tip_type in by_pipette.byTipType:
78-
tip_settings[tip_type.tiprack] = TransferProperties(
79-
_aspirate=build_aspirate_properties(tip_type.aspirate),
80-
_dispense=build_single_dispense_properties(tip_type.singleDispense),
81-
_multi_dispense=build_multi_dispense_properties(
82-
tip_type.multiDispense
83-
),
84-
)
50+
tip_settings[tip_type.tiprack] = build_transfer_properties(tip_type)
8551
by_pipette_settings[by_pipette.pipetteModel] = tip_settings
8652

8753
return cls(

api/src/opentrons/protocol_api/_liquid_properties.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
TouchTipProperties as SharedDataTouchTipProperties,
1010
MixProperties as SharedDataMixProperties,
1111
BlowoutProperties as SharedDataBlowoutProperties,
12+
ByTipTypeSetting as SharedByTipTypeSetting,
1213
Submerge as SharedDataSubmerge,
1314
RetractAspirate as SharedDataRetractAspirate,
1415
RetractDispense as SharedDataRetractDispense,
@@ -361,6 +362,30 @@ def disposal_by_volume(self) -> LiquidHandlingPropertyByVolume:
361362
return self._disposal_by_volume
362363

363364

365+
# TODO (spp, 2024-10-17): create PAPI-equivalent types for all the properties
366+
# and have validation on value updates with user-facing error messages
367+
@dataclass
368+
class TransferProperties:
369+
_aspirate: AspirateProperties
370+
_dispense: SingleDispenseProperties
371+
_multi_dispense: Optional[MultiDispenseProperties]
372+
373+
@property
374+
def aspirate(self) -> AspirateProperties:
375+
"""Aspirate properties."""
376+
return self._aspirate
377+
378+
@property
379+
def dispense(self) -> SingleDispenseProperties:
380+
"""Single dispense properties."""
381+
return self._dispense
382+
383+
@property
384+
def multi_dispense(self) -> Optional[MultiDispenseProperties]:
385+
"""Multi dispense properties."""
386+
return self._multi_dispense
387+
388+
364389
def _build_delay_properties(
365390
delay_properties: SharedDataDelayProperties,
366391
) -> DelayProperties:
@@ -501,3 +526,15 @@ def build_multi_dispense_properties(
501526
_disposal_by_volume=multi_dispense_properties.disposalByVolume,
502527
_delay=_build_delay_properties(multi_dispense_properties.delay),
503528
)
529+
530+
531+
def build_transfer_properties(
532+
by_tip_type_setting: SharedByTipTypeSetting,
533+
) -> TransferProperties:
534+
return TransferProperties(
535+
_aspirate=build_aspirate_properties(by_tip_type_setting.aspirate),
536+
_dispense=build_single_dispense_properties(by_tip_type_setting.singleDispense),
537+
_multi_dispense=build_multi_dispense_properties(
538+
by_tip_type_setting.multiDispense
539+
),
540+
)

0 commit comments

Comments
 (0)