modal 1.1.5.dev89__tar.gz → 1.1.5.dev90__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.

Potentially problematic release.


This version of modal might be problematic. Click here for more details.

Files changed (197) hide show
  1. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/PKG-INFO +1 -1
  2. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/client.pyi +2 -2
  3. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cls.py +21 -11
  4. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal.egg-info/PKG-INFO +1 -1
  5. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_version/__init__.py +1 -1
  6. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/LICENSE +0 -0
  7. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/README.md +0 -0
  8. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/__init__.py +0 -0
  9. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/__main__.py +0 -0
  10. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_billing.py +0 -0
  11. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_clustered_functions.py +0 -0
  12. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_clustered_functions.pyi +0 -0
  13. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_container_entrypoint.py +0 -0
  14. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_functions.py +0 -0
  15. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_ipython.py +0 -0
  16. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_location.py +0 -0
  17. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_object.py +0 -0
  18. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_output.py +0 -0
  19. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_partial_function.py +0 -0
  20. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_pty.py +0 -0
  21. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_resolver.py +0 -0
  22. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_resources.py +0 -0
  23. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_runtime/__init__.py +0 -0
  24. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_runtime/asgi.py +0 -0
  25. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_runtime/container_io_manager.py +0 -0
  26. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_runtime/container_io_manager.pyi +0 -0
  27. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_runtime/execution_context.py +0 -0
  28. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_runtime/execution_context.pyi +0 -0
  29. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  30. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_runtime/telemetry.py +0 -0
  31. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_runtime/user_code_imports.py +0 -0
  32. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_serialization.py +0 -0
  33. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_traceback.py +0 -0
  34. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_tunnel.py +0 -0
  35. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_tunnel.pyi +0 -0
  36. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_type_manager.py +0 -0
  37. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/__init__.py +0 -0
  38. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/app_utils.py +0 -0
  39. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/async_utils.py +0 -0
  40. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/auth_token_manager.py +0 -0
  41. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/blob_utils.py +0 -0
  42. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/bytes_io_segment_payload.py +0 -0
  43. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/deprecation.py +0 -0
  44. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/docker_utils.py +0 -0
  45. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/function_utils.py +0 -0
  46. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/git_utils.py +0 -0
  47. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/grpc_testing.py +0 -0
  48. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/grpc_utils.py +0 -0
  49. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/hash_utils.py +0 -0
  50. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/http_utils.py +0 -0
  51. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/jwt_utils.py +0 -0
  52. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/logger.py +0 -0
  53. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/mount_utils.py +0 -0
  54. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/name_utils.py +0 -0
  55. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/package_utils.py +0 -0
  56. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/pattern_utils.py +0 -0
  57. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/rand_pb_testing.py +0 -0
  58. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/shell_utils.py +0 -0
  59. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_utils/time_utils.py +0 -0
  60. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_vendor/__init__.py +0 -0
  61. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  62. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_vendor/cloudpickle.py +0 -0
  63. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_vendor/tblib.py +0 -0
  64. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/_watcher.py +0 -0
  65. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/app.py +0 -0
  66. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/app.pyi +0 -0
  67. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/billing.py +0 -0
  68. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/builder/2023.12.312.txt +0 -0
  69. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/builder/2023.12.txt +0 -0
  70. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/builder/2024.04.txt +0 -0
  71. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/builder/2024.10.txt +0 -0
  72. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/builder/2025.06.txt +0 -0
  73. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/builder/PREVIEW.txt +0 -0
  74. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/builder/README.md +0 -0
  75. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/builder/base-images.json +0 -0
  76. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/call_graph.py +0 -0
  77. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/__init__.py +0 -0
  78. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/_download.py +0 -0
  79. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/_traceback.py +0 -0
  80. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/app.py +0 -0
  81. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/cluster.py +0 -0
  82. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/config.py +0 -0
  83. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/container.py +0 -0
  84. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/dict.py +0 -0
  85. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/entry_point.py +0 -0
  86. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/environment.py +0 -0
  87. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/import_refs.py +0 -0
  88. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/launch.py +0 -0
  89. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/network_file_system.py +0 -0
  90. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/profile.py +0 -0
  91. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/programs/__init__.py +0 -0
  92. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/programs/launch_instance_ssh.py +0 -0
  93. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/programs/run_jupyter.py +0 -0
  94. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/programs/run_marimo.py +0 -0
  95. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/programs/vscode.py +0 -0
  96. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/queues.py +0 -0
  97. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/run.py +0 -0
  98. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/secret.py +0 -0
  99. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/token.py +0 -0
  100. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/utils.py +0 -0
  101. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cli/volume.py +0 -0
  102. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/client.py +0 -0
  103. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cloud_bucket_mount.py +0 -0
  104. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cloud_bucket_mount.pyi +0 -0
  105. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/cls.pyi +0 -0
  106. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/config.py +0 -0
  107. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/container_process.py +0 -0
  108. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/container_process.pyi +0 -0
  109. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/dict.py +0 -0
  110. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/dict.pyi +0 -0
  111. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/environments.py +0 -0
  112. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/environments.pyi +0 -0
  113. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/exception.py +0 -0
  114. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/experimental/__init__.py +0 -0
  115. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/experimental/flash.py +0 -0
  116. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/experimental/flash.pyi +0 -0
  117. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/experimental/ipython.py +0 -0
  118. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/file_io.py +0 -0
  119. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/file_io.pyi +0 -0
  120. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/file_pattern_matcher.py +0 -0
  121. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/functions.py +0 -0
  122. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/functions.pyi +0 -0
  123. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/gpu.py +0 -0
  124. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/image.py +0 -0
  125. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/image.pyi +0 -0
  126. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/io_streams.py +0 -0
  127. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/io_streams.pyi +0 -0
  128. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/mount.py +0 -0
  129. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/mount.pyi +0 -0
  130. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/network_file_system.py +0 -0
  131. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/network_file_system.pyi +0 -0
  132. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/object.py +0 -0
  133. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/object.pyi +0 -0
  134. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/output.py +0 -0
  135. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/parallel_map.py +0 -0
  136. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/parallel_map.pyi +0 -0
  137. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/partial_function.py +0 -0
  138. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/partial_function.pyi +0 -0
  139. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/proxy.py +0 -0
  140. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/proxy.pyi +0 -0
  141. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/py.typed +0 -0
  142. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/queue.py +0 -0
  143. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/queue.pyi +0 -0
  144. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/retries.py +0 -0
  145. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/runner.py +0 -0
  146. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/runner.pyi +0 -0
  147. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/running_app.py +0 -0
  148. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/sandbox.py +0 -0
  149. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/sandbox.pyi +0 -0
  150. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/schedule.py +0 -0
  151. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/scheduler_placement.py +0 -0
  152. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/secret.py +0 -0
  153. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/secret.pyi +0 -0
  154. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/serving.py +0 -0
  155. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/serving.pyi +0 -0
  156. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/snapshot.py +0 -0
  157. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/snapshot.pyi +0 -0
  158. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/stream_type.py +0 -0
  159. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/token_flow.py +0 -0
  160. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/token_flow.pyi +0 -0
  161. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/volume.py +0 -0
  162. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal/volume.pyi +0 -0
  163. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal.egg-info/SOURCES.txt +0 -0
  164. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal.egg-info/dependency_links.txt +0 -0
  165. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal.egg-info/entry_points.txt +0 -0
  166. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal.egg-info/requires.txt +0 -0
  167. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal.egg-info/top_level.txt +0 -0
  168. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_docs/__init__.py +0 -0
  169. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_docs/gen_cli_docs.py +0 -0
  170. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_docs/gen_reference_docs.py +0 -0
  171. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_docs/mdmd/__init__.py +0 -0
  172. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_docs/mdmd/mdmd.py +0 -0
  173. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_docs/mdmd/signatures.py +0 -0
  174. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/__init__.py +0 -0
  175. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/api.proto +0 -0
  176. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/api_grpc.py +0 -0
  177. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/api_pb2.py +0 -0
  178. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/api_pb2.pyi +0 -0
  179. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/api_pb2_grpc.py +0 -0
  180. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/api_pb2_grpc.pyi +0 -0
  181. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/modal_api_grpc.py +0 -0
  182. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/py.typed +0 -0
  183. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/sandbox_router.proto +0 -0
  184. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/sandbox_router_grpc.py +0 -0
  185. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/sandbox_router_pb2.py +0 -0
  186. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/sandbox_router_pb2.pyi +0 -0
  187. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/sandbox_router_pb2_grpc.py +0 -0
  188. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/sandbox_router_pb2_grpc.pyi +0 -0
  189. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/task_command_router.proto +0 -0
  190. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/task_command_router_grpc.py +0 -0
  191. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/task_command_router_pb2.py +0 -0
  192. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/task_command_router_pb2.pyi +0 -0
  193. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  194. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  195. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/modal_version/__main__.py +0 -0
  196. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/pyproject.toml +0 -0
  197. {modal-1.1.5.dev89 → modal-1.1.5.dev90}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev89
