modal 1.4.3.dev20__tar.gz → 1.4.3.dev21__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 (213) hide show
  1. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/PKG-INFO +1 -1
  2. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/docker_utils.py +10 -1
  3. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/environment.py +2 -1
  4. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/client.pyi +2 -2
  5. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/image.py +29 -1
  6. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/image.pyi +54 -0
  7. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal.egg-info/PKG-INFO +1 -1
  8. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/api_pb2.py +600 -600
  9. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/api_pb2.pyi +4 -1
  10. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_version/__init__.py +1 -1
  11. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/pyproject.toml +5 -0
  12. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/LICENSE +0 -0
  13. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/README.md +0 -0
  14. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/__init__.py +0 -0
  15. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/__main__.py +0 -0
  16. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_billing.py +0 -0
  17. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_clustered_functions.py +0 -0
  18. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_clustered_functions.pyi +0 -0
  19. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_container_entrypoint.py +0 -0
  20. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_environments.py +0 -0
  21. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_functions.py +0 -0
  22. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_grpc_client.py +0 -0
  23. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_ipython.py +0 -0
  24. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_load_context.py +0 -0
  25. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_location.py +0 -0
  26. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_logs.py +0 -0
  27. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_object.py +0 -0
  28. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_output/__init__.py +0 -0
  29. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_output/manager.py +0 -0
  30. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_output/pty.py +0 -0
  31. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_output/rich.py +0 -0
  32. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_output/status.py +0 -0
  33. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_partial_function.py +0 -0
  34. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_resolver.py +0 -0
  35. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_resources.py +0 -0
  36. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/__init__.py +0 -0
  37. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/asgi.py +0 -0
  38. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/container_io_manager.py +0 -0
  39. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/container_io_manager.pyi +0 -0
  40. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/execution_context.py +0 -0
  41. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/execution_context.pyi +0 -0
  42. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  43. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/telemetry.py +0 -0
  44. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/user_code_event_loop.py +0 -0
  45. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/user_code_imports.py +0 -0
  46. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_serialization.py +0 -0
  47. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_server.py +0 -0
  48. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_traceback.py +0 -0
  49. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_tunnel.py +0 -0
  50. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_tunnel.pyi +0 -0
  51. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_type_manager.py +0 -0
  52. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/__init__.py +0 -0
  53. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/app_utils.py +0 -0
  54. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/async_utils.py +0 -0
  55. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/auth_token_manager.py +0 -0
  56. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/blob_utils.py +0 -0
  57. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/browser_utils.py +0 -0
  58. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/bytes_io_segment_payload.py +0 -0
  59. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/deprecation.py +0 -0
  60. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/function_utils.py +0 -0
  61. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/git_utils.py +0 -0
  62. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/grpc_testing.py +0 -0
  63. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/grpc_utils.py +0 -0
  64. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/hash_utils.py +0 -0
  65. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/http_utils.py +0 -0
  66. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/jwt_utils.py +0 -0
  67. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/logger.py +0 -0
  68. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/mount_utils.py +0 -0
  69. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/name_utils.py +0 -0
  70. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/package_utils.py +0 -0
  71. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/pattern_utils.py +0 -0
  72. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/rand_pb_testing.py +0 -0
  73. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/sandbox_fs_utils.py +0 -0
  74. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/shell_utils.py +0 -0
  75. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/task_command_router_client.py +0 -0
  76. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/time_utils.py +0 -0
  77. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_vendor/__init__.py +0 -0
  78. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  79. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_vendor/cloudpickle.py +0 -0
  80. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_vendor/tblib.py +0 -0
  81. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_vendor/version.py +0 -0
  82. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_watcher.py +0 -0
  83. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/app.py +0 -0
  84. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/app.pyi +0 -0
  85. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/billing.py +0 -0
  86. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/builder/2023.12.312.txt +0 -0
  87. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/builder/2023.12.txt +0 -0
  88. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/builder/2024.04.txt +0 -0
  89. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/builder/2024.10.txt +0 -0
  90. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/builder/2025.06.txt +0 -0
  91. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/builder/PREVIEW.txt +0 -0
  92. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/builder/README.md +0 -0
  93. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/builder/base-images.json +0 -0
  94. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/call_graph.py +0 -0
  95. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/__init__.py +0 -0
  96. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/_download.py +0 -0
  97. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/_help.py +0 -0
  98. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/_traceback.py +0 -0
  99. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/app.py +0 -0
  100. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/billing.py +0 -0
  101. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/bootstrap.py +0 -0
  102. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/changelog.py +0 -0
  103. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/cluster.py +0 -0
  104. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/config.py +0 -0
  105. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/container.py +0 -0
  106. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/dashboard.py +0 -0
  107. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/dict.py +0 -0
  108. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/entry_point.py +0 -0
  109. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/import_refs.py +0 -0
  110. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/launch.py +0 -0
  111. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/logo.py +0 -0
  112. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/network_file_system.py +0 -0
  113. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/profile.py +0 -0
  114. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/programs/__init__.py +0 -0
  115. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/programs/run_jupyter.py +0 -0
  116. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/programs/vscode.py +0 -0
  117. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/queues.py +0 -0
  118. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/run.py +0 -0
  119. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/secret.py +0 -0
  120. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/selector.py +0 -0
  121. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/shell.py +0 -0
  122. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/token.py +0 -0
  123. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/utils.py +0 -0
  124. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/volume.py +0 -0
  125. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/client.py +0 -0
  126. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cloud_bucket_mount.py +0 -0
  127. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cloud_bucket_mount.pyi +0 -0
  128. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cls.py +0 -0
  129. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cls.pyi +0 -0
  130. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/config.py +0 -0
  131. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/container_process.py +0 -0
  132. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/container_process.pyi +0 -0
  133. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/dict.py +0 -0
  134. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/dict.pyi +0 -0
  135. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/environments.py +0 -0
  136. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/environments.pyi +0 -0
  137. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/exception.py +0 -0
  138. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/experimental/__init__.py +0 -0
  139. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/experimental/flash.py +0 -0
  140. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/experimental/flash.pyi +0 -0
  141. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/experimental/ipython.py +0 -0
  142. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/file_io.py +0 -0
  143. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/file_io.pyi +0 -0
  144. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/file_pattern_matcher.py +0 -0
  145. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/functions.py +0 -0
  146. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/functions.pyi +0 -0
  147. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/io_streams.py +0 -0
  148. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/io_streams.pyi +0 -0
  149. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/mount.py +0 -0
  150. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/mount.pyi +0 -0
  151. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/network_file_system.py +0 -0
  152. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/network_file_system.pyi +0 -0
  153. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/object.py +0 -0
  154. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/object.pyi +0 -0
  155. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/output.py +0 -0
  156. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/parallel_map.py +0 -0
  157. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/parallel_map.pyi +0 -0
  158. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/partial_function.py +0 -0
  159. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/partial_function.pyi +0 -0
  160. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/proxy.py +0 -0
  161. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/proxy.pyi +0 -0
  162. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/py.typed +0 -0
  163. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/queue.py +0 -0
  164. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/queue.pyi +0 -0
  165. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/retries.py +0 -0
  166. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/runner.py +0 -0
  167. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/runner.pyi +0 -0
  168. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/running_app.py +0 -0
  169. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/sandbox.py +0 -0
  170. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/sandbox.pyi +0 -0
  171. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/sandbox_fs.py +0 -0
  172. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/sandbox_fs.pyi +0 -0
  173. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/schedule.py +0 -0
  174. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/scheduler_placement.py +0 -0
  175. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/secret.py +0 -0
  176. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/secret.pyi +0 -0
  177. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/server.py +0 -0
  178. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/server.pyi +0 -0
  179. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/serving.py +0 -0
  180. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/serving.pyi +0 -0
  181. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/snapshot.py +0 -0
  182. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/snapshot.pyi +0 -0
  183. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/stream_type.py +0 -0
  184. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/token_flow.py +0 -0
  185. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/token_flow.pyi +0 -0
  186. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/volume.py +0 -0
  187. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/volume.pyi +0 -0
  188. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal.egg-info/SOURCES.txt +0 -0
  189. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal.egg-info/dependency_links.txt +0 -0
  190. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal.egg-info/entry_points.txt +0 -0
  191. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal.egg-info/requires.txt +0 -0
  192. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal.egg-info/top_level.txt +0 -0
  193. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_docs/__init__.py +0 -0
  194. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_docs/gen_cli_docs.py +0 -0
  195. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_docs/gen_cli_docs_main.py +0 -0
  196. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_docs/gen_reference_docs.py +0 -0
  197. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_docs/gen_reference_docs_main.py +0 -0
  198. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_docs/mdmd/__init__.py +0 -0
  199. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_docs/mdmd/mdmd.py +0 -0
  200. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_docs/mdmd/signatures.py +0 -0
  201. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/__init__.py +0 -0
  202. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/api_grpc.py +0 -0
  203. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/api_pb2_grpc.py +0 -0
  204. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/api_pb2_grpc.pyi +0 -0
  205. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/modal_api_grpc.py +0 -0
  206. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/py.typed +0 -0
  207. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/task_command_router_grpc.py +0 -0
  208. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/task_command_router_pb2.py +0 -0
  209. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/task_command_router_pb2.pyi +0 -0
  210. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  211. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  212. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_version/__main__.py +0 -0
  213. {modal-1.4.3.dev20 → modal-1.4.3.dev21}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.4.3.dev20
