modal 1.1.1.dev25__py3-none-any.whl → 1.1.1.dev26__py3-none-any.whl

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/__main__.py CHANGED
@@ -1,6 +1,7 @@
1
1
  # Copyright Modal Labs 2022
2
2
  import sys
3
3
 
4
+ from ._output import make_console
4
5
  from ._traceback import reduce_traceback_to_user_code
5
6
  from .cli._traceback import highlight_modal_warnings, setup_rich_traceback
6
7
  from .cli.entry_point import entrypoint_cli
@@ -35,7 +36,6 @@ def main():
35
36
  raise
36
37
 
37
38
  from grpclib import GRPCError, Status
38
- from rich.console import Console
39
39
  from rich.panel import Panel
40
40
  from rich.text import Text
41
41
 
@@ -68,7 +68,7 @@ def main():
68
68
  if notes := getattr(exc, "__notes__", []):
69
69
  content = f"{content}\n\nNote: {' '.join(notes)}"
70
70
 
71
- console = Console(stderr=True)
71
+ console = make_console(stderr=True)
72
72
  panel = Panel(Text(content), title=title, title_align="left", border_style="red")
73
73
  console.print(panel, highlight=False)
74
74
  sys.exit(1)
modal/_output.py CHANGED
@@ -4,7 +4,6 @@ from __future__ import annotations
4
4
  import asyncio
5
5
  import contextlib
6
6
  import functools
7
- import io
8
7
  import platform
9
8
  import re
10
9
  import socket
@@ -46,6 +45,16 @@ else:
46
45
  default_spinner = "dots"
47
46
 
48
47
 
48
+ def make_console(*, stderr: bool = False, highlight: bool = True) -> Console:
49
+ """Create a rich Console tuned for Modal CLI output."""
50
+ return Console(
51
+ stderr=stderr,
52
+ highlight=highlight,
53
+ # CLI does not work with auto-detected Jupyter HTML display_data.
54
+ force_jupyter=False,
55
+ )
56
+
57
+
49
58
  class FunctionQueuingColumn(ProgressColumn):
50
59
  """Renders time elapsed, including task.completed as additional elapsed time."""
51
60
 
@@ -147,12 +156,11 @@ class OutputManager:
147
156
  def __init__(
148
157
  self,
149
158
  *,
150
- stdout: io.TextIOWrapper | None = None,
151
159
  status_spinner_text: str = "Running app...",
152
160
  show_timestamps: bool = False,
153
161
  ):
154
- self._stdout = stdout or sys.stdout
155
- self._console = Console(file=stdout, highlight=False)
162
+ self._stdout = sys.stdout
163
+ self._console = make_console(highlight=False)
156
164
  self._task_states = {}
157
165
  self._task_progress_items = {}
158
166
  self._current_render_group = None
modal/cli/_traceback.py CHANGED
@@ -6,12 +6,13 @@ import re
6
6
  import warnings
7
7
  from typing import Optional
8
8
 
9
- from rich.console import Console, RenderResult, group
9
+ from rich.console import RenderResult, group
10
10
  from rich.panel import Panel
11
11
  from rich.syntax import Syntax
12
12
  from rich.text import Text
13
13
  from rich.traceback import PathHighlighter, Stack, Traceback, install
14
14
 
15
+ from .._output import make_console
15
16
  from ..exception import DeprecationError, PendingDeprecationError, ServerWarning
16
17
 
17
18
 
@@ -193,7 +194,7 @@ def highlight_modal_warnings() -> None:
193
194
  title=title,
194
195
  title_align="left",
195
196
  )
196
- Console().print(panel)
197
+ make_console().print(panel)
197
198
  else:
198
199
  base_showwarning(warning, category, filename, lineno, file=None, line=None)
199
200
 
modal/cli/cluster.py CHANGED
@@ -2,10 +2,10 @@
2
2
  from typing import Optional, Union
3
3
 
4
4
  import typer
5
- from rich.console import Console
6
5
  from rich.text import Text
7
6
 
8
7
  from modal._object import _get_environment_name
8
+ from modal._output import make_console
9
9
  from modal._pty import get_pty_info
10
10
  from modal._utils.async_utils import synchronizer
11
11
  from modal._utils.time_utils import timestamp_to_local