3
+ Version: 1.1.5.dev90
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -33,7 +33,7 @@ class _Client:
33
33
  server_url: str,
34
34
  client_type: int,
35
35
  credentials: typing.Optional[tuple[str, str]],
36
- version: str = "1.1.5.dev89",
36
+ version: str = "1.1.5.dev90",
37
37
  ):
38
38
  """mdmd:hidden
39
39
  The Modal client object is not intended to be instantiated directly by users.
@@ -164,7 +164,7 @@ class Client:
164
164
  server_url: str,
165
165
  client_type: int,
166
166
  credentials: typing.Optional[tuple[str, str]],
167
- version: str = "1.1.5.dev89",
167
+ version: str = "1.1.5.dev90",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
@@ -863,18 +863,28 @@ More information on class parameterization can be found here: https://modal.com/
863
863
  )
864
864
 
865
865
  def __getattr__(self, k):
866
- # TODO: remove this method - access to attributes on classes (not instances) should be discouraged
867
- if not self._is_local() or k in self._method_partials:
868
- # if not local (== k *could* be a method) or it is local and we know k is a method
869
- deprecation_warning(
870
- (2025, 1, 13),
871
- "Calling a method on an uninstantiated class will soon be deprecated; "
872
- "update your code to instantiate the class first, i.e.:\n"
873
- f"{self._name}().{k} instead of {self._name}.{k}",
866
+ if self._user_cls is not None:
867
+ # local class, we can check if there are static attributes and let the user access them
868
+ # except if they are PartialFunction (i.e. methods)
869
+ v = getattr(self._user_cls, k)
870
+ if not isinstance(v, modal.partial_function.PartialFunction):
871
+ return v
872
+
873
+ # We create a synthetic dummy Function that is guaranteed to raise an AttributeError when
874
+ # a user tries to use any of its "live methods" - this lets us raise exceptions for users
875
+ # only if they try to access methods on a Cls as if they were methods on the instance.
876
+ async def method_loader(fun: _Function, resolver: Resolver, existing_object_id: Optional[str]):
877
+ raise AttributeError(
878
+ "You can't access methods on a Cls directly - Did you forget to instantiate the class first?\n"
879
+ "e.g. instead of MyClass.method.remote(), do MyClass().method.remote()"
874
880
  )
875
- return getattr(self(), k)
876
- # non-method attribute access on local class - arguably shouldn't be used either:
877
- return getattr(self._user_cls, k)
881
+
882
+ return _Function._from_loader(
883
+ method_loader,
884
+ rep=f"UnboundMethod({self._name}.{k})",
885
+ deps=lambda: [],
886
+ hydrate_lazily=True,
887
+ )
878
888
 
879
889
  def _is_local(self) -> bool:
880
890
  return self._user_cls is not None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev89
3
+ Version: 1.1.5.dev90
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.1.5.dev89"
4
+ __version__ = "1.1.5.dev90"
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