modal 0.62.115__py3-none-any.whl → 0.72.13__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 (220) hide show
  1. modal/__init__.py +13 -9
  2. modal/__main__.py +41 -3
  3. modal/_clustered_functions.py +80 -0
  4. modal/_clustered_functions.pyi +22 -0
  5. modal/_container_entrypoint.py +402 -398
  6. modal/_ipython.py +3 -13
  7. modal/_location.py +17 -10
  8. modal/_output.py +243 -99
  9. modal/_pty.py +2 -2
  10. modal/_resolver.py +55 -60
  11. modal/_resources.py +26 -7
  12. modal/_runtime/__init__.py +1 -0
  13. modal/_runtime/asgi.py +519 -0
  14. modal/_runtime/container_io_manager.py +1025 -0
  15. modal/{execution_context.py → _runtime/execution_context.py} +11 -2
  16. modal/_runtime/telemetry.py +169 -0
  17. modal/_runtime/user_code_imports.py +356 -0
  18. modal/_serialization.py +123 -6
  19. modal/_traceback.py +47 -187
  20. modal/_tunnel.py +50 -14
  21. modal/_tunnel.pyi +19 -36
  22. modal/_utils/app_utils.py +3 -17
  23. modal/_utils/async_utils.py +386 -104
  24. modal/_utils/blob_utils.py +157 -186
  25. modal/_utils/bytes_io_segment_payload.py +97 -0
  26. modal/_utils/deprecation.py +89 -0
  27. modal/_utils/docker_utils.py +98 -0
  28. modal/_utils/function_utils.py +299 -98
  29. modal/_utils/grpc_testing.py +47 -34
  30. modal/_utils/grpc_utils.py +54 -21
  31. modal/_utils/hash_utils.py +51 -10
  32. modal/_utils/http_utils.py +39 -9
  33. modal/_utils/logger.py +2 -1
  34. modal/_utils/mount_utils.py +34 -16
  35. modal/_utils/name_utils.py +58 -0
  36. modal/_utils/package_utils.py +14 -1
  37. modal/_utils/pattern_utils.py +205 -0
  38. modal/_utils/rand_pb_testing.py +3 -3
  39. modal/_utils/shell_utils.py +15 -49
  40. modal/_vendor/a2wsgi_wsgi.py +62 -72
  41. modal/_vendor/cloudpickle.py +1 -1
  42. modal/_watcher.py +12 -10
  43. modal/app.py +561 -323
  44. modal/app.pyi +474 -262
  45. modal/call_graph.py +7 -6
  46. modal/cli/_download.py +22 -6
  47. modal/cli/_traceback.py +200 -0
  48. modal/cli/app.py +203 -42
  49. modal/cli/config.py +12 -5
  50. modal/cli/container.py +61 -13
  51. modal/cli/dict.py +128 -0
  52. modal/cli/entry_point.py +26 -13
  53. modal/cli/environment.py +40 -9
  54. modal/cli/import_refs.py +21 -48
  55. modal/cli/launch.py +28 -14
  56. modal/cli/network_file_system.py +57 -21
  57. modal/cli/profile.py +1 -1
  58. modal/cli/programs/run_jupyter.py +34 -9
  59. modal/cli/programs/vscode.py +58 -8
  60. modal/cli/queues.py +131 -0
  61. modal/cli/run.py +199 -96
  62. modal/cli/secret.py +5 -4
  63. modal/cli/token.py +7 -2
  64. modal/cli/utils.py +74 -8
  65. modal/cli/volume.py +97 -56
  66. modal/client.py +248 -144
  67. modal/client.pyi +156 -124
  68. modal/cloud_bucket_mount.py +43 -30
  69. modal/cloud_bucket_mount.pyi +32 -25
  70. modal/cls.py +528 -141
  71. modal/cls.pyi +189 -145
  72. modal/config.py +32 -15
  73. modal/container_process.py +177 -0
  74. modal/container_process.pyi +82 -0
  75. modal/dict.py +50 -54
  76. modal/dict.pyi +120 -164
  77. modal/environments.py +106 -5
  78. modal/environments.pyi +77 -25
  79. modal/exception.py +30 -43
  80. modal/experimental.py +62 -2
  81. modal/file_io.py +537 -0
  82. modal/file_io.pyi +235 -0
  83. modal/file_pattern_matcher.py +196 -0
  84. modal/functions.py +846 -428
  85. modal/functions.pyi +446 -387
  86. modal/gpu.py +57 -44
  87. modal/image.py +943 -417
  88. modal/image.pyi +584 -245
  89. modal/io_streams.py +434 -0
  90. modal/io_streams.pyi +122 -0
  91. modal/mount.py +223 -90
  92. modal/mount.pyi +241 -243
  93. modal/network_file_system.py +85 -86
  94. modal/network_file_system.pyi +151 -110
  95. modal/object.py +66 -36
  96. modal/object.pyi +166 -143
  97. modal/output.py +63 -0
  98. modal/parallel_map.py +73 -47
  99. modal/parallel_map.pyi +51 -63
  100. modal/partial_function.py +272 -107
  101. modal/partial_function.pyi +219 -120
  102. modal/proxy.py +15 -12
  103. modal/proxy.pyi +3 -8
  104. modal/queue.py +96 -72
  105. modal/queue.pyi +210 -135
  106. modal/requirements/2024.04.txt +2 -1
  107. modal/requirements/2024.10.txt +16 -0
  108. modal/requirements/README.md +21 -0
  109. modal/requirements/base-images.json +22 -0
  110. modal/retries.py +45 -4
  111. modal/runner.py +325 -203
  112. modal/runner.pyi +124 -110
  113. modal/running_app.py +27 -4
  114. modal/sandbox.py +509 -231
  115. modal/sandbox.pyi +396 -169
  116. modal/schedule.py +2 -2
  117. modal/scheduler_placement.py +20 -3
  118. modal/secret.py +41 -25
  119. modal/secret.pyi +62 -42
  120. modal/serving.py +39 -49
  121. modal/serving.pyi +37 -43
  122. modal/stream_type.py +15 -0
  123. modal/token_flow.py +5 -3
  124. modal/token_flow.pyi +37 -32
  125. modal/volume.py +123 -137
  126. modal/volume.pyi +228 -221
  127. {modal-0.62.115.dist-info → modal-0.72.13.dist-info}/METADATA +5 -5
  128. modal-0.72.13.dist-info/RECORD +174 -0
  129. {modal-0.62.115.dist-info → modal-0.72.13.dist-info}/top_level.txt +0 -1
  130. modal_docs/gen_reference_docs.py +3 -1
  131. modal_docs/mdmd/mdmd.py +0 -1
  132. modal_docs/mdmd/signatures.py +1 -2
  133. modal_global_objects/images/base_images.py +28 -0
  134. modal_global_objects/mounts/python_standalone.py +2 -2
  135. modal_proto/__init__.py +1 -1
  136. modal_proto/api.proto +1231 -531
  137. modal_proto/api_grpc.py +750 -430
  138. modal_proto/api_pb2.py +2102 -1176
  139. modal_proto/api_pb2.pyi +8859 -0
  140. modal_proto/api_pb2_grpc.py +1329 -675
  141. modal_proto/api_pb2_grpc.pyi +1416 -0
  142. modal_proto/modal_api_grpc.py +149 -0
  143. modal_proto/modal_options_grpc.py +3 -0
  144. modal_proto/options_pb2.pyi +20 -0
  145. modal_proto/options_pb2_grpc.pyi +7 -0
  146. modal_proto/py.typed +0 -0
  147. modal_version/__init__.py +1 -1
  148. modal_version/_version_generated.py +2 -2
  149. modal/_asgi.py +0 -370
  150. modal/_container_exec.py +0 -128
  151. modal/_container_io_manager.py +0 -646
  152. modal/_container_io_manager.pyi +0 -412
  153. modal/_sandbox_shell.py +0 -49
  154. modal/app_utils.py +0 -20
  155. modal/app_utils.pyi +0 -17
  156. modal/execution_context.pyi +0 -37
  157. modal/shared_volume.py +0 -23
  158. modal/shared_volume.pyi +0 -24
  159. modal-0.62.115.dist-info/RECORD +0 -207
  160. modal_global_objects/images/conda.py +0 -15
  161. modal_global_objects/images/debian_slim.py +0 -15
  162. modal_global_objects/images/micromamba.py +0 -15
  163. test/__init__.py +0 -1
  164. test/aio_test.py +0 -12
  165. test/async_utils_test.py +0 -279
  166. test/blob_test.py +0 -67
  167. test/cli_imports_test.py +0 -149
  168. test/cli_test.py +0 -674
  169. test/client_test.py +0 -203
  170. test/cloud_bucket_mount_test.py +0 -22
  171. test/cls_test.py +0 -636
  172. test/config_test.py +0 -149
  173. test/conftest.py +0 -1485
  174. test/container_app_test.py +0 -50
  175. test/container_test.py +0 -1405
  176. test/cpu_test.py +0 -23
  177. test/decorator_test.py +0 -85
  178. test/deprecation_test.py +0 -34
  179. test/dict_test.py +0 -51
  180. test/e2e_test.py +0 -68
  181. test/error_test.py +0 -7
  182. test/function_serialization_test.py +0 -32
  183. test/function_test.py +0 -791
  184. test/function_utils_test.py +0 -101
  185. test/gpu_test.py +0 -159
  186. test/grpc_utils_test.py +0 -82
  187. test/helpers.py +0 -47
  188. test/image_test.py +0 -814
  189. test/live_reload_test.py +0 -80
  190. test/lookup_test.py +0 -70
  191. test/mdmd_test.py +0 -329
  192. test/mount_test.py +0 -162
  193. test/mounted_files_test.py +0 -327
  194. test/network_file_system_test.py +0 -188
  195. test/notebook_test.py +0 -66
  196. test/object_test.py +0 -41
  197. test/package_utils_test.py +0 -25
  198. test/queue_test.py +0 -115
  199. test/resolver_test.py +0 -59
  200. test/retries_test.py +0 -67
  201. test/runner_test.py +0 -85
  202. test/sandbox_test.py +0 -191
  203. test/schedule_test.py +0 -15
  204. test/scheduler_placement_test.py +0 -57
  205. test/secret_test.py +0 -89
  206. test/serialization_test.py +0 -50
  207. test/stub_composition_test.py +0 -10
  208. test/stub_test.py +0 -361
  209. test/test_asgi_wrapper.py +0 -234
  210. test/token_flow_test.py +0 -18
  211. test/traceback_test.py +0 -135
  212. test/tunnel_test.py +0 -29
  213. test/utils_test.py +0 -88
  214. test/version_test.py +0 -14
  215. test/volume_test.py +0 -397
  216. test/watcher_test.py +0 -58
  217. test/webhook_test.py +0 -145
  218. {modal-0.62.115.dist-info → modal-0.72.13.dist-info}/LICENSE +0 -0
  219. {modal-0.62.115.dist-info → modal-0.72.13.dist-info}/WHEEL +0 -0
  220. {modal-0.62.115.dist-info → modal-0.72.13.dist-info}/entry_points.txt +0 -0