3
+ Version: 1.4.3.dev21
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -40,10 +40,19 @@ def extract_copy_command_patterns(dockerfile_lines: Sequence[str]) -> list[str]:
40
40
 
41
41
  # COPY --from=... commands reference external sources and do not need a context mount.
42
42
  # https://docs.docker.com/reference/dockerfile/#copy---from
43
- if parts[0].startswith("--from="):
43
+ if any(p.startswith("--from=") for p in parts):
44
44
  current_command = ""
45
45
  continue
46
46
 
47
+ # Strip known COPY flags (--chmod, --chown, --link) before processing sources.
48
+ known_flag_prefixes = ("--chmod=", "--chown=", "--link=")
49
+ parts = [
50
+ p
51
+ for p in parts
52
+ # link has a special handling - it can be "--link" or like "--link=true"
53
+ if p != "--link" and not any(p.startswith(prefix) for prefix in known_flag_prefixes)
54
+ ]
55
+
47
56
  if len(parts) >= 2:
48
57
  # Last part is destination, everything else is a mount source
49
58
  sources = parts[:-1]
@@ -67,7 +67,8 @@ def list_(json: bool = False):
67
67
  def create(name: str, restricted: bool = False):
68
68
  check_environment_name(name)
69
69
  Environment.objects.create(name, restricted=restricted)
