modal 1.5.2.dev4__tar.gz → 1.5.2.dev6__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.
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/PKG-INFO +1 -1
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/blob_utils.py +7 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/image.py +97 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/client.pyi +2 -2
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/functions.pyi +6 -6
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/sandbox.py +56 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/sandbox.pyi +55 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_docs/mdmd/mdmd.py +4 -2
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_proto/api_grpc.py +48 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_proto/api_pb2.py +998 -958
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_proto/api_pb2.pyi +64 -1
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_proto/api_pb2_grpc.py +99 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_proto/api_pb2_grpc.pyi +30 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_proto/modal_api_grpc.py +3 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_version/__init__.py +1 -1
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/LICENSE +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/README.md +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/__init__.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/__main__.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_billing.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_clustered_functions.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_clustered_functions.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_container_entrypoint.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_environments.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_function_variants.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_functions.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_grpc_client.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_image.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_ipython.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_load_context.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_location.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_logs.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_object.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_output/__init__.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_output/manager.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_output/pty.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_output/rich.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_output/status.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_partial_function.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_resolver.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_resources.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_runtime/__init__.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_runtime/asgi.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_runtime/execution_context.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_runtime/telemetry.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_serialization.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_server.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_traceback.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_tunnel.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_tunnel.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_type_manager.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/__init__.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/app_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/async_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/browser_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/curl_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/deprecation.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/docker_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/function_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/git_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/hash_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/http_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/logger.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/mount_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/name_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/package_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/proxy_support.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/shell_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_utils/time_utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_vendor/__init__.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_vendor/tblib.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_vendor/version.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_watcher.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/_workspace.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/app.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/app.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/billing.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/billing.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/builder/2023.12.txt +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/builder/2024.04.txt +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/builder/2024.10.txt +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/builder/2025.06.txt +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/builder/README.md +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/builder/base-images.json +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/call_graph.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/__init__.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/_download.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/_help.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/_traceback.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/app.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/billing.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/bootstrap.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/changelog.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/cluster.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/config.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/container.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/curl.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/dashboard.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/dict.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/endpoint.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/entry_point.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/environment.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/import_refs.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/launch.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/logo.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/network_file_system.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/profile.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/programs/__init__.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/programs/vscode.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/queues.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/run.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/secret.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/selector.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/shell.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/skills.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/token.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/utils.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/volume.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cli/workspace.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/client.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cls.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/cls.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/config.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/container_process.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/container_process.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/dict.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/dict.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/environments.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/environments.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/exception.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/experimental/__init__.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/experimental/flash.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/experimental/flash.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/experimental/ipython.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/file_io.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/file_io.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/file_pattern_matcher.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/functions.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/image.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/image.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/io_streams.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/io_streams.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/mount.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/mount.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/network_file_system.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/network_file_system.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/object.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/object.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/output.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/parallel_map.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/parallel_map.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/partial_function.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/partial_function.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/proxy.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/proxy.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/py.typed +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/queue.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/queue.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/retries.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/runner.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/runner.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/running_app.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/sandbox_fs.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/sandbox_fs.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/schedule.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/scheduler_placement.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/secret.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/secret.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/server.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/server.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/serving.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/serving.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/snapshot.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/snapshot.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/stream_type.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/token_flow.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/token_flow.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/volume.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/volume.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/workspace.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal/workspace.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal.egg-info/requires.txt +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal.egg-info/top_level.txt +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_docs/__init__.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_docs/mdmd/types.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_proto/__init__.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_proto/py.typed +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/modal_version/__main__.py +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/pyproject.toml +0 -0
- {modal-1.5.2.dev4 → modal-1.5.2.dev6}/setup.cfg +0 -0
|
@@ -138,6 +138,13 @@ async def _upload_to_s3_url(
|
|
|
138
138
|
text = await resp.text()
|
|
139
139
|
except Exception:
|
|
140
140
|
text = "<no body>"
|
|
141
|
+
|
|
142
|
+
if "The Content-MD5 you specified did not match what we received." in text:
|
|
143
|
+
raise ExecutionError(
|
|
144
|
+
"Hash mismatch during upload. This may be caused by files changing while an upload is in "
|
|
145
|
+
"progress. Please try again."
|
|
146
|
+
)
|
|
147
|
+
|
|
141
148
|
raise ExecutionError(f"Put to url {upload_url} failed with status {resp.status}: {text}")
|
|
142
149
|
|
|
143
150
|
# client side ETag checksum verification
|
|
@@ -10,10 +10,12 @@ from typing import Optional
|
|
|
10
10
|
import click
|
|
11
11
|
|
|
12
12
|
from modal._environments import ensure_env
|
|
13
|
+
from modal._image import _parse_named_image_ref
|
|
13
14
|
from modal._utils.async_utils import synchronizer
|
|
14
15
|
from modal._utils.time_utils import timestamp_to_localized_str
|
|
15
16
|
from modal.cli.utils import display_table, env_option
|
|
16
17
|
from modal.client import _Client
|
|
18
|
+
from modal.exception import InvalidError
|
|
17
19
|
from modal.output import OutputManager
|
|
18
20
|
from modal_proto import api_pb2
|
|
19
21
|
|
|
@@ -21,6 +23,8 @@ from ._help import ModalGroup
|
|
|
21
23
|
|
|
22
24
|
IMAGE_NAMES_LIST_PAGE_SIZE = 100
|
|
23
25
|
IMAGE_NAMES_LIST_PAGE_DELAY_SECONDS = 1.0
|
|
26
|
+
IMAGE_NAMES_HISTORY_PAGE_SIZE = 100
|
|
27
|
+
IMAGE_NAMES_HISTORY_PAGE_DELAY_SECONDS = 1.0
|
|
24
28
|
|
|
25
29
|
image_cli = ModalGroup(name="image", help="Manage Images.")
|
|
26
30
|
image_names_cli = ModalGroup(name="names", help="Manage Modal Image names.")
|
|
@@ -49,6 +53,20 @@ def _tag_item_row(item: api_pb2.ImageListTagsItem) -> tuple[str, str, str]:
|
|
|
49
53
|
)
|
|
50
54
|
|
|
51
55
|
|
|
56
|
+
def _history_item_json(item: api_pb2.ImageTagRevisionsItem) -> dict[str, str]:
|
|
57
|
+
return {
|
|
58
|
+
"image_id": item.image_id,
|
|
59
|
+
"published_at": timestamp_to_localized_str(item.created_at, True) or "-",
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _history_item_row(item: api_pb2.ImageTagRevisionsItem) -> tuple[str, str]:
|
|
64
|
+
return (
|
|
65
|
+
item.image_id,
|
|
66
|
+
timestamp_to_localized_str(item.created_at, False) or "-",
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
52
70
|
async def _iter_tag_pages(
|
|
53
71
|
client: _Client, env: str, prefix: str
|
|
54
72
|
) -> AsyncIterator[tuple[str, list[api_pb2.ImageListTagsItem]]]:
|
|
@@ -73,6 +91,36 @@ async def _iter_tag_pages(
|
|
|
73
91
|
await asyncio.sleep(IMAGE_NAMES_LIST_PAGE_DELAY_SECONDS)
|
|
74
92
|
|
|
75
93
|
|
|
94
|
+
async def _fetch_history_page(
|
|
95
|
+
client: _Client,
|
|
96
|
+
env: str,
|
|
97
|
+
tag: str,
|
|
98
|
+
page_token: str,
|
|
99
|
+
) -> api_pb2.ImageTagRevisionsResponse:
|
|
100
|
+
return await client.stub.ImageTagRevisions(
|
|
101
|
+
api_pb2.ImageTagRevisionsRequest(
|
|
102
|
+
tag=tag,
|
|
103
|
+
environment_name=env,
|
|
104
|
+
max_objects=IMAGE_NAMES_HISTORY_PAGE_SIZE,
|
|
105
|
+
page_token=page_token,
|
|
106
|
+
)
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
async def _iter_history_pages(
|
|
111
|
+
client: _Client, env: str, tag: str, first_page: api_pb2.ImageTagRevisionsResponse
|
|
112
|
+
) -> AsyncIterator[api_pb2.ImageTagRevisionsResponse]:
|
|
113
|
+
response = first_page
|
|
114
|
+
|
|
115
|
+
while True:
|
|
116
|
+
yield response
|
|
117
|
+
|
|
118
|
+
if not response.next_page_token:
|
|
119
|
+
return
|
|
120
|
+
await asyncio.sleep(IMAGE_NAMES_HISTORY_PAGE_DELAY_SECONDS)
|
|
121
|
+
response = await _fetch_history_page(client, env, tag, response.next_page_token)
|
|
122
|
+
|
|
123
|
+
|
|
76
124
|
@image_names_cli.command("list", help="List named Images.")
|
|
77
125
|
@env_option
|
|
78
126
|
@click.option("--prefix", default="", help="Only include named image tags that start with this prefix.")
|
|
@@ -108,3 +156,52 @@ async def list_(
|
|
|
108
156
|
count += len(page_items)
|
|
109
157
|
|
|
110
158
|
_print_result_summary(count)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
@image_names_cli.command("history", help="Show publishing history for a named Image.", hidden=True)
|
|
162
|
+
@click.argument("name")
|
|
163
|
+
@env_option
|
|
164
|
+
@click.option("--json", is_flag=True, default=False)
|
|
165
|
+
@synchronizer.create_blocking
|
|
166
|
+
async def history(
|
|
167
|
+
name: str,
|
|
168
|
+
env: Optional[str] = None,
|
|
169
|
+
json: bool = False,
|
|
170
|
+
):
|
|
171
|
+
env = ensure_env(env)
|
|
172
|
+
try:
|
|
173
|
+
name_tag = _parse_named_image_ref(name)
|
|
174
|
+
except InvalidError as exc:
|
|
175
|
+
raise click.UsageError(str(exc)) from exc
|
|
176
|
+
client = await _Client.from_env()
|
|
177
|
+
|
|
178
|
+
first_page = await _fetch_history_page(client, env, name_tag, "")
|
|
179
|
+
if not first_page.items:
|
|
180
|
+
raise click.ClickException(f"No publishing history found for named image {first_page.tag!r}.")
|
|
181
|
+
|
|
182
|
+
if json:
|
|
183
|
+
click.echo("[", nl=False)
|
|
184
|
+
count = 0
|
|
185
|
+
async for response in _iter_history_pages(client, env, name_tag, first_page):
|
|
186
|
+
for item in response.items:
|
|
187
|
+
if count:
|
|
188
|
+
click.echo(",", nl=False)
|
|
189
|
+
click.echo(json_module.dumps(_history_item_json(item)), nl=False)
|
|
190
|
+
count += 1
|
|
191
|
+
click.echo("]")
|
|
192
|
+
return
|
|
193
|
+
|
|
194
|
+
count = 0
|
|
195
|
+
show_title = True
|
|
196
|
+
async for response in _iter_history_pages(client, env, name_tag, first_page):
|
|
197
|
+
if response.items:
|
|
198
|
+
title = f"History for {response.tag}" if show_title else ""
|
|
199
|
+
display_table(
|
|
200
|
+
["Image ID", "Published at"],
|
|
201
|
+
[_history_item_row(item) for item in response.items],
|
|
202
|
+
title=title,
|
|
203
|
+
)
|
|
204
|
+
show_title = False
|
|
205
|
+
count += len(response.items)
|
|
206
|
+
|
|
207
|
+
_print_result_summary(count)
|
|
@@ -35,7 +35,7 @@ class _Client:
|
|
|
35
35
|
server_url: str,
|
|
36
36
|
client_type: int,
|
|
37
37
|
credentials: typing.Optional[tuple[str, str]],
|
|
38
|
-
version: str = "1.5.2.
|
|
38
|
+
version: str = "1.5.2.dev6",
|
|
39
39
|
):
|
|
40
40
|
"""mdmd:hidden
|
|
41
41
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -205,7 +205,7 @@ class Client:
|
|
|
205
205
|
server_url: str,
|
|
206
206
|
client_type: int,
|
|
207
207
|
credentials: typing.Optional[tuple[str, str]],
|
|
208
|
-
version: str = "1.5.2.
|
|
208
|
+
version: str = "1.5.2.dev6",
|
|
209
209
|
):
|
|
210
210
|
"""mdmd:hidden
|
|
211
211
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -490,7 +490,7 @@ class Function(
|
|
|
490
490
|
|
|
491
491
|
_call_generator: ___call_generator_spec
|
|
492
492
|
|
|
493
|
-
class __remote_spec(typing_extensions.Protocol[
|
|
493
|
+
class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
|
|
494
494
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
|
|
495
495
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result.
|
|
496
496
|
|
|
@@ -515,7 +515,7 @@ class Function(
|
|
|
515
515
|
"""
|
|
516
516
|
...
|
|
517
517
|
|
|
518
|
-
remote: __remote_spec[modal._functions.
|
|
518
|
+
remote: __remote_spec[modal._functions.ReturnType, modal._functions.P]
|
|
519
519
|
|
|
520
520
|
class __remote_gen_spec(typing_extensions.Protocol):
|
|
521
521
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
|
|
@@ -565,7 +565,7 @@ class Function(
|
|
|
565
565
|
"""
|
|
566
566
|
...
|
|
567
567
|
|
|
568
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
|
568
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
|
|
569
569
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
570
570
|
"""[Experimental] Calls the function with the given arguments, without waiting for the results.
|
|
571
571
|
|
|
@@ -598,7 +598,7 @@ class Function(
|
|
|
598
598
|
"""
|
|
599
599
|
...
|
|
600
600
|
|
|
601
|
-
_experimental_spawn: ___experimental_spawn_spec[modal._functions.
|
|
601
|
+
_experimental_spawn: ___experimental_spawn_spec[modal._functions.ReturnType, modal._functions.P]
|
|
602
602
|
|
|
603
603
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
|
|
604
604
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
|
|
@@ -606,7 +606,7 @@ class Function(
|
|
|
606
606
|
|
|
607
607
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
|
|
608
608
|
|
|
609
|
-
class __spawn_spec(typing_extensions.Protocol[
|
|
609
|
+
class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
|
|
610
610
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
611
611
|
"""Calls the function with the given arguments, without waiting for the results.
|
|
612
612
|
|
|
@@ -639,7 +639,7 @@ class Function(
|
|
|
639
639
|
"""
|
|
640
640
|
...
|
|
641
641
|
|
|
642
|
-
spawn: __spawn_spec[modal._functions.
|
|
642
|
+
spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P]
|
|
643
643
|
|
|
644
644
|
def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
|
|
645
645
|
"""Return the inner Python object wrapped by this Modal Function.
|
|
@@ -2282,6 +2282,62 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
2282
2282
|
# Fetch the next batch starting from the end of the current one.
|
|
2283
2283
|
before_timestamp = resp.sandboxes[-1].created_at
|
|
2284
2284
|
|
|
2285
|
+
@staticmethod
|
|
2286
|
+
async def _experimental_list(
|
|
2287
|
+
*, app_id: str | None = None, client: _Client | None = None
|
|
2288
|
+
) -> AsyncGenerator["_Sandbox", None]:
|
|
2289
|
+
"""List v2 Sandboxes in an App.
|
|
2290
|
+
|
|
2291
|
+
This function lists v2 sandboxes, ie sandboxes created via modal.Sandbox._experimental_create.
|
|
2292
|
+
Filtering based on tags is not yet supported.
|
|
2293
|
+
|
|
2294
|
+
Args:
|
|
2295
|
+
app_id: The App to list Sandboxes under.
|
|
2296
|
+
client: Optional client to use for the session.
|
|
2297
|
+
|
|
2298
|
+
Yields:
|
|
2299
|
+
`Sandbox` objects that are currently running in the App.
|
|
2300
|
+
"""
|
|
2301
|
+
if not app_id:
|
|
2302
|
+
raise InvalidError(
|
|
2303
|
+
"Sandbox._experimental_list requires an `app_id`:\n\n"
|
|
2304
|
+
'app = modal.App.lookup("my-app")\n'
|
|
2305
|
+
"Sandbox._experimental_list(app_id=app.app_id)"
|
|
2306
|
+
)
|
|
2307
|
+
|
|
2308
|
+
before_timestamp = None
|
|
2309
|
+
if client is None:
|
|
2310
|
+
client = await _Client.from_env()
|
|
2311
|
+
|
|
2312
|
+
assert client._auth_token_manager
|
|
2313
|
+
while True:
|
|
2314
|
+
req = api_pb2.SandboxListRequest(
|
|
2315
|
+
app_id=app_id,
|
|
2316
|
+
before_timestamp=before_timestamp,
|
|
2317
|
+
include_finished=False,
|
|
2318
|
+
)
|
|
2319
|
+
|
|
2320
|
+
# Fetches a batch of sandboxes. SandboxListV2 authenticates via the
|
|
2321
|
+
# auth-token metadata, like the other V2 sandbox RPCs.
|
|
2322
|
+
auth_token = await client._auth_token_manager.get_token()
|
|
2323
|
+
resp = await client.stub.SandboxListV2(req, metadata=[("x-modal-auth-token", auth_token)])
|
|
2324
|
+
|
|
2325
|
+
if not resp.sandboxes:
|
|
2326
|
+
return
|
|
2327
|
+
|
|
2328
|
+
for sandbox_info in resp.sandboxes:
|
|
2329
|
+
sandbox_info: api_pb2.SandboxInfo
|
|
2330
|
+
obj = _Sandbox._new_hydrated(sandbox_info.id, client, None)
|
|
2331
|
+
# SandboxListV2 only returns V2 sandboxes; mark them as such so
|
|
2332
|
+
# operations like wait/terminate/exec use the V2 RPCs and stdio.
|
|
2333
|
+
obj._is_v2 = True
|
|
2334
|
+
obj._hydrate_metadata_v2()
|
|
2335
|
+
obj._result = sandbox_info.task_info.result
|
|
2336
|
+
yield obj
|
|
2337
|
+
|
|
2338
|
+
# Fetch the next batch starting from the end of the current one.
|
|
2339
|
+
before_timestamp = resp.sandboxes[-1].created_at
|
|
2340
|
+
|
|
2285
2341
|
|
|
2286
2342
|
class _SidecarContainer:
|
|
2287
2343
|
"""Handle to an additional container running in a Sandbox."""
|
|
@@ -942,6 +942,24 @@ class _Sandbox(modal._object._Object):
|
|
|
942
942
|
"""
|
|
943
943
|
...
|
|
944
944
|
|
|
945
|
+
@staticmethod
|
|
946
|
+
def _experimental_list(
|
|
947
|
+
*, app_id: typing.Optional[str] = None, client: typing.Optional[modal.client._Client] = None
|
|
948
|
+
) -> collections.abc.AsyncGenerator[_Sandbox, None]:
|
|
949
|
+
"""List v2 Sandboxes in an App.
|
|
950
|
+
|
|
951
|
+
This function lists v2 sandboxes, ie sandboxes created via modal.Sandbox._experimental_create.
|
|
952
|
+
Filtering based on tags is not yet supported.
|
|
953
|
+
|
|
954
|
+
Args:
|
|
955
|
+
app_id: The App to list Sandboxes under.
|
|
956
|
+
client: Optional client to use for the session.
|
|
957
|
+
|
|
958
|
+
Yields:
|
|
959
|
+
`Sandbox` objects that are currently running in the App.
|
|
960
|
+
"""
|
|
961
|
+
...
|
|
962
|
+
|
|
945
963
|
class _SidecarContainer:
|
|
946
964
|
"""Handle to an additional container running in a Sandbox."""
|
|
947
965
|
|
|
@@ -2790,6 +2808,43 @@ class Sandbox(modal.object.Object):
|
|
|
2790
2808
|
|
|
2791
2809
|
list: typing.ClassVar[__list_spec]
|
|
2792
2810
|
|
|
2811
|
+
class ___experimental_list_spec(typing_extensions.Protocol):
|
|
2812
|
+
def __call__(
|
|
2813
|
+
self, /, *, app_id: typing.Optional[str] = None, client: typing.Optional[modal.client.Client] = None
|
|
2814
|
+
) -> typing.Generator[Sandbox, None, None]:
|
|
2815
|
+
"""List v2 Sandboxes in an App.
|
|
2816
|
+
|
|
2817
|
+
This function lists v2 sandboxes, ie sandboxes created via modal.Sandbox._experimental_create.
|
|
2818
|
+
Filtering based on tags is not yet supported.
|
|
2819
|
+
|
|
2820
|
+
Args:
|
|
2821
|
+
app_id: The App to list Sandboxes under.
|
|
2822
|
+
client: Optional client to use for the session.
|
|
2823
|
+
|
|
2824
|
+
Yields:
|
|
2825
|
+
`Sandbox` objects that are currently running in the App.
|
|
2826
|
+
"""
|
|
2827
|
+
...
|
|
2828
|
+
|
|
2829
|
+
def aio(
|
|
2830
|
+
self, /, *, app_id: typing.Optional[str] = None, client: typing.Optional[modal.client.Client] = None
|
|
2831
|
+
) -> collections.abc.AsyncGenerator[Sandbox, None]:
|
|
2832
|
+
"""List v2 Sandboxes in an App.
|
|
2833
|
+
|
|
2834
|
+
This function lists v2 sandboxes, ie sandboxes created via modal.Sandbox._experimental_create.
|
|
2835
|
+
Filtering based on tags is not yet supported.
|
|
2836
|
+
|
|
2837
|
+
Args:
|
|
2838
|
+
app_id: The App to list Sandboxes under.
|
|
2839
|
+
client: Optional client to use for the session.
|
|
2840
|
+
|
|
2841
|
+
Yields:
|
|
2842
|
+
`Sandbox` objects that are currently running in the App.
|
|
2843
|
+
"""
|
|
2844
|
+
...
|
|
2845
|
+
|
|
2846
|
+
_experimental_list: typing.ClassVar[___experimental_list_spec]
|
|
2847
|
+
|
|
2793
2848
|
_default_image: modal._image._Image
|
|
2794
2849
|
|
|
2795
2850
|
_MAIN_CONTAINER_NAME: str
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
|
|
4
4
|
import html
|
|
5
5
|
import inspect
|
|
6
|
+
import logging
|
|
6
7
|
import re
|
|
7
8
|
import typing
|
|
8
|
-
import warnings
|
|
9
9
|
from collections.abc import Callable
|
|
10
10
|
from enum import Enum, EnumMeta
|
|
11
11
|
from types import ModuleType
|
|
@@ -15,6 +15,8 @@ import synchronicity.synchronizer
|
|
|
15
15
|
from .signatures import get_signature, parse_params_from_signature, strip_signature
|
|
16
16
|
from .types import ParsedDoc, ParsedParam, ParsedRaise
|
|
17
17
|
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
18
20
|
|
|
19
21
|
def _escape_svelte_html_attr(value: str) -> str:
|
|
20
22
|
"""Escape text for double-quoted HTML / Svelte component attributes.
|
|
@@ -475,7 +477,7 @@ def module_str(header, module, title_level="#", filter_items: Callable[[ModuleTy
|
|
|
475
477
|
object_docs.append(f"{member_title_level} {qual_name}\n\n")
|
|
476
478
|
object_docs.append(item_doc)
|
|
477
479
|
else:
|
|
478
|
-
|
|
480
|
+
logger.warning(f"[mdmd] Not sure how to document {name} ({item.__class__.__name__})")
|
|
479
481
|
|
|
480
482
|
if object_docs:
|
|
481
483
|
return "".join(header + object_docs)
|
|
@@ -891,6 +891,18 @@ class ModalClientBase(abc.ABC):
|
|
|
891
891
|
async def WorkspaceNameLookup(self, stream: 'grpclib.server.Stream[google.protobuf.empty_pb2.Empty, modal_proto.api_pb2.WorkspaceNameLookupResponse]') -> None:
|
|
892
892
|
pass
|
|
893
893
|
|
|
894
|
+
@abc.abstractmethod
|
|
895
|
+
async def WorkspaceSetDefaultEnvironment(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.WorkspaceSetDefaultEnvironmentRequest, google.protobuf.empty_pb2.Empty]') -> None:
|
|
896
|
+
pass
|
|
897
|
+
|
|
898
|
+
@abc.abstractmethod
|
|
899
|
+
async def WorkspaceSetImageBuilderVersion(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.WorkspaceSetImageBuilderVersionRequest, modal_proto.api_pb2.WorkspaceSetImageBuilderVersionResponse]') -> None:
|
|
900
|
+
pass
|
|
901
|
+
|
|
902
|
+
@abc.abstractmethod
|
|
903
|
+
async def WorkspaceSettings(self, stream: 'grpclib.server.Stream[google.protobuf.empty_pb2.Empty, modal_proto.api_pb2.WorkspaceSettingsResponse]') -> None:
|
|
904
|
+
pass
|
|
905
|
+
|
|
894
906
|
def __mapping__(self) -> typing.Dict[str, grpclib.const.Handler]:
|
|
895
907
|
return {
|
|
896
908
|
'/modal.client.ModalClient/AppClientDisconnect': grpclib.const.Handler(
|
|
@@ -2201,6 +2213,24 @@ class ModalClientBase(abc.ABC):
|
|
|
2201
2213
|
google.protobuf.empty_pb2.Empty,
|
|
2202
2214
|
modal_proto.api_pb2.WorkspaceNameLookupResponse,
|
|
2203
2215
|
),
|
|
2216
|
+
'/modal.client.ModalClient/WorkspaceSetDefaultEnvironment': grpclib.const.Handler(
|
|
2217
|
+
self.WorkspaceSetDefaultEnvironment,
|
|
2218
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
2219
|
+
modal_proto.api_pb2.WorkspaceSetDefaultEnvironmentRequest,
|
|
2220
|
+
google.protobuf.empty_pb2.Empty,
|
|
2221
|
+
),
|
|
2222
|
+
'/modal.client.ModalClient/WorkspaceSetImageBuilderVersion': grpclib.const.Handler(
|
|
2223
|
+
self.WorkspaceSetImageBuilderVersion,
|
|
2224
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
2225
|
+
modal_proto.api_pb2.WorkspaceSetImageBuilderVersionRequest,
|
|
2226
|
+
modal_proto.api_pb2.WorkspaceSetImageBuilderVersionResponse,
|
|
2227
|
+
),
|
|
2228
|
+
'/modal.client.ModalClient/WorkspaceSettings': grpclib.const.Handler(
|
|
2229
|
+
self.WorkspaceSettings,
|
|
2230
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
2231
|
+
google.protobuf.empty_pb2.Empty,
|
|
2232
|
+
modal_proto.api_pb2.WorkspaceSettingsResponse,
|
|
2233
|
+
),
|
|
2204
2234
|
}
|
|
2205
2235
|
|
|
2206
2236
|
|
|
@@ -3515,3 +3545,21 @@ class ModalClientStub:
|
|
|
3515
3545
|
google.protobuf.empty_pb2.Empty,
|
|
3516
3546
|
modal_proto.api_pb2.WorkspaceNameLookupResponse,
|
|
3517
3547
|
)
|
|
3548
|
+
self.WorkspaceSetDefaultEnvironment = grpclib.client.UnaryUnaryMethod(
|
|
3549
|
+
channel,
|
|
3550
|
+
'/modal.client.ModalClient/WorkspaceSetDefaultEnvironment',
|
|
3551
|
+
modal_proto.api_pb2.WorkspaceSetDefaultEnvironmentRequest,
|
|
3552
|
+
google.protobuf.empty_pb2.Empty,
|
|
3553
|
+
)
|
|
3554
|
+
self.WorkspaceSetImageBuilderVersion = grpclib.client.UnaryUnaryMethod(
|
|
3555
|
+
channel,
|
|
3556
|
+
'/modal.client.ModalClient/WorkspaceSetImageBuilderVersion',
|
|
3557
|
+
modal_proto.api_pb2.WorkspaceSetImageBuilderVersionRequest,
|
|
3558
|
+
modal_proto.api_pb2.WorkspaceSetImageBuilderVersionResponse,
|
|
3559
|
+
)
|
|
3560
|
+
self.WorkspaceSettings = grpclib.client.UnaryUnaryMethod(
|
|
3561
|
+
channel,
|
|
3562
|
+
'/modal.client.ModalClient/WorkspaceSettings',
|
|
3563
|
+
google.protobuf.empty_pb2.Empty,
|
|
3564
|
+
modal_proto.api_pb2.WorkspaceSettingsResponse,
|
|
3565
|
+
)
|