modal 1.0.3.dev25__tar.gz → 1.0.3.dev27__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.dev25 → modal-1.0.3.dev27}/PKG-INFO +1 -1
  2. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/volume.py +2 -1
  3. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/client.pyi +2 -2
  4. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/parallel_map.py +1 -1
  5. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/volume.py +10 -3
  6. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/volume.pyi +9 -3
  7. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal.egg-info/PKG-INFO +1 -1
  8. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_version/__init__.py +1 -1
  9. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/LICENSE +0 -0
  10. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/README.md +0 -0
  11. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/__init__.py +0 -0
  12. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/__main__.py +0 -0
  13. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_clustered_functions.py +0 -0
  14. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_clustered_functions.pyi +0 -0
  15. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_container_entrypoint.py +0 -0
  16. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_functions.py +0 -0
  17. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_ipython.py +0 -0
  18. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_location.py +0 -0
  19. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_object.py +0 -0
  20. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_output.py +0 -0
  21. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_partial_function.py +0 -0
  22. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_pty.py +0 -0
  23. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_resolver.py +0 -0
  24. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_resources.py +0 -0
  25. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_runtime/__init__.py +0 -0
  26. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_runtime/asgi.py +0 -0
  27. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_runtime/container_io_manager.py +0 -0
  28. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_runtime/container_io_manager.pyi +0 -0
  29. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_runtime/execution_context.py +0 -0
  30. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_runtime/execution_context.pyi +0 -0
  31. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  32. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_runtime/telemetry.py +0 -0
  33. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_runtime/user_code_imports.py +0 -0
  34. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_serialization.py +0 -0
  35. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_traceback.py +0 -0
  36. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_tunnel.py +0 -0
  37. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_tunnel.pyi +0 -0
  38. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_type_manager.py +0 -0
  39. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/__init__.py +0 -0
  40. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/app_utils.py +0 -0
  41. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/async_utils.py +0 -0
  42. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/blob_utils.py +0 -0
  43. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/bytes_io_segment_payload.py +0 -0
  44. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/deprecation.py +0 -0
  45. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/docker_utils.py +0 -0
  46. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/function_utils.py +0 -0
  47. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/git_utils.py +0 -0
  48. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/grpc_testing.py +0 -0
  49. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/grpc_utils.py +0 -0
  50. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/hash_utils.py +0 -0
  51. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/http_utils.py +0 -0
  52. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/jwt_utils.py +0 -0
  53. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/logger.py +0 -0
  54. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/mount_utils.py +0 -0
  55. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/name_utils.py +0 -0
  56. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/package_utils.py +0 -0
  57. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/pattern_utils.py +0 -0
  58. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/rand_pb_testing.py +0 -0
  59. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/shell_utils.py +0 -0
  60. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_utils/time_utils.py +0 -0
  61. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_vendor/__init__.py +0 -0
  62. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  63. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_vendor/cloudpickle.py +0 -0
  64. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_vendor/tblib.py +0 -0
  65. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/_watcher.py +0 -0
  66. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/app.py +0 -0
  67. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/app.pyi +0 -0
  68. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/call_graph.py +0 -0
  69. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/__init__.py +0 -0
  70. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/_download.py +0 -0
  71. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/_traceback.py +0 -0
  72. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/app.py +0 -0
  73. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/cluster.py +0 -0
  74. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/config.py +0 -0
  75. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/container.py +0 -0
  76. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/dict.py +0 -0
  77. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/entry_point.py +0 -0
  78. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/environment.py +0 -0
  79. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/import_refs.py +0 -0
  80. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/launch.py +0 -0
  81. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/network_file_system.py +0 -0
  82. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/profile.py +0 -0
  83. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/programs/__init__.py +0 -0
  84. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/programs/run_jupyter.py +0 -0
  85. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/programs/vscode.py +0 -0
  86. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/queues.py +0 -0
  87. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/run.py +0 -0
  88. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/secret.py +0 -0
  89. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/token.py +0 -0
  90. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cli/utils.py +0 -0
  91. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/client.py +0 -0
  92. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cloud_bucket_mount.py +0 -0
  93. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cloud_bucket_mount.pyi +0 -0
  94. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cls.py +0 -0
  95. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/cls.pyi +0 -0
  96. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/config.py +0 -0
  97. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/container_process.py +0 -0
  98. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/container_process.pyi +0 -0
  99. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/dict.py +0 -0
  100. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/dict.pyi +0 -0
  101. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/environments.py +0 -0
  102. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/environments.pyi +0 -0
  103. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/exception.py +0 -0
  104. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/experimental/__init__.py +0 -0
  105. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/experimental/ipython.py +0 -0
  106. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/file_io.py +0 -0
  107. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/file_io.pyi +0 -0
  108. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/file_pattern_matcher.py +0 -0
  109. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/functions.py +0 -0
  110. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/functions.pyi +0 -0
  111. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/gpu.py +0 -0
  112. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/image.py +0 -0
  113. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/image.pyi +0 -0
  114. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/io_streams.py +0 -0
  115. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/io_streams.pyi +0 -0
  116. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/mount.py +0 -0
  117. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/mount.pyi +0 -0
  118. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/network_file_system.py +0 -0
  119. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/network_file_system.pyi +0 -0
  120. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/object.py +0 -0
  121. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/object.pyi +0 -0
  122. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/output.py +0 -0
  123. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/parallel_map.pyi +0 -0
  124. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/partial_function.py +0 -0
  125. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/partial_function.pyi +0 -0
  126. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/proxy.py +0 -0
  127. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/proxy.pyi +0 -0
  128. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/py.typed +0 -0
  129. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/queue.py +0 -0
  130. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/queue.pyi +0 -0
  131. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/requirements/2023.12.312.txt +0 -0
  132. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/requirements/2023.12.txt +0 -0
  133. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/requirements/2024.04.txt +0 -0
  134. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/requirements/2024.10.txt +0 -0
  135. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/requirements/PREVIEW.txt +0 -0
  136. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/requirements/README.md +0 -0
  137. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/requirements/base-images.json +0 -0
  138. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/retries.py +0 -0
  139. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/runner.py +0 -0
  140. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/runner.pyi +0 -0
  141. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/running_app.py +0 -0
  142. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/sandbox.py +0 -0
  143. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/sandbox.pyi +0 -0
  144. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/schedule.py +0 -0
  145. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/scheduler_placement.py +0 -0
  146. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/secret.py +0 -0
  147. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/secret.pyi +0 -0
  148. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/serving.py +0 -0
  149. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/serving.pyi +0 -0
  150. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/snapshot.py +0 -0
  151. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/snapshot.pyi +0 -0
  152. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/stream_type.py +0 -0
  153. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/token_flow.py +0 -0
  154. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal/token_flow.pyi +0 -0
  155. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal.egg-info/SOURCES.txt +0 -0
  156. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal.egg-info/dependency_links.txt +0 -0
  157. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal.egg-info/entry_points.txt +0 -0
  158. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal.egg-info/requires.txt +0 -0
  159. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal.egg-info/top_level.txt +0 -0
  160. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_docs/__init__.py +0 -0
  161. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_docs/gen_cli_docs.py +0 -0
  162. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_docs/gen_reference_docs.py +0 -0
  163. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_docs/mdmd/__init__.py +0 -0
  164. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_docs/mdmd/mdmd.py +0 -0
  165. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_docs/mdmd/signatures.py +0 -0
  166. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_proto/__init__.py +0 -0
  167. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_proto/api.proto +0 -0
  168. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_proto/api_grpc.py +0 -0
  169. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_proto/api_pb2.py +0 -0
  170. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_proto/api_pb2.pyi +0 -0
  171. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_proto/api_pb2_grpc.py +0 -0
  172. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_proto/api_pb2_grpc.pyi +0 -0
  173. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_proto/modal_api_grpc.py +0 -0
  174. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_proto/modal_options_grpc.py +0 -0
  175. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_proto/options.proto +0 -0
  176. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_proto/options_grpc.py +0 -0
  177. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_proto/options_pb2.py +0 -0
  178. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_proto/options_pb2.pyi +0 -0
  179. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_proto/options_pb2_grpc.py +0 -0
  180. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_proto/options_pb2_grpc.pyi +0 -0
  181. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_proto/py.typed +0 -0
  182. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/modal_version/__main__.py +0 -0
  183. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/pyproject.toml +0 -0
  184. {modal-1.0.3.dev25 → modal-1.0.3.dev27}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.3.dev25
