modal 1.1.2.dev15__py3-none-any.whl → 1.1.2.dev16__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.
modal/cli/dict.py CHANGED
@@ -63,17 +63,21 @@ async def clear(name: str, *, yes: bool = YES_OPTION, env: Optional[str] = ENV_O
63
63
 
64
64
  @dict_cli.command(name="delete", rich_help_panel="Management")
65
65
  @synchronizer.create_blocking
66
- async def delete(name: str, *, yes: bool = YES_OPTION, env: Optional[str] = ENV_OPTION):
66
+ async def delete(
67
+ name: str,
68
+ *,
69
+ allow_missing: bool = Option(False, "--allow-missing", help="Don't error if the Dict doesn't exist."),
70
+ yes: bool = YES_OPTION,
71
+ env: Optional[str] = ENV_OPTION,
72
+ ):
67
73
  """Delete a named Dict and all of its data."""
68
- # Lookup first to validate the name, even though delete is a staticmethod
69
- await _Dict.from_name(name, environment_name=env).hydrate()
70
74
  if not yes:
71
75
  typer.confirm(
72
76
  f"Are you sure you want to irrevocably delete the modal.Dict '{name}'?",
73
77
  default=False,
74
78
  abort=True,
75
79
  )
76
- await _Dict.delete(name, environment_name=env)
80
+ await _Dict.objects.delete(name, environment_name=env, allow_missing=allow_missing)
77
81
 
78
82
 
79
83
  @dict_cli.command(name="get", rich_help_panel="Inspection")
modal/cli/queues.py CHANGED
@@ -45,17 +45,22 @@ async def create(name: str, *, env: Optional[str] = ENV_OPTION):
45
45
 
46
46
  @queue_cli.command(name="delete", rich_help_panel="Management")
47
47
  @synchronizer.create_blocking
48
- async def delete(name: str, *, yes: bool = YES_OPTION, env: Optional[str] = ENV_OPTION):
48
+ async def delete(
49
+ name: str,
50
+ *,
51
+ allow_missing: bool = Option(False, "--allow-missing", help="Don't error if the Queue doesn't exist."),
52
+ yes: bool = YES_OPTION,
53
+ env: Optional[str] = ENV_OPTION,
54
+ ):
49
55
  """Delete a named Queue and all of its data."""
50
- # Lookup first to validate the name, even though delete is a staticmethod
51
- await _Queue.from_name(name, environment_name=env).hydrate()
56
+ env = ensure_env(env)
52
57
  if not yes:
53
58
  typer.confirm(
54
59
  f"Are you sure you want to irrevocably delete the modal.Queue '{name}'?",
55
60
  default=False,
56
61
  abort=True,
57
62
  )
58
- await _Queue.delete(name, environment_name=env)
63
+ await _Queue.objects.delete(name, environment_name=env, allow_missing=allow_missing)
59
64
 
60
65
 
61
66
  @queue_cli.command(name="list", rich_help_panel="Management")
modal/cli/secret.py CHANGED
@@ -11,7 +11,7 @@ from typing import Optional
11
11
  import click
12
12
  import typer
13
13
  from rich.syntax import Syntax
14
- from typer import Argument
14
+ from typer import Argument, Option
15
15
 
16
16
  from modal._output import make_console
17
17
  from modal._utils.async_utils import synchronizer
@@ -158,26 +158,23 @@ def some_function():
158
158
  console.print(Syntax(example_code, "python"))
159
159
 
160
160
 
161
- @secret_cli.command("delete", help="Delete a named secret.")
161
+ @secret_cli.command("delete", help="Delete a named Secret.")
162
162
  @synchronizer.create_blocking
163
163
  async def delete(
164
- secret_name: str = Argument(help="Name of the modal.Secret to be deleted. Case sensitive"),
164
+ name: str = Argument(help="Name of the modal.Secret to be deleted. Case sensitive"),
165
+ *,
166
+ allow_missing: bool = Option(False, "--allow-missing", help="Don't error if the Secret doesn't exist."),
165
167
  yes: bool = YES_OPTION,
166
168
  env: Optional[str] = ENV_OPTION,
167
169
  ):
168
- """TODO"""
169
170
  env = ensure_env(env)
170
- secret = await _Secret.from_name(secret_name, environment_name=env).hydrate()
171
171
  if not yes:
172
172
  typer.confirm(
173
- f"Are you sure you want to irrevocably delete the modal.Secret '{secret_name}'?",
173
+ f"Are you sure you want to irrevocably delete the modal.Secret '{name}'?",
174
174
  default=False,
175
175
  abort=True,
176
176
  )
177
- client = await _Client.from_env()
178
-
179
- # TODO: replace with API on `modal.Secret` when we add it
180
- await client.stub.SecretDelete(api_pb2.SecretDeleteRequest(secret_id=secret.object_id))
177
+ await _Secret.objects.delete(name, environment_name=env, allow_missing=allow_missing)
181
178
 
182
179
 
183
180
  def get_text_from_editor(key) -> str:
modal/cli/volume.py CHANGED
@@ -274,25 +274,26 @@ async def cp(
274
274
 
275
275
  @volume_cli.command(
276
276
  name="delete",
277
- help="Delete a named, persistent modal.Volume.",
277
+ help="Delete a named Volume and all of its data.",
278
278
  rich_help_panel="Management",
279
279
  )
280
280
  @synchronizer.create_blocking
281
281
  async def delete(
282
- volume_name: str = Argument(help="Name of the modal.Volume to be deleted. Case sensitive"),
282
+ name: str = Argument(help="Name of the modal.Volume to be deleted. Case sensitive"),
283
+ *,
284
+ allow_missing: bool = Option(False, "--allow-missing", help="Don't error if the Volume doesn't exist."),
283
285
  yes: bool = YES_OPTION,
284
286
  env: Optional[str] = ENV_OPTION,
285
287
  ):
286
- # Lookup first to validate the name, even though delete is a staticmethod
287
- await _Volume.from_name(volume_name, environment_name=env).hydrate()
288
+ env = ensure_env(env)
288
289
  if not yes:
289
290
  typer.confirm(
290
- f"Are you sure you want to irrevocably delete the modal.Volume '{volume_name}'?",
291
+ f"Are you sure you want to irrevocably delete the modal.Volume '{name}'?",
291
292
  default=False,
292
293
  abort=True,
293
294
  )
294
295
 
295
- await _Volume.delete(volume_name, environment_name=env)
296
+ await _Volume.objects.delete(name, environment_name=env, allow_missing=allow_missing)
296
297
 
297
298
 
298
299
  @volume_cli.command(
modal/client.pyi CHANGED
@@ -33,7 +33,7 @@ class _Client:
33
33
  server_url: str,
34
34
  client_type: int,
35
35
  credentials: typing.Optional[tuple[str, str]],
36
- version: str = "1.1.2.dev15",
36
+ version: str = "1.1.2.dev16",
37
37
  ):
38
38
  """mdmd:hidden
39
39
  The Modal client object is not intended to be instantiated directly by users.
@@ -164,7 +164,7 @@ class Client:
164
164
  server_url: str,
165
165
  client_type: int,
166
166
  credentials: typing.Optional[tuple[str, str]],
167
- version: str = "1.1.2.dev15",
167
+ version: str = "1.1.2.dev16",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
modal/dict.py CHANGED
@@ -27,7 +27,7 @@ from ._utils.name_utils import check_object_name
27
27
  from ._utils.time_utils import as_timestamp, timestamp_to_localized_dt
28
28
  from .client import _Client
29
29
  from .config import logger
30
- from .exception import InvalidError, RequestSizeError
30
+ from .exception import InvalidError, NotFoundError, RequestSizeError
31
31
 
32
32
 
33
33
  def _serialize_dict(data):
@@ -104,6 +104,40 @@ class _DictManager:
104
104
  dicts = [_Dict._new_hydrated(item.dict_id, client, item.metadata, is_another_app=True) for item in items]
105
105
  return dicts[:max_objects] if max_objects is not None else dicts
106
106
 
107
+ @staticmethod
108
+ async def delete(
109
+ name: str, # Name of the Dict to delete
110
+ *,
111
+ allow_missing: bool = False, # If True, don't raise an error if the Dict doesn't exist
112
+ environment_name: Optional[str] = None, # Uses active environment if not specified
113
+ client: Optional[_Client] = None, # Optional client with Modal credentials
114
+ ):
115
+ """Delete a named Dict.
116
+
117
+ Warning: This deletes an *entire Dict*, not just a specific key.
118
+ Deletion is irreversible and will affect any Apps currently using the Dict.
119
+
120
+ **Examples:**
121
+
122
+ ```python notest
123
+ await modal.Dict.objects.delete("my-dict")
124
+ ```
125
+
126
+ Dicts will be deleted from the active environment, or another one can be specified:
127
+
128
+ ```python notest
129
+ await modal.Dict.objects.delete("my-dict", environment_name="dev")
130
+ ```
131
+ """
132
+ try:
133
+ obj = await _Dict.from_name(name, environment_name=environment_name).hydrate(client)
134
+ except NotFoundError:
135
+ if not allow_missing:
136
+ raise
137
+ else:
138
+ req = api_pb2.DictDeleteRequest(dict_id=obj.object_id)
139
+ await retry_transient_errors(obj._client.stub.DictDelete, req)
140
+
107
141
 
108
142
  DictManager = synchronize_api(_DictManager)
109
143
 
@@ -311,9 +345,18 @@ class _Dict(_Object, type_prefix="di"):
311
345
  client: Optional[_Client] = None,
312
346
  environment_name: Optional[str] = None,
313
347
  ):
314
- obj = await _Dict.from_name(name, environment_name=environment_name).hydrate(client)
315
- req = api_pb2.DictDeleteRequest(dict_id=obj.object_id)
316
- await retry_transient_errors(obj._client.stub.DictDelete, req)
348
+ """mdmd:hidden
349
+ Delete a named Dict object.
350
+
351
+ Warning: This deletes an *entire Dict*, not just a specific key.
352
+ Deletion is irreversible and will affect any Apps currently using the Dict.
353
+
354
+ DEPRECATED: This method is deprecated; we recommend using `modal.Dict.objects.delete` instead.
355
+ """
356
+ deprecation_warning(
357
+ (2025, 8, 6), "`modal.Dict.delete` is deprecated; we recommend using `modal.Dict.objects.delete` instead."
358
+ )
359
+ await _Dict.objects.delete(name, environment_name=environment_name, client=client)
317
360
 
318
361
  @live_method
319
362
  async def info(self) -> DictInfo:
modal/dict.pyi CHANGED
@@ -67,6 +67,33 @@ class _DictManager:
67
67
  """
68
68
  ...
69
69
 
70
+ @staticmethod
71
+ async def delete(
72
+ name: str,
73
+ *,
74
+ allow_missing: bool = False,
75
+ environment_name: typing.Optional[str] = None,
76
+ client: typing.Optional[modal.client._Client] = None,
77
+ ):
78
+ """Delete a named Dict.
79
+
80
+ Warning: This deletes an *entire Dict*, not just a specific key.
81
+ Deletion is irreversible and will affect any Apps currently using the Dict.
82
+
83
+ **Examples:**
84
+
85
+ ```python notest
86
+ await modal.Dict.objects.delete("my-dict")
87
+ ```
88
+
89
+ Dicts will be deleted from the active environment, or another one can be specified:
90
+
91
+ ```python notest
92
+ await modal.Dict.objects.delete("my-dict", environment_name="dev")
93
+ ```
94
+ """
95
+ ...
96
+
70
97
  class DictManager:
71
98
  """Namespace with methods for managing named Dict objects."""
72
99
  def __init__(self, /, *args, **kwargs):
@@ -142,6 +169,65 @@ class DictManager:
142
169
 
143
170
  list: __list_spec
144
171
 
172
+ class __delete_spec(typing_extensions.Protocol):
173
+ def __call__(
174
+ self,
175
+ /,
176
+ name: str,
177
+ *,
178
+ allow_missing: bool = False,
179
+ environment_name: typing.Optional[str] = None,
180
+ client: typing.Optional[modal.client.Client] = None,
181
+ ):
182
+ """Delete a named Dict.
183
+
184
+ Warning: This deletes an *entire Dict*, not just a specific key.
185
+ Deletion is irreversible and will affect any Apps currently using the Dict.
186
+
187
+ **Examples:**
188
+
189
+ ```python notest
190
+ await modal.Dict.objects.delete("my-dict")
191
+ ```
192
+
193
+ Dicts will be deleted from the active environment, or another one can be specified:
194
+
195
+ ```python notest
196
+ await modal.Dict.objects.delete("my-dict", environment_name="dev")
197
+ ```
198
+ """
199
+ ...
200
+
201
+ async def aio(
202
+ self,
203
+ /,
204
+ name: str,
205
+ *,
206
+ allow_missing: bool = False,
207
+ environment_name: typing.Optional[str] = None,
208
+ client: typing.Optional[modal.client.Client] = None,
209
+ ):
210
+ """Delete a named Dict.
211
+
212
+ Warning: This deletes an *entire Dict*, not just a specific key.
213
+ Deletion is irreversible and will affect any Apps currently using the Dict.
214
+
215
+ **Examples:**
216
+
217
+ ```python notest
218
+ await modal.Dict.objects.delete("my-dict")
219
+ ```
220
+
221
+ Dicts will be deleted from the active environment, or another one can be specified:
222
+
223
+ ```python notest
224
+ await modal.Dict.objects.delete("my-dict", environment_name="dev")
225
+ ```
226
+ """
227
+ ...
228
+
229
+ delete: __delete_spec
230
+
145
231
  class _Dict(modal._object._Object):
146
232
  """Distributed dictionary for storage in Modal apps.
147
233
 
@@ -274,7 +360,17 @@ class _Dict(modal._object._Object):
274
360
  *,
275
361
  client: typing.Optional[modal.client._Client] = None,
276
362
  environment_name: typing.Optional[str] = None,
277
- ): ...
363
+ ):
364
+ """mdmd:hidden
365
+ Delete a named Dict object.
366
+
367
+ Warning: This deletes an *entire Dict*, not just a specific key.
368
+ Deletion is irreversible and will affect any Apps currently using the Dict.
369
+
370
+ DEPRECATED: This method is deprecated; we recommend using `modal.Dict.objects.delete` instead.
371
+ """
372
+ ...
373
+
278
374
  async def info(self) -> DictInfo:
279
375
  """Return information about the Dict object."""
280
376
  ...
@@ -534,7 +630,17 @@ class Dict(modal.object.Object):
534
630
  *,
535
631
  client: typing.Optional[modal.client.Client] = None,
536
632
  environment_name: typing.Optional[str] = None,
537
- ): ...
633
+ ):
634
+ """mdmd:hidden
635
+ Delete a named Dict object.
636
+
637
+ Warning: This deletes an *entire Dict*, not just a specific key.
638
+ Deletion is irreversible and will affect any Apps currently using the Dict.
639
+
640
+ DEPRECATED: This method is deprecated; we recommend using `modal.Dict.objects.delete` instead.
641
+ """
642
+ ...
643
+
538
644
  async def aio(
539
645
  self,
540
646
  /,
@@ -542,7 +648,16 @@ class Dict(modal.object.Object):
542
648
  *,
543
649
  client: typing.Optional[modal.client.Client] = None,
544
650
  environment_name: typing.Optional[str] = None,
545
- ): ...
651
+ ):
652
+ """mdmd:hidden
653
+ Delete a named Dict object.
654
+
655
+ Warning: This deletes an *entire Dict*, not just a specific key.
656
+ Deletion is irreversible and will affect any Apps currently using the Dict.
657
+
658
+ DEPRECATED: This method is deprecated; we recommend using `modal.Dict.objects.delete` instead.
659
+ """
660
+ ...
546
661
 
547
662
  delete: __delete_spec
548
663
 
modal/functions.pyi CHANGED
@@ -433,7 +433,7 @@ class Function(
433
433
 
434
434
  _call_generator: ___call_generator_spec[typing_extensions.Self]
435
435
 
436
- class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
436
+ class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
437
437
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
438
438
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
439
439
  ...
@@ -442,7 +442,7 @@ class Function(
442
442
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
443
443
  ...
444
444
 
445
- remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
445
+ remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
446
446
 
447
447
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
448
448
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -469,7 +469,7 @@ class Function(
469
469
  """
470
470
  ...
471
471
 
472
- class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
472
+ class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
473
473
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
474
474
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
475
475
 
@@ -493,7 +493,7 @@ class Function(
493
493
  ...
494
494
 
495
495
  _experimental_spawn: ___experimental_spawn_spec[
496
- modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
496
+ modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
497
497
  ]
498
498
 
499
499
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
@@ -502,7 +502,7 @@ class Function(
502
502
 
503
503
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
504
504
 
505
- class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
505
+ class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
506
506
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
507
507
  """Calls the function with the given arguments, without waiting for the results.
508
508
 
@@ -523,7 +523,7 @@ class Function(
523
523
  """
524
524
  ...
525
525
 
526
- spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
526
+ spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
527
527
 
528
528
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
529
529
  """Return the inner Python object wrapped by this Modal Function."""
modal/queue.py CHANGED
@@ -29,7 +29,7 @@ from ._utils.grpc_utils import retry_transient_errors
29
29
  from ._utils.name_utils import check_object_name
30
30
  from ._utils.time_utils import as_timestamp, timestamp_to_localized_dt
31
31
  from .client import _Client
32
- from .exception import InvalidError, RequestSizeError
32
+ from .exception import InvalidError, NotFoundError, RequestSizeError
33
33
 
34
34
 
35
35
  @dataclass
@@ -102,6 +102,40 @@ class _QueueManager:
102
102
  queues = [_Queue._new_hydrated(item.queue_id, client, item.metadata, is_another_app=True) for item in items]
103
103
  return queues[:max_objects] if max_objects is not None else queues
104
104
 
105
+ @staticmethod
106
+ async def delete(
107
+ name: str, # Name of the Queue to delete
108
+ *,
109
+ allow_missing: bool = False, # If True, don't raise an error if the Queue doesn't exist
110
+ environment_name: Optional[str] = None, # Uses active environment if not specified
111
+ client: Optional[_Client] = None, # Optional client with Modal credentials
112
+ ):
113
+ """Delete a named Queue.
114
+
115
+ Warning: This deletes an *entire Queue*, not just a specific entry or partition.
116
+ Deletion is irreversible and will affect any Apps currently using the Queue.
117
+
118
+ **Examples:**
119
+
120
+ ```python notest
121
+ await modal.Queue.objects.delete("my-queue")
122
+ ```
123
+
124
+ Queues will be deleted from the active environment, or another one can be specified:
125
+
126
+ ```python notest
127
+ await modal.Queue.objects.delete("my-queue", environment_name="dev")
128
+ ```
129
+ """
130
+ try:
131
+ obj = await _Queue.from_name(name, environment_name=environment_name).hydrate(client)
132
+ except NotFoundError:
133
+ if not allow_missing:
134
+ raise
135
+ else:
136
+ req = api_pb2.QueueDeleteRequest(queue_id=obj.object_id)
137
+ await retry_transient_errors(obj._client.stub.QueueDelete, req)
138
+
105
139
 
106
140
  QueueManager = synchronize_api(_QueueManager)
107
141
 
@@ -323,9 +357,20 @@ class _Queue(_Object, type_prefix="qu"):
323
357
 
324
358
  @staticmethod
325
359
  async def delete(name: str, *, client: Optional[_Client] = None, environment_name: Optional[str] = None):
326
- obj = await _Queue.from_name(name, environment_name=environment_name).hydrate(client)
327
- req = api_pb2.QueueDeleteRequest(queue_id=obj.object_id)
328
- await retry_transient_errors(obj._client.stub.QueueDelete, req)
360
+ """mdmd:hidden
361
+ Delete a named Queue.
362
+
363
+ Warning: This deletes an *entire Queue*, not just a specific entry or partition.
364
+ Deletion is irreversible and will affect any Apps currently using the Queue.
365
+
366
+ DEPRECATED: This method is deprecated; we recommend using `modal.Queue.objects.delete` instead.
367
+
368
+ """
369
+ deprecation_warning(
370
+ (2025, 8, 6),
371
+ "`modal.Queue.delete` is deprecated; we recommend using `modal.Queue.objects.delete` instead.",
372
+ )
373
+ await _Queue.objects.delete(name, environment_name=environment_name, client=client)
329
374
 
330
375
  @live_method
331
376
  async def info(self) -> QueueInfo:
modal/queue.pyi CHANGED
@@ -65,6 +65,33 @@ class _QueueManager:
65
65
  """
66
66
  ...
67
67
 
68
+ @staticmethod
69
+ async def delete(
70
+ name: str,
71
+ *,
72
+ allow_missing: bool = False,
73
+ environment_name: typing.Optional[str] = None,
74
+ client: typing.Optional[modal.client._Client] = None,
75
+ ):
76
+ """Delete a named Queue.
77
+
78
+ Warning: This deletes an *entire Queue*, not just a specific entry or partition.
79
+ Deletion is irreversible and will affect any Apps currently using the Queue.
80
+
81
+ **Examples:**
82
+
83
+ ```python notest
84
+ await modal.Queue.objects.delete("my-queue")
85
+ ```
86
+
87
+ Queues will be deleted from the active environment, or another one can be specified:
88
+
89
+ ```python notest
90
+ await modal.Queue.objects.delete("my-queue", environment_name="dev")
91
+ ```
92
+ """
93
+ ...
94
+
68
95
  class QueueManager:
69
96
  """Namespace with methods for managing named Queue objects."""
70
97
  def __init__(self, /, *args, **kwargs):
@@ -140,6 +167,65 @@ class QueueManager:
140
167
 
141
168
  list: __list_spec
142
169
 
170
+ class __delete_spec(typing_extensions.Protocol):
171
+ def __call__(
172
+ self,
173
+ /,
174
+ name: str,
175
+ *,
176
+ allow_missing: bool = False,
177
+ environment_name: typing.Optional[str] = None,
178
+ client: typing.Optional[modal.client.Client] = None,
179
+ ):
180
+ """Delete a named Queue.
181
+
182
+ Warning: This deletes an *entire Queue*, not just a specific entry or partition.
183
+ Deletion is irreversible and will affect any Apps currently using the Queue.
184
+
185
+ **Examples:**
186
+
187
+ ```python notest
188
+ await modal.Queue.objects.delete("my-queue")
189
+ ```
190
+
191
+ Queues will be deleted from the active environment, or another one can be specified:
192
+
193
+ ```python notest
194
+ await modal.Queue.objects.delete("my-queue", environment_name="dev")
195
+ ```
196
+ """
197
+ ...
198
+
199
+ async def aio(
200
+ self,
201
+ /,
202
+ name: str,
203
+ *,
204
+ allow_missing: bool = False,
205
+ environment_name: typing.Optional[str] = None,
206
+ client: typing.Optional[modal.client.Client] = None,
207
+ ):
208
+ """Delete a named Queue.
209
+
210
+ Warning: This deletes an *entire Queue*, not just a specific entry or partition.
211
+ Deletion is irreversible and will affect any Apps currently using the Queue.
212
+
213
+ **Examples:**
214
+
215
+ ```python notest
216
+ await modal.Queue.objects.delete("my-queue")
217
+ ```
218
+
219
+ Queues will be deleted from the active environment, or another one can be specified:
220
+
221
+ ```python notest
222
+ await modal.Queue.objects.delete("my-queue", environment_name="dev")
223
+ ```
224
+ """
225
+ ...
226
+
227
+ delete: __delete_spec
228
+
143
229
  class _Queue(modal._object._Object):
144
230
  """Distributed, FIFO queue for data flow in Modal apps.
145
231
 
@@ -297,7 +383,17 @@ class _Queue(modal._object._Object):
297
383
  *,
298
384
  client: typing.Optional[modal.client._Client] = None,
299
385
  environment_name: typing.Optional[str] = None,
300
- ): ...
386
+ ):
387
+ """mdmd:hidden
388
+ Delete a named Queue.
389
+
390
+ Warning: This deletes an *entire Queue*, not just a specific entry or partition.
391
+ Deletion is irreversible and will affect any Apps currently using the Queue.
392
+
393
+ DEPRECATED: This method is deprecated; we recommend using `modal.Queue.objects.delete` instead.
394
+ """
395
+ ...
396
+
301
397
  async def info(self) -> QueueInfo:
302
398
  """Return information about the Queue object."""
303
399
  ...
@@ -597,7 +693,17 @@ class Queue(modal.object.Object):
597
693
  *,
598
694
  client: typing.Optional[modal.client.Client] = None,
599
695
  environment_name: typing.Optional[str] = None,
600
- ): ...
696
+ ):
697
+ """mdmd:hidden
698
+ Delete a named Queue.
699
+
700
+ Warning: This deletes an *entire Queue*, not just a specific entry or partition.
701
+ Deletion is irreversible and will affect any Apps currently using the Queue.
702
+
703
+ DEPRECATED: This method is deprecated; we recommend using `modal.Queue.objects.delete` instead.
704
+ """
705
+ ...
706
+
601
707
  async def aio(
602
708
  self,
603
709
  /,
@@ -605,7 +711,16 @@ class Queue(modal.object.Object):
605
711
  *,
606
712
  client: typing.Optional[modal.client.Client] = None,
607
713
  environment_name: typing.Optional[str] = None,
608
- ): ...
714
+ ):
715
+ """mdmd:hidden
716
+ Delete a named Queue.
717
+
718
+ Warning: This deletes an *entire Queue*, not just a specific entry or partition.
719
+ Deletion is irreversible and will affect any Apps currently using the Queue.
720
+
721
+ DEPRECATED: This method is deprecated; we recommend using `modal.Queue.objects.delete` instead.
722
+ """
723
+ ...
609
724
 
