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.
Files changed (103) hide show
  1. modal/_clustered_functions.py +2 -2
  2. modal/_clustered_functions.pyi +2 -2
  3. modal/_container_entrypoint.py +5 -4
  4. modal/_output.py +29 -28
  5. modal/_pty.py +2 -2
  6. modal/_resolver.py +6 -5
  7. modal/_resources.py +3 -3
  8. modal/_runtime/asgi.py +7 -6
  9. modal/_runtime/container_io_manager.py +22 -26
  10. modal/_runtime/execution_context.py +2 -2
  11. modal/_runtime/telemetry.py +1 -2
  12. modal/_runtime/user_code_imports.py +12 -14
  13. modal/_serialization.py +3 -7
  14. modal/_traceback.py +5 -5
  15. modal/_tunnel.py +4 -3
  16. modal/_tunnel.pyi +2 -2
  17. modal/_utils/async_utils.py +8 -15
  18. modal/_utils/blob_utils.py +4 -3
  19. modal/_utils/function_utils.py +14 -10
  20. modal/_utils/grpc_testing.py +7 -6
  21. modal/_utils/grpc_utils.py +2 -3
  22. modal/_utils/hash_utils.py +2 -2
  23. modal/_utils/mount_utils.py +5 -4
  24. modal/_utils/package_utils.py +2 -3
  25. modal/_utils/pattern_matcher.py +6 -6
  26. modal/_utils/rand_pb_testing.py +3 -3
  27. modal/_utils/shell_utils.py +2 -1
  28. modal/_vendor/a2wsgi_wsgi.py +62 -72
  29. modal/_vendor/cloudpickle.py +1 -1
  30. modal/_watcher.py +8 -7
  31. modal/app.py +29 -34
  32. modal/app.pyi +102 -97
  33. modal/call_graph.py +6 -6
  34. modal/cli/_download.py +3 -2
  35. modal/cli/_traceback.py +4 -4
  36. modal/cli/app.py +4 -4
  37. modal/cli/container.py +4 -4
  38. modal/cli/dict.py +1 -1
  39. modal/cli/environment.py +2 -3
  40. modal/cli/launch.py +2 -2
  41. modal/cli/network_file_system.py +1 -1
  42. modal/cli/profile.py +1 -1
  43. modal/cli/programs/run_jupyter.py +2 -2
  44. modal/cli/programs/vscode.py +3 -3
  45. modal/cli/queues.py +1 -1
  46. modal/cli/run.py +6 -6
  47. modal/cli/secret.py +3 -3
  48. modal/cli/utils.py +2 -1
  49. modal/cli/volume.py +3 -3
  50. modal/client.py +6 -11
  51. modal/client.pyi +18 -27
  52. modal/cloud_bucket_mount.py +3 -3
  53. modal/cloud_bucket_mount.pyi +2 -2
  54. modal/cls.py +30 -30
  55. modal/cls.pyi +35 -34
  56. modal/config.py +3 -2
  57. modal/dict.py +4 -3
  58. modal/dict.pyi +10 -9
  59. modal/environments.py +3 -3
  60. modal/environments.pyi +3 -3
  61. modal/exception.py +2 -3
  62. modal/functions.py +105 -35
  63. modal/functions.pyi +71 -48
  64. modal/image.py +45 -48
  65. modal/image.pyi +102 -101
  66. modal/io_streams.py +4 -7
  67. modal/io_streams.pyi +14 -13
  68. modal/mount.py +23 -22
  69. modal/mount.pyi +28 -29
  70. modal/network_file_system.py +7 -6
  71. modal/network_file_system.pyi +12 -11
  72. modal/object.py +9 -8
  73. modal/object.pyi +47 -34
  74. modal/output.py +2 -1
  75. modal/parallel_map.py +4 -4
  76. modal/partial_function.py +9 -13
  77. modal/partial_function.pyi +17 -18
  78. modal/queue.py +9 -8
  79. modal/queue.pyi +23 -22
  80. modal/retries.py +38 -0
  81. modal/runner.py +8 -7
  82. modal/runner.pyi +8 -14
  83. modal/running_app.py +3 -3
  84. modal/sandbox.py +14 -13
  85. modal/sandbox.pyi +67 -72
  86. modal/scheduler_placement.py +2 -1
  87. modal/secret.py +7 -7
  88. modal/secret.pyi +12 -12
  89. modal/serving.py +4 -3
  90. modal/serving.pyi +5 -4
  91. modal/token_flow.py +3 -2
  92. modal/token_flow.pyi +3 -3
  93. modal/volume.py +7 -12
  94. modal/volume.pyi +17 -16
  95. {modal-0.67.6.dist-info → modal-0.67.11.dist-info}/METADATA +1 -1
  96. modal-0.67.11.dist-info/RECORD +168 -0
  97. modal_docs/mdmd/signatures.py +1 -2
  98. modal_version/_version_generated.py +1 -1
  99. modal-0.67.6.dist-info/RECORD +0 -168
  100. {modal-0.67.6.dist-info → modal-0.67.11.dist-info}/LICENSE +0 -0
  101. {modal-0.67.6.dist-info → modal-0.67.11.dist-info}/WHEEL +0 -0
  102. {modal-0.67.6.dist-info → modal-0.67.11.dist-info}/entry_points.txt +0 -0
  103. {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 Dict, List, Optional, Union
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: 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: Dict[str, str] = {k: v for k, v in env_dict.items() if v is not None}
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: List[str], # list of local env vars to be included for remote execution
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: List[
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: List[str] = [],
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: Dict[str, str],
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: typing.Dict[str, typing.Optional[str]] = {}): ...
8
+ def from_dict(env_dict: dict[str, typing.Optional[str]] = {}): ...
9
9
  @staticmethod
10
- def from_local_environ(env_keys: typing.List[str]): ...
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: typing.List[str] = []
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: typing.List[str] = [],
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: typing.Dict[str, str],
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: typing.Dict[str, typing.Optional[str]] = {}): ...
38
+ def from_dict(env_dict: dict[str, typing.Optional[str]] = {}): ...
39
39
  @staticmethod