modal/mount.pyi CHANGED
@@ -1,3 +1,4 @@
1
+ import collections.abc
1
2
  import google.protobuf.message
2
3
  import modal._resolver
3
4
  import modal._utils.blob_utils
@@ -8,305 +9,302 @@ import pathlib
8
9
  import typing
9
10
  import typing_extensions
10
11
 
11
- def client_mount_name() -> str:
12
- ...
13
-
14
-
15
- def python_standalone_mount_name(version: str) -> str:
16
- ...
17
-
12
+ def client_mount_name() -> str: ...
13
+ def python_standalone_mount_name(version: str) -> str: ...
18
14
 
19
15
  class _MountEntry:
20
- def description(self) -> str:
21
- ...
22
-
23
- def get_files_to_upload(self) -> typing.Iterator[typing.Tuple[pathlib.Path, str]]:
24
- ...
25
-
26
- def watch_entry(self) -> typing.Tuple[pathlib.Path, pathlib.Path]:
27
- ...
28
-
29
- def top_level_paths(self) -> typing.List[typing.Tuple[pathlib.Path, pathlib.PurePosixPath]]:
30
- ...
31
-
32
-
33
- def _select_files(entries: typing.List[_MountEntry]) -> typing.List[typing.Tuple[pathlib.Path, pathlib.PurePosixPath]]:
34
- ...
16
+ def description(self) -> str: ...
17
+ def get_files_to_upload(self) -> typing.Iterator[tuple[pathlib.Path, str]]: ...
18
+ def watch_entry(self) -> tuple[pathlib.Path, pathlib.Path]: ...
19
+ def top_level_paths(self) -> list[tuple[pathlib.Path, pathlib.PurePosixPath]]: ...
35
20
 