610
725
  delete: __delete_spec
611
726
 
modal/secret.py CHANGED
@@ -94,6 +94,39 @@ class _SecretManager:
94
94
  secrets = [_Secret._new_hydrated(item.secret_id, client, item.metadata, is_another_app=True) for item in items]
95
95
  return secrets[:max_objects] if max_objects is not None else secrets
96
96
 
97
+ @staticmethod
98
+ async def delete(
99
+ name: str, # Name of the Secret to delete
100
+ *,
101
+ allow_missing: bool = False, # If True, don't raise an error if the Secret doesn't exist
102
+ environment_name: Optional[str] = None, # Uses active environment if not specified
103
+ client: Optional[_Client] = None, # Optional client with Modal credentials
104
+ ):
105
+ """Delete a named Secret.
106
+
107
+ Warning: Deletion is irreversible and will affect any Apps currently using the Secret.
108
+
109
+ **Examples:**
110
+
111
+ ```python notest
112
+ await modal.Secret.objects.delete("my-secret")
113
+ ```
114
+
115
+ Secrets will be deleted from the active environment, or another one can be specified:
116
+
117
+ ```python notest
118
+ await modal.Secret.objects.delete("my-secret", environment_name="dev")
119
+ ```
120
+ """
121
+ try:
122
+ obj = await _Secret.from_name(name, environment_name=environment_name).hydrate(client)
123
+ except NotFoundError:
124
+ if not allow_missing:
125
+ raise
126
+ else:
127
+ req = api_pb2.SecretDeleteRequest(secret_id=obj.object_id)
128
+ await retry_transient_errors(obj._client.stub.SecretDelete, req)
129
+
97
130
 