@@ -62,7 +62,7 @@ async def shell(
62
62
  if len(res.cluster.task_ids) <= rank:
63
63
  raise typer.Abort(f"No node with rank {rank} in cluster {cluster_id}")
64
64
  task_id = res.cluster.task_ids[rank]
65
- console = Console()
65
+ console = make_console()
66
66
  is_main = "(main)" if rank == 0 else ""
67
67
  console.print(
68
68
  f"Opening shell to node {rank} {is_main} of cluster {cluster_id} (container {task_id})", style="green"
modal/cli/config.py CHANGED
@@ -1,7 +1,7 @@
1
1
  # Copyright Modal Labs 2022
2
2
  import typer
3
- from rich.console import Console
4
3
 
4
+ from modal._output import make_console
5
5
  from modal.config import _profile, _store_user_config, config
6
6
  from modal.environments import Environment
7
7
 
@@ -24,7 +24,7 @@ def show(redact: bool = typer.Option(True, help="Redact the `token_secret` value
24
24
  if redact and config_dict.get("token_secret"):
25
25
  config_dict["token_secret"] = "***"
26
26
 
27
- console = Console()
27
+ console = make_console()
28
28
  console.print(config_dict)
29
29
 
30
30
 
modal/cli/dict.py CHANGED
@@ -2,9 +2,9 @@
2
2
  from typing import Optional
3
3
 
4
4
  import typer
5
- from rich.console import Console
6
5
  from typer import Argument, Option, Typer
7
6
 
7
+ from modal._output import make_console
8
8
  from modal._resolver import Resolver
9
9
  from modal._utils.async_utils import synchronizer
10
10
  from modal._utils.grpc_utils import retry_transient_errors
@@ -85,7 +85,7 @@ async def get(name: str, key: str, *, env: Optional[str] = ENV_OPTION):
85
85
  Note: When using the CLI, keys are always interpreted as having a string type.
86
86
  """
87
87
  d = _Dict.from_name(name, environment_name=env)
88
- console = Console()
88
+ console = make_console()
89
89
  val = await d.get(key)
90
90
  console.print(val)
91
91
 
modal/cli/entry_point.py CHANGED
@@ -3,9 +3,9 @@ import subprocess
3
3
  from typing import Optional
4
4
 
5
5
  import typer
6
- from rich.console import Console
7
6
  from rich.rule import Rule
8
7
 
8
+ from modal._output import make_console
9
9
  from modal._utils.async_utils import synchronizer
10
10
 
11
11
  from . import run
@@ -71,7 +71,7 @@ def check_path():
71
71
  "You may need to give it permissions or use `[white]python -m modal[/white]` as a workaround.[/red]\n"
72
72
  )
73
73
  text += f"See more information here:\n\n[link={url}]{url}[/link]\n"
74
- console = Console()
74
+ console = make_console()
75
75
  console.print(text)
76
76
  console.print(Rule(style="white"))
77
77
 
modal/cli/import_refs.py CHANGED
@@ -19,9 +19,9 @@ from pathlib import Path
19
19
  from typing import Optional, Union, cast
20
20
 
21
21
  import click
22
- from rich.console import Console
23
22
  from rich.markdown import Markdown
24
23
 
24
+ from modal._output import make_console
25
25
  from modal._utils.deprecation import deprecation_warning
26
26
  from modal.app import App, LocalEntrypoint
27
27
  from modal.cls import Cls
@@ -258,7 +258,7 @@ def import_app_from_ref(import_ref: ImportRef, base_cmd: str = "") -> App:
258
258
  app = getattr(module, object_path)
259
259
 
260
260
  if app is None:
261
- error_console = Console(stderr=True)
261
+ error_console = make_console(stderr=True)
262
262
  error_console.print(f"[bold red]Could not find Modal app '{object_path}' in {import_path}.[/bold red]")
263
263
 
264
264
  if not object_path:
@@ -282,7 +282,7 @@ def import_app_from_ref(import_ref: ImportRef, base_cmd: str = "") -> App:
282
282
  def _show_function_ref_help(app_ref: ImportRef, base_cmd: str) -> None:
283
283
  object_path = app_ref.object_path
284
284
  import_path = app_ref.file_or_module
285
- error_console = Console(stderr=True)
285
+ error_console = make_console(stderr=True)
286
286
  if object_path:
287
287
  error_console.print(
288
288
  f"[bold red]Could not find Modal function or local entrypoint"
@@ -7,14 +7,13 @@ from typing import Optional
7
7
  import typer
8
8
  from click import UsageError
9
9
  from grpclib import GRPCError, Status
10
- from rich.console import Console
11
10
  from rich.syntax import Syntax
12
11
  from rich.table import Table
13
12
  from typer import Argument, Typer
14
13
 
15
14
  import modal
16
15
  from modal._location import display_location
17
- from modal._output import OutputManager, ProgressHandler
16
+ from modal._output import OutputManager, ProgressHandler, make_console
18
17
  from modal._utils.async_utils import synchronizer
19
18
  from modal._utils.grpc_utils import retry_transient_errors
20
19
  from modal._utils.time_utils import timestamp_to_local
@@ -66,7 +65,7 @@ def create(
66
65
  ):
67
66
  ensure_env(env)
68
67
  modal.NetworkFileSystem.create_deployed(name, environment_name=env)
69
- console = Console()
68
+ console = make_console()
70
69
  console.print(f"Created volume '{name}'. \n\nCode example:\n")
71
70
  usage = Syntax(gen_usage_code(name), "python")
72
71
  console.print(usage)
@@ -93,7 +92,7 @@ async def ls(
93
92
  raise
94
93
 
95
94
  if sys.stdout.isatty():
96
- console = Console()
95
+ console = make_console()
97
96
  console.print(f"Directory listing of '{path}' in '{volume_name}'")
98
97
  table = Table()
99
98
 
@@ -131,7 +130,7 @@ async def put(
131
130
  volume = _NetworkFileSystem.from_name(volume_name)
132
131
  if remote_path.endswith("/"):
133
132
  remote_path = remote_path + os.path.basename(local_path)
134
- console = Console()
133
+ console = make_console()
135
134
 
136
135
  if Path(local_path).is_dir():
137
136
  progress_handler = ProgressHandler(type="upload", console=console)
@@ -184,7 +183,7 @@ async def get(
184
183
  ensure_env(env)
185
184
  destination = Path(local_destination)
186
185
  volume = _NetworkFileSystem.from_name(volume_name)
187
- console = Console()
186
+ console = make_console()
188
187
  progress_handler = ProgressHandler(type="download", console=console)
189
188
  with progress_handler.live:
190
189
  await _volume_download(volume, remote_path, destination, force, progress_cb=progress_handler.progress)
@@ -203,7 +202,7 @@ async def rm(
203
202
  ):
204
203
  ensure_env(env)
205
204
  volume = _NetworkFileSystem.from_name(volume_name)
206
- console = Console()
205
+ console = make_console()
207
206
  try:
208
207
  await volume.remove_file(remote_path, recursive=recursive)
209
208
  console.print(OutputManager.step_completed(f"{remote_path} was deleted successfully!"))
modal/cli/profile.py CHANGED
@@ -5,10 +5,10 @@ import os
5
5
  from typing import Optional
6
6
 
7
7
  import typer
8
- from rich.console import Console
9
8
  from rich.json import JSON
10
9
  from rich.table import Table
11
10
 
11
+ from modal._output import make_console
12
12
  from modal._utils.async_utils import synchronizer
13
13
  from modal.config import Config, _lookup_workspace, _profile, config_profiles, config_set_active_profile
14
14
  from modal.exception import AuthError
@@ -69,7 +69,7 @@ async def list_(json: Optional[bool] = False):
69
69
  except AuthError:
70
70
  env_based_workspace = "Unknown (authentication failure)"
71
71
 
72
- console = Console()
72
+ console = make_console()
73
73
  highlight = "bold green" if env_based_workspace is None else "yellow"
74
74
  if json:
75
75
  json_data = []
modal/cli/queues.py CHANGED
@@ -2,9 +2,9 @@
2
2
  from typing import Optional
3
3
 
4
4
  import typer
5
- from rich.console import Console
6
5
  from typer import Argument, Option, Typer
7
6
 
7
+ from modal._output import make_console
8
8
  from modal._resolver import Resolver
9
9
  from modal._utils.async_utils import synchronizer
10
10
  from modal._utils.grpc_utils import retry_transient_errors
@@ -108,7 +108,7 @@ async def peek(
108
108
  ):
109
109
  """Print the next N items in the queue or queue partition (without removal)."""
110
110
  q = _Queue.from_name(name, environment_name=env)
111
- console = Console()
111
+ console = make_console()
112
112
  i = 0
113
113
  async for item in q.iterate(partition=partition):
114
114
  console.print(item)
@@ -128,5 +128,5 @@ async def len(
128
128
  ):
129
129
  """Print the length of a queue partition or the total length of all partitions."""
130
130
  q = _Queue.from_name(name, environment_name=env)
131
- console = Console()
131
+ console = make_console()
132
132
  console.print(await q.len(partition=partition, total=total))
modal/cli/secret.py CHANGED
@@ -9,10 +9,10 @@ from typing import Optional
9
9
 
10
10
  import click
11
11
  import typer
12
- from rich.console import Console
13
12
  from rich.syntax import Syntax
14
13
  from typer import Argument
15
14
 
15
+ from modal._output import make_console
16
16
  from modal._utils.async_utils import synchronizer
17
17
  from modal._utils.grpc_utils import retry_transient_errors
18
18
  from modal._utils.time_utils import timestamp_to_local
@@ -117,7 +117,7 @@ modal secret create my-credentials username=john password="$PASSWORD"
117
117
  await _Secret.create_deployed(secret_name, env_dict, overwrite=force)
118
118
 
119
119
  # Print code sample
120
- console = Console()
120
+ console = make_console()
121
121
  env_var_code = "\n ".join(f'os.getenv("{name}")' for name in env_dict.keys()) if env_dict else "..."
122
122
  example_code = f"""
123
123
  @app.function(secrets=[modal.Secret.from_name("{secret_name}")])
modal/cli/utils.py CHANGED
@@ -7,13 +7,12 @@ from typing import Optional, Union
7
7
  import typer
8
8
  from click import UsageError
9
9
  from grpclib import GRPCError, Status
10
- from rich.console import Console
11
10
  from rich.table import Column, Table
12
11
  from rich.text import Text
13
12
 
14
13
  from modal_proto import api_pb2
15
14
 
16
- from .._output import OutputManager, get_app_logs_loop
15
+ from .._output import OutputManager, get_app_logs_loop, make_console
17
16
  from .._utils.async_utils import synchronizer
18
17
  from ..client import _Client
19
18
  from ..environments import ensure_env
@@ -66,7 +65,7 @@ def _plain(text: Union[Text, str]) -> str:
66
65
 
67
66
 
68
67
  def is_tty() -> bool:
69
- return Console().is_terminal
68
+ return make_console().is_terminal
70
69
 
71
70
 
72
71
  def display_table(
@@ -78,7 +77,7 @@ def display_table(
78
77
  def col_to_str(col: Union[Column, str]) -> str:
79
78
  return str(col.header) if isinstance(col, Column) else col
80
79
 
81
- console = Console()
80
+ console = make_console()
82
81
  if json:
83
82
  json_data = [{col_to_str(col): _plain(row[i]) for i, col in enumerate(columns)} for row in rows]
84
83
  console.print_json(dumps(json_data))
modal/cli/volume.py CHANGED
@@ -7,12 +7,11 @@ from typing import Optional
7
7
  import typer
8
8
  from click import UsageError
9
9
  from grpclib import GRPCError, Status
10
- from rich.console import Console
11
10
  from rich.syntax import Syntax
12
11
  from typer import Argument, Option, Typer
13
12
 
14
13
  import modal
15
- from modal._output import OutputManager, ProgressHandler
14
+ from modal._output import OutputManager, ProgressHandler, make_console
16
15
  from modal._utils.async_utils import synchronizer
17
16
  from modal._utils.grpc_utils import retry_transient_errors
18
17
  from modal._utils.time_utils import timestamp_to_local
@@ -64,7 +63,7 @@ def some_func():
64
63
  os.listdir("/my_vol")
65
64
  """
66
65
 
67
- console = Console()
66
+ console = make_console()
68
67
  console.print(f"Created Volume '{name}' in environment '{env_name}'. \n\nCode example:\n")
69
68
  usage = Syntax(usage_code, "python")
70
69
  console.print(usage)
@@ -96,7 +95,7 @@ async def get(
96
95
  ensure_env(env)
97
96
  destination = Path(local_destination)
98
97
  volume = _Volume.from_name(volume_name, environment_name=env)
99
- console = Console()
98
+ console = make_console()
100
99
  progress_handler = ProgressHandler(type="download", console=console)
101
100
  with progress_handler.live:
102
101
  await _volume_download(volume, remote_path, destination, force, progress_cb=progress_handler.progress)
@@ -197,7 +196,7 @@ async def put(
197
196
 
198
197
  if remote_path.endswith("/"):
199
198
  remote_path = remote_path + os.path.basename(local_path)
200
- console = Console()
199
+ console = make_console()
201
200
  progress_handler = ProgressHandler(type="upload", console=console)
202
201
 
203
202
  if Path(local_path).is_dir():
@@ -245,7 +244,7 @@ async def rm(
245
244
  ):
246
245
  ensure_env(env)
247
246
  volume = _Volume.from_name(volume_name, environment_name=env)
248
- console = Console()
247
+ console = make_console()
249
248
  try:
250
249
  await volume.remove_file(remote_path, recursive=recursive)
251
250
  console.print(OutputManager.step_completed(f"{remote_path} was deleted successfully!"))
modal/client.pyi CHANGED
@@ -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.1.dev25",
36
+ version: str = "1.1.1.dev26",
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.1.dev25",
167
+ version: str = "1.1.1.dev26",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
@@ -144,9 +144,9 @@ class _ContainerProcess(Generic[T]):
144
144
  print("interactive exec is not currently supported on Windows.")
145
145
  return
146
146
 
147
- from rich.console import Console
147
+ from ._output import make_console
148
148
 
149
- console = Console()
149
+ console = make_console()
150
150
 
151
151
  connecting_status = console.status("Connecting...")
152
152
  connecting_status.start()
modal/token_flow.py CHANGED
@@ -6,11 +6,11 @@ from collections.abc import AsyncGenerator
6
6
  from typing import Optional
7
7
 
8
8
  import aiohttp.web
9
- from rich.console import Console
10
9
  from synchronicity.async_wrap import asynccontextmanager
11
10
 
12
11
  from modal_proto import api_pb2
13
12
 
13
+ from ._output import make_console
14
14
  from ._utils.async_utils import synchronize_api
15
15
  from ._utils.http_utils import run_temporary_http_server
16
16
  from .client import _Client
@@ -76,7 +76,7 @@ async def _new_token(
76
76
  ):
77
77
  server_url = config.get("server_url", profile=profile)
78
78
 
79
- console = Console()
79
+ console = make_console()
80
80
 
81
81
  result: Optional[api_pb2.TokenFlowWaitResponse] = None
82
82
  async with _Client.anonymous(server_url) as client:
@@ -133,7 +133,7 @@ async def _set_token(
133
133
  ):
134
134
  # TODO add server_url as a parameter for verification?
135
135
  server_url = config.get("server_url", profile=profile)
136
- console = Console()
136
+ console = make_console()
137
137
  if verify:
138
138
  console.print(f"Verifying token against [blue]{server_url}[/blue]")
139
139
  await _Client.verify(server_url, (token_id, token_secret))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.1.dev25
3
+ Version: 1.1.1.dev26
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -1,5 +1,5 @@
1
1
  modal/__init__.py,sha256=WMaRW-2IJRGA9ioNAaBhJYuyLvu-GS01L8wQD90fKBs,2682
2
- modal/__main__.py,sha256=sTJcc9EbDuCKSwg3tL6ZckFw9WWdlkXW8mId1IvJCNc,2846
2
+ modal/__main__.py,sha256=uBjSb_5cdlxmr9AwLkznYsW2tGEJRBjEcCGILvgR_1s,2844
3
3
  modal/_clustered_functions.py,sha256=zmrKbptRbqp4euS3LWncKaLXb8Kjj4YreusOzpEpRMk,2856
4
4
  modal/_clustered_functions.pyi,sha256=_wtFjWocGf1WgI-qYBpbJPArNkg2H9JV7BVaGgMesEQ,1103
5
5
  modal/_container_entrypoint.py,sha256=1qBMNY_E9ICC_sRCtillMxmKPsmxJl1J0_qOAG8rH-0,28288
@@ -7,7 +7,7 @@ modal/_functions.py,sha256=c1EeAcHcYP76wHbLomV0mFe73AoL-TUSjJNSDu6CELI,83065
7
7
  modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
8
8
  modal/_location.py,sha256=joiX-0ZeutEUDTrrqLF1GHXCdVLF-rHzstocbMcd_-k,366
9
9
  modal/_object.py,sha256=vzRWhAcFJDM8ZmiUSDgSj9gJhLZJA-wjLVvTl984N4A,11295
10
- modal/_output.py,sha256=LRM9KroHuR7t5pq8iLYjpFz1sQrHYan2kvRDjT6KAw4,26082
10
+ modal/_output.py,sha256=4LbNjPyd6spKiwJS-UTrZKnfpIWmdNy7rnDIVcNVwSE,26327
11
11
  modal/_partial_function.py,sha256=B1J4S9W-La0NHaVmY1aCuH0E3QxJHIX6ZWY5eNTQ7io,37142
12
12
  modal/_pty.py,sha256=JZfPDDpzqICZqtyPI_oMJf_9w-p_lLNuzHhwhodUXio,1329
13
13
  modal/_resolver.py,sha256=2RWvm34cNSnbv1v7izJMNZgfvpLDD6LzaBlr0lIrLnY,7364
@@ -22,13 +22,13 @@ modal/app.py,sha256=BBR2NmGzZbFGfhKAmtzllD0o4TbVDBbOEs0O2ysSdQo,48277
22
22
  modal/app.pyi,sha256=h6JtBA6a7wobdZAuS3QuXrWCUZqfyKPuGV3XdjCqT3k,43753
23
23
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
24
24
  modal/client.py,sha256=kyAIVB3Ay-XKJizQ_1ufUFB__EagV0MLmHJpyYyJ7J0,18636
25
- modal/client.pyi,sha256=tWdMGcsBmA0uLg0ep1y2pLB0vNLpaCpV5va7xMAd_WA,15831
25
+ modal/client.pyi,sha256=ft7F2zZkCFWeifBXbRdMfWpa1UGC4nfw6rEqThzh4xo,15831
26
26
  modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
27
27
  modal/cloud_bucket_mount.pyi,sha256=-qSfYAQvIoO_l2wsCCGTG5ZUwQieNKXdAO00yP1-LYU,7394
28
28
  modal/cls.py,sha256=7A0xGnugQzm8dOfnKMjLjtqekRlRtQ0jPFRYgq6xdUM,40018
29
29
  modal/cls.pyi,sha256=_tZ5qrlL-ZDEcD-mf9BZkkNH5XPr4SmGTEQ-RVmqF3I,27772
30
30
  modal/config.py,sha256=FqVewLPVVR4feq_46JBENiCzqTuXKpnvQZxaeWbS39g,12009
31
- modal/container_process.py,sha256=1m4NPg0lgZmlG9OTkhHbjafqlqoo4lLv-A-X5lV21yo,6852
31
+ modal/container_process.py,sha256=XkPwNIW-iD_GB9u9yqv9q8y-i5cQ8eBbLZZ_GvEw9t8,6858
32
32
  modal/container_process.pyi,sha256=9m-st3hCUlNN1GOTctfPPvIvoLtEl7FbuGWwif5-7YU,6037
33
33
  modal/dict.py,sha256=YVrIARVfaD2kmdnqbGtneeLciiLkzKxYego0jfkv3Sk,14400
34
34
  modal/dict.pyi,sha256=gs3J7X5yG3J1L6rW0s3_7yRn8qAfY0f4n5-sqaDZY2g,20853
@@ -76,7 +76,7 @@ modal/serving.pyi,sha256=YfixTaWikyYpwhnNxCHMZnDDQiPmV1xJ87QF91U_WGU,1924
76
76
  modal/snapshot.py,sha256=E3oxYQkYVRB_LeFBfmUV1Y6vHz8-azXJfC4x7A1QKnI,1455
77
77
  modal/snapshot.pyi,sha256=0q83hlmWxAhDu8xwZyL5VmYh0i8Tigf7S60or2k30L8,1682
78
78
  modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
79
- modal/token_flow.py,sha256=0_4KabXKsuE4OXTJ1OuLOtA-b1sesShztMZkkRFK7tA,7605
79
+ modal/token_flow.py,sha256=GWpar0gANs71vm9Bd_Cj87UG1K3ljTURbkEjG3JLsrY,7616
80
80
  modal/token_flow.pyi,sha256=eirYjyqbRiT3GCKMIPHJPpkvBTu8WxDKqSHehWaJI_4,2533
81
81
  modal/volume.py,sha256=aIGp_ZFD6UUqM2XnS19GBqWLc1_xOVBIx2JcFn30aYk,44475
82
82
  modal/volume.pyi,sha256=Qo5D0Bojcp8J4t4OoRArrBFaC1MSvFf9jQIL9U6Qz2Q,40779
@@ -126,24 +126,24 @@ modal/builder/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
126
126
  modal/builder/base-images.json,sha256=JYSDAgHTl-WrV_TZW5icY-IJEnbe2eQ4CZ_KN6EOZKU,1304
127
127
  modal/cli/__init__.py,sha256=6FRleWQxBDT19y7OayO4lBOzuL6Bs9r0rLINYYYbHwQ,769
128
128
  modal/cli/_download.py,sha256=tV8JFkncTtQKh85bSguQg6AW5aRRlynf-rvyN7ruigc,4337
129
- modal/cli/_traceback.py,sha256=4ywtmFcmPnY3tqb4-3fA061N2tRiM01xs8fSagtkwhE,7293
129
+ modal/cli/_traceback.py,sha256=IKj9xtc6LjAxyhGJWolNIXEX3MhAIulnRqywZNOFmkU,7324
130
130
  modal/cli/app.py,sha256=Q4yoPGuNqdWMwIIbjJQflp9RvmgNQQRWBNhCg_Cvi9g,7800
131
- modal/cli/cluster.py,sha256=nmG3flRs_1VKgJ1Q6nHnt_WpuWDWkGp2He8wA9HeGsQ,3141
132
- modal/cli/config.py,sha256=QvFsqO4eUOtI7d_pQAOAyfq_ZitjhPtav3C6GIDQcZM,1680
131
+ modal/cli/cluster.py,sha256=GZniNlzH1QMlHNpzGurfEdxNqwaH0BznMc4i-j7uhe4,3152
132
+ modal/cli/config.py,sha256=lhp2Pq4RbTDhaZJ-ZJvhrMqJj8c-WjuRX6gjE3TrvXc,1691
133
133
  modal/cli/container.py,sha256=mRYRCGsP6DiWzm3Az4W5Fcc5Tbl58zOIc62HDzS9TvQ,3703
134
- modal/cli/dict.py,sha256=012PvKz9YbooE122tWQTcsb9a4lpw5O38DoFNhykcPM,4628
135
- modal/cli/entry_point.py,sha256=Ytpsy0MTLQC1RSClI0wNhCbiy6ecPO8555PMmsrxoSc,4377
134
+ modal/cli/dict.py,sha256=_UiF8G2aRJwZDNSFYiHFt_Xy8K9Gtrx4qKzbRgHri5I,4639
135
+ modal/cli/entry_point.py,sha256=M9ZeIsYx7rxdc6XP2iOIptVzmpj39D3rU8nfW7Dc3CQ,4388
136
136
  modal/cli/environment.py,sha256=Ayddkiq9jdj3XYDJ8ZmUqFpPPH8xajYlbexRkzGtUcg,4334
137
- modal/cli/import_refs.py,sha256=pmzY0hpexx6DtvobNmCOvRqEdS9IriEP4BpMw1TIy2w,13911
137
+ modal/cli/import_refs.py,sha256=X59Z5JwgliRO6C-cIFto2Pr7o3SwlZMKQPKA0aI4ZK4,13927
138
138
  modal/cli/launch.py,sha256=0_sBu6bv2xJEPWi-rbGS6Ri9ggnkWQvrGlgpYSUBMyY,3097
139
- modal/cli/network_file_system.py,sha256=1_BF95WPLHh7x37lr0JBx5nS8NsKXCDZKt0L2F5fHgo,8104
140
- modal/cli/profile.py,sha256=0TYhgRSGUvQZ5LH9nkl6iZllEvAjDniES264dE57wOM,3201
141
- modal/cli/queues.py,sha256=1OzC9HdCkbNz6twF3US4FZmIhuVRQ01GOfBY42ux61A,4533
139
+ modal/cli/network_file_system.py,sha256=hj_Cfh-xjz9uWdrXrZxxPScepaZYZjJ7aHa5B93pBGM,8110
140
+ modal/cli/profile.py,sha256=r5hnA_GPe_2zwgv6n0Mi8XQXyejQgShb17yjD4dPXcw,3212
141
+ modal/cli/queues.py,sha256=As6WXkkqWbicu52uljqbmC86woejcpTdzSjU-hYpU24,4549
142
142
  modal/cli/run.py,sha256=96m6fpJKbjtva4xzJut0pxS36Z5WCMq0umpAry96im0,24946
143
- modal/cli/secret.py,sha256=2bngl3Gb6THXkQ2eWZIN9pOHeOFJqiSNo_waUCVYgns,6611
143
+ modal/cli/secret.py,sha256=bxp4qeooYUgKoSOgiBC86lw_5niZhw56tSzX7tuICGQ,6622
144
144
  modal/cli/token.py,sha256=NAmQzKBfEHkcldWKeFxAVIqQBoo1RTp7_A4yc7-8qM0,1911
145
- modal/cli/utils.py,sha256=p3ru9mlrvyCg6WWUcTWIJfZtYN3-MsXio_vy3dJ_8WU,3302
146
- modal/cli/volume.py,sha256=KJ4WKQYjRGsTERkwHE1HcRia9rWzLIDDnlc89QmTLvE,10960
145
+ modal/cli/utils.py,sha256=aUXDU9_VgcJrGaGRy4bGf4dqwKYXHCpoO27x4m_bpuo,3293
146
+ modal/cli/volume.py,sha256=Ju9Hy6UkSe4XGThuMOGSFq9Ba-t10rx8YqXM5Po7sP0,10961
147
147
  modal/cli/programs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
148
148
  modal/cli/programs/run_jupyter.py,sha256=44Lpvqk2l3hH-uOkmAOzw60NEsfB5uaRDWDKVshvQhs,2682
149
149
  modal/cli/programs/vscode.py,sha256=KbTAaIXyQBVCDXxXjmBHmKpgXkUw0q4R4KkJvUjCYgk,3380
@@ -151,7 +151,7 @@ modal/experimental/__init__.py,sha256=nuc7AL4r_Fs08DD5dciWFZhrV1nanwoClOfdTcudU0
151
151
  modal/experimental/flash.py,sha256=7-_RBNvm0tEpdxXWuPAj5HCxfN-hSHVBep8SEWgAhCQ,19721
152
152
  modal/experimental/flash.pyi,sha256=A8_qJGtGoXEzKDdHbvhmCw7oqfneFEvJQK3ZdTOvUdU,10830
153
153
  modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
154
- modal-1.1.1.dev25.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
154
+ modal-1.1.1.dev26.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
155
155
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
156
156
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
157
157
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -174,10 +174,10 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
174
174
  modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
175
175
  modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
176
176
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
177
- modal_version/__init__.py,sha256=qfw-QL5BqZsBRcAogvN_A_b-uzOO5BBjCDKfPGtR5OE,121
177
+ modal_version/__init__.py,sha256=nXGRSgHDLw-Aoa3Oy9TNto9xzwGo0zDk5GekIAscWs8,121
178
178
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
179
- modal-1.1.1.dev25.dist-info/METADATA,sha256=A0nGn3jeZ3POvI3sHzId3ia636raJ_EISb5d2f1QmGo,2460
180
- modal-1.1.1.dev25.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
181
- modal-1.1.1.dev25.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
182
- modal-1.1.1.dev25.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
183
- modal-1.1.1.dev25.dist-info/RECORD,,
179
+ modal-1.1.1.dev26.dist-info/METADATA,sha256=VcBI6MCCTq3s-owzZ580fF4dbDfBeNQNrezWiyZPLLU,2460
180
+ modal-1.1.1.dev26.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
181
+ modal-1.1.1.dev26.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
182
+ modal-1.1.1.dev26.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
183
+ modal-1.1.1.dev26.dist-info/RECORD,,
modal_version/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.1.1.dev25"
4
+ __version__ = "1.1.1.dev26"