nextmv 0.29.0.dev0__py3-none-any.whl → 0.29.2.dev1__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.
nextmv/__about__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "v0.29.0.dev0"
1
+ __version__ = "v0.29.2.dev1"
@@ -1573,6 +1573,13 @@ class Application:
1573
1573
  json_configurations: Optional[dict[str, Any]]
1574
1574
  Optional configurations for JSON serialization. This is used to
1575
1575
  customize the serialization before data is sent.
1576
+ dir_path: Optional[str]
1577
+ Path to a directory containing input files. If specified, the
1578
+ function will package the files in the directory into a tar file
1579
+ and upload it as a large input. This is useful for input formats
1580
+ like `nextmv.InputFormat.CSV_ARCHIVE` or `nextmv.InputFormat.MULTI_FILE`.
1581
+ If both `input` and `dir_path` are specified, the `input` is
1582
+ ignored, and the files in the directory are used instead.
1576
1583
 
1577
1584
  Returns
1578
1585
  ----------
@@ -1612,10 +1619,8 @@ class Application:
1612
1619
  if input_data is not None:
1613
1620
  input_size = get_size(input_data)
1614
1621
 
1615
- upload_url_required = input_size > _MAX_RUN_SIZE or tar_file != ""
1616
1622
  upload_id_used = upload_id is not None
1617
-
1618
- if not upload_id_used and upload_url_required:
1623
+ if self.__upload_url_required(upload_id_used, input_size, tar_file, input):
1619
1624
  upload_url = self.upload_url()
1620
1625
  self.upload_large_input(input=input_data, upload_url=upload_url, tar_file=tar_file)
1621
1626
  upload_id = upload_url.upload_id
@@ -1650,11 +1655,18 @@ class Application:
1650
1655
  if not isinstance(v, str):
1651
1656
  raise ValueError(f"options must be dict[str,str], option {k} has type {type(v)} instead.")
1652
1657
  payload["options"] = options_dict
1658
+
1653
1659
  if configuration is not None:
1654
1660
  configuration_dict = (
1655
1661
  configuration.to_dict() if isinstance(configuration, RunConfiguration) else configuration
1656
1662
  )
1657
- payload["configuration"] = configuration_dict
1663
+ else:
1664
+ configuration = RunConfiguration()
1665
+ configuration.resolve(input=input, dir_path=dir_path)
1666
+ configuration_dict = configuration.to_dict()
1667
+
1668
+ payload["configuration"] = configuration_dict
1669
+
1658
1670
  if batch_experiment_id is not None:
1659
1671
  payload["batch_experiment_id"] = batch_experiment_id
1660
1672
  if external_result is not None:
@@ -1688,6 +1700,8 @@ class Application:
1688
1700
  configuration: Optional[Union[RunConfiguration, dict[str, Any]]] = None,
1689
1701
  batch_experiment_id: Optional[str] = None,
1690
1702
  external_result: Optional[Union[ExternalRunResult, dict[str, Any]]] = None,
1703
+ json_configurations: Optional[dict[str, Any]] = None,
1704
+ dir_path: Optional[str] = None,
1691
1705
  ) -> RunResult:
