Skip to content

Commit

Permalink
fix(modules): use parse from packaging module (#14732)
Browse files Browse the repository at this point in the history
  • Loading branch information
caila-marashaj authored and Carlos-fernandez committed May 20, 2024
1 parent 3049c63 commit 68ba7f9
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 6 deletions.
19 changes: 13 additions & 6 deletions api/src/opentrons/hardware_control/modules/mod_abc.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@
import asyncio
import logging
import re
from pkg_resources import parse_version
from typing import ClassVar, Mapping, Optional, cast, TypeVar

from typing import ClassVar, Mapping, Optional, TypeVar
from packaging.version import InvalidVersion, parse, Version
from opentrons.config import IS_ROBOT, ROBOT_FIRMWARE_DIR
from opentrons.drivers.rpi_drivers.types import USBPort

Expand All @@ -16,6 +15,14 @@
TaskPayload = TypeVar("TaskPayload")


def parse_fw_version(version: str) -> Version:
try:
device_version = parse(version)
except InvalidVersion:
device_version = parse("v0.0.0")
return device_version


class AbstractModule(abc.ABC):
"""Defines the common methods of a module."""

Expand Down Expand Up @@ -88,9 +95,9 @@ def get_bundled_fw(self) -> Optional[BundledFirmware]:
def has_available_update(self) -> bool:
"""Return whether a newer firmware file is available"""
if self.device_info and self._bundled_fw:
device_version = parse_version(self.device_info["version"])
available_version = parse_version(self._bundled_fw.version)
return cast(bool, available_version > device_version)
device_version = parse_fw_version(self.device_info["version"])
available_version = parse_fw_version(self._bundled_fw.version)
return available_version > device_version
return False

async def wait_for_is_running(self) -> None:
Expand Down
19 changes: 19 additions & 0 deletions api/tests/opentrons/hardware_control/test_modules.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

from pathlib import Path
from unittest import mock
from packaging.version import Version

from opentrons.hardware_control import ExecutionManager
from opentrons.hardware_control.modules import ModuleAtPort
Expand All @@ -22,6 +23,7 @@
HeaterShaker,
AbstractModule,
)
from opentrons.hardware_control.modules.mod_abc import parse_fw_version
from opentrons.drivers.rpi_drivers.types import USBPort


Expand Down Expand Up @@ -422,3 +424,20 @@ def test_magnetic_module_revision_parsing(revision, model):
)
def test_temperature_module_revision_parsing(revision, model):
assert TempDeck._model_from_revision(revision) == model


@pytest.mark.parametrize(
argnames=["device_version", "expected_result"],
argvalues=[
["v1.0.4", Version("v1.0.4")],
["v0.5.6", Version("v0.5.6")],
["v1.0.4-dhfs", Version("v0.0.0")],
["v3.0.dshjfd", Version("v0.0.0")],
],
)
async def test_catch_invalid_fw_version(
device_version: str,
expected_result: bool,
) -> None:
"""Assert that invalid firmware versions prompt a valid Version object of v0.0.0."""
assert parse_fw_version(device_version) == expected_result

0 comments on commit 68ba7f9

Please sign in to comment.