Skip to content

Commit 5a7318e

Browse files
committed
Use device-reported repo for upgrades
1 parent fa80d52 commit 5a7318e

5 files changed

Lines changed: 76 additions & 3 deletions

File tree

src/wled/models.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
from .const import (
1717
CUSTOM_PALETTE_ID_CHANGE_VERSION,
18+
DEFAULT_REPO,
1819
MIN_REQUIRED_VERSION,
1920
LightCapability,
2021
LiveDataOverride,
@@ -514,6 +515,9 @@ class Info(BaseModel): # pylint: disable=too-many-instance-attributes
514515
product: str = "DIY Light"
515516
"""The product name. Always FOSS for standard installations."""
516517

518+
repo: str = DEFAULT_REPO
519+
"""GitHub repository in 'owner/repository' format."""
520+
517521
release: str | None = None
518522
"""The release name of the firmware build.
519523

src/wled/wled.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -636,14 +636,15 @@ async def upgrade( # noqa: PLR0912
636636
self,
637637
*,
638638
version: str | AwesomeVersion,
639-
repo: str = DEFAULT_REPO,
639+
repo: str | None = None,
640640
) -> None:
641641
"""Upgrade WLED device to the specified version.
642642
643643
Args:
644644
----
645645
version: The version to upgrade to.
646-
repo: GitHub repository to download firmware from.
646+
repo: GitHub repository to download firmware from. If not specified,
647+
the repository reported by the device firmware is used.
647648
648649
Raises:
649650
------
@@ -682,6 +683,9 @@ async def upgrade( # noqa: PLR0912
682683
msg = "Device already running the requested version"
683684
raise WLEDUpgradeError(msg)
684685

686+
if repo is None:
687+
repo = self._device.info.repo
688+
685689
# Determine if this is an Ethernet board
686690
ethernet = ""
687691
if (

tests/__snapshots__/test_models.ambr

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,7 @@
759759
palette_count=75,
760760
product='FOSS',
761761
release='ESP32',
762+
repo='wled/WLED',
762763
sync_toggle_receive=False,
763764
udp_port=21324,
764765
uptime=datetime.timedelta(seconds=79769),
@@ -1994,6 +1995,7 @@
19941995
palette_count=71,
19951996
product='FOSS',
19961997
release=None,
1998+
repo='wled/WLED',
19971999
sync_toggle_receive=False,
19982000
udp_port=21324,
19992001
uptime=datetime.timedelta(seconds=966),
@@ -3258,6 +3260,7 @@
32583260
palette_count=71,
32593261
product='FOSS',
32603262
release=None,
3263+
repo='wled/WLED',
32613264
sync_toggle_receive=False,
32623265
udp_port=21324,
32633266
uptime=datetime.timedelta(seconds=461),
@@ -4469,6 +4472,7 @@
44694472
palette_count=71,
44704473
product='FOSS',
44714474
release=None,
4475+
repo='wled/WLED',
44724476
sync_toggle_receive=False,
44734477
udp_port=21324,
44744478
uptime=datetime.timedelta(seconds=461),
@@ -5680,6 +5684,7 @@
56805684
palette_count=71,
56815685
product='FOSS',
56825686
release=None,
5687+
repo='wled/WLED',
56835688
sync_toggle_receive=False,
56845689
udp_port=21324,
56855690
uptime=datetime.timedelta(seconds=461),
@@ -6894,6 +6899,7 @@
68946899
palette_count=71,
68956900
product='FOSS',
68966901
release=None,
6902+
repo='wled/WLED',
68976903
sync_toggle_receive=False,
68986904
udp_port=21324,
68996905
uptime=datetime.timedelta(seconds=321),
@@ -8105,6 +8111,7 @@
81058111
palette_count=71,
81068112
product='FOSS',
81078113
release=None,
8114+
repo='wled/WLED',
81088115
sync_toggle_receive=False,
81098116
udp_port=21324,
81108117
uptime=datetime.timedelta(seconds=72),
@@ -9320,6 +9327,7 @@
93209327
palette_count=71,
93219328
product='FOSS',
93229329
release='ESP32',
9330+
repo='wled/WLED',
93239331
sync_toggle_receive=False,
93249332
udp_port=21324,
93259333
uptime=datetime.timedelta(seconds=12),
@@ -10535,6 +10543,7 @@
1053510543
palette_count=71,
1053610544
product='FOSS',
1053710545
release='ESP32',
10546+
repo='wled/WLED',
1053810547
sync_toggle_receive=False,
1053910548
udp_port=21324,
1054010549
uptime=datetime.timedelta(seconds=129),
@@ -11750,6 +11759,7 @@
1175011759
palette_count=71,
1175111760
product='FOSS',
1175211761
release='ESP32',
11762+
repo='wled/WLED',
1175311763
sync_toggle_receive=False,
1175411764
udp_port=21324,
1175511765
uptime=datetime.timedelta(seconds=119),
@@ -12965,6 +12975,7 @@
1296512975
palette_count=71,
1296612976
product='FOSS',
1296712977
release='ESP32',
12978+
repo='wled/WLED',
1296812979
sync_toggle_receive=False,
1296912980
udp_port=21324,
1297012981
uptime=datetime.timedelta(seconds=47),
@@ -14180,6 +14191,7 @@
1418014191
palette_count=71,
1418114192
product='FOSS',
1418214193
release='ESP32',
14194+
repo='wled/WLED',
1418314195
sync_toggle_receive=False,
1418414196
udp_port=21324,
1418514197
uptime=datetime.timedelta(seconds=40),
@@ -15539,6 +15551,7 @@
1553915551
palette_count=72,
1554015552
product='FOSS',
1554115553
release='ESP32',
15554+
repo='wled/WLED',
1554215555
sync_toggle_receive=False,
1554315556
udp_port=21324,
1554415557
uptime=datetime.timedelta(seconds=75),

tests/test_models.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from syrupy.assertion import SnapshotAssertion
1111

1212
from wled import Device, Playlist, Preset, Releases
13+
from wled.const import DEFAULT_REPO
1314
from wled.exceptions import WLEDUnsupportedVersionError
1415
from wled.models import (
1516
AwesomeVersionSerializationStrategy,
@@ -315,6 +316,18 @@ def test_info_version_deserialized() -> None:
315316
assert str(info.version) == "0.14.0"
316317

317318

319+
def test_info_repo_defaults_to_default_repo() -> None:
320+
"""Test repo defaults to DEFAULT_REPO when not present."""
321+
info = Info.from_dict(_base_info())
322+
assert info.repo == DEFAULT_REPO
323+
324+
325+
def test_info_repo_uses_device_value_when_present() -> None:
326+
"""Test repo is deserialized from the device response."""
327+
info = Info.from_dict(_base_info(repo="MoonModules/WLED"))
328+
assert info.repo == "MoonModules/WLED"
329+
330+
318331
# =========================================================================
319332
# State model
320333
# =========================================================================

tests/test_wled.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from yarl import URL
1313

1414
from wled import WLED, Device, Releases
15-
from wled.const import LiveDataOverride
15+
from wled.const import DEFAULT_REPO, LiveDataOverride
1616
from wled.exceptions import (
1717
WLEDConnectionClosedError,
1818
WLEDConnectionError,
@@ -1260,6 +1260,45 @@ async def test_upgrade_success(responses: aioresponses, wled: WLED) -> None:
12601260
await wled.upgrade(version="0.15.0")
12611261

12621262

1263+
@pytest.mark.parametrize(
1264+
("repo", "download_repo"),
1265+
[
1266+
(None, "MoonModules/WLED"),
1267+
(DEFAULT_REPO, DEFAULT_REPO),
1268+
],
1269+
ids=["device_repo", "explicit_repo"],
1270+
)
1271+
async def test_upgrade_repo_selection(
1272+
responses: aioresponses,
1273+
wled: WLED,
1274+
repo: str | None,
1275+
download_repo: str,
1276+
) -> None:
1277+
"""Test upgrade selects the expected firmware repository."""
1278+
wled_data = load_fixture_json("wled")
1279+
wled_data["info"]["arch"] = "esp32"
1280+
wled_data["info"]["ver"] = "0.14.0"
1281+
wled_data["info"]["repo"] = "MoonModules/WLED"
1282+
mock_json_and_presets(responses, wled_data)
1283+
await wled.update()
1284+
responses.get(
1285+
f"https://github.com/{download_repo}/releases/download/v0.15.0/"
1286+
"WLED_0.15.0_ESP32.bin",
1287+
status=200,
1288+
body=b"fake firmware",
1289+
)
1290+
responses.post(
1291+
"http://example.com/update",
1292+
status=200,
1293+
body="OK",
1294+
content_type="text/plain",
1295+
)
1296+
if repo is None:
1297+
await wled.upgrade(version="0.15.0")
1298+
else:
1299+
await wled.upgrade(version="0.15.0", repo=repo)
1300+
1301+
12631302
async def test_upgrade_ethernet_board(responses: aioresponses, wled: WLED) -> None:
12641303
"""Test upgrade with Ethernet board (empty bssid)."""
12651304
await prepare_wled_for_upgrade(responses, wled, wifi_bssid="")

0 commit comments

Comments
 (0)