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 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.29"
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.29"
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
@@ -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
 
@@ -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[ReturnType_INNER, P_INNER]):
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[ReturnType, P]
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[ReturnType_INNER, P_INNER]):
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[ReturnType, P]
487
+ _experimental_spawn: ___experimental_spawn_spec[P, ReturnType]
488
488
 
489
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
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[ReturnType, P]
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 := _get_output_manager():
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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: modal
3
- Version: 0.72.29
3
+ Version: 0.72.31
4
4
  Summary: Python client library for Modal
5
5
  Author: Modal Labs
6
6
  Author-email: support@modal.com
@@ -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=sHhgC3tLrltFiFGK-hkQZjG3Nbd6kHnj8yXSXIkAtxQ,7326
24
- modal/cloud_bucket_mount.py,sha256=G7T7jWLD0QkmrfKR75mSTwdUZ2xNfj7pkVqb4ipmxmI,5735
25
- modal/cloud_bucket_mount.pyi,sha256=CEi7vrH3kDUF4LAy4qP6tfImy2UJuFRcRbsgRNM1wo8,1403
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=EcGd1uGnJVbnMmdsnANYeDjLzjaL8BREG3XgxaDPcvM,25473
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=naErUpZ9_slIscuOByD25xs0gVmSYdV_FZzaCqrD78E,24105
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=2x3bjUqfJ9GX1rpUjRq-1LLs-ATB-mWRpSsHIu-tnqQ,84218
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=TvykMt4Cc1srY4sqFLCoUq8sTiyMiDGuPCLUU5dJ0Gk,307105
155
- modal_proto/api_pb2.pyi,sha256=L5IZqHkI4cnHx6Xz4DLwjxgRSsIH4k2TH5rYRhSMuXI,410164
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=JFnduO4cvKKg42T8zHK4LjUtutzfXi-VZ7991muj2-8,149
170
- modal-0.72.29.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
171
- modal-0.72.29.dist-info/METADATA,sha256=gsXsJbFWn2vvYFGLmWJ22XtkBiGafShUwUAnnM2azjo,2329
172
- modal-0.72.29.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
173
- modal-0.72.29.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
174
- modal-0.72.29.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
175
- modal-0.72.29.dist-info/RECORD,,
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