modal 0.67.6__py3-none-any.whl → 0.67.11__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 +5 -4
- modal/_output.py +29 -28
- modal/_pty.py +2 -2
- modal/_resolver.py +6 -5
- modal/_resources.py +3 -3
- modal/_runtime/asgi.py +7 -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 +4 -3
- modal/_tunnel.pyi +2 -2
- modal/_utils/async_utils.py +8 -15
- modal/_utils/blob_utils.py +4 -3
- modal/_utils/function_utils.py +14 -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 +29 -34
- modal/app.pyi +102 -97
- 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/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 +30 -30
- modal/cls.pyi +35 -34
- modal/config.py +3 -2
- modal/dict.py +4 -3
- modal/dict.pyi +10 -9
- modal/environments.py +3 -3
- modal/environments.pyi +3 -3
- modal/exception.py +2 -3
- modal/functions.py +105 -35
- modal/functions.pyi +71 -48
- modal/image.py +45 -48
- modal/image.pyi +102 -101
- modal/io_streams.py +4 -7
- modal/io_streams.pyi +14 -13
- modal/mount.py +23 -22
- modal/mount.pyi +28 -29
- modal/network_file_system.py +7 -6
- 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 +9 -13
- modal/partial_function.pyi +17 -18
- modal/queue.py +9 -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 +14 -13
- modal/sandbox.pyi +67 -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 +7 -12
- modal/volume.pyi +17 -16
- {modal-0.67.6.dist-info → modal-0.67.11.dist-info}/METADATA +1 -1
- modal-0.67.11.dist-info/RECORD +168 -0
- modal_docs/mdmd/signatures.py +1 -2
- modal_version/_version_generated.py +1 -1
- modal-0.67.6.dist-info/RECORD +0 -168
- {modal-0.67.6.dist-info → modal-0.67.11.dist-info}/LICENSE +0 -0
- {modal-0.67.6.dist-info → modal-0.67.11.dist-info}/WHEEL +0 -0
- {modal-0.67.6.dist-info → modal-0.67.11.dist-info}/entry_points.txt +0 -0
- {modal-0.67.6.dist-info → modal-0.67.11.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,
|
@@ -364,7 +359,7 @@ class _Volume(_Object, type_prefix="vo"):
|
|
364
359
|
yield FileEntry._from_proto(entry)
|
365
360
|
|
366
361
|
@live_method
|
367
|
-
async def listdir(self, path: str, *, recursive: bool = False) ->
|
362
|
+
async def listdir(self, path: str, *, recursive: bool = False) -> list[FileEntry]:
|
368
363
|
"""List all files under a path prefix in the modal.Volume.
|
369
364
|
|
370
365
|
Passing a directory path lists all files in the directory. For a file path, return only that
|
@@ -421,7 +416,7 @@ class _Volume(_Object, type_prefix="vo"):
|
|
421
416
|
|
422
417
|
n = fileobj.write(response.data)
|
423
418
|
if n != len(response.data):
|
424
|
-
raise
|
419
|
+
raise OSError(f"failed to write {len(response.data)} bytes to output. Wrote {n}.")
|
425
420
|
elif n == response.size:
|
426
421
|
return response.size
|
427
422
|
elif n > response.size:
|
@@ -442,7 +437,7 @@ class _Volume(_Object, type_prefix="vo"):
|
|
442
437
|
|
443
438
|
n = fileobj.write(response.data)
|
444
439
|
if n != len(response.data):
|
445
|
-
raise
|
440
|
+
raise OSError(f"failed to write {len(response.data)} bytes to output. Wrote {n}.")
|
446
441
|
written += n
|
447
442
|
if written == file_size:
|
448
443
|
break
|
@@ -524,7 +519,7 @@ class _VolumeUploadContextManager:
|
|
524
519
|
_client: _Client
|
525
520
|
_force: bool
|
526
521
|
progress_cb: Callable[..., Any]
|
527
|
-
_upload_generators:
|
522
|
+
_upload_generators: list[Generator[Callable[[], FileUploadSpec], None, None]]
|
528
523
|
|
529
524
|
def __init__(
|
530
525
|
self, volume_id: str, client: _Client, progress_cb: Optional[Callable[..., Any]] = None, force: bool = False
|
@@ -556,7 +551,7 @@ class _VolumeUploadContextManager:
|
|
556
551
|
yield await fut
|
557
552
|
|
558
553
|
# Compute checksums & Upload files
|
559
|
-
files:
|
554
|
+
files: list[api_pb2.MountFile] = []
|
560
555
|
async with aclosing(async_map(gen_file_upload_specs(), self._upload_file, concurrency=20)) as stream:
|
561
556
|
async for item in stream:
|
562
557
|
files.append(item)
|
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__(
|
@@ -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=tPkcwcvAGNLHX4mEPzoDYJaNDdPMsYj0fuQ_Py11a6I,28685
|
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=B7hnEwCh6sm4OeZ4kEeSBWemVRup_MP8GsTAuAXGZ5g,7354
|
23
|
+
modal/cloud_bucket_mount.py,sha256=G7T7jWLD0QkmrfKR75mSTwdUZ2xNfj7pkVqb4ipmxmI,5735
|
24
|
+
modal/cloud_bucket_mount.pyi,sha256=CEi7vrH3kDUF4LAy4qP6tfImy2UJuFRcRbsgRNM1wo8,1403
|
25
|
+
modal/cls.py,sha256=F2jk5zFCAA8h-GfM0dbdBG3Mu5wiG9k9Z9JLYRYuT2Q,24758
|
26
|
+
modal/cls.pyi,sha256=2_nbvSlkh2d0tfibTIxsThPiL0Xcrcosc5f_ET-i0sk,8147
|
27
|
+
modal/config.py,sha256=1KhNJkjYsJkX1V8RPPdRYPlM2HE-ZZs0JVSxbiXjmrw,11010
|
28
|
+
modal/container_process.py,sha256=c_jBPtyPeSxbIcbLfs_FzTrt-1eErtRSnsfxkDozFoY,5589
|
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=Pwebl3aeEkNrniXCzuDdjfxgExykTWQo7o0VjFD4To8,69853
|
37
|
+
modal/functions.pyi,sha256=qVcpwr9I48PGGDCshtkYxsesQrMdRgmleRvIXUtyAVk,25107
|
38
|
+
modal/gpu.py,sha256=r4rL6uH3UJIQthzYvfWauXNyh01WqCPtKZCmmSX1fd4,6881
|
39
|
+
modal/image.py,sha256=ZIC8tgjJnqWamN4sZ0Gch3x2VmcM671MWfRLR5SMmoc,79423
|
40
|
+
modal/image.pyi,sha256=JjicLNuaBsfuPZ_xo_eN0zKZkDrEm2alYg-szENhJjM,24591
|
41
|
+
modal/io_streams.py,sha256=gZPXD7unxRrxC4aroejKM1-pd4STg09JqLd0NRegAMs,14635
|
42
|
+
modal/io_streams.pyi,sha256=QNvbZpm1qW6LkqCIcJ4Zprn_IW-ZVqt62KrpDP--_Co,4555
|
43
|
+
modal/mount.py,sha256=_N_fd5NX_eWwmb_xh_X_28nNHW9upEDXDyXixZWnUiQ,27730
|
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=onHBLCbQLJJu1h9--L7hw_gmvEdbLm-pNSa4xxk7ydA,28205
|
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=5oDrV9XL8JkGl_gcbu5D20vbaxFRpWv_bCdw-Fo-qNE,24886
|
64
|
+
modal/sandbox.pyi,sha256=FKdkLGmJrdRT0pHlhV_brxo1pvxr6uWZeL-zomLHSas,17366
|
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=S6quIMRruMcWzk8Hm-QFNlUcbNilXSBxfFxCSq5VmGE,29375
|
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=CYXogDVqqUtSe-DVP2A3F-6KztjPZaW6ez2lrYBCW_Y,24917
|
85
|
+
modal/_utils/blob_utils.py,sha256=XJpFr6SfNoODZEjyGm7WH9R3pKsK4yqpzZOFR3YX6fc,15856
|
86
|
+
modal/_utils/function_utils.py,sha256=SkT5emqGJ8NNASk0BlBmgDfDBUYAkUM851K74qCHL98,24641
|
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=A866-P6OfZ5kyb1rHUIeaVokR9RVMHyiKvkxg4Ul1_s,9177
|
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=_vTEX3PECUsatzhDs8lyJmDK0LbFetT1sJB6MIDfFAo,1870
|
144
|
+
modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
145
|
+
modal_proto/api.proto,sha256=1zr0aMwKHYgPfkvAjQ5hCRiWbJcuVXxwiuOlLpDU46Y,77644
|
146
|
+
modal_proto/api_grpc.py,sha256=S7h8xe-msb3-Q8oSd7DUoB46z-dcRhsXGb6LjFCLNFI,99013
|
147
|
+
modal_proto/api_pb2.py,sha256=PLRmPloiKDiiziRzbZrzF3Cr-Cn5uCv9USwc7nC_eeg,282809
|
148
|
+
modal_proto/api_pb2.pyi,sha256=LAs_gmu_GYKzfa_8dxXiXsNejnWyWjX5hQ-6MuJmww0,378389
|
149
|
+
modal_proto/api_pb2_grpc.py,sha256=g7EfCSir3xStPPjJOU2U668zz6cGdN6u7SxvTTwU9aU,214126
|
150
|
+
modal_proto/api_pb2_grpc.pyi,sha256=9GhLZVRm69Qhyj_jmGqEGv1rD37Tzj6E6hGzKV08u48,49961
|
151
|
+
modal_proto/modal_api_grpc.py,sha256=en48QTR5fwA7x0twtlsqLKRjjDEAKVoh6EeSznQfQ3U,13236
|
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=YsypBM6HmXq8DPKueY9FgGnZ2xdO5KF3g6dZfzBASeg,149
|
163
|
+
modal-0.67.11.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
164
|
+
modal-0.67.11.dist-info/METADATA,sha256=StjByc8ZnmcoGsEIpjloa7D5qiraqKpSoc5zvrmvT4o,2329
|
165
|
+
modal-0.67.11.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
166
|
+
modal-0.67.11.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
167
|
+
modal-0.67.11.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
|
168
|
+
modal-0.67.11.dist-info/RECORD,,
|
modal_docs/mdmd/signatures.py
CHANGED
@@ -4,12 +4,11 @@ import inspect
|
|
4
4
|
import re
|
5
5
|
import textwrap
|
6
6
|
import warnings
|
7
|
-
from typing import Tuple
|
8
7
|
|
9
8
|
from synchronicity.synchronizer import FunctionWithAio
|
10
9
|
|
11
10
|
|
12
|
-
def _signature_from_ast(func) ->
|
11
|
+
def _signature_from_ast(func) -> tuple[str, str]:
|
13
12
|
"""Get function signature, including decorators and comments, from source code
|
14
13
|
|
15
14
|
Traverses functools.wraps-wrappings to get source of underlying function.
|