Skip to content

Commit 242afe0

Browse files
authored
Add configurable repository for releases and upgrades (#2039)
1 parent cc3dea8 commit 242afe0

6 files changed

Lines changed: 51 additions & 6 deletions

File tree

src/wled/const.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
from awesomeversion import AwesomeVersion
66

7+
DEFAULT_REPO = "wled/WLED"
8+
79
MIN_REQUIRED_VERSION = AwesomeVersion("0.14.0")
810

911

src/wled/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -891,4 +891,5 @@ class Releases(BaseModel):
891891

892892
beta: AwesomeVersion | None
893893
nightly: AwesomeVersion | None
894+
repo: str
894895
stable: AwesomeVersion | None

src/wled/wled.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import orjson
1515
from yarl import URL
1616

17+
from .const import DEFAULT_REPO
1718
from .exceptions import (
1819
WLEDConnectionClosedError,
1920
WLEDConnectionError,
@@ -603,12 +604,18 @@ async def nightlight(
603604
nightlight = {k: v for k, v in nightlight.items() if v is not None}
604605
await self.request("/json/state", method="POST", data={"nl": nightlight})
605606

606-
async def upgrade(self, *, version: str | AwesomeVersion) -> None: # noqa: PLR0912
607+
async def upgrade( # noqa: PLR0912
608+
self,
609+
*,
610+
version: str | AwesomeVersion,
611+
repo: str = DEFAULT_REPO,
612+
) -> None:
607613
"""Upgrade WLED device to the specified version.
608614
609615
Args:
610616
----
611617
version: The version to upgrade to.
618+
repo: GitHub repository to download firmware from.
612619
613620
Raises:
614621
------
@@ -677,7 +684,7 @@ async def upgrade(self, *, version: str | AwesomeVersion) -> None: # noqa: PLR0
677684
architecture = self._device.info.architecture.upper()
678685
update_file = f"WLED_{version}_{architecture}{ethernet}.bin{gzip}"
679686
download_url = (
680-
f"https://github.com/wled/WLED/releases/download/v{version}/{update_file}"
687+
f"https://github.com/{repo}/releases/download/v{version}/{update_file}"
681688
)
682689

683690
try:
@@ -793,6 +800,7 @@ def _check_presets_changed(
793800
class WLEDReleases:
794801
"""Get version information for WLED."""
795802

803+
repo: str = DEFAULT_REPO
796804
request_timeout: float = 8.0
797805
session: aiohttp.client.ClientSession | None = None
798806

@@ -824,7 +832,7 @@ async def releases(self) -> Releases: # noqa: PLR0912 # pylint: disable=too-ma
824832
try:
825833
async with asyncio.timeout(self.request_timeout):
826834
response = await self.session.get(
827-
"https://api.github.com/repos/wled/WLED/releases",
835+
f"https://api.github.com/repos/{self.repo}/releases",
828836
headers={"Accept": "application/json"},
829837
)
830838
except TimeoutError as exception:
@@ -886,6 +894,7 @@ async def releases(self) -> Releases: # noqa: PLR0912 # pylint: disable=too-ma
886894
{
887895
"beta": version_beta or "",
888896
"nightly": version_nightly or "",
897+
"repo": self.repo,
889898
"stable": version_stable or "",
890899
}
891900
)

tests/test_cli.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,9 @@ def _mock_releases(
8585
nightly: str = "17.0.0-dev20260416",
8686
) -> MagicMock:
8787
"""Create a mock WLEDReleases that returns the given versions."""
88-
releases = Releases.from_dict({"stable": stable, "beta": beta, "nightly": nightly})
88+
releases = Releases.from_dict(
89+
{"stable": stable, "beta": beta, "nightly": nightly, "repo": "wled/WLED"}
90+
)
8991
instance = AsyncMock()
9092
instance.__aenter__.return_value = instance
9193
instance.__aexit__.return_value = None

tests/test_models.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -805,16 +805,24 @@ def test_get_awesome_version_cached() -> None:
805805
def test_releases_from_dict() -> None:
806806
"""Test Releases deserialization."""
807807
releases = Releases.from_dict(
808-
{"stable": "0.14.0", "beta": "0.15.0b1", "nightly": "17.0.0-dev"}
808+
{
809+
"stable": "0.14.0",
810+
"beta": "0.15.0b1",
811+
"nightly": "17.0.0-dev",
812+
"repo": "wled/WLED",
813+
}
809814
)
810815
assert releases.stable is not None
811816
assert releases.beta is not None
812817
assert releases.nightly is not None
818+
assert releases.repo == "wled/WLED"
813819

814820

815821
def test_releases_none_values() -> None:
816822
"""Test Releases with None values."""
817-
releases = Releases.from_dict({"stable": "", "beta": "", "nightly": ""})
823+
releases = Releases.from_dict(
824+
{"stable": "", "beta": "", "nightly": "", "repo": "wled/WLED"}
825+
)
818826
assert releases.stable is None
819827
assert releases.beta is None
820828
assert releases.nightly is None

tests/test_wled.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1485,6 +1485,29 @@ async def test_releases_success() -> None:
14851485
assert str(releases.beta) == "0.15.0b1"
14861486
assert releases.nightly is not None
14871487
assert str(releases.nightly) == "17.0.0-dev20260416"
1488+
assert releases.repo == "wled/WLED"
1489+
1490+
1491+
async def test_releases_custom_repo() -> None:
1492+
"""Test fetching releases from a custom repository."""
1493+
releases_data = [
1494+
{
1495+
"tag_name": "v0.14.0",
1496+
"prerelease": False,
1497+
},
1498+
]
1499+
with aioresponses() as mocked:
1500+
mocked.get(
1501+
"https://api.github.com/repos/MoonModules/WLED/releases",
1502+
status=200,
1503+
body=json.dumps(releases_data),
1504+
content_type="application/json",
1505+
)
1506+
async with aiohttp.ClientSession() as session:
1507+
wled_releases = WLEDReleases(repo="MoonModules/WLED", session=session)
1508+
releases = await wled_releases.releases()
1509+
assert releases.repo == "MoonModules/WLED"
1510+
assert str(releases.stable) == "0.14.0"
14881511

14891512

14901513
async def test_releases_with_b_in_tag_name() -> None:

0 commit comments

Comments
 (0)