70
- rich.print(f"[green]✓[/green] Environment created: {name}")
70
+ prefix = "Restricted " if restricted else ""
71
+ rich.print(f"[green]✓[/green] {prefix}Environment created: {name}")
71
72
 
72
73
 
73
74
  ENVIRONMENT_DELETE_HELP = """Delete an environment in the current workspace.
@@ -35,7 +35,7 @@ class _Client:
35
35
  server_url: str,
36
36
  client_type: int,
37
37
  credentials: typing.Optional[tuple[str, str]],
38
- version: str = "1.4.3.dev20",
38
+ version: str = "1.4.3.dev21",
39
39
  ):
40
40
  """mdmd:hidden
41
41
  The Modal client object is not intended to be instantiated directly by users.
@@ -175,7 +175,7 @@ class Client:
175
175
  server_url: str,
176
176
  client_type: int,
177
177
  credentials: typing.Optional[tuple[str, str]],
178
- version: str = "1.4.3.dev20",
178
+ version: str = "1.4.3.dev21",
179
179
  ):
180
180
  """mdmd:hidden
181
181
  The Modal client object is not intended to be instantiated directly by users.
@@ -24,7 +24,7 @@ from typing import (
24
24
  import typing_extensions
25
25
  from google.protobuf.message import Message
26
26
  from grpclib.exceptions import StreamTerminatedError
27
- from typing_extensions import Self
27
+ from typing_extensions import Concatenate, Self
28
28
 
29
29
  from modal._serialization import serialize_data_format
30
30
  from modal_proto import api_pb2
@@ -101,6 +101,8 @@ Use {replacement} instead, which is functionally and performance-wise equivalent
101
101
  See https://modal.com/docs/guide/modal-1-0-migration for more details.
102
102
  """
103
103
 
104
+ P = typing_extensions.ParamSpec("P")
105
+
104
106
 