3
+ Version: 1.0.3.dev27
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -265,12 +265,13 @@ async def rm(
265
265
  async def cp(
266
266
  volume_name: str,
267
267
  paths: list[str], # accepts multiple paths, last path is treated as destination path
268
+ recursive: bool = Option(False, "-r", "--recursive", help="Copy directories recursively"),
268
269
  env: Optional[str] = ENV_OPTION,
269
270
  ):
270
271
  ensure_env(env)
271
272
  volume = _Volume.from_name(volume_name, environment_name=env)
272
273
  *src_paths, dst_path = paths
273
- await volume.copy_files(src_paths, dst_path)
274
+ await volume.copy_files(src_paths, dst_path, recursive)
274
275
 
275
276
 
276
277
  @volume_cli.command(
@@ -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.dev25",
34
+ version: str = "1.0.3.dev27",
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.dev25",
97
+ version: str = "1.0.3.dev27",
98
98
  ): ...
99
99
  def is_closed(self) -> bool: ...
100
100
  @property
@@ -425,7 +425,7 @@ async def _map_helper(
425
425
  """
426
426
 
427
427
  raw_input_queue: Any = SynchronizedQueue() # type: ignore
428
- raw_input_queue.init()
428
+ await raw_input_queue.init.aio()
429
429
 
430
430
  async def feed_queue():
431
431
  async with aclosing(async_input_gen) as streamer:
@@ -498,7 +498,7 @@ class _Volume(_Object, type_prefix="vo"):
498
498
  await retry_transient_errors(self._client.stub.VolumeRemoveFile2, req)
499
499
 
500
500
  @live_method
501
- async def copy_files(self, src_paths: Sequence[str], dst_path: str) -> None:
501
+ async def copy_files(self, src_paths: Sequence[str], dst_path: str, recursive: bool = False) -> None:
502
502
  """
503
503
  Copy files within the volume from src_paths to dst_path.
504
504
  The semantics of the copy operation follow those of the UNIX cp command.
@@ -523,10 +523,17 @@ class _Volume(_Object, type_prefix="vo"):
523
523
  the volume mounted as a filesystem, e.g. when running a script on your local computer.
524
524
  """
525
525
  if self._is_v1:
526
- request = api_pb2.VolumeCopyFilesRequest(volume_id=self.object_id, src_paths=src_paths, dst_path=dst_path)
526
+ if recursive:
527
+ raise ValueError("`recursive` is not supported for V1 volumes")
528
+
529
+ request = api_pb2.VolumeCopyFilesRequest(
530
+ volume_id=self.object_id, src_paths=src_paths, dst_path=dst_path, recursive=recursive
531
+ )
527
532
  await retry_transient_errors(self._client.stub.VolumeCopyFiles, request, base_delay=1)
528
533
  else:
529
- request = api_pb2.VolumeCopyFiles2Request(volume_id=self.object_id, src_paths=src_paths, dst_path=dst_path)
534
+ request = api_pb2.VolumeCopyFiles2Request(
535
+ volume_id=self.object_id, src_paths=src_paths, dst_path=dst_path, recursive=recursive
536
+ )
530
537
  await retry_transient_errors(self._client.stub.VolumeCopyFiles2, request, base_delay=1)
531
538
 
532
539
  @live_method
@@ -94,7 +94,9 @@ class _Volume(modal._object._Object):
94
94
  progress_cb: typing.Optional[collections.abc.Callable[..., typing.Any]] = None,
95
95
  ) -> int: ...
96
96
  async def remove_file(self, path: str, recursive: bool = False) -> None: ...
97
- async def copy_files(self, src_paths: collections.abc.Sequence[str], dst_path: str) -> None: ...
97
+ async def copy_files(
98
+ self, src_paths: collections.abc.Sequence[str], dst_path: str, recursive: bool = False
99
+ ) -> None: ...
98
100
  async def batch_upload(self, force: bool = False) -> _AbstractVolumeUploadContextManager: ...
99
101
  async def _instance_delete(self): ...
100
102
  @staticmethod
@@ -253,8 +255,12 @@ class Volume(modal.object.Object):
253
255
  remove_file: __remove_file_spec[typing_extensions.Self]
254
256
 
255
257
  class __copy_files_spec(typing_extensions.Protocol[SUPERSELF]):
256
- def __call__(self, /, src_paths: collections.abc.Sequence[str], dst_path: str) -> None: ...
257
- async def aio(self, /, src_paths: collections.abc.Sequence[str], dst_path: str) -> None: ...
258
+ def __call__(
259
+ self, /, src_paths: collections.abc.Sequence[str], dst_path: str, recursive: bool = False
260
+ ) -> None: ...
261
+ async def aio(
262
+ self, /, src_paths: collections.abc.Sequence[str], dst_path: str, recursive: bool = False
263
+ ) -> None: ...
258
264
 
259
265
  copy_files: __copy_files_spec[typing_extensions.Self]
260
266
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.3.dev25
3
+ Version: 1.0.3.dev27
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.dev25"
4
+ __version__ = "1.0.3.dev27"
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