98
131
  SecretManager = synchronize_api(_SecretManager)
99
132
 
modal/secret.pyi CHANGED
@@ -63,6 +63,32 @@ class _SecretManager:
63
63
  """
64
64
  ...
65
65
 
66
+ @staticmethod
67
+ async def delete(
68
+ name: str,
69
+ *,
70
+ allow_missing: bool = False,
71
+ environment_name: typing.Optional[str] = None,
72
+ client: typing.Optional[modal.client._Client] = None,
73
+ ):
74
+ """Delete a named Secret.
75
+
76
+ Warning: Deletion is irreversible and will affect any Apps currently using the Secret.
77
+
78
+ **Examples:**
79
+
80
+ ```python notest
81
+ await modal.Secret.objects.delete("my-secret")
82
+ ```
83
+
84
+ Secrets will be deleted from the active environment, or another one can be specified:
85
+
86
+ ```python notest
87
+ await modal.Secret.objects.delete("my-secret", environment_name="dev")
88
+ ```
89
+ """
90
+ ...
91
+
66
92
  class SecretManager:
67
93
  """Namespace with methods for managing named Secret objects."""
68
94
  def __init__(self, /, *args, **kwargs):
@@ -138,6 +164,63 @@ class SecretManager:
138
164
 
139
165
  list: __list_spec
140
166
 
167
+ class __delete_spec(typing_extensions.Protocol):
168
+ def __call__(
169
+ self,
170
+ /,
171
+ name: str,
172
+ *,
173
+ allow_missing: bool = False,
174
+ environment_name: typing.Optional[str] = None,
175
+ client: typing.Optional[modal.client.Client] = None,
176
+ ):
177
+ """Delete a named Secret.
178
+
179
+ Warning: Deletion is irreversible and will affect any Apps currently using the Secret.
180
+
181
+ **Examples:**
182
+
183
+ ```python notest
184
+ await modal.Secret.objects.delete("my-secret")
185
+ ```
186
+
187
+ Secrets will be deleted from the active environment, or another one can be specified:
188
+
189
+ ```python notest
190
+ await modal.Secret.objects.delete("my-secret", environment_name="dev")
191
+ ```
192
+ """
193
+ ...
194
+
195
+ async def aio(
196
+ self,
197
+ /,
198
+ name: str,
199
+ *,
200
+ allow_missing: bool = False,
201
+ environment_name: typing.Optional[str] = None,
202
+ client: typing.Optional[modal.client.Client] = None,
203
+ ):
204
+ """Delete a named Secret.
205
+
206
+ Warning: Deletion is irreversible and will affect any Apps currently using the Secret.
207
+
208
+ **Examples:**
209
+
210
+ ```python notest
211
+ await modal.Secret.objects.delete("my-secret")
212
+ ```
213
+
214
+ Secrets will be deleted from the active environment, or another one can be specified:
215
+
216
+ ```python notest
217
+ await modal.Secret.objects.delete("my-secret", environment_name="dev")
218
+ ```
219
+ """
220
+ ...
221
+
222
+ delete: __delete_spec
223
+
141
224
  class _Secret(modal._object._Object):
142
225
  """Secrets provide a dictionary of environment variables for images.
