modal 1.5.2.dev5__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.dev5 → modal-1.5.2.dev6}/PKG-INFO +1 -1
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/image.py +97 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/client.pyi +2 -2
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/functions.pyi +6 -6
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_docs/mdmd/mdmd.py +4 -2
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_proto/api_grpc.py +48 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_proto/api_pb2.py +998 -958
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_proto/api_pb2.pyi +64 -1
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_proto/api_pb2_grpc.py +99 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_proto/api_pb2_grpc.pyi +30 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_proto/modal_api_grpc.py +3 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_version/__init__.py +1 -1
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/LICENSE +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/README.md +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/__init__.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/__main__.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_billing.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_clustered_functions.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_clustered_functions.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_container_entrypoint.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_environments.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_function_variants.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_functions.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_grpc_client.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_image.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_ipython.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_load_context.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_location.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_logs.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_object.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_output/__init__.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_output/manager.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_output/pty.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_output/rich.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_output/status.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_partial_function.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_resolver.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_resources.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_runtime/__init__.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_runtime/asgi.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_runtime/execution_context.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_runtime/telemetry.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_serialization.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_server.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_traceback.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_tunnel.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_tunnel.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_type_manager.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/__init__.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/app_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/async_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/blob_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/browser_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/curl_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/deprecation.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/docker_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/function_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/git_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/hash_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/http_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/logger.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/mount_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/name_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/package_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/proxy_support.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/shell_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_utils/time_utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_vendor/__init__.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_vendor/tblib.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_vendor/version.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_watcher.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/_workspace.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/app.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/app.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/billing.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/billing.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/builder/2023.12.txt +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/builder/2024.04.txt +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/builder/2024.10.txt +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/builder/2025.06.txt +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/builder/README.md +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/builder/base-images.json +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/call_graph.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/__init__.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/_download.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/_help.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/_traceback.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/app.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/billing.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/bootstrap.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/changelog.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/cluster.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/config.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/container.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/curl.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/dashboard.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/dict.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/endpoint.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/entry_point.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/environment.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/import_refs.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/launch.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/logo.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/network_file_system.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/profile.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/programs/__init__.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/programs/vscode.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/queues.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/run.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/secret.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/selector.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/shell.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/skills.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/token.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/utils.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/volume.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cli/workspace.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/client.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cls.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/cls.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/config.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/container_process.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/container_process.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/dict.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/dict.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/environments.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/environments.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/exception.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/experimental/__init__.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/experimental/flash.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/experimental/flash.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/experimental/ipython.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/file_io.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/file_io.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/file_pattern_matcher.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/functions.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/image.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/image.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/io_streams.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/io_streams.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/mount.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/mount.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/network_file_system.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/network_file_system.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/object.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/object.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/output.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/parallel_map.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/parallel_map.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/partial_function.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/partial_function.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/proxy.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/proxy.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/py.typed +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/queue.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/queue.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/retries.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/runner.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/runner.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/running_app.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/sandbox.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/sandbox.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/sandbox_fs.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/sandbox_fs.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/schedule.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/scheduler_placement.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/secret.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/secret.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/server.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/server.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/serving.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/serving.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/snapshot.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/snapshot.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/stream_type.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/token_flow.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/token_flow.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/volume.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/volume.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/workspace.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal/workspace.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal.egg-info/requires.txt +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal.egg-info/top_level.txt +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_docs/__init__.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_docs/mdmd/types.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_proto/__init__.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_proto/py.typed +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/modal_version/__main__.py +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/pyproject.toml +0 -0
- {modal-1.5.2.dev5 → modal-1.5.2.dev6}/setup.cfg +0 -0
|
@@ -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.
|
|
@@ -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
|
+
)
|