modal 1.2.1.dev23__py3-none-any.whl → 1.2.2.dev2__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.
Potentially problematic release.
This version of modal might be problematic. Click here for more details.
- modal/_utils/mount_utils.py +26 -1
- modal/client.pyi +2 -2
- modal/container_process.py +2 -3
- modal/functions.pyi +6 -6
- modal/image.py +21 -0
- modal/image.pyi +4 -0
- modal/io_streams.py +7 -0
- modal/io_streams.pyi +16 -0
- modal/volume.py +1 -1
- {modal-1.2.1.dev23.dist-info → modal-1.2.2.dev2.dist-info}/METADATA +1 -1
- {modal-1.2.1.dev23.dist-info → modal-1.2.2.dev2.dist-info}/RECORD +16 -16
- modal_version/__init__.py +1 -1
- {modal-1.2.1.dev23.dist-info → modal-1.2.2.dev2.dist-info}/WHEEL +0 -0
- {modal-1.2.1.dev23.dist-info → modal-1.2.2.dev2.dist-info}/entry_points.txt +0 -0
- {modal-1.2.1.dev23.dist-info → modal-1.2.2.dev2.dist-info}/licenses/LICENSE +0 -0
- {modal-1.2.1.dev23.dist-info → modal-1.2.2.dev2.dist-info}/top_level.txt +0 -0
modal/_utils/mount_utils.py
CHANGED
|
@@ -3,7 +3,9 @@ import posixpath
|
|
|
3
3
|
import typing
|
|
4
4
|
from collections.abc import Mapping, Sequence
|
|
5
5
|
from pathlib import PurePath, PurePosixPath
|
|
6
|
-
from typing import Union
|
|
6
|
+
from typing import Optional, Union
|
|
7
|
+
|
|
8
|
+
from typing_extensions import TypeGuard
|
|
7
9
|
|
|
8
10
|
from ..cloud_bucket_mount import _CloudBucketMount
|
|
9
11
|
from ..exception import InvalidError
|
|
@@ -76,3 +78,26 @@ def validate_volumes(
|
|
|
76
78
|
)
|
|
77
79
|
|
|
78
80
|
return validated_volumes
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def validate_only_modal_volumes(
|
|
84
|
+
volumes: Optional[Optional[dict[Union[str, PurePosixPath], _Volume]]],
|
|
85
|
+
caller_name: str,
|
|
86
|
+
) -> Sequence[tuple[str, _Volume]]:
|
|
87
|
+
"""Validate all volumes are `modal.Volume`."""
|
|
88
|
+
if volumes is None:
|
|
89
|
+
return []
|
|
90
|
+
|
|
91
|
+
validated_volumes = validate_volumes(volumes)
|
|
92
|
+
|
|
93
|
+
# Although the typing forbids `_CloudBucketMount` for type checking, one can still pass a `_CloudBucketMount`
|
|
94
|
+
# during runtime, so we'll check the type here.
|
|
95
|
+
def all_modal_volumes(
|
|
96
|
+
vols: Sequence[tuple[str, Union[_Volume, _CloudBucketMount]]],
|
|
97
|
+
) -> TypeGuard[Sequence[tuple[str, _Volume]]]:
|
|
98
|
+
return all(isinstance(v, _Volume) for _, v in vols)
|
|
99
|
+
|
|
100
|
+
if not all_modal_volumes(validated_volumes):
|
|
101
|
+
raise InvalidError(f"{caller_name} only supports volumes that are modal.Volume")
|
|
102
|
+
|
|
103
|
+
return validated_volumes
|
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.2.
|
|
36
|
+
version: str = "1.2.2.dev2",
|
|
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.2.
|
|
167
|
+
version: str = "1.2.2.dev2",
|
|
168
168
|
):
|
|
169
169
|
"""mdmd:hidden
|
|
170
170
|
The Modal client object is not intended to be instantiated directly by users.
|
modal/container_process.py
CHANGED
|
@@ -101,6 +101,7 @@ class _ContainerProcessThroughServer(Generic[T]):
|
|
|
101
101
|
|
|
102
102
|
Returns `None` if the process is still running, else returns the exit code.
|
|
103
103
|
"""
|
|
104
|
+
assert self._process_id
|
|
104
105
|
if self._returncode is not None:
|
|
105
106
|
return self._returncode
|
|
106
107
|
if self._exec_deadline and time.monotonic() >= self._exec_deadline:
|
|
@@ -119,6 +120,7 @@ class _ContainerProcessThroughServer(Generic[T]):
|
|
|
119
120
|
return None
|
|
120
121
|
|
|
121
122
|
async def _wait_for_completion(self) -> int:
|
|
123
|
+
assert self._process_id
|
|
122
124
|
while True:
|
|
123
125
|
req = api_pb2.ContainerExecWaitRequest(exec_id=self._process_id, timeout=10)
|
|
124
126
|
resp: api_pb2.ContainerExecWaitResponse = await retry_transient_errors(
|
|
@@ -169,9 +171,6 @@ class _ContainerProcessThroughServer(Generic[T]):
|
|
|
169
171
|
stream_impl = stream._impl
|
|
170
172
|
# Don't skip empty messages so we can detect when the process has booted.
|
|
171
173
|
async for chunk in stream_impl._get_logs(skip_empty_messages=False):
|
|
172
|
-
if chunk is None:
|
|
173
|
-
break
|
|
174
|
-
|
|
175
174
|
if not on_connect.is_set():
|
|
176
175
|
connecting_status.stop()
|
|
177
176
|
on_connect.set()
|
modal/functions.pyi
CHANGED
|
@@ -401,7 +401,7 @@ class Function(
|
|
|
401
401
|
|
|
402
402
|
_call_generator: ___call_generator_spec[typing_extensions.Self]
|
|
403
403
|
|
|
404
|
-
class __remote_spec(typing_extensions.Protocol[
|
|
404
|
+
class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
|
|
405
405
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
|
|
406
406
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result."""
|
|
407
407
|
...
|
|
@@ -410,7 +410,7 @@ class Function(
|
|
|
410
410
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result."""
|
|
411
411
|
...
|
|
412
412
|
|
|
413
|
-
remote: __remote_spec[modal._functions.
|
|
413
|
+
remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
|
|
414
414
|
|
|
415
415
|
class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
|
|
416
416
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
|
|
@@ -437,7 +437,7 @@ class Function(
|
|
|
437
437
|
"""
|
|
438
438
|
...
|
|
439
439
|
|
|
440
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
|
440
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
|
|
441
441
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
442
442
|
"""[Experimental] Calls the function with the given arguments, without waiting for the results.
|
|
443
443
|
|
|
@@ -461,7 +461,7 @@ class Function(
|
|
|
461
461
|
...
|
|
462
462
|
|
|
463
463
|
_experimental_spawn: ___experimental_spawn_spec[
|
|
464
|
-
modal._functions.
|
|
464
|
+
modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
|
|
465
465
|
]
|
|
466
466
|
|
|
467
467
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
|
|
@@ -470,7 +470,7 @@ class Function(
|
|
|
470
470
|
|
|
471
471
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
|
|
472
472
|
|
|
473
|
-
class __spawn_spec(typing_extensions.Protocol[
|
|
473
|
+
class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
|
|
474
474
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
475
475
|
"""Calls the function with the given arguments, without waiting for the results.
|
|
476
476
|
|
|
@@ -491,7 +491,7 @@ class Function(
|
|
|
491
491
|
"""
|
|
492
492
|
...
|
|
493
493
|
|
|
494
|
-
spawn: __spawn_spec[modal._functions.
|
|
494
|
+
spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
|
|
495
495
|
|
|
496
496
|
def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
|
|
497
497
|
"""Return the inner Python object wrapped by this Modal Function."""
|
modal/image.py
CHANGED
|
@@ -39,6 +39,7 @@ from ._utils.docker_utils import (
|
|
|
39
39
|
)
|
|
40
40
|
from ._utils.function_utils import FunctionInfo
|
|
41
41
|
from ._utils.grpc_utils import RETRYABLE_GRPC_STATUS_CODES, retry_transient_errors
|
|
42
|
+
from ._utils.mount_utils import validate_only_modal_volumes
|
|
42
43
|
from .client import _Client
|
|
43
44
|
from .cloud_bucket_mount import _CloudBucketMount
|
|
44
45
|
from .config import config, logger, user_config_path
|
|
@@ -487,6 +488,7 @@ class _Image(_Object, type_prefix="im"):
|
|
|
487
488
|
context_mount_function: Optional[Callable[[], Optional[_Mount]]] = None,
|
|
488
489
|
force_build: bool = False,
|
|
489
490
|
build_args: dict[str, str] = {},
|
|
491
|
+
validated_volumes: Optional[Sequence[tuple[str, _Volume]]] = None,
|
|
490
492
|
# For internal use only.
|
|
491
493
|
_namespace: "api_pb2.DeploymentNamespace.ValueType" = api_pb2.DEPLOYMENT_NAMESPACE_WORKSPACE,
|
|
492
494
|
_do_assert_no_mount_layers: bool = True,
|
|
@@ -494,6 +496,9 @@ class _Image(_Object, type_prefix="im"):
|
|
|
494
496
|
if base_images is None:
|
|
495
497
|
base_images = {}
|
|
496
498
|
|
|
499
|
+
if validated_volumes is None:
|
|
500
|
+
validated_volumes = []
|
|
501
|
+
|
|
497
502
|
if secrets is None:
|
|
498
503
|
secrets = []
|
|
499
504
|
if gpu_config is None:
|
|
@@ -514,6 +519,8 @@ class _Image(_Object, type_prefix="im"):
|
|
|
514
519
|
deps += (build_function,)
|
|
515
520
|
if image_registry_config and image_registry_config.secret:
|
|
516
521
|
deps += (image_registry_config.secret,)
|
|
522
|
+
for _, vol in validated_volumes:
|
|
523
|
+
deps += (vol,)
|
|
517
524
|
return deps
|
|
518
525
|
|
|
519
526
|
async def _load(self: _Image, resolver: Resolver, existing_object_id: Optional[str]):
|
|
@@ -592,6 +599,17 @@ class _Image(_Object, type_prefix="im"):
|
|
|
592
599
|
build_function_id = ""
|
|
593
600
|
_build_function = None
|
|
594
601
|
|
|
602
|
+
# Relies on dicts being ordered (true as of Python 3.6).
|
|
603
|
+
volume_mounts = [
|
|
604
|
+
api_pb2.VolumeMount(
|
|
605
|
+
mount_path=path,
|
|
606
|
+
volume_id=volume.object_id,
|
|
607
|
+
allow_background_commits=True,
|
|
608
|
+
read_only=volume._read_only,
|
|
609
|
+
)
|
|
610
|
+
for path, volume in validated_volumes
|
|
611
|
+
]
|
|
612
|
+
|
|
595
613
|
image_definition = api_pb2.Image(
|
|
596
614
|
base_images=base_images_pb2s,
|
|
597
615
|
dockerfile_commands=dockerfile.commands,
|
|
@@ -604,6 +622,7 @@ class _Image(_Object, type_prefix="im"):
|
|
|
604
622
|
runtime_debug=config.get("function_runtime_debug"),
|
|
605
623
|
build_function=_build_function,
|
|
606
624
|
build_args=build_args,
|
|
625
|
+
volume_mounts=volume_mounts,
|
|
607
626
|
)
|
|
608
627
|
|
|
609
628
|
req = api_pb2.ImageGetOrCreateRequest(
|
|
@@ -1690,6 +1709,7 @@ class _Image(_Object, type_prefix="im"):
|
|
|
1690
1709
|
*commands: Union[str, list[str]],
|
|
1691
1710
|
env: Optional[dict[str, Optional[str]]] = None,
|
|
1692
1711
|
secrets: Optional[Collection[_Secret]] = None,
|
|
1712
|
+
volumes: Optional[dict[Union[str, PurePosixPath], _Volume]] = None,
|
|
1693
1713
|
gpu: GPU_T = None,
|
|
1694
1714
|
force_build: bool = False, # Ignore cached builds, similar to 'docker build --no-cache'
|
|
1695
1715
|
) -> "_Image":
|
|
@@ -1712,6 +1732,7 @@ class _Image(_Object, type_prefix="im"):
|
|
|
1712
1732
|
secrets=secrets,
|
|
1713
1733
|
gpu_config=parse_gpu_config(gpu),
|
|
1714
1734
|
force_build=self.force_build or force_build,
|
|
1735
|
+
validated_volumes=validate_only_modal_volumes(volumes, "Image.run_commands"),
|
|
1715
1736
|
)
|
|
1716
1737
|
|
|
1717
1738
|
@staticmethod
|
modal/image.pyi
CHANGED
|
@@ -176,6 +176,7 @@ class _Image(modal._object._Object):
|
|
|
176
176
|
] = None,
|
|
177
177
|
force_build: bool = False,
|
|
178
178
|
build_args: dict[str, str] = {},
|
|
179
|
+
validated_volumes: typing.Optional[collections.abc.Sequence[tuple[str, modal.volume._Volume]]] = None,
|
|
179
180
|
_namespace: int = 1,
|
|
180
181
|
_do_assert_no_mount_layers: bool = True,
|
|
181
182
|
): ...
|
|
@@ -668,6 +669,7 @@ class _Image(modal._object._Object):
|
|
|
668
669
|
*commands: typing.Union[str, list[str]],
|
|
669
670
|
env: typing.Optional[dict[str, typing.Optional[str]]] = None,
|
|
670
671
|
secrets: typing.Optional[collections.abc.Collection[modal.secret._Secret]] = None,
|
|
672
|
+
volumes: typing.Optional[dict[typing.Union[str, pathlib.PurePosixPath], modal.volume._Volume]] = None,
|
|
671
673
|
gpu: typing.Union[None, str, modal.gpu._GPUConfig] = None,
|
|
672
674
|
force_build: bool = False,
|
|
673
675
|
) -> _Image:
|
|
@@ -1091,6 +1093,7 @@ class Image(modal.object.Object):
|
|
|
1091
1093
|
] = None,
|
|
1092
1094
|
force_build: bool = False,
|
|
1093
1095
|
build_args: dict[str, str] = {},
|
|
1096
|
+
validated_volumes: typing.Optional[collections.abc.Sequence[tuple[str, modal.volume.Volume]]] = None,
|
|
1094
1097
|
_namespace: int = 1,
|
|
1095
1098
|
_do_assert_no_mount_layers: bool = True,
|
|
1096
1099
|
): ...
|
|
@@ -1648,6 +1651,7 @@ class Image(modal.object.Object):
|
|
|
1648
1651
|
*commands: typing.Union[str, list[str]],
|
|
1649
1652
|
env: typing.Optional[dict[str, typing.Optional[str]]] = None,
|
|
1650
1653
|
secrets: typing.Optional[collections.abc.Collection[modal.secret.Secret]] = None,
|
|
1654
|
+
volumes: typing.Optional[dict[typing.Union[str, pathlib.PurePosixPath], modal.volume.Volume]] = None,
|
|
1651
1655
|
gpu: typing.Union[None, str, modal.gpu._GPUConfig] = None,
|
|
1652
1656
|
force_build: bool = False,
|
|
1653
1657
|
) -> Image:
|
modal/io_streams.py
CHANGED
|
@@ -509,6 +509,13 @@ class _StreamReader(Generic[T]):
|
|
|
509
509
|
```
|
|
510
510
|
"""
|
|
511
511
|
|
|
512
|
+
_impl: Union[
|
|
513
|
+
_StreamReaderThroughServer,
|
|
514
|
+
_DevnullStreamReader,
|
|
515
|
+
_TextStreamReaderThroughCommandRouter,
|
|
516
|
+
_BytesStreamReaderThroughCommandRouter,
|
|
517
|
+
]
|
|
518
|
+
|
|
512
519
|
def __init__(
|
|
513
520
|
self,
|
|
514
521
|
file_descriptor: "api_pb2.FileDescriptor.ValueType",
|
modal/io_streams.pyi
CHANGED
|
@@ -198,6 +198,14 @@ class _StreamReader(typing.Generic[T]):
|
|
|
198
198
|
print(f"Message: {message}")
|
|
199
199
|
```
|
|
200
200
|
"""
|
|
201
|
+
|
|
202
|
+
_impl: typing.Union[
|
|
203
|
+
_StreamReaderThroughServer,
|
|
204
|
+
_DevnullStreamReader,
|
|
205
|
+
_TextStreamReaderThroughCommandRouter,
|
|
206
|
+
_BytesStreamReaderThroughCommandRouter,
|
|
207
|
+
]
|
|
208
|
+
|
|
201
209
|
def __init__(
|
|
202
210
|
self,
|
|
203
211
|
file_descriptor: int,
|
|
@@ -390,6 +398,14 @@ class StreamReader(typing.Generic[T]):
|
|
|
390
398
|
print(f"Message: {message}")
|
|
391
399
|
```
|
|
392
400
|
"""
|
|
401
|
+
|
|
402
|
+
_impl: typing.Union[
|
|
403
|
+
_StreamReaderThroughServer,
|
|
404
|
+
_DevnullStreamReader,
|
|
405
|
+
_TextStreamReaderThroughCommandRouter,
|
|
406
|
+
_BytesStreamReaderThroughCommandRouter,
|
|
407
|
+
]
|
|
408
|
+
|
|
393
409
|
def __init__(
|
|
394
410
|
self,
|
|
395
411
|
file_descriptor: int,
|
modal/volume.py
CHANGED
|
@@ -1265,7 +1265,7 @@ async def _put_missing_blocks(
|
|
|
1265
1265
|
file_progress.pending_blocks.add(missing_block.block_index)
|
|
1266
1266
|
task_progress_cb = functools.partial(progress_cb, task_id=file_progress.task_id)
|
|
1267
1267
|
|
|
1268
|
-
@retry(n_attempts=
|
|
1268
|
+
@retry(n_attempts=11, base_delay=0.5, timeout=None)
|
|
1269
1269
|
async def put_missing_block_attempt(payload: BytesIOSegmentPayload) -> bytes:
|
|
1270
1270
|
with payload.reset_on_error(subtract_progress=True):
|
|
1271
1271
|
async with ClientSessionRegistry.get_session().put(
|
|
@@ -24,13 +24,13 @@ modal/app.pyi,sha256=AUV5Rp8qQrZJTP2waoKHFY7rYgsXNMYibMcCAQKuSeo,50544
|
|
|
24
24
|
modal/billing.py,sha256=zmQ3bcCJlwa4KD1IA_QgdWpm1pn13c-7qfy79iEauYI,195
|
|
25
25
|
modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
|
|
26
26
|
modal/client.py,sha256=kyAIVB3Ay-XKJizQ_1ufUFB__EagV0MLmHJpyYyJ7J0,18636
|
|
27
|
-
modal/client.pyi,sha256=
|
|
27
|
+
modal/client.pyi,sha256=FF6pm-PDSQr3eSv3Jp0n39VC_rhpZ5rSQxcLztjBC-s,15829
|
|
28
28
|
modal/cloud_bucket_mount.py,sha256=I2GRXYhOWLIz2kJZjXu75jAm9EJkBNcutGc6jR2ReUw,5928
|
|
29
29
|
modal/cloud_bucket_mount.pyi,sha256=VuUOipMIHqFXMkD-3g2bsoqpSxV5qswlFHDOqPQzYAo,7405
|
|
30
30
|
modal/cls.py,sha256=ZxzivE3fNci4-A5uyBYNAzXMXtdqDg3gnYvgbdy5fhg,40384
|
|
31
31
|
modal/cls.pyi,sha256=jJsDPFoqzM4ht-V-e-xEJKJ5TINLF0fYtoBm_UeAW5Y,27281
|
|
32
32
|
modal/config.py,sha256=hpgkgQKbjzo6gVbRzXQrky72_KpdSEm65RNi1M2iNjc,13038
|
|
33
|
-
modal/container_process.py,sha256=
|
|
33
|
+
modal/container_process.py,sha256=CrAZwoux0FukZCXnija5flkhfftnrydfQb_cNfZf_uc,16951
|
|
34
34
|
modal/container_process.pyi,sha256=xMKr-VbQsydS8AbhAys9UTpHHnH2QRyINpPtPG7NwmI,8373
|
|
35
35
|
modal/dict.py,sha256=XkaxuojMVtcc4bZvCjJcd6DedU5xxfF8H4w-mDzFPCo,21580
|
|
36
36
|
modal/dict.pyi,sha256=deOiwuwZtwXqedC3h19SwoQIWc4mUnDTBM5XkONt48Y,31712
|
|
@@ -41,12 +41,12 @@ modal/file_io.py,sha256=OSKr77TujcXGJW1iikzYiHckLSmv07QBgBHcxxYEkoI,21456
|
|
|
41
41
|
modal/file_io.pyi,sha256=xtO6Glf_BFwDE7QiQQo24QqcMf_Vv-iz7WojcGVlLBU,15932
|
|
42
42
|
modal/file_pattern_matcher.py,sha256=A_Kdkej6q7YQyhM_2-BvpFmPqJ0oHb54B6yf9VqvPVE,8116
|
|
43
43
|
modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
|
|
44
|
-
modal/functions.pyi,sha256=
|
|
44
|
+
modal/functions.pyi,sha256=Z6VuukLrjASAgf0kV9I6c09WvP_b2gCujX6f9j2bBaw,37988
|
|
45
45
|
modal/gpu.py,sha256=Fe5ORvVPDIstSq1xjmM6OoNgLYFWvogP9r5BgmD3hYg,6769
|
|
46
|
-
modal/image.py,sha256=
|
|
47
|
-
modal/image.pyi,sha256=
|
|
48
|
-
modal/io_streams.py,sha256=
|
|
49
|
-
modal/io_streams.pyi,sha256=
|
|
46
|
+
modal/image.py,sha256=C32U4FZL9LJq0dHcR-yfnwCk8Su45lgh8FE7ZqlP7uA,108120
|
|
47
|
+
modal/image.pyi,sha256=NQ82YbSF_kadH0r4UqBDgHPDHZo5_yD8qNEFJgUzJZM,77956
|
|
48
|
+
modal/io_streams.py,sha256=8fSHsdIy734cmlWQsGoh9Elq7bY52A1mNeQaJglIzmo,30093
|
|
49
|
+
modal/io_streams.pyi,sha256=cvXzIcWlDorAxjdaWcai1gQwok2-za5yj3uB_eVpEl0,18382
|
|
50
50
|
modal/mount.py,sha256=G7_xhQMZqokgfsaFLMch0YR3fs-OUNqYUm3f4jHTSMQ,33161
|
|
51
51
|
modal/mount.pyi,sha256=MD_zV2M7eCWxbOpQRjU60aHevN-bmbiywaCX82QoFlw,15380
|
|
52
52
|
modal/network_file_system.py,sha256=ZdEIRgdcR-p_ILyw_AecEtPOhhrSWJeADYCtFnhtaHM,13509
|
|
@@ -80,7 +80,7 @@ modal/snapshot.pyi,sha256=0q83hlmWxAhDu8xwZyL5VmYh0i8Tigf7S60or2k30L8,1682
|
|
|
80
80
|
modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
|
|
81
81
|
modal/token_flow.py,sha256=GWpar0gANs71vm9Bd_Cj87UG1K3ljTURbkEjG3JLsrY,7616
|
|
82
82
|
modal/token_flow.pyi,sha256=eirYjyqbRiT3GCKMIPHJPpkvBTu8WxDKqSHehWaJI_4,2533
|
|
83
|
-
modal/volume.py,sha256=
|
|
83
|
+
modal/volume.py,sha256=JgdT4GZz48AQPQLeVgvC49PWB8CgJ8LoG5fS7JxUqyw,52364
|
|
84
84
|
modal/volume.pyi,sha256=WZGdwB51qvH5E7d6qS7sNCsscyuHsKUHFyyiZaQyvw8,53212
|
|
85
85
|
modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
|
86
86
|
modal/_runtime/asgi.py,sha256=AOcduIlijmlxhXVWo7AIUhigo-bqm6nDkHj4Q4JLy6o,22607
|
|
@@ -107,7 +107,7 @@ modal/_utils/hash_utils.py,sha256=zg3J6OGxTFGSFri1qQ12giDz90lWk8bzaxCTUCRtiX4,30
|
|
|
107
107
|
modal/_utils/http_utils.py,sha256=yeTFsXYr0rYMEhB7vBP7audG9Uc7OLhzKBANFDZWVt0,2451
|
|
108
108
|
modal/_utils/jwt_utils.py,sha256=fxH9plyrbAemTbjSsQtzIdDXE9QXxvMC4DiUZ16G0aA,1360
|
|
109
109
|
modal/_utils/logger.py,sha256=NgbMKFT9chYYt_TU01DdIior5ByYr2gZtrWIk1SFRLc,1782
|
|
110
|
-
modal/_utils/mount_utils.py,sha256=
|
|
110
|
+
modal/_utils/mount_utils.py,sha256=3v6wbSvEjOhIlnLGbyXKOzdoXaG-FwNAZ_Rr0io_v2o,4113
|
|
111
111
|
modal/_utils/name_utils.py,sha256=CIQL0Y4z47tq0rfNL2Kdo5dxsGrxoN2hR9Ko0HapeE4,2517
|
|
112
112
|
modal/_utils/package_utils.py,sha256=LcL2olGN4xaUzu2Tbv-C-Ft9Qp6bsLxEfETOAVd-mjU,2073
|
|
113
113
|
modal/_utils/pattern_utils.py,sha256=ZUffaECfe2iYBhH6cvCB-0-UWhmEBTZEl_TwG_So3ag,6714
|
|
@@ -156,7 +156,7 @@ modal/experimental/__init__.py,sha256=9gkVuDmu3m4TlKoU3MzEtTOemUSs8EEOWba40s7Aa0
|
|
|
156
156
|
modal/experimental/flash.py,sha256=-lSyFBbeT6UT-uB29L955SNh6L6ISg_uBDy5gF4ZpLo,26919
|
|
157
157
|
modal/experimental/flash.pyi,sha256=uwinKAYxpunNNfBj58FP88DXb535Qik4F6tnJKPAIwQ,14696
|
|
158
158
|
modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
|
|
159
|
-
modal-1.2.
|
|
159
|
+
modal-1.2.2.dev2.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
|
160
160
|
modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
|
|
161
161
|
modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
|
|
162
162
|
modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
|
|
@@ -184,10 +184,10 @@ modal_proto/task_command_router_pb2.py,sha256=_pD2ZpU0bNzhwBdzmLoLyLtAtftI_Agxwn
|
|
|
184
184
|
modal_proto/task_command_router_pb2.pyi,sha256=EyDgXPLr7alqjXYERV8w_MPuO404x0uCppmSkrfE9IE,14589
|
|
185
185
|
modal_proto/task_command_router_pb2_grpc.py,sha256=uEQ0HdrCp8v-9bB5yIic9muA8spCShLHY6Bz9cCgOUE,10114
|
|
186
186
|
modal_proto/task_command_router_pb2_grpc.pyi,sha256=s3Yxsrawdj4nr8vqQqsAxyX6ilWaGbdECy425KKbLIA,3301
|
|
187
|
-
modal_version/__init__.py,sha256=
|
|
187
|
+
modal_version/__init__.py,sha256=05gG6jsOwwAvAW0bXD1lmIxuqHypyCF_zcuj7qmNJvk,120
|
|
188
188
|
modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
|
|
189
|
-
modal-1.2.
|
|
190
|
-
modal-1.2.
|
|
191
|
-
modal-1.2.
|
|
192
|
-
modal-1.2.
|
|
193
|
-
modal-1.2.
|
|
189
|
+
modal-1.2.2.dev2.dist-info/METADATA,sha256=6BdSxCXUHB3yLGyA4yKI1XwiNrG9Y4uJSeTKWLYF4W4,2483
|
|
190
|
+
modal-1.2.2.dev2.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
|
|
191
|
+
modal-1.2.2.dev2.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
|
192
|
+
modal-1.2.2.dev2.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
|
|
193
|
+
modal-1.2.2.dev2.dist-info/RECORD,,
|
modal_version/__init__.py
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|