21
+ def _select_files(entries: list[_MountEntry]) -> list[tuple[pathlib.Path, pathlib.PurePosixPath]]: ...
36
22
 
37
23
  class _MountFile(_MountEntry):
38
24
  local_file: pathlib.Path
39
25
  remote_path: pathlib.PurePosixPath
40
26
 
41
- def description(self) -> str:
42
- ...
43
-
44
- def get_files_to_upload(self):
45
- ...
46
-
47
- def watch_entry(self):
48
- ...
49
-
50
- def top_level_paths(self) -> typing.List[typing.Tuple[pathlib.Path, pathlib.PurePosixPath]]:
51
- ...
52
-
53
- def __init__(self, local_file: pathlib.Path, remote_path: pathlib.PurePosixPath) -> None:
54
- ...
55
-
56
- def __repr__(self):
57
- ...
58
-
59
- def __eq__(self, other):
60
- ...
61
-
27
+ def description(self) -> str: ...
28
+ def get_files_to_upload(self): ...
29
+ def watch_entry(self): ...
30
+ def top_level_paths(self) -> list[tuple[pathlib.Path, pathlib.PurePosixPath]]: ...
31
+ def __init__(self, local_file: pathlib.Path, remote_path: pathlib.PurePosixPath) -> None: ...
32
+ def __repr__(self): ...
33
+ def __eq__(self, other): ...
62
34
 