1692
1706
  """
1693
1707
  Submit an input to start a new run of the application and poll for the
@@ -1699,11 +1713,35 @@ class Application:
1699
1713
  ----------
1700
1714
  input: Union[Input, dict[str, Any], BaseModel, str]
1701
1715
  Input to use for the run. This can be a `nextmv.Input` object,
1702
- `dict`, `BaseModel` or `str`. If `nextmv.Input` is used, then the
1703
- input is extracted from the `.data` property. Note that for now,
1704
- `InputFormat.CSV_ARCHIVE` is not supported as an
1705
- `input.input_format`. If an input is too large, it will be uploaded
1706
- with the `upload_large_input` method.
1716
+ `dict`, `BaseModel` or `str`.
1717
+
1718
+ If `nextmv.Input` is used, and the `input_format` is either
1719
+ `nextmv.InputFormat.JSON` or `nextmv.InputFormat.TEXT`, then the
1720
+ input data is extracted from the `.data` property.
1721
+
1722
+ If you want to work with `nextmv.InputFormat.CSV_ARCHIVE` or
1723
+ `nextmv.InputFormat.MULTI_FILE`, you should use the `dir_path`
1724
+ argument instead. This argument takes precedence over the `input`.
1725
+ If `dir_path` is specified, this function looks for files in that
1726
+ directory and tars them, to later be uploaded using the
1727
+ `upload_large_input` method. If both the `dir_path` and `input`
1728
+ arguments are provided, the `input` is ignored.
1729
+
1730
+ When `dir_path` is specified, the `configuration` argument must
1731
+ also be provided. More specifically, the
1732
+ `RunConfiguration.format.format_input.input_type` parameter
1733
+ dictates what kind of input is being submitted to the Nextmv Cloud.
1734
+ Make sure that this parameter is specified when working with the
1735
+ following input formats:
1736
+
1737
+ - `nextmv.InputFormat.CSV_ARCHIVE`
1738
+ - `nextmv.InputFormat.MULTI_FILE`
1739
+
1740
+ When working with JSON or text data, use the `input` argument
1741
+ directly.
1742
+
1743
+ In general, if an input is too large, it will be uploaded with the
1744
+ `upload_large_input` method.
1707
1745
  instance_id: Optional[str]
1708
1746
  ID of the instance to use for the run. If not provided, the default
1709
1747
  instance ID associated to the Class (`default_instance_id`) is
@@ -1743,6 +1781,16 @@ class Application:
1743
1781
  configuration. This is used when the run is an external run. We
1744
1782
  suggest that instead of specifying this parameter, you use the
1745
1783
  `track_run_with_result` method of the class.
1784
+ json_configurations: Optional[dict[str, Any]]
1785
+ Optional configurations for JSON serialization. This is used to
1786
+ customize the serialization before data is sent.
1787
+ dir_path: Optional[str]
1788
+ Path to a directory containing input files. If specified, the
1789
+ function will package the files in the directory into a tar file
1790
+ and upload it as a large input. This is useful for input formats
1791
+ like `nextmv.InputFormat.CSV_ARCHIVE` or `nextmv.InputFormat.MULTI_FILE`.
1792
+ If both `input` and `dir_path` are specified, the `input` is
1793
+ ignored, and the files in the directory are used instead.
1746
1794
 
1747
1795
  Returns
1748
1796
  ----------
@@ -1774,6 +1822,8 @@ class Application:
1774
1822
  configuration=configuration,
1775
1823
  batch_experiment_id=batch_experiment_id,
1776
1824
  external_result=external_result,
1825
+ json_configurations=json_configurations,
1826
+ dir_path=dir_path,
1777
1827
  )
1778
1828
 
1779
1829
  return self.run_result_with_polling(
@@ -3297,6 +3347,33 @@ class Application:
3297
3347
 
3298
3348
  return tar_file_path
3299
3349
 
3350
+ def __upload_url_required(
3351
+ self,
3352
+ upload_id_used: bool,
3353
+ input_size: int,
3354
+ tar_file: str,
3355
+ input: Union[Input, dict[str, Any], BaseModel, str] = None,
3356
+ ) -> bool:
3357
+ """
3358
+ Auxiliary function to determine if an upload URL is required
3359
+ based on the input size, type, and configuration.
3360
+ """
3361
+
3362
+ if upload_id_used:
3363
+ return False
3364
+
3365
+ non_json_payload = False
3366
+ if isinstance(input, str):
3367
+ non_json_payload = True
3368
+ elif isinstance(input, Input) and input.input_format != InputFormat.JSON:
3369
+ non_json_payload = True
3370
+ elif tar_file is not None and tar_file != "":
3371
+ non_json_payload = True
3372
+
3373
+ size_exceeds = input_size > _MAX_RUN_SIZE
3374
+
3375
+ return size_exceeds or non_json_payload
3376
+
3300
3377
 
3301
3378
  def poll( # noqa: C901
3302
3379
  polling_options: PollingOptions,
nextmv/cloud/client.py CHANGED
@@ -397,7 +397,7 @@ class Client:
397
397
 
398
398
  if upload_data is not None:
399
399
  kwargs["data"] = upload_data
400
- elif tar_file is not None:
400
+ elif tar_file is not None and tar_file != "":
401
401
  if not os.path.exists(tar_file):
402
402
  raise ValueError(f"tar_file {tar_file} does not exist")
403
403
  kwargs["data"] = open(tar_file, "rb")
nextmv/cloud/run.py CHANGED
@@ -470,6 +470,40 @@ class RunConfiguration(BaseModel):
470
470
  queuing: Optional[RunQueuing] = None
471
471
  """Queuing configuration for the run."""
472
472
 
473
+ def resolve(
474
+ self,
475
+ input: Union[Input, dict[str, Any], BaseModel, str],
476
+ dir_path: Optional[str] = None,
477
+ ) -> None:
478
+ """
479
+ Resolves the run configuration by modifying or setting the `format`,
480
+ based on the type of input that is provided.
481
+
482
+ Parameters
483
+ ----------
484
+ input : Input or dict[str, Any] or BaseModel or str, optional
485
+ The input to use for resolving the run configuration.
486
+ dir_path : str, optional
487
+ The directory path where inputs can be loaded from.
488
+ """
489
+
490
+ # If the value is set by the user, do not change it.
491
+ if self.format is not None:
492
+ return
493
+
494
+ self.format = Format(format_input=FormatInput(input_type=InputFormat.JSON))
495
+
496
+ if isinstance(input, dict):
497
+ self.format.format_input.input_type = InputFormat.JSON
498
+ elif isinstance(input, str):
499
+ self.format.format_input.input_type = InputFormat.TEXT
500
+ elif dir_path is not None and dir_path != "":
501
+ # Kinda hard to detect if we should be working with CSV_ARCHIVE or
502
+ # MULTI_FILE, so we default to MULTI_FILE.
503
+ self.format.format_input.input_type = InputFormat.MULTI_FILE
504
+ elif isinstance(input, Input):
505
+ self.format.format_input.input_type = input.input_format
506
+
473
507
 
474
508
  class ExternalRunResult(BaseModel):
475
509
  """
