modal 1.1.2.dev2__tar.gz → 1.1.2.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.
Potentially problematic release.
This version of modal might be problematic. Click here for more details.
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/PKG-INFO +1 -1
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/__main__.py +1 -2
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/client.pyi +2 -2
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/config.py +7 -7
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/file_pattern_matcher.py +25 -16
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/image.pyi +5 -5
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_proto/api.proto +1 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_proto/api_pb2.py +536 -536
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_proto/api_pb2.pyi +8 -2
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_version/__init__.py +1 -1
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/LICENSE +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/README.md +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/__init__.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_clustered_functions.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_clustered_functions.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_container_entrypoint.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_functions.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_ipython.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_location.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_object.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_output.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_partial_function.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_pty.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_resolver.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_resources.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_runtime/__init__.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_runtime/asgi.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_runtime/execution_context.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_runtime/telemetry.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_serialization.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_traceback.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_tunnel.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_tunnel.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_type_manager.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/__init__.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/app_utils.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/async_utils.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/blob_utils.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/deprecation.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/docker_utils.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/function_utils.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/git_utils.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/hash_utils.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/http_utils.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/logger.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/mount_utils.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/name_utils.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/package_utils.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/shell_utils.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_utils/time_utils.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_vendor/__init__.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_vendor/tblib.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/_watcher.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/app.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/app.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/builder/2023.12.txt +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/builder/2024.04.txt +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/builder/2024.10.txt +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/builder/2025.06.txt +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/builder/README.md +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/builder/base-images.json +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/call_graph.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/__init__.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/_download.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/_traceback.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/app.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/cluster.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/config.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/container.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/dict.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/entry_point.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/environment.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/import_refs.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/launch.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/network_file_system.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/profile.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/programs/__init__.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/programs/vscode.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/queues.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/run.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/secret.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/token.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/utils.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cli/volume.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/client.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cls.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/cls.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/container_process.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/container_process.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/dict.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/dict.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/environments.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/environments.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/exception.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/experimental/__init__.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/experimental/flash.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/experimental/flash.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/experimental/ipython.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/file_io.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/file_io.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/functions.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/functions.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/gpu.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/image.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/io_streams.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/io_streams.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/mount.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/mount.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/network_file_system.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/network_file_system.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/object.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/object.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/output.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/parallel_map.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/parallel_map.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/partial_function.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/partial_function.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/proxy.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/proxy.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/py.typed +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/queue.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/queue.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/retries.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/runner.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/runner.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/running_app.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/sandbox.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/sandbox.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/schedule.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/scheduler_placement.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/secret.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/secret.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/serving.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/serving.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/snapshot.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/snapshot.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/stream_type.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/token_flow.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/token_flow.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/volume.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal/volume.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal.egg-info/requires.txt +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal.egg-info/top_level.txt +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_docs/__init__.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_proto/__init__.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_proto/api_grpc.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_proto/modal_options_grpc.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_proto/options.proto +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_proto/options_grpc.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_proto/options_pb2.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_proto/options_pb2.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_proto/options_pb2_grpc.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_proto/options_pb2_grpc.pyi +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_proto/py.typed +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/modal_version/__main__.py +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/pyproject.toml +0 -0
- {modal-1.1.2.dev2 → modal-1.1.2.dev5}/setup.cfg +0 -0
|
@@ -37,7 +37,6 @@ def main():
|
|
|
37
37
|
|
|
38
38
|
from grpclib import GRPCError, Status
|
|
39
39
|
from rich.panel import Panel
|
|
40
|
-
from rich.text import Text
|
|
41
40
|
|
|
42
41
|
if isinstance(exc, GRPCError):
|
|
43
42
|
status_map = {
|
|
@@ -69,7 +68,7 @@ def main():
|
|
|
69
68
|
content = f"{content}\n\nNote: {' '.join(notes)}"
|
|
70
69
|
|
|
71
70
|
console = make_console(stderr=True)
|
|
72
|
-
panel = Panel(
|
|
71
|
+
panel = Panel(content, title=title, title_align="left", border_style="red")
|
|
73
72
|
console.print(panel, highlight=False)
|
|
74
73
|
sys.exit(1)
|
|
75
74
|
|
|
@@ -33,7 +33,7 @@ class _Client:
|
|
|
33
33
|
server_url: str,
|
|
34
34
|
client_type: int,
|
|
35
35
|
credentials: typing.Optional[tuple[str, str]],
|
|
36
|
-
version: str = "1.1.2.
|
|
36
|
+
version: str = "1.1.2.dev5",
|
|
37
37
|
):
|
|
38
38
|
"""mdmd:hidden
|
|
39
39
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -164,7 +164,7 @@ class Client:
|
|
|
164
164
|
server_url: str,
|
|
165
165
|
client_type: int,
|
|
166
166
|
credentials: typing.Optional[tuple[str, str]],
|
|
167
|
-
version: str = "1.1.2.
|
|
167
|
+
version: str = "1.1.2.dev5",
|
|
168
168
|
):
|
|
169
169
|
"""mdmd:hidden
|
|
170
170
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -94,7 +94,7 @@ from google.protobuf.empty_pb2 import Empty
|
|
|
94
94
|
from modal_proto import api_pb2
|
|
95
95
|
|
|
96
96
|
from ._utils.logger import configure_logger
|
|
97
|
-
from .exception import InvalidError
|
|
97
|
+
from .exception import InvalidError, NotFoundError
|
|
98
98
|
|
|
99
99
|
DEFAULT_SERVER_URL = "https://api.modal.com"
|
|
100
100
|
|
|
@@ -158,15 +158,15 @@ def _config_active_profile() -> str:
|
|
|
158
158
|
return "default"
|
|
159
159
|
|
|
160
160
|
|
|
161
|
-
def config_set_active_profile(
|
|
161
|
+
def config_set_active_profile(profile: str) -> None:
|
|
162
162
|
"""Set the user's active modal profile by writing it to the `.modal.toml` file."""
|
|
163
|
-
if
|
|
164
|
-
raise
|
|
163
|
+
if profile not in _user_config:
|
|
164
|
+
raise NotFoundError(f"No profile named '{profile}' found in {user_config_path}")
|
|
165
165
|
|
|
166
|
-
for
|
|
167
|
-
|
|
166
|
+
for profile_data in _user_config.values():
|
|
167
|
+
profile_data.pop("active", None)
|
|
168
168
|
|
|
169
|
-
_user_config[
|
|
169
|
+
_user_config[profile]["active"] = True # type: ignore
|
|
170
170
|
_write_user_config(_user_config)
|
|
171
171
|
|
|
172
172
|
|
|
@@ -11,6 +11,7 @@ then asking it whether file paths match any of its patterns.
|
|
|
11
11
|
|
|
12
12
|
import os
|
|
13
13
|
from abc import abstractmethod
|
|
14
|
+
from functools import cached_property
|
|
14
15
|
from pathlib import Path
|
|
15
16
|
from typing import Callable, Optional, Sequence, Union
|
|
16
17
|
|
|
@@ -99,11 +100,11 @@ class FilePatternMatcher(_AbstractPatternMatcher):
|
|
|
99
100
|
```
|
|
100
101
|
"""
|
|
101
102
|
|
|
102
|
-
|
|
103
|
-
|
|
103
|
+
_file_path: Optional[Union[str, Path]]
|
|
104
|
+
_pattern_strings: Optional[Sequence[str]]
|
|
104
105
|
|
|
105
|
-
def
|
|
106
|
-
|
|
106
|
+
def _parse_patterns(self, patterns: Sequence[str]) -> list[Pattern]:
|
|
107
|
+
parsed_patterns = []
|
|
107
108
|
for pattern in list(patterns):
|
|
108
109
|
pattern = pattern.strip().strip(os.path.sep)
|
|
109
110
|
if not pattern:
|
|
@@ -118,7 +119,8 @@ class FilePatternMatcher(_AbstractPatternMatcher):
|
|
|
118
119
|
# In Python, we can proceed without explicit syntax checking
|
|
119
120
|
new_pattern.cleaned_pattern = pattern
|
|
120
121
|
new_pattern.dirs = pattern.split(os.path.sep)
|
|
121
|
-
|
|
122
|
+
parsed_patterns.append(new_pattern)
|
|
123
|
+
return parsed_patterns
|
|
122
124
|
|
|
123
125
|
def __init__(self, *pattern: str) -> None:
|
|
124
126
|
"""Initialize a new FilePatternMatcher instance.
|
|
@@ -129,7 +131,8 @@ class FilePatternMatcher(_AbstractPatternMatcher):
|
|
|
129
131
|
Raises:
|
|
130
132
|
ValueError: If an illegal exclusion pattern is provided.
|
|
131
133
|
"""
|
|
132
|
-
self.
|
|
134
|
+
self._pattern_strings = pattern
|
|
135
|
+
self._file_path = None
|
|
133
136
|
|
|
134
137
|
@classmethod
|
|
135
138
|
def from_file(cls, file_path: Union[str, Path]) -> "FilePatternMatcher":
|
|
@@ -148,14 +151,10 @@ class FilePatternMatcher(_AbstractPatternMatcher):
|
|
|
148
151
|
```
|
|
149
152
|
|
|
150
153
|
"""
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
uninitialized._delayed_init = None
|
|
156
|
-
|
|
157
|
-
uninitialized._delayed_init = _delayed_init
|
|
158
|
-
return uninitialized
|
|
154
|
+
instance = cls.__new__(cls)
|
|
155
|
+
instance._file_path = file_path
|
|
156
|
+
instance._pattern_strings = None
|
|
157
|
+
return instance
|
|
159
158
|
|
|
160
159
|
def _matches(self, file_path: str) -> bool:
|
|
161
160
|
"""Check if the file path or any of its parent directories match the patterns.
|
|
@@ -194,6 +193,18 @@ class FilePatternMatcher(_AbstractPatternMatcher):
|
|
|
194
193
|
|
|
195
194
|
return matched
|
|
196
195
|
|
|
196
|
+
@cached_property
|
|
197
|
+
def patterns(self) -> list[Pattern]:
|
|
198
|
+
"""Get the patterns, loading from file if necessary."""
|
|
199
|
+
if self._file_path is not None:
|
|
200
|
+
# Lazy load from file
|
|
201
|
+
pattern_strings = Path(self._file_path).read_text("utf8").splitlines()
|
|
202
|
+
else:
|
|
203
|
+
# Use patterns provided in __init__
|
|
204
|
+
pattern_strings = list(self._pattern_strings)
|
|
205
|
+
|
|
206
|
+
return self._parse_patterns(pattern_strings)
|
|
207
|
+
|
|
197
208
|
def can_prune_directories(self) -> bool:
|
|
198
209
|
"""
|
|
199
210
|
Returns True if this pattern matcher allows safe early directory pruning.
|
|
@@ -205,8 +216,6 @@ class FilePatternMatcher(_AbstractPatternMatcher):
|
|
|
205
216
|
return not any(pattern.exclusion for pattern in self.patterns)
|
|
206
217
|
|
|
207
218
|
def __call__(self, file_path: Path) -> bool:
|
|
208
|
-
if self._delayed_init:
|
|
209
|
-
self._delayed_init()
|
|
210
219
|
return self._matches(str(file_path))
|
|
211
220
|
|
|
212
221
|
|
|
@@ -91,7 +91,7 @@ def _create_context_mount_function(
|
|
|
91
91
|
dockerfile_cmds: list[str] = [],
|
|
92
92
|
dockerfile_path: typing.Optional[pathlib.Path] = None,
|
|
93
93
|
context_mount: typing.Optional[modal.mount._Mount] = None,
|
|
94
|
-
context_dir: typing.Union[pathlib.Path,
|
|
94
|
+
context_dir: typing.Union[str, pathlib.Path, None] = None,
|
|
95
95
|
): ...
|
|
96
96
|
|
|
97
97
|
class _ImageRegistryConfig:
|
|
@@ -537,7 +537,7 @@ class _Image(modal._object._Object):
|
|
|
537
537
|
secrets: collections.abc.Sequence[modal.secret._Secret] = [],
|
|
538
538
|
gpu: typing.Union[None, str, modal.gpu._GPUConfig] = None,
|
|
539
539
|
context_mount: typing.Optional[modal.mount._Mount] = None,
|
|
540
|
-
context_dir: typing.Union[pathlib.Path,
|
|
540
|
+
context_dir: typing.Union[str, pathlib.Path, None] = None,
|
|
541
541
|
force_build: bool = False,
|
|
542
542
|
ignore: typing.Union[
|
|
543
543
|
collections.abc.Sequence[str], collections.abc.Callable[[pathlib.Path], bool]
|
|
@@ -748,7 +748,7 @@ class _Image(modal._object._Object):
|
|
|
748
748
|
*,
|
|
749
749
|
context_mount: typing.Optional[modal.mount._Mount] = None,
|
|
750
750
|
force_build: bool = False,
|
|
751
|
-
context_dir: typing.Union[pathlib.Path,
|
|
751
|
+
context_dir: typing.Union[str, pathlib.Path, None] = None,
|
|
752
752
|
secrets: collections.abc.Sequence[modal.secret._Secret] = [],
|
|
753
753
|
gpu: typing.Union[None, str, modal.gpu._GPUConfig] = None,
|
|
754
754
|
add_python: typing.Optional[str] = None,
|
|
@@ -1381,7 +1381,7 @@ class Image(modal.object.Object):
|
|
|
1381
1381
|
secrets: collections.abc.Sequence[modal.secret.Secret] = [],
|
|
1382
1382
|
gpu: typing.Union[None, str, modal.gpu._GPUConfig] = None,
|
|
1383
1383
|
context_mount: typing.Optional[modal.mount.Mount] = None,
|
|
1384
|
-
context_dir: typing.Union[pathlib.Path,
|
|
1384
|
+
context_dir: typing.Union[str, pathlib.Path, None] = None,
|
|
1385
1385
|
force_build: bool = False,
|
|
1386
1386
|
ignore: typing.Union[
|
|
1387
1387
|
collections.abc.Sequence[str], collections.abc.Callable[[pathlib.Path], bool]
|
|
@@ -1592,7 +1592,7 @@ class Image(modal.object.Object):
|
|
|
1592
1592
|
*,
|
|
1593
1593
|
context_mount: typing.Optional[modal.mount.Mount] = None,
|
|
1594
1594
|
force_build: bool = False,
|
|
1595
|
-
context_dir: typing.Union[pathlib.Path,
|
|
1595
|
+
context_dir: typing.Union[str, pathlib.Path, None] = None,
|
|
1596
1596
|
secrets: collections.abc.Sequence[modal.secret.Secret] = [],
|
|
1597
1597
|
gpu: typing.Union[None, str, modal.gpu._GPUConfig] = None,
|
|
1598
1598
|
add_python: typing.Optional[str] = None,
|
|
@@ -1819,6 +1819,7 @@ message FunctionOptions {
|
|
|
1819
1819
|
optional uint32 max_concurrent_inputs = 14;
|
|
1820
1820
|
optional uint32 batch_max_size = 15;
|
|
1821
1821
|
optional uint64 batch_linger_ms = 16;
|
|
1822
|
+
optional SchedulerPlacement scheduler_placement = 17;
|
|
1822
1823
|
}
|
|
1823
1824
|
|
|
1824
1825
|
message FunctionPrecreateRequest {
|