143
226
 
modal/volume.py CHANGED
@@ -30,7 +30,7 @@ from synchronicity.async_wrap import asynccontextmanager
30
30
 
31
31
  import modal.exception
32
32
  import modal_proto.api_pb2
33
- from modal.exception import InvalidError, VolumeUploadTimeoutError
33
+ from modal.exception import InvalidError, NotFoundError, VolumeUploadTimeoutError
34
34
  from modal_proto import api_pb2
35
35
 
36
36
  from ._object import (
@@ -171,6 +171,40 @@ class _VolumeManager:
171
171
  volumes = [_Volume._new_hydrated(item.volume_id, client, item.metadata, is_another_app=True) for item in items]
172
172
  return volumes[:max_objects] if max_objects is not None else volumes
173
173
 
174
+ @staticmethod
175
+ async def delete(
176
+ name: str, # Name of the Volume to delete
177
+ *,
178
+ allow_missing: bool = False, # If True, don't raise an error if the Volume doesn't exist
179
+ environment_name: Optional[str] = None, # Uses active environment if not specified
180
+ client: Optional[_Client] = None, # Optional client with Modal credentials
181
+ ):
182
+ """Delete a named Volume.
183
+
184
+ Warning: This deletes an *entire Volume*, not just a specific file.
185
+ Deletion is irreversible and will affect any Apps currently using the Volume.
186
+
187
+ **Examples:**
188
+
189
+ ```python notest
190
+ await modal.Volume.objects.delete("my-volume")
191
+ ```
192
+
193
+ Volumes will be deleted from the active environment, or another one can be specified:
194
+
195
+ ```python notest
196
+ await modal.Volume.objects.delete("my-volume", environment_name="dev")
197
+ ```
198
+ """
199
+ try:
200
+ obj = await _Volume.from_name(name, environment_name=environment_name).hydrate(client)
201
+ except NotFoundError:
202
+ if not allow_missing:
203
+ raise
204
+ else:
205
+ req = api_pb2.VolumeDeleteRequest(volume_id=obj.object_id)
206
+ await retry_transient_errors(obj._client.stub.VolumeDelete, req)
207
+
174
208
 
175
209
  VolumeManager = synchronize_api(_VolumeManager)
176
210
 
@@ -719,9 +753,20 @@ class _Volume(_Object, type_prefix="vo"):
719
753
 
720
754
  @staticmethod
721
755
  async def delete(name: str, client: Optional[_Client] = None, environment_name: Optional[str] = None):
722
- obj = await _Volume.from_name(name, environment_name=environment_name).hydrate(client)
723
- req = api_pb2.VolumeDeleteRequest(volume_id=obj.object_id)
724
- await retry_transient_errors(obj._client.stub.VolumeDelete, req)
756
+ """mdmd:hidden
757
+ Delete a named Volume.
758
+
759
+ Warning: This deletes an *entire Volume*, not just a specific file.
760
+ Deletion is irreversible and will affect any Apps currently using the Volume.
761
+
762
+ DEPRECATED: This method is deprecated; we recommend using `modal.Volume.objects.delete` instead.
763
+
764
+ """
765
+ deprecation_warning(
766
+ (2025, 8, 6),
767
+ "`modal.Volume.delete` is deprecated; we recommend using `modal.Volume.objects.delete` instead.",
768
+ )
769
+ await _Volume.objects.delete(name, environment_name=environment_name, client=client)
725
770
 
726
771
  @staticmethod
727
772
  async def rename(
modal/volume.pyi CHANGED
@@ -114,6 +114,33 @@ class _VolumeManager:
114
114
  """
115
115
  ...
116
116
 
117
+ @staticmethod
118
+ async def delete(
119
+ name: str,
120
+ *,
121
+ allow_missing: bool = False,
122
+ environment_name: typing.Optional[str] = None,
123
+ client: typing.Optional[modal.client._Client] = None,
124
+ ):
125
+ """Delete a named Volume.
126
+
127
+ Warning: This deletes an *entire Volume*, not just a specific file.
128
+ Deletion is irreversible and will affect any Apps currently using the Volume.
129
+
130
+ **Examples:**
131
+
132
+ ```python notest
133
+ await modal.Volume.objects.delete("my-volume")
134
+ ```
135
+
136
+ Volumes will be deleted from the active environment, or another one can be specified:
137
+
138
+ ```python notest
139
+ await modal.Volume.objects.delete("my-volume", environment_name="dev")
140
+ ```
141
+ """
142
+ ...
143
+
117
144
  class VolumeManager:
118
145
  """Namespace with methods for managing named Volume objects."""
119
146
  def __init__(self, /, *args, **kwargs):
@@ -189,6 +216,65 @@ class VolumeManager:
189
216
 
190
217
  list: __list_spec
191
218
 
219
+ class __delete_spec(typing_extensions.Protocol):
220
+ def __call__(
221
+ self,
222
+ /,
223
+ name: str,
224
+ *,
225
+ allow_missing: bool = False,
226
+ environment_name: typing.Optional[str] = None,
227
+ client: typing.Optional[modal.client.Client] = None,
228
+ ):
229
+ """Delete a named Volume.
230
+
231
+ Warning: This deletes an *entire Volume*, not just a specific file.
232
+ Deletion is irreversible and will affect any Apps currently using the Volume.
233
+
234
+ **Examples:**
235
+
236
+ ```python notest
237
+ await modal.Volume.objects.delete("my-volume")
238
+ ```
239
+
240
+ Volumes will be deleted from the active environment, or another one can be specified:
241
+
242
+ ```python notest
243
+ await modal.Volume.objects.delete("my-volume", environment_name="dev")
244
+ ```
245
+ """
246
+ ...
247
+
248
+ async def aio(
249
+ self,
250
+ /,
251
+ name: str,
252
+ *,
253
+ allow_missing: bool = False,
254
+ environment_name: typing.Optional[str] = None,
255
+ client: typing.Optional[modal.client.Client] = None,
256
+ ):
257
+ """Delete a named Volume.
258
+
259
+ Warning: This deletes an *entire Volume*, not just a specific file.
260
+ Deletion is irreversible and will affect any Apps currently using the Volume.
261
+
262
+ **Examples:**
263
+
264
+ ```python notest
265
+ await modal.Volume.objects.delete("my-volume")
266
+ ```
267
+
268
+ Volumes will be deleted from the active environment, or another one can be specified:
269
+
270
+ ```python notest
271
+ await modal.Volume.objects.delete("my-volume", environment_name="dev")
272
+ ```
273
+ """
274
+ ...
275
+
276
+ delete: __delete_spec
277
+
192
278
  class _Volume(modal._object._Object):
193
279
  """A writeable volume that can be used to share files between one or more Modal functions.
194
280
 
@@ -479,7 +565,17 @@ class _Volume(modal._object._Object):
479
565
  @staticmethod
480
566
  async def delete(
481
567
  name: str, client: typing.Optional[modal.client._Client] = None, environment_name: typing.Optional[str] = None
482
- ): ...
568
+ ):
569
+ """mdmd:hidden
570
+ Delete a named Volume.
571
+
572
+ Warning: This deletes an *entire Volume*, not just a specific file.
573
+ Deletion is irreversible and will affect any Apps currently using the Volume.
574
+
575
+ DEPRECATED: This method is deprecated; we recommend using `modal.Volume.objects.delete` instead.
576
+ """
577
+ ...
578
+
483
579
  @staticmethod
484
580
  async def rename(
485
581
  old_name: str,
@@ -1000,14 +1096,33 @@ class Volume(modal.object.Object):
1000
1096
  name: str,
1001
1097
  client: typing.Optional[modal.client.Client] = None,
1002
1098
  environment_name: typing.Optional[str] = None,
1003
- ): ...
1099
+ ):
1100
+ """mdmd:hidden
1101
+ Delete a named Volume.
1102
+
1103
+ Warning: This deletes an *entire Volume*, not just a specific file.
1104
+ Deletion is irreversible and will affect any Apps currently using the Volume.
1105
+
1106
+ DEPRECATED: This method is deprecated; we recommend using `modal.Volume.objects.delete` instead.
1107
+ """
1108
+ ...
1109
+
1004
1110
  async def aio(
1005
1111
  self,
1006
1112
  /,
1007
1113
  name: str,
1008
1114
  client: typing.Optional[modal.client.Client] = None,
1009
1115
  environment_name: typing.Optional[str] = None,
1010
- ): ...
1116
+ ):
1117
+ """mdmd:hidden
1118
+ Delete a named Volume.
1119
+
1120
+ Warning: This deletes an *entire Volume*, not just a specific file.
1121
+ Deletion is irreversible and will affect any Apps currently using the Volume.
1122
+
1123
+ DEPRECATED: This method is deprecated; we recommend using `modal.Volume.objects.delete` instead.
1124
+ """
1125
+ ...
1011
1126
 