nextmv/input.py CHANGED
@@ -108,7 +108,7 @@ class DataFile:
108
108
  the following arguments:
109
109
 
110
110
  - `file_path`: a `str` argument which is the location where this
111
- solution will be read from. This includes the dir and name of the
111
+ data will be read from. This includes the dir and name of the
112
112
  file. As such, the `name` parameter of this class is going to be
113
113
  passed to the `reader` function, joined with the directory where the
114
114
  file will be read from.
@@ -134,7 +134,7 @@ class DataFile:
134
134
  following arguments:
135
135
 
136
136
  - `file_path`: a `str` argument which is the location where this
137
- solution will be read from. This includes the dir and name of the
137
+ data will be read from. This includes the dir and name of the
138
138
  file. As such, the `name` parameter of this class is going to be
139
139
  passed to the `loader` function, joined with the directory where the
140
140
  file will be read from.
@@ -155,9 +155,24 @@ class DataFile:
155
155
  Optional positional arguments to pass to the loader function. This can be
156
156
  used to customize the behavior of the loader.
157
157
  """
158
+ input_data_key: Optional[str] = None
159
+ """
160
+ Use this parameter to set a custom key to represent your file.
161
+
162
+ When using `InputFormat.MULTI_FILE` as the `input_format` of the `Input`,
163
+ the data from the file is loaded to the `.data` parameter of the `Input`.
164
+ In that case, the type of `.data` is `dict[str, Any]`, where each key
165
+ represents the file name (with extension) and the value is the data that is
166
+ actually loaded from the file using the `loader` function. You can set a
167
+ custom key to represent your file by using this attribute.
168
+ """
158
169
 
159
170
 
160
- def json_data_file(name: str, json_configurations: Optional[dict[str, Any]] = None) -> DataFile:
171
+ def json_data_file(
172
+ name: str,
173
+ json_configurations: Optional[dict[str, Any]] = None,
174
+ input_data_key: Optional[str] = None,
175
+ ) -> DataFile:
161
176
  """
