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.
Files changed (88) hide show
  1. {doover_cli-0.5.0 → doover_cli-0.5.2}/PKG-INFO +1 -1
  2. {doover_cli-0.5.0 → doover_cli-0.5.2}/pyproject.toml +1 -1
  3. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/apps/apps.py +8 -0
  4. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_apps.py +42 -0
  5. {doover_cli-0.5.0 → doover_cli-0.5.2}/uv.lock +7 -7
  6. {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/CONTRIBUTING.md +0 -0
  7. {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/ISSUE_TEMPLATE/bug-report.yaml +0 -0
  8. {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  9. {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
  10. {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  11. {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/workflows/lint-test.yml +0 -0
  12. {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/workflows/release-brew.yml +0 -0
  13. {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/workflows/release-pypi.yml +0 -0
  14. {doover_cli-0.5.0 → doover_cli-0.5.2}/.github/workflows/release.yml +0 -0
  15. {doover_cli-0.5.0 → doover_cli-0.5.2}/.gitignore +0 -0
  16. {doover_cli-0.5.0 → doover_cli-0.5.2}/.pre-commit-config.yaml +0 -0
  17. {doover_cli-0.5.0 → doover_cli-0.5.2}/AGENT.md +0 -0
  18. {doover_cli-0.5.0 → doover_cli-0.5.2}/LICENSE +0 -0
  19. {doover_cli-0.5.0 → doover_cli-0.5.2}/README.md +0 -0
  20. {doover_cli-0.5.0 → doover_cli-0.5.2}/debian/changelog +0 -0
  21. {doover_cli-0.5.0 → doover_cli-0.5.2}/debian/control +0 -0
  22. {doover_cli-0.5.0 → doover_cli-0.5.2}/debian/rules +0 -0
  23. {doover_cli-0.5.0 → doover_cli-0.5.2}/docs/user_stories.md +0 -0
  24. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/__init__.py +0 -0
  25. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/agent.py +0 -0
  26. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/api/__init__.py +0 -0
  27. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/api/auth.py +0 -0
  28. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/api/errors.py +0 -0
  29. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/api/session.py +0 -0
  30. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/apps/app_install.py +0 -0
  31. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/apps/device.py +0 -0
  32. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/apps/device_type.py +0 -0
  33. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/apps/tunnel.py +0 -0
  34. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/channel.py +0 -0
  35. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/colours.py +0 -0
  36. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/config_schema.py +0 -0
  37. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/dda_logs.py +0 -0
  38. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/doover_config.py +0 -0
  39. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/grpc.py +0 -0
  40. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/login.py +0 -0
  41. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/renderer/__init__.py +0 -0
  42. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/renderer/_base.py +0 -0
  43. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/renderer/_basic.py +0 -0
  44. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/renderer/_default.py +0 -0
  45. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/renderer/_json.py +0 -0
  46. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/report.py +0 -0
  47. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/simulator.py +0 -0
  48. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/ui_schema.py +0 -0
  49. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/user.py +0 -0
  50. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/__init__.py +0 -0
  51. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/api.py +0 -0
  52. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/apps.py +0 -0
  53. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/context.py +0 -0
  54. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/crud/__init__.py +0 -0
  55. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/crud/commands.py +0 -0
  56. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/crud/lookup.py +0 -0
  57. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/crud/prompting.py +0 -0
  58. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/crud/schema.py +0 -0
  59. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/crud/values.py +0 -0
  60. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/errors.py +0 -0
  61. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/formatters.py +0 -0
  62. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/misc.py +0 -0
  63. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/parsers.py +0 -0
  64. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/prompt.py +0 -0
  65. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/sentry.py +0 -0
  66. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/shell_commands.py +0 -0
  67. {doover_cli-0.5.0 → doover_cli-0.5.2}/src/doover_cli/utils/state.py +0 -0
  68. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/__init__.py +0 -0
  69. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/conftest.py +0 -0
  70. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_agent.py +0 -0
  71. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_app_install.py +0 -0
  72. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_auth_integration.py +0 -0
  73. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_auth_unit.py +0 -0
  74. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_basic.py +0 -0
  75. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_crud_commands.py +0 -0
  76. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_crud_lookup.py +0 -0
  77. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_crud_prompting.py +0 -0
  78. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_crud_schema.py +0 -0
  79. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_crud_values.py +0 -0
  80. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_default_renderer.py +0 -0
  81. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_device.py +0 -0
  82. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_device_cli_integration.py +0 -0
  83. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_device_type.py +0 -0
  84. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_device_type_cli_integration.py +0 -0
  85. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_prompt.py +0 -0
  86. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_sentry.py +0 -0
  87. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_user.py +0 -0
  88. {doover_cli-0.5.0 → doover_cli-0.5.2}/tests/test_utils_apps.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: doover-cli
3
- Version: 0.5.0
3
+ Version: 0.5.2
4
4
  Summary: CLI for Doover
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.11
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "doover-cli"
3
- version = "0.5.0"
3
+ version = "0.5.2"
4
4
  description = "CLI for Doover"
5
5
  requires-python = ">=3.11"
6
6
  dependencies = [
@@ -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.0"
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.1"
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/bf/b6/446d8f51b55d402a9e92519a4f0ecad0571c3bc0c0ce5d8da98c456dd8a6/pydoover-1.7.1.tar.gz", hash = "sha256:2d98f99650078d105c49cd9ed8e6ba99ea1d6e04de39524beebf27871b102cb5", size = 537405, upload-time = "2026-06-27T10:44:37.13Z" }
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/76/7f/c688ea03adf654238a86035bbd94f225de4d923c6ace7fcd1ed7a47991ee/pydoover-1.7.1-py3-none-any.whl", hash = "sha256:bda708ab027987769c04385e1127e5d7706110308b650362e85cbb1f9478d872", size = 284995, upload-time = "2026-06-27T10:44:35.919Z" },
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 = "7.7.1"
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/db/c6/22e7a2acd5d27941e85e0d7ede398da5abe2e4677d2265c924157247c32e/smart_open-7.7.1.tar.gz", hash = "sha256:9414ba5733e28309f29b28a303b0f1054ad23fe0275f1a1b600c80a724f4bd1a", size = 54952, upload-time = "2026-06-26T07:56:35.309Z" }
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/8a/c5/14732c140fa0af0e59345949eaf9016c75ad3f076586f2413e3d3566a8da/smart_open-7.7.1-py3-none-any.whl", hash = "sha256:cb62dc45f519bf39b612564d326d2a17556f3a6056e3c3a86a07215d670d45bc", size = 65061, upload-time = "2026-06-26T07:56:33.685Z" },
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