modal 1.0.3.dev17__tar.gz → 1.0.3.dev20__tar.gz

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 (184) hide show
  1. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/PKG-INFO +1 -1
  2. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/run.py +12 -0
  3. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/client.pyi +2 -2
  4. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/mount.py +33 -19
  5. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/mount.pyi +6 -0
  6. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/runner.py +2 -7
  7. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal.egg-info/PKG-INFO +1 -1
  8. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_version/__init__.py +1 -1
  9. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/LICENSE +0 -0
  10. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/README.md +0 -0
  11. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/__init__.py +0 -0
  12. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/__main__.py +0 -0
  13. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_clustered_functions.py +0 -0
  14. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_clustered_functions.pyi +0 -0
  15. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_container_entrypoint.py +0 -0
  16. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_functions.py +0 -0
  17. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_ipython.py +0 -0
  18. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_location.py +0 -0
  19. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_object.py +0 -0
  20. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_output.py +0 -0
  21. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_partial_function.py +0 -0
  22. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_pty.py +0 -0
  23. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_resolver.py +0 -0
  24. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_resources.py +0 -0
  25. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_runtime/__init__.py +0 -0
  26. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_runtime/asgi.py +0 -0
  27. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_runtime/container_io_manager.py +0 -0
  28. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_runtime/container_io_manager.pyi +0 -0
  29. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_runtime/execution_context.py +0 -0
  30. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_runtime/execution_context.pyi +0 -0
  31. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  32. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_runtime/telemetry.py +0 -0
  33. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_runtime/user_code_imports.py +0 -0
  34. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_serialization.py +0 -0
  35. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_traceback.py +0 -0
  36. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_tunnel.py +0 -0
  37. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_tunnel.pyi +0 -0
  38. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_type_manager.py +0 -0
  39. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/__init__.py +0 -0
  40. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/app_utils.py +0 -0
  41. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/async_utils.py +0 -0
  42. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/blob_utils.py +0 -0
  43. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/bytes_io_segment_payload.py +0 -0
  44. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/deprecation.py +0 -0
  45. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/docker_utils.py +0 -0
  46. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/function_utils.py +0 -0
  47. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/git_utils.py +0 -0
  48. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/grpc_testing.py +0 -0
  49. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/grpc_utils.py +0 -0
  50. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/hash_utils.py +0 -0
  51. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/http_utils.py +0 -0
  52. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/jwt_utils.py +0 -0
  53. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/logger.py +0 -0
  54. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/mount_utils.py +0 -0
  55. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/name_utils.py +0 -0
  56. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/package_utils.py +0 -0
  57. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/pattern_utils.py +0 -0
  58. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/rand_pb_testing.py +0 -0
  59. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/shell_utils.py +0 -0
  60. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_utils/time_utils.py +0 -0
  61. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_vendor/__init__.py +0 -0
  62. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  63. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_vendor/cloudpickle.py +0 -0
  64. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_vendor/tblib.py +0 -0
  65. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/_watcher.py +0 -0
  66. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/app.py +0 -0
  67. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/app.pyi +0 -0
  68. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/call_graph.py +0 -0
  69. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/__init__.py +0 -0
  70. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/_download.py +0 -0
  71. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/_traceback.py +0 -0
  72. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/app.py +0 -0
  73. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/cluster.py +0 -0
  74. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/config.py +0 -0
  75. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/container.py +0 -0
  76. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/dict.py +0 -0
  77. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/entry_point.py +0 -0
  78. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/environment.py +0 -0
  79. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/import_refs.py +0 -0
  80. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/launch.py +0 -0
  81. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/network_file_system.py +0 -0
  82. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/profile.py +0 -0
  83. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/programs/__init__.py +0 -0
  84. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/programs/run_jupyter.py +0 -0
  85. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/programs/vscode.py +0 -0
  86. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/queues.py +0 -0
  87. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/secret.py +0 -0
  88. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/token.py +0 -0
  89. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/utils.py +0 -0
  90. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cli/volume.py +0 -0
  91. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/client.py +0 -0
  92. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cloud_bucket_mount.py +0 -0
  93. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cloud_bucket_mount.pyi +0 -0
  94. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cls.py +0 -0
  95. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/cls.pyi +0 -0
  96. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/config.py +0 -0
  97. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/container_process.py +0 -0
  98. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/container_process.pyi +0 -0
  99. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/dict.py +0 -0
  100. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/dict.pyi +0 -0
  101. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/environments.py +0 -0
  102. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/environments.pyi +0 -0
  103. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/exception.py +0 -0
  104. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/experimental/__init__.py +0 -0
  105. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/experimental/ipython.py +0 -0
  106. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/file_io.py +0 -0
  107. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/file_io.pyi +0 -0
  108. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/file_pattern_matcher.py +0 -0
  109. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/functions.py +0 -0
  110. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/functions.pyi +0 -0
  111. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/gpu.py +0 -0
  112. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/image.py +0 -0
  113. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/image.pyi +0 -0
  114. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/io_streams.py +0 -0
  115. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/io_streams.pyi +0 -0
  116. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/network_file_system.py +0 -0
  117. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/network_file_system.pyi +0 -0
  118. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/object.py +0 -0
  119. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/object.pyi +0 -0
  120. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/output.py +0 -0
  121. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/parallel_map.py +0 -0
  122. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/parallel_map.pyi +0 -0
  123. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/partial_function.py +0 -0
  124. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/partial_function.pyi +0 -0
  125. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/proxy.py +0 -0
  126. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/proxy.pyi +0 -0
  127. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/py.typed +0 -0
  128. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/queue.py +0 -0
  129. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/queue.pyi +0 -0
  130. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/requirements/2023.12.312.txt +0 -0
  131. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/requirements/2023.12.txt +0 -0
  132. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/requirements/2024.04.txt +0 -0
  133. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/requirements/2024.10.txt +0 -0
  134. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/requirements/PREVIEW.txt +0 -0
  135. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/requirements/README.md +0 -0
  136. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/requirements/base-images.json +0 -0
  137. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/retries.py +0 -0
  138. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/runner.pyi +0 -0
  139. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/running_app.py +0 -0
  140. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/sandbox.py +0 -0
  141. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/sandbox.pyi +0 -0
  142. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/schedule.py +0 -0
  143. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/scheduler_placement.py +0 -0
  144. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/secret.py +0 -0
  145. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/secret.pyi +0 -0
  146. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/serving.py +0 -0
  147. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/serving.pyi +0 -0
  148. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/snapshot.py +0 -0
  149. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/snapshot.pyi +0 -0
  150. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/stream_type.py +0 -0
  151. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/token_flow.py +0 -0
  152. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/token_flow.pyi +0 -0
  153. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/volume.py +0 -0
  154. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal/volume.pyi +0 -0
  155. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal.egg-info/SOURCES.txt +0 -0
  156. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal.egg-info/dependency_links.txt +0 -0
  157. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal.egg-info/entry_points.txt +0 -0
  158. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal.egg-info/requires.txt +0 -0
  159. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal.egg-info/top_level.txt +0 -0
  160. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_docs/__init__.py +0 -0
  161. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_docs/gen_cli_docs.py +0 -0
  162. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_docs/gen_reference_docs.py +0 -0
  163. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_docs/mdmd/__init__.py +0 -0
  164. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_docs/mdmd/mdmd.py +0 -0
  165. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_docs/mdmd/signatures.py +0 -0
  166. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_proto/__init__.py +0 -0
  167. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_proto/api.proto +0 -0
  168. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_proto/api_grpc.py +0 -0
  169. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_proto/api_pb2.py +0 -0
  170. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_proto/api_pb2.pyi +0 -0
  171. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_proto/api_pb2_grpc.py +0 -0
  172. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_proto/api_pb2_grpc.pyi +0 -0
  173. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_proto/modal_api_grpc.py +0 -0
  174. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_proto/modal_options_grpc.py +0 -0
  175. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_proto/options.proto +0 -0
  176. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_proto/options_grpc.py +0 -0
  177. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_proto/options_pb2.py +0 -0
  178. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_proto/options_pb2.pyi +0 -0
  179. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_proto/options_pb2_grpc.py +0 -0
  180. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_proto/options_pb2_grpc.pyi +0 -0
  181. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_proto/py.typed +0 -0
  182. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/modal_version/__main__.py +0 -0
  183. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/pyproject.toml +0 -0
  184. {modal-1.0.3.dev17 → modal-1.0.3.dev20}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.3.dev17
