modal 1.0.4.dev5__tar.gz → 1.0.4.dev10__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.4.dev5 → modal-1.0.4.dev10}/PKG-INFO +1 -1
  2. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/network_file_system.py +3 -0
  3. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/run.py +7 -0
  4. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/volume.py +2 -0
  5. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/client.pyi +2 -2
  6. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/file_io.py +9 -7
  7. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/file_io.pyi +5 -8
  8. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/functions.pyi +6 -6
  9. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/volume.py +5 -0
  10. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal.egg-info/PKG-INFO +1 -1
  11. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_version/__init__.py +1 -1
  12. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/LICENSE +0 -0
  13. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/README.md +0 -0
  14. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/__init__.py +0 -0
  15. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/__main__.py +0 -0
  16. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_clustered_functions.py +0 -0
  17. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_clustered_functions.pyi +0 -0
  18. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_container_entrypoint.py +0 -0
  19. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_functions.py +0 -0
  20. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_ipython.py +0 -0
  21. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_location.py +0 -0
  22. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_object.py +0 -0
  23. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_output.py +0 -0
  24. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_partial_function.py +0 -0
  25. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_pty.py +0 -0
  26. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_resolver.py +0 -0
  27. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_resources.py +0 -0
  28. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_runtime/__init__.py +0 -0
  29. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_runtime/asgi.py +0 -0
  30. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_runtime/container_io_manager.py +0 -0
  31. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_runtime/container_io_manager.pyi +0 -0
  32. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_runtime/execution_context.py +0 -0
  33. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_runtime/execution_context.pyi +0 -0
  34. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  35. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_runtime/telemetry.py +0 -0
  36. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_runtime/user_code_imports.py +0 -0
  37. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_serialization.py +0 -0
  38. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_traceback.py +0 -0
  39. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_tunnel.py +0 -0
  40. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_tunnel.pyi +0 -0
  41. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_type_manager.py +0 -0
  42. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/__init__.py +0 -0
  43. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/app_utils.py +0 -0
  44. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/async_utils.py +0 -0
  45. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/blob_utils.py +0 -0
  46. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/bytes_io_segment_payload.py +0 -0
  47. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/deprecation.py +0 -0
  48. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/docker_utils.py +0 -0
  49. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/function_utils.py +0 -0
  50. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/git_utils.py +0 -0
  51. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/grpc_testing.py +0 -0
  52. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/grpc_utils.py +0 -0
  53. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/hash_utils.py +0 -0
  54. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/http_utils.py +0 -0
  55. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/jwt_utils.py +0 -0
  56. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/logger.py +0 -0
  57. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/mount_utils.py +0 -0
  58. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/name_utils.py +0 -0
  59. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/package_utils.py +0 -0
  60. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/pattern_utils.py +0 -0
  61. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/rand_pb_testing.py +0 -0
  62. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/shell_utils.py +0 -0
  63. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_utils/time_utils.py +0 -0
  64. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_vendor/__init__.py +0 -0
  65. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  66. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_vendor/cloudpickle.py +0 -0
  67. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_vendor/tblib.py +0 -0
  68. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/_watcher.py +0 -0
  69. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/app.py +0 -0
  70. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/app.pyi +0 -0
  71. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/call_graph.py +0 -0
  72. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/__init__.py +0 -0
  73. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/_download.py +0 -0
  74. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/_traceback.py +0 -0
  75. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/app.py +0 -0
  76. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/cluster.py +0 -0
  77. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/config.py +0 -0
  78. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/container.py +0 -0
  79. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/dict.py +0 -0
  80. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/entry_point.py +0 -0
  81. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/environment.py +0 -0
  82. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/import_refs.py +0 -0
  83. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/launch.py +0 -0
  84. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/profile.py +0 -0
  85. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/programs/__init__.py +0 -0
  86. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/programs/run_jupyter.py +0 -0
  87. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/programs/vscode.py +0 -0
  88. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/queues.py +0 -0
  89. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/secret.py +0 -0
  90. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/token.py +0 -0
  91. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cli/utils.py +0 -0
  92. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/client.py +0 -0
  93. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cloud_bucket_mount.py +0 -0
  94. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cloud_bucket_mount.pyi +0 -0
  95. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cls.py +0 -0
  96. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/cls.pyi +0 -0
  97. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/config.py +0 -0
  98. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/container_process.py +0 -0
  99. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/container_process.pyi +0 -0
  100. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/dict.py +0 -0
  101. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/dict.pyi +0 -0
  102. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/environments.py +0 -0
  103. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/environments.pyi +0 -0
  104. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/exception.py +0 -0
  105. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/experimental/__init__.py +0 -0
  106. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/experimental/ipython.py +0 -0
  107. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/file_pattern_matcher.py +0 -0
  108. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/functions.py +0 -0
  109. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/gpu.py +0 -0
  110. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/image.py +0 -0
  111. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/image.pyi +0 -0
  112. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/io_streams.py +0 -0
  113. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/io_streams.pyi +0 -0
  114. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/mount.py +0 -0
  115. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/mount.pyi +0 -0
  116. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/network_file_system.py +0 -0
  117. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/network_file_system.pyi +0 -0
  118. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/object.py +0 -0
  119. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/object.pyi +0 -0
  120. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/output.py +0 -0
  121. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/parallel_map.py +0 -0
  122. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/parallel_map.pyi +0 -0
  123. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/partial_function.py +0 -0
  124. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/partial_function.pyi +0 -0
  125. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/proxy.py +0 -0
  126. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/proxy.pyi +0 -0
  127. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/py.typed +0 -0
  128. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/queue.py +0 -0
  129. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/queue.pyi +0 -0
  130. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/requirements/2023.12.312.txt +0 -0
  131. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/requirements/2023.12.txt +0 -0
  132. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/requirements/2024.04.txt +0 -0
  133. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/requirements/2024.10.txt +0 -0
  134. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/requirements/PREVIEW.txt +0 -0
  135. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/requirements/README.md +0 -0
  136. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/requirements/base-images.json +0 -0
  137. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/retries.py +0 -0
  138. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/runner.py +0 -0
  139. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/runner.pyi +0 -0
  140. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/running_app.py +0 -0
  141. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/sandbox.py +0 -0
  142. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/sandbox.pyi +0 -0
  143. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/schedule.py +0 -0
  144. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/scheduler_placement.py +0 -0
  145. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/secret.py +0 -0
  146. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/secret.pyi +0 -0
  147. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/serving.py +0 -0
  148. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/serving.pyi +0 -0
  149. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/snapshot.py +0 -0
  150. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/snapshot.pyi +0 -0
  151. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/stream_type.py +0 -0
  152. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/token_flow.py +0 -0
  153. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/token_flow.pyi +0 -0
  154. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal/volume.pyi +0 -0
  155. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal.egg-info/SOURCES.txt +0 -0
  156. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal.egg-info/dependency_links.txt +0 -0
  157. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal.egg-info/entry_points.txt +0 -0
  158. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal.egg-info/requires.txt +0 -0
  159. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal.egg-info/top_level.txt +0 -0
  160. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_docs/__init__.py +0 -0
  161. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_docs/gen_cli_docs.py +0 -0
  162. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_docs/gen_reference_docs.py +0 -0
  163. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_docs/mdmd/__init__.py +0 -0
  164. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_docs/mdmd/mdmd.py +0 -0
  165. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_docs/mdmd/signatures.py +0 -0
  166. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_proto/__init__.py +0 -0
  167. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_proto/api.proto +0 -0
  168. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_proto/api_grpc.py +0 -0
  169. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_proto/api_pb2.py +0 -0
  170. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_proto/api_pb2.pyi +0 -0
  171. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_proto/api_pb2_grpc.py +0 -0
  172. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_proto/api_pb2_grpc.pyi +0 -0
  173. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_proto/modal_api_grpc.py +0 -0
  174. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_proto/modal_options_grpc.py +0 -0
  175. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_proto/options.proto +0 -0
  176. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_proto/options_grpc.py +0 -0
  177. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_proto/options_pb2.py +0 -0
  178. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_proto/options_pb2.pyi +0 -0
  179. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_proto/options_pb2_grpc.py +0 -0
  180. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_proto/options_pb2_grpc.pyi +0 -0
  181. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_proto/py.typed +0 -0
  182. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/modal_version/__main__.py +0 -0
  183. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/pyproject.toml +0 -0
  184. {modal-1.0.4.dev5 → modal-1.0.4.dev10}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.4.dev5
