From d062705ec63b095184ec9dfb39f66e09df4b7da2 Mon Sep 17 00:00:00 2001 From: Felipe Santos Date: Mon, 7 Jul 2025 02:27:24 +0000 Subject: [PATCH] Add force option to rebuild_addon method --- aiohasupervisor/addons.py | 12 ++++++++++-- aiohasupervisor/models/__init__.py | 2 ++ aiohasupervisor/models/addons.py | 7 +++++++ tests/test_addons.py | 20 ++++++++++++++++++++ 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/aiohasupervisor/addons.py b/aiohasupervisor/addons.py index 6d9e559..579bb9b 100644 --- a/aiohasupervisor/addons.py +++ b/aiohasupervisor/addons.py @@ -8,6 +8,7 @@ AddonsConfigValidate, AddonsList, AddonsOptions, + AddonsRebuild, AddonsSecurityOptions, AddonsStats, AddonsUninstall, @@ -75,9 +76,16 @@ async def addon_config(self, addon: str) -> dict[str, Any]: result = await self._client.get(f"addons/{addon}/options/config") return result.data - async def rebuild_addon(self, addon: str) -> None: + async def rebuild_addon( + self, + addon: str, + options: AddonsRebuild | None = None, + ) -> None: """Rebuild an addon (only available for local addons built from source).""" - await self._client.post(f"addons/{addon}/rebuild") + await self._client.post( + f"addons/{addon}/rebuild", + json=options.to_dict() if options else None, + ) async def write_addon_stdin(self, addon: str, stdin: bytes) -> None: """Write to stdin of an addon (if supported by addon).""" diff --git a/aiohasupervisor/models/__init__.py b/aiohasupervisor/models/__init__.py index c2733be..afcfd8d 100644 --- a/aiohasupervisor/models/__init__.py +++ b/aiohasupervisor/models/__init__.py @@ -5,6 +5,7 @@ AddonBootConfig, AddonsConfigValidate, AddonsOptions, + AddonsRebuild, AddonsSecurityOptions, AddonsStats, AddonStage, @@ -173,6 +174,7 @@ "InstalledAddonComplete", "AddonsOptions", "AddonsConfigValidate", + "AddonsRebuild", "AddonsSecurityOptions", "AddonsStats", "AddonsUninstall", diff --git a/aiohasupervisor/models/addons.py b/aiohasupervisor/models/addons.py index 67293c9..81c1bca 100644 --- a/aiohasupervisor/models/addons.py +++ b/aiohasupervisor/models/addons.py @@ -320,6 +320,13 @@ class AddonsUninstall(Request): remove_config: bool | None = None +@dataclass(frozen=True, slots=True) +class AddonsRebuild(Request): + """AddonsRebuild model.""" + + force: bool | None = None + + @dataclass(frozen=True, slots=True) class Repository(ResponseData): """Repository model.""" diff --git a/tests/test_addons.py b/tests/test_addons.py index 1c89a98..5fce90f 100644 --- a/tests/test_addons.py +++ b/tests/test_addons.py @@ -9,6 +9,7 @@ from aiohasupervisor.models import ( AddonBoot, AddonsOptions, + AddonsRebuild, AddonsSecurityOptions, AddonStage, AddonStartup, @@ -193,6 +194,25 @@ async def test_addons_rebuild( } +async def test_addons_rebuild_with_force( + responses: aioresponses, supervisor_client: SupervisorClient +) -> None: + """Test rebuild addon API with force option.""" + responses.post(f"{SUPERVISOR_URL}/addons/local_example/rebuild", status=200) + assert ( + await supervisor_client.addons.rebuild_addon( + "local_example", AddonsRebuild(force=True) + ) + is None + ) + + request_key = ("POST", URL(f"{SUPERVISOR_URL}/addons/local_example/rebuild")) + assert request_key in responses.requests + + request_call = responses.requests[request_key][0] + assert request_call.kwargs["json"] == {"force": True} + + async def test_addons_stdin( responses: aioresponses, supervisor_client: SupervisorClient ) -> None: