nextmv 1.0.0.dev7__py3-none-any.whl → 1.0.0.dev9__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.
@@ -635,7 +635,7 @@ class ApplicationRunMixin:
635
635
  temp_tar_path = os.path.join(tmpdirname, f"{run_id}.tar.gz")
636
636
  with open(temp_tar_path, "wb") as f:
637
637
  f.write(download_response.content)
638
- shutil.unpack_archive(temp_tar_path, output_dir_path)
638
+ shutil.unpack_archive(temp_tar_path, output_dir_path, filter=None)
639
639
 
640
640
  return
641
641
 
@@ -1287,7 +1287,7 @@ class ApplicationRunMixin:
1287
1287
  temp_tar_path = os.path.join(tmpdirname, f"{run_id}.tar.gz")
1288
1288
  with open(temp_tar_path, "wb") as f:
1289
1289
  f.write(download_response.content)
1290
- shutil.unpack_archive(temp_tar_path, output_dir_path)
1290
+ shutil.unpack_archive(temp_tar_path, output_dir_path, filter=None)
1291
1291
  else:
1292
1292
  result.output = download_response.json()
1293
1293
 
@@ -4,7 +4,7 @@ Application mixin for managing shadow tests.
4
4
 
5
5
  from typing import TYPE_CHECKING
6
6
 
7
- from nextmv.cloud.shadow import ShadowTest, ShadowTestMetadata, StartEvents, StopIntent, TerminationEvents
7
+ from nextmv.cloud.shadow import ShadowTest, ShadowTestMetadata, StartEvents, TerminationEvents
8
8
  from nextmv.run import Run
9
9
  from nextmv.safe import safe_id
10
10
 
@@ -248,7 +248,7 @@ class ApplicationShadowMixin:
248
248
  endpoint=f"{self.experiments_endpoint}/shadow/{shadow_test_id}/start",
249
249
  )
250
250
 
251
- def stop_shadow_test(self: "Application", shadow_test_id: str, intent: StopIntent) -> None:
251
+ def stop_shadow_test(self: "Application", shadow_test_id: str) -> None:
252
252
  """
253
253
  Stop a shadow test. The test should already have started before using
254
254
  this method.
@@ -257,22 +257,16 @@ class ApplicationShadowMixin:
257
257
  ----------
258
258
  shadow_test_id : str
259
259
  ID of the shadow test to stop.
260
- intent : StopIntent
261
- Intent for stopping the shadow test.
260
+
262
261
  Raises
263
262
  ------
264
263
  requests.HTTPError
265
264
  If the response status code is not 2xx.
266
265
  """
267
266
 
268
- payload = {
269
- "intent": intent.value,
270
- }
271
-
272
267
  _ = self.client.request(
273
268
  method="PUT",
274
269
  endpoint=f"{self.experiments_endpoint}/shadow/{shadow_test_id}/stop",
275
- payload=payload,
276
270
  )
277
271
 
