modal 1.1.5.dev53__tar.gz → 1.1.5.dev55__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.
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/PKG-INFO +1 -1
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/client.pyi +2 -2
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/runner.py +3 -4
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/api.proto +20 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/api_grpc.py +17 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/api_pb2.py +1039 -1005
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/api_pb2.pyi +77 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/api_pb2_grpc.py +34 -1
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/api_pb2_grpc.pyi +13 -3
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/modal_api_grpc.py +1 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_version/__init__.py +1 -1
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/LICENSE +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/README.md +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/__init__.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/__main__.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_clustered_functions.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_clustered_functions.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_container_entrypoint.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_functions.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_ipython.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_location.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_object.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_output.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_partial_function.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_pty.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_resolver.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_resources.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_runtime/__init__.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_runtime/asgi.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_runtime/execution_context.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_runtime/telemetry.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_serialization.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_traceback.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_tunnel.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_tunnel.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_type_manager.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/__init__.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/app_utils.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/async_utils.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/blob_utils.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/deprecation.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/docker_utils.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/function_utils.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/git_utils.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/hash_utils.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/http_utils.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/logger.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/mount_utils.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/name_utils.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/package_utils.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/shell_utils.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_utils/time_utils.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_vendor/__init__.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_vendor/tblib.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/_watcher.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/app.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/app.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/builder/2023.12.txt +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/builder/2024.04.txt +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/builder/2024.10.txt +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/builder/2025.06.txt +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/builder/README.md +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/builder/base-images.json +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/call_graph.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/__init__.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/_download.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/_traceback.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/app.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/cluster.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/config.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/container.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/dict.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/entry_point.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/environment.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/import_refs.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/launch.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/network_file_system.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/profile.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/programs/__init__.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/programs/launch_instance_ssh.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/programs/run_marimo.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/programs/vscode.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/queues.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/run.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/secret.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/token.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/utils.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cli/volume.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/client.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cls.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/cls.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/config.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/container_process.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/container_process.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/dict.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/dict.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/environments.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/environments.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/exception.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/experimental/__init__.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/experimental/flash.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/experimental/flash.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/experimental/ipython.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/file_io.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/file_io.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/file_pattern_matcher.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/functions.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/functions.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/gpu.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/image.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/image.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/io_streams.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/io_streams.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/mount.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/mount.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/network_file_system.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/network_file_system.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/object.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/object.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/output.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/parallel_map.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/parallel_map.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/partial_function.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/partial_function.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/proxy.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/proxy.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/py.typed +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/queue.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/queue.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/retries.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/runner.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/running_app.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/sandbox.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/sandbox.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/schedule.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/scheduler_placement.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/secret.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/secret.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/serving.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/serving.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/snapshot.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/snapshot.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/stream_type.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/token_flow.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/token_flow.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/volume.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal/volume.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal.egg-info/requires.txt +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal.egg-info/top_level.txt +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_docs/__init__.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/__init__.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/modal_options_grpc.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/options.proto +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/options_grpc.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/options_pb2.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/options_pb2.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/options_pb2_grpc.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/options_pb2_grpc.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/py.typed +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/sandbox_router.proto +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/sandbox_router_grpc.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/sandbox_router_pb2.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/sandbox_router_pb2.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/sandbox_router_pb2_grpc.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_proto/sandbox_router_pb2_grpc.pyi +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/modal_version/__main__.py +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/pyproject.toml +0 -0
- {modal-1.1.5.dev53 → modal-1.1.5.dev55}/setup.cfg +0 -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.
|
|
36
|
+
version: str = "1.1.5.dev55",
|
|
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.
|
|
167
|
+
version: str = "1.1.5.dev55",
|
|
168
168
|
):
|
|
169
169
|
"""mdmd:hidden
|
|
170
170
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -10,6 +10,7 @@ import os
|
|
|
10
10
|
import time
|
|
11
11
|
import typing
|
|
12
12
|
from collections.abc import AsyncGenerator
|
|
13
|
+
from contextlib import nullcontext
|
|
13
14
|
from multiprocessing.synchronize import Event
|
|
14
15
|
from typing import TYPE_CHECKING, Any, Optional, TypeVar
|
|
15
16
|
|
|
@@ -363,11 +364,9 @@ async def _run_app(
|
|
|
363
364
|
# Yield to context
|
|
364
365
|
if output_mgr := _get_output_manager():
|
|
365
366
|
# Don't show status spinner in interactive mode to avoid interfering with breakpoints
|
|
366
|
-
if interactive
|
|
367
|
+
spinner_ctx = nullcontext() if interactive else output_mgr.show_status_spinner()
|
|
368
|
+
with spinner_ctx:
|
|
367
369
|
yield app
|
|
368
|
-
else:
|
|
369
|
-
with output_mgr.show_status_spinner():
|
|
370
|
-
yield app
|
|
371
370
|
else:
|
|
372
371
|
yield app
|
|
373
372
|
# successful completion!
|
|
@@ -7,6 +7,7 @@ package modal.client;
|
|
|
7
7
|
import "modal_proto/options.proto";
|
|
8
8
|
import "google/protobuf/empty.proto";
|
|
9
9
|
import "google/protobuf/struct.proto";
|
|
10
|
+
import "google/protobuf/timestamp.proto";
|
|
10
11
|
import "google/protobuf/wrappers.proto";
|
|
11
12
|
|
|
12
13
|
enum AppDeployVisibility {
|
|
@@ -3546,6 +3547,24 @@ message WebhookConfig {
|
|
|
3546
3547
|
bool requires_proxy_auth = 10;
|
|
3547
3548
|
}
|
|
3548
3549
|
|
|
3550
|
+
|
|
3551
|
+
message WorkspaceBillingReportItem {
|
|
3552
|
+
string object_id = 1;
|
|
3553
|
+
string description = 2;
|
|
3554
|
+
string environment_name = 3;
|
|
3555
|
+
google.protobuf.Timestamp interval = 4;
|
|
3556
|
+
string cost = 5;
|
|
3557
|
+
map<string, string> tags = 6;
|
|
3558
|
+
}
|
|
3559
|
+
|
|
3560
|
+
message WorkspaceBillingReportRequest {
|
|
3561
|
+
// Workspace ID will be implicit in the request metadata
|
|
3562
|
+
google.protobuf.Timestamp start_timestamp = 1;
|
|
3563
|
+
google.protobuf.Timestamp end_timestamp = 2;
|
|
3564
|
+
string resolution = 3; // e.g. 'd' or 'h'; server defines what we accept
|
|
3565
|
+
repeated string tag_names = 4;
|
|
3566
|
+
}
|
|
3567
|
+
|
|
3549
3568
|
message WorkspaceNameLookupResponse {
|
|
3550
3569
|
string workspace_name = 1 [deprecated=true];
|
|
3551
3570
|
string username = 2;
|
|
@@ -3777,5 +3796,6 @@ service ModalClient {
|
|
|
3777
3796
|
rpc VolumeRename(VolumeRenameRequest) returns (google.protobuf.Empty);
|
|
3778
3797
|
|
|
3779
3798
|
// Workspaces
|
|
3799
|
+
rpc WorkspaceBillingReport(WorkspaceBillingReportRequest) returns (stream WorkspaceBillingReportItem);
|
|
3780
3800
|
rpc WorkspaceNameLookup(google.protobuf.Empty) returns (WorkspaceNameLookupResponse);
|
|
3781
3801
|
}
|
|
@@ -12,6 +12,7 @@ if typing.TYPE_CHECKING:
|
|
|
12
12
|
import modal_proto.options_pb2
|
|
13
13
|
import google.protobuf.empty_pb2
|
|
14
14
|
import google.protobuf.struct_pb2
|
|
15
|
+
import google.protobuf.timestamp_pb2
|
|
15
16
|
import google.protobuf.wrappers_pb2
|
|
16
17
|
import modal_proto.api_pb2
|
|
17
18
|
|
|
@@ -702,6 +703,10 @@ class ModalClientBase(abc.ABC):
|
|
|
702
703
|
async def VolumeRename(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.VolumeRenameRequest, google.protobuf.empty_pb2.Empty]') -> None:
|
|
703
704
|
pass
|
|
704
705
|
|
|
706
|
+
@abc.abstractmethod
|
|
707
|
+
async def WorkspaceBillingReport(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.WorkspaceBillingReportRequest, modal_proto.api_pb2.WorkspaceBillingReportItem]') -> None:
|
|
708
|
+
pass
|
|
709
|
+
|
|
705
710
|
@abc.abstractmethod
|
|
706
711
|
async def WorkspaceNameLookup(self, stream: 'grpclib.server.Stream[google.protobuf.empty_pb2.Empty, modal_proto.api_pb2.WorkspaceNameLookupResponse]') -> None:
|
|
707
712
|
pass
|
|
@@ -1734,6 +1739,12 @@ class ModalClientBase(abc.ABC):
|
|
|
1734
1739
|
modal_proto.api_pb2.VolumeRenameRequest,
|
|
1735
1740
|
google.protobuf.empty_pb2.Empty,
|
|
1736
1741
|
),
|
|
1742
|
+
'/modal.client.ModalClient/WorkspaceBillingReport': grpclib.const.Handler(
|
|
1743
|
+
self.WorkspaceBillingReport,
|
|
1744
|
+
grpclib.const.Cardinality.UNARY_STREAM,
|
|
1745
|
+
modal_proto.api_pb2.WorkspaceBillingReportRequest,
|
|
1746
|
+
modal_proto.api_pb2.WorkspaceBillingReportItem,
|
|
1747
|
+
),
|
|
1737
1748
|
'/modal.client.ModalClient/WorkspaceNameLookup': grpclib.const.Handler(
|
|
1738
1749
|
self.WorkspaceNameLookup,
|
|
1739
1750
|
grpclib.const.Cardinality.UNARY_UNARY,
|
|
@@ -2772,6 +2783,12 @@ class ModalClientStub:
|
|
|
2772
2783
|
modal_proto.api_pb2.VolumeRenameRequest,
|
|
2773
2784
|
google.protobuf.empty_pb2.Empty,
|
|
2774
2785
|
)
|
|
2786
|
+
self.WorkspaceBillingReport = grpclib.client.UnaryStreamMethod(
|
|
2787
|
+
channel,
|
|
2788
|
+
'/modal.client.ModalClient/WorkspaceBillingReport',
|
|
2789
|
+
modal_proto.api_pb2.WorkspaceBillingReportRequest,
|
|
2790
|
+
modal_proto.api_pb2.WorkspaceBillingReportItem,
|
|
2791
|
+
)
|
|
2775
2792
|
self.WorkspaceNameLookup = grpclib.client.UnaryUnaryMethod(
|
|
2776
2793
|
channel,
|
|
2777
2794
|
'/modal.client.ModalClient/WorkspaceNameLookup',
|