edge-containers-cli 5.0.1b2__tar.gz → 5.2.0__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 (113) hide show
  1. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.copier-answers.yml +1 -1
  2. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.github/CONTRIBUTING.md +1 -1
  3. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.github/workflows/_test.yml +0 -5
  4. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.github/workflows/ci.yml +0 -2
  5. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.pre-commit-config.yaml +1 -1
  6. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/PKG-INFO +2 -2
  7. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/pyproject.toml +2 -2
  8. edge_containers_cli-5.2.0/renovate.json +40 -0
  9. edge_containers_cli-5.2.0/src/edge_containers_cli/_version.py +24 -0
  10. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/autocomplete.py +13 -6
  11. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/cli.py +76 -32
  12. edge_containers_cli-5.2.0/src/edge_containers_cli/cmds/argo_commands.py +400 -0
  13. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/cmds/commands.py +49 -27
  14. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/cmds/demo_commands.py +21 -20
  15. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/cmds/helm.py +15 -11
  16. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/cmds/k8s_commands.py +83 -44
  17. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/cmds/monitor.py +91 -54
  18. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/git.py +25 -25
  19. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/shell.py +17 -7
  20. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/utils.py +31 -2
  21. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli.egg-info/PKG-INFO +2 -2
  22. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli.egg-info/SOURCES.txt +1 -1
  23. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli.egg-info/requires.txt +1 -1
  24. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/conftest.py +19 -4
  25. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/data/argocd.yaml +113 -0
  26. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/test_argocd.py +20 -7
  27. edge_containers_cli-5.2.0/tests/test_demo.py +39 -0
  28. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/test_k8s.py +5 -3
  29. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/uv.lock +8 -8
  30. edge_containers_cli-5.0.1b2/.github/dependabot.yml +0 -28
  31. edge_containers_cli-5.0.1b2/src/edge_containers_cli/_version.py +0 -34
  32. edge_containers_cli-5.0.1b2/src/edge_containers_cli/cmds/argo_commands.py +0 -334
  33. edge_containers_cli-5.0.1b2/tests/test_demo.py +0 -37
  34. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.devcontainer/devcontainer.json +0 -0
  35. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.dockerignore +0 -0
  36. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  37. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.github/ISSUE_TEMPLATE/issue.md +0 -0
  38. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -0
  39. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.github/pages/index.html +0 -0
  40. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.github/pages/make_switcher.py +0 -0
  41. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.github/workflows/_container.yml +0 -0
  42. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.github/workflows/_dist.yml +0 -0
  43. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.github/workflows/_pypi.yml +0 -0
  44. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.github/workflows/_release.yml +0 -0
  45. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.github/workflows/_tox.yml +0 -0
  46. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.gitignore +0 -0
  47. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.gitleaks.toml +0 -0
  48. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.python-version +0 -0
  49. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.vscode/extensions.json +0 -0
  50. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.vscode/launch.json +0 -0
  51. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.vscode/settings.json +0 -0
  52. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/.vscode/tasks.json +0 -0
  53. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/Dockerfile +0 -0
  54. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/LICENSE +0 -0
  55. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/README.md +0 -0
  56. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/conf.py +0 -0
  57. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/developer/explanations/decisions/0001-record-architecture-decisions.rst +0 -0
  58. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/developer/explanations/decisions/0002-switched-to-pip-skeleton.rst +0 -0
  59. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/developer/explanations/decisions.rst +0 -0
  60. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/developer/how-to/build-docs.rst +0 -0
  61. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/developer/how-to/contribute.rst +0 -0
  62. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/developer/how-to/lint.rst +0 -0
  63. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/developer/how-to/make-release.rst +0 -0
  64. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/developer/how-to/pin-requirements.rst +0 -0
  65. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/developer/how-to/run-tests.rst +0 -0
  66. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/developer/how-to/static-analysis.rst +0 -0
  67. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/developer/how-to/test-container.rst +0 -0
  68. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/developer/how-to/update-tools.rst +0 -0
  69. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/developer/index.rst +0 -0
  70. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/developer/reference/standards.rst +0 -0
  71. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/developer/tutorials/dev-install.rst +0 -0
  72. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/genindex.rst +0 -0
  73. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/images/dls-favicon.ico +0 -0
  74. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/images/dls-logo.svg +0 -0
  75. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/images/ec-logs.png +0 -0
  76. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/images/ec-web.png +0 -0
  77. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/index.rst +0 -0
  78. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/user/explanations/docs-structure.rst +0 -0
  79. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/user/how-to/run-container.rst +0 -0
  80. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/user/index.rst +0 -0
  81. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/user/reference/api.rst +0 -0
  82. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/docs/user/tutorials/installation.rst +0 -0
  83. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/setup.cfg +0 -0
  84. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/__init__.py +0 -0
  85. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/__main__.py +0 -0
  86. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/backend.py +0 -0
  87. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/cmds/__init__.py +0 -0
  88. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/cmds/monitor.tcss +0 -0
  89. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/definitions.py +0 -0
  90. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/globals.py +0 -0
  91. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli/logging.py +0 -0
  92. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli.egg-info/dependency_links.txt +0 -0
  93. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli.egg-info/entry_points.txt +0 -0
  94. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/src/edge_containers_cli.egg-info/top_level.txt +0 -0
  95. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/__init__.py +0 -0
  96. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/data/bl01t-deployment/apps/values.yaml +0 -0
  97. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/data/bl01t-services/services/bl01t-ea-test-01/Chart.yaml +0 -0
  98. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/data/bl01t-services/services/bl01t-ea-test-01/config/ioc.db +0 -0
  99. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/data/bl01t-services/services/bl01t-ea-test-01/config/ioc.yaml +0 -0
  100. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/data/bl01t-services/services/bl01t-ea-test-01/templates/configmap.yaml +0 -0
  101. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/data/bl01t-services/services/bl01t-ea-test-01/values.yaml +0 -0
  102. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/data/bl01t-services/services/bl01t-ea-test-02/Chart.yaml +0 -0
  103. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/data/bl01t-services/services/bl01t-ea-test-02/values.yaml +0 -0
  104. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/data/bl01t-services/services/dls-aravis/Chart.yaml +0 -0
  105. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/data/bl01t-services/services/dls-aravis/config/ioc.yaml +0 -0
  106. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/data/bl01t-services/services/dls-aravis/templates/configmap.yaml +0 -0
  107. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/data/bl01t-services/services/dls-aravis/values.yaml +0 -0
  108. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/data/bl01t-services/services/values.yaml +0 -0
  109. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/data/cli.yaml +0 -0
  110. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/data/k8s.yaml +0 -0
  111. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/data/yaml.yaml +0 -0
  112. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/test_cli.py +0 -0
  113. {edge_containers_cli-5.0.1b2 → edge_containers_cli-5.2.0}/tests/test_unit.py +0 -0
