From 215f88978d58b5a7661b8dfb8ef4ecd56f5d31d1 Mon Sep 17 00:00:00 2001 From: Robin Genz Date: Thu, 1 Oct 2026 19:09:30 +0200 Subject: [PATCH] feat(apps): add `build_stack` to apps --- src/capawesome_cloud/models.py | 1 + src/capawesome_cloud/resources/apps.py | 8 +++++++- tests/test_resources.py | 10 ++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/capawesome_cloud/models.py b/src/capawesome_cloud/models.py index 5975834..86e91fa 100644 --- a/src/capawesome_cloud/models.py +++ b/src/capawesome_cloud/models.py @@ -71,6 +71,7 @@ class CapawesomeModel(BaseModel): class App(CapawesomeModel): name: Optional[str] = None type: Optional[str] = None + build_stack: Optional[str] = None created_at: Optional[datetime] = None updated_at: Optional[datetime] = None diff --git a/src/capawesome_cloud/resources/apps.py b/src/capawesome_cloud/resources/apps.py index 51aaec9..6ce6451 100644 --- a/src/capawesome_cloud/resources/apps.py +++ b/src/capawesome_cloud/resources/apps.py @@ -116,16 +116,22 @@ def update( type: Union[str, NotGiven] = NOT_GIVEN, app_channel_id: Union[str, None, NotGiven] = NOT_GIVEN, app_environment_id: Union[str, None, NotGiven] = NOT_GIVEN, + build_stack: Union[str, None, NotGiven] = NOT_GIVEN, app_channel_discovery_enabled: Union[bool, NotGiven] = NOT_GIVEN, next_app_build_number: Union[int, NotGiven] = NOT_GIVEN, ) -> App: - """Update an app.""" + """Update an app. + + ``build_stack`` is the default stack for builds that do not specify one. Pass + ``None`` to use the Capawesome Cloud default. + """ body = build_body( { "name": name, "type": type, "appChannelId": app_channel_id, "appEnvironmentId": app_environment_id, + "buildStack": build_stack, "appChannelDiscoveryEnabled": app_channel_discovery_enabled, "nextAppBuildNumber": next_app_build_number, } diff --git a/tests/test_resources.py b/tests/test_resources.py index 6707d64..b9cbb6d 100644 --- a/tests/test_resources.py +++ b/tests/test_resources.py @@ -39,6 +39,16 @@ def test_update_with_no_args_sends_empty_body(client: CapawesomeCloud) -> None: assert route.calls.last.request.read() == b"{}" +@respx.mock +def test_app_update_sends_build_stack(client: CapawesomeCloud) -> None: + route = respx.patch(f"{BASE_URL}/v1/apps/app1").mock( + return_value=httpx.Response(200, json={"id": "app1", "buildStack": "macos-tahoe"}) + ) + app = client.apps.update("app1", build_stack="macos-tahoe") + assert route.calls.last.request.read() == b'{"buildStack":"macos-tahoe"}' + assert app.build_stack == "macos-tahoe" + + @respx.mock def test_pause_channel_no_content(client: CapawesomeCloud) -> None: route = respx.post(f"{BASE_URL}/v1/apps/app1/channels/ch1/pause").mock(