105
107
  def _validate_python_version(
106
108
  python_version: Optional[str],
@@ -2480,6 +2482,32 @@ class _Image(_Object, type_prefix="im"):
2480
2482
 
2481
2483
  return self.dockerfile_commands(dockerfile_cmd)
2482
2484
 
2485
+ def pipe(
2486
+ self,
2487
+ func: Callable[Concatenate["_Image", P], "_Image"],
2488
+ *args: P.args,
2489
+ **kwargs: P.kwargs,
2490
+ ) -> "_Image":
2491
+ """Apply a local function to expand the Image recipe.
2492
+
2493
+ This method can be useful for defining reusable Image build
2494
+ recipes that compose well with the fluent Image builder interface.
2495
+
2496
+ **Example**
2497
+
2498
+ ```python
2499
+ def workspace_setup(image: modal.Image, repo: str) -> modal.Image:
2500
+ return image.run_commands(f"git clone {repo}").uv_pip_install(".")
2501
+
2502
+ image = (
2503
+ modal.Image.debian_slim()
2504
+ .apt_install("git")
2505
+ .pipe(workspace_setup, "https://github.com/example/repo.git")
2506
+ )
2507
+ ```
2508
+ """
2509
+ return func(self, *args, **kwargs)
2510
+
2483
2511
  # Live handle methods
2484
2512
 
2485
2513
  @contextlib.contextmanager
@@ -29,6 +29,8 @@ class _AutoDockerIgnoreSentinel:
29
29
 
30
30
  AUTO_DOCKERIGNORE: _AutoDockerIgnoreSentinel
31
31
 
32
+ P = typing_extensions.ParamSpec("P")
33
+
32
34
  def _validate_python_version(
33
35
  python_version: typing.Optional[str],
34
36
  builder_version: typing.Literal["2023.12", "2024.04", "2024.10", "2025.06", "PREVIEW"],
@@ -1041,6 +1043,32 @@ class _Image(modal._object._Object):
1041
1043
  """
1042
1044
  ...
1043
1045
 
1046
+ def pipe(
1047
+ self,
1048
+ func: collections.abc.Callable[typing_extensions.Concatenate[_Image, P], _Image],
1049
+ *args: P.args,
1050
+ **kwargs: P.kwargs,
1051
+ ) -> _Image:
1052
+ """Apply a local function to expand the Image recipe.
1053
+
1054
+ This method can be useful for defining reusable Image build
1055
+ recipes that compose well with the fluent Image builder interface.
1056
+
1057
+ **Example**
1058
+
1059
+ ```python
1060
+ def workspace_setup(image: modal.Image, repo: str) -> modal.Image:
1061
+ return image.run_commands(f"git clone {repo}").uv_pip_install(".")
1062
+
1063
+ image = (
1064
+ modal.Image.debian_slim()
1065
+ .apt_install("git")
1066
+ .pipe(workspace_setup, "https://github.com/example/repo.git")
1067
+ )
1068
+ ```
1069
+ """
1070
+ ...
1071
+
1044
1072
  def imports(self):
1045
1073
  """Used to import packages in global scope that are only available when running remotely.
1046
1074
  By using this context manager you can avoid an `ImportError` due to not having certain
@@ -2038,6 +2066,32 @@ class Image(modal.object.Object):
2038
2066
  """
2039
2067
  ...
2040
2068
 
2069
+ def pipe(
2070
+ self,
2071
+ func: collections.abc.Callable[typing_extensions.Concatenate[Image, P], Image],
2072
+ *args: P.args,
2073
+ **kwargs: P.kwargs,
2074
+ ) -> Image:
2075
+ """Apply a local function to expand the Image recipe.
2076
+
2077
+ This method can be useful for defining reusable Image build
2078
+ recipes that compose well with the fluent Image builder interface.
2079
+
2080
+ **Example**
2081
+
2082
+ ```python
2083
+ def workspace_setup(image: modal.Image, repo: str) -> modal.Image:
2084
+ return image.run_commands(f"git clone {repo}").uv_pip_install(".")
2085
+
2086
+ image = (
2087
+ modal.Image.debian_slim()
2088
+ .apt_install("git")
2089
+ .pipe(workspace_setup, "https://github.com/example/repo.git")
2090
+ )
2091
+ ```
2092
+ """
2093
+ ...
2094
+
2041
2095
  def imports(self):
2042
2096
  """Used to import packages in global scope that are only available when running remotely.
2043
2097
  By using this context manager you can avoid an `ImportError` due to not having certain
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.4.3.dev20
3
+ Version: 1.4.3.dev21
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0