162
177
  This is a convenience function to create a `DataFile` that reads JSON data.
163
178
 
@@ -173,6 +188,15 @@ def json_data_file(name: str, json_configurations: Optional[dict[str, Any]] = No
173
188
  Name of the data file. You don't need to include the `.json` extension.
174
189
  json_configurations : dict[str, Any], optional
175
190
  JSON-specific configurations for reading the data.
191
+ input_data_key : str, optional
192
+ A custom key to represent the data from this file.
193
+
194
+ When using `InputFormat.MULTI_FILE` as the `input_format` of the `Input`,
195
+ the data from the file is loaded to the `.data` parameter of the `Input`.
196
+ In that case, the type of `.data` is `dict[str, Any]`, where each key
197
+ represents the file name (with extension) and the value is the data that is
198
+ actually loaded from the file using the `loader` function. You can set a
199
+ custom key to represent your file by using this attribute.
176
200
 
177
201
  Returns
178
202
  -------
@@ -204,10 +228,15 @@ def json_data_file(name: str, json_configurations: Optional[dict[str, Any]] = No
204
228
  return DataFile(
205
229
  name=name,
206
230
  loader=loader,
231
+ input_data_key=input_data_key,
207
232
  )
208
233
 
209
234
 
210
- def csv_data_file(name: str, csv_configurations: Optional[dict[str, Any]] = None) -> DataFile:
235
+ def csv_data_file(
236
+ name: str,
237
+ csv_configurations: Optional[dict[str, Any]] = None,
238
+ input_data_key: Optional[str] = None,
239
+ ) -> DataFile:
211
240
  """
212
241
  This is a convenience function to create a `DataFile` that reads CSV data.
213
242
 
@@ -223,6 +252,15 @@ def csv_data_file(name: str, csv_configurations: Optional[dict[str, Any]] = None
223
252
  Name of the data file. You don't need to include the `.csv` extension.
224
253
  csv_configurations : dict[str, Any], optional
225
254
  CSV-specific configurations for reading the data.
255
+ input_data_key : str, optional
256
+ A custom key to represent the data from this file.
257
+
258
+ When using `InputFormat.MULTI_FILE` as the `input_format` of the `Input`,
259
+ the data from the file is loaded to the `.data` parameter of the `Input`.
260
+ In that case, the type of `.data` is `dict[str, Any]`, where each key
261
+ represents the file name (with extension) and the value is the data that is
262
+ actually loaded from the file using the `loader` function. You can set a
263
+ custom key to represent your file by using this attribute.
226
264
 
227
265
  Returns
228
266
  -------
@@ -254,10 +292,11 @@ def csv_data_file(name: str, csv_configurations: Optional[dict[str, Any]] = None
254
292
  return DataFile(
255
293
  name=name,
256
294
  loader=loader,
295
+ input_data_key=input_data_key,
257
296
  )
258
297
 
259
298
 
260
- def text_data_file(name: str) -> DataFile:
299
+ def text_data_file(name: str, input_data_key: Optional[str] = None) -> DataFile:
261
300
  """
262
301
  This is a convenience function to create a `DataFile` that reads utf-8
263
302
  encoded text data.
@@ -274,6 +313,15 @@ def text_data_file(name: str) -> DataFile:
274
313
  ----------
275
314
  name : str
276
315
  Name of the data file. The file extension must be provided in the name.
316
+ input_data_key : str, optional
317
+ A custom key to represent the data from this file.
318
+
319
+ When using `InputFormat.MULTI_FILE` as the `input_format` of the `Input`,
320
+ the data from the file is loaded to the `.data` parameter of the `Input`.
321
+ In that case, the type of `.data` is `dict[str, Any]`, where each key
322
+ represents the file name (with extension) and the value is the data that is
323
+ actually loaded from the file using the `loader` function. You can set a
324
+ custom key to represent your file by using this attribute.
277
325
 
278
326
  Returns
279
327
  -------
@@ -297,6 +345,7 @@ def text_data_file(name: str) -> DataFile:
297
345
  return DataFile(
298
346
  name=name,
299
347
  loader=loader,
348
+ input_data_key=input_data_key,
300
349
  )
301
350
 
302
351
 
@@ -311,18 +360,6 @@ class Input:
311
360
  from nextmv import Input
312
361
  ```
313
362
 
314
- Parameters
315
- ----------
316
- data : Union[Union[dict[str, Any], Any], str, list[dict[str, Any]],
317
- dict[str, list[dict[str, Any]]], dict[str, Any]]
318
- The actual data.
319
- input_format : InputFormat, optional
320
- Format of the input data. Default is `InputFormat.JSON`.
321
- options : Options, optional
322
- Options that the input was created with.
323
-
324
- Notes
325
- -----
326
363
  The `data`'s type must match the `input_format`:
327
364
 
328
365
  - `InputFormat.JSON`: the data is `Union[dict[str, Any], Any]`. This just
@@ -340,6 +377,18 @@ class Input:
340
377
  from one or more files in a specific directory. Given that each file can
341
378
  be of different types (JSON, CSV, Excel, etc...), the data captured from
342
379
  each might vary. To reflect this, the data is loaded as a dict of items.
380
+ You can have a custom key for the data, that is not the file name, if
381
+ you use the `input_data_key` parameter of the `DataFile` class.
382
+
383
+ Parameters
384
+ ----------
385
+ data : Union[Union[dict[str, Any], Any], str, list[dict[str, Any]],
386
+ dict[str, list[dict[str, Any]]], dict[str, Any]]
387
+ The actual data.
388
+ input_format : InputFormat, optional
389
+ Format of the input data. Default is `InputFormat.JSON`.
390
+ options : Options, optional
391
+ Options that the input was created with.
343
392
 
344
393
  Raises
345
394
  ------
@@ -888,7 +937,15 @@ class LocalInputLoader(InputLoader):
888
937
  *data_file.loader_args,
889
938
  **data_file.loader_kwargs,
890
939
  )
891
- data[name] = d
940
+
941
+ key = name
942
+ if data_file.input_data_key is not None:
943
+ key = data_file.input_data_key
944
+
945
+ if data.get(key) is not None:
946
+ raise ValueError(f"Duplicate input data key found: {key}")
947
+
948
+ data[key] = d
892
949
 
893
950
  return data
894
951
 
nextmv/output.py CHANGED
@@ -582,7 +582,7 @@ class SolutionFile:
582
582
  `csv.DictWriter`, then the data should be a list of dictionaries, where
583
583
  each dictionary represents a row in the CSV file.
584
584
  """
585
- writer: Callable[[str, str, Any], None]
585
+ writer: Callable[[str, Any], None]
586
586
  """
587
587
  Callable that writes the solution data to the file. This should be a
588
588
  function implemented by the user. There are convenience functions that you
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nextmv
3
- Version: 0.29.0.dev0
3
+ Version: 0.29.2.dev1
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/
@@ -225,6 +225,18 @@ Requires-Dist: requests>=2.31.0
225
225
  Requires-Dist: urllib3>=2.1.0
226
226
  Provides-Extra: all
227
227
  Requires-Dist: mlflow>=2.17.2; extra == 'all'
228
+ Provides-Extra: dev
229
+ Requires-Dist: build>=1.0.3; extra == 'dev'
230
+ Requires-Dist: mlflow>=2.19.0; extra == 'dev'
231
+ Requires-Dist: nextroute>=1.11.1; extra == 'dev'
232
+ Requires-Dist: openpyxl>=3.1.5; extra == 'dev'
233
+ Requires-Dist: pandas>=2.2.3; extra == 'dev'
234
+ Requires-Dist: pydantic>=2.5.2; extra == 'dev'
235
+ Requires-Dist: pyyaml>=6.0.1; extra == 'dev'
236
+ Requires-Dist: requests>=2.31.0; extra == 'dev'
237
+ Requires-Dist: ruff>=0.1.7; extra == 'dev'
238
+ Requires-Dist: twine>=4.0.2; extra == 'dev'
239
+ Requires-Dist: urllib3>=2.1.0; extra == 'dev'
228
240
  Description-Content-Type: text/markdown
229
241
 
230
242
  # Nextmv Python SDK
@@ -1,31 +1,31 @@
1
- nextmv/__about__.py,sha256=5Hyqy6YRmHjjJiH8zSsVktP7LyJJ_p94ZcbMBpGvTAo,29
1
+ nextmv/__about__.py,sha256=GsQEf7UDs4W0bljhrNkXljBHxyv30ngFhMCbDaDHo-0,29
2
2
  nextmv/__entrypoint__.py,sha256=dA0iwwHtrq6Z9w9FxmxKLoBGLyhe7jWtUAU-Y3PEgHg,1094
3
3
  nextmv/__init__.py,sha256=FsF0pEkOSBuPY5EKu7NsBxro7jswGmOmaw61kZEudXY,1930
4
4
  nextmv/_serialization.py,sha256=JlSl6BL0M2Esf7F89GsGIZ__Pp8RnFRNM0UxYhuuYU4,2853
5
5
  nextmv/base_model.py,sha256=qmJ4AsYr9Yv01HQX_BERrn3229gyoZrYyP9tcyqNfeU,2311
6
6
  nextmv/deprecated.py,sha256=kEVfyQ-nT0v2ePXTNldjQG9uH5IlfQVy3L4tztIxwmU,1638
7
- nextmv/input.py,sha256=pen17zZtEdbTAIU4oOS7IlKffqSKnejYDO_EeFQid2s,37124
7
+ nextmv/input.py,sha256=iTMIdhSi4H-Xot44CYaUH110WDcpWDsJ5JXxSMGIZaY,40030
8
8
  nextmv/logger.py,sha256=kNIbu46MisrzYe4T0hNMpWfRTKKacDVvbtQcNys_c_E,2513
9
9
  nextmv/model.py,sha256=SVoJLN_f5knXjaPLlyWWvzIqX_qKu1txn6pYfKPwt14,15019
10
10
  nextmv/options.py,sha256=-9ru7nzqMsFf0aAAfR5OuMvChXYT6aho5sGghHKu8Ds,37323
11
- nextmv/output.py,sha256=QE4A8AEusCb8asvJFOSSz9S6ICDxB619ykqAM71qnI0,54049
11
+ nextmv/output.py,sha256=mBvxOshyizH9g2dc8Yp7iOwDCtFng_UnyTfzg14RMtQ,54044
12
12
  nextmv/cloud/__init__.py,sha256=7BCh3z-XkbIcMvFHmbj2wA8OquIovjrAZL7O9kA9VZc,3868
13
13
  nextmv/cloud/acceptance_test.py,sha256=Bcfdmh2fkPeBx8FDCngeUo2fjV_LhsUdygnzDQCDbYY,26898
14
14
  nextmv/cloud/account.py,sha256=eukiYQha4U2fkIjg4SgdoawKE1kU5G7GPyDJVrn8hHA,6064
15
- nextmv/cloud/application.py,sha256=YTtqN8r602r-rsjiLBbcq3gmu3v27CGfL3Bxg4lUPhQ,116324
15
+ nextmv/cloud/application.py,sha256=qMf7N0DpJnnkJiyMYjqFjR_2fVzOTjqT-bUWShYg7XE,119766
16
16
  nextmv/cloud/batch_experiment.py,sha256=rD3m-ioE1G8ADYN7afzr7zlq-3H22TNlj9RAh-_ZqIo,7270
17
- nextmv/cloud/client.py,sha256=2TTr7oc5g7zpB64xrACDZZph189JpPmE_HiUzXnGATM,18146
17
+ nextmv/cloud/client.py,sha256=E0DiUb377jvEnpXlRnfT1PGCI0Jm0lTUoX5VqeU91lk,18165
18
18
  nextmv/cloud/input_set.py,sha256=2dqmf5z-rZjTKwtBRvnUdfPfKv28It5uTCX0C70uP4Y,4242
19
19
  nextmv/cloud/instance.py,sha256=SS4tbp0LQMWDaeYpwcNxJei82oi_Hozv1t5i3QGjASY,4024
20
20
  nextmv/cloud/manifest.py,sha256=bphIZJzStkAc1gme39SecwI4L36QDjeyhWEZrSaukS4,35782
21
21
  nextmv/cloud/package.py,sha256=f0OjdlIOsI2LpmgSxdFf6YaA8Ucs9yAm_3bO0Cp8LH4,13027
22
- nextmv/cloud/run.py,sha256=zRPYeceNiuBMEcu-XZ2TUESn982HAUWGrwC2t13zHMg,19483
22
+ nextmv/cloud/run.py,sha256=YPBVjbnc6Ebgjxm5Rw1eY2-MiYx3KC7fQyqKWXY9auY,20836
23
23
  nextmv/cloud/safe.py,sha256=idifvV8P_79Zo2hIC_qxqZt9LUmD5TLQ9ikKwRUvd34,2522
24
24
  nextmv/cloud/scenario.py,sha256=JRFTDiFBcrgud6wE2qDHUu5oO-Ur3zbPYhhB6ONCxTo,14263
25
25
  nextmv/cloud/secrets.py,sha256=fA5cX0jfTsPVZWV7433wzETGlXpWRLHGswuObx9e6FQ,6820
26
26
  nextmv/cloud/status.py,sha256=blvykRCTCTBkaqH88j4dzdQLhU2v1Ig62-_va98zw20,2789
27
27
  nextmv/cloud/version.py,sha256=5_S7_pWUVBFbvAArku20eK7S645GJcHtgE2OpXLdSzQ,5300
28
- nextmv-0.29.0.dev0.dist-info/METADATA,sha256=YrBM8nB7Hk944fot4aDYWMSkepo1qIvHv8w18M9LPIk,15307
29
- nextmv-0.29.0.dev0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
30
- nextmv-0.29.0.dev0.dist-info/licenses/LICENSE,sha256=ZIbK-sSWA-OZprjNbmJAglYRtl5_K4l9UwAV3PGJAPc,11349
31
- nextmv-0.29.0.dev0.dist-info/RECORD,,
28
+ nextmv-0.29.2.dev1.dist-info/METADATA,sha256=U0q6Eh7QzFYBNZx1GAtncOgdzf79v0O98TsBNYNl92Y,15831
29
+ nextmv-0.29.2.dev1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
30
+ nextmv-0.29.2.dev1.dist-info/licenses/LICENSE,sha256=ZIbK-sSWA-OZprjNbmJAglYRtl5_K4l9UwAV3PGJAPc,11349
31
+ nextmv-0.29.2.dev1.dist-info/RECORD,,