63
35
  class _MountDir(_MountEntry):
64
36
  local_dir: pathlib.Path
65
37
  remote_path: pathlib.PurePosixPath
66
- condition: typing.Callable[[str], bool]
38
+ ignore: typing.Callable[[pathlib.Path], bool]
67
39
  recursive: bool
68
40
 
69
- def description(self):
70
- ...
71
-
72
- def get_files_to_upload(self):
73
- ...
74
-
75
- def watch_entry(self):
76
- ...
77
-
78
- def top_level_paths(self) -> typing.List[typing.Tuple[pathlib.Path, pathlib.PurePosixPath]]:
79
- ...
80
-
81
- def __init__(self, local_dir: pathlib.Path, remote_path: pathlib.PurePosixPath, condition: typing.Callable[[str], bool], recursive: bool) -> None:
82
- ...
83
-
84
- def __repr__(self):
85
- ...
86
-
87
- def __eq__(self, other):
88
- ...
89
-
90
-
91
- def module_mount_condition(f: str):
92
- ...
93
-
41
+ def description(self): ...
42
+ def get_files_to_upload(self): ...
43
+ def watch_entry(self): ...
44
+ def top_level_paths(self) -> list[tuple[pathlib.Path, pathlib.PurePosixPath]]: ...
45
+ def __init__(
46
+ self,
47
+ local_dir: pathlib.Path,
48
+ remote_path: pathlib.PurePosixPath,
49
+ ignore: typing.Callable[[pathlib.Path], bool],
50
+ recursive: bool,
51
+ ) -> None: ...
52
+ def __repr__(self): ...
53
+ def __eq__(self, other): ...
54
+
55
+ def module_mount_condition(module_base: pathlib.Path): ...
56
+ def module_mount_ignore_condition(module_base: pathlib.Path): ...
94
57
 
95
58
  class _MountedPythonModule(_MountEntry):
96
59
  module_name: str
97
60
  remote_dir: typing.Union[pathlib.PurePosixPath, str]
98
- condition: typing.Union[typing.Callable[[str], bool], None]
99
-
100
- def description(self) -> str:
101
- ...
102
-
103
- def _proxy_entries(self) -> typing.List[_MountEntry]:
104
- ...
105
-
106
- def get_files_to_upload(self) -> typing.Iterator[typing.Tuple[pathlib.Path, str]]:
107
- ...
108
-
109
- def watch_entry(self) -> typing.Tuple[pathlib.Path, pathlib.Path]:
110
- ...
111
-
112
- def top_level_paths(self) -> typing.List[typing.Tuple[pathlib.Path, pathlib.PurePosixPath]]:
113
- ...
114
-
115
- def __init__(self, module_name: str, remote_dir: typing.Union[pathlib.PurePosixPath, str] = '/root', condition: typing.Union[typing.Callable[[str], bool], None] = None) -> None:
116
- ...
117
-
118
- def __repr__(self):
119
- ...
120
-
121
- def __eq__(self, other):
122
- ...
123
-
124
-
125
- class NonLocalMountError(Exception):
126
- ...
61
+ ignore: typing.Optional[typing.Callable[[pathlib.Path], bool]]
62
+
63
+ def description(self) -> str: ...
64
+ def _proxy_entries(self) -> list[_MountEntry]: ...
65
+ def get_files_to_upload(self) -> typing.Iterator[tuple[pathlib.Path, str]]: ...
66
+ def watch_entry(self) -> tuple[pathlib.Path, pathlib.Path]: ...
67
+ def top_level_paths(self) -> list[tuple[pathlib.Path, pathlib.PurePosixPath]]: ...
68
+ def __init__(
69
+ self,
70
+ module_name: str,
71
+ remote_dir: typing.Union[pathlib.PurePosixPath, str] = "/root",
72
+ ignore: typing.Optional[typing.Callable[[pathlib.Path], bool]] = None,
73
+ ) -> None: ...
74
+ def __repr__(self): ...
75
+ def __eq__(self, other): ...
76
+
77
+ class NonLocalMountError(Exception): ...
127
78
 
