modal 0.67.1__py3-none-any.whl → 0.67.33__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/_clustered_functions.py +2 -2
- modal/_clustered_functions.pyi +2 -2
- modal/_container_entrypoint.py +8 -5
- modal/_output.py +29 -28
- modal/_pty.py +2 -2
- modal/_resolver.py +6 -5
- modal/_resources.py +3 -3
- modal/_runtime/asgi.py +46 -6
- modal/_runtime/container_io_manager.py +22 -26
- modal/_runtime/execution_context.py +2 -2
- modal/_runtime/telemetry.py +1 -2
- modal/_runtime/user_code_imports.py +12 -14
- modal/_serialization.py +3 -7
- modal/_traceback.py +5 -5
- modal/_tunnel.py +5 -4
- modal/_tunnel.pyi +2 -2
- modal/_utils/async_utils.py +53 -17
- modal/_utils/blob_utils.py +22 -7
- modal/_utils/function_utils.py +20 -10
- modal/_utils/grpc_testing.py +7 -6
- modal/_utils/grpc_utils.py +2 -3
- modal/_utils/hash_utils.py +2 -2
- modal/_utils/mount_utils.py +5 -4
- modal/_utils/package_utils.py +2 -3
- modal/_utils/pattern_matcher.py +6 -6
- modal/_utils/rand_pb_testing.py +3 -3
- modal/_utils/shell_utils.py +2 -1
- modal/_vendor/a2wsgi_wsgi.py +62 -72
- modal/_vendor/cloudpickle.py +1 -1
- modal/_watcher.py +8 -7
- modal/app.py +68 -62
- modal/app.pyi +104 -99
- modal/call_graph.py +6 -6
- modal/cli/_download.py +3 -2
- modal/cli/_traceback.py +4 -4
- modal/cli/app.py +4 -4
- modal/cli/container.py +4 -4
- modal/cli/dict.py +1 -1
- modal/cli/environment.py +2 -3
- modal/cli/import_refs.py +1 -1
- modal/cli/launch.py +2 -2
- modal/cli/network_file_system.py +1 -1
- modal/cli/profile.py +1 -1
- modal/cli/programs/run_jupyter.py +2 -2
- modal/cli/programs/vscode.py +3 -3
- modal/cli/queues.py +1 -1
- modal/cli/run.py +6 -6
- modal/cli/secret.py +3 -3
- modal/cli/utils.py +2 -1
- modal/cli/volume.py +3 -3
- modal/client.py +6 -11
- modal/client.pyi +18 -27
- modal/cloud_bucket_mount.py +3 -3
- modal/cloud_bucket_mount.pyi +2 -2
- modal/cls.py +100 -47
- modal/cls.pyi +40 -40
- modal/config.py +3 -2
- modal/container_process.py +6 -2
- modal/dict.py +6 -3
- modal/dict.pyi +10 -9
- modal/environments.py +3 -3
- modal/environments.pyi +3 -3
- modal/exception.py +2 -3
- modal/functions.py +112 -104
- modal/functions.pyi +77 -58
- modal/image.py +59 -57
- modal/image.pyi +104 -103
- modal/io_streams.py +20 -12
- modal/io_streams.pyi +24 -14
- modal/mount.py +24 -24
- modal/mount.pyi +28 -29
- modal/network_file_system.py +14 -11
- modal/network_file_system.pyi +12 -11
- modal/object.py +9 -8
- modal/object.pyi +47 -34
- modal/output.py +2 -1
- modal/parallel_map.py +4 -4
- modal/partial_function.py +10 -14
- modal/partial_function.pyi +17 -18
- modal/queue.py +11 -8
- modal/queue.pyi +23 -22
- modal/retries.py +38 -0
- modal/runner.py +8 -7
- modal/runner.pyi +8 -14
- modal/running_app.py +3 -3
- modal/sandbox.py +20 -13
- modal/sandbox.pyi +73 -72
- modal/scheduler_placement.py +2 -1
- modal/secret.py +7 -7
- modal/secret.pyi +12 -12
- modal/serving.py +4 -3
- modal/serving.pyi +5 -4
- modal/token_flow.py +3 -2
- modal/token_flow.pyi +3 -3
- modal/volume.py +16 -23
- modal/volume.pyi +17 -16
- {modal-0.67.1.dist-info → modal-0.67.33.dist-info}/METADATA +2 -2
- modal-0.67.33.dist-info/RECORD +168 -0
- modal_docs/mdmd/signatures.py +1 -2
- modal_global_objects/mounts/python_standalone.py +1 -1
- modal_proto/api.proto +15 -0
- modal_proto/api_grpc.py +32 -0
- modal_proto/api_pb2.py +674 -654
- modal_proto/api_pb2.pyi +45 -1
- modal_proto/api_pb2_grpc.py +66 -0
- modal_proto/api_pb2_grpc.pyi +20 -0
- modal_proto/modal_api_grpc.py +2 -0
- modal_version/_version_generated.py +1 -1
- modal-0.67.1.dist-info/RECORD +0 -168
- {modal-0.67.1.dist-info → modal-0.67.33.dist-info}/LICENSE +0 -0
- {modal-0.67.1.dist-info → modal-0.67.33.dist-info}/WHEEL +0 -0
- {modal-0.67.1.dist-info → modal-0.67.33.dist-info}/entry_points.txt +0 -0
- {modal-0.67.1.dist-info → modal-0.67.33.dist-info}/top_level.txt +0 -0
modal/secret.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Copyright Modal Labs 2022
|
2
2
|
import os
|
3
|
-
from typing import
|
3
|
+
from typing import Optional, Union
|
4
4
|
|
5
5
|
from grpclib import GRPCError, Status
|
6
6
|
|
@@ -30,7 +30,7 @@ class _Secret(_Object, type_prefix="st"):
|
|
30
30
|
|
31
31
|
@staticmethod
|
32
32
|
def from_dict(
|
33
|
-
env_dict:
|
33
|
+
env_dict: dict[
|
34
34
|
str, Union[str, None]
|
35
35
|
] = {}, # dict of entries to be inserted as environment variables in functions using the secret
|
36
36
|
):
|
@@ -46,7 +46,7 @@ class _Secret(_Object, type_prefix="st"):
|
|
46
46
|
if not isinstance(env_dict, dict):
|
47
47
|
raise InvalidError(ENV_DICT_WRONG_TYPE_ERR)
|
48
48
|
|
49
|
-
env_dict_filtered:
|
49
|
+
env_dict_filtered: dict[str, str] = {k: v for k, v in env_dict.items() if v is not None}
|
50
50
|
if not all(isinstance(k, str) for k in env_dict_filtered.keys()):
|
51
51
|
raise InvalidError(ENV_DICT_WRONG_TYPE_ERR)
|
52
52
|
if not all(isinstance(v, str) for v in env_dict_filtered.values()):
|
@@ -79,7 +79,7 @@ class _Secret(_Object, type_prefix="st"):
|
|
79
79
|
|
80
80
|
@staticmethod
|
81
81
|
def from_local_environ(
|
82
|
-
env_keys:
|
82
|
+
env_keys: list[str], # list of local env vars to be included for remote execution
|
83
83
|
):
|
84
84
|
"""Create secrets from local environment variables automatically."""
|
85
85
|
|
@@ -165,7 +165,7 @@ class _Secret(_Object, type_prefix="st"):
|
|
165
165
|
label: str, # Some global identifier, such as "aws-secret"
|
166
166
|
namespace=api_pb2.DEPLOYMENT_NAMESPACE_WORKSPACE,
|
167
167
|
environment_name: Optional[str] = None,
|
168
|
-
required_keys:
|
168
|
+
required_keys: list[
|
169
169
|
str
|
170
170
|
] = [], # Optionally, a list of required environment variables (will be asserted server-side)
|
171
171
|
) -> "_Secret":
|
@@ -208,7 +208,7 @@ class _Secret(_Object, type_prefix="st"):
|
|
208
208
|
namespace=api_pb2.DEPLOYMENT_NAMESPACE_WORKSPACE,
|
209
209
|
client: Optional[_Client] = None,
|
210
210
|
environment_name: Optional[str] = None,
|
211
|
-
required_keys:
|
211
|
+
required_keys: list[str] = [],
|
212
212
|
) -> "_Secret":
|
213
213
|
"""mdmd:hidden"""
|
214
214
|
obj = _Secret.from_name(
|
@@ -223,7 +223,7 @@ class _Secret(_Object, type_prefix="st"):
|
|
223
223
|
@staticmethod
|
224
224
|
async def create_deployed(
|
225
225
|
deployment_name: str,
|
226
|
-
env_dict:
|
226
|
+
env_dict: dict[str, str],
|
227
227
|
namespace=api_pb2.DEPLOYMENT_NAMESPACE_WORKSPACE,
|
228
228
|
client: Optional[_Client] = None,
|
229
229
|
environment_name: Optional[str] = None,
|
modal/secret.pyi
CHANGED
@@ -5,14 +5,14 @@ import typing_extensions
|
|
5
5
|
|
6
6
|
class _Secret(modal.object._Object):
|
7
7
|
@staticmethod
|
8
|
-
def from_dict(env_dict:
|
8
|
+
def from_dict(env_dict: dict[str, typing.Optional[str]] = {}): ...
|
9
9
|
@staticmethod
|
10
|
-
def from_local_environ(env_keys:
|
10
|
+
def from_local_environ(env_keys: list[str]): ...
|
11
11
|
@staticmethod
|
12
12
|
def from_dotenv(path=None, *, filename=".env"): ...
|
13
13
|
@staticmethod
|
14
14
|
def from_name(
|
15
|
-
label: str, namespace=1, environment_name: typing.Optional[str] = None, required_keys:
|
15
|
+
label: str, namespace=1, environment_name: typing.Optional[str] = None, required_keys: list[str] = []
|
16
16
|
) -> _Secret: ...
|
17
17
|
@staticmethod
|
18
18
|
async def lookup(
|
@@ -20,12 +20,12 @@ class _Secret(modal.object._Object):
|
|
20
20
|
namespace=1,
|
21
21
|
client: typing.Optional[modal.client._Client] = None,
|
22
22
|
environment_name: typing.Optional[str] = None,
|
23
|
-
required_keys:
|
23
|
+
required_keys: list[str] = [],
|
24
24
|
) -> _Secret: ...
|
25
25
|
@staticmethod
|
26
26
|
async def create_deployed(
|
27
27
|
deployment_name: str,
|
28
|
-
env_dict:
|
28
|
+
env_dict: dict[str, str],
|
29
29
|
namespace=1,
|
30
30
|
client: typing.Optional[modal.client._Client] = None,
|
31
31
|
environment_name: typing.Optional[str] = None,
|
@@ -35,14 +35,14 @@ class _Secret(modal.object._Object):
|
|
35
35
|
class Secret(modal.object.Object):
|
36
36
|
def __init__(self, *args, **kwargs): ...
|
37
37
|
@staticmethod
|
38
|
-
def from_dict(env_dict:
|
38
|
+
def from_dict(env_dict: dict[str, typing.Optional[str]] = {}): ...
|
39
39
|
@staticmethod
|
40
|
-
def from_local_environ(env_keys:
|
40
|
+
def from_local_environ(env_keys: list[str]): ...
|
41
41
|
@staticmethod
|
42
42
|
def from_dotenv(path=None, *, filename=".env"): ...
|
43
43
|
@staticmethod
|
44
44
|
def from_name(
|
45
|
-
label: str, namespace=1, environment_name: typing.Optional[str] = None, required_keys:
|
45
|
+
label: str, namespace=1, environment_name: typing.Optional[str] = None, required_keys: list[str] = []
|
46
46
|
) -> Secret: ...
|
47
47
|
|
48
48
|
class __lookup_spec(typing_extensions.Protocol):
|
@@ -52,7 +52,7 @@ class Secret(modal.object.Object):
|
|
52
52
|
namespace=1,
|
53
53
|
client: typing.Optional[modal.client.Client] = None,
|
54
54
|
environment_name: typing.Optional[str] = None,
|
55
|
-
required_keys:
|
55
|
+
required_keys: list[str] = [],
|
56
56
|
) -> Secret: ...
|
57
57
|
async def aio(
|
58
58
|
self,
|
@@ -60,7 +60,7 @@ class Secret(modal.object.Object):
|
|
60
60
|
namespace=1,
|
61
61
|
client: typing.Optional[modal.client.Client] = None,
|
62
62
|
environment_name: typing.Optional[str] = None,
|
63
|
-
required_keys:
|
63
|
+
required_keys: list[str] = [],
|
64
64
|
) -> Secret: ...
|
65
65
|
|
66
66
|
lookup: __lookup_spec
|
@@ -69,7 +69,7 @@ class Secret(modal.object.Object):
|
|
69
69
|
def __call__(
|
70
70
|
self,
|
71
71
|
deployment_name: str,
|
72
|
-
env_dict:
|
72
|
+
env_dict: dict[str, str],
|
73
73
|
namespace=1,
|
74
74
|
client: typing.Optional[modal.client.Client] = None,
|
75
75
|
environment_name: typing.Optional[str] = None,
|
@@ -78,7 +78,7 @@ class Secret(modal.object.Object):
|
|
78
78
|
async def aio(
|
79
79
|
self,
|
80
80
|
deployment_name: str,
|
81
|
-
env_dict:
|
81
|
+
env_dict: dict[str, str],
|
82
82
|
namespace=1,
|
83
83
|
client: typing.Optional[modal.client.Client] = None,
|
84
84
|
environment_name: typing.Optional[str] = None,
|
modal/serving.py
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
# Copyright Modal Labs 2023
|
2
2
|
import multiprocessing
|
3
3
|
import platform
|
4
|
+
from collections.abc import AsyncGenerator
|
4
5
|
from multiprocessing.context import SpawnProcess
|
5
6
|
from multiprocessing.synchronize import Event
|
6
|
-
from typing import TYPE_CHECKING,
|
7
|
+
from typing import TYPE_CHECKING, Optional, TypeVar
|
7
8
|
|
8
9
|
from synchronicity.async_wrap import asynccontextmanager
|
9
10
|
|
@@ -69,7 +70,7 @@ async def _terminate(proc: Optional[SpawnProcess], timeout: float = 5.0):
|
|
69
70
|
async def _run_watch_loop(
|
70
71
|
app_ref: str,
|
71
72
|
app_id: str,
|
72
|
-
watcher: AsyncGenerator[
|
73
|
+
watcher: AsyncGenerator[set[str], None],
|
73
74
|
environment_name: str,
|
74
75
|
):
|
75
76
|
unsupported_msg = None
|
@@ -96,7 +97,7 @@ async def _run_watch_loop(
|
|
96
97
|
async def _serve_app(
|
97
98
|
app: "_App",
|
98
99
|
app_ref: str,
|
99
|
-
_watcher: Optional[AsyncGenerator[
|
100
|
+
_watcher: Optional[AsyncGenerator[set[str], None]] = None, # for testing
|
100
101
|
environment_name: Optional[str] = None,
|
101
102
|
) -> AsyncGenerator["_App", None]:
|
102
103
|
if environment_name is None:
|
modal/serving.pyi
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
import collections.abc
|
1
2
|
import multiprocessing.context
|
2
3
|
import multiprocessing.synchronize
|
3
4
|
import synchronicity.combined_types
|
@@ -18,12 +19,12 @@ async def _restart_serve(
|
|
18
19
|
) -> multiprocessing.context.SpawnProcess: ...
|
19
20
|
async def _terminate(proc: typing.Optional[multiprocessing.context.SpawnProcess], timeout: float = 5.0): ...
|
20
21
|
async def _run_watch_loop(
|
21
|
-
app_ref: str, app_id: str, watcher:
|
22
|
+
app_ref: str, app_id: str, watcher: collections.abc.AsyncGenerator[set[str], None], environment_name: str
|
22
23
|
): ...
|
23
24
|
def _serve_app(
|
24
25
|
app: _App,
|
25
26
|
app_ref: str,
|
26
|
-
_watcher: typing.Optional[
|
27
|
+
_watcher: typing.Optional[collections.abc.AsyncGenerator[set[str], None]] = None,
|
27
28
|
environment_name: typing.Optional[str] = None,
|
28
29
|
) -> typing.AsyncContextManager[_App]: ...
|
29
30
|
def _serve_stub(*args, **kwargs): ...
|
@@ -33,14 +34,14 @@ class __serve_app_spec(typing_extensions.Protocol):
|
|
33
34
|
self,
|
34
35
|
app: _App,
|
35
36
|
app_ref: str,
|
36
|
-
_watcher: typing.Optional[typing.Generator[
|
37
|
+
_watcher: typing.Optional[typing.Generator[set[str], None, None]] = None,
|
37
38
|
environment_name: typing.Optional[str] = None,
|
38
39
|
) -> synchronicity.combined_types.AsyncAndBlockingContextManager[_App]: ...
|
39
40
|
def aio(
|
40
41
|
self,
|
41
42
|
app: _App,
|
42
43
|
app_ref: str,
|
43
|
-
_watcher: typing.Optional[
|
44
|
+
_watcher: typing.Optional[collections.abc.AsyncGenerator[set[str], None]] = None,
|
44
45
|
environment_name: typing.Optional[str] = None,
|
45
46
|
) -> typing.AsyncContextManager[_App]: ...
|
46
47
|
|
modal/token_flow.py
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
import itertools
|
3
3
|
import os
|
4
4
|
import webbrowser
|
5
|
-
from
|
5
|
+
from collections.abc import AsyncGenerator
|
6
|
+
from typing import Optional
|
6
7
|
|
7
8
|
import aiohttp.web
|
8
9
|
from rich.console import Console
|
@@ -24,7 +25,7 @@ class _TokenFlow:
|
|
24
25
|
@asynccontextmanager
|
25
26
|
async def start(
|
26
27
|
self, utm_source: Optional[str] = None, next_url: Optional[str] = None
|
27
|
-
) -> AsyncGenerator[
|
28
|
+
) -> AsyncGenerator[tuple[str, str, str], None]:
|
28
29
|
"""mdmd:hidden"""
|
29
30
|
# Run a temporary http server returning the token id on /
|
30
31
|
# This helps us add direct validation later
|
modal/token_flow.pyi
CHANGED
@@ -8,7 +8,7 @@ class _TokenFlow:
|
|
8
8
|
def __init__(self, client: modal.client._Client): ...
|
9
9
|
def start(
|
10
10
|
self, utm_source: typing.Optional[str] = None, next_url: typing.Optional[str] = None
|
11
|
-
) -> typing.AsyncContextManager[
|
11
|
+
) -> typing.AsyncContextManager[tuple[str, str, str]]: ...
|
12
12
|
async def finish(
|
13
13
|
self, timeout: float = 40.0, grpc_extra_timeout: float = 5.0
|
14
14
|
) -> typing.Optional[modal_proto.api_pb2.TokenFlowWaitResponse]: ...
|
@@ -19,10 +19,10 @@ class TokenFlow:
|
|
19
19
|
class __start_spec(typing_extensions.Protocol):
|
20
20
|
def __call__(
|
21
21
|
self, utm_source: typing.Optional[str] = None, next_url: typing.Optional[str] = None
|
22
|
-
) -> synchronicity.combined_types.AsyncAndBlockingContextManager[
|
22
|
+
) -> synchronicity.combined_types.AsyncAndBlockingContextManager[tuple[str, str, str]]: ...
|
23
23
|
def aio(
|
24
24
|
self, utm_source: typing.Optional[str] = None, next_url: typing.Optional[str] = None
|
25
|
-
) -> typing.AsyncContextManager[
|
25
|
+
) -> typing.AsyncContextManager[tuple[str, str, str]]: ...
|
26
26
|
|
27
27
|
start: __start_spec
|
28
28
|
|
modal/volume.py
CHANGED
@@ -8,20 +8,15 @@ import platform
|
|
8
8
|
import re
|
9
9
|
import time
|
10
10
|
import typing
|
11
|
+
from collections.abc import AsyncGenerator, AsyncIterator, Generator, Sequence
|
11
12
|
from dataclasses import dataclass
|
12
13
|
from pathlib import Path, PurePosixPath
|
13
14
|
from typing import (
|
14
15
|
IO,
|
15
16
|
Any,
|
16
|
-
AsyncGenerator,
|
17
|
-
AsyncIterator,
|
18
17
|
BinaryIO,
|
19
18
|
Callable,
|
20
|
-
Generator,
|
21
|
-
List,
|
22
19
|
Optional,
|
23
|
-
Sequence,
|
24
|
-
Type,
|
25
20
|
Union,
|
26
21
|
)
|
27
22
|
|
@@ -190,7 +185,7 @@ class _Volume(_Object, type_prefix="vo"):
|
|
190
185
|
@classmethod
|
191
186
|
@asynccontextmanager
|
192
187
|
async def ephemeral(
|
193
|
-
cls:
|
188
|
+
cls: type["_Volume"],
|
194
189
|
client: Optional[_Client] = None,
|
195
190
|
environment_name: Optional[str] = None,
|
196
191
|
version: "typing.Optional[modal_proto.api_pb2.VolumeFsVersion.ValueType]" = None,
|
@@ -200,11 +195,14 @@ class _Volume(_Object, type_prefix="vo"):
|
|
200
195
|
|
201
196
|
Usage:
|
202
197
|
```python
|
203
|
-
|
204
|
-
|
198
|
+
import modal
|
199
|
+
with modal.Volume.ephemeral() as vol:
|
200
|
+
assert vol.listdir("/") == []
|
201
|
+
```
|
205
202
|
|
206
|
-
|
207
|
-
|
203
|
+
```python notest
|
204
|
+
async with modal.Volume.ephemeral() as vol:
|
205
|
+
assert await vol.listdir("/") == []
|
208
206
|
```
|
209
207
|
"""
|
210
208
|
if client is None:
|
@@ -234,7 +232,7 @@ class _Volume(_Object, type_prefix="vo"):
|
|
234
232
|
In contrast to `modal.Volume.from_name`, this is an eager method
|
235
233
|
that will hydrate the local object with metadata from Modal servers.
|
236
234
|
|
237
|
-
```python
|
235
|
+
```python notest
|
238
236
|
vol = modal.Volume.lookup("my-volume")
|
239
237
|
print(vol.listdir("/"))
|
240
238
|
```
|
@@ -361,7 +359,7 @@ class _Volume(_Object, type_prefix="vo"):
|
|
361
359
|
yield FileEntry._from_proto(entry)
|
362
360
|
|
363
361
|
@live_method
|
364
|
-
async def listdir(self, path: str, *, recursive: bool = False) ->
|
362
|
+
async def listdir(self, path: str, *, recursive: bool = False) -> list[FileEntry]:
|
365
363
|
"""List all files under a path prefix in the modal.Volume.
|
366
364
|
|
367
365
|
Passing a directory path lists all files in the directory. For a file path, return only that
|
@@ -418,7 +416,7 @@ class _Volume(_Object, type_prefix="vo"):
|
|
418
416
|
|
419
417
|
n = fileobj.write(response.data)
|
420
418
|
if n != len(response.data):
|
421
|
-
raise
|
419
|
+
raise OSError(f"failed to write {len(response.data)} bytes to output. Wrote {n}.")
|
422
420
|
elif n == response.size:
|
423
421
|
return response.size
|
424
422
|
elif n > response.size:
|
@@ -439,7 +437,7 @@ class _Volume(_Object, type_prefix="vo"):
|
|
439
437
|
|
440
438
|
n = fileobj.write(response.data)
|
441
439
|
if n != len(response.data):
|
442
|
-
raise
|
440
|
+
raise OSError(f"failed to write {len(response.data)} bytes to output. Wrote {n}.")
|
443
441
|
written += n
|
444
442
|
if written == file_size:
|
445
443
|
break
|
@@ -521,7 +519,7 @@ class _VolumeUploadContextManager:
|
|
521
519
|
_client: _Client
|
522
520
|
_force: bool
|
523
521
|
progress_cb: Callable[..., Any]
|
524
|
-
_upload_generators:
|
522
|
+
_upload_generators: list[Generator[Callable[[], FileUploadSpec], None, None]]
|
525
523
|
|
526
524
|
def __init__(
|
527
525
|
self, volume_id: str, client: _Client, progress_cb: Optional[Callable[..., Any]] = None, force: bool = False
|
@@ -553,7 +551,7 @@ class _VolumeUploadContextManager:
|
|
553
551
|
yield await fut
|
554
552
|
|
555
553
|
# Compute checksums & Upload files
|
556
|
-
files:
|
554
|
+
files: list[api_pb2.MountFile] = []
|
557
555
|
async with aclosing(async_map(gen_file_upload_specs(), self._upload_file, concurrency=20)) as stream:
|
558
556
|
async for item in stream:
|
559
557
|
files.append(item)
|
@@ -679,16 +677,11 @@ def _open_files_error_annotation(mount_path: str) -> Optional[str]:
|
|
679
677
|
cmdline = " ".join([part.decode() for part in parts]).rstrip(" ")
|
680
678
|
|
681
679
|
cwd = PurePosixPath(os.readlink(f"/proc/{pid}/cwd"))
|
682
|
-
|
683
|
-
# we drop Python 3.8 support.
|
684
|
-
try:
|
685
|
-
_rel_cwd = cwd.relative_to(mount_path)
|
680
|
+
if cwd.is_relative_to(mount_path):
|
686
681
|
if pid == self_pid:
|
687
682
|
return "cwd is inside volume"
|
688
683
|
else:
|
689
684
|
return f"cwd of '{cmdline}' is inside volume"
|
690
|
-
except ValueError:
|
691
|
-
pass
|
692
685
|
|
693
686
|
for fd in os.listdir(f"/proc/{pid}/fd"):
|
694
687
|
try:
|
modal/volume.pyi
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import asyncio.locks
|
2
|
+
import collections.abc
|
2
3
|
import enum
|
3
4
|
import modal._utils.blob_utils
|
4
5
|
import modal.client
|
@@ -48,7 +49,7 @@ class _Volume(modal.object._Object):
|
|
48
49
|
) -> _Volume: ...
|
49
50
|
@classmethod
|
50
51
|
def ephemeral(
|
51
|
-
cls:
|
52
|
+
cls: type[_Volume],
|
52
53
|
client: typing.Optional[modal.client._Client] = None,
|
53
54
|
environment_name: typing.Optional[str] = None,
|
54
55
|
version: typing.Optional[int] = None,
|
@@ -74,12 +75,12 @@ class _Volume(modal.object._Object):
|
|
74
75
|
async def _do_reload(self, lock=True): ...
|
75
76
|
async def commit(self): ...
|
76
77
|
async def reload(self): ...
|
77
|
-
def iterdir(self, path: str, *, recursive: bool = True) ->
|
78
|
-
async def listdir(self, path: str, *, recursive: bool = False) ->
|
79
|
-
def read_file(self, path: str) ->
|
78
|
+
def iterdir(self, path: str, *, recursive: bool = True) -> collections.abc.AsyncIterator[FileEntry]: ...
|
79
|
+
async def listdir(self, path: str, *, recursive: bool = False) -> list[FileEntry]: ...
|
80
|
+
def read_file(self, path: str) -> collections.abc.AsyncIterator[bytes]: ...
|
80
81
|
async def read_file_into_fileobj(self, path: str, fileobj: typing.IO[bytes]) -> int: ...
|
81
82
|
async def remove_file(self, path: str, recursive: bool = False) -> None: ...
|
82
|
-
async def copy_files(self, src_paths:
|
83
|
+
async def copy_files(self, src_paths: collections.abc.Sequence[str], dst_path: str) -> None: ...
|
83
84
|
async def batch_upload(self, force: bool = False) -> _VolumeUploadContextManager: ...
|
84
85
|
async def _instance_delete(self): ...
|
85
86
|
@staticmethod
|
@@ -92,8 +93,8 @@ class _VolumeUploadContextManager:
|
|
92
93
|
_client: modal.client._Client
|
93
94
|
_force: bool
|
94
95
|
progress_cb: typing.Callable[..., typing.Any]
|
95
|
-
_upload_generators:
|
96
|
-
|
96
|
+
_upload_generators: list[
|
97
|
+
collections.abc.Generator[typing.Callable[[], modal._utils.blob_utils.FileUploadSpec], None, None]
|
97
98
|
]
|
98
99
|
|
99
100
|
def __init__(
|
@@ -144,7 +145,7 @@ class Volume(modal.object.Object):
|
|
144
145
|
) -> Volume: ...
|
145
146
|
@classmethod
|
146
147
|
def ephemeral(
|
147
|
-
cls:
|
148
|
+
cls: type[Volume],
|
148
149
|
client: typing.Optional[modal.client.Client] = None,
|
149
150
|
environment_name: typing.Optional[str] = None,
|
150
151
|
version: typing.Optional[int] = None,
|
@@ -213,19 +214,19 @@ class Volume(modal.object.Object):
|
|
213
214
|
|
214
215
|
class __iterdir_spec(typing_extensions.Protocol):
|
215
216
|
def __call__(self, path: str, *, recursive: bool = True) -> typing.Iterator[FileEntry]: ...
|
216
|
-
def aio(self, path: str, *, recursive: bool = True) ->
|
217
|
+
def aio(self, path: str, *, recursive: bool = True) -> collections.abc.AsyncIterator[FileEntry]: ...
|
217
218
|
|
218
219
|
iterdir: __iterdir_spec
|
219
220
|
|
220
221
|
class __listdir_spec(typing_extensions.Protocol):
|
221
|
-
def __call__(self, path: str, *, recursive: bool = False) ->
|
222
|
-
async def aio(self, path: str, *, recursive: bool = False) ->
|
222
|
+
def __call__(self, path: str, *, recursive: bool = False) -> list[FileEntry]: ...
|
223
|
+
async def aio(self, path: str, *, recursive: bool = False) -> list[FileEntry]: ...
|
223
224
|
|
224
225
|
listdir: __listdir_spec
|
225
226
|
|
226
227
|
class __read_file_spec(typing_extensions.Protocol):
|
227
228
|
def __call__(self, path: str) -> typing.Iterator[bytes]: ...
|
228
|
-
def aio(self, path: str) ->
|
229
|
+
def aio(self, path: str) -> collections.abc.AsyncIterator[bytes]: ...
|
229
230
|
|
230
231
|
read_file: __read_file_spec
|
231
232
|
|
@@ -242,8 +243,8 @@ class Volume(modal.object.Object):
|
|
242
243
|
remove_file: __remove_file_spec
|
243
244
|
|
244
245
|
class __copy_files_spec(typing_extensions.Protocol):
|
245
|
-
def __call__(self, src_paths:
|
246
|
-
async def aio(self, src_paths:
|
246
|
+
def __call__(self, src_paths: collections.abc.Sequence[str], dst_path: str) -> None: ...
|
247
|
+
async def aio(self, src_paths: collections.abc.Sequence[str], dst_path: str) -> None: ...
|
247
248
|
|
248
249
|
copy_files: __copy_files_spec
|
249
250
|
|
@@ -280,8 +281,8 @@ class VolumeUploadContextManager:
|
|
280
281
|
_client: modal.client.Client
|
281
282
|
_force: bool
|
282
283
|
progress_cb: typing.Callable[..., typing.Any]
|
283
|
-
_upload_generators:
|
284
|
-
|
284
|
+
_upload_generators: list[
|
285
|
+
collections.abc.Generator[typing.Callable[[], modal._utils.blob_utils.FileUploadSpec], None, None]
|
285
286
|
]
|
286
287
|
|
287
288
|
def __init__(
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: modal
|
3
|
-
Version: 0.67.
|
3
|
+
Version: 0.67.33
|
4
4
|
Summary: Python client library for Modal
|
5
5
|
Author: Modal Labs
|
6
6
|
Author-email: support@modal.com
|
@@ -21,7 +21,7 @@ Requires-Dist: fastapi
|
|
21
21
|
Requires-Dist: grpclib (==0.4.7)
|
22
22
|
Requires-Dist: protobuf (!=4.24.0,<6.0,>=3.19)
|
23
23
|
Requires-Dist: rich (>=12.0.0)
|
24
|
-
Requires-Dist: synchronicity (~=0.9.
|
24
|
+
Requires-Dist: synchronicity (~=0.9.4)
|
25
25
|
Requires-Dist: toml
|
26
26
|
Requires-Dist: typer (>=0.9)
|
27
27
|
Requires-Dist: types-certifi
|
@@ -0,0 +1,168 @@
|
|
1
|
+
modal/__init__.py,sha256=Yn8zS7Jxl5uZjPM331Pc4FdSmp9Rt6VdE7TiE4ZKRc8,2151
|
2
|
+
modal/__main__.py,sha256=scYhGFqh8OJcVDo-VOxIT6CCwxOgzgflYWMnIZiMRqE,2871
|
3
|
+
modal/_clustered_functions.py,sha256=kTf-9YBXY88NutC1akI-gCbvf01RhMPCw-zoOI_YIUE,2700
|
4
|
+
modal/_clustered_functions.pyi,sha256=vllkegc99A0jrUOWa8mdlSbdp6uz36TsHhGxysAOpaQ,771
|
5
|
+
modal/_container_entrypoint.py,sha256=Tae8hAbgN62HM9Q_UFuCyyswfdh1rOey2zzXkbG4Cns,28795
|
6
|
+
modal/_ipython.py,sha256=HF_DYy0e0qM9WnGDmTY30s1RxzGya9GeORCauCEpRaE,450
|
7
|
+
modal/_location.py,sha256=S3lSxIU3h9HkWpkJ3Pwo0pqjIOSB1fjeSgUsY3x7eec,1202
|
8
|
+
modal/_output.py,sha256=0fWX_KQwhER--U81ys16CL-pA5A-LN20C0EZjElKGJQ,25410
|
9
|
+
modal/_proxy_tunnel.py,sha256=gnKyCfmVB7x2d1A6c-JDysNIP3kEFxmXzhcXhPrzPn0,1906
|
10
|
+
modal/_pty.py,sha256=JZfPDDpzqICZqtyPI_oMJf_9w-p_lLNuzHhwhodUXio,1329
|
11
|
+
modal/_resolver.py,sha256=TtowKu2LdZ7NpiYkSXs058BZ4ivY8KVYdchqLfREkiA,6775
|
12
|
+
modal/_resources.py,sha256=5qmcirXUI8dSH926nwkUaeX9H25mqYu9mXD_KuT79-o,1733
|
13
|
+
modal/_serialization.py,sha256=qPLH6OUEBas1CT-a6i5pOP1hPGt5AfKr9q7RMUTFOMc,18722
|
14
|
+
modal/_traceback.py,sha256=tueIGN5DbPaQlo23F-GrFMjl-HpDxBxfSAkqjU39zwg,4389
|
15
|
+
modal/_tunnel.py,sha256=o-jJhS4vQ6-XswDhHcJWGMZZmD03SC0e9i8fEu1JTjo,6310
|
16
|
+
modal/_tunnel.pyi,sha256=JmmDYAy9F1FpgJ_hWx0xkom2nTOFQjn4mTPYlU3PFo4,1245
|
17
|
+
modal/_watcher.py,sha256=K6LYnlmSGQB4tWWI9JADv-tvSvQ1j522FwT71B51CX8,3584
|
18
|
+
modal/app.py,sha256=EJ7FUN6rWnSwLJoYJh8nmKg_t-8hdN8_rt0OrkP7JvQ,46084
|
19
|
+
modal/app.pyi,sha256=BE5SlR5tRECuc6-e2lUuOknDdov3zxgZ4N0AsLb5ZVQ,25270
|
20
|
+
modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
|
21
|
+
modal/client.py,sha256=VMg_aIuo_LOEe2ttxBHEND3PLhTp5lo-onH4wELhIyY,16375
|
22
|
+
modal/client.pyi,sha256=Xu0iGZiUWQoXYK4tgi8QgxTK38UPWHz-rS3_oDFwFYQ,7354
|
23
|
+
modal/cloud_bucket_mount.py,sha256=G7T7jWLD0QkmrfKR75mSTwdUZ2xNfj7pkVqb4ipmxmI,5735
|
24
|
+
modal/cloud_bucket_mount.pyi,sha256=CEi7vrH3kDUF4LAy4qP6tfImy2UJuFRcRbsgRNM1wo8,1403
|
25
|
+
modal/cls.py,sha256=OJqzj_V-n1g48BY_4Jg_BOTQdftEEl4kTWN0X4FOOdg,27378
|
26
|
+
modal/cls.pyi,sha256=47jaIT06fz8PSUrs-MaNn6r03PHsAyUGsKuK5e9RMhQ,8140
|
27
|
+
modal/config.py,sha256=1KhNJkjYsJkX1V8RPPdRYPlM2HE-ZZs0JVSxbiXjmrw,11010
|
28
|
+
modal/container_process.py,sha256=YRCKjn56oqTtGjtLxpl_KSkOhYrcRitgF3LOI6o14Q4,5759
|
29
|
+
modal/container_process.pyi,sha256=k2kClwaSzz11eci1pzFZgCm-ptXapHAyHTOENorlazA,2594
|
30
|
+
modal/dict.py,sha256=RmJlEwFJOdSfAYcVa50hbbFccV8e7BvC5tc5g1HXF-c,12622
|
31
|
+
modal/dict.pyi,sha256=2cYgOqBxYZih4BYgMV0c3rNPuxYR6-cB1GBXzFkHA5c,7265
|
32
|
+
modal/environments.py,sha256=5cgA-zbm6ngKLsRA19zSOgtgo9-BarJK3FJK0BiF2Lo,6505
|
33
|
+
modal/environments.pyi,sha256=XalNpiPkAtHWAvOU2Cotq0ozmtl-Jv0FDsR8h9mr27Q,3521
|
34
|
+
modal/exception.py,sha256=EBkdWVved2XEPsXaoPRu56xfxFFHL9iuqvUsdj42WDA,6392
|
35
|
+
modal/experimental.py,sha256=jFuNbwrNHos47viMB9q-cHJSvf2RDxDdoEcss9plaZE,2302
|
36
|
+
modal/functions.py,sha256=Lteg8dMa8ly72-RM1ozxeGQ500pdeFyJgtflVwp3U7Q,66629
|
37
|
+
modal/functions.pyi,sha256=3Jupx4QKaqQ9p9XQSG4zDjB3W-87EYkFg55w2QuSQ8M,24892
|
38
|
+
modal/gpu.py,sha256=r4rL6uH3UJIQthzYvfWauXNyh01WqCPtKZCmmSX1fd4,6881
|
39
|
+
modal/image.py,sha256=cQ6WP1xHXZT_nY8z3aEFiGwKzrTV0yxi3Ab8JzF91eo,79653
|
40
|
+
modal/image.pyi,sha256=PIKH6JBA4L5TfdJrQu3pm2ykyIITmiP920TpP8cdyQA,24585
|
41
|
+
modal/io_streams.py,sha256=YfKAlWQAxzPCHE0-wVlAlX5vldrpfKMdr9ggL0c5VJo,15063
|
42
|
+
modal/io_streams.pyi,sha256=bCCVSxkMcosYd8O3PQDDwJw7TQ8JEcnYonLJ5t27TQs,4804
|
43
|
+
modal/mount.py,sha256=liaid5p42o0OKnzoocJJ_oCovDVderk3-JuCTa5pqtA,27656
|
44
|
+
modal/mount.pyi,sha256=3e4nkXUeeVmUmOyK8Tiyk_EQlHeWruN3yGJVnmDUVrI,9761
|
45
|
+
modal/network_file_system.py,sha256=mwtYp25XtFaiGpSG7U0KSkiTzJWrxgGTcoxfPZ9yGR0,14141
|
46
|
+
modal/network_file_system.pyi,sha256=kRqK-n8FxZfyboV3MQuaH40RqAeBU2VA2WfZrhj4hwk,7242
|
47
|
+
modal/object.py,sha256=KmtWRDd5ntHGSO9ASHe9MJcIgjNRqaDXGc3rWOXwrmA,9646
|
48
|
+
modal/object.pyi,sha256=MO78H9yFSE5i1gExPEwyyQzLdlshkcGHN1aQ0ylyvq0,8802
|
49
|
+
modal/output.py,sha256=N0xf4qeudEaYrslzdAl35VKV8rapstgIM2e9wO8_iy0,1967
|
50
|
+
modal/parallel_map.py,sha256=4aoMXIrlG3wl5Ifk2YDNOQkXsGRsm6Xbfm6WtJ2t3WY,16002
|
51
|
+
modal/parallel_map.pyi,sha256=pOhT0P3DDYlwLx0fR3PTsecA7DI8uOdXC1N8i-ZkyOY,2328
|
52
|
+
modal/partial_function.py,sha256=938kcVJHcdGXKWsO7NE_FBxPldZ304a_GyhjxD79wHE,28215
|
53
|
+
modal/partial_function.pyi,sha256=EafGOzZdEq-yE5bYRoMfnMqw-o8Hk_So8MRPDSB99_0,8982
|
54
|
+
modal/proxy.py,sha256=ZrOsuQP7dSZFq1OrIxalNnt0Zvsnp1h86Th679sSL40,1417
|
55
|
+
modal/proxy.pyi,sha256=UvygdOYneLTuoDY6hVaMNCyZ947Tmx93IdLjErUqkvM,368
|
56
|
+
modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
57
|
+
modal/queue.py,sha256=q0SDkrN2e2CNxsHjhs6xMwf03LZdvuUFYL7SZPZpKps,18390
|
58
|
+
modal/queue.pyi,sha256=di3ownBw4jc6d4X7ygXtbpjlUMOK69qyaD3lVsJbpoM,9900
|
59
|
+
modal/retries.py,sha256=HKR2Q9aNPWkMjQ5nwobqYTuZaSuw0a8lI2zrtY5IW98,5230
|
60
|
+
modal/runner.py,sha256=7obU-Gq1ocpBGCuR6pvn1T-D6ggg1T48qFo2TNUGWkU,24089
|
61
|
+
modal/runner.pyi,sha256=RAtCvx_lXWjyFjIaZ3t9-X1c7rqpgAQlhl4Hww53OY8,5038
|
62
|
+
modal/running_app.py,sha256=CshNvGDJtagOdKW54uYjY8HY73j2TpnsL9jkPFZAsfA,560
|
63
|
+
modal/sandbox.py,sha256=25DvTWSgClANvk67HM3FHukRVLig_Fw_aQC1BLMCRhs,25150
|
64
|
+
modal/sandbox.pyi,sha256=JRh6Q-WdY6GgVSOGm0L_pgo5bfsi2UacsZezpT0-cDU,17685
|
65
|
+
modal/schedule.py,sha256=0ZFpKs1bOxeo5n3HZjoL7OE2ktsb-_oGtq-WJEPO4tY,2615
|
66
|
+
modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
|
67
|
+
modal/secret.py,sha256=Y1WgybQIkfkxdzH9CQ1h-Wd1DJJpzipigMhyyvSxTww,10007
|
68
|
+
modal/secret.pyi,sha256=B_9QWiLvTwSopLsAHre-qSB2VS74cqfhtbA4GS8faQY,2957
|
69
|
+
modal/serving.py,sha256=5JMDpcbf0ETse884R-hgXG3kCbhpQb5gqH0oQpqad34,4455
|
70
|
+
modal/serving.pyi,sha256=ncV-9jY_vZYFnGs5ZnMb3ffrX8LmcLdIMHBC56xRbtE,1711
|
71
|
+
modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
|
72
|
+
modal/token_flow.py,sha256=LcgSce_MSQ2p7j55DPwpVRpiAtCDe8GRSEwzO7muNR8,6774
|
73
|
+
modal/token_flow.pyi,sha256=gOYtYujrWt_JFZeiI8EmfahXPx5GCR5Na-VaPQcWgEY,1937
|
74
|
+
modal/volume.py,sha256=IISuMeXq9MoSkhXg8Q6JG0F-2n9NTkWk0xGuJB8l3d8,29159
|
75
|
+
modal/volume.pyi,sha256=St0mDiaojfep6Bs4sBbkRJmeacYHF6lh6FKOWGmheHA,11182
|
76
|
+
modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
77
|
+
modal/_runtime/asgi.py,sha256=GvuxZqWnIHMIR-Bx5f7toCQlkERaJO8CHjTPNM9IFIw,21537
|
78
|
+
modal/_runtime/container_io_manager.py,sha256=yVKSBBybfciDaady7NxOPVU5cm9qL690OgdZ4dZN1bs,44134
|
79
|
+
modal/_runtime/execution_context.py,sha256=E6ofm6j1POXGPxS841X3V7JU6NheVb8OkQc7JpLq4Kg,2712
|
80
|
+
modal/_runtime/telemetry.py,sha256=T1RoAGyjBDr1swiM6pPsGRSITm7LI5FDK18oNXxY08U,5163
|
81
|
+
modal/_runtime/user_code_imports.py,sha256=q_3JOYqCPDcVFZWCHEjyEqj8yzdFsQ49HzeqYmFDLbk,14521
|
82
|
+
modal/_utils/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
|
83
|
+
modal/_utils/app_utils.py,sha256=88BT4TPLWfYAQwKTHcyzNQRHg8n9B-QE2UyJs96iV-0,108
|
84
|
+
modal/_utils/async_utils.py,sha256=9ubwMkwiDB4gzOYG2jL9j7Fs-5dxHjcifZe3r7JRg-k,25091
|
85
|
+
modal/_utils/blob_utils.py,sha256=0k_qUpO5GHnz538wjRhyRw4NdJ5O322N7QSilIu32jw,16601
|
86
|
+
modal/_utils/function_utils.py,sha256=GV-mq6sSGXQIX5PcExYWJMaWY9YLjChjsiQjg-oPvm8,24902
|
87
|
+
modal/_utils/grpc_testing.py,sha256=iqM9n5M0cWUUIIWNaEDer_pIfPnzXdZBO4L8FVbNepQ,8309
|
88
|
+
modal/_utils/grpc_utils.py,sha256=PPB5ay-vXencXNIWPVw5modr3EH7gfq2QPcO5YJ1lMU,7737
|
89
|
+
modal/_utils/hash_utils.py,sha256=xKwSI1eQobyWNdJwyLO59eB241LOXmQ6QvtzJsyIMcw,1784
|
90
|
+
modal/_utils/http_utils.py,sha256=VKXYNPJtrSwZ1ttcXVGQUWmn8cLAXiOTv05g2ac3GbU,2179
|
91
|
+
modal/_utils/logger.py,sha256=ePzdudrtx9jJCjuO6-bcL_kwUJfi4AwloUmIiNtqkY0,1330
|
92
|
+
modal/_utils/mount_utils.py,sha256=J-FRZbPQv1i__Tob-FIpbB1oXWpFLAwZiB4OCiJpFG0,3206
|
93
|
+
modal/_utils/name_utils.py,sha256=TW1iyJedvDNPEJ5UVp93u8xuD5J2gQL_CUt1mgov_aI,1939
|
94
|
+
modal/_utils/package_utils.py,sha256=LcL2olGN4xaUzu2Tbv-C-Ft9Qp6bsLxEfETOAVd-mjU,2073
|
95
|
+
modal/_utils/pattern_matcher.py,sha256=sssw9Cmck2f-TvOE1i96fbdsJr9DKLpbebyCwNr3wHY,9246
|
96
|
+
modal/_utils/rand_pb_testing.py,sha256=NYM8W6HF-6_bzxJCAj4ITvItZYrclacEZlBhTptOT_Q,3845
|
97
|
+
modal/_utils/shell_utils.py,sha256=6P0ykuE5qU2MkCu2HHc8yqJzp8CgTm79ws3snsV9OkU,1946
|
98
|
+
modal/_vendor/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
99
|
+
modal/_vendor/a2wsgi_wsgi.py,sha256=Q1AsjpV_Q_vzQsz_cSqmP9jWzsGsB-ARFU6vpQYml8k,21878
|
100
|
+
modal/_vendor/cloudpickle.py,sha256=Loq12qo7PBNbE4LFVEW6BdMMwY10MG94EOW1SCpcnQ0,55217
|
101
|
+
modal/_vendor/tblib.py,sha256=g1O7QUDd3sDoLd8YPFltkXkih7r_fyZOjgmGuligv3s,9722
|
102
|
+
modal/cli/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
|
103
|
+
modal/cli/_download.py,sha256=t6BXZwjTd9MgznDvbsV8rp0FZWggdzC-lUAGZU4xx1g,3984
|
104
|
+
modal/cli/_traceback.py,sha256=WRs24CaEY1VW2tx8d4JZLipeTXe9YprQiPX8OmCAAP8,6936
|
105
|
+
modal/cli/app.py,sha256=RtiZhHjg-9lAQV2goKqALnK44xuBbUkapnBBaoQdZ04,7717
|
106
|
+
modal/cli/config.py,sha256=pXPLmX0bIoV57rQNqIPK7V-yllj-GPRY4jiBO_EklGg,1667
|
107
|
+
modal/cli/container.py,sha256=lRSrxnl7bTLLW9T6hzkqOxqFzzV9qHyXPOuOHY8zkc4,3194
|
108
|
+
modal/cli/dict.py,sha256=gwX4ZBsrr0dpWf_B5_5GN_ealcVzpcGyvY24dEY4y3Y,4455
|
109
|
+
modal/cli/entry_point.py,sha256=aaNxFAqZcmtSjwzkYIA_Ba9CkL4cL4_i2gy5VjoXxkM,4228
|
110
|
+
modal/cli/environment.py,sha256=Ayddkiq9jdj3XYDJ8ZmUqFpPPH8xajYlbexRkzGtUcg,4334
|
111
|
+
modal/cli/import_refs.py,sha256=wnqE5AMeyAN3IZmQvJCp54KRnJh8Nq_5fMqB6u6GEL8,9147
|
112
|
+
modal/cli/launch.py,sha256=uyI-ouGvYRjHLGxGQ2lYBZq32BiRT1i0L8ksz5iy7K8,2935
|
113
|
+
modal/cli/network_file_system.py,sha256=tDwTJ3LP2H5TP-SkHlRFnsP3Zsk7XEeRF_Hxej5jViM,7528
|
114
|
+
modal/cli/profile.py,sha256=rLXfjJObfPNjaZvNfHGIKqs7y9bGYyGe-K7V0w-Ni0M,3110
|
115
|
+
modal/cli/queues.py,sha256=MIh2OsliNE2QeL1erubfsRsNuG4fxqcqWA2vgIfQ4Mg,4494
|
116
|
+
modal/cli/run.py,sha256=IPA5Hx7HqCE01NilPZDh1fFaslO4QZa-RKEpMPqjLqA,17066
|
117
|
+
modal/cli/secret.py,sha256=uQpwYrMY98iMCWeZOQTcktOYhPTZ8IHnyealDc2CZqo,4206
|
118
|
+
modal/cli/token.py,sha256=mxSgOWakXG6N71hQb1ko61XAR9ZGkTMZD-Txn7gmTac,1924
|
119
|
+
modal/cli/utils.py,sha256=EK_6BIJ7gorQevp9sD_o5iW12foytpg8icBGO32hdeM,3660
|
120
|
+
modal/cli/volume.py,sha256=ngbnX4nhURMaCOqDGO4HmTvAbRBZBjRnPvk5TumnbVw,10004
|
121
|
+
modal/cli/programs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
|
122
|
+
modal/cli/programs/run_jupyter.py,sha256=RRr07CqZrStMbLdBM3PpzU6KM8t9FtLbdIPthg2-Mpw,2755
|
123
|
+
modal/cli/programs/vscode.py,sha256=acKvTUNA2uIGITKWYS9mkb_W8WUuNmvOSOvf1KBtUco,2479
|
124
|
+
modal/extensions/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
|
125
|
+
modal/extensions/ipython.py,sha256=Xvzy-A7cvwMSDa9p4c4CEMLOX2_Xsg9DkM1J9uyu7jc,983
|
126
|
+
modal/requirements/2023.12.312.txt,sha256=zWWUVgVQ92GXBKNYYr2-5vn9rlnXcmkqlwlX5u1eTYw,400
|
127
|
+
modal/requirements/2023.12.txt,sha256=OjsbXFkCSdkzzryZP82Q73osr5wxQ6EUzmGcK7twfkA,502
|
128
|
+
modal/requirements/2024.04.txt,sha256=6NnrbIE-mflwMyKyQ0tsWeY8XFE1kSW9oE8DVDoD8QU,544
|
129
|
+
modal/requirements/2024.10.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddRo,296
|
130
|
+
modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
|
131
|
+
modal/requirements/base-images.json,sha256=kLNo5Sqmnhp9H6Hr9IcaGJFrRaRg1yfuepUWkm-y8iQ,571
|
132
|
+
modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
|
133
|
+
modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
|
134
|
+
modal_docs/gen_reference_docs.py,sha256=AI8h-JKfwn7Tohm3P3D5G0SivSpdGgN6gnw-fED-S0s,6613
|
135
|
+
modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
|
136
|
+
modal_docs/mdmd/mdmd.py,sha256=F6EXKkjwrTbOiG6I7wKtNGVVmmeWLAJ5pnE7DUkDpvM,6231
|
137
|
+
modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
|
138
|
+
modal_global_objects/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
|
139
|
+
modal_global_objects/images/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
140
|
+
modal_global_objects/images/base_images.py,sha256=tFc7tzQRJHtq23kURd6DTrnnO4Yp5ujr34WdJOM5ubI,775
|
141
|
+
modal_global_objects/mounts/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
142
|
+
modal_global_objects/mounts/modal_client_package.py,sha256=W0E_yShsRojPzWm6LtIQqNVolapdnrZkm2hVEQuZK_4,767
|
143
|
+
modal_global_objects/mounts/python_standalone.py,sha256=SL_riIxpd8mP4i4CLDCWiFFNj0Ltknm9c_UIGfX5d60,1836
|
144
|
+
modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
145
|
+
modal_proto/api.proto,sha256=0AWqw9MDQvRrQTZI2xa8fVRcbs2lJG1DDt42ijBaJeY,78122
|
146
|
+
modal_proto/api_grpc.py,sha256=HvNN-zBJUs6z-a1T9Jn2ECs-Fs7RnkJ4FVzPTH6xU98,100519
|
147
|
+
modal_proto/api_pb2.py,sha256=hTsHAAKqmUxctck2FbpmOX4QTeF5pkNR_4BDYkrCxjk,284470
|
148
|
+
modal_proto/api_pb2.pyi,sha256=n9SMpTlIG3qhNI6XBc3gez5OeSzuaRfs4jkfu8WMIRw,380221
|
149
|
+
modal_proto/api_pb2_grpc.py,sha256=VFMzQ9MYmPg1XbTnmdjyw3MKhcPcqpBXtsQvtTn1uDI,217438
|
150
|
+
modal_proto/api_pb2_grpc.pyi,sha256=1o_3hja-2Y0iAlZDxnIXgahZQuaM6ruWLuc_2YoFuls,50691
|
151
|
+
modal_proto/modal_api_grpc.py,sha256=qUVht8AH8avTG2fm7Gw4pLwbgQTfqVgF5s_17HcrGKk,13438
|
152
|
+
modal_proto/modal_options_grpc.py,sha256=qJ1cuwA54oRqrdTyPTbvfhFZYd9HhJKK5UCwt523r3Y,120
|
153
|
+
modal_proto/options.proto,sha256=a-siq4swVbZPfaFRXAipRZzGP2bq8OsdUvjlyzAeodQ,488
|
154
|
+
modal_proto/options_grpc.py,sha256=M18X3d-8F_cNYSVM3I25dUTO5rZ0rd-vCCfynfh13Nc,125
|
155
|
+
modal_proto/options_pb2.py,sha256=OC2Oob8Yz_3Gs58hwpS_jSFWpGsWMcxlgXbJCyw3gMk,1827
|
156
|
+
modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1018
|
157
|
+
modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
158
|
+
modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
|
159
|
+
modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
160
|
+
modal_version/__init__.py,sha256=3IY-AWLH55r35_mQXIaut0jrJvoPuf1NZJBQQfSbPuo,470
|
161
|
+
modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
|
162
|
+
modal_version/_version_generated.py,sha256=1ZSIr835IEHi57LCELaWz0cnuPoKmFPQ6RSNQ5d-jAI,149
|
163
|
+
modal-0.67.33.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
164
|
+
modal-0.67.33.dist-info/METADATA,sha256=_5CGgZs2lnu_9I4Q5SRSIA9FYgHkOoRBOO_uOxtLMmE,2329
|
165
|
+
modal-0.67.33.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
166
|
+
modal-0.67.33.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
167
|
+
modal-0.67.33.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
|
168
|
+
modal-0.67.33.dist-info/RECORD,,
|