modal 1.0.3.dev20__py3-none-any.whl → 1.0.3.dev21__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
@@ -31,7 +31,7 @@ class _Client:
31
31
  server_url: str,
32
32
  client_type: int,
33
33
  credentials: typing.Optional[tuple[str, str]],
34
- version: str = "1.0.3.dev20",
34
+ version: str = "1.0.3.dev21",
35
35
  ): ...
36
36
  def is_closed(self) -> bool: ...
37
37
  @property
@@ -94,7 +94,7 @@ class Client:
94
94
  server_url: str,
95
95
  client_type: int,
96
96
  credentials: typing.Optional[tuple[str, str]],
97
- version: str = "1.0.3.dev20",
97
+ version: str = "1.0.3.dev21",
98
98
  ): ...
99
99
  def is_closed(self) -> bool: ...
100
100
  @property
modal/functions.pyi CHANGED
@@ -227,11 +227,11 @@ class Function(
227
227
 
228
228
  _call_generator: ___call_generator_spec[typing_extensions.Self]
229
229
 
230
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
230
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
231
231
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
232
232
  async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
233
233
 
234
- remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
234
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
235
235
 
236
236
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
237
237
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
@@ -246,12 +246,12 @@ class Function(
246
246
  self, *args: modal._functions.P.args, **kwargs: modal._functions.P.kwargs
247
247
  ) -> modal._functions.OriginalReturnType: ...
248
248
 
249
- class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
249
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
250
250
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
251
251
  async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
252
252
 
253
253
  _experimental_spawn: ___experimental_spawn_spec[
254
- modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
254
+ modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
255
255
  ]
256
256
 
257
257
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
@@ -260,11 +260,11 @@ class Function(
260
260
 
261
261
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
262
262
 
263
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
263
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
264
264
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
265
265
  async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
266
266
 
267
- spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
267
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
268
268
 
269
269
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]: ...
270
270
 
modal/volume.py CHANGED
@@ -45,7 +45,6 @@ from ._utils.blob_utils import (
45
45
  BLOCK_SIZE,
46
46
  FileUploadSpec,
47
47
  FileUploadSpec2,
48
- blob_iter,
49
48
  blob_upload_file,
50
49
  get_file_upload_spec_from_fileobj,
51
50
  get_file_upload_spec_from_path,
@@ -400,7 +399,7 @@ class _Volume(_Object, type_prefix="vo"):
400
399
  return [entry async for entry in self.iterdir(path, recursive=recursive)]
401
400
 
402
401
  @live_method_gen
403
- def read_file(self, path: str) -> AsyncIterator[bytes]:
402
+ async def read_file(self, path: str) -> AsyncIterator[bytes]:
404
403
  """
405
404
  Read a file from the modal.Volume.
406
405
 
@@ -414,23 +413,6 @@ class _Volume(_Object, type_prefix="vo"):
414
413
  print(len(data)) # == 1024 * 1024
415
414
  ```
416
415
  """
417
- return self._read_file1(path) if self._is_v1 else self._read_file2(path)
418
-
419
- async def _read_file1(self, path: str) -> AsyncIterator[bytes]:
420
- req = api_pb2.VolumeGetFileRequest(volume_id=self.object_id, path=path)
421
- try:
422
- response = await retry_transient_errors(self._client.stub.VolumeGetFile, req)
423
- except GRPCError as exc:
424
- raise FileNotFoundError(exc.message) if exc.status == Status.NOT_FOUND else exc
425
- # TODO(Jonathon): use ranged requests.
426
- if response.WhichOneof("data_oneof") == "data":
427
- yield response.data
428
- return
429
- else:
430
- async for data in blob_iter(response.data_blob_id, self._client.stub):
431
- yield data
432
-
433
- async def _read_file2(self, path: str) -> AsyncIterator[bytes]:
434
416
  req = api_pb2.VolumeGetFile2Request(volume_id=self.object_id, path=path)
435
417
 
436
418
  try:
@@ -461,36 +443,9 @@ class _Volume(_Object, type_prefix="vo"):
461
443
  Read volume file into file-like IO object.
462
444
  """
463
445
  if progress_cb is None:
464
-
465
446
  def progress_cb(*_, **__):
466
447
  pass
467
448
 
468
- if self._is_v1:
469
- return await self._read_file_into_fileobj1(path, fileobj, progress_cb)
470
- else:
471
- return await self._read_file_into_fileobj2(path, fileobj, progress_cb)
472
-
473
- async def _read_file_into_fileobj1(
474
- self, path: str, fileobj: typing.IO[bytes], progress_cb: Callable[..., Any]
475
- ) -> int:
476
- num_bytes_written = 0
477
-
478
- async for chunk in self._read_file1(path):
479
- num_chunk_bytes_written = 0
480
-
481
- while num_chunk_bytes_written < len(chunk):
482
- # TODO(dflemstr): this is a small write, but nonetheless might block the event loop for some time:
483
- n = fileobj.write(chunk)
484
- num_chunk_bytes_written += n
485
- progress_cb(advance=n)
486
-
487
- num_bytes_written += len(chunk)
488
-
489
- return num_bytes_written
490
-
491
- async def _read_file_into_fileobj2(
492
- self, path: str, fileobj: typing.IO[bytes], progress_cb: Callable[..., Any]
493
- ) -> int:
494
449
  req = api_pb2.VolumeGetFile2Request(volume_id=self.object_id, path=path)
495
450
 
496
451
  try:
modal/volume.pyi CHANGED
@@ -87,20 +87,12 @@ class _Volume(modal._object._Object):
87
87
  def iterdir(self, path: str, *, recursive: bool = True) -> collections.abc.AsyncIterator[FileEntry]: ...
88
88
  async def listdir(self, path: str, *, recursive: bool = False) -> list[FileEntry]: ...
89
89
  def read_file(self, path: str) -> collections.abc.AsyncIterator[bytes]: ...
90
- def _read_file1(self, path: str) -> collections.abc.AsyncIterator[bytes]: ...
91
- def _read_file2(self, path: str) -> collections.abc.AsyncIterator[bytes]: ...
92
90
  async def read_file_into_fileobj(
93
91
  self,
94
92
  path: str,
95
93
  fileobj: typing.IO[bytes],
96
94
  progress_cb: typing.Optional[collections.abc.Callable[..., typing.Any]] = None,
97
95
  ) -> int: ...
98
- async def _read_file_into_fileobj1(
99
- self, path: str, fileobj: typing.IO[bytes], progress_cb: collections.abc.Callable[..., typing.Any]
100
- ) -> int: ...
101
- async def _read_file_into_fileobj2(
102
- self, path: str, fileobj: typing.IO[bytes], progress_cb: collections.abc.Callable[..., typing.Any]
103
- ) -> int: ...
104
96
  async def remove_file(self, path: str, recursive: bool = False) -> None: ...
105
97
  async def copy_files(self, src_paths: collections.abc.Sequence[str], dst_path: str) -> None: ...
106
98
  async def batch_upload(self, force: bool = False) -> _AbstractVolumeUploadContextManager: ...
@@ -236,18 +228,6 @@ class Volume(modal.object.Object):
236
228
 
237
229
  read_file: __read_file_spec[typing_extensions.Self]
238
230
 
239
- class ___read_file1_spec(typing_extensions.Protocol[SUPERSELF]):
240
- def __call__(self, /, path: str) -> typing.Iterator[bytes]: ...
241
- def aio(self, /, path: str) -> collections.abc.AsyncIterator[bytes]: ...
242
-
243
- _read_file1: ___read_file1_spec[typing_extensions.Self]
244
-
245
- class ___read_file2_spec(typing_extensions.Protocol[SUPERSELF]):
246
- def __call__(self, /, path: str) -> typing.Iterator[bytes]: ...
247
- def aio(self, /, path: str) -> collections.abc.AsyncIterator[bytes]: ...
248
-
249
- _read_file2: ___read_file2_spec[typing_extensions.Self]
250
-
251
231
  class __read_file_into_fileobj_spec(typing_extensions.Protocol[SUPERSELF]):
252
232
  def __call__(
253
233
  self,
@@ -266,26 +246,6 @@ class Volume(modal.object.Object):
266
246
 
267
247
  read_file_into_fileobj: __read_file_into_fileobj_spec[typing_extensions.Self]
268
248
 
269
- class ___read_file_into_fileobj1_spec(typing_extensions.Protocol[SUPERSELF]):
270
- def __call__(
271
- self, /, path: str, fileobj: typing.IO[bytes], progress_cb: collections.abc.Callable[..., typing.Any]
272
- ) -> int: ...
273
- async def aio(
274
- self, /, path: str, fileobj: typing.IO[bytes], progress_cb: collections.abc.Callable[..., typing.Any]
275
- ) -> int: ...
276
-
277
- _read_file_into_fileobj1: ___read_file_into_fileobj1_spec[typing_extensions.Self]
278
-
279
- class ___read_file_into_fileobj2_spec(typing_extensions.Protocol[SUPERSELF]):
280
- def __call__(
281
- self, /, path: str, fileobj: typing.IO[bytes], progress_cb: collections.abc.Callable[..., typing.Any]
282
- ) -> int: ...
283
- async def aio(
284
- self, /, path: str, fileobj: typing.IO[bytes], progress_cb: collections.abc.Callable[..., typing.Any]
285
- ) -> int: ...
286
-
287
- _read_file_into_fileobj2: ___read_file_into_fileobj2_spec[typing_extensions.Self]
288
-
289
249
  class __remove_file_spec(typing_extensions.Protocol[SUPERSELF]):
290
250
  def __call__(self, /, path: str, recursive: bool = False) -> None: ...
291
251
  async def aio(self, /, path: str, recursive: bool = False) -> None: ...
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.3.dev20
3
+ Version: 1.0.3.dev21
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -22,7 +22,7 @@ modal/app.py,sha256=NZ_rJ9TuMfiNiLg8-gOFgufD5flGtXWPHOZI0gdD3hE,46585
22
22
  modal/app.pyi,sha256=4-b_vbe3lNAqQPcMRpQCEDsE1zsVkQRJGUql9B7HvbM,22659
23
23
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
24
24
  modal/client.py,sha256=OwISJvkgMb-rHm9Gc4i-7YcDgGiZgwJ7F_PzwZH7a6Q,16847
25
- modal/client.pyi,sha256=siMJzDUmt9CfXtMGwCg6HX-F1uUC7kp5NQ1VrN-s6KQ,8459
25
+ modal/client.pyi,sha256=GbNOpyFFHcxT1yGfCbHYRCgGOkPIBEbeqrNijsaM0Yg,8459
26
26
  modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
27
27
  modal/cloud_bucket_mount.pyi,sha256=30T3K1a89l6wzmEJ_J9iWv9SknoGqaZDx59Xs-ZQcmk,1607
28
28
  modal/cls.py,sha256=dBbeARwOWftlKd1cwtM0cHFtQWSWkwVXwVmOV4w0SyI,37907
@@ -39,7 +39,7 @@ modal/file_io.py,sha256=lcMs_E9Xfm0YX1t9U2wNIBPnqHRxmImqjLW1GHqVmyg,20945
39
39
  modal/file_io.pyi,sha256=oB7x-rKq7bmm8cA7Z7W9C9yeko7KK9m9i5GidFnkGK4,9569
40
40
  modal/file_pattern_matcher.py,sha256=wov-otB5M1oTdrYDtR2_VgacYin2srdtAP4McA1Cqzw,6516
41
41
  modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
42
- modal/functions.pyi,sha256=5T58OucdNU4I-LqhBdwsWSAGka-Wa8nP2GcZ5K1bOL0,16236
42
+ modal/functions.pyi,sha256=iqdp5ixtOOlm8bF-QYbD_G8VKqSRt_AVLT7AWjpn6pQ,16236
43
43
  modal/gpu.py,sha256=Kbhs_u49FaC2Zi0TjCdrpstpRtT5eZgecynmQi5IZVE,6752
44
44
  modal/image.py,sha256=yrI9DCw7GAck3d788GCHJom-_yU55zNu7reNapBhlgE,93284
45
45
  modal/image.pyi,sha256=2xjB6XOZDtm_chDdd90UoIj8pnDt5hCg6bOmu5fNaA4,25625
@@ -78,8 +78,8 @@ modal/snapshot.pyi,sha256=dIEBdTPb7O3VwkQ8TMPjfyU17RLuS9i0DnACxxHy8X4,676
78
78
  modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
79
79
  modal/token_flow.py,sha256=0_4KabXKsuE4OXTJ1OuLOtA-b1sesShztMZkkRFK7tA,7605
80
80
  modal/token_flow.pyi,sha256=ILbRv6JsZq-jK8jcJM7eB74e0PsbzwBm7hyPcV9lBlQ,2121
81
- modal/volume.py,sha256=G7F8G4V72t59MGocex0afRlJgUTQjRHxjQBVf5Vbbm0,44386
82
- modal/volume.pyi,sha256=YZqC3-z4bfiTgb1-uO7XylrONvIsHQUZd9pqW_Wxd48,21145
81
+ modal/volume.py,sha256=ppRPv9ksA14Io-GQ2bp7Bb_5WpgfRZxoF0rIB_Q-ysU,42591
82
+ modal/volume.pyi,sha256=--W8B0-chlhmpfQPoKYa2-goSnyTEBwZVhG0ybMBRpE,19109
83
83
  modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
84
84
  modal/_runtime/asgi.py,sha256=_2xSTsDD27Cit7xnMs4lzkJA2wzer2_N4Oa3BkXFzVA,22521
85
85
  modal/_runtime/container_io_manager.py,sha256=qKYtd52I0JAmiw1Wfy_EQXHuHsbmt-XwLqKDLBhWrZc,44289
@@ -147,7 +147,7 @@ modal/requirements/2024.10.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddR
147
147
  modal/requirements/PREVIEW.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddRo,296
148
148
  modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
149
149
  modal/requirements/base-images.json,sha256=57vMSqzMbLBxw5tFWSaMiIkkVEps4JfX5PAtXGnkS4U,740
150
- modal-1.0.3.dev20.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
150
+ modal-1.0.3.dev21.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
151
151
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
152
152
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
153
153
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -170,10 +170,10 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
170
170
  modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
171
171
  modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
172
172
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
173
- modal_version/__init__.py,sha256=73y_4UF_pxZ_ZWHg5pl6bE47M0Kgv4KRVkIKeDn_8LQ,121
173
+ modal_version/__init__.py,sha256=8IsYshRrXfxpnnr3RAYLP6fh9v3mAo3JR2Q9FXuT5vs,121
174
174
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
175
- modal-1.0.3.dev20.dist-info/METADATA,sha256=XOKQxvbi5bEtrtcfg4ZLQNi38ZxjpE32-UMgvAmSaCc,2455
176
- modal-1.0.3.dev20.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
177
- modal-1.0.3.dev20.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
178
- modal-1.0.3.dev20.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
179
- modal-1.0.3.dev20.dist-info/RECORD,,
175
+ modal-1.0.3.dev21.dist-info/METADATA,sha256=hyiyNUy3gBOWCAm_W_nC_QrS_lLv4X1zDTN6kxOOp-s,2455
176
+ modal-1.0.3.dev21.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
177
+ modal-1.0.3.dev21.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
178
+ modal-1.0.3.dev21.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
179
+ modal-1.0.3.dev21.dist-info/RECORD,,
modal_version/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.0.3.dev20"
4
+ __version__ = "1.0.3.dev21"