40
- def from_local_environ(env_keys: typing.List[str]): ...
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: typing.List[str] = []
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: typing.List[str] = [],
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: typing.List[str] = [],
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: typing.Dict[str, str],
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: typing.Dict[str, str],
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, AsyncGenerator, Optional, Set, TypeVar
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[Set[str], None],
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[Set[str], None]] = None, # for testing
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: typing.AsyncGenerator[typing.Set[str], None], environment_name: str
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[typing.AsyncGenerator[typing.Set[str], None]] = None,
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[typing.Set[str], None, None]] = None,
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[typing.AsyncGenerator[typing.Set[str], None]] = None,
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 typing import AsyncGenerator, Optional, Tuple
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[Tuple[str, str, str], None]:
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[typing.Tuple[str, str, str]]: ...
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[typing.Tuple[str, str, str]]: ...
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[typing.Tuple[str, str, str]]: ...
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: Type["_Volume"],
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) -> List[FileEntry]:
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 IOError(f"failed to write {len(response.data)} bytes to output. Wrote {n}.")
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 IOError(f"failed to write {len(response.data)} bytes to output. Wrote {n}.")
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: List[Generator[Callable[[], FileUploadSpec], None, None]]
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: List[api_pb2.MountFile] = []
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: typing.Type[_Volume],
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) -> typing.AsyncIterator[FileEntry]: ...
78
- async def listdir(self, path: str, *, recursive: bool = False) -> typing.List[FileEntry]: ...
79
- def read_file(self, path: str) -> typing.AsyncIterator[bytes]: ...
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: typing.Sequence[str], dst_path: str) -> None: ...
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: typing.List[
96
- typing.Generator[typing.Callable[[], modal._utils.blob_utils.FileUploadSpec], None, None]
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: typing.Type[Volume],
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) -> typing.AsyncIterator[FileEntry]: ...
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) -> typing.List[FileEntry]: ...
222
- async def aio(self, path: str, *, recursive: bool = False) -> typing.List[FileEntry]: ...
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) -> typing.AsyncIterator[bytes]: ...
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: typing.Sequence[str], dst_path: str) -> None: ...
246
- async def aio(self, src_paths: typing.Sequence[str], dst_path: str) -> None: ...
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: typing.List[
284
- typing.Generator[typing.Callable[[], modal._utils.blob_utils.FileUploadSpec], None, None]
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__(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: modal
3
- Version: 0.67.6
3
+ Version: 0.67.11
4
4
  Summary: Python client library for Modal
5
5
  Author: Modal Labs
6
6
  Author-email: support@modal.com
@@ -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,,
@@ -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) -> Tuple[str, str]:
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.
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2024
2
2
 
3
3
  # Note: Reset this value to -1 whenever you make a minor `0.X` release of the client.
4
- build_number = 6 # git: d4f8c25
4
+ build_number = 11 # git: d6fd2ae