3
+ Version: 1.0.4.dev10
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -203,8 +203,11 @@ async def rm(
203
203
  ):
204
204
  ensure_env(env)
205
205
  volume = _NetworkFileSystem.from_name(volume_name)
206
+ console = Console()
206
207
  try:
207
208
  await volume.remove_file(remote_path, recursive=recursive)
209
+ console.print(OutputManager.step_completed(f"{remote_path} was deleted successfully!"))
210
+
208
211
  except GRPCError as exc:
209
212
  if exc.status in (Status.NOT_FOUND, Status.INVALID_ARGUMENT):
210
213
  raise UsageError(exc.message)
@@ -27,6 +27,7 @@ from ..functions import Function
27
27
  from ..image import Image
28
28
  from ..output import enable_output
29
29
  from ..runner import deploy_app, interactive_shell, run_app
30
+ from ..secret import Secret
30
31
  from ..serving import serve_app
31
32
  from ..volume import Volume
32
33
  from .import_refs import (
@@ -531,6 +532,10 @@ def shell(
531
532
  " Can be used multiple times."
532
533
  ),
533
534
  ),
535
+ secret: Optional[list[str]] = typer.Option(
536
+ default=None,
537
+ help=("Name of a `modal.Secret` to mount inside the shell (if not using REF). Can be used multiple times."),
538
+ ),
534
539
  cpu: Optional[int] = typer.Option(default=None, help="Number of CPUs to allocate to the shell (if not using REF)."),
