Skip to content

Commit 281fb67

Browse files
committed
fix types in robot-server and tests
1 parent 5d94f16 commit 281fb67

File tree

3 files changed

+63
-53
lines changed

3 files changed

+63
-53
lines changed

api/src/opentrons/hardware_control/modules/types.py

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
cast,
1515
TYPE_CHECKING,
1616
TypeGuard,
17+
Literal,
1718
)
1819
from typing_extensions import TypedDict
1920
from pathlib import Path

robot-server/robot_server/modules/module_data_mapper.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from opentrons.hardware_control.modules import (
88
LiveData,
9+
ModuleDataValidator,
910
ModuleType,
1011
MagneticStatus,
1112
TemperatureStatus,
@@ -71,7 +72,7 @@ def map_data(
7172
# rely on Pydantic to check/coerce data fields from dicts at run time
7273
if module_type == ModuleType.MAGNETIC:
7374
module_cls = MagneticModule
74-
75+
assert ModuleDataValidator.is_magnetic_module_data(live_data["data"])
7576
live_data_height = live_data["data"].get("height")
7677
assert isinstance(
7778
live_data_height, (int, float)
@@ -92,6 +93,7 @@ def map_data(
9293

9394
elif module_type == ModuleType.TEMPERATURE:
9495
module_cls = TemperatureModule
96+
assert ModuleDataValidator.is_temperature_module_data(live_data["data"])
9597
module_data = TemperatureModuleData(
9698
status=TemperatureStatus(live_data["status"]),
9799
targetTemperature=cast(float, live_data["data"].get("targetTemp")),
@@ -100,6 +102,7 @@ def map_data(
100102

101103
elif module_type == ModuleType.THERMOCYCLER:
102104
module_cls = ThermocyclerModule
105+
assert ModuleDataValidator.is_thermocycler_data(live_data["data"])
103106
module_data = ThermocyclerModuleData(
104107
status=TemperatureStatus(live_data["status"]),
105108
targetTemperature=cast(float, live_data["data"].get("targetTemp")),
@@ -120,6 +123,7 @@ def map_data(
120123

121124
elif module_type == ModuleType.HEATER_SHAKER:
122125
module_cls = HeaterShakerModule
126+
assert ModuleDataValidator.is_heater_shaker_data(live_data["data"])
123127
module_data = HeaterShakerModuleData(
124128
status=HeaterShakerStatus(live_data["status"]),
125129
labwareLatchStatus=cast(
@@ -137,6 +141,7 @@ def map_data(
137141
errorDetails=cast(str, live_data["data"].get("errorDetails")),
138142
)
139143
elif module_type == ModuleType.ABSORBANCE_READER:
144+
assert ModuleDataValidator.is_absorbance_reader_data(live_data["data"])
140145
module_cls = AbsorbanceReaderModule
141146
module_data = AbsorbanceReaderModuleData(
142147
status=AbsorbanceReaderStatus(live_data["status"]),

robot-server/tests/modules/test_module_data_mapper.py

+56-52
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""Tests for robot_server.modules.module_data_mapper."""
22
import pytest
3+
from typing import Dict
34

45
from opentrons.protocol_engine import ModuleModel, DeckType
56
from opentrons.protocol_engine.types import Vec3f
@@ -10,6 +11,7 @@
1011
MagneticStatus,
1112
TemperatureStatus,
1213
HeaterShakerStatus,
14+
types as hc_types,
1315
)
1416

1517

@@ -174,22 +176,21 @@ def test_maps_magnetic_module_data(
174176
],
175177
)
176178
@pytest.mark.parametrize(
177-
"input_data",
179+
"status,data",
178180
[
179-
{"status": "idle", "data": {"currentTemp": 42.0, "targetTemp": None}},
180-
{
181-
"status": "holding at target",
182-
"data": {"currentTemp": 84.0, "targetTemp": 84.0},
183-
},
181+
("idle", {"currentTemp": 42.0, "targetTemp": None}),
182+
("holding at target", {"currentTemp": 84.0, "targetTemp": 84.0}),
184183
],
185184
)
186185
def test_maps_temperature_module_data(
187186
input_model: str,
188187
deck_type: DeckType,
189188
expected_compatible: bool,
190-
input_data: LiveData,
189+
status: str,
190+
data: hc_types.TemperatureModuleData,
191191
) -> None:
192192
"""It should map hardware data to a magnetic module."""
193+
input_data: LiveData = {"status": status, "data": data}
193194
module_identity = ModuleIdentity(
194195
module_id="module-id",
195196
serial_number="serial-number",
@@ -236,9 +237,9 @@ def test_maps_temperature_module_data(
236237
),
237238
moduleOffset=ModuleCalibrationData(offset=Vec3f(x=0.0, y=0.0, z=0.0)),
238239
data=TemperatureModuleData(
239-
status=TemperatureStatus(input_data["status"]),
240-
currentTemperature=input_data["data"]["currentTemp"], # type: ignore[arg-type]
241-
targetTemperature=input_data["data"]["targetTemp"], # type: ignore[arg-type]
240+
status=TemperatureStatus(status),
241+
currentTemperature=data["currentTemp"],
242+
targetTemperature=data["targetTemp"],
242243
),
243244
)
244245

@@ -253,11 +254,11 @@ def test_maps_temperature_module_data(
253254
],
254255
)
255256
@pytest.mark.parametrize(
256-
"input_data",
257+
"status,data",
257258
[
258-
{
259-
"status": "idle",
260-
"data": {
259+
(
260+
"idle",
261+
{
261262
"lid": "open",
262263
"lidTarget": None,
263264
"lidTemp": None,
@@ -271,10 +272,10 @@ def test_maps_temperature_module_data(
271272
"currentStepIndex": None,
272273
"totalStepCount": None,
273274
},
274-
},
275-
{
276-
"status": "heating",
277-
"data": {
275+
),
276+
(
277+
"heating",
278+
{
278279
"lid": "open",
279280
"lidTarget": 1,
280281
"lidTemp": 2,
@@ -288,16 +289,18 @@ def test_maps_temperature_module_data(
288289
"currentStepIndex": 9,
289290
"totalStepCount": 10,
290291
},
291-
},
292+
),
292293
],
293294
)
294295
def test_maps_thermocycler_module_data(
295296
input_model: str,
296297
deck_type: DeckType,
297298
expected_compatible: bool,
298-
input_data: LiveData,
299+
status: str,
300+
data: hc_types.ThermocyclerData,
299301
) -> None:
300302
"""It should map hardware data to a magnetic module."""
303+
input_data: LiveData = {"status": status, "data": data}
301304
module_identity = ModuleIdentity(
302305
module_id="module-id",
303306
serial_number="serial-number",
@@ -344,19 +347,19 @@ def test_maps_thermocycler_module_data(
344347
),
345348
moduleOffset=ModuleCalibrationData(offset=Vec3f(x=0.0, y=0.0, z=0.0)),
346349
data=ThermocyclerModuleData(
347-
status=TemperatureStatus(input_data["status"]),
348-
currentTemperature=input_data["data"]["currentTemp"], # type: ignore[arg-type]
349-
targetTemperature=input_data["data"]["targetTemp"], # type: ignore[arg-type]
350-
lidStatus=input_data["data"]["lid"], # type: ignore[arg-type]
351-
lidTemperatureStatus=input_data["data"]["lidTempStatus"], # type: ignore[arg-type]
352-
lidTemperature=input_data["data"]["lidTemp"], # type: ignore[arg-type]
353-
lidTargetTemperature=input_data["data"]["lidTarget"], # type: ignore[arg-type]
354-
holdTime=input_data["data"]["holdTime"], # type: ignore[arg-type]
355-
rampRate=input_data["data"]["rampRate"], # type: ignore[arg-type]
356-
currentCycleIndex=input_data["data"]["currentCycleIndex"], # type: ignore[arg-type]
357-
totalCycleCount=input_data["data"]["totalCycleCount"], # type: ignore[arg-type]
358-
currentStepIndex=input_data["data"]["currentStepIndex"], # type: ignore[arg-type]
359-
totalStepCount=input_data["data"]["totalStepCount"], # type: ignore[arg-type]
350+
status=TemperatureStatus(status),
351+
currentTemperature=data["currentTemp"],
352+
targetTemperature=data["targetTemp"],
353+
lidStatus=data["lid"], # type: ignore[arg-type]
354+
lidTemperatureStatus=data["lidTempStatus"], # type: ignore[arg-type]
355+
lidTemperature=data["lidTemp"],
356+
lidTargetTemperature=data["lidTarget"],
357+
holdTime=data["holdTime"],
358+
rampRate=data["rampRate"],
359+
currentCycleIndex=data["currentCycleIndex"],
360+
totalCycleCount=data["totalCycleCount"],
361+
currentStepIndex=data["currentStepIndex"],
362+
totalStepCount=data["totalStepCount"],
360363
),
361364
)
362365

@@ -369,11 +372,11 @@ def test_maps_thermocycler_module_data(
369372
],
370373
)
371374
@pytest.mark.parametrize(
372-
"input_data",
375+
"status,data",
373376
[
374-
{
375-
"status": "idle",
376-
"data": {
377+
(
378+
"idle",
379+
{
377380
"temperatureStatus": "idle",
378381
"speedStatus": "idle",
379382
"labwareLatchStatus": "idle_open",
@@ -383,10 +386,10 @@ def test_maps_thermocycler_module_data(
383386
"targetSpeed": None,
384387
"errorDetails": None,
385388
},
386-
},
387-
{
388-
"status": "running",
389-
"data": {
389+
),
390+
(
391+
"running",
392+
{
390393
"temperatureStatus": "heating",
391394
"speedStatus": "speeding up",
392395
"labwareLatchStatus": "idle_closed",
@@ -396,13 +399,14 @@ def test_maps_thermocycler_module_data(
396399
"targetSpeed": 9001,
397400
"errorDetails": "oh no",
398401
},
399-
},
402+
),
400403
],
401404
)
402405
def test_maps_heater_shaker_module_data(
403-
input_model: str, deck_type: DeckType, input_data: LiveData
406+
input_model: str, deck_type: DeckType, status: str, data: hc_types.HeaterShakerData
404407
) -> None:
405408
"""It should map hardware data to a magnetic module."""
409+
input_data: LiveData = {"status": status, "data": data}
406410
module_identity = ModuleIdentity(
407411
module_id="module-id",
408412
serial_number="serial-number",
@@ -449,14 +453,14 @@ def test_maps_heater_shaker_module_data(
449453
),
450454
moduleOffset=ModuleCalibrationData(offset=Vec3f(x=0.0, y=0.0, z=0.0)),
451455
data=HeaterShakerModuleData(
452-
status=HeaterShakerStatus(input_data["status"]),
453-
labwareLatchStatus=input_data["data"]["labwareLatchStatus"], # type: ignore[arg-type]
454-
speedStatus=input_data["data"]["speedStatus"], # type: ignore[arg-type]
455-
currentSpeed=input_data["data"]["currentSpeed"], # type: ignore[arg-type]
456-
targetSpeed=input_data["data"]["targetSpeed"], # type: ignore[arg-type]
457-
temperatureStatus=input_data["data"]["temperatureStatus"], # type: ignore[arg-type]
458-
currentTemperature=input_data["data"]["currentTemp"], # type: ignore[arg-type]
459-
targetTemperature=input_data["data"]["targetTemp"], # type: ignore[arg-type]
460-
errorDetails=input_data["data"]["errorDetails"], # type: ignore[arg-type]
456+
status=HeaterShakerStatus(status),
457+
labwareLatchStatus=data["labwareLatchStatus"], # type: ignore[arg-type]
458+
speedStatus=data["speedStatus"], # type: ignore[arg-type]
459+
currentSpeed=data["currentSpeed"],
460+
targetSpeed=data["targetSpeed"],
461+
temperatureStatus=data["temperatureStatus"], # type: ignore[arg-type]
462+
currentTemperature=data["currentTemp"],
463+
targetTemperature=data["targetTemp"],
464+
errorDetails=data["errorDetails"],
461465
),
462466
)

0 commit comments

Comments
 (0)