modAL 1.2.5.dev6__py3-none-any.whl → 1.2.5.dev8__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.
@@ -64,12 +64,10 @@ def call_lifecycle_functions(
64
64
 
65
65
 
66
66
  @contextmanager
67
- def _run_service_lifecycle(
67
+ def lifecycle_asgi(
68
68
  event_loop: UserCodeEventLoop,
69
69
  container_io_manager: "modal._runtime.container_io_manager.ContainerIOManager",
70
- function_def: api_pb2.Function,
71
70
  finalized_functions: dict[str, FinalizedFunction],
72
- exit_callback: Optional[Callable[[], None]],
73
71
  ) -> Generator[None, None, None]:
74
72
  lifespan_background_tasks = []
75
73
  try:
@@ -82,38 +80,34 @@ def _run_service_lifecycle(
82
80
  event_loop.run(finalized_function.lifespan_manager.lifespan_startup())
83
81
  yield
84
82
  finally:
85
- # Run exit handlers. From this point onward, ignore all SIGINT signals that come from
86
- # graceful shutdowns originating on the worker, as well as stray SIGUSR1 signals that
87
- # may have been sent to cancel inputs.
88
- int_handler = signal.signal(signal.SIGINT, signal.SIG_IGN)
89
- usr1_handler = signal.signal(signal.SIGUSR1, signal.SIG_IGN)
90
83
  try:
91
- try:
92
- # run lifespan shutdown for asgi apps
93
- for finalized_function in finalized_functions.values():
94
- if finalized_function.lifespan_manager:
95
- with container_io_manager.handle_user_exception():
96
- event_loop.run(finalized_function.lifespan_manager.lifespan_shutdown())
97
- finally:
98
- # no need to keep the lifespan asgi call around - we send it no more messages
99
- for task in lifespan_background_tasks:
100
- task.cancel()
101
-
102
- # Identify "exit" methods and run them.
103
- # want to make sure this is called even if the lifespan manager fails
104
- if exit_callback:
105
- exit_callback()
106
-
107
- # Finally, commit on exit to catch uncommitted volume changes and surface background
108
- # commit errors.
109
- container_io_manager.volume_commit(
110
- [v.volume_id for v in function_def.volume_mounts if v.allow_background_commits]
111
- )
84
+ # run lifespan shutdown for asgi apps
85
+ for finalized_function in finalized_functions.values():
86
+ if finalized_function.lifespan_manager:
87
+ with container_io_manager.handle_user_exception():
88
+ event_loop.run(finalized_function.lifespan_manager.lifespan_shutdown())
112
89
  finally:
113
- # Restore the original signal handler, needed for container_test hygiene since the
114
- # test runs `main()` multiple times in the same process.
115
- signal.signal(signal.SIGINT, int_handler)
116
- signal.signal(signal.SIGUSR1, usr1_handler)
90
+ # no need to keep the lifespan asgi call around - we send it no more messages
91
+ for task in lifespan_background_tasks:
92
+ task.cancel()
93
+
94
+
95
+ def disable_signals():
96
+ int_handler = signal.signal(signal.SIGINT, signal.SIG_IGN)
97
+ usr1_handler = signal.signal(signal.SIGUSR1, signal.SIG_IGN)
98
+ return int_handler, usr1_handler
99
+
100
+
101
+ def try_enable_signals(int_handler, usr1_handler):
102
+ if int_handler is not None and usr1_handler is not None:
103
+ signal.signal(signal.SIGINT, int_handler)
104
+ signal.signal(signal.SIGUSR1, usr1_handler)
105
+
106
+
107
+ def volume_commit(
108
+ container_io_manager: "modal._runtime.container_io_manager.ContainerIOManager", function_def: api_pb2.Function
109
+ ):
110
+ container_io_manager.volume_commit([v.volume_id for v in function_def.volume_mounts if v.allow_background_commits])
117
111
 
118
112
 
119
113
  class Service(metaclass=ABCMeta):
@@ -127,14 +121,30 @@ class Service(metaclass=ABCMeta):
127
121
  user_cls_instance: Any
128
122
  app: "modal.app._App"
129
123
  service_deps: Optional[Sequence["modal._object._Object"]]
124
+ function_def: api_pb2.Function
130
125
 
131
126
  @abstractmethod
132
127
  def get_finalized_functions(
133
128
  self, fun_def: api_pb2.Function, container_io_manager: "modal._runtime.container_io_manager.ContainerIOManager"
134
129
  ) -> dict[str, "FinalizedFunction"]: ...
135
130
 
131
+ @abstractmethod
136
132
  @contextmanager
133
+ def lifecycle_presnapshot(
134
+ self,
135
+ event_loop: UserCodeEventLoop,
136
+ container_io_manager: "modal._runtime.container_io_manager.ContainerIOManager",
137
+ ) -> Generator[None, None, None]: ...
138
+
137
139
  @abstractmethod
140
+ @contextmanager
141
+ def lifecycle_postsnapshot(
142
+ self,
143
+ event_loop: UserCodeEventLoop,
144
+ container_io_manager: "modal._runtime.container_io_manager.ContainerIOManager",
145
+ ) -> Generator[None, None, None]: ...
146
+
147
+ @contextmanager
138
148
  def execution_context(
139
149
  self,
140
150
  event_loop: UserCodeEventLoop,
@@ -150,6 +160,34 @@ class Service(metaclass=ABCMeta):
150
160
  6. Yield finalized_functions for execution
151
161
  7. Handles cleanup (lifespan shutdown, 'exit' methods)
152
162
  """
163
+ int_handler, usr1_handler = None, None
164
+ try:
165
+ # 1. Pre-snapshot Enter
166
+ with self.lifecycle_presnapshot(event_loop, container_io_manager):
167
+ # 2. Snapshot -- If this container is being used to create a checkpoint, checkpoint the container after
168
+ # global imports and initialization. Checkpointed containers run from this point onwards.
169
+ maybe_snapshot(container_io_manager, self.function_def)
170
+ # 3. Breakpoint wrapper
171
+ create_breakpoint_wrapper(container_io_manager)
172
+ # 4. Post-snapshot Enter
173
+ with self.lifecycle_postsnapshot(event_loop, container_io_manager):
174
+ # Get Functions
175
+ with container_io_manager.handle_user_exception():
176
+ finalized_functions = self.get_finalized_functions(self.function_def, container_io_manager)
177
+ # 5. Start ASGI lifespan
178
+ with lifecycle_asgi(event_loop, container_io_manager, finalized_functions):
179
+ # 6. Yield Finalized Functions
180
+ try:
181
+ yield finalized_functions
182
+ finally:
183
+ int_handler, usr1_handler = disable_signals()
184
+ finally:
185
+ # 9. Volume commit - runs OUTSIDE all lifecycle managers so exit handlers
186
+ # have a chance to write to disk before we commit volumes
187
+ try:
188
+ volume_commit(container_io_manager, self.function_def)
189
+ finally:
190
+ try_enable_signals(int_handler, usr1_handler)
153
191
 
154
192
 
155
193
  def construct_webhook_callable(
@@ -265,27 +303,22 @@ class ImportedFunction(Service):
265
303
  }
266
304
 
267
305
  @contextmanager
268
- def execution_context(
306
+ def lifecycle_presnapshot(
269
307
  self,
270
308
  event_loop: UserCodeEventLoop,
271
309
  container_io_manager: "modal._runtime.container_io_manager.ContainerIOManager",
272
- ) -> Generator[dict[str, "FinalizedFunction"], None, None]:
273
- # If this container is being used to create a checkpoint, checkpoint the container after
274
- # global imports and initialization. Checkpointed containers run from this point onwards.
275
- maybe_snapshot(container_io_manager, self.function_def)
276
- create_breakpoint_wrapper(container_io_manager)
277
-
278
- with container_io_manager.handle_user_exception():
279
- finalized_functions = self.get_finalized_functions(self.function_def, container_io_manager)
310
+ ):
311
+ # This is a no-op for imported functions since @enter methods are not supported
312
+ yield
280
313
 
281
- with _run_service_lifecycle(
282
- event_loop,
283
- container_io_manager,
284
- self.function_def,
285
- finalized_functions,
286
- None,
287
- ):
288
- yield finalized_functions
314
+ @contextmanager
315
+ def lifecycle_postsnapshot(
316
+ self,
317
+ event_loop: UserCodeEventLoop,
318
+ container_io_manager: "modal._runtime.container_io_manager.ContainerIOManager",
319
+ ):
320
+ # This is a no-op for imported functions since @enter methods are not supported
321
+ yield
289
322
 
290
323
 
291
324
  @dataclass
@@ -340,53 +373,38 @@ class ImportedClass(Service):
340
373
  return finalized_functions
341
374
 
342
375
  @contextmanager
343
- def execution_context(
376
+ def lifecycle_presnapshot(
344
377
  self,
345
378
  event_loop: UserCodeEventLoop,
346
379
  container_io_manager: "modal._runtime.container_io_manager.ContainerIOManager",
347
- ) -> Generator[dict[str, "FinalizedFunction"], None, None]:
348
- # 1. Pre-snapshot Enter
380
+ ):
349
381
  # Identify all "enter" methods that need to run before we snapshot.
350
382
  if not self.function_def.is_auto_snapshot:
351
383
  pre_snapshot_methods = _find_callables_for_obj(
352
384
  self.user_cls_instance, _PartialFunctionFlags.ENTER_PRE_SNAPSHOT
353
385
  )
354
386
  call_lifecycle_functions(event_loop, container_io_manager, list(pre_snapshot_methods.values()))
387
+ yield
355
388
 
356
- # 2. Snapshot
357
- # If this container is being used to create a checkpoint, checkpoint the container after
358
- # global imports and initialization. Checkpointed containers run from this point onwards.
359
- maybe_snapshot(container_io_manager, self.function_def)
360
-
361
- # 3. Breakpoint wrapper
362
- create_breakpoint_wrapper(container_io_manager)
363
-
364
- # 4. Post-snapshot Enter
389
+ @contextmanager
390
+ def lifecycle_postsnapshot(
391
+ self,
392
+ event_loop: UserCodeEventLoop,
393
+ container_io_manager: "modal._runtime.container_io_manager.ContainerIOManager",
394
+ ):
365
395
  # Identify the "enter" methods to run after resuming from a snapshot.
366
396
  if not self.function_def.is_auto_snapshot:
367
397
  post_snapshot_methods = _find_callables_for_obj(
368
398
  self.user_cls_instance, _PartialFunctionFlags.ENTER_POST_SNAPSHOT
369
399
  )
370
400
  call_lifecycle_functions(event_loop, container_io_manager, list(post_snapshot_methods.values()))
371
-
372
- # 5. Get Functions & Start Lifespan
373
- with container_io_manager.handle_user_exception():
374
- finalized_functions = self.get_finalized_functions(self.function_def, container_io_manager)
375
-
376
- def exit_callback():
401
+ try:
402
+ yield
403
+ finally:
377
404
  if not self.function_def.is_auto_snapshot:
378
405
  exit_methods = _find_callables_for_obj(self.user_cls_instance, _PartialFunctionFlags.EXIT)
379
406
  call_lifecycle_functions(event_loop, container_io_manager, list(exit_methods.values()))
380
407
 
381
- with _run_service_lifecycle(
382
- event_loop,
383
- container_io_manager,
384
- self.function_def,
385
- finalized_functions,
386
- exit_callback,
387
- ):
388
- yield finalized_functions
389
-
390
408
 
391
409
  def get_user_class_instance(_cls: modal.cls._Cls, args: tuple[Any, ...], kwargs: dict[str, Any]) -> typing.Any:
392
410
  """Returns instance of the underlying class to be used as the `self`
modal/client.pyi CHANGED
@@ -32,7 +32,7 @@ class _Client:
32
32
  server_url: str,
33
33
  client_type: int,
34
34
  credentials: typing.Optional[tuple[str, str]],
35
- version: str = "1.2.5.dev6",
35
+ version: str = "1.2.5.dev8",
36
36
  ):
37
37
  """mdmd:hidden
38
38
  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.2.5.dev6",
166
+ version: str = "1.2.5.dev8",
167
167
  ):
168
168
  """mdmd:hidden
169
169
  The Modal client object is not intended to be instantiated directly by users.
modal/functions.pyi CHANGED
@@ -408,7 +408,7 @@ class Function(
408
408
 
409
409
  _call_generator: ___call_generator_spec[typing_extensions.Self]
410
410
 
411
- class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
411
+ class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
412
412
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
413
413
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
414
414
  ...
@@ -417,7 +417,7 @@ class Function(
417
417
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
418
418
  ...
419
419
 
420
- remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
420
+ remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
421
421
 
422
422
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
423
423
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -444,7 +444,7 @@ class Function(
444
444
  """
445
445
  ...
446
446
 
447
- class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
447
+ class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
448
448
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
449
449
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
450
450
 
@@ -468,7 +468,7 @@ class Function(
468
468
  ...
469
469
 
470
470
  _experimental_spawn: ___experimental_spawn_spec[
471
- modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
471
+ modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
472
472
  ]
473
473
 
474
474
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
@@ -477,7 +477,7 @@ class Function(
477
477
 
478
478
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
479
479
 
480
- class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
480
+ class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
481
481
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
482
482
  """Calls the function with the given arguments, without waiting for the results.
483
483
 
@@ -498,7 +498,7 @@ class Function(
498
498
  """
499
499
  ...
500
500
 
501
- spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
501
+ spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
502
502
 
503
503
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
504
504
  """Return the inner Python object wrapped by this Modal Function."""
modal/io_streams.py CHANGED
@@ -2,6 +2,7 @@
2
2
  import asyncio
3
3
  import codecs
4
4
  import contextlib
5
+ import io
5
6
  import sys
6
7
  import time
7
8
  from collections.abc import AsyncGenerator, AsyncIterator
@@ -403,10 +404,10 @@ class _BytesStreamReaderThroughCommandRouter:
403
404
  return self._params.file_descriptor
404
405
 
405
406
  async def read(self) -> bytes:
406
- data_bytes = b""
407
+ buffer = io.BytesIO()
407
408
  async for part in self:
408
- data_bytes += cast(bytes, part)
409
- return data_bytes
409
+ buffer.write(part)
410
+ return buffer.getvalue()
410
411
 
411
412
  def __aiter__(self) -> AsyncGenerator[bytes, None]:
412
413
  return _stdio_stream_from_command_router(self._params)
@@ -438,10 +439,10 @@ class _TextStreamReaderThroughCommandRouter:
438
439
  return self._params.file_descriptor
439
440
 
440
441
  async def read(self) -> str:
441
- data_str = ""
442
+ buffer = io.StringIO()
442
443
  async for part in self:
443
- data_str += cast(str, part)
444
- return data_str
444
+ buffer.write(part)
445
+ return buffer.getvalue()
445
446
 
446
447
  async def __aiter__(self) -> AsyncGenerator[str, None]:
447
448
  async with aclosing(_stdio_stream_from_command_router(self._params)) as bytes_stream:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.5.dev6
3
+ Version: 1.2.5.dev8
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -26,7 +26,7 @@ modal/app.pyi,sha256=nI_Tibj-rI5I7dJFJnczbHvcmVzCvvCih0tMzoQlr_Y,50835
26
26
  modal/billing.py,sha256=zmQ3bcCJlwa4KD1IA_QgdWpm1pn13c-7qfy79iEauYI,195
27
27
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
28
28
  modal/client.py,sha256=k1CqQ_0t4-vHylkqYZgYCnClg-FT0QrTPAKivL01A_k,14354
29
- modal/client.pyi,sha256=hxgl_Vj_srejMwOoOtIkABjhoJoww8g7WsZWxLOgmpM,13146
29
+ modal/client.pyi,sha256=nDlaa0L7VxdKpOSvzarXIbBFwZe1hQr4ecMku6v1XxQ,13146
30
30
  modal/cloud_bucket_mount.py,sha256=cvVj5Rt4nDHoQbTneoJPTaAcnl_Ab_mrsjnnzd0v9OI,6013
31
31
  modal/cloud_bucket_mount.pyi,sha256=vXusGMOUk9HjCs4lhxteuCK4xLQclPfugGWKo7LECEA,7539
32
32
  modal/cls.py,sha256=4T__mtYlQUnkatif1Wnr8Ld9DN_ySydHj2UwhRg89ok,41984
@@ -43,11 +43,11 @@ modal/file_io.py,sha256=Whs3QSl3pQbSoLzSRIIWfK4XyP-kwgyZmWgx3bhJ9u0,20933
43
43
  modal/file_io.pyi,sha256=xtO6Glf_BFwDE7QiQQo24QqcMf_Vv-iz7WojcGVlLBU,15932
44
44
  modal/file_pattern_matcher.py,sha256=A_Kdkej6q7YQyhM_2-BvpFmPqJ0oHb54B6yf9VqvPVE,8116
45
45
  modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
46
- modal/functions.pyi,sha256=FzDOtv5YX3NbqQ3s2BIizDWmSlzdZiWtN9qsUNQCxiY,38034
46
+ modal/functions.pyi,sha256=ZrK759InbJvVMlczRpU4iOczGvf43Nkn_L0VsWR6Hxo,38034
47
47
  modal/gpu.py,sha256=Fe5ORvVPDIstSq1xjmM6OoNgLYFWvogP9r5BgmD3hYg,6769
48
48
  modal/image.py,sha256=Pi1tpi41rklU-7PvXyJxPBYKdG3FcW-H_2pWjjeLYzs,108165
49
49
  modal/image.pyi,sha256=grkqK9BfyKDXmJYNme-lGa0O3u7pOU5GifyLOAhG3sc,78202
50
- modal/io_streams.py,sha256=pqXjSrSAYf2Wu9WCCchFwr3FpsiAU8ABJVDlDj-3ue0,30677
50
+ modal/io_streams.py,sha256=BTPM352My4vIJS_3rzQuda5P0tCfX5tM89OFhIRtIPY,30695
51
51
  modal/io_streams.pyi,sha256=GGRPHumOaTwr11GzmZPf4_aSXGGKsMvB6NoSGHp_F7Q,18633
52
52
  modal/mount.py,sha256=GNdUfj7tWZy3-LaxVX-fvk70BqC51P1s2ktrMOMJGWU,33297
53
53
  modal/mount.pyi,sha256=3_Xftyk2lEMQbt8UzmUW5N77eb7t9EdbczPwj9wue9o,15828
@@ -93,7 +93,7 @@ modal/_runtime/execution_context.pyi,sha256=FVzakehz72ndL-ufe8-EC7TM4IHO_MEBcAdg
93
93
  modal/_runtime/gpu_memory_snapshot.py,sha256=8T85kyfGJ11AnhFRCZTeWj9zin9e9f5XbrRqU8_WjAk,11955
94
94
  modal/_runtime/telemetry.py,sha256=T1RoAGyjBDr1swiM6pPsGRSITm7LI5FDK18oNXxY08U,5163
95
95
  modal/_runtime/user_code_event_loop.py,sha256=HwOuDyCZLOakr_DG7p2MrcscjSQNheIhBBuLgB5I3Cc,3014
96
- modal/_runtime/user_code_imports.py,sha256=9mxg2FMZGR2UQfLcxEPNIiH51SBJTl_1JCCRrGMM0rI,25086
96
+ modal/_runtime/user_code_imports.py,sha256=fUR8TXvEsUz3nU80jru9tlUHXN89P2ZcLdoFepIGZPE,25571
97
97
  modal/_utils/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
98
98
  modal/_utils/app_utils.py,sha256=88BT4TPLWfYAQwKTHcyzNQRHg8n9B-QE2UyJs96iV-0,108
99
99
  modal/_utils/async_utils.py,sha256=PnwHfaHcqjLwMnlGC2kn8nqubxpXcSKcy4jHx6477dg,30625
@@ -160,7 +160,7 @@ modal/experimental/__init__.py,sha256=WlBNjzahOTuhWdfHt0OIArU3pdrErsFrprVhZ7UqU0
160
160
  modal/experimental/flash.py,sha256=0afbNEg8SLBdUbvFpT3R9FE1mfHAV_Iual8x2hqfPMY,26785
161
161
  modal/experimental/flash.pyi,sha256=BU7v9gFLWX1OanZ3HpRoVGp4qFfHo93lM9UkzcNFZUY,14832
162
162
  modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
163
- modal-1.2.5.dev6.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
163
+ modal-1.2.5.dev8.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
164
164
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
165
165
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
166
166
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -188,10 +188,10 @@ modal_proto/task_command_router_pb2.py,sha256=_pD2ZpU0bNzhwBdzmLoLyLtAtftI_Agxwn
188
188
  modal_proto/task_command_router_pb2.pyi,sha256=EyDgXPLr7alqjXYERV8w_MPuO404x0uCppmSkrfE9IE,14589
189
189
  modal_proto/task_command_router_pb2_grpc.py,sha256=uEQ0HdrCp8v-9bB5yIic9muA8spCShLHY6Bz9cCgOUE,10114
190
190
  modal_proto/task_command_router_pb2_grpc.pyi,sha256=s3Yxsrawdj4nr8vqQqsAxyX6ilWaGbdECy425KKbLIA,3301
191
- modal_version/__init__.py,sha256=QAtFwAyWYAhe6GbupupekN2VFNAPFl79udI4XbywCr8,120
191
+ modal_version/__init__.py,sha256=6_5XtQXO9IOyKoEK_raxE56EIM8hZ9iXdfOjSmJH4PY,120
192
192
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
193
- modal-1.2.5.dev6.dist-info/METADATA,sha256=k1iuKO5mjjdYs-lfO9UfY0q44OOXtCmXII0dAA0CM-w,2489
194
- modal-1.2.5.dev6.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
195
- modal-1.2.5.dev6.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
196
- modal-1.2.5.dev6.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
197
- modal-1.2.5.dev6.dist-info/RECORD,,
193
+ modal-1.2.5.dev8.dist-info/METADATA,sha256=haf-yAQdjVPajIX-fj11NBK4G5oAdz66qltpG_w6OmM,2489
194
+ modal-1.2.5.dev8.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
195
+ modal-1.2.5.dev8.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
196
+ modal-1.2.5.dev8.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
197
+ modal-1.2.5.dev8.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.2.5.dev6"
4
+ __version__ = "1.2.5.dev8"