nextmv 0.39.0.dev1__py3-none-any.whl → 1.0.0__py3-none-any.whl

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 (161) hide show
  1. nextmv/__about__.py +1 -1
  2. nextmv/__entrypoint__.py +1 -2
  3. nextmv/__init__.py +2 -4
  4. nextmv/cli/CONTRIBUTING.md +583 -0
  5. nextmv/cli/cloud/__init__.py +49 -0
  6. nextmv/cli/cloud/acceptance/__init__.py +27 -0
  7. nextmv/cli/cloud/acceptance/create.py +391 -0
  8. nextmv/cli/cloud/acceptance/delete.py +64 -0
  9. nextmv/cli/cloud/acceptance/get.py +103 -0
  10. nextmv/cli/cloud/acceptance/list.py +62 -0
  11. nextmv/cli/cloud/acceptance/update.py +95 -0
  12. nextmv/cli/cloud/account/__init__.py +28 -0
  13. nextmv/cli/cloud/account/create.py +83 -0
  14. nextmv/cli/cloud/account/delete.py +59 -0
  15. nextmv/cli/cloud/account/get.py +66 -0
  16. nextmv/cli/cloud/account/update.py +70 -0
  17. nextmv/cli/cloud/app/__init__.py +35 -0
  18. nextmv/cli/cloud/app/create.py +140 -0
  19. nextmv/cli/cloud/app/delete.py +57 -0
  20. nextmv/cli/cloud/app/exists.py +44 -0
  21. nextmv/cli/cloud/app/get.py +66 -0
  22. nextmv/cli/cloud/app/list.py +61 -0
  23. nextmv/cli/cloud/app/push.py +432 -0
  24. nextmv/cli/cloud/app/update.py +124 -0
  25. nextmv/cli/cloud/batch/__init__.py +29 -0
  26. nextmv/cli/cloud/batch/create.py +452 -0
  27. nextmv/cli/cloud/batch/delete.py +64 -0
  28. nextmv/cli/cloud/batch/get.py +104 -0
  29. nextmv/cli/cloud/batch/list.py +63 -0
  30. nextmv/cli/cloud/batch/metadata.py +66 -0
  31. nextmv/cli/cloud/batch/update.py +95 -0
  32. nextmv/cli/cloud/data/__init__.py +26 -0
  33. nextmv/cli/cloud/data/upload.py +162 -0
  34. nextmv/cli/cloud/ensemble/__init__.py +33 -0
  35. nextmv/cli/cloud/ensemble/create.py +413 -0
  36. nextmv/cli/cloud/ensemble/delete.py +63 -0
  37. nextmv/cli/cloud/ensemble/get.py +65 -0
  38. nextmv/cli/cloud/ensemble/list.py +63 -0
  39. nextmv/cli/cloud/ensemble/update.py +103 -0
  40. nextmv/cli/cloud/input_set/__init__.py +32 -0
  41. nextmv/cli/cloud/input_set/create.py +168 -0
  42. nextmv/cli/cloud/input_set/delete.py +64 -0
  43. nextmv/cli/cloud/input_set/get.py +63 -0
  44. nextmv/cli/cloud/input_set/list.py +63 -0
  45. nextmv/cli/cloud/input_set/update.py +123 -0
  46. nextmv/cli/cloud/instance/__init__.py +35 -0
  47. nextmv/cli/cloud/instance/create.py +289 -0
  48. nextmv/cli/cloud/instance/delete.py +61 -0
  49. nextmv/cli/cloud/instance/exists.py +39 -0
  50. nextmv/cli/cloud/instance/get.py +62 -0
  51. nextmv/cli/cloud/instance/list.py +60 -0
  52. nextmv/cli/cloud/instance/update.py +216 -0
  53. nextmv/cli/cloud/managed_input/__init__.py +31 -0
  54. nextmv/cli/cloud/managed_input/create.py +144 -0
  55. nextmv/cli/cloud/managed_input/delete.py +64 -0
  56. nextmv/cli/cloud/managed_input/get.py +63 -0
  57. nextmv/cli/cloud/managed_input/list.py +60 -0
  58. nextmv/cli/cloud/managed_input/update.py +97 -0
  59. nextmv/cli/cloud/run/__init__.py +37 -0
  60. nextmv/cli/cloud/run/cancel.py +37 -0
  61. nextmv/cli/cloud/run/create.py +524 -0
  62. nextmv/cli/cloud/run/get.py +199 -0
  63. nextmv/cli/cloud/run/input.py +86 -0
  64. nextmv/cli/cloud/run/list.py +80 -0
  65. nextmv/cli/cloud/run/logs.py +166 -0
  66. nextmv/cli/cloud/run/metadata.py +67 -0
  67. nextmv/cli/cloud/run/track.py +500 -0
  68. nextmv/cli/cloud/scenario/__init__.py +29 -0
  69. nextmv/cli/cloud/scenario/create.py +451 -0
  70. nextmv/cli/cloud/scenario/delete.py +61 -0
  71. nextmv/cli/cloud/scenario/get.py +102 -0
  72. nextmv/cli/cloud/scenario/list.py +63 -0
  73. nextmv/cli/cloud/scenario/metadata.py +67 -0
  74. nextmv/cli/cloud/scenario/update.py +93 -0
  75. nextmv/cli/cloud/secrets/__init__.py +33 -0
  76. nextmv/cli/cloud/secrets/create.py +206 -0
  77. nextmv/cli/cloud/secrets/delete.py +63 -0
  78. nextmv/cli/cloud/secrets/get.py +66 -0
  79. nextmv/cli/cloud/secrets/list.py +60 -0
  80. nextmv/cli/cloud/secrets/update.py +144 -0
  81. nextmv/cli/cloud/shadow/__init__.py +33 -0
  82. nextmv/cli/cloud/shadow/create.py +184 -0
  83. nextmv/cli/cloud/shadow/delete.py +64 -0
  84. nextmv/cli/cloud/shadow/get.py +61 -0
  85. nextmv/cli/cloud/shadow/list.py +63 -0
  86. nextmv/cli/cloud/shadow/metadata.py +66 -0
  87. nextmv/cli/cloud/shadow/start.py +43 -0
  88. nextmv/cli/cloud/shadow/stop.py +53 -0
  89. nextmv/cli/cloud/shadow/update.py +96 -0
  90. nextmv/cli/cloud/switchback/__init__.py +33 -0
  91. nextmv/cli/cloud/switchback/create.py +151 -0
  92. nextmv/cli/cloud/switchback/delete.py +64 -0
  93. nextmv/cli/cloud/switchback/get.py +62 -0
  94. nextmv/cli/cloud/switchback/list.py +63 -0
  95. nextmv/cli/cloud/switchback/metadata.py +68 -0
  96. nextmv/cli/cloud/switchback/start.py +43 -0
  97. nextmv/cli/cloud/switchback/stop.py +53 -0
  98. nextmv/cli/cloud/switchback/update.py +96 -0
  99. nextmv/cli/cloud/upload/__init__.py +22 -0
  100. nextmv/cli/cloud/upload/create.py +39 -0
  101. nextmv/cli/cloud/version/__init__.py +33 -0
  102. nextmv/cli/cloud/version/create.py +96 -0
  103. nextmv/cli/cloud/version/delete.py +61 -0
  104. nextmv/cli/cloud/version/exists.py +39 -0
  105. nextmv/cli/cloud/version/get.py +62 -0
  106. nextmv/cli/cloud/version/list.py +60 -0
  107. nextmv/cli/cloud/version/update.py +92 -0
  108. nextmv/cli/community/__init__.py +24 -0
  109. nextmv/cli/community/clone.py +86 -0
  110. nextmv/cli/community/list.py +200 -0
  111. nextmv/cli/configuration/__init__.py +23 -0
  112. nextmv/cli/configuration/config.py +228 -0
  113. nextmv/cli/configuration/create.py +94 -0
  114. nextmv/cli/configuration/delete.py +67 -0
  115. nextmv/cli/configuration/list.py +77 -0
  116. nextmv/cli/confirm.py +34 -0
  117. nextmv/cli/main.py +161 -3
  118. nextmv/cli/message.py +170 -0
  119. nextmv/cli/options.py +220 -0
  120. nextmv/cli/version.py +22 -2
  121. nextmv/cloud/__init__.py +17 -38
  122. nextmv/cloud/acceptance_test.py +20 -83
  123. nextmv/cloud/account.py +269 -30
  124. nextmv/cloud/application/__init__.py +898 -0
  125. nextmv/cloud/application/_acceptance.py +424 -0
  126. nextmv/cloud/application/_batch_scenario.py +845 -0
  127. nextmv/cloud/application/_ensemble.py +251 -0
  128. nextmv/cloud/application/_input_set.py +263 -0
  129. nextmv/cloud/application/_instance.py +289 -0
  130. nextmv/cloud/application/_managed_input.py +227 -0
  131. nextmv/cloud/application/_run.py +1393 -0
  132. nextmv/cloud/application/_secrets.py +294 -0
  133. nextmv/cloud/application/_shadow.py +320 -0
  134. nextmv/cloud/application/_switchback.py +332 -0
  135. nextmv/cloud/application/_utils.py +54 -0
  136. nextmv/cloud/application/_version.py +304 -0
  137. nextmv/cloud/batch_experiment.py +6 -2
  138. nextmv/cloud/community.py +446 -0
  139. nextmv/cloud/instance.py +11 -1
  140. nextmv/cloud/integration.py +8 -5
  141. nextmv/cloud/package.py +50 -9
  142. nextmv/cloud/shadow.py +254 -0
  143. nextmv/cloud/switchback.py +228 -0
  144. nextmv/deprecated.py +5 -3
  145. nextmv/input.py +20 -88
  146. nextmv/local/application.py +3 -15
  147. nextmv/local/runner.py +1 -1
  148. nextmv/model.py +50 -11
  149. nextmv/options.py +11 -256
  150. nextmv/output.py +0 -62
  151. nextmv/polling.py +54 -16
  152. nextmv/run.py +84 -37
  153. nextmv/status.py +1 -51
  154. {nextmv-0.39.0.dev1.dist-info → nextmv-1.0.0.dist-info}/METADATA +37 -11
  155. nextmv-1.0.0.dist-info/RECORD +185 -0
  156. nextmv-1.0.0.dist-info/entry_points.txt +2 -0
  157. nextmv/cloud/application.py +0 -4204
  158. nextmv-0.39.0.dev1.dist-info/RECORD +0 -55
  159. nextmv-0.39.0.dev1.dist-info/entry_points.txt +0 -2
  160. {nextmv-0.39.0.dev1.dist-info → nextmv-1.0.0.dist-info}/WHEEL +0 -0
  161. {nextmv-0.39.0.dev1.dist-info → nextmv-1.0.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,96 @@
1
+ """
2
+ This module defines the cloud switchback update command for the Nextmv CLI.
3
+ """
4
+
5
+ import json
6
+ from typing import Annotated
7
+
8
+ import typer
9
+
10
+ from nextmv.cli.configuration.config import build_app
11
+ from nextmv.cli.message import in_progress, print_json, success
12
+ from nextmv.cli.options import AppIDOption, ProfileOption, SwitchbackTestIDOption
13
+
14
+ # Set up subcommand application.
15
+ app = typer.Typer()
16
+
17
+
18
+ @app.command()
19
+ def update(
20
+ app_id: AppIDOption,
21
+ switchback_test_id: SwitchbackTestIDOption,
22
+ description: Annotated[
23
+ str | None,
24
+ typer.Option(
25
+ "--description",
26
+ "-d",
27
+ help="Updated description of the switchback test.",
28
+ metavar="DESCRIPTION",
29
+ ),
30
+ ] = None,
31
+ name: Annotated[
32
+ str | None,
33
+ typer.Option(
34
+ "--name",
35
+ "-n",
36
+ help="Updated name of the switchback test.",
37
+ metavar="NAME",
38
+ ),
39
+ ] = None,
40
+ output: Annotated[
41
+ str | None,
42
+ typer.Option(
43
+ "--output",
44
+ "-o",
45
+ help="Saves the updated switchback test information to this location.",
46
+ metavar="OUTPUT_PATH",
47
+ ),
48
+ ] = None,
49
+ profile: ProfileOption = None,
50
+ ) -> None:
51
+ """
52
+ Update a Nextmv Cloud switchback test.
53
+
54
+ Update the name and/or description of a switchback test. Any fields not
55
+ specified will remain unchanged.
56
+
57
+ [bold][underline]Examples[/underline][/bold]
58
+
59
+ - Update the name of a switchback test.
60
+ $ [dim]nextmv cloud switchback update --app-id hare-app --switchback-test-id carrot-feast \\
61
+ --name "Spring Carrot Harvest"[/dim]
62
+
63
+ - Update the description of a switchback test.
64
+ $ [dim]nextmv cloud switchback update --app-id hare-app --switchback-test-id bunny-hop-routes \\
65
+ --description "Optimizing hop paths through the meadow"[/dim]
66
+
67
+ - Update both name and description and save the result.
68
+ $ [dim]nextmv cloud switchback update --app-id hare-app --switchback-test-id lettuce-delivery \\
69
+ --name "Warren Lettuce Express" --description "Fast lettuce delivery to all burrows" \\
70
+ --output updated-switchback-test.json[/dim]
71
+ """
72
+
73
+ cloud_app = build_app(app_id=app_id, profile=profile)
74
+
75
+ in_progress(msg="Updating switchback test...")
76
+ switchback_test = cloud_app.update_switchback_test(
77
+ switchback_test_id=switchback_test_id,
78
+ name=name,
79
+ description=description,
80
+ )
81
+
82
+ switchback_test_dict = switchback_test.to_dict()
83
+ success(
84
+ f"Switchback test [magenta]{switchback_test_id}[/magenta] updated successfully "
85
+ f"in application [magenta]{app_id}[/magenta]."
86
+ )
87
+
88
+ if output is not None and output != "":
89
+ with open(output, "w") as f:
90
+ json.dump(switchback_test_dict, f, indent=2)
91
+
92
+ success(msg=f"Updated switchback test information saved to [magenta]{output}[/magenta].")
93
+
94
+ return
95
+
96
+ print_json(switchback_test_dict)
@@ -0,0 +1,22 @@
1
+ """
2
+ This module defines the cloud upload command tree for the Nextmv CLI.
3
+ """
4
+
5
+ import typer
6
+
7
+ from nextmv.cli.cloud.upload.create import app as create_app
8
+
9
+ # Set up subcommand application.
10
+ app = typer.Typer()
11
+ app.add_typer(create_app)
12
+
13
+
14
+ @app.callback()
15
+ def callback() -> None:
16
+ """
17
+ Create temporary upload URLs for Nextmv Cloud applications.
18
+
19
+ When data is too large, or you are working with multiple files, you can use
20
+ upload URLs to upload data directly to Nextmv Cloud storage.
21
+ """
22
+ pass
@@ -0,0 +1,39 @@
1
+ """
2
+ This module defines the cloud upload create command for the Nextmv CLI.
3
+ """
4
+
5
+ import typer
6
+
7
+ from nextmv.cli.configuration.config import build_app
8
+ from nextmv.cli.message import in_progress, print_json, success
9
+ from nextmv.cli.options import AppIDOption, ProfileOption
10
+
11
+ # Set up subcommand application.
12
+ app = typer.Typer()
13
+
14
+
15
+ @app.command()
16
+ def create(
17
+ app_id: AppIDOption,
18
+ profile: ProfileOption = None,
19
+ ) -> None:
20
+ """
21
+ Create a new Nextmv Cloud application upload URL.
22
+
23
+ [bold][underline]Examples[/underline][/bold]
24
+
25
+ - Create an upload URL for application [magenta]hare-app[/magenta].
26
+ $ [dim]nextmv cloud upload create --app-id hare-app[/dim]
27
+
28
+ - Create an upload URL for application [magenta]hare-app[/magenta] using profile [magenta]hare[/magenta].
29
+ $ [dim]nextmv cloud upload create --app-id hare-app --profile hare[/dim]
30
+ """
31
+
32
+ cloud_app = build_app(app_id=app_id, profile=profile)
33
+ in_progress(msg="Creating upload URL...")
34
+ upload_url = cloud_app.upload_url()
35
+ success(
36
+ f"Upload URL created for application [magenta]{app_id}[/magenta]. "
37
+ "This URL is valid for [magenta]10 minutes[/magenta]."
38
+ )
39
+ print_json(upload_url.to_dict())
@@ -0,0 +1,33 @@
1
+ """
2
+ This module defines the cloud version command tree for the Nextmv CLI.
3
+ """
4
+
5
+ import typer
6
+
7
+ from nextmv.cli.cloud.version.create import app as create_app
8
+ from nextmv.cli.cloud.version.delete import app as delete_app
9
+ from nextmv.cli.cloud.version.exists import app as exists_app
10
+ from nextmv.cli.cloud.version.get import app as get_app
11
+ from nextmv.cli.cloud.version.list import app as list_app
12
+ from nextmv.cli.cloud.version.update import app as update_app
13
+
14
+ # Set up subcommand application.
15
+ app = typer.Typer()
16
+ app.add_typer(create_app)
17
+ app.add_typer(delete_app)
18
+ app.add_typer(exists_app)
19
+ app.add_typer(get_app)
20
+ app.add_typer(list_app)
21
+ app.add_typer(update_app)
22
+
23
+
24
+ @app.callback()
25
+ def callback() -> None:
26
+ """
27
+ Create and manage Nextmv Cloud application versions.
28
+
29
+ A version represents a snapshot of an application's code at a specific
30
+ point in time. Versions are used to track changes to the decision model.
31
+ You can think of versions as Git tags for your Nextmv Cloud applications.
32
+ """
33
+ pass
@@ -0,0 +1,96 @@
1
+ """
2
+ This module defines the cloud version create command for the Nextmv CLI.
3
+ """
4
+
5
+ from typing import Annotated
6
+
7
+ import typer
8
+
9
+ from nextmv.cli.configuration.config import build_app
10
+ from nextmv.cli.message import in_progress, print_json
11
+ from nextmv.cli.options import AppIDOption, ProfileOption
12
+
13
+ # Set up subcommand application.
14
+ app = typer.Typer()
15
+
16
+
17
+ @app.command()
18
+ def create(
19
+ app_id: AppIDOption,
20
+ description: Annotated[
21
+ str | None,
22
+ typer.Option(
23
+ "--description",
24
+ "-d",
25
+ help="An optional description for the version.",
26
+ metavar="DESCRIPTION",
27
+ ),
28
+ ] = None,
29
+ exist_ok: Annotated[
30
+ bool,
31
+ typer.Option(
32
+ "--exist-ok",
33
+ "-e",
34
+ help="If a version with the given ID already exists, do not raise an error, and simply return it.",
35
+ ),
36
+ ] = False,
37
+ name: Annotated[
38
+ str | None,
39
+ typer.Option(
40
+ "--name",
41
+ "-n",
42
+ help="A name for the version. If a name is not provided, the version ID will be used as the name.",
43
+ metavar="NAME",
44
+ ),
45
+ ] = None,
46
+ version_id: Annotated[
47
+ str | None,
48
+ typer.Option(
49
+ "--version-id",
50
+ "-v",
51
+ help="The ID to assign to the new version. If not provided, a random ID will be generated.",
52
+ envvar="NEXTMV_VERSION_ID",
53
+ metavar="VERSION_ID",
54
+ ),
55
+ ] = None,
56
+ profile: ProfileOption = None,
57
+ ) -> None:
58
+ """
59
+ Create a new Nextmv Cloud application version.
60
+
61
+ Use the --exist-ok flag to avoid errors when creating a version with an ID
62
+ that already exists. This is useful for scripts that need to ensure a
63
+ version exists without worrying about whether it was created previously.
64
+
65
+ [bold][underline]Examples[/underline][/bold]
66
+
67
+ - Create a version for application [magenta]hare-app[/magenta]. A random ID will be generated.
68
+ $ [dim]nextmv cloud version create --app-id hare-app[/dim]
69
+
70
+ - Create a version with a specific name.
71
+ $ [dim]nextmv cloud version create --app-id hare-app --name "v1.0.0"[/dim]
72
+
73
+ - Create a version with a specific ID.
74
+ $ [dim]nextmv cloud version create --app-id hare-app --version-id v1[/dim]
75
+
76
+ - Create a version with a name and description.
77
+ $ [dim]nextmv cloud version create --app-id hare-app --name "v1.0.0" \\
78
+ --description "Initial release with routing optimization"[/dim]
79
+
80
+ - Create a version, or get it if it already exists.
81
+ $ [dim]nextmv cloud version create --app-id hare-app --version-id v1 --exist-ok[/dim]
82
+ """
83
+
84
+ cloud_app = build_app(app_id=app_id, profile=profile)
85
+ if exist_ok:
86
+ in_progress(msg="Creating or getting version...")
87
+ else:
88
+ in_progress(msg="Creating version...")
89
+
90
+ version = cloud_app.new_version(
91
+ id=version_id,
92
+ name=name,
93
+ description=description,
94
+ exist_ok=exist_ok,
95
+ )
96
+ print_json(version.to_dict())
@@ -0,0 +1,61 @@
1
+ """
2
+ This module defines the cloud version delete command for the Nextmv CLI.
3
+ """
4
+
5
+ from typing import Annotated
6
+
7
+ import typer
8
+
9
+ from nextmv.cli.configuration.config import build_app
10
+ from nextmv.cli.confirm import get_confirmation
11
+ from nextmv.cli.message import info, success
12
+ from nextmv.cli.options import AppIDOption, ProfileOption, VersionIDOption
13
+
14
+ # Set up subcommand application.
15
+ app = typer.Typer()
16
+
17
+
18
+ @app.command()
19
+ def delete(
20
+ app_id: AppIDOption,
21
+ version_id: VersionIDOption,
22
+ yes: Annotated[
23
+ bool,
24
+ typer.Option(
25
+ "--yes",
26
+ "-y",
27
+ help="Agree to deletion confirmation prompt. Useful for non-interactive sessions.",
28
+ ),
29
+ ] = False,
30
+ profile: ProfileOption = None,
31
+ ) -> None:
32
+ """
33
+ Deletes a Nextmv Cloud application version.
34
+
35
+ This action is permanent and cannot be undone. Use the --yes
36
+ flag to skip the confirmation prompt.
37
+
38
+ [bold][underline]Examples[/underline][/bold]
39
+
40
+ - Delete the version with the ID [magenta]v1[/magenta] from application [magenta]hare-app[/magenta].
41
+ $ [dim]nextmv cloud version delete --app-id hare-app --version-id v1[/dim]
42
+
43
+ - Delete the version without confirmation prompt.
44
+ $ [dim]nextmv cloud version delete --app-id hare-app --version-id v1 --yes[/dim]
45
+ """
46
+
47
+ if not yes:
48
+ confirm = get_confirmation(
49
+ f"Are you sure you want to delete version [magenta]{version_id}[/magenta] "
50
+ f"from application [magenta]{app_id}[/magenta]? This action cannot be undone.",
51
+ )
52
+
53
+ if not confirm:
54
+ info(f"Version [magenta]{version_id}[/magenta] will not be deleted.")
55
+ return
56
+
57
+ cloud_app = build_app(app_id=app_id, profile=profile)
58
+ cloud_app.delete_version(version_id=version_id)
59
+ success(
60
+ f"Version [magenta]{version_id}[/magenta] deleted successfully from application [magenta]{app_id}[/magenta]."
61
+ )
@@ -0,0 +1,39 @@
1
+ """
2
+ This module defines the cloud version exists command for the Nextmv CLI.
3
+ """
4
+
5
+ import typer
6
+
7
+ from nextmv.cli.configuration.config import build_app
8
+ from nextmv.cli.message import in_progress, print_json
9
+ from nextmv.cli.options import AppIDOption, ProfileOption, VersionIDOption
10
+
11
+ # Set up subcommand application.
12
+ app = typer.Typer()
13
+
14
+
15
+ @app.command()
16
+ def exists(
17
+ app_id: AppIDOption,
18
+ version_id: VersionIDOption,
19
+ profile: ProfileOption = None,
20
+ ) -> None:
21
+ """
22
+ Check if a Nextmv Cloud application version exists.
23
+
24
+ This command is useful in scripting applications to verify the existence of
25
+ a Nextmv Cloud application version by its ID.
26
+
27
+ [bold][underline]Examples[/underline][/bold]
28
+
29
+ - Check if the version with the ID [magenta]v1[/magenta] exists in application [magenta]hare-app[/magenta].
30
+ $ [dim]nextmv cloud version exists --app-id hare-app --version-id v1[/dim]
31
+
32
+ - Check if the version exists using the profile named [magenta]hare[/magenta].
33
+ $ [dim]nextmv cloud version exists --app-id hare-app --version-id v1 --profile hare[/dim]
34
+ """
35
+
36
+ cloud_app = build_app(app_id=app_id, profile=profile)
37
+ in_progress(msg="Checking if version exists...")
38
+ ok = cloud_app.version_exists(version_id=version_id)
39
+ print_json({"exists": ok})
@@ -0,0 +1,62 @@
1
+ """
2
+ This module defines the cloud version get command for the Nextmv CLI.
3
+ """
4
+
5
+ import json
6
+ from typing import Annotated
7
+
8
+ import typer
9
+
10
+ from nextmv.cli.configuration.config import build_app
11
+ from nextmv.cli.message import in_progress, print_json, success
12
+ from nextmv.cli.options import AppIDOption, ProfileOption, VersionIDOption
13
+
14
+ # Set up subcommand application.
15
+ app = typer.Typer()
16
+
17
+
18
+ @app.command()
19
+ def get(
20
+ app_id: AppIDOption,
21
+ version_id: VersionIDOption,
22
+ output: Annotated[
23
+ str | None,
24
+ typer.Option(
25
+ "--output",
26
+ "-o",
27
+ help="Saves the version information to this location.",
28
+ metavar="OUTPUT_PATH",
29
+ ),
30
+ ] = None,
31
+ profile: ProfileOption = None,
32
+ ) -> None:
33
+ """
34
+ Get a Nextmv Cloud application version.
35
+
36
+ This command is useful to get the attributes of an existing Nextmv Cloud
37
+ application version by its ID.
38
+
39
+ [bold][underline]Examples[/underline][/bold]
40
+
41
+ - Get the version with the ID [magenta]v1[/magenta] from application [magenta]hare-app[/magenta].
42
+ $ [dim]nextmv cloud version get --app-id hare-app --version-id v1[/dim]
43
+
44
+ - Get the version with the ID [magenta]v1[/magenta] and save the information to a
45
+ [magenta]version.json[/magenta] file.
46
+ $ [dim]nextmv cloud version get --app-id hare-app --version-id v1 --output version.json[/dim]
47
+ """
48
+
49
+ cloud_app = build_app(app_id=app_id, profile=profile)
50
+ in_progress(msg="Getting version...")
51
+ version = cloud_app.version(version_id=version_id)
52
+ version_dict = version.to_dict()
53
+
54
+ if output is not None and output != "":
55
+ with open(output, "w") as f:
56
+ json.dump(version_dict, f, indent=2)
57
+
58
+ success(msg=f"Version information saved to [magenta]{output}[/magenta].")
59
+
60
+ return
61
+
62
+ print_json(version_dict)
@@ -0,0 +1,60 @@
1
+ """
2
+ This module defines the cloud version list command for the Nextmv CLI.
3
+ """
4
+
5
+ import json
6
+ from typing import Annotated
7
+
8
+ import typer
9
+
10
+ from nextmv.cli.configuration.config import build_app
11
+ from nextmv.cli.message import in_progress, print_json, success
12
+ from nextmv.cli.options import AppIDOption, ProfileOption
13
+
14
+ # Set up subcommand application.
15
+ app = typer.Typer()
16
+
17
+
18
+ @app.command()
19
+ def list(
20
+ app_id: AppIDOption,
21
+ output: Annotated[
22
+ str | None,
23
+ typer.Option(
24
+ "--output",
25
+ "-o",
26
+ help="Saves the version list information to this location.",
27
+ metavar="OUTPUT_PATH",
28
+ ),
29
+ ] = None,
30
+ profile: ProfileOption = None,
31
+ ) -> None:
32
+ """
33
+ List all versions of a Nextmv Cloud application.
34
+
35
+ [bold][underline]Examples[/underline][/bold]
36
+
37
+ - List all versions of application [magenta]hare-app[/magenta].
38
+ $ [dim]nextmv cloud version list --app-id hare-app[/dim]
39
+
40
+ - List all versions using the profile named [magenta]hare[/magenta].
41
+ $ [dim]nextmv cloud version list --app-id hare-app --profile hare[/dim]
42
+
43
+ - List all versions and save the information to a [magenta]versions.json[/magenta] file.
44
+ $ [dim]nextmv cloud version list --app-id hare-app --output versions.json[/dim]
45
+ """
46
+
47
+ cloud_app = build_app(app_id=app_id, profile=profile)
48
+ in_progress(msg="Listing versions...")
49
+ versions = cloud_app.list_versions()
50
+ versions_dicts = [version.to_dict() for version in versions]
51
+
52
+ if output is not None and output != "":
53
+ with open(output, "w") as f:
54
+ json.dump(versions_dicts, f, indent=2)
55
+
56
+ success(msg=f"Version list information saved to [magenta]{output}[/magenta].")
57
+
58
+ return
59
+
60
+ print_json(versions_dicts)
@@ -0,0 +1,92 @@
1
+ """
2
+ This module defines the cloud version update command for the Nextmv CLI.
3
+ """
4
+
5
+ import json
6
+ from typing import Annotated
7
+
8
+ import typer
9
+
10
+ from nextmv.cli.configuration.config import build_app
11
+ from nextmv.cli.message import error, print_json, success
12
+ from nextmv.cli.options import AppIDOption, ProfileOption, VersionIDOption
13
+
14
+ # Set up subcommand application.
15
+ app = typer.Typer()
16
+
17
+
18
+ @app.command()
19
+ def update(
20
+ app_id: AppIDOption,
21
+ version_id: VersionIDOption,
22
+ description: Annotated[
23
+ str | None,
24
+ typer.Option(
25
+ "--description",
26
+ "-d",
27
+ help="A new description for the version.",
28
+ metavar="DESCRIPTION",
29
+ ),
30
+ ] = None,
31
+ name: Annotated[
32
+ str | None,
33
+ typer.Option(
34
+ "--name",
35
+ "-n",
36
+ help="A new name for the version.",
37
+ metavar="NAME",
38
+ ),
39
+ ] = None,
40
+ output: Annotated[
41
+ str | None,
42
+ typer.Option(
43
+ "--output",
44
+ "-o",
45
+ help="Saves the updated version information to this location.",
46
+ metavar="OUTPUT_PATH",
47
+ ),
48
+ ] = None,
49
+ profile: ProfileOption = None,
50
+ ) -> None:
51
+ """
52
+ Updates a Nextmv Cloud application version.
53
+
54
+ [bold][underline]Examples[/underline][/bold]
55
+
56
+ - Update a version's name.
57
+ $ [dim]nextmv cloud version update --app-id hare-app --version-id v1 --name "Version 1.0"[/dim]
58
+
59
+ - Update a version's description.
60
+ $ [dim]nextmv cloud version update --app-id hare-app --version-id v1 \\
61
+ --description "Initial stable release"[/dim]
62
+
63
+ - Update a version's name and description at once.
64
+ $ [dim]nextmv cloud version update --app-id hare-app --version-id v1 \\
65
+ --name "Version 1.0" --description "Initial stable release"[/dim]
66
+
67
+ - Update a version and save the updated information to a [magenta]updated_version.json[/magenta] file.
68
+ $ [dim]nextmv cloud version update --app-id hare-app --version-id v1 \\
69
+ --name "Version 1.0" --output updated_version.json[/dim]
70
+ """
71
+
72
+ if name is None and description is None:
73
+ error("Provide at least one option to update: --name or --description.")
74
+
75
+ cloud_app = build_app(app_id=app_id, profile=profile)
76
+ updated_version = cloud_app.update_version(
77
+ version_id=version_id,
78
+ name=name,
79
+ description=description,
80
+ )
81
+ success(f"Version [magenta]{version_id}[/magenta] updated successfully in application [magenta]{app_id}[/magenta].")
82
+ updated_version_dict = updated_version.to_dict()
83
+
84
+ if output is not None and output != "":
85
+ with open(output, "w") as f:
86
+ json.dump(updated_version_dict, f, indent=2)
87
+
88
+ success(msg=f"Updated version information saved to [magenta]{output}[/magenta].")
89
+
90
+ return
91
+
92
+ print_json(updated_version_dict)
@@ -0,0 +1,24 @@
1
+ """
2
+ This module defines the community command tree for the Nextmv CLI.
3
+ """
4
+
5
+ import typer
6
+
7
+ from nextmv.cli.community.clone import app as clone_app
8
+ from nextmv.cli.community.list import app as list_app
9
+
10
+ # Set up subcommand application.
11
+ app = typer.Typer()
12
+ app.add_typer(clone_app)
13
+ app.add_typer(list_app)
14
+
15
+
16
+ @app.callback()
17
+ def callback() -> None:
18
+ """
19
+ Interact with community apps, which are pre-built decision models.
20
+
21
+ Community apps are maintained in the following GitHub repository:
22
+ [link=https://github.com/nextmv-io/community-apps][bold]nextmv-io/community-apps[/bold][/link].
23
+ """
24
+ pass