1012
1127
  delete: __delete_spec
1013
1128
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.2.dev15
3
+ Version: 1.1.2.dev16
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -22,7 +22,7 @@ modal/app.py,sha256=kpq4kXp7pch688y6g55QYAC10wqPTU5FXKoWPMirA3E,47899
22
22
  modal/app.pyi,sha256=-jKXlGDBWRPVsuenBhdMRqawK-L2eiJ7gHbmSblhltg,43525
23
23
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
24
24
  modal/client.py,sha256=kyAIVB3Ay-XKJizQ_1ufUFB__EagV0MLmHJpyYyJ7J0,18636
25
- modal/client.pyi,sha256=wvmCOCOyaHOxFp4nUrQNW19iSCEs1NTs9PlY3-JoZjo,15831
25
+ modal/client.pyi,sha256=IwXcU0POnalVA3djJSCg_k5csRk3QaWhLOAF5OjT6xo,15831
26
26
  modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
27
27
  modal/cloud_bucket_mount.pyi,sha256=-qSfYAQvIoO_l2wsCCGTG5ZUwQieNKXdAO00yP1-LYU,7394
28
28
  modal/cls.py,sha256=7A0xGnugQzm8dOfnKMjLjtqekRlRtQ0jPFRYgq6xdUM,40018
