modal 0.73.35__py3-none-any.whl → 0.73.36__py3-none-any.whl

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.
modal/_functions.py CHANGED
@@ -1074,25 +1074,9 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1074
1074
  await retry_transient_errors(self.client.stub.FunctionUpdateSchedulingParams, request)
1075
1075
 
1076
1076
  @classmethod
1077
- @renamed_parameter((2024, 12, 18), "tag", "name")
1078
- def from_name(
1079
- cls: type["_Function"],
1080
- app_name: str,
1081
- name: str,
1082
- namespace=api_pb2.DEPLOYMENT_NAMESPACE_WORKSPACE,
1083
- environment_name: Optional[str] = None,
1084
- ) -> "_Function":
1085
- """Reference a Function from a deployed App by its name.
1086
-
1087
- In contrast to `modal.Function.lookup`, this is a lazy method
1088
- that defers hydrating the local object with metadata from
1089
- Modal servers until the first time it is actually used.
1090
-
1091
- ```python
1092
- f = modal.Function.from_name("other-app", "function")
1093
- ```
1094
- """
1095
-
1077
+ def _from_name(cls, app_name: str, name: str, namespace, environment_name: Optional[str]):
1078
+ # internal function lookup implementation that allows lookup of class "service functions"
1079
+ # in addition to non-class functions
1096
1080
  async def _load_remote(self: _Function, resolver: Resolver, existing_object_id: Optional[str]):
1097
1081
  assert resolver.client and resolver.client.stub
