modal 1.0.4.dev7__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.dev7 → modal-1.0.4.dev10}/PKG-INFO +1 -1
  2. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/network_file_system.py +3 -0
  3. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/run.py +7 -0
  4. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/volume.py +2 -0
  5. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/client.pyi +2 -2
  6. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/file_io.py +9 -7
  7. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/file_io.pyi +5 -8
  8. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal.egg-info/PKG-INFO +1 -1
  9. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_version/__init__.py +1 -1
  10. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/LICENSE +0 -0
  11. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/README.md +0 -0
  12. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/__init__.py +0 -0
  13. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/__main__.py +0 -0
  14. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_clustered_functions.py +0 -0
  15. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_clustered_functions.pyi +0 -0
  16. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_container_entrypoint.py +0 -0
  17. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_functions.py +0 -0
  18. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_ipython.py +0 -0
  19. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_location.py +0 -0
  20. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_object.py +0 -0
  21. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_output.py +0 -0
  22. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_partial_function.py +0 -0
  23. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_pty.py +0 -0
  24. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_resolver.py +0 -0
  25. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_resources.py +0 -0
  26. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_runtime/__init__.py +0 -0
  27. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_runtime/asgi.py +0 -0
  28. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_runtime/container_io_manager.py +0 -0
  29. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_runtime/container_io_manager.pyi +0 -0
  30. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_runtime/execution_context.py +0 -0
  31. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_runtime/execution_context.pyi +0 -0
  32. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  33. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_runtime/telemetry.py +0 -0
  34. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_runtime/user_code_imports.py +0 -0
  35. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_serialization.py +0 -0
  36. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_traceback.py +0 -0
  37. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_tunnel.py +0 -0
  38. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_tunnel.pyi +0 -0
  39. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_type_manager.py +0 -0
  40. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/__init__.py +0 -0
  41. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/app_utils.py +0 -0
  42. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/async_utils.py +0 -0
  43. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/blob_utils.py +0 -0
  44. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/bytes_io_segment_payload.py +0 -0
  45. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/deprecation.py +0 -0
  46. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/docker_utils.py +0 -0
  47. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/function_utils.py +0 -0
  48. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/git_utils.py +0 -0
  49. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/grpc_testing.py +0 -0
  50. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/grpc_utils.py +0 -0
  51. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/hash_utils.py +0 -0
  52. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/http_utils.py +0 -0
  53. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/jwt_utils.py +0 -0
  54. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/logger.py +0 -0
  55. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/mount_utils.py +0 -0
  56. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/name_utils.py +0 -0
  57. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/package_utils.py +0 -0
  58. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/pattern_utils.py +0 -0
  59. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/rand_pb_testing.py +0 -0
  60. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/shell_utils.py +0 -0
  61. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_utils/time_utils.py +0 -0
  62. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_vendor/__init__.py +0 -0
  63. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  64. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_vendor/cloudpickle.py +0 -0
  65. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_vendor/tblib.py +0 -0
  66. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/_watcher.py +0 -0
  67. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/app.py +0 -0
  68. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/app.pyi +0 -0
  69. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/call_graph.py +0 -0
  70. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/__init__.py +0 -0
  71. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/_download.py +0 -0
  72. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/_traceback.py +0 -0
  73. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/app.py +0 -0
  74. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/cluster.py +0 -0
  75. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/config.py +0 -0
  76. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/container.py +0 -0
  77. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/dict.py +0 -0
  78. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/entry_point.py +0 -0
  79. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/environment.py +0 -0
  80. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/import_refs.py +0 -0
  81. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/launch.py +0 -0
  82. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/profile.py +0 -0
  83. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/programs/__init__.py +0 -0
  84. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/programs/run_jupyter.py +0 -0
  85. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/programs/vscode.py +0 -0
  86. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/queues.py +0 -0
  87. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/secret.py +0 -0
  88. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/token.py +0 -0
  89. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cli/utils.py +0 -0
  90. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/client.py +0 -0
  91. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cloud_bucket_mount.py +0 -0
  92. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cloud_bucket_mount.pyi +0 -0
  93. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cls.py +0 -0
  94. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/cls.pyi +0 -0
  95. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/config.py +0 -0
  96. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/container_process.py +0 -0
  97. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/container_process.pyi +0 -0
  98. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/dict.py +0 -0
  99. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/dict.pyi +0 -0
  100. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/environments.py +0 -0
  101. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/environments.pyi +0 -0
  102. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/exception.py +0 -0
  103. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/experimental/__init__.py +0 -0
  104. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/experimental/ipython.py +0 -0
  105. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/file_pattern_matcher.py +0 -0
  106. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/functions.py +0 -0
  107. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/functions.pyi +0 -0
  108. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/gpu.py +0 -0
  109. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/image.py +0 -0
  110. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/image.pyi +0 -0
  111. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/io_streams.py +0 -0
  112. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/io_streams.pyi +0 -0
  113. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/mount.py +0 -0
  114. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/mount.pyi +0 -0
  115. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/network_file_system.py +0 -0
  116. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/network_file_system.pyi +0 -0
  117. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/object.py +0 -0
  118. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/object.pyi +0 -0
  119. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/output.py +0 -0
  120. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/parallel_map.py +0 -0
  121. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/parallel_map.pyi +0 -0
  122. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/partial_function.py +0 -0
  123. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/partial_function.pyi +0 -0
  124. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/proxy.py +0 -0
  125. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/proxy.pyi +0 -0
  126. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/py.typed +0 -0
  127. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/queue.py +0 -0
  128. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/queue.pyi +0 -0
  129. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/requirements/2023.12.312.txt +0 -0
  130. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/requirements/2023.12.txt +0 -0
  131. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/requirements/2024.04.txt +0 -0
  132. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/requirements/2024.10.txt +0 -0
  133. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/requirements/PREVIEW.txt +0 -0
  134. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/requirements/README.md +0 -0
  135. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/requirements/base-images.json +0 -0
  136. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/retries.py +0 -0
  137. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/runner.py +0 -0
  138. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/runner.pyi +0 -0
  139. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/running_app.py +0 -0
  140. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/sandbox.py +0 -0
  141. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/sandbox.pyi +0 -0
  142. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/schedule.py +0 -0
  143. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/scheduler_placement.py +0 -0
  144. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/secret.py +0 -0
  145. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/secret.pyi +0 -0
  146. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/serving.py +0 -0
  147. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/serving.pyi +0 -0
  148. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/snapshot.py +0 -0
  149. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/snapshot.pyi +0 -0
  150. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/stream_type.py +0 -0
  151. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/token_flow.py +0 -0
  152. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/token_flow.pyi +0 -0
  153. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/volume.py +0 -0
  154. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal/volume.pyi +0 -0
  155. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal.egg-info/SOURCES.txt +0 -0
  156. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal.egg-info/dependency_links.txt +0 -0
  157. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal.egg-info/entry_points.txt +0 -0
  158. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal.egg-info/requires.txt +0 -0
  159. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal.egg-info/top_level.txt +0 -0
  160. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_docs/__init__.py +0 -0
  161. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_docs/gen_cli_docs.py +0 -0
  162. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_docs/gen_reference_docs.py +0 -0
  163. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_docs/mdmd/__init__.py +0 -0
  164. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_docs/mdmd/mdmd.py +0 -0
  165. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_docs/mdmd/signatures.py +0 -0
  166. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_proto/__init__.py +0 -0
  167. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_proto/api.proto +0 -0
  168. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_proto/api_grpc.py +0 -0
  169. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_proto/api_pb2.py +0 -0
  170. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_proto/api_pb2.pyi +0 -0
  171. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_proto/api_pb2_grpc.py +0 -0
  172. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_proto/api_pb2_grpc.pyi +0 -0
  173. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_proto/modal_api_grpc.py +0 -0
  174. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_proto/modal_options_grpc.py +0 -0
  175. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_proto/options.proto +0 -0
  176. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_proto/options_grpc.py +0 -0
  177. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_proto/options_pb2.py +0 -0
  178. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_proto/options_pb2.pyi +0 -0
  179. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_proto/options_pb2_grpc.py +0 -0
  180. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_proto/options_pb2_grpc.pyi +0 -0
  181. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_proto/py.typed +0 -0
  182. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/modal_version/__main__.py +0 -0
  183. {modal-1.0.4.dev7 → modal-1.0.4.dev10}/pyproject.toml +0 -0
  184. {modal-1.0.4.dev7 → 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.dev7
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.dev7",
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.dev7",
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.4.dev7
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.dev7"
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
File without changes