@@ -30,8 +30,8 @@ modal/cls.pyi,sha256=_tZ5qrlL-ZDEcD-mf9BZkkNH5XPr4SmGTEQ-RVmqF3I,27772
30
30
  modal/config.py,sha256=tW-SEGjVvAt3D_MNi3LhxXnFKIA9fjLd3UIgbW8uSJE,12121
31
31
  modal/container_process.py,sha256=XkPwNIW-iD_GB9u9yqv9q8y-i5cQ8eBbLZZ_GvEw9t8,6858
32
32
  modal/container_process.pyi,sha256=9m-st3hCUlNN1GOTctfPPvIvoLtEl7FbuGWwif5-7YU,6037
33
- modal/dict.py,sha256=w_AnV724XE2gF7cx5FqeR6SaGN4nFRhGSbZxrCTK2i0,18551
34
- modal/dict.pyi,sha256=AXQFTk99oj_0om5mvUmhBbFve2u3ZIpxniervijGKFg,26280
33
+ modal/dict.py,sha256=Xhc26Zl4LFjEsz32u36qbfvc70mlZ_VDAd_QsKOrNCY,20173
34
+ modal/dict.pyi,sha256=zHj9XK1uv8PR8Vvd9-RmMMd52002SxoNjNsrK2Bn1OE,29914
35
35
  modal/environments.py,sha256=gHFNLG78bqgizpQ4w_elz27QOqmcgAonFsmLs7NjUJ4,6804
