modal 1.5.2.dev5__tar.gz → 1.5.2.dev7__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 (230) hide show
  1. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/PKG-INFO +1 -1
  2. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/image.py +97 -0
  3. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/client.pyi +2 -2
  4. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/sandbox.py +0 -1
  5. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal.egg-info/PKG-INFO +1 -1
  6. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_docs/mdmd/mdmd.py +4 -2
  7. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_proto/api_grpc.py +48 -0
  8. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_proto/api_pb2.py +998 -958
  9. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_proto/api_pb2.pyi +64 -1
  10. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_proto/api_pb2_grpc.py +99 -0
  11. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_proto/api_pb2_grpc.pyi +30 -0
  12. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_proto/modal_api_grpc.py +3 -0
  13. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_version/__init__.py +1 -1
  14. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/LICENSE +0 -0
  15. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/README.md +0 -0
  16. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/__init__.py +0 -0
  17. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/__main__.py +0 -0
  18. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_billing.py +0 -0
  19. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_clustered_functions.py +0 -0
  20. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_clustered_functions.pyi +0 -0
  21. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_container_entrypoint.py +0 -0
  22. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_environments.py +0 -0
  23. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_function_variants.py +0 -0
  24. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_functions.py +0 -0
  25. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_grpc_client.py +0 -0
  26. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_image.py +0 -0
  27. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_ipython.py +0 -0
  28. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_load_context.py +0 -0
  29. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_location.py +0 -0
  30. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_logs.py +0 -0
  31. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_object.py +0 -0
  32. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_output/__init__.py +0 -0
  33. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_output/manager.py +0 -0
  34. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_output/pty.py +0 -0
  35. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_output/rich.py +0 -0
  36. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_output/status.py +0 -0
  37. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_partial_function.py +0 -0
  38. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_resolver.py +0 -0
  39. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_resources.py +0 -0
  40. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_runtime/__init__.py +0 -0
  41. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_runtime/asgi.py +0 -0
  42. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_runtime/container_io_manager.py +0 -0
  43. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_runtime/container_io_manager.pyi +0 -0
  44. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_runtime/execution_context.py +0 -0
  45. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_runtime/execution_context.pyi +0 -0
  46. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  47. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_runtime/task_lifecycle_manager.py +0 -0
  48. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  49. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_runtime/telemetry.py +0 -0
  50. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_runtime/user_code_event_loop.py +0 -0
  51. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_runtime/user_code_imports.py +0 -0
  52. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_serialization.py +0 -0
  53. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_server.py +0 -0
  54. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_traceback.py +0 -0
  55. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_tunnel.py +0 -0
  56. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_tunnel.pyi +0 -0
  57. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_type_manager.py +0 -0
  58. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/__init__.py +0 -0
  59. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/app_utils.py +0 -0
  60. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/async_utils.py +0 -0
  61. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/auth_token_manager.py +0 -0
  62. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/blob_utils.py +0 -0
  63. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/browser_utils.py +0 -0
  64. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/bytes_io_segment_payload.py +0 -0
  65. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/curl_utils.py +0 -0
  66. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/deprecation.py +0 -0
  67. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/docker_utils.py +0 -0
  68. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/function_utils.py +0 -0
  69. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/git_utils.py +0 -0
  70. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/grpc_testing.py +0 -0
  71. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/grpc_utils.py +0 -0
  72. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/hash_utils.py +0 -0
  73. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/http_utils.py +0 -0
  74. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/jwt_utils.py +0 -0
  75. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/logger.py +0 -0
  76. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/mount_utils.py +0 -0
  77. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/name_utils.py +0 -0
  78. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/package_utils.py +0 -0
  79. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/pattern_utils.py +0 -0
  80. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/proxy_support.py +0 -0
  81. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/rand_pb_testing.py +0 -0
  82. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/sandbox_fs_utils.py +0 -0
  83. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/shell_utils.py +0 -0
  84. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/task_command_router_client.py +0 -0
  85. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_utils/time_utils.py +0 -0
  86. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_vendor/__init__.py +0 -0
  87. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  88. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_vendor/cloudpickle.py +0 -0
  89. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_vendor/tblib.py +0 -0
  90. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_vendor/version.py +0 -0
  91. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_watcher.py +0 -0
  92. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/_workspace.py +0 -0
  93. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/app.py +0 -0
  94. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/app.pyi +0 -0
  95. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/billing.py +0 -0
  96. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/billing.pyi +0 -0
  97. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/builder/2023.12.312.txt +0 -0
  98. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/builder/2023.12.txt +0 -0
  99. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/builder/2024.04.txt +0 -0
  100. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/builder/2024.10.txt +0 -0
  101. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/builder/2025.06.txt +0 -0
  102. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/builder/PREVIEW.txt +0 -0
  103. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/builder/README.md +0 -0
  104. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/builder/base-images.json +0 -0
  105. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/call_graph.py +0 -0
  106. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/__init__.py +0 -0
  107. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/_download.py +0 -0
  108. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/_help.py +0 -0
  109. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/_traceback.py +0 -0
  110. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/app.py +0 -0
  111. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/billing.py +0 -0
  112. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/bootstrap.py +0 -0
  113. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/changelog.py +0 -0
  114. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/cluster.py +0 -0
  115. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/config.py +0 -0
  116. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/container.py +0 -0
  117. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/curl.py +0 -0
  118. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/dashboard.py +0 -0
  119. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/dict.py +0 -0
  120. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/endpoint.py +0 -0
  121. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/entry_point.py +0 -0
  122. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/environment.py +0 -0
  123. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/import_refs.py +0 -0
  124. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/launch.py +0 -0
  125. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/logo.py +0 -0
  126. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/network_file_system.py +0 -0
  127. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/profile.py +0 -0
  128. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/programs/__init__.py +0 -0
  129. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/programs/run_jupyter.py +0 -0
  130. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/programs/vscode.py +0 -0
  131. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/queues.py +0 -0
  132. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/run.py +0 -0
  133. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/secret.py +0 -0
  134. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/selector.py +0 -0
  135. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/shell.py +0 -0
  136. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/skills.py +0 -0
  137. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/token.py +0 -0
  138. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/utils.py +0 -0
  139. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/volume.py +0 -0
  140. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cli/workspace.py +0 -0
  141. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/client.py +0 -0
  142. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cloud_bucket_mount.py +0 -0
  143. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cloud_bucket_mount.pyi +0 -0
  144. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cls.py +0 -0
  145. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/cls.pyi +0 -0
  146. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/config.py +0 -0
  147. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/container_process.py +0 -0
  148. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/container_process.pyi +0 -0
  149. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/dict.py +0 -0
  150. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/dict.pyi +0 -0
  151. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/environments.py +0 -0
  152. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/environments.pyi +0 -0
  153. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/exception.py +0 -0
  154. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/experimental/__init__.py +0 -0
  155. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/experimental/flash.py +0 -0
  156. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/experimental/flash.pyi +0 -0
  157. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/experimental/ipython.py +0 -0
  158. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/file_io.py +0 -0
  159. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/file_io.pyi +0 -0
  160. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/file_pattern_matcher.py +0 -0
  161. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/functions.py +0 -0
  162. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/functions.pyi +0 -0
  163. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/image.py +0 -0
  164. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/image.pyi +0 -0
  165. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/io_streams.py +0 -0
  166. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/io_streams.pyi +0 -0
  167. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/mount.py +0 -0
  168. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/mount.pyi +0 -0
  169. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/network_file_system.py +0 -0
  170. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/network_file_system.pyi +0 -0
  171. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/object.py +0 -0
  172. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/object.pyi +0 -0
  173. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/output.py +0 -0
  174. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/parallel_map.py +0 -0
  175. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/parallel_map.pyi +0 -0
  176. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/partial_function.py +0 -0
  177. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/partial_function.pyi +0 -0
  178. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/proxy.py +0 -0
  179. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/proxy.pyi +0 -0
  180. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/py.typed +0 -0
  181. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/queue.py +0 -0
  182. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/queue.pyi +0 -0
  183. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/retries.py +0 -0
  184. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/runner.py +0 -0
  185. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/runner.pyi +0 -0
  186. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/running_app.py +0 -0
  187. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/sandbox.pyi +0 -0
  188. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/sandbox_fs.py +0 -0
  189. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/sandbox_fs.pyi +0 -0
  190. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/schedule.py +0 -0
  191. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/scheduler_placement.py +0 -0
  192. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/secret.py +0 -0
  193. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/secret.pyi +0 -0
  194. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/server.py +0 -0
  195. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/server.pyi +0 -0
  196. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/serving.py +0 -0
  197. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/serving.pyi +0 -0
  198. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/skills/modal/SKILL.md +0 -0
  199. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/snapshot.py +0 -0
  200. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/snapshot.pyi +0 -0
  201. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/stream_type.py +0 -0
  202. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/token_flow.py +0 -0
  203. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/token_flow.pyi +0 -0
  204. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/volume.py +0 -0
  205. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/volume.pyi +0 -0
  206. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/workspace.py +0 -0
  207. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal/workspace.pyi +0 -0
  208. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal.egg-info/SOURCES.txt +0 -0
  209. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal.egg-info/dependency_links.txt +0 -0
  210. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal.egg-info/entry_points.txt +0 -0
  211. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal.egg-info/requires.txt +0 -0
  212. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal.egg-info/top_level.txt +0 -0
  213. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_docs/__init__.py +0 -0
  214. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_docs/gen_cli_docs.py +0 -0
  215. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_docs/gen_cli_docs_main.py +0 -0
  216. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_docs/gen_reference_docs.py +0 -0
  217. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_docs/gen_reference_docs_main.py +0 -0
  218. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_docs/mdmd/__init__.py +0 -0
  219. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_docs/mdmd/signatures.py +0 -0
  220. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_docs/mdmd/types.py +0 -0
  221. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_proto/__init__.py +0 -0
  222. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_proto/py.typed +0 -0
  223. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_proto/task_command_router_grpc.py +0 -0
  224. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_proto/task_command_router_pb2.py +0 -0
  225. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_proto/task_command_router_pb2.pyi +0 -0
  226. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  227. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  228. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/modal_version/__main__.py +0 -0
  229. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/pyproject.toml +0 -0
  230. {modal-1.5.2.dev5 → modal-1.5.2.dev7}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.2.dev5