128
79
  class _Mount(modal.object._Object):
129
- _entries: typing.Union[typing.List[_MountEntry], None]
130
- _deployment_name: typing.Union[str, None]
131
- _namespace: typing.Union[int, None]
132
- _environment_name: typing.Union[str, None]
133
- _content_checksum_sha256_hex: typing.Union[str, None]
80
+ _entries: typing.Optional[list[_MountEntry]]
81
+ _deployment_name: typing.Optional[str]
82
+ _namespace: typing.Optional[int]
83
+ _environment_name: typing.Optional[str]
84
+ _content_checksum_sha256_hex: typing.Optional[str]
134
85
 
135
86
  @staticmethod
136
- def _new(entries: typing.List[_MountEntry] = []) -> _Mount:
137
- ...
138
-
139
- def _extend(self, entry: _MountEntry) -> _Mount:
140
- ...
141
-
87
+ def _new(entries: list[_MountEntry] = []) -> _Mount: ...
88
+ def _extend(self, entry: _MountEntry) -> _Mount: ...
142
89
  @property
143
- def entries(self):
144
- ...
145
-
146
- def _hydrate_metadata(self, handle_metadata: typing.Union[google.protobuf.message.Message, None]):
147
- ...
148
-
149
- def _top_level_paths(self) -> typing.List[typing.Tuple[pathlib.Path, pathlib.PurePosixPath]]:
150
- ...
151
-
152
- def is_local(self) -> bool:
153
- ...
154
-
155
- def add_local_dir(self, local_path: typing.Union[str, pathlib.Path], *, remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None, condition: typing.Union[typing.Callable[[str], bool], None] = None, recursive: bool = True) -> _Mount:
156
- ...
157
-
90
+ def entries(self): ...
91
+ def _hydrate_metadata(self, handle_metadata: typing.Optional[google.protobuf.message.Message]): ...
92
+ def _top_level_paths(self) -> list[tuple[pathlib.Path, pathlib.PurePosixPath]]: ...
93
+ def is_local(self) -> bool: ...
158
94
  @staticmethod
159
- def from_local_dir(local_path: typing.Union[str, pathlib.Path], *, remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None, condition: typing.Union[typing.Callable[[str], bool], None] = None, recursive: bool = True) -> _Mount:
160
- ...
161
-
162
- def add_local_file(self, local_path: typing.Union[str, pathlib.Path], remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None) -> _Mount:
163
- ...
164
-
95
+ def _add_local_dir(
96
+ local_path: pathlib.Path,
97
+ remote_path: pathlib.PurePosixPath,
98
+ ignore: typing.Callable[[pathlib.Path], bool] = modal.file_pattern_matcher._NOTHING,
99
+ ): ...
100
+ def add_local_dir(
101
+ self,
102
+ local_path: typing.Union[str, pathlib.Path],
103
+ *,
104
+ remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None,
105
+ condition: typing.Optional[typing.Callable[[str], bool]] = None,
106
+ recursive: bool = True,
107
+ ) -> _Mount: ...
165
108
  @staticmethod
166
- def from_local_file(local_path: typing.Union[str, pathlib.Path], remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None) -> _Mount:
167
- ...
168
-
109
+ def from_local_dir(
110
+ local_path: typing.Union[str, pathlib.Path],
111
+ *,
112
+ remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None,
113
+ condition: typing.Optional[typing.Callable[[str], bool]] = None,
114
+ recursive: bool = True,
115
+ ) -> _Mount: ...
169
116
  @staticmethod
170
- def _description(entries: typing.List[_MountEntry]) -> str:
171
- ...
172
-
117
+ def _from_local_dir(
118
+ local_path: typing.Union[str, pathlib.Path],
119
+ *,
120
+ remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None,
121
+ condition: typing.Optional[typing.Callable[[str], bool]] = None,
122
+ recursive: bool = True,
123
+ ) -> _Mount: ...
124
+ def add_local_file(
125
+ self,
126
+ local_path: typing.Union[str, pathlib.Path],
127
+ remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None,
128
+ ) -> _Mount: ...
173
129
  @staticmethod
174
- def _get_files(entries: typing.List[_MountEntry]) -> typing.AsyncGenerator[modal._utils.blob_utils.FileUploadSpec, None]:
175
- ...
176
-
177
- async def _load_mount(self: _Mount, resolver: modal._resolver.Resolver, existing_object_id: typing.Union[str, None]):
178
- ...
179
-
130
+ def from_local_file(
131
+ local_path: typing.Union[str, pathlib.Path], remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None
132
+ ) -> _Mount: ...
180
133
  @staticmethod
