modal 0.72.29__py3-none-any.whl → 0.72.31__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/client.pyi +2 -2
- modal/cloud_bucket_mount.py +4 -0
- modal/cloud_bucket_mount.pyi +4 -0
- modal/functions.pyi +6 -6
- modal/runner.py +12 -1
- {modal-0.72.29.dist-info → modal-0.72.31.dist-info}/METADATA +1 -1
- {modal-0.72.29.dist-info → modal-0.72.31.dist-info}/RECORD +15 -15
- modal_proto/api.proto +1 -0
- modal_proto/api_pb2.py +682 -682
- modal_proto/api_pb2.pyi +7 -2
- modal_version/_version_generated.py +1 -1
- {modal-0.72.29.dist-info → modal-0.72.31.dist-info}/LICENSE +0 -0
- {modal-0.72.29.dist-info → modal-0.72.31.dist-info}/WHEEL +0 -0
- {modal-0.72.29.dist-info → modal-0.72.31.dist-info}/entry_points.txt +0 -0
- {modal-0.72.29.dist-info → modal-0.72.31.dist-info}/top_level.txt +0 -0
modal/client.pyi
CHANGED
@@ -27,7 +27,7 @@ class _Client:
|
|
27
27
|
_snapshotted: bool
|
28
28
|
|
29
29
|
def __init__(
|
30
|
-
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.72.
|
30
|
+
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.72.31"
|
31
31
|
): ...
|
32
32
|
def is_closed(self) -> bool: ...
|
33
33
|
@property
|
@@ -83,7 +83,7 @@ class Client:
|
|
83
83
|
_snapshotted: bool
|
84
84
|
|
85
85
|
def __init__(
|
86
|
-
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.72.
|
86
|
+
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.72.31"
|
87
87
|
): ...
|
88
88
|
def is_closed(self) -> bool: ...
|
89
89
|
@property
|
modal/cloud_bucket_mount.py
CHANGED
@@ -112,6 +112,9 @@ class _CloudBucketMount:
|
|
112
112
|
# If the bucket is publicly accessible, the secret is unnecessary and can be omitted.
|
113
113
|
secret: Optional[_Secret] = None
|
114
114
|
|
115
|
+
# Role ARN used for using OIDC authentication to access a cloud bucket.
|
116
|
+
oidc_auth_role_arn: Optional[str] = None
|
117
|
+
|
115
118
|
read_only: bool = False
|
116
119
|
requester_pays: bool = False
|
117
120
|
|
@@ -155,6 +158,7 @@ def cloud_bucket_mounts_to_proto(mounts: list[tuple[str, _CloudBucketMount]]) ->
|
|
155
158
|
bucket_type=bucket_type,
|
156
159
|
requester_pays=mount.requester_pays,
|
157
160
|
key_prefix=key_prefix,
|
161
|
+
oidc_auth_role_arn=mount.oidc_auth_role_arn,
|
158
162
|
)
|
159
163
|
cloud_bucket_mounts.append(cloud_bucket_mount)
|
160
164
|
|
modal/cloud_bucket_mount.pyi
CHANGED
@@ -7,6 +7,7 @@ class _CloudBucketMount:
|
|
7
7
|
bucket_endpoint_url: typing.Optional[str]
|
8
8
|
key_prefix: typing.Optional[str]
|
9
9
|
secret: typing.Optional[modal.secret._Secret]
|
10
|
+
oidc_auth_role_arn: typing.Optional[str]
|
10
11
|
read_only: bool
|
11
12
|
requester_pays: bool
|
12
13
|
|
@@ -16,6 +17,7 @@ class _CloudBucketMount:
|
|
16
17
|
bucket_endpoint_url: typing.Optional[str] = None,
|
17
18
|
key_prefix: typing.Optional[str] = None,
|
18
19
|
secret: typing.Optional[modal.secret._Secret] = None,
|
20
|
+
oidc_auth_role_arn: typing.Optional[str] = None,
|
19
21
|
read_only: bool = False,
|
20
22
|
requester_pays: bool = False,
|
21
23
|
) -> None: ...
|
@@ -31,6 +33,7 @@ class CloudBucketMount:
|
|
31
33
|
bucket_endpoint_url: typing.Optional[str]
|
32
34
|
key_prefix: typing.Optional[str]
|
33
35
|
secret: typing.Optional[modal.secret.Secret]
|
36
|
+
oidc_auth_role_arn: typing.Optional[str]
|
34
37
|
read_only: bool
|
35
38
|
requester_pays: bool
|
36
39
|
|
@@ -40,6 +43,7 @@ class CloudBucketMount:
|
|
40
43
|
bucket_endpoint_url: typing.Optional[str] = None,
|
41
44
|
key_prefix: typing.Optional[str] = None,
|
42
45
|
secret: typing.Optional[modal.secret.Secret] = None,
|
46
|
+
oidc_auth_role_arn: typing.Optional[str] = None,
|
43
47
|
read_only: bool = False,
|
44
48
|
requester_pays: bool = False,
|
45
49
|
) -> None: ...
|
modal/functions.pyi
CHANGED
@@ -463,11 +463,11 @@ class Function(typing.Generic[P, ReturnType, OriginalReturnType], modal.object.O
|
|
463
463
|
|
464
464
|
_call_generator_nowait: ___call_generator_nowait_spec
|
465
465
|
|
466
|
-
class __remote_spec(typing_extensions.Protocol[
|
466
|
+
class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
467
467
|
def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
|
468
468
|
async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
|
469
469
|
|
470
|
-
remote: __remote_spec[
|
470
|
+
remote: __remote_spec[P, ReturnType]
|
471
471
|
|
472
472
|
class __remote_gen_spec(typing_extensions.Protocol):
|
473
473
|
def __call__(self, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
|
@@ -480,17 +480,17 @@ class Function(typing.Generic[P, ReturnType, OriginalReturnType], modal.object.O
|
|
480
480
|
def _get_obj(self) -> typing.Optional[modal.cls.Obj]: ...
|
481
481
|
def local(self, *args: P.args, **kwargs: P.kwargs) -> OriginalReturnType: ...
|
482
482
|
|
483
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
483
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
484
484
|
def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
485
485
|
async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
486
486
|
|
487
|
-
_experimental_spawn: ___experimental_spawn_spec[
|
487
|
+
_experimental_spawn: ___experimental_spawn_spec[P, ReturnType]
|
488
488
|
|
489
|
-
class __spawn_spec(typing_extensions.Protocol[
|
489
|
+
class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
490
490
|
def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
491
491
|
async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
492
492
|
|
493
|
-
spawn: __spawn_spec[
|
493
|
+
spawn: __spawn_spec[P, ReturnType]
|
494
494
|
|
495
495
|
def get_raw_f(self) -> typing.Callable[..., typing.Any]: ...
|
496
496
|
|
modal/runner.py
CHANGED
@@ -4,6 +4,7 @@ import dataclasses
|
|
4
4
|
import os
|
5
5
|
import time
|
6
6
|
import typing
|
7
|
+
import warnings
|
7
8
|
from collections.abc import AsyncGenerator
|
8
9
|
from multiprocessing.synchronize import Event
|
9
10
|
from typing import TYPE_CHECKING, Any, Optional, TypeVar
|
@@ -287,6 +288,16 @@ async def _run_app(
|
|
287
288
|
client = await _Client.from_env()
|
288
289
|
|
289
290
|
app_state = api_pb2.APP_STATE_DETACHED if detach else api_pb2.APP_STATE_EPHEMERAL
|
291
|
+
|
292
|
+
output_mgr = _get_output_manager()
|
293
|
+
if interactive and output_mgr is None:
|
294
|
+
warnings.warn(
|
295
|
+
"Interactive mode is disabled because no output manager is active. "
|
296
|
+
"Use 'with modal.enable_output():' to enable interactive mode and see logs.",
|
297
|
+
stacklevel=2,
|
298
|
+
)
|
299
|
+
interactive = False
|
300
|
+
|
290
301
|
running_app: RunningApp = await _init_local_app_new(
|
291
302
|
client,
|
292
303
|
app.description or "",
|
@@ -306,7 +317,7 @@ async def _run_app(
|
|
306
317
|
tc.infinite_loop(heartbeat, sleep=HEARTBEAT_INTERVAL, log_exception=not detach)
|
307
318
|
logs_loop: Optional[asyncio.Task] = None
|
308
319
|
|
309
|
-
if output_mgr
|
320
|
+
if output_mgr is not None:
|
310
321
|
# Defer import so this module is rich-safe
|
311
322
|
# TODO(michael): The get_app_logs_loop function is itself rich-safe aside from accepting an OutputManager
|
312
323
|
# as an argument, so with some refactoring we could avoid the need for this deferred import.
|
@@ -20,9 +20,9 @@ modal/app.py,sha256=UOuqlCKlFAjOXCacXmoEMM90FnqFwPRXUhLh0Gi6xzg,45344
|
|
20
20
|
modal/app.pyi,sha256=5D3LkPP6qvTIl2_YgiyhNQ9X4VsOVuxd69a23UmohDg,25477
|
21
21
|
modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
|
22
22
|
modal/client.py,sha256=8SQawr7P1PNUCq1UmJMUQXG2jIo4Nmdcs311XqrNLRE,15276
|
23
|
-
modal/client.pyi,sha256=
|
24
|
-
modal/cloud_bucket_mount.py,sha256=
|
25
|
-
modal/cloud_bucket_mount.pyi,sha256=
|
23
|
+
modal/client.pyi,sha256=cnBbWcX5u74Ayif_XGR8dRx77KFQ5VpG2uBLYZ8UKlk,7326
|
24
|
+
modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
|
25
|
+
modal/cloud_bucket_mount.pyi,sha256=30T3K1a89l6wzmEJ_J9iWv9SknoGqaZDx59Xs-ZQcmk,1607
|
26
26
|
modal/cls.py,sha256=xHgZZAmymplw0I2YZGAA8raBboixdNKKTrnsxQZI7G8,32159
|
27
27
|
modal/cls.pyi,sha256=ImhmNPUD2zVjk7zOmEhFbdU0JQiC90B4Y9yV11bmRJs,8856
|
28
28
|
modal/config.py,sha256=BzhZYUUwOmvVwf6x5kf0ywMC257s648dmuhsnB6g3gk,11041
|
@@ -38,7 +38,7 @@ modal/file_io.py,sha256=lcMs_E9Xfm0YX1t9U2wNIBPnqHRxmImqjLW1GHqVmyg,20945
|
|
38
38
|
modal/file_io.pyi,sha256=NrIoB0YjIqZ8MDMe826xAnybT0ww_kxQM3iPLo82REU,8898
|
39
39
|
modal/file_pattern_matcher.py,sha256=dSo7BMQGZBAuoBFOX-e_72HxmF3FLzjQlEtnGtJiaD4,6506
|
40
40
|
modal/functions.py,sha256=IP-6oHMmt-wUJPBWJ7Y7Vw2vqk2bYFRSQmV38T2STTI,68371
|
41
|
-
modal/functions.pyi,sha256=
|
41
|
+
modal/functions.pyi,sha256=eoXG53WPMnHY7N8dblghdLEBQ47k8uiSSaCDP9LfNxA,25473
|
42
42
|
modal/gpu.py,sha256=MTxj6ql8EpgfBg8YmZ5a1cLznyuZFssX1qXbEX4LKVM,7503
|
43
43
|
modal/image.py,sha256=leeY7fLfFjS0IqTi3D4cRxIDOb80BPtb3jsQfqvVJ8c,90912
|
44
44
|
modal/image.pyi,sha256=X9vj6cwBdYh8q_2cOd-2RSYNMF49ujcy0lrOXh_v1xc,26049
|
@@ -61,7 +61,7 @@ modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
61
61
|
modal/queue.py,sha256=HPnyJuX-THDEl2ak-xqf2lxYJMiQw4e37y4vHz6FRCg,18557
|
62
62
|
modal/queue.pyi,sha256=JhJBSRerN0l3dK9f8Ut8uslgkJWnE8s4tGB8c4SAYe4,9840
|
63
63
|
modal/retries.py,sha256=HKR2Q9aNPWkMjQ5nwobqYTuZaSuw0a8lI2zrtY5IW98,5230
|
64
|
-
modal/runner.py,sha256=
|
64
|
+
modal/runner.py,sha256=0SCMgKO8lZ9W1C7le1EcgViKERMXpi_-QBd6PF_MH0Q,24450
|
65
65
|
modal/runner.pyi,sha256=YmP4EOCNjjkwSIPi2Gl6hF_ji_ytkxz9dw3iB9KXaOI,5275
|
66
66
|
modal/running_app.py,sha256=v61mapYNV1-O-Uaho5EfJlryMLvIT9We0amUOSvSGx8,1188
|
67
67
|
modal/sandbox.py,sha256=6Z-ull5wI5WDKG6v4JVw-6CHx4Y8cMmpzp9CU3uNrtA,28678
|
@@ -149,10 +149,10 @@ modal_global_objects/mounts/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0
|
|
149
149
|
modal_global_objects/mounts/modal_client_package.py,sha256=W0E_yShsRojPzWm6LtIQqNVolapdnrZkm2hVEQuZK_4,767
|
150
150
|
modal_global_objects/mounts/python_standalone.py,sha256=pEML5GaV2_0ahci_1vpfc_FnySpsfi2fhYmFF5I7IiQ,1837
|
151
151
|
modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
152
|
-
modal_proto/api.proto,sha256=
|
152
|
+
modal_proto/api.proto,sha256=rs7gMeYjXS73qzEmgnnzMNyWksh2E8Ju8Im1y9vwzmo,84260
|
153
153
|
modal_proto/api_grpc.py,sha256=Bcgo5hmJ0FCAVvWAm7X7Qki2GZ2gvAu3kOtqzRtvoMc,106793
|
154
|
-
modal_proto/api_pb2.py,sha256=
|
155
|
-
modal_proto/api_pb2.pyi,sha256=
|
154
|
+
modal_proto/api_pb2.py,sha256=NSukaVE5IPbBIYP_qkvILrD-qninKmbekqDK5I_IRp8,307200
|
155
|
+
modal_proto/api_pb2.pyi,sha256=b1Ya2TTdFOZMxhfiSAy4Y0ut6Y6kjf6N6mxHw9uiFV8,410686
|
156
156
|
modal_proto/api_pb2_grpc.py,sha256=OTPQgFBajKwy7fhAFEewDjY6lK49C60Z9vTqUpQy_oY,230822
|
157
157
|
modal_proto/api_pb2_grpc.pyi,sha256=mwP2mw6UE46CHlraqicXHsgyGPtV0mCy96LwnFMz74s,53787
|
158
158
|
modal_proto/modal_api_grpc.py,sha256=C5QcdsBWEvF9ufbEjdyPQ5IDDexMdAI2_CQ_U2nEYuc,14258
|
@@ -166,10 +166,10 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
|
|
166
166
|
modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
167
167
|
modal_version/__init__.py,sha256=kGya2ZlItX2zB7oHORs-wvP4PG8lg_mtbi1QIK3G6SQ,470
|
168
168
|
modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
|
169
|
-
modal_version/_version_generated.py,sha256
|
170
|
-
modal-0.72.
|
171
|
-
modal-0.72.
|
172
|
-
modal-0.72.
|
173
|
-
modal-0.72.
|
174
|
-
modal-0.72.
|
175
|
-
modal-0.72.
|
169
|
+
modal_version/_version_generated.py,sha256=-r4jFK4gt6akJGlNLN7Z8PAhIsFmB6pCOZfCQ179Xh4,149
|
170
|
+
modal-0.72.31.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
171
|
+
modal-0.72.31.dist-info/METADATA,sha256=Kcoa-WABVasN7VpLXWqmEyEef_h2n_ULb95qsQ3z8mY,2329
|
172
|
+
modal-0.72.31.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
173
|
+
modal-0.72.31.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
174
|
+
modal-0.72.31.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
|
175
|
+
modal-0.72.31.dist-info/RECORD,,
|
modal_proto/api.proto
CHANGED
@@ -717,6 +717,7 @@ message CloudBucketMount {
|
|
717
717
|
bool requester_pays = 6;
|
718
718
|
optional string bucket_endpoint_url = 7;
|
719
719
|
optional string key_prefix = 8;
|
720
|
+
optional string oidc_auth_role_arn = 9;
|
720
721
|
}
|
721
722
|
|
722
723
|
message ContainerArguments { // This is used to pass data from the worker to the container
|