modal 0.76.5.dev0__py3-none-any.whl → 0.76.5.dev2__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/client.pyi +2 -2
- modal/functions.pyi +7 -7
- modal/parallel_map.py +98 -88
- modal/parallel_map.pyi +14 -7
- {modal-0.76.5.dev0.dist-info → modal-0.76.5.dev2.dist-info}/METADATA +1 -1
- {modal-0.76.5.dev0.dist-info → modal-0.76.5.dev2.dist-info}/RECORD +11 -11
- modal_version/__init__.py +1 -1
- {modal-0.76.5.dev0.dist-info → modal-0.76.5.dev2.dist-info}/WHEEL +0 -0
- {modal-0.76.5.dev0.dist-info → modal-0.76.5.dev2.dist-info}/entry_points.txt +0 -0
- {modal-0.76.5.dev0.dist-info → modal-0.76.5.dev2.dist-info}/licenses/LICENSE +0 -0
- {modal-0.76.5.dev0.dist-info → modal-0.76.5.dev2.dist-info}/top_level.txt +0 -0
modal/client.pyi
CHANGED
@@ -31,7 +31,7 @@ class _Client:
|
|
31
31
|
server_url: str,
|
32
32
|
client_type: int,
|
33
33
|
credentials: typing.Optional[tuple[str, str]],
|
34
|
-
version: str = "0.76.5.
|
34
|
+
version: str = "0.76.5.dev2",
|
35
35
|
): ...
|
36
36
|
def is_closed(self) -> bool: ...
|
37
37
|
@property
|
@@ -94,7 +94,7 @@ class Client:
|
|
94
94
|
server_url: str,
|
95
95
|
client_type: int,
|
96
96
|
credentials: typing.Optional[tuple[str, str]],
|
97
|
-
version: str = "0.76.5.
|
97
|
+
version: str = "0.76.5.dev2",
|
98
98
|
): ...
|
99
99
|
def is_closed(self) -> bool: ...
|
100
100
|
@property
|
modal/functions.pyi
CHANGED
@@ -234,11 +234,11 @@ class Function(
|
|
234
234
|
|
235
235
|
_call_generator_nowait: ___call_generator_nowait_spec[typing_extensions.Self]
|
236
236
|
|
237
|
-
class __remote_spec(typing_extensions.Protocol[
|
237
|
+
class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
|
238
238
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
|
239
239
|
async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
|
240
240
|
|
241
|
-
remote: __remote_spec[modal._functions.
|
241
|
+
remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
|
242
242
|
|
243
243
|
class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
|
244
244
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
|
@@ -253,12 +253,12 @@ class Function(
|
|
253
253
|
self, *args: modal._functions.P.args, **kwargs: modal._functions.P.kwargs
|
254
254
|
) -> modal._functions.OriginalReturnType: ...
|
255
255
|
|
256
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
256
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
|
257
257
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
258
258
|
async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
259
259
|
|
260
260
|
_experimental_spawn: ___experimental_spawn_spec[
|
261
|
-
modal._functions.
|
261
|
+
modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
|
262
262
|
]
|
263
263
|
|
264
264
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
|
@@ -267,11 +267,11 @@ class Function(
|
|
267
267
|
|
268
268
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
|
269
269
|
|
270
|
-
class __spawn_spec(typing_extensions.Protocol[
|
270
|
+
class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
|
271
271
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
272
272
|
async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
|
273
273
|
|
274
|
-
spawn: __spawn_spec[modal._functions.
|
274
|
+
spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
|
275
275
|
|
276
276
|
def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]: ...
|
277
277
|
|
@@ -328,7 +328,7 @@ class Function(
|
|
328
328
|
|
329
329
|
class __for_each_spec(typing_extensions.Protocol[SUPERSELF]):
|
330
330
|
def __call__(self, /, *input_iterators, kwargs={}, ignore_exceptions: bool = False): ...
|
331
|
-
async def aio(self, /, *input_iterators, kwargs={}, ignore_exceptions: bool = False): ...
|
331
|
+
async def aio(self, /, *input_iterators, kwargs={}, ignore_exceptions: bool = False) -> None: ...
|
332
332
|
|
333
333
|
for_each: __for_each_spec[typing_extensions.Self]
|
334
334
|
|
modal/parallel_map.py
CHANGED
@@ -381,6 +381,94 @@ async def _map_invocation(
|
|
381
381
|
await log_debug_stats_task
|
382
382
|
|
383
383
|
|
384
|
+
async def _map_helper(
|
385
|
+
self: "modal.functions.Function",
|
386
|
+
async_input_gen: typing.AsyncGenerator[Any, None],
|
387
|
+
kwargs={}, # any extra keyword arguments for the function
|
388
|
+
order_outputs: bool = True, # return outputs in order
|
389
|
+
return_exceptions: bool = False, # propagate exceptions (False) or aggregate them in the results list (True)
|
390
|
+
) -> typing.AsyncGenerator[Any, None]:
|
391
|
+
"""Core implementation that supports `_map_async()`, `_starmap_async()` and `_for_each_async()`.
|
392
|
+
|
393
|
+
Runs in an event loop on the main thread. Concurrently feeds new input to the input queue and yields available
|
394
|
+
outputs to the caller.
|
395
|
+
|
396
|
+
Note that since the iterator(s) can block, it's a bit opaque how often the event
|
397
|
+
loop decides to get a new input vs how often it will emit a new output.
|
398
|
+
|
399
|
+
We could make this explicit as an improvement or even let users decide what they
|
400
|
+
prefer: throughput (prioritize queueing inputs) or latency (prioritize yielding results)
|
401
|
+
"""
|
402
|
+
|
403
|
+
raw_input_queue: Any = SynchronizedQueue() # type: ignore
|
404
|
+
raw_input_queue.init()
|
405
|
+
|
406
|
+
async def feed_queue():
|
407
|
+
async with aclosing(async_input_gen) as streamer:
|
408
|
+
async for args in streamer:
|
409
|
+
await raw_input_queue.put.aio((args, kwargs))
|
410
|
+
await raw_input_queue.put.aio(None) # end-of-input sentinel
|
411
|
+
if False:
|
412
|
+
# make this a never yielding generator so we can async_merge it below
|
413
|
+
# this is important so any exception raised in feed_queue will be propagated
|
414
|
+
yield
|
415
|
+
|
416
|
+
# note that `map()`, `map.aio()`, `starmap()`, `starmap.aio()`, `for_each()`, `for_each.aio()` are not
|
417
|
+
# synchronicity-wrapped, since they accept executable code in the form of iterators that we don't want to run inside
|
418
|
+
# the synchronicity thread. Instead, we delegate to `._map()` with a safer Queue as input.
|
419
|
+
async with aclosing(
|
420
|
+
async_merge(self._map.aio(raw_input_queue, order_outputs, return_exceptions), feed_queue())
|
421
|
+
) as map_output_stream:
|
422
|
+
async for output in map_output_stream:
|
423
|
+
yield output
|
424
|
+
|
425
|
+
|
426
|
+
@warn_if_generator_is_not_consumed(function_name="Function.map.aio")
|
427
|
+
async def _map_async(
|
428
|
+
self: "modal.functions.Function",
|
429
|
+
*input_iterators: typing.Union[
|
430
|
+
typing.Iterable[Any], typing.AsyncIterable[Any]
|
431
|
+
], # one input iterator per argument in the mapped-over function/generator
|
432
|
+
kwargs={}, # any extra keyword arguments for the function
|
433
|
+
order_outputs: bool = True, # return outputs in order
|
434
|
+
return_exceptions: bool = False, # propagate exceptions (False) or aggregate them in the results list (True)
|
435
|
+
) -> typing.AsyncGenerator[Any, None]:
|
436
|
+
async_input_gen = async_zip(*[sync_or_async_iter(it) for it in input_iterators])
|
437
|
+
async for output in _map_helper(
|
438
|
+
self, async_input_gen, kwargs=kwargs, order_outputs=order_outputs, return_exceptions=return_exceptions
|
439
|
+
):
|
440
|
+
yield output
|
441
|
+
|
442
|
+
|
443
|
+
@warn_if_generator_is_not_consumed(function_name="Function.starmap.aio")
|
444
|
+
async def _starmap_async(
|
445
|
+
self,
|
446
|
+
input_iterator: typing.Union[typing.Iterable[typing.Sequence[Any]], typing.AsyncIterable[typing.Sequence[Any]]],
|
447
|
+
*,
|
448
|
+
kwargs={},
|
449
|
+
order_outputs: bool = True,
|
450
|
+
return_exceptions: bool = False,
|
451
|
+
) -> typing.AsyncIterable[Any]:
|
452
|
+
async for output in _map_helper(
|
453
|
+
self,
|
454
|
+
sync_or_async_iter(input_iterator),
|
455
|
+
kwargs=kwargs,
|
456
|
+
order_outputs=order_outputs,
|
457
|
+
return_exceptions=return_exceptions,
|
458
|
+
):
|
459
|
+
yield output
|
460
|
+
|
461
|
+
|
462
|
+
async def _for_each_async(self, *input_iterators, kwargs={}, ignore_exceptions: bool = False) -> None:
|
463
|
+
# TODO(erikbern): it would be better if this is more like a map_spawn that immediately exits
|
464
|
+
# rather than iterating over the result
|
465
|
+
async_input_gen = async_zip(*[sync_or_async_iter(it) for it in input_iterators])
|
466
|
+
async for _ in _map_helper(
|
467
|
+
self, async_input_gen, kwargs=kwargs, order_outputs=False, return_exceptions=ignore_exceptions
|
468
|
+
):
|
469
|
+
pass
|
470
|
+
|
471
|
+
|
384
472
|
@warn_if_generator_is_not_consumed(function_name="Function.map")
|
385
473
|
def _map_sync(
|
386
474
|
self,
|
@@ -431,60 +519,13 @@ def _map_sync(
|
|
431
519
|
self, *input_iterators, kwargs=kwargs, order_outputs=order_outputs, return_exceptions=return_exceptions
|
432
520
|
),
|
433
521
|
nested_async_message=(
|
434
|
-
"You can't iter(Function.map())
|
435
|
-
"Use async for ... Function.map.aio() or Function.for_each.aio() instead."
|
522
|
+
"You can't iter(Function.map()) from an async function. Use async for ... in Function.map.aio() instead."
|
436
523
|
),
|
437
524
|
)
|
438
525
|
|
439
526
|
|
440
|
-
@warn_if_generator_is_not_consumed(function_name="Function.map.aio")
|
441
|
-
async def _map_async(
|
442
|
-
self: "modal.functions.Function",
|
443
|
-
*input_iterators: typing.Union[
|
444
|
-
typing.Iterable[Any], typing.AsyncIterable[Any]
|
445
|
-
], # one input iterator per argument in the mapped-over function/generator
|
446
|
-
kwargs={}, # any extra keyword arguments for the function
|
447
|
-
order_outputs: bool = True, # return outputs in order
|
448
|
-
return_exceptions: bool = False, # propagate exceptions (False) or aggregate them in the results list (True)
|
449
|
-
) -> typing.AsyncGenerator[Any, None]:
|
450
|
-
"""mdmd:hidden
|
451
|
-
This runs in an event loop on the main thread
|
452
|
-
|
453
|
-
It concurrently feeds new input to the input queue and yields available outputs
|
454
|
-
to the caller.
|
455
|
-
Note that since the iterator(s) can block, it's a bit opaque how often the event
|
456
|
-
loop decides to get a new input vs how often it will emit a new output.
|
457
|
-
We could make this explicit as an improvement or even let users decide what they
|
458
|
-
prefer: throughput (prioritize queueing inputs) or latency (prioritize yielding results)
|
459
|
-
"""
|
460
|
-
raw_input_queue: Any = SynchronizedQueue() # type: ignore
|
461
|
-
raw_input_queue.init()
|
462
|
-
|
463
|
-
async def feed_queue():
|
464
|
-
# This runs in a main thread event loop, so it doesn't block the synchronizer loop
|
465
|
-
async with aclosing(async_zip(*[sync_or_async_iter(it) for it in input_iterators])) as streamer:
|
466
|
-
async for args in streamer:
|
467
|
-
await raw_input_queue.put.aio((args, kwargs))
|
468
|
-
await raw_input_queue.put.aio(None) # end-of-input sentinel
|
469
|
-
if False:
|
470
|
-
# make this a never yielding generator so we can async_merge it below
|
471
|
-
# this is important so any exception raised in feed_queue will be propagated
|
472
|
-
yield
|
473
|
-
|
474
|
-
# note that `map()` and `map.aio()` are not synchronicity-wrapped, since
|
475
|
-
# they accept executable code in the form of
|
476
|
-
# iterators that we don't want to run inside the synchronicity thread.
|
477
|
-
# Instead, we delegate to `._map()` with a safer Queue as input
|
478
|
-
async with aclosing(
|
479
|
-
async_merge(self._map.aio(raw_input_queue, order_outputs, return_exceptions), feed_queue())
|
480
|
-
) as map_output_stream:
|
481
|
-
async for output in map_output_stream:
|
482
|
-
yield output
|
483
|
-
|
484
|
-
|
485
527
|
async def _spawn_map_async(self, *input_iterators, kwargs={}) -> None:
|
486
|
-
"""
|
487
|
-
This runs in an event loop on the main thread. It consumes inputs from the input iterators and creates async
|
528
|
+
"""This runs in an event loop on the main thread. It consumes inputs from the input iterators and creates async
|
488
529
|
function calls for each.
|
489
530
|
"""
|
490
531
|
|
@@ -538,47 +579,16 @@ def _for_each_sync(self, *input_iterators, kwargs={}, ignore_exceptions: bool =
|
|
538
579
|
Convenient alias for `.map()` in cases where the function just needs to be called.
|
539
580
|
as the caller doesn't have to consume the generator to process the inputs.
|
540
581
|
"""
|
541
|
-
# TODO(erikbern): it would be better if this is more like a map_spawn that immediately exits
|
542
|
-
# rather than iterating over the result
|
543
|
-
for _ in self.map(*input_iterators, kwargs=kwargs, order_outputs=False, return_exceptions=ignore_exceptions):
|
544
|
-
pass
|
545
|
-
|
546
582
|
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
583
|
+
return run_coroutine_in_temporary_event_loop(
|
584
|
+
_for_each_async(self, *input_iterators, kwargs=kwargs, ignore_exceptions=ignore_exceptions),
|
585
|
+
nested_async_message=(
|
586
|
+
"You can't run `Function.for_each()` from an async function. Use `await Function.for_each.aio()` instead."
|
587
|
+
),
|
588
|
+
)
|
552
589
|
|
553
590
|
|
554
591
|
@warn_if_generator_is_not_consumed(function_name="Function.starmap")
|
555
|
-
async def _starmap_async(
|
556
|
-
self,
|
557
|
-
input_iterator: typing.Union[typing.Iterable[typing.Sequence[Any]], typing.AsyncIterable[typing.Sequence[Any]]],
|
558
|
-
*,
|
559
|
-
kwargs={},
|
560
|
-
order_outputs: bool = True,
|
561
|
-
return_exceptions: bool = False,
|
562
|
-
) -> typing.AsyncIterable[Any]:
|
563
|
-
raw_input_queue: Any = SynchronizedQueue() # type: ignore
|
564
|
-
raw_input_queue.init()
|
565
|
-
|
566
|
-
async def feed_queue():
|
567
|
-
# This runs in a main thread event loop, so it doesn't block the synchronizer loop
|
568
|
-
async with aclosing(sync_or_async_iter(input_iterator)) as streamer:
|
569
|
-
async for args in streamer:
|
570
|
-
await raw_input_queue.put.aio((args, kwargs))
|
571
|
-
await raw_input_queue.put.aio(None) # end-of-input sentinel
|
572
|
-
|
573
|
-
feed_input_task = asyncio.create_task(feed_queue())
|
574
|
-
try:
|
575
|
-
async for output in self._map.aio(raw_input_queue, order_outputs, return_exceptions): # type: ignore[reportFunctionMemberAccess]
|
576
|
-
yield output
|
577
|
-
finally:
|
578
|
-
feed_input_task.cancel() # should only be needed in case of exceptions
|
579
|
-
|
580
|
-
|
581
|
-
@warn_if_generator_is_not_consumed(function_name="Function.starmap.aio")
|
582
592
|
def _starmap_sync(
|
583
593
|
self,
|
584
594
|
input_iterator: typing.Iterable[typing.Sequence[Any]],
|
@@ -608,8 +618,8 @@ def _starmap_sync(
|
|
608
618
|
self, input_iterator, kwargs=kwargs, order_outputs=order_outputs, return_exceptions=return_exceptions
|
609
619
|
),
|
610
620
|
nested_async_message=(
|
611
|
-
"You can't
|
612
|
-
"Use Function.
|
621
|
+
"You can't `iter(Function.starmap())` from an async function. "
|
622
|
+
"Use `async for ... in Function.starmap.aio()` instead."
|
613
623
|
),
|
614
624
|
)
|
615
625
|
|
modal/parallel_map.pyi
CHANGED
@@ -55,9 +55,13 @@ def _map_invocation(
|
|
55
55
|
count_update_callback: typing.Optional[collections.abc.Callable[[int, int], None]],
|
56
56
|
function_call_invocation_type: int,
|
57
57
|
): ...
|
58
|
-
def
|
59
|
-
self
|
60
|
-
|
58
|
+
def _map_helper(
|
59
|
+
self: modal.functions.Function,
|
60
|
+
async_input_gen: typing.AsyncGenerator[typing.Any, None],
|
61
|
+
kwargs={},
|
62
|
+
order_outputs: bool = True,
|
63
|
+
return_exceptions: bool = False,
|
64
|
+
) -> typing.AsyncGenerator[typing.Any, None]: ...
|
61
65
|
def _map_async(
|
62
66
|
self: modal.functions.Function,
|
63
67
|
*input_iterators: typing.Union[typing.Iterable[typing.Any], typing.AsyncIterable[typing.Any]],
|
@@ -65,10 +69,6 @@ def _map_async(
|
|
65
69
|
order_outputs: bool = True,
|
66
70
|
return_exceptions: bool = False,
|
67
71
|
) -> typing.AsyncGenerator[typing.Any, None]: ...
|
68
|
-
async def _spawn_map_async(self, *input_iterators, kwargs={}) -> None: ...
|
69
|
-
def _spawn_map_sync(self, *input_iterators, kwargs={}) -> None: ...
|
70
|
-
def _for_each_sync(self, *input_iterators, kwargs={}, ignore_exceptions: bool = False): ...
|
71
|
-
async def _for_each_async(self, *input_iterators, kwargs={}, ignore_exceptions: bool = False): ...
|
72
72
|
def _starmap_async(
|
73
73
|
self,
|
74
74
|
input_iterator: typing.Union[
|
@@ -79,6 +79,13 @@ def _starmap_async(
|
|
79
79
|
order_outputs: bool = True,
|
80
80
|
return_exceptions: bool = False,
|
81
81
|
) -> typing.AsyncIterable[typing.Any]: ...
|
82
|
+
async def _for_each_async(self, *input_iterators, kwargs={}, ignore_exceptions: bool = False) -> None: ...
|
83
|
+
def _map_sync(
|
84
|
+
self, *input_iterators, kwargs={}, order_outputs: bool = True, return_exceptions: bool = False
|
85
|
+
) -> modal._utils.async_utils.AsyncOrSyncIterable: ...
|
86
|
+
async def _spawn_map_async(self, *input_iterators, kwargs={}) -> None: ...
|
87
|
+
def _spawn_map_sync(self, *input_iterators, kwargs={}) -> None: ...
|
88
|
+
def _for_each_sync(self, *input_iterators, kwargs={}, ignore_exceptions: bool = False): ...
|
82
89
|
def _starmap_sync(
|
83
90
|
self,
|
84
91
|
input_iterator: typing.Iterable[typing.Sequence[typing.Any]],
|
@@ -22,7 +22,7 @@ modal/app.py,sha256=xojuGZv4LaQwZU5ntj7WbmMjeNuB9Gll8Mzqe2LyiEs,51323
|
|
22
22
|
modal/app.pyi,sha256=zNwR1_2LpmQc9AhemuAeVdk90XNYDw9keOkXAwAATeA,28732
|
23
23
|
modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
|
24
24
|
modal/client.py,sha256=o-aQThHpvDHUzg_kUafyhWzACViUBhY2WLZ2EitnSHA,16787
|
25
|
-
modal/client.pyi,sha256=
|
25
|
+
modal/client.pyi,sha256=D97tNxHcJxjkNMnvLaU5ACI1KmZrSmU3FEGvBsISZUo,8459
|
26
26
|
modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
|
27
27
|
modal/cloud_bucket_mount.pyi,sha256=30T3K1a89l6wzmEJ_J9iWv9SknoGqaZDx59Xs-ZQcmk,1607
|
28
28
|
modal/cls.py,sha256=LZMQdFZ06LpbLDbsCJknniU-393Jb44E1lqveLVM8F8,38365
|
@@ -39,7 +39,7 @@ modal/file_io.py,sha256=lcMs_E9Xfm0YX1t9U2wNIBPnqHRxmImqjLW1GHqVmyg,20945
|
|
39
39
|
modal/file_io.pyi,sha256=oB7x-rKq7bmm8cA7Z7W9C9yeko7KK9m9i5GidFnkGK4,9569
|
40
40
|
modal/file_pattern_matcher.py,sha256=wov-otB5M1oTdrYDtR2_VgacYin2srdtAP4McA1Cqzw,6516
|
41
41
|
modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
|
42
|
-
modal/functions.pyi,sha256=
|
42
|
+
modal/functions.pyi,sha256=0RGY6ZEkaHZcxhKrY_DnwYew9vDIK7hW8BY0LFjm2GM,17001
|
43
43
|
modal/gpu.py,sha256=Kbhs_u49FaC2Zi0TjCdrpstpRtT5eZgecynmQi5IZVE,6752
|
44
44
|
modal/image.py,sha256=lg3XxIWNYV8je88oEPbihzSEq_9gumc0NLbzZLAhm74,92807
|
45
45
|
modal/image.pyi,sha256=MDq7tNJevElK78VxFYrZRe_00kz9gPdg98MN5c6fFoE,25644
|
@@ -52,8 +52,8 @@ modal/network_file_system.pyi,sha256=58DiUqHGlARmI3cz-Yo7IFObKKFIiGh5UIU5JxGNFfc
|
|
52
52
|
modal/object.py,sha256=bTeskuY8JFrESjU4_UL_nTwYlBQdOLmVaOX3X6EMxsg,164
|
53
53
|
modal/object.pyi,sha256=Nc6fCW8ViC8YQPbtJav9KNDCW296-VimRUh-v3AaaYY,5674
|
54
54
|
modal/output.py,sha256=q4T9uHduunj4NwY-YSwkHGgjZlCXMuJbfQ5UFaAGRAc,1968
|
55
|
-
modal/parallel_map.py,sha256=
|
56
|
-
modal/parallel_map.pyi,sha256=
|
55
|
+
modal/parallel_map.py,sha256=zU2zL8_9PmmNC9Ny2GB7K2_HbAdPU7RiVLN0GtzaDls,35923
|
56
|
+
modal/parallel_map.pyi,sha256=mhYGQmufQEJbjNrX7vNhBS2gUdfBrpmuWNUHth_Dz6U,6140
|
57
57
|
modal/partial_function.py,sha256=SwuAAj2wj4SO6F6nkSnwNZrczEmm9w9YdlQTHh6hr04,1195
|
58
58
|
modal/partial_function.pyi,sha256=NFWz1aCAs2B3-GnPf1cTatWRZOLnYpFKCnjP_X9iNRs,6411
|
59
59
|
modal/proxy.py,sha256=XEjIHzZvbD3UW4YWyDzbDuNFq6hDUxyPPxupl2qwULY,1429
|
@@ -146,7 +146,7 @@ modal/requirements/2024.10.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddR
|
|
146
146
|
modal/requirements/PREVIEW.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddRo,296
|
147
147
|
modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
|
148
148
|
modal/requirements/base-images.json,sha256=57vMSqzMbLBxw5tFWSaMiIkkVEps4JfX5PAtXGnkS4U,740
|
149
|
-
modal-0.76.5.
|
149
|
+
modal-0.76.5.dev2.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
150
150
|
modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
|
151
151
|
modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
|
152
152
|
modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
|
@@ -169,10 +169,10 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
|
|
169
169
|
modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
170
170
|
modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
|
171
171
|
modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
172
|
-
modal_version/__init__.py,sha256=
|
172
|
+
modal_version/__init__.py,sha256=VIAUg5xEzI23zthNgRPMiBYG22LeScIAt531W0EPpVY,121
|
173
173
|
modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
|
174
|
-
modal-0.76.5.
|
175
|
-
modal-0.76.5.
|
176
|
-
modal-0.76.5.
|
177
|
-
modal-0.76.5.
|
178
|
-
modal-0.76.5.
|
174
|
+
modal-0.76.5.dev2.dist-info/METADATA,sha256=d9GxdUEVEv74eA-10fLKmVKR_i7ihpQynkywXJim8oA,2455
|
175
|
+
modal-0.76.5.dev2.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
|
176
|
+
modal-0.76.5.dev2.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
177
|
+
modal-0.76.5.dev2.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
|
178
|
+
modal-0.76.5.dev2.dist-info/RECORD,,
|
modal_version/__init__.py
CHANGED
File without changes
|
File without changes
|
File without changes
|
File without changes
|