181
- def from_local_python_packages(*module_names: str, remote_dir: typing.Union[str, pathlib.PurePosixPath] = '/root', condition: typing.Union[typing.Callable[[str], bool], None] = None) -> _Mount:
182
- ...
183
-
134
+ def _from_local_file(
135
+ local_path: typing.Union[str, pathlib.Path], remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None
136
+ ) -> _Mount: ...
184
137
  @staticmethod
185
- def from_name(label: str, namespace=1, environment_name: typing.Union[str, None] = None) -> _Mount:
186
- ...
187
-
138
+ def _description(entries: list[_MountEntry]) -> str: ...
139
+ @staticmethod
140
+ def _get_files(
141
+ entries: list[_MountEntry],
142
+ ) -> collections.abc.AsyncGenerator[modal._utils.blob_utils.FileUploadSpec, None]: ...
143
+ async def _load_mount(
144
+ self: _Mount, resolver: modal._resolver.Resolver, existing_object_id: typing.Optional[str]
145
+ ): ...
146
+ @staticmethod
147
+ def from_local_python_packages(
148
+ *module_names: str,
149
+ remote_dir: typing.Union[str, pathlib.PurePosixPath] = "/root",
150
+ condition: typing.Optional[typing.Callable[[str], bool]] = None,
151
+ ignore: typing.Union[typing.Sequence[str], typing.Callable[[pathlib.Path], bool], None] = None,
152
+ ) -> _Mount: ...
153
+ @staticmethod
154
+ def _from_local_python_packages(
155
+ *module_names: str,
156
+ remote_dir: typing.Union[str, pathlib.PurePosixPath] = "/root",
157
+ condition: typing.Optional[typing.Callable[[str], bool]] = None,
158
+ ignore: typing.Union[typing.Sequence[str], typing.Callable[[pathlib.Path], bool], None] = None,
159
+ ) -> _Mount: ...
160
+ @staticmethod
161
+ def from_name(name: str, namespace=1, environment_name: typing.Optional[str] = None) -> _Mount: ...
188
162
  @classmethod
189
- async def lookup(cls: typing.Type[_Mount], label: str, namespace=1, client: typing.Union[modal.client._Client, None] = None, environment_name: typing.Union[str, None] = None) -> _Mount:
190
- ...
191
-
192
- async def _deploy(self: _Mount, deployment_name: typing.Union[str, None] = None, namespace=1, environment_name: typing.Union[str, None] = None, client: typing.Union[modal.client._Client, None] = None) -> _Mount:
193
- ...
194
-
195
- def _get_metadata(self) -> modal_proto.api_pb2.MountHandleMetadata:
196
- ...
197
-
163
+ async def lookup(
164
+ cls: type[_Mount],
165
+ name: str,
166
+ namespace=1,
167
+ client: typing.Optional[modal.client._Client] = None,
168
+ environment_name: typing.Optional[str] = None,
169
+ ) -> _Mount: ...
170
+ async def _deploy(
171
+ self: _Mount,
172
+ deployment_name: typing.Optional[str] = None,
173
+ namespace=1,
174
+ environment_name: typing.Optional[str] = None,
175
+ client: typing.Optional[modal.client._Client] = None,
176
+ ) -> None: ...
177
+ def _get_metadata(self) -> modal_proto.api_pb2.MountHandleMetadata: ...
198
178
 
199
179
  class Mount(modal.object.Object):
200
- _entries: typing.Union[typing.List[_MountEntry], None]
201
- _deployment_name: typing.Union[str, None]
202
- _namespace: typing.Union[int, None]
203
- _environment_name: typing.Union[str, None]
204
- _content_checksum_sha256_hex: typing.Union[str, None]
205
-
206
- def __init__(self, *args, **kwargs):
207
- ...
180
+ _entries: typing.Optional[list[_MountEntry]]
181
+ _deployment_name: typing.Optional[str]
182
+ _namespace: typing.Optional[int]
183
+ _environment_name: typing.Optional[str]
184
+ _content_checksum_sha256_hex: typing.Optional[str]
208
185
 
186
+ def __init__(self, *args, **kwargs): ...
209
187
  @staticmethod
210
- def _new(entries: typing.List[_MountEntry] = []) -> Mount:
211
- ...
212
-
213
- def _extend(self, entry: _MountEntry) -> Mount:
214
- ...
215
-
188
+ def _new(entries: list[_MountEntry] = []) -> Mount: ...
189
+ def _extend(self, entry: _MountEntry) -> Mount: ...
216
190
  @property
