modal 0.62.16__py3-none-any.whl → 0.72.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 (220) hide show
  1. modal/__init__.py +17 -13
  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 +420 -937
  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 -59
  11. modal/_resources.py +51 -0
  12. modal/_runtime/__init__.py +1 -0
  13. modal/_runtime/asgi.py +519 -0
  14. modal/_runtime/container_io_manager.py +1036 -0
  15. modal/_runtime/execution_context.py +89 -0
  16. modal/_runtime/telemetry.py +169 -0
  17. modal/_runtime/user_code_imports.py +356 -0
  18. modal/_serialization.py +134 -9
  19. modal/_traceback.py +47 -187
  20. modal/_tunnel.py +52 -16
  21. modal/_tunnel.pyi +19 -36
  22. modal/_utils/app_utils.py +3 -17
  23. modal/_utils/async_utils.py +479 -100
  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 +460 -171
  29. modal/_utils/grpc_testing.py +47 -31
  30. modal/_utils/grpc_utils.py +62 -109
  31. modal/_utils/hash_utils.py +61 -19
  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 +5 -7
  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 +14 -12
  43. modal/app.py +1003 -314
  44. modal/app.pyi +540 -264
  45. modal/call_graph.py +7 -6
  46. modal/cli/_download.py +63 -53
  47. modal/cli/_traceback.py +200 -0
  48. modal/cli/app.py +205 -45
  49. modal/cli/config.py +12 -5
  50. modal/cli/container.py +62 -14
  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 +64 -58
  55. modal/cli/launch.py +32 -18
  56. modal/cli/network_file_system.py +64 -83
  57. modal/cli/profile.py +1 -1
  58. modal/cli/programs/run_jupyter.py +35 -10
  59. modal/cli/programs/vscode.py +60 -10
  60. modal/cli/queues.py +131 -0
  61. modal/cli/run.py +234 -131
  62. modal/cli/secret.py +8 -7
  63. modal/cli/token.py +7 -2
  64. modal/cli/utils.py +79 -10
  65. modal/cli/volume.py +110 -109
  66. modal/client.py +250 -144
  67. modal/client.pyi +157 -118
  68. modal/cloud_bucket_mount.py +108 -34
  69. modal/cloud_bucket_mount.pyi +32 -38
  70. modal/cls.py +535 -148
  71. modal/cls.pyi +190 -146
  72. modal/config.py +41 -19
  73. modal/container_process.py +177 -0
  74. modal/container_process.pyi +82 -0
  75. modal/dict.py +111 -65
  76. modal/dict.pyi +136 -131
  77. modal/environments.py +106 -5
  78. modal/environments.pyi +77 -25
  79. modal/exception.py +34 -43
  80. modal/experimental.py +61 -2
  81. modal/extensions/ipython.py +5 -5
  82. modal/file_io.py +537 -0
  83. modal/file_io.pyi +235 -0
  84. modal/file_pattern_matcher.py +197 -0
  85. modal/functions.py +906 -911
  86. modal/functions.pyi +466 -430
  87. modal/gpu.py +57 -44
  88. modal/image.py +1089 -479
  89. modal/image.pyi +584 -228
  90. modal/io_streams.py +434 -0
  91. modal/io_streams.pyi +122 -0
  92. modal/mount.py +314 -101
  93. modal/mount.pyi +241 -235
  94. modal/network_file_system.py +92 -92
  95. modal/network_file_system.pyi +152 -110
  96. modal/object.py +67 -36
  97. modal/object.pyi +166 -143
  98. modal/output.py +63 -0
  99. modal/parallel_map.py +434 -0
  100. modal/parallel_map.pyi +75 -0
  101. modal/partial_function.py +282 -117
  102. modal/partial_function.pyi +222 -129
  103. modal/proxy.py +15 -12
  104. modal/proxy.pyi +3 -8
  105. modal/queue.py +182 -65
  106. modal/queue.pyi +218 -118
  107. modal/requirements/2024.04.txt +29 -0
  108. modal/requirements/2024.10.txt +16 -0
  109. modal/requirements/README.md +21 -0
  110. modal/requirements/base-images.json +22 -0
  111. modal/retries.py +48 -7
  112. modal/runner.py +459 -156
  113. modal/runner.pyi +135 -71
  114. modal/running_app.py +38 -0
  115. modal/sandbox.py +514 -236
  116. modal/sandbox.pyi +397 -169
  117. modal/schedule.py +4 -4
  118. modal/scheduler_placement.py +20 -3
  119. modal/secret.py +56 -31
  120. modal/secret.pyi +62 -42
  121. modal/serving.py +51 -56
  122. modal/serving.pyi +44 -36
  123. modal/stream_type.py +15 -0
  124. modal/token_flow.py +5 -3
  125. modal/token_flow.pyi +37 -32
  126. modal/volume.py +285 -157
  127. modal/volume.pyi +249 -184
  128. {modal-0.62.16.dist-info → modal-0.72.11.dist-info}/METADATA +7 -7
  129. modal-0.72.11.dist-info/RECORD +174 -0
  130. {modal-0.62.16.dist-info → modal-0.72.11.dist-info}/top_level.txt +0 -1
  131. modal_docs/gen_reference_docs.py +3 -1
  132. modal_docs/mdmd/mdmd.py +0 -1
  133. modal_docs/mdmd/signatures.py +5 -2
  134. modal_global_objects/images/base_images.py +28 -0
  135. modal_global_objects/mounts/python_standalone.py +2 -2
  136. modal_proto/__init__.py +1 -1
  137. modal_proto/api.proto +1288 -533
  138. modal_proto/api_grpc.py +856 -456
  139. modal_proto/api_pb2.py +2165 -1157
  140. modal_proto/api_pb2.pyi +8859 -0
  141. modal_proto/api_pb2_grpc.py +1674 -855
  142. modal_proto/api_pb2_grpc.pyi +1416 -0
  143. modal_proto/modal_api_grpc.py +149 -0
  144. modal_proto/modal_options_grpc.py +3 -0
  145. modal_proto/options_pb2.pyi +20 -0
  146. modal_proto/options_pb2_grpc.pyi +7 -0
  147. modal_proto/py.typed +0 -0
  148. modal_version/__init__.py +1 -1
  149. modal_version/_version_generated.py +2 -2
  150. modal/_asgi.py +0 -370
  151. modal/_container_entrypoint.pyi +0 -378
  152. modal/_container_exec.py +0 -128
  153. modal/_sandbox_shell.py +0 -49
  154. modal/shared_volume.py +0 -23
  155. modal/shared_volume.pyi +0 -24
  156. modal/stub.py +0 -783
  157. modal/stub.pyi +0 -332
  158. modal-0.62.16.dist-info/RECORD +0 -198
  159. modal_global_objects/images/conda.py +0 -15
  160. modal_global_objects/images/debian_slim.py +0 -15
  161. modal_global_objects/images/micromamba.py +0 -15
  162. test/__init__.py +0 -1
  163. test/aio_test.py +0 -12
  164. test/async_utils_test.py +0 -262
  165. test/blob_test.py +0 -67
  166. test/cli_imports_test.py +0 -149
  167. test/cli_test.py +0 -659
  168. test/client_test.py +0 -194
  169. test/cls_test.py +0 -630
  170. test/config_test.py +0 -137
  171. test/conftest.py +0 -1420
  172. test/container_app_test.py +0 -32
  173. test/container_test.py +0 -1389
  174. test/cpu_test.py +0 -23
  175. test/decorator_test.py +0 -85
  176. test/deprecation_test.py +0 -34
  177. test/dict_test.py +0 -33
  178. test/e2e_test.py +0 -68
  179. test/error_test.py +0 -7
  180. test/function_serialization_test.py +0 -32
  181. test/function_test.py +0 -653
  182. test/function_utils_test.py +0 -101
  183. test/gpu_test.py +0 -159
  184. test/grpc_utils_test.py +0 -141
  185. test/helpers.py +0 -42
  186. test/image_test.py +0 -669
  187. test/live_reload_test.py +0 -80
  188. test/lookup_test.py +0 -70
  189. test/mdmd_test.py +0 -329
  190. test/mount_test.py +0 -162
  191. test/mounted_files_test.py +0 -329
  192. test/network_file_system_test.py +0 -181
  193. test/notebook_test.py +0 -66
  194. test/object_test.py +0 -41
  195. test/package_utils_test.py +0 -25
  196. test/queue_test.py +0 -97
  197. test/resolver_test.py +0 -58
  198. test/retries_test.py +0 -67
  199. test/runner_test.py +0 -85
  200. test/sandbox_test.py +0 -191
  201. test/schedule_test.py +0 -15
  202. test/scheduler_placement_test.py +0 -29
  203. test/secret_test.py +0 -78
  204. test/serialization_test.py +0 -42
  205. test/stub_composition_test.py +0 -10
  206. test/stub_test.py +0 -360
  207. test/test_asgi_wrapper.py +0 -234
  208. test/token_flow_test.py +0 -18
  209. test/traceback_test.py +0 -135
  210. test/tunnel_test.py +0 -29
  211. test/utils_test.py +0 -88
  212. test/version_test.py +0 -14
  213. test/volume_test.py +0 -341
  214. test/watcher_test.py +0 -30
  215. test/webhook_test.py +0 -146
  216. /modal/{requirements.312.txt → requirements/2023.12.312.txt} +0 -0
  217. /modal/{requirements.txt → requirements/2023.12.txt} +0 -0
  218. {modal-0.62.16.dist-info → modal-0.72.11.dist-info}/LICENSE +0 -0
  219. {modal-0.62.16.dist-info → modal-0.72.11.dist-info}/WHEEL +0 -0
  220. {modal-0.62.16.dist-info → modal-0.72.11.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,297 +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: ...
243
217
  @staticmethod
244
- def _description(entries: typing.List[_MountEntry]) -> str:
245
- ...
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: ...
230
+ @staticmethod
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
+ def _get_metadata(self) -> modal_proto.api_pb2.MountHandleMetadata: ...
300
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]: ...
301
307
 
302
308
  ROOT_DIR: pathlib.PurePosixPath
303
309
 
304
- PYTHON_STANDALONE_VERSIONS: typing.Dict[str, typing.Tuple[str, str]]
310
+ PYTHON_STANDALONE_VERSIONS: dict[str, tuple[str, str]]