3
+ Version: 1.5.2.dev7
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -10,10 +10,12 @@ from typing import Optional
10
10
  import click
11
11
 
12
12
  from modal._environments import ensure_env
13
+ from modal._image import _parse_named_image_ref
13
14
  from modal._utils.async_utils import synchronizer
14
15
  from modal._utils.time_utils import timestamp_to_localized_str
15
16
  from modal.cli.utils import display_table, env_option
16
17
  from modal.client import _Client
18
+ from modal.exception import InvalidError
17
19
  from modal.output import OutputManager
18
20
  from modal_proto import api_pb2
19
21
 
@@ -21,6 +23,8 @@ from ._help import ModalGroup
21
23
 
22
24
  IMAGE_NAMES_LIST_PAGE_SIZE = 100
23
25
  IMAGE_NAMES_LIST_PAGE_DELAY_SECONDS = 1.0
26
+ IMAGE_NAMES_HISTORY_PAGE_SIZE = 100
27
+ IMAGE_NAMES_HISTORY_PAGE_DELAY_SECONDS = 1.0
24
28
 
25
29
  image_cli = ModalGroup(name="image", help="Manage Images.")
26
30
  image_names_cli = ModalGroup(name="names", help="Manage Modal Image names.")
@@ -49,6 +53,20 @@ def _tag_item_row(item: api_pb2.ImageListTagsItem) -> tuple[str, str, str]:
49
53
  )