217
- def entries(self):
218
- ...
219
-
220
- def _hydrate_metadata(self, handle_metadata: typing.Union[google.protobuf.message.Message, None]):
221
- ...
222
-
223
- def _top_level_paths(self) -> typing.List[typing.Tuple[pathlib.Path, pathlib.PurePosixPath]]:
224
- ...
225
-
226
- def is_local(self) -> bool:
227
- ...
228
-
229
- def add_local_dir(self, local_path: typing.Union[str, pathlib.Path], *, remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None, condition: typing.Union[typing.Callable[[str], bool], None] = None, recursive: bool = True) -> Mount:
230
- ...
231
-
191
+ def entries(self): ...
192
+ def _hydrate_metadata(self, handle_metadata: typing.Optional[google.protobuf.message.Message]): ...
193
+ def _top_level_paths(self) -> list[tuple[pathlib.Path, pathlib.PurePosixPath]]: ...
194
+ def is_local(self) -> bool: ...
232
195
  @staticmethod
233
- def from_local_dir(local_path: typing.Union[str, pathlib.Path], *, remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None, condition: typing.Union[typing.Callable[[str], bool], None] = None, recursive: bool = True) -> Mount:
234
- ...
235
-
236
- def add_local_file(self, local_path: typing.Union[str, pathlib.Path], remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None) -> Mount:
237
- ...
238
-
196
+ def _add_local_dir(
197
+ local_path: pathlib.Path,
198
+ remote_path: pathlib.PurePosixPath,
199
+ ignore: typing.Callable[[pathlib.Path], bool] = modal.file_pattern_matcher._NOTHING,
200
+ ): ...
201
+ def add_local_dir(
202
+ self,
203
+ local_path: typing.Union[str, pathlib.Path],
204
+ *,
205
+ remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None,
206
+ condition: typing.Optional[typing.Callable[[str], bool]] = None,
207
+ recursive: bool = True,
208
+ ) -> Mount: ...
239
209
  @staticmethod
240
- def from_local_file(local_path: typing.Union[str, pathlib.Path], remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None) -> Mount:
241
- ...
242
-
210
+ def from_local_dir(
211
+ local_path: typing.Union[str, pathlib.Path],
212
+ *,
213
+ remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None,
214
+ condition: typing.Optional[typing.Callable[[str], bool]] = None,
215
+ recursive: bool = True,
216
+ ) -> Mount: ...
217
+ @staticmethod
218
+ def _from_local_dir(
219
+ local_path: typing.Union[str, pathlib.Path],
220
+ *,
221
+ remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None,
222
+ condition: typing.Optional[typing.Callable[[str], bool]] = None,
223
+ recursive: bool = True,
224
+ ) -> Mount: ...
225
+ def add_local_file(
226
+ self,
227
+ local_path: typing.Union[str, pathlib.Path],
228
+ remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None,
229
+ ) -> Mount: ...
243
230
  @staticmethod
244
- def _description(entries: typing.List[_MountEntry]) -> str:
245
- ...
231
+ def from_local_file(
232
+ local_path: typing.Union[str, pathlib.Path], remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None
233
+ ) -> Mount: ...
234
+ @staticmethod
235
+ def _from_local_file(
236
+ local_path: typing.Union[str, pathlib.Path], remote_path: typing.Union[str, pathlib.PurePosixPath, None] = None
237
+ ) -> Mount: ...
238
+ @staticmethod
239
+ def _description(entries: list[_MountEntry]) -> str: ...
246
240
 
247
241
  class ___get_files_spec(typing_extensions.Protocol):
248
- def __call__(self, entries: typing.List[_MountEntry]) -> typing.Generator[modal._utils.blob_utils.FileUploadSpec, None, None]:
249
- ...
250
-
251
- def aio(self, entries: typing.List[_MountEntry]) -> typing.AsyncGenerator[modal._utils.blob_utils.FileUploadSpec, None]:
252
- ...
242
+ def __call__(
243
+ self, entries: list[_MountEntry]
244
+ ) -> typing.Generator[modal._utils.blob_utils.FileUploadSpec, None, None]: ...
245
+ def aio(
246
+ self, entries: list[_MountEntry]
247
+ ) -> collections.abc.AsyncGenerator[modal._utils.blob_utils.FileUploadSpec, None]: ...
253
248
 
254
249
  _get_files: ___get_files_spec
255
250
 
256
251
  class ___load_mount_spec(typing_extensions.Protocol):