3
+ Version: 1.0.3.dev20
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -171,6 +171,14 @@ def _write_local_result(result_path: str, res: Any):
171
171
  fid.write(res)
172
172
 
173
173
 
174
+ def _validate_interactive_quiet_params(ctx):
175
+ interactive = ctx.obj["interactive"]
176
+ show_progress = ctx.obj["show_progress"]
177
+
178
+ if not show_progress and interactive:
179
+ raise InvalidError("To use interactive mode, remove the --quiet flag")
180
+
181
+
174
182
  def _make_click_function(app, signature: CliRunnableSignature, inner: Callable[[tuple[str, ...], dict[str, Any]], Any]):
175
183
  @click.pass_context
176
184
  def f(ctx, **kwargs):
@@ -180,6 +188,8 @@ def _make_click_function(app, signature: CliRunnableSignature, inner: Callable[[
180
188
  else:
181
189
  args = ()
182
190
 
191
+ _validate_interactive_quiet_params(ctx)
192
+
183
193
  show_progress: bool = ctx.obj["show_progress"]
184
194
  with enable_output(show_progress):
185
195
  with run_app(
@@ -291,6 +301,8 @@ def _get_click_command_for_local_entrypoint(app: App, entrypoint: LocalEntrypoin
291
301
  assert len(args) == 0 and len(kwargs) == 0
292
302
  args = ctx.args
293
303
 
304
+ _validate_interactive_quiet_params(ctx)
305
+
294
306
  show_progress: bool = ctx.obj["show_progress"]
295
307
  with enable_output(show_progress):
296
308
  with run_app(
@@ -31,7 +31,7 @@ class _Client:
31
31
  server_url: str,
32
32
  client_type: int,
33
33
  credentials: typing.Optional[tuple[str, str]],
34
- version: str = "1.0.3.dev17",
34
+ version: str = "1.0.3.dev20",
35
35
  ): ...
36
36
  def is_closed(self) -> bool: ...
37
37
  @property
@@ -94,7 +94,7 @@ class Client:
94
94
  server_url: str,
95
95
  client_type: int,
96
96
  credentials: typing.Optional[tuple[str, str]],
97
- version: str = "1.0.3.dev17",
97
+ version: str = "1.0.3.dev20",
98
98
  ): ...
99
99
  def is_closed(self) -> bool: ...
100
100
  @property
@@ -21,7 +21,7 @@ from modal_version import __version__
21
21
 
22
22
  from ._object import _get_environment_name, _Object
23
23
  from ._resolver import Resolver
24
- from ._utils.async_utils import aclosing, async_map, synchronize_api
24
+ from ._utils.async_utils import TaskContext, aclosing, async_map, synchronize_api
25
25
  from ._utils.blob_utils import FileUploadSpec, blob_upload_file, get_file_upload_spec_from_path
26
26
  from ._utils.deprecation import deprecation_warning
27
27
  from ._utils.grpc_utils import retry_transient_errors
@@ -115,7 +115,8 @@ class _MountFile(_MountEntry):
115
115
  def get_files_to_upload(self):
116
116
  local_file = self.local_file.resolve()
117
117
  if not local_file.exists():
118
- raise FileNotFoundError(local_file)
118
+ msg = f"local file {local_file} does not exist"
119
+ raise FileNotFoundError(msg)
119
120
 
120
121
  rel_filename = self.remote_path
121
122
  yield local_file, rel_filename
@@ -144,10 +145,12 @@ class _MountDir(_MountEntry):
144
145
  local_dir = self.local_dir.expanduser().absolute()
145
146
 
146
147
  if not local_dir.exists():
147
- raise FileNotFoundError(local_dir)
148
+ msg = f"local dir {local_dir} does not exist"
149
+ raise FileNotFoundError(msg)
148
150
 
149
151
  if not local_dir.is_dir():
150
- raise NotADirectoryError(local_dir)
152
+ msg = f"local dir {local_dir} is not a directory"
153
+ raise NotADirectoryError(msg)
151
154
 
152
155
  if self.recursive:
153
156
  gen = (os.path.join(root, name) for root, dirs, files in os.walk(local_dir) for name in files)
@@ -811,6 +814,7 @@ def _is_modal_path(remote_path: PurePosixPath):
811
814
  return True
812
815
  return False
813
816
 
817
+
814
818
  REMOTE_PACKAGES_PATH = "/__modal/deps"
815
819
  REMOTE_SITECUSTOMIZE_PATH = "/pkg/sitecustomize.py"
816
820
 
@@ -821,6 +825,7 @@ SITECUSTOMIZE_CONTENT = f"""
821
825
  import sys; sys.path.append('{REMOTE_PACKAGES_PATH}')
822
826
  """.strip()
823
827
 
828
+
824
829
  async def _create_single_mount(
825
830
  client: _Client,
826
831
  builder_version: str,
@@ -896,23 +901,32 @@ async def _create_single_mount(
896
901
 
897
902
 
898
903
  async def _create_client_dependency_mounts(client=None, check_if_exists=True):
904
+ coros = []
899
905
  for python_version in PYTHON_STANDALONE_VERSIONS:
900
906
  # glibc >= 2.17
901
- await _create_single_mount(
902
- client,
903
- "PREVIEW",
904
- python_version,
905
- "manylinux_2_17",
906
- "x86_64",
907
- check_if_exists=check_if_exists,
907
+ coros.append(
908
+ _create_single_mount(
909
+ client,
910
+ "PREVIEW",
911
+ python_version,
912
+ "manylinux_2_17",
913
+ "x86_64",
914
+ check_if_exists=check_if_exists,
915
+ )
908
916
  )
909
917
  # musl >= 1.2
910
- await _create_single_mount(
911
- client,
912
- "PREVIEW",
913
- python_version,
914
- "musllinux_1_2",
915
- "x86_64",
916
- uv_python_platform="x86_64-unknown-linux-musl",
917
- check_if_exists=check_if_exists,
918
+ coros.append(
919
+ _create_single_mount(
920
+ client,
921
+ "PREVIEW",
922
+ python_version,
923
+ "musllinux_1_2",
924
+ "x86_64",
925
+ uv_python_platform="x86_64-unknown-linux-musl",
926
+ check_if_exists=check_if_exists,
927
+ )
918
928
  )
929
+ await TaskContext.gather(*coros)
930
+
931
+
932
+ create_client_dependency_mounts = synchronize_api(_create_client_dependency_mounts)
@@ -319,6 +319,12 @@ async def _create_single_mount(
319
319
  ): ...
320
320
  async def _create_client_dependency_mounts(client=None, check_if_exists=True): ...
321
321
 
322
+ class __create_client_dependency_mounts_spec(typing_extensions.Protocol):
323
+ def __call__(self, /, client=None, check_if_exists=True): ...
324
+ async def aio(self, /, client=None, check_if_exists=True): ...
325
+
326
+ create_client_dependency_mounts: __create_client_dependency_mounts_spec
327
+
322
328
  ROOT_DIR: pathlib.PurePosixPath
323
329
 
324
330
  PYTHON_STANDALONE_VERSIONS: dict[str, tuple[str, str]]
@@ -9,7 +9,6 @@ import dataclasses
9
9
  import os
10
10
  import time
11
11
  import typing
12
- import warnings
13
12
  from collections.abc import AsyncGenerator
14
13
  from multiprocessing.synchronize import Event
15
14
  from typing import TYPE_CHECKING, Any, Optional, TypeVar
@@ -296,12 +295,8 @@ async def _run_app(
296
295
 
297
296
  output_mgr = _get_output_manager()
298
297
  if interactive and output_mgr is None:
299
- warnings.warn(
300
- "Interactive mode is disabled because no output manager is active. "
301
- "Use 'with modal.enable_output():' to enable interactive mode and see logs.",
302
- stacklevel=2,
303
- )
304
- interactive = False
298
+ msg = "Interactive mode requires output to be enabled. (Use the the `modal.enable_output()` context manager.)"
299
+ raise InvalidError(msg)
305
300
 
306
301
  running_app: RunningApp = await _init_local_app_new(
307
302
  client,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.3.dev17
3
+ Version: 1.0.3.dev20
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.0.3.dev17"
4
+ __version__ = "1.0.3.dev20"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes