modal 0.74.61__tar.gz → 0.75.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. {modal-0.74.61 → modal-0.75.0}/PKG-INFO +1 -1
  2. {modal-0.74.61 → modal-0.75.0}/modal/_functions.py +12 -2
  3. {modal-0.74.61 → modal-0.75.0}/modal/client.pyi +2 -2
  4. {modal-0.74.61 → modal-0.75.0}/modal/file_pattern_matcher.py +2 -0
  5. {modal-0.74.61 → modal-0.75.0}/modal/functions.pyi +7 -0
  6. {modal-0.74.61 → modal-0.75.0}/modal/image.py +3 -2
  7. {modal-0.74.61 → modal-0.75.0}/modal/mount.py +4 -4
  8. {modal-0.74.61 → modal-0.75.0}/modal.egg-info/PKG-INFO +1 -1
  9. {modal-0.74.61 → modal-0.75.0}/modal_proto/api.proto +2 -0
  10. {modal-0.74.61 → modal-0.75.0}/modal_proto/api_pb2.py +614 -614
  11. {modal-0.74.61 → modal-0.75.0}/modal_proto/api_pb2.pyi +9 -1
  12. {modal-0.74.61 → modal-0.75.0}/modal_version/__init__.py +1 -1
  13. {modal-0.74.61 → modal-0.75.0}/modal_version/_version_generated.py +1 -1
  14. {modal-0.74.61 → modal-0.75.0}/LICENSE +0 -0
  15. {modal-0.74.61 → modal-0.75.0}/README.md +0 -0
  16. {modal-0.74.61 → modal-0.75.0}/modal/__init__.py +0 -0
  17. {modal-0.74.61 → modal-0.75.0}/modal/__main__.py +0 -0
  18. {modal-0.74.61 → modal-0.75.0}/modal/_clustered_functions.py +0 -0
  19. {modal-0.74.61 → modal-0.75.0}/modal/_clustered_functions.pyi +0 -0
  20. {modal-0.74.61 → modal-0.75.0}/modal/_container_entrypoint.py +0 -0
  21. {modal-0.74.61 → modal-0.75.0}/modal/_ipython.py +0 -0
  22. {modal-0.74.61 → modal-0.75.0}/modal/_location.py +0 -0
  23. {modal-0.74.61 → modal-0.75.0}/modal/_object.py +0 -0
  24. {modal-0.74.61 → modal-0.75.0}/modal/_output.py +0 -0
  25. {modal-0.74.61 → modal-0.75.0}/modal/_partial_function.py +0 -0
  26. {modal-0.74.61 → modal-0.75.0}/modal/_pty.py +0 -0
  27. {modal-0.74.61 → modal-0.75.0}/modal/_resolver.py +0 -0
  28. {modal-0.74.61 → modal-0.75.0}/modal/_resources.py +0 -0
  29. {modal-0.74.61 → modal-0.75.0}/modal/_runtime/__init__.py +0 -0
  30. {modal-0.74.61 → modal-0.75.0}/modal/_runtime/asgi.py +0 -0
  31. {modal-0.74.61 → modal-0.75.0}/modal/_runtime/container_io_manager.py +0 -0
  32. {modal-0.74.61 → modal-0.75.0}/modal/_runtime/container_io_manager.pyi +0 -0
  33. {modal-0.74.61 → modal-0.75.0}/modal/_runtime/execution_context.py +0 -0
  34. {modal-0.74.61 → modal-0.75.0}/modal/_runtime/execution_context.pyi +0 -0
  35. {modal-0.74.61 → modal-0.75.0}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  36. {modal-0.74.61 → modal-0.75.0}/modal/_runtime/telemetry.py +0 -0
  37. {modal-0.74.61 → modal-0.75.0}/modal/_runtime/user_code_imports.py +0 -0
  38. {modal-0.74.61 → modal-0.75.0}/modal/_serialization.py +0 -0
  39. {modal-0.74.61 → modal-0.75.0}/modal/_traceback.py +0 -0
  40. {modal-0.74.61 → modal-0.75.0}/modal/_tunnel.py +0 -0
  41. {modal-0.74.61 → modal-0.75.0}/modal/_tunnel.pyi +0 -0
  42. {modal-0.74.61 → modal-0.75.0}/modal/_type_manager.py +0 -0
  43. {modal-0.74.61 → modal-0.75.0}/modal/_utils/__init__.py +0 -0
  44. {modal-0.74.61 → modal-0.75.0}/modal/_utils/app_utils.py +0 -0
  45. {modal-0.74.61 → modal-0.75.0}/modal/_utils/async_utils.py +0 -0
  46. {modal-0.74.61 → modal-0.75.0}/modal/_utils/blob_utils.py +0 -0
  47. {modal-0.74.61 → modal-0.75.0}/modal/_utils/bytes_io_segment_payload.py +0 -0
  48. {modal-0.74.61 → modal-0.75.0}/modal/_utils/deprecation.py +0 -0
  49. {modal-0.74.61 → modal-0.75.0}/modal/_utils/docker_utils.py +0 -0
  50. {modal-0.74.61 → modal-0.75.0}/modal/_utils/function_utils.py +0 -0
  51. {modal-0.74.61 → modal-0.75.0}/modal/_utils/git_utils.py +0 -0
  52. {modal-0.74.61 → modal-0.75.0}/modal/_utils/grpc_testing.py +0 -0
  53. {modal-0.74.61 → modal-0.75.0}/modal/_utils/grpc_utils.py +0 -0
  54. {modal-0.74.61 → modal-0.75.0}/modal/_utils/hash_utils.py +0 -0
  55. {modal-0.74.61 → modal-0.75.0}/modal/_utils/http_utils.py +0 -0
  56. {modal-0.74.61 → modal-0.75.0}/modal/_utils/jwt_utils.py +0 -0
  57. {modal-0.74.61 → modal-0.75.0}/modal/_utils/logger.py +0 -0
  58. {modal-0.74.61 → modal-0.75.0}/modal/_utils/mount_utils.py +0 -0
  59. {modal-0.74.61 → modal-0.75.0}/modal/_utils/name_utils.py +0 -0
  60. {modal-0.74.61 → modal-0.75.0}/modal/_utils/package_utils.py +0 -0
  61. {modal-0.74.61 → modal-0.75.0}/modal/_utils/pattern_utils.py +0 -0
  62. {modal-0.74.61 → modal-0.75.0}/modal/_utils/rand_pb_testing.py +0 -0
  63. {modal-0.74.61 → modal-0.75.0}/modal/_utils/shell_utils.py +0 -0
  64. {modal-0.74.61 → modal-0.75.0}/modal/_vendor/__init__.py +0 -0
  65. {modal-0.74.61 → modal-0.75.0}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  66. {modal-0.74.61 → modal-0.75.0}/modal/_vendor/cloudpickle.py +0 -0
  67. {modal-0.74.61 → modal-0.75.0}/modal/_vendor/tblib.py +0 -0
  68. {modal-0.74.61 → modal-0.75.0}/modal/_watcher.py +0 -0
  69. {modal-0.74.61 → modal-0.75.0}/modal/app.py +0 -0
  70. {modal-0.74.61 → modal-0.75.0}/modal/app.pyi +0 -0
  71. {modal-0.74.61 → modal-0.75.0}/modal/call_graph.py +0 -0
  72. {modal-0.74.61 → modal-0.75.0}/modal/cli/__init__.py +0 -0
  73. {modal-0.74.61 → modal-0.75.0}/modal/cli/_download.py +0 -0
  74. {modal-0.74.61 → modal-0.75.0}/modal/cli/_traceback.py +0 -0
  75. {modal-0.74.61 → modal-0.75.0}/modal/cli/app.py +0 -0
  76. {modal-0.74.61 → modal-0.75.0}/modal/cli/cluster.py +0 -0
  77. {modal-0.74.61 → modal-0.75.0}/modal/cli/config.py +0 -0
  78. {modal-0.74.61 → modal-0.75.0}/modal/cli/container.py +0 -0
  79. {modal-0.74.61 → modal-0.75.0}/modal/cli/dict.py +0 -0
  80. {modal-0.74.61 → modal-0.75.0}/modal/cli/entry_point.py +0 -0
  81. {modal-0.74.61 → modal-0.75.0}/modal/cli/environment.py +0 -0
  82. {modal-0.74.61 → modal-0.75.0}/modal/cli/import_refs.py +0 -0
  83. {modal-0.74.61 → modal-0.75.0}/modal/cli/launch.py +0 -0
  84. {modal-0.74.61 → modal-0.75.0}/modal/cli/network_file_system.py +0 -0
  85. {modal-0.74.61 → modal-0.75.0}/modal/cli/profile.py +0 -0
  86. {modal-0.74.61 → modal-0.75.0}/modal/cli/programs/__init__.py +0 -0
  87. {modal-0.74.61 → modal-0.75.0}/modal/cli/programs/run_jupyter.py +0 -0
  88. {modal-0.74.61 → modal-0.75.0}/modal/cli/programs/vscode.py +0 -0
  89. {modal-0.74.61 → modal-0.75.0}/modal/cli/queues.py +0 -0
  90. {modal-0.74.61 → modal-0.75.0}/modal/cli/run.py +0 -0
  91. {modal-0.74.61 → modal-0.75.0}/modal/cli/secret.py +0 -0
  92. {modal-0.74.61 → modal-0.75.0}/modal/cli/token.py +0 -0
  93. {modal-0.74.61 → modal-0.75.0}/modal/cli/utils.py +0 -0
  94. {modal-0.74.61 → modal-0.75.0}/modal/cli/volume.py +0 -0
  95. {modal-0.74.61 → modal-0.75.0}/modal/client.py +0 -0
  96. {modal-0.74.61 → modal-0.75.0}/modal/cloud_bucket_mount.py +0 -0
  97. {modal-0.74.61 → modal-0.75.0}/modal/cloud_bucket_mount.pyi +0 -0
  98. {modal-0.74.61 → modal-0.75.0}/modal/cls.py +0 -0
  99. {modal-0.74.61 → modal-0.75.0}/modal/cls.pyi +0 -0
  100. {modal-0.74.61 → modal-0.75.0}/modal/config.py +0 -0
  101. {modal-0.74.61 → modal-0.75.0}/modal/container_process.py +0 -0
  102. {modal-0.74.61 → modal-0.75.0}/modal/container_process.pyi +0 -0
  103. {modal-0.74.61 → modal-0.75.0}/modal/dict.py +0 -0
  104. {modal-0.74.61 → modal-0.75.0}/modal/dict.pyi +0 -0
  105. {modal-0.74.61 → modal-0.75.0}/modal/environments.py +0 -0
  106. {modal-0.74.61 → modal-0.75.0}/modal/environments.pyi +0 -0
  107. {modal-0.74.61 → modal-0.75.0}/modal/exception.py +0 -0
  108. {modal-0.74.61 → modal-0.75.0}/modal/experimental/__init__.py +0 -0
  109. {modal-0.74.61 → modal-0.75.0}/modal/experimental/ipython.py +0 -0
  110. {modal-0.74.61 → modal-0.75.0}/modal/file_io.py +0 -0
  111. {modal-0.74.61 → modal-0.75.0}/modal/file_io.pyi +0 -0
  112. {modal-0.74.61 → modal-0.75.0}/modal/functions.py +0 -0
  113. {modal-0.74.61 → modal-0.75.0}/modal/gpu.py +0 -0
  114. {modal-0.74.61 → modal-0.75.0}/modal/image.pyi +0 -0
  115. {modal-0.74.61 → modal-0.75.0}/modal/io_streams.py +0 -0
  116. {modal-0.74.61 → modal-0.75.0}/modal/io_streams.pyi +0 -0
  117. {modal-0.74.61 → modal-0.75.0}/modal/mount.pyi +0 -0
  118. {modal-0.74.61 → modal-0.75.0}/modal/network_file_system.py +0 -0
  119. {modal-0.74.61 → modal-0.75.0}/modal/network_file_system.pyi +0 -0
  120. {modal-0.74.61 → modal-0.75.0}/modal/object.py +0 -0
  121. {modal-0.74.61 → modal-0.75.0}/modal/object.pyi +0 -0
  122. {modal-0.74.61 → modal-0.75.0}/modal/output.py +0 -0
  123. {modal-0.74.61 → modal-0.75.0}/modal/parallel_map.py +0 -0
  124. {modal-0.74.61 → modal-0.75.0}/modal/parallel_map.pyi +0 -0
  125. {modal-0.74.61 → modal-0.75.0}/modal/partial_function.py +0 -0
  126. {modal-0.74.61 → modal-0.75.0}/modal/partial_function.pyi +0 -0
  127. {modal-0.74.61 → modal-0.75.0}/modal/proxy.py +0 -0
  128. {modal-0.74.61 → modal-0.75.0}/modal/proxy.pyi +0 -0
  129. {modal-0.74.61 → modal-0.75.0}/modal/py.typed +0 -0
  130. {modal-0.74.61 → modal-0.75.0}/modal/queue.py +0 -0
  131. {modal-0.74.61 → modal-0.75.0}/modal/queue.pyi +0 -0
  132. {modal-0.74.61 → modal-0.75.0}/modal/requirements/2023.12.312.txt +0 -0
  133. {modal-0.74.61 → modal-0.75.0}/modal/requirements/2023.12.txt +0 -0
  134. {modal-0.74.61 → modal-0.75.0}/modal/requirements/2024.04.txt +0 -0
  135. {modal-0.74.61 → modal-0.75.0}/modal/requirements/2024.10.txt +0 -0
  136. {modal-0.74.61 → modal-0.75.0}/modal/requirements/PREVIEW.txt +0 -0
  137. {modal-0.74.61 → modal-0.75.0}/modal/requirements/README.md +0 -0
  138. {modal-0.74.61 → modal-0.75.0}/modal/requirements/base-images.json +0 -0
  139. {modal-0.74.61 → modal-0.75.0}/modal/retries.py +0 -0
  140. {modal-0.74.61 → modal-0.75.0}/modal/runner.py +0 -0
  141. {modal-0.74.61 → modal-0.75.0}/modal/runner.pyi +0 -0
  142. {modal-0.74.61 → modal-0.75.0}/modal/running_app.py +0 -0
  143. {modal-0.74.61 → modal-0.75.0}/modal/sandbox.py +0 -0
  144. {modal-0.74.61 → modal-0.75.0}/modal/sandbox.pyi +0 -0
  145. {modal-0.74.61 → modal-0.75.0}/modal/schedule.py +0 -0
  146. {modal-0.74.61 → modal-0.75.0}/modal/scheduler_placement.py +0 -0
  147. {modal-0.74.61 → modal-0.75.0}/modal/secret.py +0 -0
  148. {modal-0.74.61 → modal-0.75.0}/modal/secret.pyi +0 -0
  149. {modal-0.74.61 → modal-0.75.0}/modal/serving.py +0 -0
  150. {modal-0.74.61 → modal-0.75.0}/modal/serving.pyi +0 -0
  151. {modal-0.74.61 → modal-0.75.0}/modal/snapshot.py +0 -0
  152. {modal-0.74.61 → modal-0.75.0}/modal/snapshot.pyi +0 -0
  153. {modal-0.74.61 → modal-0.75.0}/modal/stream_type.py +0 -0
  154. {modal-0.74.61 → modal-0.75.0}/modal/token_flow.py +0 -0
  155. {modal-0.74.61 → modal-0.75.0}/modal/token_flow.pyi +0 -0
  156. {modal-0.74.61 → modal-0.75.0}/modal/volume.py +0 -0
  157. {modal-0.74.61 → modal-0.75.0}/modal/volume.pyi +0 -0
  158. {modal-0.74.61 → modal-0.75.0}/modal.egg-info/SOURCES.txt +0 -0
  159. {modal-0.74.61 → modal-0.75.0}/modal.egg-info/dependency_links.txt +0 -0
  160. {modal-0.74.61 → modal-0.75.0}/modal.egg-info/entry_points.txt +0 -0
  161. {modal-0.74.61 → modal-0.75.0}/modal.egg-info/requires.txt +0 -0
  162. {modal-0.74.61 → modal-0.75.0}/modal.egg-info/top_level.txt +0 -0
  163. {modal-0.74.61 → modal-0.75.0}/modal_docs/__init__.py +0 -0
  164. {modal-0.74.61 → modal-0.75.0}/modal_docs/gen_cli_docs.py +0 -0
  165. {modal-0.74.61 → modal-0.75.0}/modal_docs/gen_reference_docs.py +0 -0
  166. {modal-0.74.61 → modal-0.75.0}/modal_docs/mdmd/__init__.py +0 -0
  167. {modal-0.74.61 → modal-0.75.0}/modal_docs/mdmd/mdmd.py +0 -0
  168. {modal-0.74.61 → modal-0.75.0}/modal_docs/mdmd/signatures.py +0 -0
  169. {modal-0.74.61 → modal-0.75.0}/modal_proto/__init__.py +0 -0
  170. {modal-0.74.61 → modal-0.75.0}/modal_proto/api_grpc.py +0 -0
  171. {modal-0.74.61 → modal-0.75.0}/modal_proto/api_pb2_grpc.py +0 -0
  172. {modal-0.74.61 → modal-0.75.0}/modal_proto/api_pb2_grpc.pyi +0 -0
  173. {modal-0.74.61 → modal-0.75.0}/modal_proto/modal_api_grpc.py +0 -0
  174. {modal-0.74.61 → modal-0.75.0}/modal_proto/modal_options_grpc.py +0 -0
  175. {modal-0.74.61 → modal-0.75.0}/modal_proto/options.proto +0 -0
  176. {modal-0.74.61 → modal-0.75.0}/modal_proto/options_grpc.py +0 -0
  177. {modal-0.74.61 → modal-0.75.0}/modal_proto/options_pb2.py +0 -0
  178. {modal-0.74.61 → modal-0.75.0}/modal_proto/options_pb2.pyi +0 -0
  179. {modal-0.74.61 → modal-0.75.0}/modal_proto/options_pb2_grpc.py +0 -0
  180. {modal-0.74.61 → modal-0.75.0}/modal_proto/options_pb2_grpc.pyi +0 -0
  181. {modal-0.74.61 → modal-0.75.0}/modal_proto/py.typed +0 -0
  182. {modal-0.74.61 → modal-0.75.0}/modal_version/__main__.py +0 -0
  183. {modal-0.74.61 → modal-0.75.0}/pyproject.toml +0 -0
  184. {modal-0.74.61 → modal-0.75.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 0.74.61
3
+ Version: 0.75.0
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -1351,9 +1351,19 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1351
1351
  @property
1352
1352
  @live_method
1353
1353
  async def web_url(self) -> Optional[str]:
1354
+ """Deprecated. Use the `Function.get_web_url()` method instead.
1355
+
1356
+ URL of a Function running as a web endpoint.
1357
+ """
1358
+ deprecation_msg = """The Function.web_url property will be removed in a future version of Modal.
1359
+ Use the `Function.get_web_url()` method instead.
1360
+ """
1361
+ deprecation_warning((2025, 5, 6), deprecation_msg, pending=True)
1362
+ return self._web_url
1363
+
1364
+ @live_method
1365
+ async def get_web_url(self) -> Optional[str]:
1354
1366
  """URL of a Function running as a web endpoint."""
1355
- # TODO If we remove the @live_method above, we may want to provide better feedback when the underlying
1356
- # attribute is None because the object is not hydrated, rather than because it's not a web endpoint.
1357
1367
  return self._web_url
1358
1368
 
1359
1369
  @property
@@ -27,7 +27,7 @@ class _Client:
27
27
  _snapshotted: bool
28
28
 
29
29
  def __init__(
30
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.61"
30
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.75.0"
31
31
  ): ...
32
32
  def is_closed(self) -> bool: ...
33
33
  @property
@@ -86,7 +86,7 @@ class Client:
86
86
  _snapshotted: bool
87
87
 
88
88
  def __init__(
89
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.74.61"
89
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.75.0"
90
90
  ): ...
91
91
  def is_closed(self) -> bool: ...
92
92
  @property
@@ -94,6 +94,8 @@ class FilePatternMatcher(_AbstractPatternMatcher):
94
94
  raise ValueError('Illegal exclusion pattern: "!"')
95
95
  new_pattern.exclusion = True
96
96
  pattern = pattern[1:]
97
+ if os.path.isabs(pattern):
98
+ raise ValueError("Ignore patterns cannot be absolute paths")
97
99
  # In Python, we can proceed without explicit syntax checking
98
100
  new_pattern.cleaned_pattern = pattern
99
101
  new_pattern.dirs = pattern.split(os.path.sep)
@@ -186,6 +186,13 @@ class Function(
186
186
  def _check_no_web_url(self, fn_name: str): ...
187
187
  @property
188
188
  def web_url(self) -> typing.Optional[str]: ...
189
+
190
+ class __get_web_url_spec(typing_extensions.Protocol[SUPERSELF]):
191
+ def __call__(self, /) -> typing.Optional[str]: ...
192
+ async def aio(self, /) -> typing.Optional[str]: ...
193
+
194
+ get_web_url: __get_web_url_spec[typing_extensions.Self]
195
+
189
196
  @property
190
197
  def is_generator(self) -> bool: ...
191
198
 
@@ -279,8 +279,9 @@ def _create_context_mount(
279
279
  include_fn = FilePatternMatcher(*copy_patterns)
280
280
 
281
281
  def ignore_with_include(source: Path) -> bool:
282
- relative_source = source.relative_to(context_dir)
283
- if not include_fn(relative_source) or ignore_fn(relative_source):
282
+ if source.is_absolute():
283
+ source = source.relative_to(context_dir)
284
+ if not include_fn(source) or ignore_fn(source):
284
285
  return True
285
286
 
286
287
  return False
@@ -153,9 +153,9 @@ class _MountDir(_MountEntry):
153
153
 
154
154
  for local_filename in gen:
155
155
  local_path = Path(local_filename)
156
- if not self.ignore(local_path):
157
- local_relpath = local_path.expanduser().absolute().relative_to(local_dir)
158
- mount_path = self.remote_path / local_relpath.as_posix()
156
+ rel_local_path = local_path.relative_to(local_dir)
157
+ if not self.ignore(rel_local_path):
158
+ mount_path = self.remote_path / rel_local_path.as_posix()
159
159
  yield local_path.resolve(), mount_path
160
160
 
161
161
  def watch_entry(self):
@@ -339,8 +339,8 @@ class _Mount(_Object, type_prefix="mo"):
339
339
  return _Mount._new()._extend(
340
340
  _MountDir(
341
341
  local_dir=local_path,
342
- ignore=ignore,
343
342
  remote_path=remote_path,
343
+ ignore=ignore,
344
344
  recursive=True,
345
345
  ),
346
346
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 0.74.61
3
+ Version: 0.75.0
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -1112,9 +1112,11 @@ message DictPopResponse {
1112
1112
  message DictUpdateRequest {
1113
1113
  string dict_id = 1 [ (modal.options.audit_target_attr) = true ];
1114
1114
  repeated DictEntry updates = 2;
1115
+ bool if_not_exists = 3;
1115
1116
  }
1116
1117
 
1117
1118
  message DictUpdateResponse {
1119
+ bool created = 1;
1118
1120
  }
1119
1121
 
1120
1122
  message Domain {