50
54
 
51
55
 
56
+ def _history_item_json(item: api_pb2.ImageTagRevisionsItem) -> dict[str, str]:
57
+ return {
58
+ "image_id": item.image_id,
59
+ "published_at": timestamp_to_localized_str(item.created_at, True) or "-",
60
+ }
61
+
62
+
63
+ def _history_item_row(item: api_pb2.ImageTagRevisionsItem) -> tuple[str, str]:
64
+ return (
65
+ item.image_id,
66
+ timestamp_to_localized_str(item.created_at, False) or "-",
67
+ )
68
+
69
+
52
70
  async def _iter_tag_pages(
53
71
  client: _Client, env: str, prefix: str
54
72
  ) -> AsyncIterator[tuple[str, list[api_pb2.ImageListTagsItem]]]:
@@ -73,6 +91,36 @@ async def _iter_tag_pages(
73
91
  await asyncio.sleep(IMAGE_NAMES_LIST_PAGE_DELAY_SECONDS)
74
92
 
75
93
 
94
+ async def _fetch_history_page(
95
+ client: _Client,
96
+ env: str,
97
+ tag: str,
98
+ page_token: str,
99
+ ) -> api_pb2.ImageTagRevisionsResponse:
100
+ return await client.stub.ImageTagRevisions(
101
+ api_pb2.ImageTagRevisionsRequest(
102
+ tag=tag,
103
+ environment_name=env,
104
+ max_objects=IMAGE_NAMES_HISTORY_PAGE_SIZE,
105
+ page_token=page_token,
106
+ )
107
+ )
108
+
109
+
110
+ async def _iter_history_pages(
111
+ client: _Client, env: str, tag: str, first_page: api_pb2.ImageTagRevisionsResponse
112
+ ) -> AsyncIterator[api_pb2.ImageTagRevisionsResponse]:
113
+ response = first_page
114
+
115
+ while True:
116
+ yield response
117
+
118
+ if not response.next_page_token:
119
+ return
120
+ await asyncio.sleep(IMAGE_NAMES_HISTORY_PAGE_DELAY_SECONDS)
121
+ response = await _fetch_history_page(client, env, tag, response.next_page_token)
122
+
123
+
76
124
  @image_names_cli.command("list", help="List named Images.")
77
125
  @env_option
78
126
  @click.option("--prefix", default="", help="Only include named image tags that start with this prefix.")
@@ -108,3 +156,52 @@ async def list_(
108
156
  count += len(page_items)
109
157
 
110
158
  _print_result_summary(count)
159
+
160
+
161
+ @image_names_cli.command("history", help="Show publishing history for a named Image.", hidden=True)
162
+ @click.argument("name")
163
+ @env_option
164
+ @click.option("--json", is_flag=True, default=False)
165
+ @synchronizer.create_blocking
166
+ async def history(
167
+ name: str,
168
+ env: Optional[str] = None,
169
+ json: bool = False,
170
+ ):
171
+ env = ensure_env(env)
172
+ try:
173
+ name_tag = _parse_named_image_ref(name)
174
+ except InvalidError as exc:
175
+ raise click.UsageError(str(exc)) from exc
176
+ client = await _Client.from_env()
177
+
178
+ first_page = await _fetch_history_page(client, env, name_tag, "")
179
+ if not first_page.items:
180
+ raise click.ClickException(f"No publishing history found for named image {first_page.tag!r}.")
181
+
182
+ if json:
183
+ click.echo("[", nl=False)
184
+ count = 0
185
+ async for response in _iter_history_pages(client, env, name_tag, first_page):
186
+ for item in response.items:
187
+ if count:
188
+ click.echo(",", nl=False)
189
+ click.echo(json_module.dumps(_history_item_json(item)), nl=False)
190
+ count += 1
191
+ click.echo("]")
192
+ return
193
+
194
+ count = 0
195
+ show_title = True
196
+ async for response in _iter_history_pages(client, env, name_tag, first_page):
197
+ if response.items:
198
+ title = f"History for {response.tag}" if show_title else ""
199
+ display_table(
200
+ ["Image ID", "Published at"],
201
+ [_history_item_row(item) for item in response.items],
202
+ title=title,
203
+ )
204
+ show_title = False
205
+ count += len(response.items)
206
+
207
+ _print_result_summary(count)
@@ -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.5.2.dev5",
38
+ version: str = "1.5.2.dev7",
39
39
  ):
40
40
  """mdmd:hidden
41
41
  The Modal client object is not intended to be instantiated directly by users.
@@ -205,7 +205,7 @@ class Client:
205
205
  server_url: str,
206
206
  client_type: int,
207
207
  credentials: typing.Optional[tuple[str, str]],
208
- version: str = "1.5.2.dev5",
208
+ version: str = "1.5.2.dev7",
209
209
  ):
210
210
  """mdmd:hidden
211
211
  The Modal client object is not intended to be instantiated directly by users.
@@ -1284,7 +1284,6 @@ class _Sandbox(_Object, type_prefix="sb"):
1284
1284
  outbound_domain_allowlist: List of domain names the Sandbox is allowed to access. Supports
1285
1285
  wildcard prefixes (``*.``); a bare ``"*"`` allows all domains.
1286
1286
  """
1287
- self._ensure_v1("_experimental_set_outbound_network_policy")
1288
1287
  task_id = await self._get_task_id()
1289
1288
  command_router_client = await self._get_command_router_client(task_id)
1290
1289
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.2.dev5
3
+ Version: 1.5.2.dev7
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -3,9 +3,9 @@
3
3
 
4
4
  import html
5
5
  import inspect
6
+ import logging
6
7
  import re
7
8
  import typing
8
- import warnings
9
9
  from collections.abc import Callable
10
10
  from enum import Enum, EnumMeta
11
11
  from types import ModuleType
@@ -15,6 +15,8 @@ import synchronicity.synchronizer
15
15
  from .signatures import get_signature, parse_params_from_signature, strip_signature
16
16
  from .types import ParsedDoc, ParsedParam, ParsedRaise
17
17
 
18
+ logger = logging.getLogger(__name__)
19
+
18
20
 
19
21
  def _escape_svelte_html_attr(value: str) -> str:
20
22
  """Escape text for double-quoted HTML / Svelte component attributes.
@@ -475,7 +477,7 @@ def module_str(header, module, title_level="#", filter_items: Callable[[ModuleTy
475
477
  object_docs.append(f"{member_title_level} {qual_name}\n\n")
476
478
  object_docs.append(item_doc)
477
479
  else:
478
- warnings.warn(f"Not sure how to document: {name} ({item}")
480
+ logger.warning(f"[mdmd] Not sure how to document {name} ({item.__class__.__name__})")
479
481
 
480
482
  if object_docs:
481
483
  return "".join(header + object_docs)
@@ -891,6 +891,18 @@ class ModalClientBase(abc.ABC):
891
891
  async def WorkspaceNameLookup(self, stream: 'grpclib.server.Stream[google.protobuf.empty_pb2.Empty, modal_proto.api_pb2.WorkspaceNameLookupResponse]') -> None:
892
892
  pass
893
893
 
894
+ @abc.abstractmethod
895
+ async def WorkspaceSetDefaultEnvironment(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.WorkspaceSetDefaultEnvironmentRequest, google.protobuf.empty_pb2.Empty]') -> None:
896
+ pass
897
+
898
+ @abc.abstractmethod
899
+ async def WorkspaceSetImageBuilderVersion(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.WorkspaceSetImageBuilderVersionRequest, modal_proto.api_pb2.WorkspaceSetImageBuilderVersionResponse]') -> None:
900
+ pass
901
+
902
+ @abc.abstractmethod
903
+ async def WorkspaceSettings(self, stream: 'grpclib.server.Stream[google.protobuf.empty_pb2.Empty, modal_proto.api_pb2.WorkspaceSettingsResponse]') -> None:
904
+ pass
905
+
894
906
  def __mapping__(self) -> typing.Dict[str, grpclib.const.Handler]:
895
907
  return {
896
908
  '/modal.client.ModalClient/AppClientDisconnect': grpclib.const.Handler(
@@ -2201,6 +2213,24 @@ class ModalClientBase(abc.ABC):
2201
2213
  google.protobuf.empty_pb2.Empty,
2202
2214
  modal_proto.api_pb2.WorkspaceNameLookupResponse,
2203
2215
  ),
2216
+ '/modal.client.ModalClient/WorkspaceSetDefaultEnvironment': grpclib.const.Handler(
2217
+ self.WorkspaceSetDefaultEnvironment,
2218
+ grpclib.const.Cardinality.UNARY_UNARY,
2219
+ modal_proto.api_pb2.WorkspaceSetDefaultEnvironmentRequest,
2220
+ google.protobuf.empty_pb2.Empty,
2221
+ ),
2222
+ '/modal.client.ModalClient/WorkspaceSetImageBuilderVersion': grpclib.const.Handler(
2223
+ self.WorkspaceSetImageBuilderVersion,
2224
+ grpclib.const.Cardinality.UNARY_UNARY,
2225
+ modal_proto.api_pb2.WorkspaceSetImageBuilderVersionRequest,
2226
+ modal_proto.api_pb2.WorkspaceSetImageBuilderVersionResponse,
2227
+ ),
2228
+ '/modal.client.ModalClient/WorkspaceSettings': grpclib.const.Handler(
2229
+ self.WorkspaceSettings,
2230
+ grpclib.const.Cardinality.UNARY_UNARY,
2231
+ google.protobuf.empty_pb2.Empty,
2232
+ modal_proto.api_pb2.WorkspaceSettingsResponse,
2233
+ ),
2204
2234
  }
2205
2235
 
2206
2236
 
@@ -3515,3 +3545,21 @@ class ModalClientStub:
3515
3545
  google.protobuf.empty_pb2.Empty,
3516
3546
  modal_proto.api_pb2.WorkspaceNameLookupResponse,
3517
3547
  )
3548
+ self.WorkspaceSetDefaultEnvironment = grpclib.client.UnaryUnaryMethod(
3549
+ channel,
3550
+ '/modal.client.ModalClient/WorkspaceSetDefaultEnvironment',
3551
+ modal_proto.api_pb2.WorkspaceSetDefaultEnvironmentRequest,
3552
+ google.protobuf.empty_pb2.Empty,
3553
+ )
3554
+ self.WorkspaceSetImageBuilderVersion = grpclib.client.UnaryUnaryMethod(
3555
+ channel,
3556
+ '/modal.client.ModalClient/WorkspaceSetImageBuilderVersion',
3557
+ modal_proto.api_pb2.WorkspaceSetImageBuilderVersionRequest,
3558
+ modal_proto.api_pb2.WorkspaceSetImageBuilderVersionResponse,
3559
+ )
3560
+ self.WorkspaceSettings = grpclib.client.UnaryUnaryMethod(
3561
+ channel,
3562
+ '/modal.client.ModalClient/WorkspaceSettings',
3563
+ google.protobuf.empty_pb2.Empty,
3564
+ modal_proto.api_pb2.WorkspaceSettingsResponse,
3565
+ )