modal 1.5.3.dev4__tar.gz → 1.5.3.dev5__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 (231) hide show
  1. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/PKG-INFO +1 -1
  2. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_environments.py +18 -39
  3. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/client.pyi +2 -2
  4. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/environments.pyi +8 -8
  5. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/sandbox.py +8 -4
  6. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal.egg-info/PKG-INFO +1 -1
  7. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/api_grpc.py +16 -0
  8. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/api_pb2.py +764 -744
  9. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/api_pb2.pyi +63 -10
  10. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/api_pb2_grpc.py +33 -0
  11. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/api_pb2_grpc.pyi +10 -0
  12. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/modal_api_grpc.py +1 -0
  13. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_version/__init__.py +1 -1
  14. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/LICENSE +0 -0
  15. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/README.md +0 -0
  16. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/__init__.py +0 -0
  17. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/__main__.py +0 -0
  18. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_billing.py +0 -0
  19. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_clustered_functions.py +0 -0
  20. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_clustered_functions.pyi +0 -0
  21. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_container_entrypoint.py +0 -0
  22. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_function_variants.py +0 -0
  23. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_functions.py +0 -0
  24. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_grpc_client.py +0 -0
  25. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_image.py +0 -0
  26. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_ipython.py +0 -0
  27. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_load_context.py +0 -0
  28. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_location.py +0 -0
  29. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_logs.py +0 -0
  30. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_object.py +0 -0
  31. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_output/__init__.py +0 -0
  32. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_output/manager.py +0 -0
  33. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_output/pty.py +0 -0
  34. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_output/rich.py +0 -0
  35. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_output/status.py +0 -0
  36. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_partial_function.py +0 -0
  37. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_resolver.py +0 -0
  38. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_resources.py +0 -0
  39. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/__init__.py +0 -0
  40. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/asgi.py +0 -0
  41. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/container_io_manager.py +0 -0
  42. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/container_io_manager.pyi +0 -0
  43. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/execution_context.py +0 -0
  44. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/execution_context.pyi +0 -0
  45. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  46. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/task_lifecycle_manager.py +0 -0
  47. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  48. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/telemetry.py +0 -0
  49. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/user_code_event_loop.py +0 -0
  50. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/user_code_imports.py +0 -0
  51. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_serialization.py +0 -0
  52. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_server.py +0 -0
  53. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_traceback.py +0 -0
  54. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_tunnel.py +0 -0
  55. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_tunnel.pyi +0 -0
  56. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_type_manager.py +0 -0
  57. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/__init__.py +0 -0
  58. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/app_utils.py +0 -0
  59. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/async_utils.py +0 -0
  60. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/auth_token_manager.py +0 -0
  61. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/blob_utils.py +0 -0
  62. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/browser_utils.py +0 -0
  63. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/bytes_io_segment_payload.py +0 -0
  64. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/curl_utils.py +0 -0
  65. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/deprecation.py +0 -0
  66. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/docker_utils.py +0 -0
  67. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/function_utils.py +0 -0
  68. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/git_utils.py +0 -0
  69. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/grpc_testing.py +0 -0
  70. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/grpc_utils.py +0 -0
  71. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/hash_utils.py +0 -0
  72. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/http_utils.py +0 -0
  73. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/jwt_utils.py +0 -0
  74. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/logger.py +0 -0
  75. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/mount_utils.py +0 -0
  76. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/name_utils.py +0 -0
  77. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/package_utils.py +0 -0
  78. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/pattern_utils.py +0 -0
  79. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/proxy_support.py +0 -0
  80. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/rand_pb_testing.py +0 -0
  81. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/sandbox_fs_utils.py +0 -0
  82. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/shell_utils.py +0 -0
  83. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/task_command_router_client.py +0 -0
  84. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/time_utils.py +0 -0
  85. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_vendor/__init__.py +0 -0
  86. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  87. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_vendor/cloudpickle.py +0 -0
  88. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_vendor/tblib.py +0 -0
  89. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_vendor/version.py +0 -0
  90. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_watcher.py +0 -0
  91. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_workspace.py +0 -0
  92. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/app.py +0 -0
  93. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/app.pyi +0 -0
  94. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/billing.py +0 -0
  95. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/billing.pyi +0 -0
  96. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/builder/2023.12.312.txt +0 -0
  97. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/builder/2023.12.txt +0 -0
  98. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/builder/2024.04.txt +0 -0
  99. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/builder/2024.10.txt +0 -0
  100. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/builder/2025.06.txt +0 -0
  101. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/builder/PREVIEW.txt +0 -0
  102. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/builder/README.md +0 -0
  103. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/builder/base-images.json +0 -0
  104. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/call_graph.py +0 -0
  105. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/__init__.py +0 -0
  106. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/_download.py +0 -0
  107. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/_help.py +0 -0
  108. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/_traceback.py +0 -0
  109. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/app.py +0 -0
  110. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/billing.py +0 -0
  111. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/bootstrap.py +0 -0
  112. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/changelog.py +0 -0
  113. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/cluster.py +0 -0
  114. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/config.py +0 -0
  115. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/container.py +0 -0
  116. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/curl.py +0 -0
  117. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/dashboard.py +0 -0
  118. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/dict.py +0 -0
  119. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/endpoint.py +0 -0
  120. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/entry_point.py +0 -0
  121. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/environment.py +0 -0
  122. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/image.py +0 -0
  123. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/import_refs.py +0 -0
  124. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/launch.py +0 -0
  125. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/logo.py +0 -0
  126. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/network_file_system.py +0 -0
  127. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/profile.py +0 -0
  128. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/programs/__init__.py +0 -0
  129. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/programs/run_jupyter.py +0 -0
  130. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/programs/vscode.py +0 -0
  131. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/queues.py +0 -0
  132. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/run.py +0 -0
  133. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/secret.py +0 -0
  134. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/selector.py +0 -0
  135. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/shell.py +0 -0
  136. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/skills.py +0 -0
  137. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/token.py +0 -0
  138. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/utils.py +0 -0
  139. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/volume.py +0 -0
  140. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/workspace.py +0 -0
  141. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/client.py +0 -0
  142. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cloud_bucket_mount.py +0 -0
  143. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cloud_bucket_mount.pyi +0 -0
  144. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cls.py +0 -0
  145. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cls.pyi +0 -0
  146. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/config.py +0 -0
  147. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/container_process.py +0 -0
  148. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/container_process.pyi +0 -0
  149. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/dict.py +0 -0
  150. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/dict.pyi +0 -0
  151. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/environments.py +0 -0
  152. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/exception.py +0 -0
  153. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/experimental/__init__.py +0 -0
  154. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/experimental/flash.py +0 -0
  155. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/experimental/flash.pyi +0 -0
  156. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/experimental/ipython.py +0 -0
  157. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/file_io.py +0 -0
  158. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/file_io.pyi +0 -0
  159. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/file_pattern_matcher.py +0 -0
  160. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/functions.py +0 -0
  161. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/functions.pyi +0 -0
  162. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/image.py +0 -0
  163. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/image.pyi +0 -0
  164. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/io_streams.py +0 -0
  165. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/io_streams.pyi +0 -0
  166. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/mount.py +0 -0
  167. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/mount.pyi +0 -0
  168. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/network_file_system.py +0 -0
  169. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/network_file_system.pyi +0 -0
  170. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/object.py +0 -0
  171. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/object.pyi +0 -0
  172. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/output.py +0 -0
  173. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/parallel_map.py +0 -0
  174. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/parallel_map.pyi +0 -0
  175. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/partial_function.py +0 -0
  176. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/partial_function.pyi +0 -0
  177. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/proxy.py +0 -0
  178. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/proxy.pyi +0 -0
  179. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/py.typed +0 -0
  180. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/queue.py +0 -0
  181. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/queue.pyi +0 -0
  182. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/retries.py +0 -0
  183. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/runner.py +0 -0
  184. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/runner.pyi +0 -0
  185. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/running_app.py +0 -0
  186. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/sandbox.pyi +0 -0
  187. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/sandbox_fs.py +0 -0
  188. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/sandbox_fs.pyi +0 -0
  189. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/schedule.py +0 -0
  190. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/scheduler_placement.py +0 -0
  191. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/secret.py +0 -0
  192. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/secret.pyi +0 -0
  193. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/server.py +0 -0
  194. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/server.pyi +0 -0
  195. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/serving.py +0 -0
  196. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/serving.pyi +0 -0
  197. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/skills/modal/SKILL.md +0 -0
  198. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/snapshot.py +0 -0
  199. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/snapshot.pyi +0 -0
  200. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/stream_type.py +0 -0
  201. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/token_flow.py +0 -0
  202. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/token_flow.pyi +0 -0
  203. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/types.py +0 -0
  204. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/volume.py +0 -0
  205. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/volume.pyi +0 -0
  206. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/workspace.py +0 -0
  207. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/workspace.pyi +0 -0
  208. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal.egg-info/SOURCES.txt +0 -0
  209. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal.egg-info/dependency_links.txt +0 -0
  210. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal.egg-info/entry_points.txt +0 -0
  211. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal.egg-info/requires.txt +0 -0
  212. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal.egg-info/top_level.txt +0 -0
  213. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/__init__.py +0 -0
  214. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/gen_cli_docs.py +0 -0
  215. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/gen_cli_docs_main.py +0 -0
  216. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/gen_reference_docs.py +0 -0
  217. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/gen_reference_docs_main.py +0 -0
  218. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/mdmd/__init__.py +0 -0
  219. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/mdmd/mdmd.py +0 -0
  220. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/mdmd/signatures.py +0 -0
  221. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/mdmd/types.py +0 -0
  222. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/__init__.py +0 -0
  223. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/py.typed +0 -0
  224. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/task_command_router_grpc.py +0 -0
  225. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/task_command_router_pb2.py +0 -0
  226. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/task_command_router_pb2.pyi +0 -0
  227. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  228. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  229. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_version/__main__.py +0 -0
  230. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/pyproject.toml +0 -0
  231. {modal-1.5.3.dev4 → modal-1.5.3.dev5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.3.dev4
3
+ Version: 1.5.3.dev5
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -103,26 +103,6 @@ class _EnvironmentManager:
103
103
  await client.stub.EnvironmentDelete(api_pb2.EnvironmentDeleteRequest(name=name))
104
104
 
105
105
 
106
- def _role_to_proto(role: str) -> "api_pb2.EnvironmentRole.ValueType":
107
- match role:
108
- case "viewer":
109
- return api_pb2.ENVIRONMENT_ROLE_VIEWER
110
- case "contributor":
111
- return api_pb2.ENVIRONMENT_ROLE_CONTRIBUTOR
112
- case _:
113
- raise InvalidError(f"Invalid Environment role: {role!r} (expected 'viewer' or 'contributor')")
114
-
115
-
116
- def _role_from_proto(proto_value: int) -> str:
117
- match proto_value:
118
- case api_pb2.ENVIRONMENT_ROLE_VIEWER:
119
- return "viewer"
120
- case api_pb2.ENVIRONMENT_ROLE_CONTRIBUTOR:
121
- return "contributor"
122
- case _:
123
- raise ValueError(f"Unknown environment role: {proto_value}")
124
-
125
-
126
106
  class _EnvironmentMembersManager:
127
107
  """mdmd:namespace
128
108
  Namespace with methods for managing the membership of a restricted Environment.
@@ -135,31 +115,30 @@ class _EnvironmentMembersManager:
135
115
  self._environment = environment
136
116
 
137
117
  async def list(self) -> dict[Literal["users", "service_users"], dict[str, str]]:
138
- """Return the members of a restricted Environment with their roles.
118
+ """Enumerate the environment roles for each user and service user in the workspace.
139
119
 
140
120
  **Examples:**
141
121
 
142
122
  ```python notest
143
- members = modal.Environment.from_name("my-restricted-env").members.list()
123
+ members = modal.Environment.from_name("my-env").members.list()
144
124
  print(members)
145
125
  # {
146
- # "users": {"alice": "contributor", "bob": "viewer"},
147
- # "service_users": {"alice-bot": "contributor"},
126
+ # "users": {"alice": "contributor", "bob": "viewer", "carol": "contributor"},
127
+ # "service_users": {"alice-bot": "contributor", "ops-bot": "viewer", "ci-bot": "no-access"},
148
128
  # }
149
129
  ```
150
130
  """
151
131
  await self._environment.hydrate()
152
- req = api_pb2.EnvironmentGetManagedRequest(environment_id=self._environment.object_id)
153
- resp = await self._environment.client.stub.EnvironmentGetManaged(req)
132
+ req = api_pb2.EnvironmentGetRolesRequest(environment_id=self._environment.object_id)
133
+ resp = await self._environment.client.stub.EnvironmentGetRoles(req)
154
134
 
155
135
  users: dict[str, str] = {}
156
136
  service_users: dict[str, str] = {}
157
137
  for principal in resp.principal_roles:
158
- role = _role_from_proto(principal.role)
159
138
  if principal.user_id:
160
- users[principal.user_name] = role
139
+ users[principal.user_name] = principal.role_str
161
140
  elif principal.service_user_id:
162
- service_users[principal.service_user_name] = role
141
+ service_users[principal.service_user_name] = principal.role_str
163
142
 
164
143
  return {"users": users, "service_users": service_users}
165
144
 
@@ -188,13 +167,13 @@ class _EnvironmentMembersManager:
188
167
  users = users or {}
189
168
  service_users = service_users or {}
190
169
 
191
- req = api_pb2.EnvironmentGetManagedRequest(environment_id=self._environment.object_id)
192
- resp = await self._environment.client.stub.EnvironmentGetManaged(req)
170
+ req = api_pb2.EnvironmentGetRolesRequest(environment_id=self._environment.object_id)
171
+ resp = await self._environment.client.stub.EnvironmentGetRoles(req)
193
172
 
194
- # Both current members and additional eligible workspace principals can be assigned a role
173
+ # EnvironmentGetRoles returns every workspace principal
195
174
  user_name_to_id: dict[str, str] = {}
196
175
  service_user_name_to_id: dict[str, str] = {}
197
- for principal in [*resp.principal_roles, *resp.additional_roles]:
176
+ for principal in resp.principal_roles:
198
177
  if principal.user_id:
199
178
  user_name_to_id[principal.user_name] = principal.user_id
200
179
  elif principal.service_user_id:
@@ -207,7 +186,7 @@ class _EnvironmentMembersManager:
207
186
  requests[f"User {name!r}"] = api_pb2.EnvironmentRoleSetRequest(
208
187
  environment_id=self._environment.object_id,
209
188
  user_id=user_name_to_id[name],
210
- role=_role_to_proto(role),
189
+ role_str=role,
211
190
  )
212
191
  for name, role in service_users.items():
213
192
  if name not in service_user_name_to_id:
@@ -215,7 +194,7 @@ class _EnvironmentMembersManager:
215
194
  requests[f"Service user {name!r}"] = api_pb2.EnvironmentRoleSetRequest(
216
195
  environment_id=self._environment.object_id,
217
196
  service_user_id=service_user_name_to_id[name],
218
- role=_role_to_proto(role),
197
+ role_str=role,
219
198
  )
220
199
 
221
200
  await self._dispatch_role_updates(requests)
@@ -242,8 +221,8 @@ class _EnvironmentMembersManager:
242
221
  users = users or []
243
222
  service_users = service_users or []
244
223
 
245
- req = api_pb2.EnvironmentGetManagedRequest(environment_id=self._environment.object_id)
246
- resp = await self._environment.client.stub.EnvironmentGetManaged(req)
224
+ req = api_pb2.EnvironmentGetRolesRequest(environment_id=self._environment.object_id)
225
+ resp = await self._environment.client.stub.EnvironmentGetRoles(req)
247
226
 
248
227
  user_name_to_id: dict[str, str] = {}
249
228
  service_user_name_to_id: dict[str, str] = {}
@@ -256,7 +235,7 @@ class _EnvironmentMembersManager:
256
235
  requests: dict[str, api_pb2.EnvironmentRoleSetRequest] = {}
257
236
  for name in users:
258
237
  if name not in user_name_to_id:
259
- raise InvalidError(f"User {name!r} is not a member of this Environment")
238
+ raise InvalidError(f"User {name!r} not found in workspace")
260
239
  requests[f"User {name!r}"] = api_pb2.EnvironmentRoleSetRequest(
261
240
  environment_id=self._environment.object_id,
262
241
  user_id=user_name_to_id[name],
@@ -264,7 +243,7 @@ class _EnvironmentMembersManager:
264
243
  )
265
244
  for name in service_users:
266
245
  if name not in service_user_name_to_id:
267
- raise InvalidError(f"Service user {name!r} is not a member of this Environment")
246
+ raise InvalidError(f"Service user {name!r} not found in workspace")
268
247
  requests[f"Service user {name!r}"] = api_pb2.EnvironmentRoleSetRequest(
269
248
  environment_id=self._environment.object_id,
270
249
  service_user_id=service_user_name_to_id[name],
@@ -37,7 +37,7 @@ class _Client:
37
37
  server_url: str,
38
38
  client_type: int,
39
39
  credentials: typing.Optional[tuple[str, str]],
40
- version: str = "1.5.3.dev4",
40
+ version: str = "1.5.3.dev5",
41
41
  ):
42
42
  """mdmd:hidden
43
43
  The Modal client object is not intended to be instantiated directly by users.
@@ -207,7 +207,7 @@ class Client:
207
207
  server_url: str,
208
208
  client_type: int,
209
209
  credentials: typing.Optional[tuple[str, str]],
210
- version: str = "1.5.3.dev4",
210
+ version: str = "1.5.3.dev5",
211
211
  ):
212
212
  """mdmd:hidden
213
213
  The Modal client object is not intended to be instantiated directly by users.
@@ -113,32 +113,32 @@ class EnvironmentMembersManager:
113
113
 
114
114
  class __list_spec(typing_extensions.Protocol):
115
115
  def __call__(self, /) -> dict[typing.Literal["users", "service_users"], dict[str, str]]:
116
- """Return the members of a restricted Environment with their roles.
116
+ """Enumerate the environment roles for each user and service user in the workspace.
117
117
 
118
118
  **Examples:**
119
119
 
120
120
  ```python notest
121
- members = modal.Environment.from_name("my-restricted-env").members.list()
121
+ members = modal.Environment.from_name("my-env").members.list()
122
122
  print(members)
123
123
  # {
124
- # "users": {"alice": "contributor", "bob": "viewer"},
125
- # "service_users": {"alice-bot": "contributor"},
124
+ # "users": {"alice": "contributor", "bob": "viewer", "carol": "contributor"},
125
+ # "service_users": {"alice-bot": "contributor", "ops-bot": "viewer", "ci-bot": "no-access"},
126
126
  # }
127
127
  ```
128
128
  """
129
129
  ...
130
130
 
131
131
  async def aio(self, /) -> dict[typing.Literal["users", "service_users"], dict[str, str]]:
132
- """Return the members of a restricted Environment with their roles.
132
+ """Enumerate the environment roles for each user and service user in the workspace.
133
133
 
134
134
  **Examples:**
135
135
 
136
136
  ```python notest
137
- members = modal.Environment.from_name("my-restricted-env").members.list()
137
+ members = modal.Environment.from_name("my-env").members.list()
138
138
  print(members)
139
139
  # {
140
- # "users": {"alice": "contributor", "bob": "viewer"},
141
- # "service_users": {"alice-bot": "contributor"},
140
+ # "users": {"alice": "contributor", "bob": "viewer", "carol": "contributor"},
141
+ # "service_users": {"alice-bot": "contributor", "ops-bot": "viewer", "ci-bot": "no-access"},
142
142
  # }
143
143
  ```
144
144
  """
@@ -1021,10 +1021,14 @@ class _Sandbox(_Object, type_prefix="sb"):
1021
1021
  self._is_v2 = True
1022
1022
  self._task_id = create_resp.task_id
1023
1023
  self._hydrate_metadata_v2()
1024
- self._tunnels = {
1025
- t.container_port: Tunnel(t.host, t.port, t.unencrypted_host, t.unencrypted_port)
1026
- for t in create_resp.tunnels
1027
- }
1024
+ # Unencrypted tunnel endpoints are not known at create time. Only
1025
+ # cache a complete set so tunnels() fetches the rest otherwise.
1026
+ create_resp_has_all_tunnels = len(create_resp.tunnels) == len(open_ports)
1027
+ if create_resp_has_all_tunnels:
1028
+ self._tunnels = {
1029
+ t.container_port: Tunnel(t.host, t.port, t.unencrypted_host, t.unencrypted_port)
1030
+ for t in create_resp.tunnels
1031
+ }
1028
1032
 
1029
1033
  if logger.isEnabledFor(logging.DEBUG):
1030
1034
  total_elapsed = time.monotonic() - load_start
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.3.dev4
3
+ Version: 1.5.3.dev5
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -639,6 +639,10 @@ class ModalClientBase(abc.ABC):
639
639
  async def SandboxRestore(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxRestoreRequest, modal_proto.api_pb2.SandboxRestoreResponse]') -> None:
640
640
  pass
641
641
 
642
+ @abc.abstractmethod
643
+ async def SandboxRestoreV2(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxRestoreV2Request, modal_proto.api_pb2.SandboxRestoreV2Response]') -> None:
644
+ pass
645
+
642
646
  @abc.abstractmethod
643
647
  async def SandboxSetName(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxSetNameRequest, modal_proto.api_pb2.SandboxSetNameResponse]') -> None:
644
648
  pass
@@ -1875,6 +1879,12 @@ class ModalClientBase(abc.ABC):
1875
1879
  modal_proto.api_pb2.SandboxRestoreRequest,
1876
1880
  modal_proto.api_pb2.SandboxRestoreResponse,
1877
1881
  ),