535
540
  memory: Optional[int] = typer.Option(
536
541
  default=None, help="Memory to allocate for the shell, in MiB (if not using REF)."
@@ -660,6 +665,7 @@ def shell(
660
665
  else:
661
666
  modal_image = Image.from_registry(image, add_python=add_python) if image else None
662
667
  volumes = {} if volume is None else {f"/mnt/{vol}": Volume.from_name(vol) for vol in volume}
668
+ secrets = [] if secret is None else [Secret.from_name(s) for s in secret]
663
669
  start_shell = partial(
664
670
  interactive_shell,
665
671
  image=modal_image,
@@ -668,6 +674,7 @@ def shell(
668
674
  gpu=gpu,
669
675
  cloud=cloud,
670
676
  volumes=volumes,
677
+ secrets=secrets,
671
678
  region=region.split(",") if region else [],
672
679
  pty=pty,
673
680
  )
@@ -245,8 +245,10 @@ async def rm(
245
245
  ):
246
246
  ensure_env(env)
247
247
  volume = _Volume.from_name(volume_name, environment_name=env)
248
+ console = Console()
248
249
  try:
249
250
  await volume.remove_file(remote_path, recursive=recursive)
251
+ console.print(OutputManager.step_completed(f"{remote_path} was deleted successfully!"))
250
252
  except GRPCError as exc:
251
253
  if exc.status in (Status.NOT_FOUND, Status.INVALID_ARGUMENT):
252
254
  raise UsageError(exc.message)
@@ -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.4.dev5",
34
+ version: str = "1.0.4.dev10",
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.4.dev5",
97
+ version: str = "1.0.4.dev10",
98
98
  ): ...
99
99
  def is_closed(self) -> bool: ...
100
100
  @property
@@ -144,11 +144,12 @@ class _FileIO(Generic[T]):
144
144
  _task_id: str = ""
145
145
  _file_descriptor: str = ""
146
146
  _client: _Client
147
- _watch_output_buffer: list[Optional[bytes]] = []
147
+ _watch_output_buffer: list[Union[Optional[bytes],Exception]] = []
148
148
 
149
149
  def __init__(self, client: _Client, task_id: str) -> None:
150
150
  self._client = client
151
151
  self._task_id = task_id
152
+ self._watch_output_buffer = []
152
153
 
153
154
  def _validate_mode(self, mode: str) -> None:
154
155
  if not any(char in mode for char in "rwax"):
@@ -173,11 +174,7 @@ class _FileIO(Generic[T]):
173
174
  raise ValueError(f"Invalid file mode: {mode}")
174
175
  seen_chars.add(char)
175
176
 
176
- def _handle_error(self, error: api_pb2.SystemErrorMessage) -> None:
177
- error_class = ERROR_MAPPING.get(error.error_code, FilesystemExecutionError)
178
- raise error_class(error.error_message)
179
-
180
- async def _consume_output(self, exec_id: str) -> AsyncIterator[Optional[bytes]]:
177
+ async def _consume_output(self, exec_id: str) -> AsyncIterator[Union[Optional[bytes], Exception]]:
181
178
  req = api_pb2.ContainerFilesystemExecGetOutputRequest(
182
179
  exec_id=exec_id,
183
180
  timeout=55,
@@ -187,7 +184,8 @@ class _FileIO(Generic[T]):
187
184
  yield None
188
185
  break
189
186
  if batch.HasField("error"):
190
- self._handle_error(batch.error)
187
+ error_class = ERROR_MAPPING.get(batch.error.error_code, FilesystemExecutionError)
188
+ yield error_class(batch.error.error_message)
191
189
  for message in batch.output:
192
190
  yield message
193
191
 
@@ -236,6 +234,8 @@ class _FileIO(Generic[T]):
236
234
  if data is None:
237
235
  completed = True
238
236
  break
237
+ if isinstance(data, Exception):
238
+ raise data
239
239
  output += data
240
240
  except (GRPCError, StreamTerminatedError) as exc:
241
241
  if retries_remaining > 0:
@@ -475,6 +475,8 @@ class _FileIO(Generic[T]):
475
475
  item = self._watch_output_buffer.pop(0)
476
476
  if item is None:
477
477
  break
478
+ if isinstance(item, Exception):
479
+ raise item
478
480
  buffer += item
479
481
  # a single event may be split across multiple messages
480
482
  # the end of an event is marked by two newlines
@@ -1,7 +1,6 @@
1
1
  import _typeshed
2
2
  import enum
3
3
  import modal.client
4
- import modal_proto.api_pb2
5
4
  import typing
6
5
  import typing_extensions
7
6
 
@@ -33,12 +32,11 @@ class _FileIO(typing.Generic[T]):
33
32
  _task_id: str
34
33
  _file_descriptor: str
35
34
  _client: modal.client._Client
36
- _watch_output_buffer: list[typing.Optional[bytes]]
35
+ _watch_output_buffer: list[typing.Union[bytes, None, Exception]]
37
36
 
38
37
  def __init__(self, client: modal.client._Client, task_id: str) -> None: ...
39
38
  def _validate_mode(self, mode: str) -> None: ...
40
- def _handle_error(self, error: modal_proto.api_pb2.SystemErrorMessage) -> None: ...
41
- def _consume_output(self, exec_id: str) -> typing.AsyncIterator[typing.Optional[bytes]]: ...
39
+ def _consume_output(self, exec_id: str) -> typing.AsyncIterator[typing.Union[bytes, None, Exception]]: ...
42
40
  async def _consume_watch_output(self, exec_id: str) -> None: ...
43
41
  async def _parse_watch_output(self, event: bytes) -> typing.Optional[FileWatchEvent]: ...
44
42
  async def _wait(self, exec_id: str) -> bytes: ...
@@ -112,15 +110,14 @@ class FileIO(typing.Generic[T]):
112
110
  _task_id: str
113
111
  _file_descriptor: str
114
112
  _client: modal.client.Client
115
- _watch_output_buffer: list[typing.Optional[bytes]]
113
+ _watch_output_buffer: list[typing.Union[bytes, None, Exception]]
116
114
 
117
115
  def __init__(self, client: modal.client.Client, task_id: str) -> None: ...
118
116
  def _validate_mode(self, mode: str) -> None: ...
119
- def _handle_error(self, error: modal_proto.api_pb2.SystemErrorMessage) -> None: ...
120
117
 
121
118
  class ___consume_output_spec(typing_extensions.Protocol[SUPERSELF]):
122
- def __call__(self, /, exec_id: str) -> typing.Iterator[typing.Optional[bytes]]: ...
123
- def aio(self, /, exec_id: str) -> typing.AsyncIterator[typing.Optional[bytes]]: ...
119
+ def __call__(self, /, exec_id: str) -> typing.Iterator[typing.Union[bytes, None, Exception]]: ...
120
+ def aio(self, /, exec_id: str) -> typing.AsyncIterator[typing.Union[bytes, None, Exception]]: ...
124
121
 
125
122
  _consume_output: ___consume_output_spec[typing_extensions.Self]
126
123
 
@@ -227,11 +227,11 @@ class Function(
227
227
 
228
228
  _call_generator: ___call_generator_spec[typing_extensions.Self]
229
229
 
230
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
230
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
231
231
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
232
232
  async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
233
233
 
234
- remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
234
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
235
235
 
236
236
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
237
237
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
@@ -246,12 +246,12 @@ class Function(
246
246
  self, *args: modal._functions.P.args, **kwargs: modal._functions.P.kwargs
247
247
  ) -> modal._functions.OriginalReturnType: ...
248
248
 
249
- class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
249
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
250
250
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
251
251
  async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
252
252
 
253
253
  _experimental_spawn: ___experimental_spawn_spec[
254
- modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
254
+ modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
255
255
  ]
256
256
 
257
257
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
@@ -260,11 +260,11 @@ class Function(
260
260
 
261
261
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
262
262
 
263
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
263
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
264
264
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
265
265
  async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
266
266
 
267
- spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
267
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
268
268
 
269
269
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]: ...
270
270
 
@@ -403,6 +403,10 @@ class _Volume(_Object, type_prefix="vo"):
403
403
  """
404
404
  Read a file from the modal.Volume.
405
405
 
406
+ Note - this function is primarily intended to be used outside of a Modal App.
407
+ For more information on downloading files from a Modal Volume, see
408
+ [the guide](/docs/guide/volumes).
409
+
406
410
  **Example:**
407
411
 
408
412
  ```python notest
@@ -443,6 +447,7 @@ class _Volume(_Object, type_prefix="vo"):
443
447
  Read volume file into file-like IO object.
444
448
  """
445
449
  if progress_cb is None:
450
+
446
451
  def progress_cb(*_, **__):
447
452
  pass
448
453
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.4.dev5
3
+ Version: 1.0.4.dev10
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.4.dev5"
4
+ __version__ = "1.0.4.dev10"
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
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