modal 1.4.3.dev20__tar.gz → 1.4.3.dev21__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.4.3.dev20 → modal-1.4.3.dev21}/PKG-INFO +1 -1
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/docker_utils.py +10 -1
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/environment.py +2 -1
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/client.pyi +2 -2
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/image.py +29 -1
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/image.pyi +54 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/api_pb2.py +600 -600
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/api_pb2.pyi +4 -1
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_version/__init__.py +1 -1
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/pyproject.toml +5 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/LICENSE +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/README.md +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/__init__.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/__main__.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_billing.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_clustered_functions.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_clustered_functions.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_container_entrypoint.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_environments.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_functions.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_grpc_client.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_ipython.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_load_context.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_location.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_logs.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_object.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_output/__init__.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_output/manager.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_output/pty.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_output/rich.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_output/status.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_partial_function.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_resolver.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_resources.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/__init__.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/asgi.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/execution_context.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/telemetry.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_serialization.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_server.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_traceback.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_tunnel.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_tunnel.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_type_manager.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/__init__.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/app_utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/async_utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/blob_utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/browser_utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/deprecation.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/function_utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/git_utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/hash_utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/http_utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/logger.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/mount_utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/name_utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/package_utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/shell_utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_utils/time_utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_vendor/__init__.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_vendor/tblib.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_vendor/version.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/_watcher.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/app.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/app.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/billing.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/builder/2023.12.txt +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/builder/2024.04.txt +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/builder/2024.10.txt +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/builder/2025.06.txt +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/builder/README.md +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/builder/base-images.json +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/call_graph.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/__init__.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/_download.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/_help.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/_traceback.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/app.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/billing.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/bootstrap.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/changelog.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/cluster.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/config.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/container.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/dashboard.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/dict.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/entry_point.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/import_refs.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/launch.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/logo.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/network_file_system.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/profile.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/programs/__init__.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/programs/vscode.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/queues.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/run.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/secret.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/selector.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/shell.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/token.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/utils.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cli/volume.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/client.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cls.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/cls.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/config.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/container_process.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/container_process.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/dict.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/dict.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/environments.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/environments.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/exception.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/experimental/__init__.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/experimental/flash.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/experimental/flash.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/experimental/ipython.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/file_io.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/file_io.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/file_pattern_matcher.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/functions.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/functions.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/io_streams.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/io_streams.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/mount.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/mount.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/network_file_system.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/network_file_system.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/object.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/object.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/output.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/parallel_map.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/parallel_map.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/partial_function.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/partial_function.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/proxy.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/proxy.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/py.typed +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/queue.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/queue.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/retries.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/runner.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/runner.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/running_app.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/sandbox.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/sandbox.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/sandbox_fs.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/sandbox_fs.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/schedule.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/scheduler_placement.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/secret.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/secret.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/server.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/server.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/serving.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/serving.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/snapshot.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/snapshot.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/stream_type.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/token_flow.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/token_flow.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/volume.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal/volume.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal.egg-info/requires.txt +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal.egg-info/top_level.txt +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_docs/__init__.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/__init__.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/api_grpc.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/py.typed +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/modal_version/__main__.py +0 -0
- {modal-1.4.3.dev20 → modal-1.4.3.dev21}/setup.cfg +0 -0
|
@@ -40,10 +40,19 @@ def extract_copy_command_patterns(dockerfile_lines: Sequence[str]) -> list[str]:
|
|
|
40
40
|
|
|
41
41
|
# COPY --from=... commands reference external sources and do not need a context mount.
|
|
42
42
|
# https://docs.docker.com/reference/dockerfile/#copy---from
|
|
43
|
-
if
|
|
43
|
+
if any(p.startswith("--from=") for p in parts):
|
|
44
44
|
current_command = ""
|
|
45
45
|
continue
|
|
46
46
|
|
|
47
|
+
# Strip known COPY flags (--chmod, --chown, --link) before processing sources.
|
|
48
|
+
known_flag_prefixes = ("--chmod=", "--chown=", "--link=")
|
|
49
|
+
parts = [
|
|
50
|
+
p
|
|
51
|
+
for p in parts
|
|
52
|
+
# link has a special handling - it can be "--link" or like "--link=true"
|
|
53
|
+
if p != "--link" and not any(p.startswith(prefix) for prefix in known_flag_prefixes)
|
|
54
|
+
]
|
|
55
|
+
|
|
47
56
|
if len(parts) >= 2:
|
|
48
57
|
# Last part is destination, everything else is a mount source
|
|
49
58
|
sources = parts[:-1]
|
|
@@ -67,7 +67,8 @@ def list_(json: bool = False):
|
|
|
67
67
|
def create(name: str, restricted: bool = False):
|
|
68
68
|
check_environment_name(name)
|
|
69
69
|
Environment.objects.create(name, restricted=restricted)
|
|
70
|
-
|
|
70
|
+
prefix = "Restricted " if restricted else ""
|
|
71
|
+
rich.print(f"[green]✓[/green] {prefix}Environment created: {name}")
|
|
71
72
|
|
|
72
73
|
|
|
73
74
|
ENVIRONMENT_DELETE_HELP = """Delete an environment in the current workspace.
|
|
@@ -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.4.3.
|
|
38
|
+
version: str = "1.4.3.dev21",
|
|
39
39
|
):
|
|
40
40
|
"""mdmd:hidden
|
|
41
41
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -175,7 +175,7 @@ class Client:
|
|
|
175
175
|
server_url: str,
|
|
176
176
|
client_type: int,
|
|
177
177
|
credentials: typing.Optional[tuple[str, str]],
|
|
178
|
-
version: str = "1.4.3.
|
|
178
|
+
version: str = "1.4.3.dev21",
|
|
179
179
|
):
|
|
180
180
|
"""mdmd:hidden
|
|
181
181
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -24,7 +24,7 @@ from typing import (
|
|
|
24
24
|
import typing_extensions
|
|
25
25
|
from google.protobuf.message import Message
|
|
26
26
|
from grpclib.exceptions import StreamTerminatedError
|
|
27
|
-
from typing_extensions import Self
|
|
27
|
+
from typing_extensions import Concatenate, Self
|
|
28
28
|
|
|
29
29
|
from modal._serialization import serialize_data_format
|
|
30
30
|
from modal_proto import api_pb2
|
|
@@ -101,6 +101,8 @@ Use {replacement} instead, which is functionally and performance-wise equivalent
|
|
|
101
101
|
See https://modal.com/docs/guide/modal-1-0-migration for more details.
|
|
102
102
|
"""
|
|
103
103
|
|
|
104
|
+
P = typing_extensions.ParamSpec("P")
|
|
105
|
+
|
|
104
106
|
|
|
105
107
|
def _validate_python_version(
|
|
106
108
|
python_version: Optional[str],
|
|
@@ -2480,6 +2482,32 @@ class _Image(_Object, type_prefix="im"):
|
|
|
2480
2482
|
|
|
2481
2483
|
return self.dockerfile_commands(dockerfile_cmd)
|
|
2482
2484
|
|
|
2485
|
+
def pipe(
|
|
2486
|
+
self,
|
|
2487
|
+
func: Callable[Concatenate["_Image", P], "_Image"],
|
|
2488
|
+
*args: P.args,
|
|
2489
|
+
**kwargs: P.kwargs,
|
|
2490
|
+
) -> "_Image":
|
|
2491
|
+
"""Apply a local function to expand the Image recipe.
|
|
2492
|
+
|
|
2493
|
+
This method can be useful for defining reusable Image build
|
|
2494
|
+
recipes that compose well with the fluent Image builder interface.
|
|
2495
|
+
|
|
2496
|
+
**Example**
|
|
2497
|
+
|
|
2498
|
+
```python
|
|
2499
|
+
def workspace_setup(image: modal.Image, repo: str) -> modal.Image:
|
|
2500
|
+
return image.run_commands(f"git clone {repo}").uv_pip_install(".")
|
|
2501
|
+
|
|
2502
|
+
image = (
|
|
2503
|
+
modal.Image.debian_slim()
|
|
2504
|
+
.apt_install("git")
|
|
2505
|
+
.pipe(workspace_setup, "https://github.com/example/repo.git")
|
|
2506
|
+
)
|
|
2507
|
+
```
|
|
2508
|
+
"""
|
|
2509
|
+
return func(self, *args, **kwargs)
|
|
2510
|
+
|
|
2483
2511
|
# Live handle methods
|
|
2484
2512
|
|
|
2485
2513
|
@contextlib.contextmanager
|
|
@@ -29,6 +29,8 @@ class _AutoDockerIgnoreSentinel:
|
|
|
29
29
|
|
|
30
30
|
AUTO_DOCKERIGNORE: _AutoDockerIgnoreSentinel
|
|
31
31
|
|
|
32
|
+
P = typing_extensions.ParamSpec("P")
|
|
33
|
+
|
|
32
34
|
def _validate_python_version(
|
|
33
35
|
python_version: typing.Optional[str],
|
|
34
36
|
builder_version: typing.Literal["2023.12", "2024.04", "2024.10", "2025.06", "PREVIEW"],
|
|
@@ -1041,6 +1043,32 @@ class _Image(modal._object._Object):
|
|
|
1041
1043
|
"""
|
|
1042
1044
|
...
|
|
1043
1045
|
|
|
1046
|
+
def pipe(
|
|
1047
|
+
self,
|
|
1048
|
+
func: collections.abc.Callable[typing_extensions.Concatenate[_Image, P], _Image],
|
|
1049
|
+
*args: P.args,
|
|
1050
|
+
**kwargs: P.kwargs,
|
|
1051
|
+
) -> _Image:
|
|
1052
|
+
"""Apply a local function to expand the Image recipe.
|
|
1053
|
+
|
|
1054
|
+
This method can be useful for defining reusable Image build
|
|
1055
|
+
recipes that compose well with the fluent Image builder interface.
|
|
1056
|
+
|
|
1057
|
+
**Example**
|
|
1058
|
+
|
|
1059
|
+
```python
|
|
1060
|
+
def workspace_setup(image: modal.Image, repo: str) -> modal.Image:
|
|
1061
|
+
return image.run_commands(f"git clone {repo}").uv_pip_install(".")
|
|
1062
|
+
|
|
1063
|
+
image = (
|
|
1064
|
+
modal.Image.debian_slim()
|
|
1065
|
+
.apt_install("git")
|
|
1066
|
+
.pipe(workspace_setup, "https://github.com/example/repo.git")
|
|
1067
|
+
)
|
|
1068
|
+
```
|
|
1069
|
+
"""
|
|
1070
|
+
...
|
|
1071
|
+
|
|
1044
1072
|
def imports(self):
|
|
1045
1073
|
"""Used to import packages in global scope that are only available when running remotely.
|
|
1046
1074
|
By using this context manager you can avoid an `ImportError` due to not having certain
|
|
@@ -2038,6 +2066,32 @@ class Image(modal.object.Object):
|
|
|
2038
2066
|
"""
|
|
2039
2067
|
...
|
|
2040
2068
|
|
|
2069
|
+
def pipe(
|
|
2070
|
+
self,
|
|
2071
|
+
func: collections.abc.Callable[typing_extensions.Concatenate[Image, P], Image],
|
|
2072
|
+
*args: P.args,
|
|
2073
|
+
**kwargs: P.kwargs,
|
|
2074
|
+
) -> Image:
|
|
2075
|
+
"""Apply a local function to expand the Image recipe.
|
|
2076
|
+
|
|
2077
|
+
This method can be useful for defining reusable Image build
|
|
2078
|
+
recipes that compose well with the fluent Image builder interface.
|
|
2079
|
+
|
|
2080
|
+
**Example**
|
|
2081
|
+
|
|
2082
|
+
```python
|
|
2083
|
+
def workspace_setup(image: modal.Image, repo: str) -> modal.Image:
|
|
2084
|
+
return image.run_commands(f"git clone {repo}").uv_pip_install(".")
|
|
2085
|
+
|
|
2086
|
+
image = (
|
|
2087
|
+
modal.Image.debian_slim()
|
|
2088
|
+
.apt_install("git")
|
|
2089
|
+
.pipe(workspace_setup, "https://github.com/example/repo.git")
|
|
2090
|
+
)
|
|
2091
|
+
```
|
|
2092
|
+
"""
|
|
2093
|
+
...
|
|
2094
|
+
|
|
2041
2095
|
def imports(self):
|
|
2042
2096
|
"""Used to import packages in global scope that are only available when running remotely.
|
|
2043
2097
|
By using this context manager you can avoid an `ImportError` due to not having certain
|