36
36
  modal/environments.pyi,sha256=9-KtrzAcUe55cCP4020lSUD7-fWS7OPakAHssq4-bro,4219
37
37
  modal/exception.py,sha256=o0V93PK8Hcg2YQ2aeOB1Y-qWBw4Gz5ATfyokR8GapuQ,5634
@@ -39,7 +39,7 @@ modal/file_io.py,sha256=BVqAJ0sgPUfN8QsYztWiGB4j56he60TncM02KsylnCw,21449
39
39
  modal/file_io.pyi,sha256=cPT_hsplE5iLCXhYOLn1Sp9eDdk7DxdFmicQHanJZyg,15918
40
40
  modal/file_pattern_matcher.py,sha256=A_Kdkej6q7YQyhM_2-BvpFmPqJ0oHb54B6yf9VqvPVE,8116
41
41
  modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
42
- modal/functions.pyi,sha256=65HxorqpspknohUdxFYzKIdL1-P3JYSQLQEhcmhWgpw,36161
42
+ modal/functions.pyi,sha256=s3PQtacOfSeHukLR7Xz3qGD2sVh-CEgfpjgimv2gCCo,36161
43
43
  modal/gpu.py,sha256=Fe5ORvVPDIstSq1xjmM6OoNgLYFWvogP9r5BgmD3hYg,6769
44
44
  modal/image.py,sha256=A83nmo0zfCUwgvJh0LZ7Yc1sYvDnZLl_phbKxN-9HIw,103144
45
45
  modal/image.pyi,sha256=oH-GCHVEwD5fOX0K_IaWN5RKZlYwX82z-K4wxx8aN3c,68541
@@ -59,8 +59,8 @@ modal/partial_function.pyi,sha256=lqqOzZ9-QvHTDWKQ_oAYYOvsXgTOBKhO9u-RI98JbUk,13
59
59
  modal/proxy.py,sha256=NQJJMGo-D2IfmeU0vb10WWaE4oTLcuf9jTeEJvactOg,1446
60
60
  modal/proxy.pyi,sha256=yWGWwADCRGrC2w81B7671UTH4Uv3HMZKy5vVqlJUZoA,1417
61
61
  modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
- modal/queue.py,sha256=zEMCW_nDsROQ6mn6cVPmJCYnGxBMX2N2UfZy36klVNc,23071
63
- modal/queue.pyi,sha256=nWxvJ6hVMgI1HGu9jLuUne122uD-MQVDHdGzUcse-ng,32076
62
+ modal/queue.py,sha256=bmfEEMzkQHeMhCoxQj2DEGLlrBq2pe1n6JloLU_LuT4,24747
63
+ modal/queue.pyi,sha256=cnnd5ZxZA3X0xT-igJbLC3p0TXATNwkJaXC8qCeFphQ,35815
64
64
  modal/retries.py,sha256=IvNLDM0f_GLUDD5VgEDoN09C88yoxSrCquinAuxT1Sc,5205
65
65
  modal/runner.py,sha256=ostdzYpQb-20tlD6dIq7bpWTkZkOhjJBNuMNektqnJA,24068
66
66
  modal/runner.pyi,sha256=lbwLljm1cC8d6PcNvmYQhkE8501V9fg0bYqqKX6G4r4,8489
@@ -69,8 +69,8 @@ modal/sandbox.py,sha256=eQd0Cf9yTFCNshnj7oH8WvecbhVIwsEsmuXB9O-REis,40927
69
69
  modal/sandbox.pyi,sha256=_ddnvZGauSRG-WelsMB5oPil8KVWb0PSvmuAzAzrLIw,41713
70
70
  modal/schedule.py,sha256=ng0g0AqNY5GQI9KhkXZQ5Wam5G42glbkqVQsNpBtbDE,3078
71
71
  modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
72
- modal/secret.py,sha256=v6KCSsSVuUVPsblpvP6b27aaDLHLt5xAVJsTzuymE48,14709
73
- modal/secret.pyi,sha256=J641LaHIWGSBH5HbC1hGFJnkk_MECSIAwVKufegGBq8,13517
72
+ modal/secret.py,sha256=uJUms_p7HtWFME8maVHSoHEGB_serWHTHM-z6oJb5cM,15923
73
+ modal/secret.pyi,sha256=5YTMzaybIoBtOFhK2T2SuhhvHBbo4lDm8sBqH-rITtk,15912
74
74
  modal/serving.py,sha256=3I3WBeVbzZY258u9PXBCW_dZBgypq3OhwBuTVvlgubE,4423
75
75
  modal/serving.pyi,sha256=YfixTaWikyYpwhnNxCHMZnDDQiPmV1xJ87QF91U_WGU,1924
76
76
  modal/snapshot.py,sha256=E3oxYQkYVRB_LeFBfmUV1Y6vHz8-azXJfC4x7A1QKnI,1455
@@ -78,8 +78,8 @@ modal/snapshot.pyi,sha256=0q83hlmWxAhDu8xwZyL5VmYh0i8Tigf7S60or2k30L8,1682
78
78
  modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
79
79
  modal/token_flow.py,sha256=GWpar0gANs71vm9Bd_Cj87UG1K3ljTURbkEjG3JLsrY,7616
80
80
  modal/token_flow.pyi,sha256=eirYjyqbRiT3GCKMIPHJPpkvBTu8WxDKqSHehWaJI_4,2533
