diff --git a/src/wled/models.py b/src/wled/models.py index 0080ff7d..eab0c7e4 100644 --- a/src/wled/models.py +++ b/src/wled/models.py @@ -730,13 +730,20 @@ class Device(BaseModel): @classmethod def __pre_deserialize__(cls, d: dict[Any, Any]) -> dict[Any, Any]: """Pre deserialize hook for Device object.""" - if (version := d.get("info", {}).get("ver")) and version < MIN_REQUIRED_VERSION: - msg = ( - f"Unsupported firmware version {version}. " - f"Minimum required version is {MIN_REQUIRED_VERSION}. " - f"Please update your WLED device." + if version_str := d.get("info", {}).get("ver"): + version = get_awesome_version(version_str) + # Compare base version (major.minor.patch) to allow pre-release + # builds (e.g. 0.14.0-b1) of the minimum required version. + base = get_awesome_version( + f"{version.major}.{version.minor}.{version.patch}" ) - raise WLEDUnsupportedVersionError(msg) + if base < MIN_REQUIRED_VERSION: + msg = ( + f"Unsupported firmware version {version_str}. " + f"Minimum required version is {MIN_REQUIRED_VERSION}. " + f"Please update your WLED device." + ) + raise WLEDUnsupportedVersionError(msg) if _effects := d.get("effects"): d["effects"] = { diff --git a/tests/test_models.py b/tests/test_models.py index 212befab..09fe906a 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -625,6 +625,22 @@ def test_device_unsupported_version() -> None: Device.from_dict(data) +def test_device_beta_of_minimum_version_allowed() -> None: + """Test that a beta of the minimum required version is accepted.""" + data = full_device_data() + data["info"]["ver"] = "0.14.0-b1" + device = Device.from_dict(data) + assert device.info.version is not None + + +def test_device_beta_below_minimum_version_rejected() -> None: + """Test that a beta below the minimum required version is rejected.""" + data = full_device_data() + data["info"]["ver"] = "0.13.0-b1" + with pytest.raises(WLEDUnsupportedVersionError): + Device.from_dict(data) + + def test_device_null_palettes() -> None: """Test that None palettes results in empty dict.""" data = full_device_data()