refactor: rename project to LedGrab, split HA integration into separate repo
Lint & Test / test (push) Successful in 1m56s

- Rename Python package: wled_controller -> ledgrab
- Rename env var prefix: WLED_ -> LEDGRAB_ (with auto-migration for old vars)
- Rename localStorage key: wled_api_key -> ledgrab_api_key (with migration)
- Rename HA integration domain: wled_screen_controller -> ledgrab
- Update all imports, build scripts, Docker, installer, config, docs
- Remove HA integration (moved to ledgrab-haos-integration repo)
- Remove hacs.json (belongs in HA repo now)
- Add startup warning for users with old WLED_ env vars
- All tests pass (715/715), ruff clean, tsc clean, frontend builds
This commit is contained in:
2026-04-12 22:45:28 +03:00
parent 38f73badbf
commit 02cd9d519c
548 changed files with 3502 additions and 5180 deletions
+10 -34
View File
@@ -4,7 +4,7 @@ import pytest
import respx
from httpx import Response
from wled_controller.core.devices.wled_client import WLEDClient, WLEDInfo
from ledgrab.core.devices.wled_client import WLEDClient, WLEDInfo
@pytest.fixture
@@ -30,15 +30,7 @@ def mock_wled_info():
@pytest.fixture
def mock_wled_cfg():
"""Provide mock WLED config response (needed by get_info)."""
return {
"hw": {
"led": {
"ins": [
{"start": 0, "len": 150, "order": 1, "pin": [2], "type": 22}
]
}
}
}
return {"hw": {"led": {"ins": [{"start": 0, "len": 150, "order": 1, "pin": [2], "type": 22}]}}}
@pytest.fixture
@@ -57,15 +49,9 @@ def _mock_connect_endpoints(wled_url, mock_wled_info, mock_wled_cfg, mock_wled_s
connect() calls get_info() which hits /json/info + /json/cfg,
then snapshot_device_state() which hits /json/state.
"""
respx.get(f"{wled_url}/json/info").mock(
return_value=Response(200, json=mock_wled_info)
)
respx.get(f"{wled_url}/json/cfg").mock(
return_value=Response(200, json=mock_wled_cfg)
)
respx.get(f"{wled_url}/json/state").mock(
return_value=Response(200, json=mock_wled_state)
)
respx.get(f"{wled_url}/json/info").mock(return_value=Response(200, json=mock_wled_info))
respx.get(f"{wled_url}/json/cfg").mock(return_value=Response(200, json=mock_wled_cfg))
respx.get(f"{wled_url}/json/state").mock(return_value=Response(200, json=mock_wled_state))
@pytest.mark.asyncio
@@ -133,9 +119,7 @@ async def test_get_state(wled_url, mock_wled_info, mock_wled_cfg, mock_wled_stat
async def test_send_pixels(wled_url, mock_wled_info, mock_wled_cfg, mock_wled_state):
"""Test sending pixel data."""
_mock_connect_endpoints(wled_url, mock_wled_info, mock_wled_cfg, mock_wled_state)
respx.post(f"{wled_url}/json/state").mock(
return_value=Response(200, json={"success": True})
)
respx.post(f"{wled_url}/json/state").mock(return_value=Response(200, json={"success": True}))
async with WLEDClient(wled_url) as client:
pixels = [
@@ -173,9 +157,7 @@ async def test_send_pixels_invalid_values(wled_url, mock_wled_info, mock_wled_cf
async def test_set_power(wled_url, mock_wled_info, mock_wled_cfg, mock_wled_state):
"""Test turning device on/off."""
_mock_connect_endpoints(wled_url, mock_wled_info, mock_wled_cfg, mock_wled_state)
respx.post(f"{wled_url}/json/state").mock(
return_value=Response(200, json={"success": True})
)
respx.post(f"{wled_url}/json/state").mock(return_value=Response(200, json={"success": True}))
async with WLEDClient(wled_url) as client:
# Turn on
@@ -192,9 +174,7 @@ async def test_set_power(wled_url, mock_wled_info, mock_wled_cfg, mock_wled_stat
async def test_set_brightness(wled_url, mock_wled_info, mock_wled_cfg, mock_wled_state):
"""Test setting brightness."""
_mock_connect_endpoints(wled_url, mock_wled_info, mock_wled_cfg, mock_wled_state)
respx.post(f"{wled_url}/json/state").mock(
return_value=Response(200, json={"success": True})
)
respx.post(f"{wled_url}/json/state").mock(return_value=Response(200, json={"success": True}))
async with WLEDClient(wled_url) as client:
success = await client.set_brightness(128)
@@ -231,12 +211,8 @@ async def test_retry_logic(wled_url, mock_wled_info, mock_wled_cfg, mock_wled_st
return Response(200, json=mock_wled_info)
respx.get(f"{wled_url}/json/info").mock(side_effect=mock_info_response)
respx.get(f"{wled_url}/json/cfg").mock(
return_value=Response(200, json=mock_wled_cfg)
)
respx.get(f"{wled_url}/json/state").mock(
return_value=Response(200, json=mock_wled_state)
)
respx.get(f"{wled_url}/json/cfg").mock(return_value=Response(200, json=mock_wled_cfg))
respx.get(f"{wled_url}/json/state").mock(return_value=Response(200, json=mock_wled_state))
client = WLEDClient(wled_url, retry_attempts=3, retry_delay=0.1)
success = await client.connect()