81
- modal/volume.py,sha256=PipdiVxMpk5Fbhpq6cKI9cEsQNdCHUTFLb9YME07L_Q,48131
82
- modal/volume.pyi,sha256=_SPWRDH7u-UUSIgz5GnolgqDenU-wgYVtWE60oTKoFU,45736
81
+ modal/volume.py,sha256=l_hBz7xpfbXCIhY3KSrgwLHzvHQk-w9lLHoEPrXGzLU,49796
82
+ modal/volume.pyi,sha256=fnHhR152qCh5St7XT-PReQK_tPAQ0hmcXKoezOulEl4,49427
83
83
  modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
84
84
  modal/_runtime/asgi.py,sha256=_2xSTsDD27Cit7xnMs4lzkJA2wzer2_N4Oa3BkXFzVA,22521
85
85
  modal/_runtime/container_io_manager.py,sha256=9oqlKKPuLZjE7rYw3zTK30XUZighT3s4ZlA-9oxXOVI,45206
@@ -131,19 +131,19 @@ modal/cli/app.py,sha256=rbuAG92my-1eZN0olk6p2eD4oBnyBliUsrCOUW-U-9k,7832
131
131
  modal/cli/cluster.py,sha256=8pQurDUvLP_HdSeHH5ZB6WIoDh48FR8qP9vGOtSsFXI,3168
132
132
  modal/cli/config.py,sha256=lhp2Pq4RbTDhaZJ-ZJvhrMqJj8c-WjuRX6gjE3TrvXc,1691
133
133
  modal/cli/container.py,sha256=9Ti-TIZ6vjDSmn9mk9h6SRwyhkQjtwirBN18LjpLyvE,3719
134
- modal/cli/dict.py,sha256=qClZPzaWvv8dm2bDaD6jYHkmJoooMzUHxKCd69whrb0,4551
134
+ modal/cli/dict.py,sha256=YAJtiv41YcCd5Fqam3hXCNTs4Y0yOgGR_i6RfQNSAFM,4572
135
135
  modal/cli/entry_point.py,sha256=M9ZeIsYx7rxdc6XP2iOIptVzmpj39D3rU8nfW7Dc3CQ,4388
136
136
  modal/cli/environment.py,sha256=Ayddkiq9jdj3XYDJ8ZmUqFpPPH8xajYlbexRkzGtUcg,4334
137
137
  modal/cli/import_refs.py,sha256=X59Z5JwgliRO6C-cIFto2Pr7o3SwlZMKQPKA0aI4ZK4,13927
138
138
  modal/cli/launch.py,sha256=A5NtAgVDnTMlVFNfTlGS4p4Hbhpub8jZL_T9wvCkK5k,6155
139
139
  modal/cli/network_file_system.py,sha256=I9IqTpVfk32uKYwGd8LTldkQx6UKYrQYNZ26q7Ab5Oo,8126
140
140
  modal/cli/profile.py,sha256=g8X6tFFK9ccKyu2he9Yu19WLSLNdztzECgmIV__XJFs,3257
141
- modal/cli/queues.py,sha256=RkSxO4zgB5Mk7nZzN9GAJ-oRdmVzTig3o7a7U1HKh7M,6093
141
+ modal/cli/queues.py,sha256=5vKtKQ7YExdaxNPYZ0g5suU9sX0-F5h0zy0qBV-hN80,6140
142
142
  modal/cli/run.py,sha256=96m6fpJKbjtva4xzJut0pxS36Z5WCMq0umpAry96im0,24946
143
- modal/cli/secret.py,sha256=AmtXi8HFIph2cHy3z6U0qBEMzQ49Cr3MYgkJad3tWY8,8062
143
+ modal/cli/secret.py,sha256=joJkA78-jKyGHx6VkpgCYvyWqmPa_BnU_GBMhpwsgTQ,7972
144
144
  modal/cli/token.py,sha256=NAmQzKBfEHkcldWKeFxAVIqQBoo1RTp7_A4yc7-8qM0,1911
145
145
  modal/cli/utils.py,sha256=aUXDU9_VgcJrGaGRy4bGf4dqwKYXHCpoO27x4m_bpuo,3293
146
- modal/cli/volume.py,sha256=xKjNixun7nIKQkqqZZDsKx756V0AFUx0D6RVXHQOEYA,10751
146
+ modal/cli/volume.py,sha256=73u0wj3xXGb2sGG6sR9StY4rE8OG7Ec_3_iPnXRUgPo,10760
147
147
  modal/cli/programs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
148
148
  modal/cli/programs/launch_instance_ssh.py,sha256=GrwK_Vy8-7B4x5a6AqFaF7lqNVgu75JYZ2BtFV0_DOw,2660
149
149
  modal/cli/programs/run_jupyter.py,sha256=44Lpvqk2l3hH-uOkmAOzw60NEsfB5uaRDWDKVshvQhs,2682
@@ -153,7 +153,7 @@ modal/experimental/__init__.py,sha256=v5uDRPVr2BNEyeOo6YNWNF5yFUddr66habUvEAqOAG
153
153
  modal/experimental/flash.py,sha256=viXQumCIFp5VFsPFURdFTBTjP_QnsAi8nSWXAMmfjeQ,19744
154
154
  modal/experimental/flash.pyi,sha256=A8_qJGtGoXEzKDdHbvhmCw7oqfneFEvJQK3ZdTOvUdU,10830
155
155
  modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
156
- modal-1.1.2.dev15.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
156
+ modal-1.1.2.dev16.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
157
157
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
158
158
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
159
159
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -176,10 +176,10 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
176
176
  modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
177
177
  modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
178
178
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
- modal_version/__init__.py,sha256=iXde__cc44qFU3Y8IAcUmphGkYF01q-s9436opMRVGU,121
179
+ modal_version/__init__.py,sha256=991qiLp7Gaj7KDTnPn2cQZzYs3lPFPPiUFmLVtqUyCk,121
180
180
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
181
- modal-1.1.2.dev15.dist-info/METADATA,sha256=NWzcK-HdQjAXLCuTYF7fVsHx8EXr3JFKeN-N0U0CrMk,2460
182
- modal-1.1.2.dev15.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
183
- modal-1.1.2.dev15.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
184
- modal-1.1.2.dev15.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
185
- modal-1.1.2.dev15.dist-info/RECORD,,
181
+ modal-1.1.2.dev16.dist-info/METADATA,sha256=ebR80hnI4tOEH63GsXjKYPZ0sYbuGzjnsLiktsrGxDk,2460
182
+ modal-1.1.2.dev16.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
183
+ modal-1.1.2.dev16.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
184
+ modal-1.1.2.dev16.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
185
+ modal-1.1.2.dev16.dist-info/RECORD,,
modal_version/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.1.2.dev15"
4
+ __version__ = "1.1.2.dev16"