modAL 1.3.1.dev24__tar.gz → 1.3.1.dev26__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.3.1.dev24 → modal-1.3.1.dev26}/PKG-INFO +1 -1
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/run.py +53 -7
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/client.pyi +2 -2
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/functions.pyi +6 -6
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_proto/api.proto +3 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_proto/api_pb2.py +668 -668
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_proto/api_pb2.pyi +10 -2
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_version/__init__.py +1 -1
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/LICENSE +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/README.md +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/__init__.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/__main__.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_billing.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_clustered_functions.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_clustered_functions.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_container_entrypoint.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_functions.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_grpc_client.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_ipython.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_load_context.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_location.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_object.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_output.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_partial_function.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_pty.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_resolver.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_resources.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_runtime/__init__.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_runtime/asgi.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_runtime/execution_context.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_runtime/telemetry.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_serialization.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_traceback.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_tunnel.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_tunnel.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_type_manager.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/__init__.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/app_utils.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/async_utils.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/blob_utils.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/deprecation.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/docker_utils.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/function_utils.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/git_utils.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/hash_utils.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/http_utils.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/logger.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/mount_utils.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/name_utils.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/package_utils.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/shell_utils.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_utils/time_utils.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_vendor/__init__.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_vendor/tblib.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/_watcher.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/app.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/app.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/billing.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/builder/2023.12.txt +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/builder/2024.04.txt +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/builder/2024.10.txt +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/builder/2025.06.txt +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/builder/README.md +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/builder/base-images.json +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/call_graph.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/__init__.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/_download.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/_traceback.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/app.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/cluster.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/config.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/container.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/dict.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/entry_point.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/environment.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/import_refs.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/launch.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/network_file_system.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/profile.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/programs/__init__.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/programs/vscode.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/queues.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/secret.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/shell.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/token.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/utils.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cli/volume.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/client.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cls.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/cls.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/config.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/container_process.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/container_process.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/dict.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/dict.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/environments.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/environments.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/exception.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/experimental/__init__.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/experimental/flash.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/experimental/flash.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/experimental/ipython.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/file_io.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/file_io.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/file_pattern_matcher.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/functions.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/gpu.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/image.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/image.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/io_streams.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/io_streams.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/mount.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/mount.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/network_file_system.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/network_file_system.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/object.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/object.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/output.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/parallel_map.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/parallel_map.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/partial_function.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/partial_function.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/proxy.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/proxy.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/py.typed +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/queue.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/queue.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/retries.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/runner.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/runner.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/running_app.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/sandbox.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/sandbox.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/schedule.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/scheduler_placement.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/secret.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/secret.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/serving.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/serving.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/snapshot.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/snapshot.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/stream_type.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/token_flow.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/token_flow.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/volume.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal/volume.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal.egg-info/requires.txt +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal.egg-info/top_level.txt +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_docs/__init__.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_proto/__init__.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_proto/api_grpc.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_proto/py.typed +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_proto/task_command_router.proto +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/modal_version/__main__.py +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/pyproject.toml +0 -0
- {modal-1.3.1.dev24 → modal-1.3.1.dev26}/setup.cfg +0 -0
|
@@ -49,6 +49,26 @@ class AnyParamType(click.ParamType):
|
|
|
49
49
|
return value
|
|
50
50
|
|
|
51
51
|
|
|
52
|
+
class LiteralIntParamType(click.Choice):
|
|
53
|
+
"""A ParamType for Literal types containing only integers."""
|
|
54
|
+
|
|
55
|
+
def __init__(self, literal_values: tuple[int, ...]):
|
|
56
|
+
self.int_values = {str(v): v for v in literal_values}
|
|
57
|
+
super().__init__(list(self.int_values.keys()))
|
|
58
|
+
|
|
59
|
+
def convert(self, value, param, ctx):
|
|
60
|
+
# If value is already an int (e.g., from a default), validate and return it
|
|
61
|
+
# Exclude bools since they're a subclass of int but we don't support them
|
|
62
|
+
if isinstance(value, int) and not isinstance(value, bool):
|
|
63
|
+
if value in self.int_values.values():
|
|
64
|
+
return value
|
|
65
|
+
# Invalid int - convert to string so Choice can generate a nice error message
|
|
66
|
+
value = str(value)
|
|
67
|
+
# Use Choice's validation for string inputs, then convert back to int
|
|
68
|
+
str_value = super().convert(value, param, ctx)
|
|
69
|
+
return self.int_values[str_value]
|
|
70
|
+
|
|
71
|
+
|
|
52
72
|
option_parsers = {
|
|
53
73
|
"str": str,
|
|
54
74
|
"int": int,
|
|
@@ -99,6 +119,20 @@ def _get_cli_runnable_signature(sig: inspect.Signature, type_hints: dict[str, ty
|
|
|
99
119
|
return CliRunnableSignature(signature, has_variadic_args)
|
|
100
120
|
|
|
101
121
|
|
|
122
|
+
def _get_literal_values(type_hint: Any) -> Optional[tuple[Any, ...]]:
|
|
123
|
+
"""Extract values from a Literal type annotation.
|
|
124
|
+
|
|
125
|
+
Returns None if not a Literal type, otherwise returns tuple of literal values.
|
|
126
|
+
"""
|
|
127
|
+
try:
|
|
128
|
+
origin = typing.get_origin(type_hint)
|
|
129
|
+
if origin is typing.Literal:
|
|
130
|
+
return typing.get_args(type_hint)
|
|
131
|
+
except Exception:
|
|
132
|
+
pass
|
|
133
|
+
return None
|
|
134
|
+
|
|
135
|
+
|
|
102
136
|
def _get_param_type_as_str(annot: Any) -> str:
|
|
103
137
|
"""Return annotation as a string, handling various spellings for optional types."""
|
|
104
138
|
annot_str = str(annot)
|
|
@@ -121,16 +155,28 @@ def _add_click_options(func, parameters: dict[str, ParameterMetadata]):
|
|
|
121
155
|
Kind of like typer, but using options instead of positional arguments
|
|
122
156
|
"""
|
|
123
157
|
for param in parameters.values():
|
|
124
|
-
param_type_str = _get_param_type_as_str(param["type_hint"])
|
|
125
158
|
param_name = param["name"].replace("_", "-")
|
|
126
159
|
cli_name = "--" + param_name
|
|
127
|
-
if param_type_str == "bool":
|
|
128
|
-
cli_name += "/--no-" + param_name
|
|
129
160
|
|
|
130
|
-
parser
|
|
131
|
-
if
|
|
132
|
-
|
|
133
|
-
|
|
161
|
+
parser: Any
|
|
162
|
+
if (literal_values := _get_literal_values(param["type_hint"])) is not None:
|
|
163
|
+
if all(isinstance(v, str) for v in literal_values):
|
|
164
|
+
parser = click.Choice(list(literal_values))
|
|
165
|
+
elif all(isinstance(v, int) and not isinstance(v, bool) for v in literal_values):
|
|
166
|
+
parser = LiteralIntParamType(literal_values)
|
|
167
|
+
else:
|
|
168
|
+
# Mixed types, booleans, or other unsupported types
|
|
169
|
+
msg = f"Parameter `{param_name}` has unparseable annotation: {param['annotation']}"
|
|
170
|
+
raise NoParserAvailable(msg)
|
|
171
|
+
else:
|
|
172
|
+
param_type_str = _get_param_type_as_str(param["type_hint"])
|
|
173
|
+
if param_type_str == "bool":
|
|
174
|
+
cli_name += "/--no-" + param_name
|
|
175
|
+
|
|
176
|
+
parser = option_parsers.get(param_type_str)
|
|
177
|
+
if parser is None:
|
|
178
|
+
msg = f"Parameter `{param_name}` has unparseable annotation: {param['annotation']}"
|
|
179
|
+
raise NoParserAvailable(msg)
|
|
134
180
|
kwargs: Any = {
|
|
135
181
|
"type": parser,
|
|
136
182
|
}
|
|
@@ -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.3.1.
|
|
36
|
+
version: str = "1.3.1.dev26",
|
|
37
37
|
):
|
|
38
38
|
"""mdmd:hidden
|
|
39
39
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -163,7 +163,7 @@ class Client:
|
|
|
163
163
|
server_url: str,
|
|
164
164
|
client_type: int,
|
|
165
165
|
credentials: typing.Optional[tuple[str, str]],
|
|
166
|
-
version: str = "1.3.1.
|
|
166
|
+
version: str = "1.3.1.dev26",
|
|
167
167
|
):
|
|
168
168
|
"""mdmd:hidden
|
|
169
169
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -407,7 +407,7 @@ class Function(
|
|
|
407
407
|
|
|
408
408
|
_call_generator: ___call_generator_spec
|
|
409
409
|
|
|
410
|
-
class __remote_spec(typing_extensions.Protocol[
|
|
410
|
+
class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
411
411
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
|
|
412
412
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result."""
|
|
413
413
|
...
|
|
@@ -416,7 +416,7 @@ class Function(
|
|
|
416
416
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result."""
|
|
417
417
|
...
|
|
418
418
|
|
|
419
|
-
remote: __remote_spec[modal._functions.
|
|
419
|
+
remote: __remote_spec[modal._functions.P, modal._functions.ReturnType]
|
|
420
420
|
|
|
421
421
|
class __remote_gen_spec(typing_extensions.Protocol):
|
|
422
422
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
|
|
@@ -443,7 +443,7 @@ class Function(
|
|
|
443
443
|
"""
|
|
444
444
|
...
|
|
445
445
|
|
|
446
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
|
446
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
447
447
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
448
448
|
"""[Experimental] Calls the function with the given arguments, without waiting for the results.
|
|
449
449
|
|
|
@@ -466,7 +466,7 @@ class Function(
|
|
|
466
466
|
"""
|
|
467
467
|
...
|
|
468
468
|
|
|
469
|
-
_experimental_spawn: ___experimental_spawn_spec[modal._functions.
|
|
469
|
+
_experimental_spawn: ___experimental_spawn_spec[modal._functions.P, modal._functions.ReturnType]
|
|
470
470
|
|
|
471
471
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
|
|
472
472
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
|
|
@@ -474,7 +474,7 @@ class Function(
|
|
|
474
474
|
|
|
475
475
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
|
|
476
476
|
|
|
477
|
-
class __spawn_spec(typing_extensions.Protocol[
|
|
477
|
+
class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
478
478
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
479
479
|
"""Calls the function with the given arguments, without waiting for the results.
|
|
480
480
|
|
|
@@ -495,7 +495,7 @@ class Function(
|
|
|
495
495
|
"""
|
|
496
496
|
...
|
|
497
497
|
|
|
498
|
-
spawn: __spawn_spec[modal._functions.
|
|
498
|
+
spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType]
|
|
499
499
|
|
|
500
500
|
def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
|
|
501
501
|
"""Return the inner Python object wrapped by this Modal Function."""
|
|
@@ -1561,6 +1561,7 @@ message Function {
|
|
|
1561
1561
|
|
|
1562
1562
|
bool single_use_containers = 91; // When True, containers will shut down after handling a single input
|
|
1563
1563
|
|
|
1564
|
+
bool is_server = 92; // When True, the function is a server-side function.
|
|
1564
1565
|
}
|
|
1565
1566
|
|
|
1566
1567
|
message FunctionAsyncInvokeRequest {
|
|
@@ -1744,6 +1745,8 @@ message FunctionData {
|
|
|
1744
1745
|
// Attribute on the module with the implementation, which may differ from function_name
|
|
1745
1746
|
// when the user provided a custom name= for the Function inside the Application namespace
|
|
1746
1747
|
string implementation_name = 40;
|
|
1748
|
+
|
|
1749
|
+
bool is_server = 41; // When True, the function is a server-side function.
|
|
1747
1750
|
}
|
|
1748
1751
|
|
|
1749
1752
|
message FunctionExtended {
|