1882
+ '/modal.client.ModalClient/SandboxRestoreV2': grpclib.const.Handler(
1883
+ self.SandboxRestoreV2,
1884
+ grpclib.const.Cardinality.UNARY_UNARY,
1885
+ modal_proto.api_pb2.SandboxRestoreV2Request,
1886
+ modal_proto.api_pb2.SandboxRestoreV2Response,
1887
+ ),
1878
1888
  '/modal.client.ModalClient/SandboxSetName': grpclib.const.Handler(
1879
1889
  self.SandboxSetName,
1880
1890
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -3267,6 +3277,12 @@ class ModalClientStub:
3267
3277
  modal_proto.api_pb2.SandboxRestoreRequest,
3268
3278
  modal_proto.api_pb2.SandboxRestoreResponse,
3269
3279
  )
3280
+ self.SandboxRestoreV2 = grpclib.client.UnaryUnaryMethod(
3281
+ channel,
3282
+ '/modal.client.ModalClient/SandboxRestoreV2',
3283
+ modal_proto.api_pb2.SandboxRestoreV2Request,
3284
+ modal_proto.api_pb2.SandboxRestoreV2Response,
3285
+ )
3270
3286
  self.SandboxSetName = grpclib.client.UnaryUnaryMethod(
3271
3287
  channel,
3272
3288
  '/modal.client.ModalClient/SandboxSetName',