doover-cli 0.5.0__tar.gz → 0.5.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.
- {doover_cli-0.5.0 → doover_cli-0.5.2}/PKG-INFO +1 -1
- {doover_cli-0.5.0 → doover_cli-0.5.2}/pyproject.toml +1 -1
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/apps/apps.py +8 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_apps.py +42 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/uv.lock +7 -7
- {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/CONTRIBUTING.md +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/ISSUE_TEMPLATE/bug-report.yaml +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/workflows/lint-test.yml +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/workflows/release-brew.yml +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/workflows/release-pypi.yml +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/workflows/release.yml +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/.gitignore +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/.pre-commit-config.yaml +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/AGENT.md +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/LICENSE +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/README.md +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/debian/changelog +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/debian/control +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/debian/rules +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/docs/user_stories.md +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/__init__.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/agent.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/api/__init__.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/api/auth.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/api/errors.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/api/session.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/apps/app_install.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/apps/device.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/apps/device_type.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/apps/tunnel.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/channel.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/colours.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/config_schema.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/dda_logs.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/doover_config.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/grpc.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/login.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/renderer/__init__.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/renderer/_base.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/renderer/_basic.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/renderer/_default.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/renderer/_json.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/report.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/simulator.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/ui_schema.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/user.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/__init__.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/api.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/apps.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/context.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/crud/__init__.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/crud/commands.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/crud/lookup.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/crud/prompting.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/crud/schema.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/crud/values.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/errors.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/formatters.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/misc.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/parsers.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/prompt.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/sentry.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/shell_commands.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/state.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/__init__.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/conftest.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_agent.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_app_install.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_auth_integration.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_auth_unit.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_basic.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_crud_commands.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_crud_lookup.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_crud_prompting.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_crud_schema.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_crud_values.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_default_renderer.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_device.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_device_cli_integration.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_device_type.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_device_type_cli_integration.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_prompt.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_sentry.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_user.py +0 -0
- {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_utils_apps.py +0 -0
|
@@ -1117,6 +1117,13 @@ def release(
|
|
|
1117
1117
|
),
|
|
1118
1118
|
] = None,
|
|
1119
1119
|
notes: Annotated[str, typer.Option(help="Optional release notes.")] = "",
|
|
1120
|
+
alpha: Annotated[
|
|
1121
|
+
bool,
|
|
1122
|
+
typer.Option(
|
|
1123
|
+
help="Publish as a prerelease: the version is created but not "
|
|
1124
|
+
"auto-selected as 'Latest' (reachable only by pinning it explicitly)."
|
|
1125
|
+
),
|
|
1126
|
+
] = False,
|
|
1120
1127
|
staging: Annotated[
|
|
1121
1128
|
bool | None,
|
|
1122
1129
|
typer.Option(help="Force staging mode (default: inferred from the API URL)."),
|
|
@@ -1161,6 +1168,7 @@ def release(
|
|
|
1161
1168
|
tag=tag or "",
|
|
1162
1169
|
commit=resolved_commit or "",
|
|
1163
1170
|
notes=notes or "",
|
|
1171
|
+
alpha=alpha,
|
|
1164
1172
|
)
|
|
1165
1173
|
rich.print("[green]Released a new application version.[/green]")
|
|
1166
1174
|
renderer.render(version)
|
|
@@ -943,6 +943,48 @@ def test_app_publish_processor_builds_package_without_release(monkeypatch, tmp_p
|
|
|
943
943
|
assert renderer.render_calls == [{"id": 303}]
|
|
944
944
|
|
|
945
945
|
|
|
946
|
+
def test_app_release_passes_alpha_flag(monkeypatch, tmp_path):
|
|
947
|
+
captured = {}
|
|
948
|
+
renderer = FakeRenderer()
|
|
949
|
+
app_config = FakeAppConfig(app_id=404)
|
|
950
|
+
|
|
951
|
+
class FakeControlClient:
|
|
952
|
+
@staticmethod
|
|
953
|
+
def create_application_version(application_id, **kwargs):
|
|
954
|
+
captured["application_id"] = application_id
|
|
955
|
+
captured["kwargs"] = kwargs
|
|
956
|
+
return {"id": 1, "number": 1, "alpha": kwargs.get("alpha")}
|
|
957
|
+
|
|
958
|
+
monkeypatch.setattr(
|
|
959
|
+
"doover_cli.apps.apps.get_app_directory", lambda root=None: tmp_path
|
|
960
|
+
)
|
|
961
|
+
monkeypatch.setattr(
|
|
962
|
+
"doover_cli.apps.apps.get_app_config", lambda root_fp, app_name=None: app_config
|
|
963
|
+
)
|
|
964
|
+
monkeypatch.setattr(
|
|
965
|
+
"doover_cli.apps.apps.get_state", lambda: (FakeControlClient(), renderer)
|
|
966
|
+
)
|
|
967
|
+
monkeypatch.setattr(
|
|
968
|
+
"doover_cli.apps.apps._detect_git_commit", lambda root_fp: "deadbeef"
|
|
969
|
+
)
|
|
970
|
+
|
|
971
|
+
result = runner.invoke(
|
|
972
|
+
app, ["app", "release", str(tmp_path), "--digest", "sha256:abc", "--alpha"]
|
|
973
|
+
)
|
|
974
|
+
|
|
975
|
+
assert result.exit_code == 0
|
|
976
|
+
assert captured["application_id"] == 404
|
|
977
|
+
assert captured["kwargs"]["alpha"] is True
|
|
978
|
+
|
|
979
|
+
# ...and defaults to False when the flag is omitted.
|
|
980
|
+
captured.clear()
|
|
981
|
+
result = runner.invoke(
|
|
982
|
+
app, ["app", "release", str(tmp_path), "--digest", "sha256:abc"]
|
|
983
|
+
)
|
|
984
|
+
assert result.exit_code == 0
|
|
985
|
+
assert captured["kwargs"]["alpha"] is False
|
|
986
|
+
|
|
987
|
+
|
|
946
988
|
def test_publish_processor_package_uses_package_zip(tmp_path):
|
|
947
989
|
package_fp = tmp_path / "package.zip"
|
|
948
990
|
package_fp.write_bytes(b"zip-bytes")
|
|
@@ -544,7 +544,7 @@ wheels = [
|
|
|
544
544
|
|
|
545
545
|
[[package]]
|
|
546
546
|
name = "doover-cli"
|
|
547
|
-
version = "0.5.
|
|
547
|
+
version = "0.5.2"
|
|
548
548
|
source = { editable = "." }
|
|
549
549
|
dependencies = [
|
|
550
550
|
{ name = "click" },
|
|
@@ -1325,15 +1325,15 @@ wheels = [
|
|
|
1325
1325
|
|
|
1326
1326
|
[[package]]
|
|
1327
1327
|
name = "pydoover"
|
|
1328
|
-
version = "1.7.
|
|
1328
|
+
version = "1.7.2"
|
|
1329
1329
|
source = { registry = "https://pypi.org/simple" }
|
|
1330
1330
|
dependencies = [
|
|
1331
1331
|
{ name = "aiohttp" },
|
|
1332
1332
|
{ name = "httpx" },
|
|
1333
1333
|
]
|
|
1334
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1334
|
+
sdist = { url = "https://files.pythonhosted.org/packages/c7/34/85c2a78d1b3f8c3667718de7c665f2f8069861190f975ab8c92bec74974c/pydoover-1.7.2.tar.gz", hash = "sha256:db90118fb485fc8c22defa54db26a7c432619bda0bbbc74d080238a8f89b3e88", size = 537649, upload-time = "2026-06-29T00:07:44.584Z" }
|
|
1335
1335
|
wheels = [
|
|
1336
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1336
|
+
{ url = "https://files.pythonhosted.org/packages/20/f4/041356e167a0ff7cb5049815978ee0dd89a1e54b5eac0a6871141c1ecd3a/pydoover-1.7.2-py3-none-any.whl", hash = "sha256:2ed04ca4d265508b22889cadfc2b5071ce704c0af23476f425060b8d9318af13", size = 285206, upload-time = "2026-06-29T00:07:43.165Z" },
|
|
1337
1337
|
]
|
|
1338
1338
|
|
|
1339
1339
|
[[package]]
|
|
@@ -1719,14 +1719,14 @@ wheels = [
|
|
|
1719
1719
|
|
|
1720
1720
|
[[package]]
|
|
1721
1721
|
name = "smart-open"
|
|
1722
|
-
version = "
|
|
1722
|
+
version = "8.0.0"
|
|
1723
1723
|
source = { registry = "https://pypi.org/simple" }
|
|
1724
1724
|
dependencies = [
|
|
1725
1725
|
{ name = "wrapt" },
|
|
1726
1726
|
]
|
|
1727
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1727
|
+
sdist = { url = "https://files.pythonhosted.org/packages/29/3e/79fd5fd2375a8a500b9ec2f6a0762fc1ac33e35582d4a87483a78d19408f/smart_open-8.0.0.tar.gz", hash = "sha256:5a2008d60688bd3b33c52e2ef666d3c60cf956e73e215de8c7b242cf56fdd1b2", size = 61520, upload-time = "2026-06-27T16:28:11.894Z" }
|
|
1728
1728
|
wheels = [
|
|
1729
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1729
|
+
{ url = "https://files.pythonhosted.org/packages/b4/bd/1c92e69a1daff70118f21e18ef3a100c114f00f08b64a1074484f12d9020/smart_open-8.0.0-py3-none-any.whl", hash = "sha256:ff4f395c9e86f23e27771dc4ba756ad4bd145f181859a782c50d64168485761b", size = 73029, upload-time = "2026-06-27T16:28:10.589Z" },
|
|
1730
1730
|
]
|
|
1731
1731
|
|
|
1732
1732
|
[package.optional-dependencies]
|
|
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
|
|
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
|