278
272
  def update_shadow_test(
@@ -5,7 +5,6 @@ Application mixin for managing switchback tests.
5
5
  from datetime import datetime
6
6
  from typing import TYPE_CHECKING
7
7
 
8
- from nextmv.cloud.shadow import StopIntent
9
8
  from nextmv.cloud.switchback import SwitchbackTest, SwitchbackTestMetadata, TestComparisonSingle
10
9
  from nextmv.run import Run
11
10
  from nextmv.safe import safe_id
@@ -217,7 +216,7 @@ class ApplicationSwitchbackMixin:
217
216
  payload = {
218
217
  "id": switchback_test_id,
219
218
  "name": name,
220
- "comparison": comparison.to_dict(),
219
+ "comparison": comparison,
221
220
  "generate_random_plan": {
222
221
  "unit_duration_minutes": unit_duration_minutes,
223
222
  "units": units,
@@ -258,7 +257,7 @@ class ApplicationSwitchbackMixin:
258
257
  endpoint=f"{self.experiments_endpoint}/switchback/{switchback_test_id}/start",
259
258
  )
260
259
 
261
- def stop_switchback_test(self: "Application", switchback_test_id: str, intent: StopIntent) -> None:
260
+ def stop_switchback_test(self: "Application", switchback_test_id: str) -> None:
262
261
  """
263
262
  Stop a switchback test. The test should already have started before using
264
263
  this method.
@@ -268,23 +267,15 @@ class ApplicationSwitchbackMixin:
268
267
  switchback_test_id : str
269
268
  ID of the switchback test to stop.
270
269
 
271
- intent : StopIntent
272
- Intent for stopping the switchback test.
273
-
274
270
  Raises
275
271
  ------
276
272
  requests.HTTPError
277
273
  If the response status code is not 2xx.
278
274
  """
279
275
 
280
- payload = {
281
- "intent": intent.value,
282
- }
283
-
284
276
  _ = self.client.request(
285
277
  method="PUT",
286
278
  endpoint=f"{self.experiments_endpoint}/switchback/{switchback_test_id}/stop",
287
- payload=payload,
288
279
  )
289
280
 
290
281
  def update_switchback_test(
@@ -30,9 +30,7 @@ class ExperimentStatus(str, Enum):
30
30
 
31
31
  You can import the `ExperimentStatus` class directly from `cloud`:
32
32
 
33
- ```python
34
- from nextmv.cloud import ExperimentStatus
35
- ```
33
+ ```python from nextmv.cloud import ExperimentStatus ```
36
34
 
37
35
  This enum represents the comprehensive set of possible states for an
38
36
  experiment in Nextmv Cloud.
@@ -225,12 +225,12 @@ class Integration(BaseModel):
225
225
  def new( # noqa: C901
226
226
  cls,
227
227
  client: Client,
228
+ name: str,
228
229
  integration_type: IntegrationType | str,
229
230
  exec_types: list[ManifestType | str],
230
231
  provider: IntegrationProvider | str,
231
232
  provider_config: dict[str, Any],
232
233
  integration_id: str | None = None,
233
- name: str | None = None,
234
234
  description: str | None = None,
235
235
  is_global: bool = False,
236
236
  application_ids: list[str] | None = None,
@@ -243,6 +243,8 @@ class Integration(BaseModel):
243
243
  ----------
244
244
  client : Client
245
245
  Client to use for interacting with the Nextmv Cloud API.
246
+ name : str
247
+ The name of the integration.
246
248
  integration_type : IntegrationType | str
247
249
  The type of the integration. Please refer to the `IntegrationType`
248
250
  enum for possible values.
@@ -257,9 +259,6 @@ class Integration(BaseModel):
257
259
  integration_id : str, optional
258
260
  The unique identifier of the integration. If not provided,
259
261
  it will be generated automatically.
260
- name : str | None, optional
261
- The name of the integration. If not provided, the integration ID
262
- will be used as the name.
263
262
  description : str, optional
264
263
  An optional description of the integration.
265
264
  is_global : bool, optional, default=False
@@ -303,10 +302,8 @@ class Integration(BaseModel):
303
302
  elif not is_global and application_ids is None:
304
303
  raise ValueError("A non-global integration must have specific application IDs.")
305
304
 
306
- if integration_id is None or integration_id == "":
305
+ if integration_id is None:
307
306
  integration_id = safe_id("integration")
308
- if name is None or name == "":
309
- name = integration_id
310
307
 
311
308
  if exist_ok:
312
309
  try:
nextmv/cloud/shadow.py CHANGED
@@ -19,7 +19,6 @@ ShadowTest
19
19
  """
20
20
 
21
21
  from datetime import datetime
22
- from enum import Enum
23
22
  from typing import Any
24
23
 
25
24
  from pydantic import AliasChoices, Field
@@ -228,27 +227,3 @@ class ShadowTest(BaseModel):
228
227
  """Grouped distributional summaries of the shadow test."""
229
228
  runs: list[Run] | None = None
230
229
  """List of runs in the shadow test."""
231
-
232
-
233
- class StopIntent(str, Enum):
234
- """
235
- Intent for stopping a shadow test.
236
-
237
- You can import the `StopIntent` class directly from `cloud`:
238
-
239
- ```python
240
- from nextmv.cloud import StopIntent
241
- ```
242
-
243
- Attributes
244
- ----------
245
- complete : str
246
- The test is marked as complete.
247
- cancel : str
248
- The test is canceled.
249
- """
250
-
251
- complete = "complete"
252
- """The test is marked as complete."""
253
- cancel = "cancel"
254
- """The test is canceled."""
@@ -45,8 +45,6 @@ class TestComparisonSingle(BaseModel):
45
45
  ID of the candidate instance for comparison.
46
46
  """
47
47
 
48
- __test__ = False # Prevents pytest from collecting this class as a test case
49
-
50
48
  baseline_instance_id: str
51
49
  """ID of the baseline instance for comparison."""
52
50
  candidate_instance_id: str
nextmv/model.py CHANGED
@@ -84,6 +84,9 @@ def _custom_showwarning(message, category, filename, lineno, file=None, line=Non
84
84
  if "mlflow/pyfunc/__init__.py" in filename:
85
85
  return
86
86
 
87
+ if "/mlflow/tracing/provider.py" in filename:
88
+ return
89
+
87
90
  _original_showwarning(message, category, filename, lineno, file, line)
88
91
 
89
92
 
@@ -288,7 +291,6 @@ class Model:
288
291
  ) from e
289
292
 
290
293
  finally:
291
- from mlflow.models import infer_signature
292
294
  from mlflow.pyfunc import PythonModel, save_model
293
295
 
294
296
  class MLFlowModel(PythonModel):
@@ -342,12 +344,13 @@ class Model:
342
344
 
343
345
  _cleanup_python_model(model_dir, configuration, verbose=False)
344
346
 
345
- signature = None
346
- if configuration.options is not None:
347
- options_dict = configuration.options.to_dict()
348
- signature = infer_signature(
349
- params=options_dict,
350
- )
347
+ # signature = None
348
+ # if configuration.options is not None:
349
+ # options_dict = configuration.options.to_dict()
350
+ # signature = infer_signature(
351
+ # model_input={},
352
+ # params=options_dict,
353
+ # )
351
354
 
352
355
  # We use mlflow to save the model to the local filesystem, to be able to
353
356
  # load it later on.
@@ -356,7 +359,7 @@ class Model:
356
359
  path=model_path, # Customize the name of the model location.
357
360
  infer_code_paths=True, # Makes the imports portable.
358
361
  python_model=MLFlowModel(),
359
- signature=signature, # Allows us to work with our own `Options` class.
362
+ # signature=signature, # Allows us to work with our own `Options` class.
360
363
  )
361
364
 
362
365
  # Create an auxiliary requirements file with the model dependencies.
@@ -415,9 +418,9 @@ def _cleanup_python_model(
415
418
  if os.path.exists(model_path):
416
419
  shutil.rmtree(model_path)
417
420
 
418
- mlruns_path = os.path.join(model_dir, "mlruns")
419
- if os.path.exists(mlruns_path):
420
- shutil.rmtree(mlruns_path)
421
+ mlflow_db_path = os.path.join(model_dir, "mlflow.db")
422
+ if os.path.exists(mlflow_db_path):
423
+ os.remove(mlflow_db_path)
421
424
 
422
425
  requirements_file = os.path.join(model_dir, _REQUIREMENTS_FILE)
423
426
  if os.path.exists(requirements_file):
nextmv/options.py CHANGED
@@ -695,7 +695,7 @@ class Options:
695
695
  help=argparse.SUPPRESS,
696
696
  default="1",
697
697
  )
698
- args, _ = parser.parse_known_args()
698
+ args = parser.parse_args()
699
699
 
700
700
  for arg in vars(args):
701
701
  if arg == "fff" or arg == "f":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nextmv
3
- Version: 1.0.0.dev7
3
+ Version: 1.0.0.dev9
4
4
  Summary: The all-purpose Python SDK for Nextmv
5
5
  Project-URL: Homepage, https://www.nextmv.io
6
6
  Project-URL: Documentation, https://nextmv-py.docs.nextmv.io/en/latest/nextmv/
@@ -229,21 +229,18 @@ Requires-Dist: plotly>=6.0.1; extra == 'all'
229
229
  Provides-Extra: dev
230
230
  Requires-Dist: build>=1.0.3; extra == 'dev'
231
231
  Requires-Dist: folium>=0.20.0; extra == 'dev'
232
- Requires-Dist: mlflow>=2.19.0; extra == 'dev'
233
- Requires-Dist: nextpipe>=0.6.0; extra == 'dev'
234
- Requires-Dist: nextroute>=1.11.1; extra == 'dev'
232
+ Requires-Dist: mlflow>=3.9.0; extra == 'dev'
235
233
  Requires-Dist: openpyxl>=3.1.5; extra == 'dev'
236
234
  Requires-Dist: pandas>=2.2.3; extra == 'dev'
237
235
  Requires-Dist: plotly>=6.0.1; extra == 'dev'
238
236
  Requires-Dist: pydantic>=2.5.2; extra == 'dev'
239
- Requires-Dist: pytest>=9.0.2; extra == 'dev'
240
237
  Requires-Dist: pyyaml>=6.0.1; extra == 'dev'
241
238
  Requires-Dist: requests>=2.31.0; extra == 'dev'
242
239
  Requires-Dist: ruff>=0.1.7; extra == 'dev'
243
240
  Requires-Dist: twine>=4.0.2; extra == 'dev'
244
241
  Requires-Dist: urllib3>=2.1.0; extra == 'dev'
245
242
  Provides-Extra: notebook
246
- Requires-Dist: mlflow>=2.19.0; extra == 'notebook'
243
+ Requires-Dist: mlflow>=3.9.0; extra == 'notebook'
247
244
  Description-Content-Type: text/markdown
248
245
 
249
246
  # Nextmv Python SDK
@@ -1,4 +1,4 @@
1
- nextmv/__about__.py,sha256=Fz6mkeJ5B6FYwEl4VTeOlcxzHJMSpJh63kWjeWhwUrs,28
1
+ nextmv/__about__.py,sha256=VlLsZkZ0zjltxAYOr-XbXribwiPhO-YMZ5Qymsv1Se0,28
2
2
  nextmv/__entrypoint__.py,sha256=XMT-ds1f2Yc6KoI2C0YEH-rJj5gVLfJMqUdRfcA3_KQ,1070
3
3
  nextmv/__init__.py,sha256=LwpGBSiV0UG13zKHO2N3Ikb7bCMV08Gfbl6Cp80b_2g,3813
4
4
  nextmv/_serialization.py,sha256=jYitMS1MU8ldsmObT-K_8V8P2Wx69tnDiEHCCgPGun4,2834
@@ -7,8 +7,8 @@ nextmv/deprecated.py,sha256=U1YD-vie0dEVWFJgIwOuinxACHsyiEIQpfrt95ykhlg,1651
7
7
  nextmv/input.py,sha256=iONLkXhcIXRCJVPNVkJdivh47A399VMepsSxNZByX2I,37649
8
8
  nextmv/logger.py,sha256=kNIbu46MisrzYe4T0hNMpWfRTKKacDVvbtQcNys_c_E,2513
9
9
  nextmv/manifest.py,sha256=v9En9zMZVKZn6G_HThoKUZowMtZr5hxzwWiK9wkVHPU,49023
10
- nextmv/model.py,sha256=9g-pAUg8E--CyUFU39J7e4MZcj0WrWtgIqfwGmoF7UA,14998
11
- nextmv/options.py,sha256=PZtw2SIK48gkjzbJwMN6nfXm_3Utaa_ZUd23Y1XxS2Q,29657
10
+ nextmv/model.py,sha256=GWzg9eWtTKjZqsQNvMPWdv5BLLb63Ied_q2koXxiCxM,15066
11
+ nextmv/options.py,sha256=3BnnuAoiFD6qr0EMYv1VgAXarDjLb-t7OpC1IpsnS1M,29648
12
12
  nextmv/output.py,sha256=MbmI7t8p2LhKD1T--IZnsHvIuFY_TM8wTNCdLQVWs2A,54356
13
13
  nextmv/polling.py,sha256=fwnAxmfpuBg4d6pi53TRTyyefdpf-cHLoTG6trAu-QA,11048
14
14
  nextmv/run.py,sha256=8tkRQexJC8JN7IkLlhpwEW5pEudxwDq2sC_PImfwReI,54126
@@ -39,7 +39,7 @@ nextmv/cli/cloud/app/delete.py,sha256=HLgDx4eMf_LYyGC8aQxuvNrhOfnWmDuutPjk4ywILa
39
39
  nextmv/cli/cloud/app/exists.py,sha256=gd9pmR1Oq_cCjaTNB82PmJtDYowrb17vBfQYjoh6E9Q,1258
40
40
  nextmv/cli/cloud/app/get.py,sha256=_v_7PrUniaaRvHclBA02V-UVcbVe1eFixGU6CeXA4m4,1765
41
41
  nextmv/cli/cloud/app/list.py,sha256=AI1VNNueYfzwuSAFlf-vXbZEY-th5BrzXZgn-3uusFo,1653
42
- nextmv/cli/cloud/app/push.py,sha256=OsI9cTM1EuSqxKZFTgGZ9V15lTNQkdQDpN_lCSpEPpw,15756
42
+ nextmv/cli/cloud/app/push.py,sha256=mbGThAgmfxO2JqfXq8HXAdRT81b55MBfCGaDtSJQsUM,15624
43
43
  nextmv/cli/cloud/app/update.py,sha256=4Mp8Zf40K1hdHO3KT9Md3piBWqzracfpWtujJfbPocM,4070
44
44
  nextmv/cli/cloud/batch/__init__.py,sha256=-_UjmvrQItACUY_BQ_cOffNJixNHAb4vH_pew25sJ3o,774
45
45
  nextmv/cli/cloud/batch/create.py,sha256=T70sjvvTxXxRpC4COFZFU5ei6ylS5MWLg6VLP3SjIso,15465
@@ -56,9 +56,8 @@ nextmv/cli/cloud/ensemble/delete.py,sha256=C1xmISSaUhtsV94w2z2rzhenp2mm9E0GXHy4d
56
56
  nextmv/cli/cloud/ensemble/get.py,sha256=-4crRjI8MF8meq5uUhUR3q39lK4EIsvpzaODfGvwx3k,2135
57
57
  nextmv/cli/cloud/ensemble/list.py,sha256=zm7TfBM5HH_8I-r4U219AbmQadET96kw1MrsjwARSAM,1887
58
58
  nextmv/cli/cloud/ensemble/update.py,sha256=5AeuhY-CytzON1FFoEijBlo1T9oHvkq3mxV9I3qCeLA,3383
59
- nextmv/cli/cloud/input_set/__init__.py,sha256=qDyIc0JJm1oU9tyt9MgjkJL6VKXSFCySPTKKHqfLHCM,957
59
+ nextmv/cli/cloud/input_set/__init__.py,sha256=wyt0LX9xqcGDrb-rPx-MN0WQA7o9jZnK2CpShfrki3o,867
60
60
  nextmv/cli/cloud/input_set/create.py,sha256=nJWsaj-fPXS8rwIbh13_wXc9SitDA4ByIHhlBS51GHo,5661
61
- nextmv/cli/cloud/input_set/delete.py,sha256=8-cJtgcgh_kK0K7AtHZmYSCvTmxwtyQIhWcmt6aYAZI,2125
62
61
  nextmv/cli/cloud/input_set/get.py,sha256=MvMD6tmMA_ui4MVCwRkOnmU0WySJmSJX7x2Q-x_xXwA,1916
63
62
  nextmv/cli/cloud/input_set/list.py,sha256=7I0F1rs19bY9d_V2TjEFxHCbHq3bNV_mO0Fd9qJ58IY,1896
64
63
  nextmv/cli/cloud/input_set/update.py,sha256=P5b94m08hGMAGr455fH-Cd1yryeMC15r1YfmJEt2NSw,4144
@@ -77,7 +76,7 @@ nextmv/cli/cloud/managed_input/list.py,sha256=6l4zJPVErmooobteBn05RmoXHgvI0RBt_L
77
76
  nextmv/cli/cloud/managed_input/update.py,sha256=E1ddfQ9VJ7SgG8V6kkRYbgKhS4vDyv06WePNbLEXUsE,3191
78
77
  nextmv/cli/cloud/run/__init__.py,sha256=KyonwVd5lfweaq-cIpPuRAzHFrK0slfqJsIjsT_p4PU,1102
79
78
  nextmv/cli/cloud/run/cancel.py,sha256=d7aQQQmek_i3P2cDmpOohLiwSjWxfKEiVAvBnNYAmuE,1259
80
- nextmv/cli/cloud/run/create.py,sha256=39D4VdcfYRioziIy-qjLDSs-_dhSavrkmzcltUfgz3M,19526
79
+ nextmv/cli/cloud/run/create.py,sha256=eGjlYCWGf_57Qlqbaok-iLzcLmHAaCZor6TskhMabPk,19706
81
80
  nextmv/cli/cloud/run/get.py,sha256=bUczN6a1SV3wkW0uUPfQdO3i13BF51udixmuyiicdi8,7826
82
81
  nextmv/cli/cloud/run/input.py,sha256=QEdDnKxEmucUwPPRAqh1VuErw5rKaAwXOHrmJESP-k0,3171
83
82
  nextmv/cli/cloud/run/list.py,sha256=z3286Q0Aznz-qAvanCB03rXjCfGPk84A32t8AqTC2Cs,2563
@@ -104,7 +103,7 @@ nextmv/cli/cloud/shadow/get.py,sha256=8NmXl2romVPGfS9KP4G2Sv4SuSZKgRx85GZ4ClwTqW
104
103
  nextmv/cli/cloud/shadow/list.py,sha256=aVFa3FAzfcUsMlD0hYgZwhoF75GQkaNDHrrq82qqylQ,1810
105
104
  nextmv/cli/cloud/shadow/metadata.py,sha256=vHJYVDXXHwiqQrG0J0D_aRP--b47UfEgJwJOXqfskSo,2161
106
105
  nextmv/cli/cloud/shadow/start.py,sha256=SkDYSfyQLdfHJKCOzc4CW6MVO7YBWCZCOAoGBzqSFhI,1464
107
- nextmv/cli/cloud/shadow/stop.py,sha256=WNg73nHkQ6Mo7hdg3qfSXQBkd77iKPfRIdSSJxTHhTY,1706
106
+ nextmv/cli/cloud/shadow/stop.py,sha256=gb6UuNf-HNCaACKzdAix1pr8oMn-A1SQJEFUXrOr228,1333
108
107
  nextmv/cli/cloud/shadow/update.py,sha256=l7_gODO9fXYGOLzFMJmIVpT5Jku9XQAo2PI5x3AP4xU,2880
109
108
  nextmv/cli/cloud/switchback/__init__.py,sha256=jYeujjbqvqRGIgvC0wr3I6zavw1az7IS8jiJsAlH-z4,981
110
109
  nextmv/cli/cloud/switchback/create.py,sha256=lEboNjN1ZFbuOCFmK2ADIRH-pIENc80NcR809rDOY3I,5085
@@ -113,7 +112,7 @@ nextmv/cli/cloud/switchback/get.py,sha256=GQKzaW4jCfV21DyZ5vDNrkFH2Tw1pR8Zv_71ji
113
112
  nextmv/cli/cloud/switchback/list.py,sha256=wrXXA9aMLLcq_6WFk-dy9RopE57dFZb7TxlWdRx9G94,1882
114
113
  nextmv/cli/cloud/switchback/metadata.py,sha256=WDhK-AVKEJQ38WhPZqPOgemHt-PI__r6sIEBFQtKxVw,2287
115
114
  nextmv/cli/cloud/switchback/start.py,sha256=N9Bci8DmCQW8XUm93Rhj30TCf_YvK6N5qxZXMpW2X1I,1535
116
- nextmv/cli/cloud/switchback/stop.py,sha256=pOasfThNCB3GXDNz4TPyJ5DNnMf3vLin6lAh1XoAk-Y,1774
115
+ nextmv/cli/cloud/switchback/stop.py,sha256=xEF2JqDhOhxzli79qqwIGVJiNW14BnfEbfc70sXF7dE,1397
117
116
  nextmv/cli/cloud/switchback/update.py,sha256=pILZUbqlIM6l1mrbVPtks6CGcgre5829sSnD2yMZd-0,3000
118
117
  nextmv/cli/cloud/upload/__init__.py,sha256=khOl6NxkPd4KEqN0xMdxzmST-Ct3Vr_xk8zbMvbrLl8,511
119
118
  nextmv/cli/cloud/upload/create.py,sha256=vRTHCeh7cbB9JSAMUCpcdQrzQ1od5FiFiNdPPh7sFqw,1216
@@ -125,42 +124,41 @@ nextmv/cli/cloud/version/get.py,sha256=eGbka3TG8UJE150h22rn0BUqTi1xRE7roVDj6yJvn
125
124
  nextmv/cli/cloud/version/list.py,sha256=sKdHgyowLG1jyUEtu87yCPC5_2-0i3VDEgfmvb-bBn0,1770
126
125
  nextmv/cli/cloud/version/update.py,sha256=mEUYXGHLGkiEGH31KK6jDDfviHEhVCdLjLQL_5u0vLk,2869
127
126
  nextmv/cli/community/__init__.py,sha256=t2l6adm9Km6hSvSFzeKHTQzacVSnwjx4wpj2kqee5nM,612
128
- nextmv/cli/community/clone.py,sha256=_I1C58pKmfAHdl-8eaZDeaxZm2Rnp2en8PCPdflAse4,2912
129
- nextmv/cli/community/list.py,sha256=1ZdkwbWluJqZWVEAI0XVpB-mEQNnulsL2oPjavdMl-c,5754
127
+ nextmv/cli/community/clone.py,sha256=C9ujRTBpL7fbgpBjIALsNjzYh5T-8weHOzkV1bsuiLU,9236
128
+ nextmv/cli/community/list.py,sha256=ad7qPPaNh29tj_ggR4lJnRkMTgWstHQFV90sqdiWcdA,7440
130
129
  nextmv/cli/configuration/__init__.py,sha256=7oryF4PKkORh8bcdgbN2k36rZrFpJsM7Xfq_J4-MkFs,516
131
130
  nextmv/cli/configuration/config.py,sha256=t43ubCcbfbpfq9HvkVb2WQY9V47lrLEP0KvsWfjOJ8Y,6667
132
131
  nextmv/cli/configuration/create.py,sha256=aDj6wFl6_RRMmvCLTNIeCcFotNOGoupso785M46nh2Y,2668
133
132
  nextmv/cli/configuration/delete.py,sha256=3l1Mx8ATCwoiggbYBjG0ArmYSbS_GlJ5cCCymG2CEhU,1935
134
133
  nextmv/cli/configuration/list.py,sha256=HIZvDJQW5B0-o_ZqQHuxRw7N_VmxqYM46fucKCvo1zw,2208
135
- nextmv/cloud/__init__.py,sha256=IW9fdg3QgusJGAU4VVEu5qkCidzalyYf4wjC1T14rnQ,4183
134
+ nextmv/cloud/__init__.py,sha256=watvsgucVgOCIlwrmnvIxW8lyUfEerhDzOn-Zp-dl1I,3954
136
135
  nextmv/cloud/acceptance_test.py,sha256=H34lvccJzN1URpnhrHstcVxgvq1s2iCymiKIPBHcToY,25828
137
136
  nextmv/cloud/account.py,sha256=X2xQjzhgEdKR0eypH8lWKUOwDISjJSd5SwOwEnpfTVk,13573
138
137
  nextmv/cloud/assets.py,sha256=alw634ub-DR0CHQXZy_ObeGvQthPXFLdgzgbvbH1SGY,1376
139
- nextmv/cloud/batch_experiment.py,sha256=flwP5pbBio-ilAbopj8DdSWOlxGbct1IOElsgcyVN8U,10545
138
+ nextmv/cloud/batch_experiment.py,sha256=thS94-ZdMR7Em5TeGN5UtnIDHmhzqld_U49SODyhrPU,10537
140
139
  nextmv/cloud/client.py,sha256=Yj4FE4GKsLHkYijAYXcotlyNfhAWANMuWetHXsYPg1M,18101
141
- nextmv/cloud/community.py,sha256=LSiKF5agLTHFbW5fBAv-m3MsWm3XuROpw4_KkPpwtZM,13060
142
140
  nextmv/cloud/ensemble.py,sha256=_hKPjSLtuGH1xGG70ZBsmY_IL5XinZqVHHwBxtX9Omw,8570
143
141
  nextmv/cloud/input_set.py,sha256=wsLmMI1C7BslWDN5j1RnVUA8z54-Hq1eLG9bkzyqafo,4187
144
142
  nextmv/cloud/instance.py,sha256=rLrgNNvNyC6hZtjxIfTR2Luylmbh2emJIZVCy_hTJZ4,5495
145
- nextmv/cloud/integration.py,sha256=ce8TWOw_xIXxf8tzqHNriPmJ2dRA9v2EZSXnWZEvWVk,18314
143
+ nextmv/cloud/integration.py,sha256=S4BNX3GFGNA1SXDWaRAUeS0hW6XkYXWSdWXX-s-x_nA,18112
146
144
  nextmv/cloud/package.py,sha256=88XSJ15QGcHboNJAw2hGowiLKBu2O2nV5ZieZFx7XDI,17133
147
145
  nextmv/cloud/scenario.py,sha256=1_4PI9ehYaSonEe_l59cFhZNmqQ_brXXP6-mVq9i8a8,14183
148
146
  nextmv/cloud/secrets.py,sha256=fA5cX0jfTsPVZWV7433wzETGlXpWRLHGswuObx9e6FQ,6820
149
- nextmv/cloud/shadow.py,sha256=U-s9alkDS3wmYCEVDKEvuceveWOZOiF7rkH4_8eKdNk,7711
150
- nextmv/cloud/switchback.py,sha256=6e4J5zCewgGaitB5iJiO3u6BPHcAlzdAB5WU8j2b4K8,7427
147
+ nextmv/cloud/shadow.py,sha256=DWJfFkwlbULdl988A1HkOsyQGq0l9xtLT8Q-ZzsepH0,7214
148
+ nextmv/cloud/switchback.py,sha256=AGA0LDMu7sHndczy2TrcZghn_ZRnTGlBDmGRZG34dZY,7344
151
149
  nextmv/cloud/url.py,sha256=Fz70ywkWdCLmP21ZBmJwZi5kDbjpmsX_VlwVF_xQeHg,1836
152
150
  nextmv/cloud/version.py,sha256=5_S7_pWUVBFbvAArku20eK7S645GJcHtgE2OpXLdSzQ,5300
153
- nextmv/cloud/application/__init__.py,sha256=x9khEFlWUdupBxzMuSyrCftopNtrK64LTTEaCRSRwyM,32712
154
- nextmv/cloud/application/_acceptance.py,sha256=PEkf9cDunK40UNw96QBhpJpH5SOFLZMtmnyX84uAo9k,13974
151
+ nextmv/cloud/application/__init__.py,sha256=XmRdxE-pMUGdOG8tCblQUAtb9q5F_9Xdh3SoGk-Nj2Q,40221
152
+ nextmv/cloud/application/_acceptance.py,sha256=ZwbVkur3-1fwM_L4F8ZUqrNaIdHgYGxKd3utoOCWjSc,13679
155
153
  nextmv/cloud/application/_batch_scenario.py,sha256=cSsX5vPOkm91UqRBPIcqlOvQ0iojwt4sQKYGZEE7x6k,28479
156
154
  nextmv/cloud/application/_ensemble.py,sha256=05l9uR0hTnW8nQjhRzjd2TPfvCoaAqNddWP-aVRL5rg,7666
157
- nextmv/cloud/application/_input_set.py,sha256=BXleeHOClCkwOh53vG6F_561XzAo_XgrHfGmNbJxIds,8131
155
+ nextmv/cloud/application/_input_set.py,sha256=m7PKqhR3evdE_a_RER1L6iKwftlaxTiRd1JQvgCepUU,7069
158
156
  nextmv/cloud/application/_instance.py,sha256=Jjig8NI1jXNyBQoYj7JOfS0JFmw5jJdKLfi82fqBYgo,8386
159
157
  nextmv/cloud/application/_managed_input.py,sha256=zaWqGpe8Y5XWheroAqZSo-xNHfn2MKblNwRUbQVXBRM,6694
160
- nextmv/cloud/application/_run.py,sha256=4lrxyQCUGJszdiYNGynYg6RXBPqjQ4tFcDmxH9dfSXY,53869
158
+ nextmv/cloud/application/_run.py,sha256=-cAnkqiZ1rP37XbV8xH_R89wvMZpDzBFzSi684GgErA,53895
161
159
  nextmv/cloud/application/_secrets.py,sha256=hWhPAyY8aDF8zlEz9opPNLrFOYtp-COFqG_jgOZ6VxI,9476
162
- nextmv/cloud/application/_shadow.py,sha256=ck1v0yBuayGnlLlq5pEIwNQOE3wU29m9jsx8II7MxqQ,9327
163
- nextmv/cloud/application/_switchback.py,sha256=MbB9MVlBUeQkm_xekRC56bgEdcIFKmFnLPtfMXGLItI,9994
160
+ nextmv/cloud/application/_shadow.py,sha256=8uH0Zr-9czef2BhshYLzc0yBQhIcIdBYTCIiUS1ru44,9123
161
+ nextmv/cloud/application/_switchback.py,sha256=MapHkquya7SeyNnEVIy7E7Um_9VuMH7XiB7FFxZx6Po,9743
164
162
  nextmv/cloud/application/_utils.py,sha256=GqksGBHCV2sc-itL6hlWnncUJjIxhw6LH3pOjs4M-us,1643
165
163
  nextmv/cloud/application/_version.py,sha256=o1jVLfoKJNCs-32P7hkL1IGba8Eb1hnT6vnaZpyc0dk,8543
166
164
  nextmv/default_app/.gitignore,sha256=gsfnfXMYNt-YTroh5hAzauwBZoPDJ6D_fB17rMSnIko,8
@@ -178,8 +176,8 @@ nextmv/local/geojson_handler.py,sha256=7FavJdkUonop-yskjis0x3qFGB8A5wZyoBUblw-bV
178
176
  nextmv/local/local.py,sha256=cp56UpI8h19Ob6Jvb_Ni0ceXH5Vv3ET_iPTDe6ftq3Y,2617
179
177
  nextmv/local/plotly_handler.py,sha256=bLb50e3AkVr_W-F6S7lXfeRdN60mG2jk3UElNmhoMWU,1930
180
178
  nextmv/local/runner.py,sha256=bM1dFIAG4f9pEtbyevzkRa9nSppqTeD8naomNzJVBRU,8560
181
- nextmv-1.0.0.dev7.dist-info/METADATA,sha256=4Q4VmDr3z1sztAQ7YtA-6I4jYWnu1DyZaPrxNRXB0EM,16576
182
- nextmv-1.0.0.dev7.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
183
- nextmv-1.0.0.dev7.dist-info/entry_points.txt,sha256=bH7kXUt_IOLpeW_O7Z-J2gALs2YYJ4CmWuzS8MdK6uY,48
184
- nextmv-1.0.0.dev7.dist-info/licenses/LICENSE,sha256=ZIbK-sSWA-OZprjNbmJAglYRtl5_K4l9UwAV3PGJAPc,11349
185
- nextmv-1.0.0.dev7.dist-info/RECORD,,
179
+ nextmv-1.0.0.dev9.dist-info/METADATA,sha256=401CvhCVmExbub4P0bcQU64MItlTOaSq5VTcVSyD0ss,16433
180
+ nextmv-1.0.0.dev9.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
181
+ nextmv-1.0.0.dev9.dist-info/entry_points.txt,sha256=bH7kXUt_IOLpeW_O7Z-J2gALs2YYJ4CmWuzS8MdK6uY,48
182
+ nextmv-1.0.0.dev9.dist-info/licenses/LICENSE,sha256=ZIbK-sSWA-OZprjNbmJAglYRtl5_K4l9UwAV3PGJAPc,11349
183
+ nextmv-1.0.0.dev9.dist-info/RECORD,,
@@ -1,67 +0,0 @@
1
- """
2
- This module defines the cloud input-set 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, InputSetIDOption, ProfileOption
13
-
14
- # Set up subcommand application.
15
- app = typer.Typer()
16
-
17
-
18
- @app.command()
19
- def delete(
20
- app_id: AppIDOption,
21
- input_set_id: InputSetIDOption,
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 input set.
34
-
35
- This action is permanent and cannot be undone. The input set and all
36
- associated data will be deleted. Use the --yes flag to skip the
37
- confirmation prompt.
38
-
39
- [bold][underline]Examples[/underline][/bold]
40
-
41
- - Delete the input set with the ID [magenta]hop-analysis[/magenta] from application
42
- [magenta]hare-app[/magenta].
43
- $ [dim]nextmv cloud input-set delete --app-id hare-app --input-set-id hop-analysis[/dim]
44
-
45
- - Delete the input set without confirmation prompt.
46
- $ [dim]nextmv cloud input-set delete --app-id hare-app --input-set-id carrot-routes --yes[/dim]
47
- """
48
-
49
- if not yes:
50
- confirm = get_confirmation(
51
- f"Are you sure you want to delete input set [magenta]{input_set_id}[/magenta] "
52
- f"from application [magenta]{app_id}[/magenta]? This action cannot be undone.",
53
- )
54
-
55
- if not confirm:
56
- info(
57
- msg=f"Input set [magenta]{input_set_id}[/magenta] will not be deleted.",
58
- emoji=":bulb:",
59
- )
60
- return
61
-
62
- cloud_app = build_app(app_id=app_id, profile=profile)
63
- cloud_app.delete_input_set(input_set_id=input_set_id)
64
- success(
65
- f"Input set [magenta]{input_set_id}[/magenta] deleted successfully "
66
- f"from application [magenta]{app_id}[/magenta]."
67
- )