ha-deploy-kit 0.1.0__tar.gz → 0.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/CHANGELOG.md +26 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/PKG-INFO +2 -2
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/README.md +1 -1
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/pyproject.toml +1 -1
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/ha/repairs_flow.py +5 -3
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/metadata/strings.snippet.fixflow.json +1 -1
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/ha/test_repairs_flow.py +11 -3
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/.coveragerc-ha +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/.github/workflows/release.yml +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/.github/workflows/validate.yml +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/.gitignore +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/LICENSE +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/docs/adopting.md +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/docs/configuration.md +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/docs/install.md +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/docs/releasing.md +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/examples/backend_only/.env.example +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/examples/backend_only/deploy.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/examples/backend_only/deploy.sh +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/examples/frontend_card/.env.example +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/examples/frontend_card/deploy.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/examples/frontend_card/deploy.sh +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/examples/frontend_card/ha_adapter.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/examples/synthetic_widget/deploy.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/examples/synthetic_widget/ha_adapter.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/__init__.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/cli.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/comparison.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/config.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/frontend.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/ha/__init__.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/ha/repairs_issue.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/ha/service.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/ha/serving.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/inventory.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/metadata/services.yaml.tmpl +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/metadata/strings.snippet.json +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/notify.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/settings.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/transport.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/conftest.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/ha/conftest.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/ha/test_example_adapters.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/ha/test_real_http_to_service.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/ha/test_repairs_issue.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/ha/test_service.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/ha/test_serving.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/test_cli.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/test_comparison.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/test_config.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/test_frontend.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/test_installed_smoke.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/test_inventory.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/test_multi_consumer.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/test_notify.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/test_packaging.py +0 -0
- {ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/tests/test_transport.py +0 -0
|
@@ -1,6 +1,32 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
## v0.1.2 (2026-10-29)
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
- **ha**: Confirm restart via a dialog instead of a checkbox
|
|
9
|
+
([`aeaf825`](https://github.com/latrekc-meta/ha-deploy-kit/commit/aeaf82541dced2e3e77828b97f28c34dab5e361a))
|
|
10
|
+
|
|
11
|
+
The checkbox step added friction without benefit: opening the Repairs issue already shows a
|
|
12
|
+
confirmation dialog, and the restart should fire when the user submits it. Drop the required
|
|
13
|
+
confirm checkbox and the confirm_required error; restart only on submit of the dialog. Trim the
|
|
14
|
+
fix-flow strings snippet back to title + description.
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## v0.1.1 (2026-10-29)
|
|
18
|
+
|
|
19
|
+
### Bug Fixes
|
|
20
|
+
|
|
21
|
+
- **ha**: Require explicit checkbox confirmation before restart
|
|
22
|
+
([`0fe3169`](https://github.com/latrekc-meta/ha-deploy-kit/commit/0fe31697c4ca81c775d45573eeb221e9ee832b49))
|
|
23
|
+
|
|
24
|
+
The restart Repairs fix flow showed an empty-schema form and restarted on any submit, so a bare
|
|
25
|
+
Submit triggered the reboot with nothing to affirm. Require a Required("confirm") boolean: restart
|
|
26
|
+
only when the box is ticked, otherwise re-show the form with a confirm_required error. Update the
|
|
27
|
+
fix-flow strings snippet (checkbox label + error) and the README API note.
|
|
28
|
+
|
|
29
|
+
|
|
4
30
|
## v0.1.0 (2026-10-29)
|
|
5
31
|
|
|
6
32
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: ha-deploy-kit
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Summary: HA-free SSH deploy / compare / notify / optional-frontend toolkit for Home Assistant custom components
|
|
5
5
|
Project-URL: Homepage, https://github.com/latrekc-meta/ha-deploy-kit
|
|
6
6
|
Project-URL: Repository, https://github.com/latrekc-meta/ha-deploy-kit
|
|
@@ -110,7 +110,7 @@ how releases are published.
|
|
|
110
110
|
| `ha.async_register_restart_service(hass, domain, ...)` | `ha_deploy_kit.ha` | Idempotently register the restart service (empty schema). Pass `fixable=True` for a one-click Repairs card (pair with the fix flow). |
|
|
111
111
|
| `ha.async_raise_restart_issue(hass, domain, ...)` | `ha_deploy_kit.ha` | Raise the deduplicated, non-persistent restart Repairs issue. |
|
|
112
112
|
| `ha.async_clear_restart_issue(hass, domain, ...)` | `ha_deploy_kit.ha` | Clear the restart issue. |
|
|
113
|
-
| `ha.async_create_restart_fix_flow(hass, issue_id, ...)` | `ha_deploy_kit.ha` | Optional opt-in confirm-and-restart flow (restart only
|
|
113
|
+
| `ha.async_create_restart_fix_flow(hass, issue_id, ...)` | `ha_deploy_kit.ha` | Optional opt-in confirm-and-restart flow (shows a confirmation dialog; restart only when the user submits it). |
|
|
114
114
|
| `ha.register_card_serving(hass, domain, lovelace_dir, card_url)` | `ha_deploy_kit.ha` | Serve the card and register it as a frontend module. |
|
|
115
115
|
|
|
116
116
|
## CLI
|
|
@@ -62,7 +62,7 @@ how releases are published.
|
|
|
62
62
|
| `ha.async_register_restart_service(hass, domain, ...)` | `ha_deploy_kit.ha` | Idempotently register the restart service (empty schema). Pass `fixable=True` for a one-click Repairs card (pair with the fix flow). |
|
|
63
63
|
| `ha.async_raise_restart_issue(hass, domain, ...)` | `ha_deploy_kit.ha` | Raise the deduplicated, non-persistent restart Repairs issue. |
|
|
64
64
|
| `ha.async_clear_restart_issue(hass, domain, ...)` | `ha_deploy_kit.ha` | Clear the restart issue. |
|
|
65
|
-
| `ha.async_create_restart_fix_flow(hass, issue_id, ...)` | `ha_deploy_kit.ha` | Optional opt-in confirm-and-restart flow (restart only
|
|
65
|
+
| `ha.async_create_restart_fix_flow(hass, issue_id, ...)` | `ha_deploy_kit.ha` | Optional opt-in confirm-and-restart flow (shows a confirmation dialog; restart only when the user submits it). |
|
|
66
66
|
| `ha.register_card_serving(hass, domain, lovelace_dir, card_url)` | `ha_deploy_kit.ha` | Serve the card and register it as a frontend module. |
|
|
67
67
|
|
|
68
68
|
## CLI
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-deploy-kit"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.2"
|
|
8
8
|
description = "HA-free SSH deploy / compare / notify / optional-frontend toolkit for Home Assistant custom components"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { file = "LICENSE" }
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"""Optional opt-in confirm-and-restart Repairs flow.
|
|
2
2
|
|
|
3
|
-
The restart happens ONLY
|
|
4
|
-
|
|
3
|
+
The restart happens ONLY after the user submits the confirmation dialog. Opening
|
|
4
|
+
the Repairs issue shows a dialog describing the restart; clicking submit is the
|
|
5
|
+
explicit confirmation. No executable restart lives in the core engine; this flow
|
|
6
|
+
is the single opt-in place a consumer may wire it.
|
|
5
7
|
"""
|
|
6
8
|
|
|
7
9
|
from __future__ import annotations
|
|
@@ -17,7 +19,7 @@ if TYPE_CHECKING:
|
|
|
17
19
|
|
|
18
20
|
|
|
19
21
|
class _RestartRequiredFixFlow(RepairsFlow):
|
|
20
|
-
"""Shows a confirmation
|
|
22
|
+
"""Shows a confirmation dialog, then restarts only when the user submits it."""
|
|
21
23
|
|
|
22
24
|
async def async_step_init(
|
|
23
25
|
self, user_input: dict[str, Any] | None = None
|
{ha_deploy_kit-0.1.0 → ha_deploy_kit-0.1.2}/src/ha_deploy_kit/metadata/strings.snippet.fixflow.json
RENAMED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"step": {
|
|
7
7
|
"confirm_restart": {
|
|
8
8
|
"title": "Restart Home Assistant",
|
|
9
|
-
"description": "
|
|
9
|
+
"description": "Newly deployed code is on disk. Click submit to restart Home Assistant now and load it."
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
}
|
|
@@ -6,7 +6,7 @@ from ha_deploy_kit.ha import async_create_restart_fix_flow
|
|
|
6
6
|
pytestmark = pytest.mark.ha
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
async def
|
|
9
|
+
async def test_showing_the_form_never_restarts(hass):
|
|
10
10
|
calls = async_mock_service(hass, "homeassistant", "restart")
|
|
11
11
|
|
|
12
12
|
flow = async_create_restart_fix_flow(hass, "restart_required")
|
|
@@ -16,11 +16,19 @@ async def test_optional_fix_flow_cancel_then_submit(hass):
|
|
|
16
16
|
shown = await flow.async_step_init()
|
|
17
17
|
assert shown["type"] == "form"
|
|
18
18
|
assert shown["step_id"] == "confirm_restart"
|
|
19
|
-
assert len(calls) == 0 # merely showing the
|
|
19
|
+
assert len(calls) == 0 # merely showing the confirmation dialog never restarts
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
async def test_restart_only_after_submitting_the_dialog(hass):
|
|
23
|
+
calls = async_mock_service(hass, "homeassistant", "restart")
|
|
24
|
+
|
|
25
|
+
flow = async_create_restart_fix_flow(hass, "restart_required")
|
|
26
|
+
assert flow is not None
|
|
27
|
+
flow.hass = hass
|
|
20
28
|
|
|
21
29
|
result = await flow.async_step_confirm_restart({})
|
|
22
30
|
assert result["type"] == "create_entry"
|
|
23
|
-
assert len(calls) == 1 # restart only
|
|
31
|
+
assert len(calls) == 1 # restart only when the user submits the dialog
|
|
24
32
|
|
|
25
33
|
|
|
26
34
|
async def test_fix_flow_other_issue_returns_none(hass):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|