1098
1082
  request = api_pb2.FunctionGetRequest(
@@ -1116,6 +1100,38 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1116
1100
  rep = f"Function.from_name({app_name}, {name})"
1117
1101
  return cls._from_loader(_load_remote, rep, is_another_app=True, hydrate_lazily=True)
1118
1102
 
1103
+ @classmethod
1104
+ @renamed_parameter((2024, 12, 18), "tag", "name")
1105
+ def from_name(
1106
+ cls: type["_Function"],
1107
+ app_name: str,
1108
+ name: str,
1109
+ namespace=api_pb2.DEPLOYMENT_NAMESPACE_WORKSPACE,
1110
+ environment_name: Optional[str] = None,
1111
+ ) -> "_Function":
1112
+ """Reference a Function from a deployed App by its name.
1113
+
1114
+ In contrast to `modal.Function.lookup`, this is a lazy method
1115
+ that defers hydrating the local object with metadata from
1116
+ Modal servers until the first time it is actually used.
1117
+
1118
+ ```python
1119
+ f = modal.Function.from_name("other-app", "function")
1120
+ ```
1121
+ """
1122
+ if "." in name:
1123
+ class_name, method_name = name.split(".", 1)
1124
+ deprecation_warning(
1125
+ (2025, 2, 11),
1126
+ "Looking up class methods using Function.from_name will be deprecated"
1127
+ " in a future version of Modal.\nUse modal.Cls.from_name instead, e.g.\n\n"
1128
+ f'{class_name} = modal.Cls.from_name("{app_name}", "{class_name}")\n'
1129
+ f"instance = {class_name}(...)\n"
1130
+ f"instance.{method_name}.remote(...)\n",
1131
+ )
1132
+
1133
+ return cls._from_name(app_name, name, namespace, environment_name)
1134
+
1119
1135
  @staticmethod
1120
1136
  @renamed_parameter((2024, 12, 18), "tag", "name")
1121
1137
  async def lookup(
modal/client.pyi CHANGED
@@ -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.73.35"
30
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.36"
31
31
  ): ...
32
32
  def is_closed(self) -> bool: ...
33
33
  @property
@@ -85,7 +85,7 @@ class Client:
85
85
  _snapshotted: bool
86
86
 
87
87
  def __init__(
88
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.35"
88
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.36"
89
89
  ): ...
90
90
  def is_closed(self) -> bool: ...
91
91
  @property
modal/cls.py CHANGED
@@ -558,9 +558,10 @@ class _Cls(_Object, type_prefix="cs"):
558
558
  cls = cls._from_loader(_load_remote, rep, is_another_app=True, hydrate_lazily=True)
559
559
 
560
560
  class_service_name = f"{name}.*" # special name of the base service function for the class
561
- cls._class_service_function = _Function.from_name(
561
+ cls._class_service_function = _Function._from_name(
562
562
  app_name,
563
563
  class_service_name,
564
+ namespace=namespace,
564
565
  environment_name=_environment_name,
565
566
  )
566
567
  cls._name = name
modal/functions.pyi CHANGED
@@ -116,6 +116,8 @@ class Function(
116
116
 
117
117
  keep_warm: __keep_warm_spec[typing_extensions.Self]
118
118
 
119
+ @classmethod
120
+ def _from_name(cls, app_name: str, name: str, namespace, environment_name: typing.Optional[str]): ...
119
121
  @classmethod
120
122
  def from_name(
121
123
  cls: type[Function], app_name: str, name: str, namespace=1, environment_name: typing.Optional[str] = None
@@ -198,11 +200,11 @@ class Function(
198
200
 
199
201
  _call_generator_nowait: ___call_generator_nowait_spec[typing_extensions.Self]
200
202
 
201
- class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
203
+ class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
202
204
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
203
205
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
204
206
 
205
- remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
207
+ remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
206
208
 
207
209
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
208
210
  def __call__(self, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
@@ -217,19 +219,19 @@ class Function(
217
219
  self, *args: modal._functions.P.args, **kwargs: modal._functions.P.kwargs
218
220
  ) -> modal._functions.OriginalReturnType: ...
219
221
 
220
- class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
222
+ class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
221
223
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
222
224
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
223
225
 
224
226
  _experimental_spawn: ___experimental_spawn_spec[
225
- modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
227
+ modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
226
228
  ]
227
229
 
228
- class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
230
+ class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
229
231
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
230
232
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
231
233
 
232
- spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
234
+ spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
233
235
 
234
236
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]: ...
235
237
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: modal
3
- Version: 0.73.35
3
+ Version: 0.73.36
4
4
  Summary: Python client library for Modal
5
5
  Author: Modal Labs
6
6
  Author-email: support@modal.com
@@ -3,7 +3,7 @@ modal/__main__.py,sha256=CgIjP8m1xJjjd4AXc-delmR6LdBCZclw2A_V38CFIio,2870
3
3
  modal/_clustered_functions.py,sha256=kTf-9YBXY88NutC1akI-gCbvf01RhMPCw-zoOI_YIUE,2700
4
4
  modal/_clustered_functions.pyi,sha256=vllkegc99A0jrUOWa8mdlSbdp6uz36TsHhGxysAOpaQ,771
5
5
  modal/_container_entrypoint.py,sha256=YtfJ852XUDtAWBD-yVs99zy933-VBEKQyIngEj36Qcw,29286
6
- modal/_functions.py,sha256=Jf1ImQxyNQKHw6ylEUxyTcYwKWWcH5CoilpfZ_tm72g,71510
6
+ modal/_functions.py,sha256=UpkT7V6YjIL_BWJzIUV847-eSwBPWZSMnONtftr_Ses,72372
7
7
  modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
8
8
  modal/_location.py,sha256=joiX-0ZeutEUDTrrqLF1GHXCdVLF-rHzstocbMcd_-k,366
9
9
  modal/_object.py,sha256=ItQcsMNkz9Y3kdTsvfNarbW-paJ2qabDyQ7njaqY0XI,11359
@@ -22,10 +22,10 @@ modal/app.py,sha256=rCOPD51gVyow8muyaqMuV65qfTnAZKf_w1OCZdSF_6o,44636
22
22
  modal/app.pyi,sha256=0MMCgskIL4r3eq8oBcfm2lLyeao2gXjS3iXaIfmaJ-o,25959
23
23
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
24
24
  modal/client.py,sha256=8SQawr7P1PNUCq1UmJMUQXG2jIo4Nmdcs311XqrNLRE,15276
25
- modal/client.pyi,sha256=zGuFnRO-zNyaRSP8S64WcfhirY9_306lnDr7xCpb_fA,7593
25
+ modal/client.pyi,sha256=gy7-aWZUpvjyNpRtJ00m-uSlLs_Rxaw9ZCWUk8vGx8Q,7593
26
26
  modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
27
27
  modal/cloud_bucket_mount.pyi,sha256=30T3K1a89l6wzmEJ_J9iWv9SknoGqaZDx59Xs-ZQcmk,1607
28
- modal/cls.py,sha256=5Er9L9tGpLGIrbiHOI7c9266gPG6nhxoJ_BX8op96nU,31096
28
+ modal/cls.py,sha256=nJhJr-YuttOmdNWxtMHcBV-q6iQmY5qXkEy9yO43clY,31130
29
29
  modal/cls.pyi,sha256=QqYoRKVCKhP_HkHittKpEZ6sqXkEdtEl4n1wMqeoe3M,8897
30
30
  modal/config.py,sha256=XT1W4Y9PVkbYMAXjJRshvQEPDhZmnfW_ZRMwl8XKoqA,11149
31
31
  modal/container_process.py,sha256=WTqLn01dJPVkPpwR_0w_JH96ceN5mV4TGtiu1ZR2RRA,6108
@@ -41,7 +41,7 @@ modal/file_io.py,sha256=lcMs_E9Xfm0YX1t9U2wNIBPnqHRxmImqjLW1GHqVmyg,20945
41
41
  modal/file_io.pyi,sha256=NTRft1tbPSWf9TlWVeZmTlgB5AZ_Zhu2srWIrWr7brk,9445
42
42
  modal/file_pattern_matcher.py,sha256=trosX-Bp7dOubudN1bLLhRAoidWy1TcoaR4Pv8CedWw,6497
43
43
  modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
44
- modal/functions.pyi,sha256=R8aCATbAInu3ujJjWh4kASdTmref8Ysnj3X4Bu77ID0,14255
44
+ modal/functions.pyi,sha256=CEM12TJcrb-6v-VAHcDvzrgAlynFTDhUTXKf68E9O30,14378
45
45
  modal/gpu.py,sha256=Kbhs_u49FaC2Zi0TjCdrpstpRtT5eZgecynmQi5IZVE,6752
46
46
  modal/image.py,sha256=KYc6bg-m9A6wiLF38dWcFBMrEATyR2KOF0sp-6O9uC0,91508
47
47
  modal/image.pyi,sha256=kMkIDHcyyhA7BC2Vrx0RfrLEsqK8Ng2-IqUKL-CJexI,26250
@@ -172,10 +172,10 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
172
172
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
173
173
  modal_version/__init__.py,sha256=wiJQ53c-OMs0Xf1UeXOxQ7FwlV1VzIjnX6o-pRYZ_Pk,470
174
174
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
175
- modal_version/_version_generated.py,sha256=wAGaC7NwMRQUUUvT57QmxY3RdcCTvm9pAbVhlIpwHhY,149
176
- modal-0.73.35.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
177
- modal-0.73.35.dist-info/METADATA,sha256=AH-Y6QZZcLPeRkCngemat7i9PoEQXsJpmetQ8W1uzZQ,2330
178
- modal-0.73.35.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
179
- modal-0.73.35.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
180
- modal-0.73.35.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
181
- modal-0.73.35.dist-info/RECORD,,
175
+ modal_version/_version_generated.py,sha256=fP5zP8t74bD5IjSKt6l4Uo9LQlYTy8J8zrEL-zloyfw,149
176
+ modal-0.73.36.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
177
+ modal-0.73.36.dist-info/METADATA,sha256=oHHOvStUgzT8jJR-061X0tYvZrXsQ8PD7bWy2rQ9zKM,2330
178
+ modal-0.73.36.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
179
+ modal-0.73.36.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
180
+ modal-0.73.36.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
181
+ modal-0.73.36.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
 
3
3
  # Note: Reset this value to -1 whenever you make a minor `0.X` release of the client.
4
- build_number = 35 # git: e8d6fd1
4
+ build_number = 36 # git: 680da10