modal 1.5.3.dev4__tar.gz → 1.5.3.dev5__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.3.dev4 → modal-1.5.3.dev5}/PKG-INFO +1 -1
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_environments.py +18 -39
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/client.pyi +2 -2
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/environments.pyi +8 -8
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/sandbox.py +8 -4
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/api_grpc.py +16 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/api_pb2.py +764 -744
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/api_pb2.pyi +63 -10
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/api_pb2_grpc.py +33 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/api_pb2_grpc.pyi +10 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/modal_api_grpc.py +1 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_version/__init__.py +1 -1
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/LICENSE +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/README.md +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/__init__.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/__main__.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_billing.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_clustered_functions.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_clustered_functions.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_container_entrypoint.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_function_variants.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_functions.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_grpc_client.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_image.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_ipython.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_load_context.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_location.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_logs.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_object.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_output/__init__.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_output/manager.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_output/pty.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_output/rich.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_output/status.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_partial_function.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_resolver.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_resources.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/__init__.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/asgi.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/execution_context.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/telemetry.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_serialization.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_server.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_traceback.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_tunnel.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_tunnel.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_type_manager.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/__init__.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/app_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/async_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/blob_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/browser_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/curl_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/deprecation.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/docker_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/function_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/git_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/hash_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/http_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/logger.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/mount_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/name_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/package_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/proxy_support.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/shell_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_utils/time_utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_vendor/__init__.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_vendor/tblib.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_vendor/version.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_watcher.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/_workspace.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/app.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/app.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/billing.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/billing.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/builder/2023.12.txt +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/builder/2024.04.txt +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/builder/2024.10.txt +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/builder/2025.06.txt +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/builder/README.md +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/builder/base-images.json +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/call_graph.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/__init__.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/_download.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/_help.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/_traceback.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/app.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/billing.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/bootstrap.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/changelog.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/cluster.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/config.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/container.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/curl.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/dashboard.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/dict.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/endpoint.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/entry_point.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/environment.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/image.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/import_refs.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/launch.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/logo.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/network_file_system.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/profile.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/programs/__init__.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/programs/vscode.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/queues.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/run.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/secret.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/selector.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/shell.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/skills.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/token.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/utils.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/volume.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cli/workspace.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/client.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cls.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/cls.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/config.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/container_process.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/container_process.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/dict.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/dict.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/environments.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/exception.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/experimental/__init__.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/experimental/flash.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/experimental/flash.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/experimental/ipython.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/file_io.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/file_io.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/file_pattern_matcher.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/functions.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/functions.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/image.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/image.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/io_streams.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/io_streams.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/mount.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/mount.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/network_file_system.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/network_file_system.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/object.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/object.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/output.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/parallel_map.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/parallel_map.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/partial_function.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/partial_function.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/proxy.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/proxy.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/py.typed +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/queue.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/queue.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/retries.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/runner.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/runner.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/running_app.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/sandbox.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/sandbox_fs.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/sandbox_fs.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/schedule.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/scheduler_placement.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/secret.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/secret.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/server.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/server.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/serving.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/serving.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/snapshot.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/snapshot.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/stream_type.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/token_flow.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/token_flow.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/types.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/volume.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/volume.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/workspace.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal/workspace.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal.egg-info/requires.txt +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal.egg-info/top_level.txt +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/__init__.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_docs/mdmd/types.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/__init__.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/py.typed +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/modal_version/__main__.py +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/pyproject.toml +0 -0
- {modal-1.5.3.dev4 → modal-1.5.3.dev5}/setup.cfg +0 -0
|
@@ -103,26 +103,6 @@ class _EnvironmentManager:
|
|
|
103
103
|
await client.stub.EnvironmentDelete(api_pb2.EnvironmentDeleteRequest(name=name))
|
|
104
104
|
|
|
105
105
|
|
|
106
|
-
def _role_to_proto(role: str) -> "api_pb2.EnvironmentRole.ValueType":
|
|
107
|
-
match role:
|
|
108
|
-
case "viewer":
|
|
109
|
-
return api_pb2.ENVIRONMENT_ROLE_VIEWER
|
|
110
|
-
case "contributor":
|
|
111
|
-
return api_pb2.ENVIRONMENT_ROLE_CONTRIBUTOR
|
|
112
|
-
case _:
|
|
113
|
-
raise InvalidError(f"Invalid Environment role: {role!r} (expected 'viewer' or 'contributor')")
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
def _role_from_proto(proto_value: int) -> str:
|
|
117
|
-
match proto_value:
|
|
118
|
-
case api_pb2.ENVIRONMENT_ROLE_VIEWER:
|
|
119
|
-
return "viewer"
|
|
120
|
-
case api_pb2.ENVIRONMENT_ROLE_CONTRIBUTOR:
|
|
121
|
-
return "contributor"
|
|
122
|
-
case _:
|
|
123
|
-
raise ValueError(f"Unknown environment role: {proto_value}")
|
|
124
|
-
|
|
125
|
-
|
|
126
106
|
class _EnvironmentMembersManager:
|
|
127
107
|
"""mdmd:namespace
|
|
128
108
|
Namespace with methods for managing the membership of a restricted Environment.
|
|
@@ -135,31 +115,30 @@ class _EnvironmentMembersManager:
|
|
|
135
115
|
self._environment = environment
|
|
136
116
|
|
|
137
117
|
async def list(self) -> dict[Literal["users", "service_users"], dict[str, str]]:
|
|
138
|
-
"""
|
|
118
|
+
"""Enumerate the environment roles for each user and service user in the workspace.
|
|
139
119
|
|
|
140
120
|
**Examples:**
|
|
141
121
|
|
|
142
122
|
```python notest
|
|
143
|
-
members = modal.Environment.from_name("my-
|
|
123
|
+
members = modal.Environment.from_name("my-env").members.list()
|
|
144
124
|
print(members)
|
|
145
125
|
# {
|
|
146
|
-
# "users": {"alice": "contributor", "bob": "viewer"},
|
|
147
|
-
# "service_users": {"alice-bot": "contributor"},
|
|
126
|
+
# "users": {"alice": "contributor", "bob": "viewer", "carol": "contributor"},
|
|
127
|
+
# "service_users": {"alice-bot": "contributor", "ops-bot": "viewer", "ci-bot": "no-access"},
|
|
148
128
|
# }
|
|
149
129
|
```
|
|
150
130
|
"""
|
|
151
131
|
await self._environment.hydrate()
|
|
152
|
-
req = api_pb2.
|
|
153
|
-
resp = await self._environment.client.stub.
|
|
132
|
+
req = api_pb2.EnvironmentGetRolesRequest(environment_id=self._environment.object_id)
|
|
133
|
+
resp = await self._environment.client.stub.EnvironmentGetRoles(req)
|
|
154
134
|
|
|
155
135
|
users: dict[str, str] = {}
|
|
156
136
|
service_users: dict[str, str] = {}
|
|
157
137
|
for principal in resp.principal_roles:
|
|
158
|
-
role = _role_from_proto(principal.role)
|
|
159
138
|
if principal.user_id:
|
|
160
|
-
users[principal.user_name] =
|
|
139
|
+
users[principal.user_name] = principal.role_str
|
|
161
140
|
elif principal.service_user_id:
|
|
162
|
-
service_users[principal.service_user_name] =
|
|
141
|
+
service_users[principal.service_user_name] = principal.role_str
|
|
163
142
|
|
|
164
143
|
return {"users": users, "service_users": service_users}
|
|
165
144
|
|
|
@@ -188,13 +167,13 @@ class _EnvironmentMembersManager:
|
|
|
188
167
|
users = users or {}
|
|
189
168
|
service_users = service_users or {}
|
|
190
169
|
|
|
191
|
-
req = api_pb2.
|
|
192
|
-
resp = await self._environment.client.stub.
|
|
170
|
+
req = api_pb2.EnvironmentGetRolesRequest(environment_id=self._environment.object_id)
|
|
171
|
+
resp = await self._environment.client.stub.EnvironmentGetRoles(req)
|
|
193
172
|
|
|
194
|
-
#
|
|
173
|
+
# EnvironmentGetRoles returns every workspace principal
|
|
195
174
|
user_name_to_id: dict[str, str] = {}
|
|
196
175
|
service_user_name_to_id: dict[str, str] = {}
|
|
197
|
-
for principal in
|
|
176
|
+
for principal in resp.principal_roles:
|
|
198
177
|
if principal.user_id:
|
|
199
178
|
user_name_to_id[principal.user_name] = principal.user_id
|
|
200
179
|
elif principal.service_user_id:
|
|
@@ -207,7 +186,7 @@ class _EnvironmentMembersManager:
|
|
|
207
186
|
requests[f"User {name!r}"] = api_pb2.EnvironmentRoleSetRequest(
|
|
208
187
|
environment_id=self._environment.object_id,
|
|
209
188
|
user_id=user_name_to_id[name],
|
|
210
|
-
|
|
189
|
+
role_str=role,
|
|
211
190
|
)
|
|
212
191
|
for name, role in service_users.items():
|
|
213
192
|
if name not in service_user_name_to_id:
|
|
@@ -215,7 +194,7 @@ class _EnvironmentMembersManager:
|
|
|
215
194
|
requests[f"Service user {name!r}"] = api_pb2.EnvironmentRoleSetRequest(
|
|
216
195
|
environment_id=self._environment.object_id,
|
|
217
196
|
service_user_id=service_user_name_to_id[name],
|
|
218
|
-
|
|
197
|
+
role_str=role,
|
|
219
198
|
)
|
|
220
199
|
|
|
221
200
|
await self._dispatch_role_updates(requests)
|
|
@@ -242,8 +221,8 @@ class _EnvironmentMembersManager:
|
|
|
242
221
|
users = users or []
|
|
243
222
|
service_users = service_users or []
|
|
244
223
|
|
|
245
|
-
req = api_pb2.
|
|
246
|
-
resp = await self._environment.client.stub.
|
|
224
|
+
req = api_pb2.EnvironmentGetRolesRequest(environment_id=self._environment.object_id)
|
|
225
|
+
resp = await self._environment.client.stub.EnvironmentGetRoles(req)
|
|
247
226
|
|
|
248
227
|
user_name_to_id: dict[str, str] = {}
|
|
249
228
|
service_user_name_to_id: dict[str, str] = {}
|
|
@@ -256,7 +235,7 @@ class _EnvironmentMembersManager:
|
|
|
256
235
|
requests: dict[str, api_pb2.EnvironmentRoleSetRequest] = {}
|
|
257
236
|
for name in users:
|
|
258
237
|
if name not in user_name_to_id:
|
|
259
|
-
raise InvalidError(f"User {name!r}
|
|
238
|
+
raise InvalidError(f"User {name!r} not found in workspace")
|
|
260
239
|
requests[f"User {name!r}"] = api_pb2.EnvironmentRoleSetRequest(
|
|
261
240
|
environment_id=self._environment.object_id,
|
|
262
241
|
user_id=user_name_to_id[name],
|
|
@@ -264,7 +243,7 @@ class _EnvironmentMembersManager:
|
|
|
264
243
|
)
|
|
265
244
|
for name in service_users:
|
|
266
245
|
if name not in service_user_name_to_id:
|
|
267
|
-
raise InvalidError(f"Service user {name!r}
|
|
246
|
+
raise InvalidError(f"Service user {name!r} not found in workspace")
|
|
268
247
|
requests[f"Service user {name!r}"] = api_pb2.EnvironmentRoleSetRequest(
|
|
269
248
|
environment_id=self._environment.object_id,
|
|
270
249
|
service_user_id=service_user_name_to_id[name],
|
|
@@ -37,7 +37,7 @@ class _Client:
|
|
|
37
37
|
server_url: str,
|
|
38
38
|
client_type: int,
|
|
39
39
|
credentials: typing.Optional[tuple[str, str]],
|
|
40
|
-
version: str = "1.5.3.
|
|
40
|
+
version: str = "1.5.3.dev5",
|
|
41
41
|
):
|
|
42
42
|
"""mdmd:hidden
|
|
43
43
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -207,7 +207,7 @@ class Client:
|
|
|
207
207
|
server_url: str,
|
|
208
208
|
client_type: int,
|
|
209
209
|
credentials: typing.Optional[tuple[str, str]],
|
|
210
|
-
version: str = "1.5.3.
|
|
210
|
+
version: str = "1.5.3.dev5",
|
|
211
211
|
):
|
|
212
212
|
"""mdmd:hidden
|
|
213
213
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -113,32 +113,32 @@ class EnvironmentMembersManager:
|
|
|
113
113
|
|
|
114
114
|
class __list_spec(typing_extensions.Protocol):
|
|
115
115
|
def __call__(self, /) -> dict[typing.Literal["users", "service_users"], dict[str, str]]:
|
|
116
|
-
"""
|
|
116
|
+
"""Enumerate the environment roles for each user and service user in the workspace.
|
|
117
117
|
|
|
118
118
|
**Examples:**
|
|
119
119
|
|
|
120
120
|
```python notest
|
|
121
|
-
members = modal.Environment.from_name("my-
|
|
121
|
+
members = modal.Environment.from_name("my-env").members.list()
|
|
122
122
|
print(members)
|
|
123
123
|
# {
|
|
124
|
-
# "users": {"alice": "contributor", "bob": "viewer"},
|
|
125
|
-
# "service_users": {"alice-bot": "contributor"},
|
|
124
|
+
# "users": {"alice": "contributor", "bob": "viewer", "carol": "contributor"},
|
|
125
|
+
# "service_users": {"alice-bot": "contributor", "ops-bot": "viewer", "ci-bot": "no-access"},
|
|
126
126
|
# }
|
|
127
127
|
```
|
|
128
128
|
"""
|
|
129
129
|
...
|
|
130
130
|
|
|
131
131
|
async def aio(self, /) -> dict[typing.Literal["users", "service_users"], dict[str, str]]:
|
|
132
|
-
"""
|
|
132
|
+
"""Enumerate the environment roles for each user and service user in the workspace.
|
|
133
133
|
|
|
134
134
|
**Examples:**
|
|
135
135
|
|
|
136
136
|
```python notest
|
|
137
|
-
members = modal.Environment.from_name("my-
|
|
137
|
+
members = modal.Environment.from_name("my-env").members.list()
|
|
138
138
|
print(members)
|
|
139
139
|
# {
|
|
140
|
-
# "users": {"alice": "contributor", "bob": "viewer"},
|
|
141
|
-
# "service_users": {"alice-bot": "contributor"},
|
|
140
|
+
# "users": {"alice": "contributor", "bob": "viewer", "carol": "contributor"},
|
|
141
|
+
# "service_users": {"alice-bot": "contributor", "ops-bot": "viewer", "ci-bot": "no-access"},
|
|
142
142
|
# }
|
|
143
143
|
```
|
|
144
144
|
"""
|
|
@@ -1021,10 +1021,14 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
1021
1021
|
self._is_v2 = True
|
|
1022
1022
|
self._task_id = create_resp.task_id
|
|
1023
1023
|
self._hydrate_metadata_v2()
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1024
|
+
# Unencrypted tunnel endpoints are not known at create time. Only
|
|
1025
|
+
# cache a complete set so tunnels() fetches the rest otherwise.
|
|
1026
|
+
create_resp_has_all_tunnels = len(create_resp.tunnels) == len(open_ports)
|
|
1027
|
+
if create_resp_has_all_tunnels:
|
|
1028
|
+
self._tunnels = {
|
|
1029
|
+
t.container_port: Tunnel(t.host, t.port, t.unencrypted_host, t.unencrypted_port)
|
|
1030
|
+
for t in create_resp.tunnels
|
|
1031
|
+
}
|
|
1028
1032
|
|
|
1029
1033
|
if logger.isEnabledFor(logging.DEBUG):
|
|
1030
1034
|
total_elapsed = time.monotonic() - load_start
|
|
@@ -639,6 +639,10 @@ class ModalClientBase(abc.ABC):
|
|
|
639
639
|
async def SandboxRestore(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxRestoreRequest, modal_proto.api_pb2.SandboxRestoreResponse]') -> None:
|
|
640
640
|
pass
|
|
641
641
|
|
|
642
|
+
@abc.abstractmethod
|
|
643
|
+
async def SandboxRestoreV2(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxRestoreV2Request, modal_proto.api_pb2.SandboxRestoreV2Response]') -> None:
|
|
644
|
+
pass
|
|
645
|
+
|
|
642
646
|
@abc.abstractmethod
|
|
643
647
|
async def SandboxSetName(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxSetNameRequest, modal_proto.api_pb2.SandboxSetNameResponse]') -> None:
|
|
644
648
|
pass
|
|
@@ -1875,6 +1879,12 @@ class ModalClientBase(abc.ABC):
|
|
|
1875
1879
|
modal_proto.api_pb2.SandboxRestoreRequest,
|
|
1876
1880
|
modal_proto.api_pb2.SandboxRestoreResponse,
|
|
1877
1881
|
),
|
|
1882
|
+
'/modal.client.ModalClient/SandboxRestoreV2': grpclib.const.Handler(
|
|
1883
|
+
self.SandboxRestoreV2,
|
|
1884
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
1885
|
+
modal_proto.api_pb2.SandboxRestoreV2Request,
|
|
1886
|
+
modal_proto.api_pb2.SandboxRestoreV2Response,
|
|
1887
|
+
),
|
|
1878
1888
|
'/modal.client.ModalClient/SandboxSetName': grpclib.const.Handler(
|
|
1879
1889
|
self.SandboxSetName,
|
|
1880
1890
|
grpclib.const.Cardinality.UNARY_UNARY,
|
|
@@ -3267,6 +3277,12 @@ class ModalClientStub:
|
|
|
3267
3277
|
modal_proto.api_pb2.SandboxRestoreRequest,
|
|
3268
3278
|
modal_proto.api_pb2.SandboxRestoreResponse,
|
|
3269
3279
|
)
|
|
3280
|
+
self.SandboxRestoreV2 = grpclib.client.UnaryUnaryMethod(
|
|
3281
|
+
channel,
|
|
3282
|
+
'/modal.client.ModalClient/SandboxRestoreV2',
|
|
3283
|
+
modal_proto.api_pb2.SandboxRestoreV2Request,
|
|
3284
|
+
modal_proto.api_pb2.SandboxRestoreV2Response,
|
|
3285
|
+
)
|
|
3270
3286
|
self.SandboxSetName = grpclib.client.UnaryUnaryMethod(
|
|
3271
3287
|
channel,
|
|
3272
3288
|
'/modal.client.ModalClient/SandboxSetName',
|