@@ -1,5 +1,5 @@
1
1
  # Changes here will be overwritten by Copier
2
- _commit: 5.0.0a3-3-g238de53
2
+ _commit: 5.0.2
3
3
  _src_path: gh:DiamondLightSource/python-copier-template
4
4
  author_email: giles.knap@gmail.com
5
5
  author_name: Giles Knap
@@ -24,4 +24,4 @@ It is recommended that developers use a [vscode devcontainer](https://code.visua
24
24
 
25
25
  This project was created using the [Diamond Light Source Copier Template](https://github.com/DiamondLightSource/python-copier-template) for Python projects.
26
26
 
27
- For more information on common tasks like setting up a developer environment, running the tests, and setting a pre-commit hook, see the template's [How-to guides](https://diamondlightsource.github.io/python-copier-template/5.0.0a3/how-to.html).
27
+ For more information on common tasks like setting up a developer environment, running the tests, and setting a pre-commit hook, see the template's [How-to guides](https://diamondlightsource.github.io/python-copier-template/5.0.2/how-to.html).
@@ -9,9 +9,6 @@ on:
9
9
  type: string
10
10
  description: The runner to run this job on
11
11
  required: true
12
- secrets:
13
- CODECOV_TOKEN:
14
- required: true
15
12
 
16
13
  env:
17
14
  # https://github.com/pytest-dev/pytest/issues/2042
@@ -40,5 +37,3 @@ jobs:
40
37
  with:
41
38
  name: ${{ inputs.python-version }}/${{ inputs.runs-on }}
42
39
  files: cov.xml
43
- env:
44
- CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
@@ -25,8 +25,6 @@ jobs:
25
25
  with:
26
26
  runs-on: ${{ matrix.runs-on }}
27
27
  python-version: ${{ matrix.python-version }}
28
- secrets:
29
- CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
30
28
 
31
29
  container:
32
30
  needs: test
@@ -3,7 +3,7 @@ repos:
3
3
  rev: v5.0.0
4
4
  hooks:
5
5
  - id: check-added-large-files
6
- args: ["--maxkb=1000"] # uv.lock is more than 500kB
6
+ exclude: ^uv.lock
7
7
  - id: check-yaml
8
8
  # omit helm templates which are not valid yaml
9
9
  exclude: ^.*configmap.yaml$
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: edge-containers-cli
3
- Version: 5.0.1b2
3
+ Version: 5.2.0
4
4
  Summary: CLI for deploying and managing epics containers IOCs and services
5
5
  Author-email: Giles Knap <giles.knap@gmail.com>
6
6
  License: Apache License
@@ -220,7 +220,7 @@ Requires-Dist: requests
220
220
  Requires-Dist: ruamel.yaml
221
221
  Requires-Dist: jinja2
222
222
  Requires-Dist: polars-lts-cpu
223
- Requires-Dist: textual
223
+ Requires-Dist: textual>=7.4
224
224
  Requires-Dist: urllib3<2.4.0
225
225
  Dynamic: license-file
226
226
 
@@ -20,7 +20,7 @@ dependencies = [
20
20
  "ruamel.yaml",
21
21
  "jinja2",
22
22
  "polars-lts-cpu",
23
- "textual",
23
+ "textual>=7.4",
24
24
  # urllib>=2.4.0 fails to validate DLS Kubernetes certificates
25
25
  # https://github.com/kubernetes-client/python/issues/2394
26
26
  "urllib3<2.4.0",
@@ -117,7 +117,7 @@ commands = [
117
117
  [
118
118
  "pyright",
119
119
  "--pythonpath",
120
- ".venv/bin/python",
120
+ "{env:VIRTUAL_ENV}/bin/python",
121
121
  "src",
122
122
  "tests",
123
123
  { replace = "posargs", default = [
@@ -0,0 +1,40 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "extends": [
4
+ "config:recommended"
5
+ ],
6
+ "lockFileMaintenance": {
7
+ "description": "Keep uv.lock up to date, merging if tests pass",
8
+ "enabled": true,
9
+ "automerge": true
10
+ },
11
+ "packageRules": [
12
+ {
13
+ "description": "Disable python version as that is managed by python-copier-template",
14
+ "matchManagers": [
15
+ "pyenv"
16
+ ],
17
+ "enabled": false
18
+ },
19
+ {
20
+ "description": "Disable github actions that are managed by python-copier-template",
21
+ "matchPackageNames": [
22
+ "actions/checkout",
23
+ "astral-sh/setup-uv",
24
+ "actions/upload-artifact",
25
+ "actions/download-artifact",
26
+ "softprops/action-gh-release",
27
+ "codecov/codecov-action",
28
+ "docker/setup-buildx-action",
29
+ "docker/login-action",
30
+ "docker/build-push-action",
31
+ "docker/metadata-action",
32
+ "pypa/gh-action-pypi-publish"
33
+ ],
34
+ "matchManagers": [
35
+ "github-actions"
36
+ ],
37
+ "enabled": false
38
+ }
39
+ ]
40
+ }
@@ -0,0 +1,24 @@
1
+ # file generated by vcs-versioning
2
+ # don't change, don't track in version control
3
+ from __future__ import annotations
4
+
5
+ __all__ = [
6
+ "__version__",
7
+ "__version_tuple__",
8
+ "version",
9
+ "version_tuple",
10
+ "__commit_id__",
11
+ "commit_id",
12
+ ]
13
+
14
+ version: str
15
+ __version__: str
16
+ __version_tuple__: tuple[int | str, ...]
17
+ version_tuple: tuple[int | str, ...]
18
+ commit_id: str | None
19
+ __commit_id__: str | None
20
+
21
+ __version__ = version = '5.2.0'
22
+ __version_tuple__ = version_tuple = (5, 2, 0)
23
+
24
+ __commit_id__ = commit_id = 'g400995ffa'
@@ -9,7 +9,12 @@ from edge_containers_cli.cmds.commands import CommandError
9
9
  from edge_containers_cli.definitions import ECContext
10
10
  from edge_containers_cli.git import GitError, create_version_map
11
11
  from edge_containers_cli.shell import ShellError
12
- from edge_containers_cli.utils import cache_dict, new_workdir, read_cached_dict
12
+ from edge_containers_cli.utils import (
13
+ _run_async,
14
+ cache_dict,
15
+ new_workdir,
16
+ read_cached_dict,
17
+ )
13
18
 
14
19
 
15
20
  def url_encode(in_string: str) -> str:
@@ -32,11 +37,13 @@ def fetch_service_graph(repo: str) -> dict:
32
37
  )
33
38
  if not version_map:
34
39
  with new_workdir() as path:
35
- version_map = create_version_map(
36
- repo,
37
- Path(globals.SERVICES_DIR),
38
- path,
39
- shared_files=[globals.SHARED_VALUES],
40
+ version_map = _run_async(
41
+ create_version_map(
42
+ repo,
43
+ Path(globals.SERVICES_DIR),
44
+ path,
45
+ shared_files=[globals.SHARED_VALUES],
46
+ )
40
47
  )
41
48
  cache_dict(
42
49
  globals.CACHE_ROOT / url_encode(repo),
@@ -1,6 +1,8 @@
1
1
  import os
2
+ import re
2
3
  from pathlib import Path
3
4
 
5
+ import rich
4
6
  import typer
5
7
 
6
8
  import edge_containers_cli.globals as globals
@@ -17,14 +19,26 @@ from edge_containers_cli.definitions import ENV
17
19
  from edge_containers_cli.git import GitError, list_all, list_instances
18
20
  from edge_containers_cli.logging import log
19
21
  from edge_containers_cli.shell import ShellError
22
+ from edge_containers_cli.utils import async_command
20
23
 
21
24
 
22
25
  def confirmation(message: str, yes: bool):
23
- typer.echo(message)
26
+ rich.print(message)
24
27
  if not (yes or typer.confirm("Are you sure?")):
25
28
  raise typer.Abort()
26
29
 
27
30
 
31
+ def _check_description(desc_text: str | None):
32
+ _desc_re = r"^[a-zA-Z0-9](?:(?!--)[a-zA-Z0-9-]){0,62}$"
33
+ if desc_text is not None:
34
+ if not re.match(_desc_re, desc_text):
35
+ raise typer.BadParameter(
36
+ f"The description '{desc_text}' is not kebab-case or uses illegal characters.\n\
37
+ Only alphanumeric characters and '-' are allowed."
38
+ )
39
+ return desc_text
40
+
41
+
28
42
  class ErrorHandlingTyper(typer.Typer):
29
43
  def __call__(self, *args, **kwargs):
30
44
  try:
@@ -38,7 +52,8 @@ cli = ErrorHandlingTyper(pretty_exceptions_show_locals=False)
38
52
 
39
53
 
40
54
  @cli.command()
41
- def attach(
55
+ @async_command
56
+ async def attach(
42
57
  service_name: str = typer.Argument(
43
58
  ...,
44
59
  help="Name of the service to attach to",
@@ -49,11 +64,12 @@ def attach(
49
64
  """
50
65
  Attach to the console of a live service
51
66
  """
52
- backend.commands.attach(service_name)
67
+ await backend.commands.attach(service_name)
53
68
 
54
69
 
55
70
  @cli.command()
56
- def delete(
71
+ @async_command
72
+ async def delete(
57
73
  service_name: str = typer.Argument(
58
74
  ...,
59
75
  help="Name of the service to delete",
@@ -69,11 +85,12 @@ def delete(
69
85
  f"Remove {service_name} from the target `{backend.commands.target}`",
70
86
  yes,
71
87
  )
72
- backend.commands.delete(service_name)
88
+ await backend.commands.delete(service_name)
73
89
 
74
90
 
75
91
  @cli.command()
76
- def deploy(
92
+ @async_command
93
+ async def deploy(
77
94
  service_name: str = typer.Argument(
78
95
  ...,
79
96
  help="Name of the service to deploy",
@@ -86,6 +103,12 @@ def deploy(
86
103
  autocompletion=avail_versions,
87
104
  show_default=False,
88
105
  ),
106
+ description: str | None = typer.Option(
107
+ None,
108
+ "--desc",
109
+ help="Custom description label for the service",
110
+ callback=_check_description,
111
+ ),
89
112
  wait: bool = typer.Option(False, "--wait", help="Waits for readiness"),
90
113
  yes: bool = typer.Option(False, "-y", "--yes", help="Skip confirmation prompt"),
91
114
  args: str = typer.Option(
@@ -96,20 +119,28 @@ def deploy(
96
119
  Add a service to the cluster from its source repository
97
120
  """
98
121
 
99
- def confirm_callback(svc_version):
122
+ def confirm_callback(svc_version: str, current_desc: str | None):
123
+ message = (
124
+ f"[bold]Deploy [white]{service_name.lower()}[/white]"
125
+ f" version [white]{svc_version}[/white] to target [white]{backend.commands.target}[/white] with \
126
+ {'existing ' if description is None else ''}description [white]{current_desc}[/white][/bold]"
127
+ )
128
+
100
129
  confirmation(
101
- f"Deploy {service_name.lower()} "
102
- f" version `{svc_version}` to target `{backend.commands.target}`",
130
+ message,
103
131
  yes,
104
132
  )
105
133
 
106
134
  args = args if not wait else args + " --wait"
107
135
  version = version if version != "latest tag" else ""
108
- backend.commands.deploy(service_name, version, args, confirm_callback)
136
+ await backend.commands.deploy(
137
+ service_name, version, description, args, confirm_callback
138
+ )
109
139
 
110
140
 
111
141
  @cli.command()
112
- def deploy_local(
142
+ @async_command
143
+ async def deploy_local(
113
144
  svc_instance: Path = typer.Argument(
114
145
  ...,
115
146
  help="folder of local service definition",
@@ -133,7 +164,7 @@ def deploy_local(
133
164
  yes,
134
165
  )
135
166
 
136
- backend.commands.deploy_local(svc_instance, args, confirm_callback)
167
+ await backend.commands.deploy_local(svc_instance, args, confirm_callback)
137
168
 
138
169
 
139
170
  @cli.command()
@@ -144,7 +175,8 @@ def env():
144
175
 
145
176
 
146
177
  @cli.command()
147
- def exec(
178
+ @async_command
179
+ async def exec(
148
180
  service_name: str = typer.Argument(
149
181
  ...,
150
182
  help="Name of the service container to run in",
@@ -153,11 +185,12 @@ def exec(
153
185
  ),
154
186
  ):
155
187
  """Execute a bash prompt in a running container"""
156
- backend.commands.exec(service_name)
188
+ await backend.commands.exec(service_name)
157
189
 
158
190
 
159
191
  @cli.command()
160
- def instances(
192
+ @async_command
193
+ async def instances(
161
194
  service_name: str = typer.Argument(
162
195
  ...,
163
196
  help="Name of the service to inspect",
@@ -167,7 +200,7 @@ def instances(
167
200
  ):
168
201
  """List all versions of the specified service in the repository"""
169
202
  print(
170
- list_instances(
203
+ await list_instances(
171
204
  service_name,
172
205
  backend.commands.repo,
173
206
  Path(globals.SERVICES_DIR),
@@ -177,10 +210,11 @@ def instances(
177
210
 
178
211
 
179
212
  @cli.command(name="list")
180
- def _list():
213
+ @async_command
214
+ async def _list():
181
215
  """List all services available in the service repository"""
182
216
  print(
183
- list_all(
217
+ await list_all(
184
218
  backend.commands.repo,
185
219
  Path(globals.SERVICES_DIR),
186
220
  shared_files=[globals.SHARED_VALUES],
@@ -189,7 +223,8 @@ def _list():
189
223
 
190
224
 
191
225
  @cli.command()
192
- def log_history(
226
+ @async_command
227
+ async def log_history(
193
228
  service_name: str = typer.Argument(
194
229
  ...,
195
230
  help="Name of the service to inspect",
@@ -198,11 +233,12 @@ def log_history(
198
233
  ),
199
234
  ):
200
235
  """Open historical logs for a service"""
201
- backend.commands.log_history(service_name)
236
+ await backend.commands.log_history(service_name)
202
237
 
203
238
 
204
239
  @cli.command()
205
- def logs(
240
+ @async_command
241
+ async def logs(
206
242
  service_name: str = typer.Argument(
207
243
  ...,
208
244
  help="Name of the service to inspect",
@@ -217,7 +253,7 @@ def logs(
217
253
  ),
218
254
  ):
219
255
  """Show logs for current and previous instances of a service"""
220
- backend.commands.logs(service_name, prev)
256
+ await backend.commands.logs(service_name, prev)
221
257
 
222
258
 
223
259
  @cli.command()
@@ -246,7 +282,8 @@ def ps(
246
282
 
247
283
 
248
284
  @cli.command()
249
- def restart(
285
+ @async_command
286
+ async def restart(
250
287
  service_name: str = typer.Argument(
251
288
  ...,
252
289
  help="Name of the container to restart",
@@ -255,47 +292,54 @@ def restart(
255
292
  ),
256
293
  ):
257
294
  """Restart a service"""
258
- backend.commands.restart(service_name)
295
+ await backend.commands.restart(service_name)
259
296
 
260
297
 
261
298
  @cli.command()
262
- def start(
299
+ @async_command
300
+ async def start(
263
301
  service_name: str = typer.Argument(
264
302
  ...,
265
303
  help="Name of the service container to start",
266
304
  autocompletion=all_svc,
267
305
  show_default=False,
268
306
  ),
269
- commit: bool = typer.Option(True, help="Commits the values to the git repo"),
307
+ commit: bool = typer.Option(
308
+ False, help="Also commit the change to the git repo for an audit trail"
309
+ ),
270
310
  ):
271
311
  """Start a service"""
272
312
  try:
273
- backend.commands.start(service_name, commit=commit)
313
+ await backend.commands.start(service_name, commit=commit)
274
314
  except GitError as e:
275
315
  msg = f"{str(e)} - Commit failed. Try 'ec start <service> --no-commit to set values without updating git"
276
316
  raise GitError(msg) from e
277
317
 
278
318
 
279
319
  @cli.command()
280
- def stop(
320
+ @async_command
321
+ async def stop(
281
322
  service_name: str = typer.Argument(
282
323
  ...,
283
324
  help="Name of the service container to stop",
284
325
  autocompletion=running_svc,
285
326
  show_default=False,
286
327
  ),
287
- commit: bool = typer.Option(True, help="Commits the values to the git repo"),
328
+ commit: bool = typer.Option(
329
+ False, help="Also commit the change to the git repo for an audit trail"
330
+ ),
288
331
  ):
289
332
  """Stop a service"""
290
333
  try:
291
- backend.commands.stop(service_name, commit=commit)
334
+ await backend.commands.stop(service_name, commit=commit)
292
335
  except GitError as e:
293
336
  msg = f"{str(e)} - Commit failed. Try ec stop <service> --no-commit to set values without updating git"
294
337
  raise GitError(msg) from e
295
338
 
296
339
 
297
340
  @cli.command()
298
- def template(
341
+ @async_command
342
+ async def template(
299
343
  svc_instance: Path = typer.Argument(
300
344
  ...,
301
345
  help="folder of local service definition",
@@ -311,7 +355,7 @@ def template(
311
355
  Print out the helm template generated from a local service instance
312
356
  """
313
357
  args = f"{args} --debug"
314
- backend.commands.template(svc_instance, args)
358
+ await backend.commands.template(svc_instance, args)
315
359
 
316
360
 
317
361
  def drop_methods(ctx: typer.Context, to_drop: list[str]):