257
- def __call__(self, resolver: modal._resolver.Resolver, existing_object_id: typing.Union[str, None]):
258
- ...
259
-
260
- async def aio(self, *args, **kwargs):
261
- ...
252
+ def __call__(self, resolver: modal._resolver.Resolver, existing_object_id: typing.Optional[str]): ...
253
+ async def aio(self, resolver: modal._resolver.Resolver, existing_object_id: typing.Optional[str]): ...
262
254
 
263
255
  _load_mount: ___load_mount_spec
264
256
 
265
257
  @staticmethod
266
- def from_local_python_packages(*module_names: str, remote_dir: typing.Union[str, pathlib.PurePosixPath] = '/root', condition: typing.Union[typing.Callable[[str], bool], None] = None) -> Mount:
267
- ...
268
-
258
+ def from_local_python_packages(
259
+ *module_names: str,
260
+ remote_dir: typing.Union[str, pathlib.PurePosixPath] = "/root",
261
+ condition: typing.Optional[typing.Callable[[str], bool]] = None,
262
+ ignore: typing.Union[typing.Sequence[str], typing.Callable[[pathlib.Path], bool], None] = None,
263
+ ) -> Mount: ...
269
264
  @staticmethod
270
- def from_name(label: str, namespace=1, environment_name: typing.Union[str, None] = None) -> Mount:
271
- ...
272
-
265
+ def _from_local_python_packages(
266
+ *module_names: str,
267
+ remote_dir: typing.Union[str, pathlib.PurePosixPath] = "/root",
268
+ condition: typing.Optional[typing.Callable[[str], bool]] = None,
269
+ ignore: typing.Union[typing.Sequence[str], typing.Callable[[pathlib.Path], bool], None] = None,
270
+ ) -> Mount: ...
271
+ @staticmethod
272
+ def from_name(name: str, namespace=1, environment_name: typing.Optional[str] = None) -> Mount: ...
273
273
  @classmethod
274
- def lookup(cls: typing.Type[Mount], label: str, namespace=1, client: typing.Union[modal.client.Client, None] = None, environment_name: typing.Union[str, None] = None) -> Mount:
275
- ...
274
+ def lookup(
275
+ cls: type[Mount],
276
+ name: str,
277
+ namespace=1,
278
+ client: typing.Optional[modal.client.Client] = None,
279
+ environment_name: typing.Optional[str] = None,
280
+ ) -> Mount: ...
276
281
 
277
282
  class ___deploy_spec(typing_extensions.Protocol):
278
- def __call__(self, deployment_name: typing.Union[str, None] = None, namespace=1, environment_name: typing.Union[str, None] = None, client: typing.Union[modal.client.Client, None] = None) -> Mount:
279
- ...
280
-
281
- async def aio(self, *args, **kwargs) -> Mount:
282
- ...
283
+ def __call__(
284
+ self,
285
+ deployment_name: typing.Optional[str] = None,
286
+ namespace=1,
287
+ environment_name: typing.Optional[str] = None,
288
+ client: typing.Optional[modal.client.Client] = None,
289
+ ) -> None: ...
290
+ async def aio(
291
+ self,
292
+ deployment_name: typing.Optional[str] = None,
293
+ namespace=1,
294
+ environment_name: typing.Optional[str] = None,
295
+ client: typing.Optional[modal.client.Client] = None,
296
+ ) -> None: ...
283
297
 
284
298
  _deploy: ___deploy_spec
285
299
 
286
- def _get_metadata(self) -> modal_proto.api_pb2.MountHandleMetadata:
287
- ...
288
-
289
-
290
- def _create_client_mount():
291
- ...
292
-
293
-
294
- def create_client_mount():
295
- ...
296
-
297
-
298
- def _get_client_mount():
299
- ...
300
-
301
-
302
- def _is_modal_path(remote_path: pathlib.PurePosixPath):
303
- ...
304
-
305
-
306
- def get_auto_mounts() -> typing.List[_Mount]:
307
- ...
300
+ def _get_metadata(self) -> modal_proto.api_pb2.MountHandleMetadata: ...
308
301
 
302
+ def _create_client_mount(): ...
303
+ def create_client_mount(): ...
304
+ def _get_client_mount(): ...
305
+ def _is_modal_path(remote_path: pathlib.PurePosixPath): ...
306
+ def get_auto_mounts() -> list[_Mount]: ...
309
307
 
310
308
  ROOT_DIR: pathlib.PurePosixPath
311
309
 
312
- PYTHON_STANDALONE_VERSIONS: typing.Dict[str, typing.Tuple[str, str]]
310
+ PYTHON_STANDALONE_VERSIONS: dict[str, tuple[str, str]]