modal 0.71.7__py3-none-any.whl → 0.71.12__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/_container_entrypoint.py +13 -3
- modal/_runtime/asgi.py +33 -29
- modal/cli/volume.py +23 -0
- modal/client.pyi +2 -2
- modal/file_io.py +101 -83
- modal/file_io.pyi +4 -23
- modal/io_streams.py +27 -15
- modal/volume.py +12 -0
- modal/volume.pyi +28 -0
- {modal-0.71.7.dist-info → modal-0.71.12.dist-info}/METADATA +1 -1
- {modal-0.71.7.dist-info → modal-0.71.12.dist-info}/RECORD +23 -24
- modal_proto/api.proto +6 -0
- modal_proto/api_grpc.py +16 -0
- modal_proto/api_pb2.py +83 -71
- modal_proto/api_pb2.pyi +17 -0
- modal_proto/api_pb2_grpc.py +33 -0
- modal_proto/api_pb2_grpc.pyi +10 -0
- modal_proto/modal_api_grpc.py +1 -0
- modal_version/_version_generated.py +1 -1
- modal/io_streams_helper.py +0 -53
- {modal-0.71.7.dist-info → modal-0.71.12.dist-info}/LICENSE +0 -0
- {modal-0.71.7.dist-info → modal-0.71.12.dist-info}/WHEEL +0 -0
- {modal-0.71.7.dist-info → modal-0.71.12.dist-info}/entry_points.txt +0 -0
- {modal-0.71.7.dist-info → modal-0.71.12.dist-info}/top_level.txt +0 -0
modal/io_streams.py
CHANGED
@@ -14,8 +14,7 @@ from typing import (
|
|
14
14
|
from grpclib import Status
|
15
15
|
from grpclib.exceptions import GRPCError, StreamTerminatedError
|
16
16
|
|
17
|
-
from modal.exception import InvalidError
|
18
|
-
from modal.io_streams_helper import consume_stream_with_retries
|
17
|
+
from modal.exception import ClientClosed, InvalidError
|
19
18
|
from modal_proto import api_pb2
|
20
19
|
|
21
20
|
from ._utils.async_utils import synchronize_api
|
@@ -177,21 +176,34 @@ class _StreamReader(Generic[T]):
|
|
177
176
|
if self._stream_type == StreamType.DEVNULL:
|
178
177
|
return
|
179
178
|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
self.
|
179
|
+
completed = False
|
180
|
+
retries_remaining = 10
|
181
|
+
while not completed:
|
182
|
+
try:
|
183
|
+
iterator = _container_process_logs_iterator(self._object_id, self._file_descriptor, self._client)
|
185
184
|
|
186
|
-
|
187
|
-
|
185
|
+
async for message in iterator:
|
186
|
+
if self._stream_type == StreamType.STDOUT and message:
|
187
|
+
print(message.decode("utf-8"), end="")
|
188
|
+
elif self._stream_type == StreamType.PIPE:
|
189
|
+
self._container_process_buffer.append(message)
|
190
|
+
if message is None:
|
191
|
+
completed = True
|
192
|
+
break
|
188
193
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
194
|
+
except (GRPCError, StreamTerminatedError, ClientClosed) as exc:
|
195
|
+
if retries_remaining > 0:
|
196
|
+
retries_remaining -= 1
|
197
|
+
if isinstance(exc, GRPCError):
|
198
|
+
if exc.status in RETRYABLE_GRPC_STATUS_CODES:
|
199
|
+
await asyncio.sleep(1.0)
|
200
|
+
continue
|
201
|
+
elif isinstance(exc, StreamTerminatedError):
|
202
|
+
continue
|
203
|
+
elif isinstance(exc, ClientClosed):
|
204
|
+
# If the client was closed, the user has triggered a cleanup.
|
205
|
+
break
|
206
|
+
raise exc
|
195
207
|
|
196
208
|
async def _stream_container_process(self) -> AsyncGenerator[tuple[Optional[bytes], str], None]:
|
197
209
|
"""Streams the container process buffer to the reader."""
|
modal/volume.py
CHANGED
@@ -506,6 +506,18 @@ class _Volume(_Object, type_prefix="vo"):
|
|
506
506
|
req = api_pb2.VolumeDeleteRequest(volume_id=obj.object_id)
|
507
507
|
await retry_transient_errors(obj._client.stub.VolumeDelete, req)
|
508
508
|
|
509
|
+
@staticmethod
|
510
|
+
async def rename(
|
511
|
+
old_name: str,
|
512
|
+
new_name: str,
|
513
|
+
*,
|
514
|
+
client: Optional[_Client] = None,
|
515
|
+
environment_name: Optional[str] = None,
|
516
|
+
):
|
517
|
+
obj = await _Volume.lookup(old_name, client=client, environment_name=environment_name)
|
518
|
+
req = api_pb2.VolumeRenameRequest(volume_id=obj.object_id, name=new_name)
|
519
|
+
await retry_transient_errors(obj._client.stub.VolumeRename, req)
|
520
|
+
|
509
521
|
|
510
522
|
class _VolumeUploadContextManager:
|
511
523
|
"""Context manager for batch-uploading files to a Volume."""
|
modal/volume.pyi
CHANGED
@@ -85,6 +85,14 @@ class _Volume(modal.object._Object):
|
|
85
85
|
async def delete(
|
86
86
|
name: str, client: typing.Optional[modal.client._Client] = None, environment_name: typing.Optional[str] = None
|
87
87
|
): ...
|
88
|
+
@staticmethod
|
89
|
+
async def rename(
|
90
|
+
old_name: str,
|
91
|
+
new_name: str,
|
92
|
+
*,
|
93
|
+
client: typing.Optional[modal.client._Client] = None,
|
94
|
+
environment_name: typing.Optional[str] = None,
|
95
|
+
): ...
|
88
96
|
|
89
97
|
class _VolumeUploadContextManager:
|
90
98
|
_volume_id: str
|
@@ -272,6 +280,26 @@ class Volume(modal.object.Object):
|
|
272
280
|
|
273
281
|
delete: __delete_spec
|
274
282
|
|
283
|
+
class __rename_spec(typing_extensions.Protocol):
|
284
|
+
def __call__(
|
285
|
+
self,
|
286
|
+
old_name: str,
|
287
|
+
new_name: str,
|
288
|
+
*,
|
289
|
+
client: typing.Optional[modal.client.Client] = None,
|
290
|
+
environment_name: typing.Optional[str] = None,
|
291
|
+
): ...
|
292
|
+
async def aio(
|
293
|
+
self,
|
294
|
+
old_name: str,
|
295
|
+
new_name: str,
|
296
|
+
*,
|
297
|
+
client: typing.Optional[modal.client.Client] = None,
|
298
|
+
environment_name: typing.Optional[str] = None,
|
299
|
+
): ...
|
300
|
+
|
301
|
+
rename: __rename_spec
|
302
|
+
|
275
303
|
class VolumeUploadContextManager:
|
276
304
|
_volume_id: str
|
277
305
|
_client: modal.client.Client
|
@@ -2,7 +2,7 @@ modal/__init__.py,sha256=3NJLLHb0TRc2tc68kf8NHzORx38GbtbZvPEWDWrQ6N4,2234
|
|
2
2
|
modal/__main__.py,sha256=scYhGFqh8OJcVDo-VOxIT6CCwxOgzgflYWMnIZiMRqE,2871
|
3
3
|
modal/_clustered_functions.py,sha256=kTf-9YBXY88NutC1akI-gCbvf01RhMPCw-zoOI_YIUE,2700
|
4
4
|
modal/_clustered_functions.pyi,sha256=vllkegc99A0jrUOWa8mdlSbdp6uz36TsHhGxysAOpaQ,771
|
5
|
-
modal/_container_entrypoint.py,sha256
|
5
|
+
modal/_container_entrypoint.py,sha256=U1ZU-Sa0LC646YPh0AWSGVBHmzfTxYUiGu2viKzW-Zs,29643
|
6
6
|
modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
|
7
7
|
modal/_location.py,sha256=S3lSxIU3h9HkWpkJ3Pwo0pqjIOSB1fjeSgUsY3x7eec,1202
|
8
8
|
modal/_output.py,sha256=0fWX_KQwhER--U81ys16CL-pA5A-LN20C0EZjElKGJQ,25410
|
@@ -19,7 +19,7 @@ modal/app.py,sha256=vEE0cK5QPF6_cdW5AJvcuWxz5KmeprHwBEtlDkVRHgE,45582
|
|
19
19
|
modal/app.pyi,sha256=Gx7gxjfQ70sxhbwfpx1VjvzEON-ZEMTJ_Vy8qt0oQvo,25302
|
20
20
|
modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
|
21
21
|
modal/client.py,sha256=JAnd4-GCN093BwkvOFAK5a6iy5ycxofjpUncMxlrIMw,15253
|
22
|
-
modal/client.pyi,sha256=
|
22
|
+
modal/client.pyi,sha256=fidFDEnApJ5cdIG6f0JFX3SIzsgBEH7Ubu26iPbYew4,7280
|
23
23
|
modal/cloud_bucket_mount.py,sha256=G7T7jWLD0QkmrfKR75mSTwdUZ2xNfj7pkVqb4ipmxmI,5735
|
24
24
|
modal/cloud_bucket_mount.pyi,sha256=CEi7vrH3kDUF4LAy4qP6tfImy2UJuFRcRbsgRNM1wo8,1403
|
25
25
|
modal/cls.py,sha256=3hjb0JcoPjxKZNeK22f5rR43bZRBjoRI7_EMZXY7YrE,31172
|
@@ -33,17 +33,16 @@ modal/environments.py,sha256=wbv9ttFCbzATGfwcmvYiG608PfHovx0AQmawsg-jmic,6660
|
|
33
33
|
modal/environments.pyi,sha256=rF7oaaELoSNuoD6qImGnIbuGPtgWwR5SlcExyYJ61hQ,3515
|
34
34
|
modal/exception.py,sha256=4JyO-SACaLNDe2QC48EjsK8GMkZ8AgEurZ8j1YdRu8E,5263
|
35
35
|
modal/experimental.py,sha256=npfKbyMpI41uZZs9HW_QiB3E4ykWfDXZbACXXbw6qeA,2385
|
36
|
-
modal/file_io.py,sha256=
|
37
|
-
modal/file_io.pyi,sha256=
|
36
|
+
modal/file_io.py,sha256=lcMs_E9Xfm0YX1t9U2wNIBPnqHRxmImqjLW1GHqVmyg,20945
|
37
|
+
modal/file_io.pyi,sha256=NrIoB0YjIqZ8MDMe826xAnybT0ww_kxQM3iPLo82REU,8898
|
38
38
|
modal/file_pattern_matcher.py,sha256=LaI7Paxg0xR9D-D7Tgc60xR0w1KZee22LjGbFie1Vms,5571
|
39
39
|
modal/functions.py,sha256=3uJPbrEAWhpFfLfUnoRjGmvEUC-_wVh-8yNJBx8eVeM,68249
|
40
40
|
modal/functions.pyi,sha256=3ESJ61f8oEDycDmrpnuNB2vjFKuLBG_aqyliXPTdY7M,25407
|
41
41
|
modal/gpu.py,sha256=MTxj6ql8EpgfBg8YmZ5a1cLznyuZFssX1qXbEX4LKVM,7503
|
42
42
|
modal/image.py,sha256=oKqqLhc3Ap2XMG5MKVlERKkMTwJPkNMNcSzxoZh4zuw,85259
|
43
43
|
modal/image.pyi,sha256=Pa1_LVr3FyNsnu_MhBO08fBgCeLazTEe25phYdu0bzE,25365
|
44
|
-
modal/io_streams.py,sha256=
|
44
|
+
modal/io_streams.py,sha256=QkQiizKRzd5bnbKQsap31LJgBYlAnj4-XkV_50xPYX0,15079
|
45
45
|
modal/io_streams.pyi,sha256=bCCVSxkMcosYd8O3PQDDwJw7TQ8JEcnYonLJ5t27TQs,4804
|
46
|
-
modal/io_streams_helper.py,sha256=B5Ui56ph7LkRpZX0tAF80Q-gOMsvPPLx5bpIPX0kgDc,1772
|
47
46
|
modal/mount.py,sha256=wOr-2vmKImsE3lHBII8hL2gYy5ng46R58QwId4JultQ,29313
|
48
47
|
modal/mount.pyi,sha256=FiNV1wIKFvd0ZMZ0tm1mz6ZSA5Hjsge-kFSA5tPWfcI,10503
|
49
48
|
modal/network_file_system.py,sha256=INj1TfN_Fsmabmlte7anvey1epodjbMmjBW_TIJSST4,14406
|
@@ -75,10 +74,10 @@ modal/serving.pyi,sha256=ncV-9jY_vZYFnGs5ZnMb3ffrX8LmcLdIMHBC56xRbtE,1711
|
|
75
74
|
modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
|
76
75
|
modal/token_flow.py,sha256=LcgSce_MSQ2p7j55DPwpVRpiAtCDe8GRSEwzO7muNR8,6774
|
77
76
|
modal/token_flow.pyi,sha256=gOYtYujrWt_JFZeiI8EmfahXPx5GCR5Na-VaPQcWgEY,1937
|
78
|
-
modal/volume.py,sha256=
|
79
|
-
modal/volume.pyi,sha256=
|
77
|
+
modal/volume.py,sha256=NoqdOTrjSUEBkUj-Of_oi7I_yCuNmaLqr3TIsTWOddM,29674
|
78
|
+
modal/volume.pyi,sha256=GfyVeLyM7DMiBlg0I5N6OtJl0Bzv0-rNQXkWVO0j5c0,11903
|
80
79
|
modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
81
|
-
modal/_runtime/asgi.py,sha256=
|
80
|
+
modal/_runtime/asgi.py,sha256=c4hmaMW1pLo-cm7ouriJjieuFm4ZF6D2LMy0638sfOs,22139
|
82
81
|
modal/_runtime/container_io_manager.py,sha256=HgDLjE78yy1P7WZTmsEVDf89YnFFWG63Ddes8uYLVDY,43764
|
83
82
|
modal/_runtime/execution_context.py,sha256=E6ofm6j1POXGPxS841X3V7JU6NheVb8OkQc7JpLq4Kg,2712
|
84
83
|
modal/_runtime/telemetry.py,sha256=T1RoAGyjBDr1swiM6pPsGRSITm7LI5FDK18oNXxY08U,5163
|
@@ -124,7 +123,7 @@ modal/cli/run.py,sha256=QMs3BVSkq8jve76BqgstGt4C6jilbDD9gpCCRPuHUy0,17879
|
|
124
123
|
modal/cli/secret.py,sha256=uQpwYrMY98iMCWeZOQTcktOYhPTZ8IHnyealDc2CZqo,4206
|
125
124
|
modal/cli/token.py,sha256=mxSgOWakXG6N71hQb1ko61XAR9ZGkTMZD-Txn7gmTac,1924
|
126
125
|
modal/cli/utils.py,sha256=hZmjyzcPjDnQSkLvycZD2LhGdcsfdZshs_rOU78EpvI,3717
|
127
|
-
modal/cli/volume.py,sha256=
|
126
|
+
modal/cli/volume.py,sha256=Jrm-1R9u92JbbUM62bkB9RzAM_jO8wi7T2-i6Cb2XG0,10568
|
128
127
|
modal/cli/programs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
|
129
128
|
modal/cli/programs/run_jupyter.py,sha256=RRr07CqZrStMbLdBM3PpzU6KM8t9FtLbdIPthg2-Mpw,2755
|
130
129
|
modal/cli/programs/vscode.py,sha256=m80wuQyTALTc7y-kAVqmMjtrcb6muCtpuhxsJm4Va2Y,3453
|
@@ -149,13 +148,13 @@ modal_global_objects/mounts/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0
|
|
149
148
|
modal_global_objects/mounts/modal_client_package.py,sha256=W0E_yShsRojPzWm6LtIQqNVolapdnrZkm2hVEQuZK_4,767
|
150
149
|
modal_global_objects/mounts/python_standalone.py,sha256=SL_riIxpd8mP4i4CLDCWiFFNj0Ltknm9c_UIGfX5d60,1836
|
151
150
|
modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
152
|
-
modal_proto/api.proto,sha256=
|
153
|
-
modal_proto/api_grpc.py,sha256=
|
154
|
-
modal_proto/api_pb2.py,sha256=
|
155
|
-
modal_proto/api_pb2.pyi,sha256=
|
156
|
-
modal_proto/api_pb2_grpc.py,sha256=
|
157
|
-
modal_proto/api_pb2_grpc.pyi,sha256
|
158
|
-
modal_proto/modal_api_grpc.py,sha256=
|
151
|
+
modal_proto/api.proto,sha256=1hO6_dn7DwgFra9TQSAXBt1NV4ETiiURPHe09bodinc,80368
|
152
|
+
modal_proto/api_grpc.py,sha256=VakjV_Ge3fgZDRJN6EeG2yY_LMkZvn6yVXr5SnFKIDA,103542
|
153
|
+
modal_proto/api_pb2.py,sha256=77arFb-gAsuI-7Rbr65FxAB13i-mPoJEHYvs7z5Uo1s,295839
|
154
|
+
modal_proto/api_pb2.pyi,sha256=iGrfDlLXPg8oC9QdWOFlCrNoJqB0FompkpVa-EskYOg,394251
|
155
|
+
modal_proto/api_pb2_grpc.py,sha256=OAvrG7OCPKmF-6eawqc4X5iLN0WFBQ_AvufuWnHm3Es,224030
|
156
|
+
modal_proto/api_pb2_grpc.pyi,sha256=-bE8AO-IJsg0WMwSzEEe_jnmeirta3tqj5IwTVIrF6c,52169
|
157
|
+
modal_proto/modal_api_grpc.py,sha256=kOABHGzB81bAhxqKwj79DKqdK2HlcC4U0MkFETkQwfQ,13826
|
159
158
|
modal_proto/modal_options_grpc.py,sha256=qJ1cuwA54oRqrdTyPTbvfhFZYd9HhJKK5UCwt523r3Y,120
|
160
159
|
modal_proto/options.proto,sha256=a-siq4swVbZPfaFRXAipRZzGP2bq8OsdUvjlyzAeodQ,488
|
161
160
|
modal_proto/options_grpc.py,sha256=M18X3d-8F_cNYSVM3I25dUTO5rZ0rd-vCCfynfh13Nc,125
|
@@ -166,10 +165,10 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
|
|
166
165
|
modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
167
166
|
modal_version/__init__.py,sha256=BEBWj9tcbFUwzEjUrqly601rauw5cYsHdcmJHs3iu0s,470
|
168
167
|
modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
|
169
|
-
modal_version/_version_generated.py,sha256=
|
170
|
-
modal-0.71.
|
171
|
-
modal-0.71.
|
172
|
-
modal-0.71.
|
173
|
-
modal-0.71.
|
174
|
-
modal-0.71.
|
175
|
-
modal-0.71.
|
168
|
+
modal_version/_version_generated.py,sha256=tsI6q2yoqEFbt-h7LyODo6hXvuxvd0qyoes8iA52jUA,149
|
169
|
+
modal-0.71.12.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
170
|
+
modal-0.71.12.dist-info/METADATA,sha256=7OCMKt2uJg0IqSqDJ8V-vcMrWoLr5dWLVp5SQ0NOXvk,2329
|
171
|
+
modal-0.71.12.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
172
|
+
modal-0.71.12.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
173
|
+
modal-0.71.12.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
|
174
|
+
modal-0.71.12.dist-info/RECORD,,
|
modal_proto/api.proto
CHANGED
@@ -2680,6 +2680,11 @@ message VolumeRemoveFileRequest {
|
|
2680
2680
|
bool recursive = 3;
|
2681
2681
|
}
|
2682
2682
|
|
2683
|
+
message VolumeRenameRequest {
|
2684
|
+
string volume_id = 1 [ (modal.options.audit_target_attr) = true ];
|
2685
|
+
string name = 2;
|
2686
|
+
}
|
2687
|
+
|
2683
2688
|
message Warning {
|
2684
2689
|
enum WarningType {
|
2685
2690
|
WARNING_TYPE_UNSPECIFIED = 0;
|
@@ -2887,6 +2892,7 @@ service ModalClient {
|
|
2887
2892
|
rpc VolumePutFiles(VolumePutFilesRequest) returns (google.protobuf.Empty);
|
2888
2893
|
rpc VolumeReload(VolumeReloadRequest) returns (google.protobuf.Empty);
|
2889
2894
|
rpc VolumeRemoveFile(VolumeRemoveFileRequest) returns (google.protobuf.Empty);
|
2895
|
+
rpc VolumeRename(VolumeRenameRequest) returns (google.protobuf.Empty);
|
2890
2896
|
|
2891
2897
|
// Workspaces
|
2892
2898
|
rpc WorkspaceNameLookup(google.protobuf.Empty) returns (WorkspaceNameLookupResponse);
|
modal_proto/api_grpc.py
CHANGED
@@ -549,6 +549,10 @@ class ModalClientBase(abc.ABC):
|
|
549
549
|
async def VolumeRemoveFile(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.VolumeRemoveFileRequest, google.protobuf.empty_pb2.Empty]') -> None:
|
550
550
|
pass
|
551
551
|
|
552
|
+
@abc.abstractmethod
|
553
|
+
async def VolumeRename(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.VolumeRenameRequest, google.protobuf.empty_pb2.Empty]') -> None:
|
554
|
+
pass
|
555
|
+
|
552
556
|
@abc.abstractmethod
|
553
557
|
async def WorkspaceNameLookup(self, stream: 'grpclib.server.Stream[google.protobuf.empty_pb2.Empty, modal_proto.api_pb2.WorkspaceNameLookupResponse]') -> None:
|
554
558
|
pass
|
@@ -1353,6 +1357,12 @@ class ModalClientBase(abc.ABC):
|
|
1353
1357
|
modal_proto.api_pb2.VolumeRemoveFileRequest,
|
1354
1358
|
google.protobuf.empty_pb2.Empty,
|
1355
1359
|
),
|
1360
|
+
'/modal.client.ModalClient/VolumeRename': grpclib.const.Handler(
|
1361
|
+
self.VolumeRename,
|
1362
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
1363
|
+
modal_proto.api_pb2.VolumeRenameRequest,
|
1364
|
+
google.protobuf.empty_pb2.Empty,
|
1365
|
+
),
|
1356
1366
|
'/modal.client.ModalClient/WorkspaceNameLookup': grpclib.const.Handler(
|
1357
1367
|
self.WorkspaceNameLookup,
|
1358
1368
|
grpclib.const.Cardinality.UNARY_UNARY,
|
@@ -2163,6 +2173,12 @@ class ModalClientStub:
|
|
2163
2173
|
modal_proto.api_pb2.VolumeRemoveFileRequest,
|
2164
2174
|
google.protobuf.empty_pb2.Empty,
|
2165
2175
|
)
|
2176
|
+
self.VolumeRename = grpclib.client.UnaryUnaryMethod(
|
2177
|
+
channel,
|
2178
|
+
'/modal.client.ModalClient/VolumeRename',
|
2179
|
+
modal_proto.api_pb2.VolumeRenameRequest,
|
2180
|
+
google.protobuf.empty_pb2.Empty,
|
2181
|
+
)
|
2166
2182
|
self.WorkspaceNameLookup = grpclib.client.UnaryUnaryMethod(
|
2167
2183
|
channel,
|
2168
2184
|
'/modal.client.ModalClient/WorkspaceNameLookup',
|