ob-metaflow 2.17.1.0__py2.py3-none-any.whl → 2.18.0.1__py2.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 ob-metaflow might be problematic. Click here for more details.
- metaflow/cli_components/run_cmds.py +15 -0
- metaflow/datastore/task_datastore.py +3 -0
- metaflow/flowspec.py +91 -1
- metaflow/graph.py +154 -13
- metaflow/lint.py +94 -3
- metaflow/plugins/argo/argo_workflows.py +367 -11
- metaflow/plugins/argo/argo_workflows_decorator.py +9 -0
- metaflow/plugins/argo/conditional_input_paths.py +21 -0
- metaflow/plugins/aws/step_functions/step_functions.py +6 -0
- metaflow/plugins/cards/card_modules/basic.py +14 -2
- metaflow/plugins/cards/card_modules/main.css +1 -0
- metaflow/plugins/cards/card_modules/main.js +31 -31
- metaflow/plugins/catch_decorator.py +9 -0
- metaflow/plugins/package_cli.py +1 -1
- metaflow/plugins/parallel_decorator.py +7 -0
- metaflow/runtime.py +217 -34
- metaflow/task.py +129 -34
- metaflow/user_configs/config_parameters.py +3 -1
- metaflow/user_decorators/user_step_decorator.py +31 -6
- metaflow/version.py +1 -1
- {ob_metaflow-2.17.1.0.dist-info → ob_metaflow-2.18.0.1.dist-info}/METADATA +2 -2
- {ob_metaflow-2.17.1.0.dist-info → ob_metaflow-2.18.0.1.dist-info}/RECORD +29 -27
- {ob_metaflow-2.17.1.0.data → ob_metaflow-2.18.0.1.data}/data/share/metaflow/devtools/Makefile +0 -0
- {ob_metaflow-2.17.1.0.data → ob_metaflow-2.18.0.1.data}/data/share/metaflow/devtools/Tiltfile +0 -0
- {ob_metaflow-2.17.1.0.data → ob_metaflow-2.18.0.1.data}/data/share/metaflow/devtools/pick_services.sh +0 -0
- {ob_metaflow-2.17.1.0.dist-info → ob_metaflow-2.18.0.1.dist-info}/WHEEL +0 -0
- {ob_metaflow-2.17.1.0.dist-info → ob_metaflow-2.18.0.1.dist-info}/entry_points.txt +0 -0
- {ob_metaflow-2.17.1.0.dist-info → ob_metaflow-2.18.0.1.dist-info}/licenses/LICENSE +0 -0
- {ob_metaflow-2.17.1.0.dist-info → ob_metaflow-2.18.0.1.dist-info}/top_level.txt +0 -0
metaflow/task.py
CHANGED
|
@@ -62,8 +62,17 @@ class MetaflowTask(object):
|
|
|
62
62
|
def _exec_step_function(self, step_function, orig_step_func, input_obj=None):
|
|
63
63
|
wrappers_stack = []
|
|
64
64
|
wrapped_func = None
|
|
65
|
-
|
|
65
|
+
|
|
66
|
+
# Will set to non-Falsy if we need to fake calling `self.next`
|
|
67
|
+
# This is used when skipping the step.
|
|
68
|
+
# If a dictionary, it will
|
|
69
|
+
# contain the arguments to pass to `self.next`. If
|
|
70
|
+
# True, it means we are using whatever the usual
|
|
71
|
+
# arguments to `self.next` are for this step.
|
|
72
|
+
fake_next_call_args = False
|
|
66
73
|
raised_exception = None
|
|
74
|
+
had_raised_exception = False
|
|
75
|
+
|
|
67
76
|
# If we have wrappers w1, w2 and w3, we need to execute
|
|
68
77
|
# - w3_pre
|
|
69
78
|
# - w2_pre
|
|
@@ -80,41 +89,76 @@ class MetaflowTask(object):
|
|
|
80
89
|
wrapped_func = w.pre_step(orig_step_func.name, self.flow, input_obj)
|
|
81
90
|
wrappers_stack.append(w)
|
|
82
91
|
if w.skip_step:
|
|
83
|
-
# We
|
|
84
|
-
|
|
92
|
+
# We are not going to run anything so we will have to fake calling
|
|
93
|
+
# next.
|
|
94
|
+
fake_next_call_args = w.skip_step
|
|
85
95
|
break
|
|
86
96
|
if wrapped_func:
|
|
87
97
|
break # We have nothing left to do since we now execute the
|
|
88
98
|
# wrapped function
|
|
89
99
|
# Else, we continue down the list of wrappers
|
|
90
100
|
try:
|
|
91
|
-
|
|
101
|
+
# fake_next_call is used here to also indicate that the step was skipped
|
|
102
|
+
# so we do not execute anything.
|
|
103
|
+
if not fake_next_call_args:
|
|
92
104
|
if input_obj is None:
|
|
93
105
|
if wrapped_func:
|
|
94
|
-
|
|
95
|
-
if not do_next:
|
|
96
|
-
do_next = True
|
|
106
|
+
fake_next_call_args = wrapped_func(self.flow)
|
|
97
107
|
else:
|
|
98
108
|
step_function()
|
|
99
109
|
else:
|
|
100
110
|
if wrapped_func:
|
|
101
|
-
|
|
102
|
-
if not do_next:
|
|
103
|
-
do_next = True
|
|
111
|
+
fake_next_call_args = wrapped_func(self.flow, input_obj)
|
|
104
112
|
else:
|
|
105
113
|
step_function(input_obj)
|
|
106
114
|
except Exception as ex:
|
|
107
115
|
raised_exception = ex
|
|
116
|
+
had_raised_exception = True
|
|
108
117
|
|
|
109
|
-
|
|
110
|
-
|
|
118
|
+
# We back out of the stack of generators
|
|
119
|
+
for w in reversed(wrappers_stack):
|
|
120
|
+
try:
|
|
121
|
+
r = w.post_step(orig_step_func.name, self.flow, raised_exception)
|
|
122
|
+
except Exception as ex:
|
|
123
|
+
r = ex
|
|
124
|
+
if r is None:
|
|
125
|
+
raised_exception = None
|
|
126
|
+
elif isinstance(r, Exception):
|
|
127
|
+
raised_exception = r
|
|
128
|
+
elif isinstance(r, tuple):
|
|
129
|
+
if len(r) == 2:
|
|
130
|
+
raised_exception, fake_next_call_args = r
|
|
131
|
+
else:
|
|
132
|
+
# The last argument is an exception to be re-raised. Used in
|
|
133
|
+
# user_step_decorator's post_step
|
|
134
|
+
raise r[2]
|
|
135
|
+
else:
|
|
136
|
+
raise RuntimeError(
|
|
137
|
+
"Invalid return value from a UserStepDecorator. Expected an"
|
|
138
|
+
"exception or an exception and arguments for self.next, got: %s" % r
|
|
139
|
+
)
|
|
140
|
+
if raised_exception:
|
|
141
|
+
# We have an exception that we need to propagate
|
|
142
|
+
raise raised_exception
|
|
143
|
+
|
|
144
|
+
if fake_next_call_args or had_raised_exception:
|
|
145
|
+
# We want to override the next call or we caught an exception (in which
|
|
146
|
+
# case the regular step code didn't call self.next). In this case,
|
|
111
147
|
# we need to set the transition variables
|
|
112
148
|
# properly. We call the next function as needed
|
|
113
149
|
# We also do this in case we want to gobble the exception.
|
|
114
150
|
graph_node = self.flow._graph[orig_step_func.name]
|
|
115
151
|
out_funcs = [getattr(self.flow, f) for f in graph_node.out_funcs]
|
|
116
152
|
if out_funcs:
|
|
117
|
-
if isinstance(
|
|
153
|
+
if isinstance(fake_next_call_args, dict) and fake_next_call_args:
|
|
154
|
+
# Not an empty dictionary -- we use this as arguments for the next
|
|
155
|
+
# call
|
|
156
|
+
self.flow.next(*out_funcs, **fake_next_call_args)
|
|
157
|
+
elif (
|
|
158
|
+
fake_next_call_args == True
|
|
159
|
+
or fake_next_call_args == {}
|
|
160
|
+
or had_raised_exception
|
|
161
|
+
):
|
|
118
162
|
# We need to extract things from the self.next. This is not possible
|
|
119
163
|
# in the case where there was a num_parallel.
|
|
120
164
|
if graph_node.parallel_foreach:
|
|
@@ -126,23 +170,11 @@ class MetaflowTask(object):
|
|
|
126
170
|
self.flow.next(*out_funcs, foreach=graph_node.foreach_param)
|
|
127
171
|
else:
|
|
128
172
|
self.flow.next(*out_funcs)
|
|
129
|
-
elif isinstance(do_next, dict):
|
|
130
|
-
# Here it is a dictionary so we just call the next method with
|
|
131
|
-
# those arguments
|
|
132
|
-
self.flow.next(*out_funcs, **do_next)
|
|
133
173
|
else:
|
|
134
174
|
raise RuntimeError(
|
|
135
175
|
"Invalid value passed to self.next; expected "
|
|
136
|
-
" bool of a dictionary; got: %s" %
|
|
176
|
+
" bool of a dictionary; got: %s" % fake_next_call_args
|
|
137
177
|
)
|
|
138
|
-
# We back out of the stack of generators
|
|
139
|
-
for w in reversed(wrappers_stack):
|
|
140
|
-
raised_exception = w.post_step(
|
|
141
|
-
orig_step_func.name, self.flow, raised_exception
|
|
142
|
-
)
|
|
143
|
-
if raised_exception:
|
|
144
|
-
# We have an exception that we need to propagate
|
|
145
|
-
raise raised_exception
|
|
146
178
|
|
|
147
179
|
def _init_parameters(self, parameter_ds, passdown=True):
|
|
148
180
|
cls = self.flow.__class__
|
|
@@ -217,6 +249,7 @@ class MetaflowTask(object):
|
|
|
217
249
|
# Prefetch 'foreach' related artifacts to improve time taken by
|
|
218
250
|
# _init_foreach.
|
|
219
251
|
prefetch_data_artifacts = [
|
|
252
|
+
"_iteration_stack",
|
|
220
253
|
"_foreach_stack",
|
|
221
254
|
"_foreach_num_splits",
|
|
222
255
|
"_foreach_var",
|
|
@@ -353,6 +386,56 @@ class MetaflowTask(object):
|
|
|
353
386
|
elif "_foreach_stack" in inputs[0]:
|
|
354
387
|
self.flow._foreach_stack = inputs[0]["_foreach_stack"]
|
|
355
388
|
|
|
389
|
+
def _init_iteration(self, step_name, inputs, is_recursive_step):
|
|
390
|
+
# We track the iteration "stack" for loops. At this time, we
|
|
391
|
+
# only support one type of "looping" which is a recursive step but
|
|
392
|
+
# this can generalize to arbitrary well-scoped loops in the future.
|
|
393
|
+
|
|
394
|
+
# _iteration_stack will contain the iteration count for each loop
|
|
395
|
+
# level. Currently, there will be only no elements (no loops) or
|
|
396
|
+
# a single element (a single recursive step).
|
|
397
|
+
|
|
398
|
+
# We just need to determine the rules to add a new looping level,
|
|
399
|
+
# increment the looping level or pop the looping level. In our
|
|
400
|
+
# current support for only recursive steps, this is pretty straightforward:
|
|
401
|
+
# 1) if is_recursive_step:
|
|
402
|
+
# - we are entering a loop -- we are either entering for the first time
|
|
403
|
+
# or we are continuing the loop. Note that a recursive step CANNOT
|
|
404
|
+
# be a join step so there is always a single input
|
|
405
|
+
# 1a) If inputs[0]["_iteration_stack"] contains an element, we are looping
|
|
406
|
+
# so we increment the count
|
|
407
|
+
# 1b) If inputs[0]["_iteration_stack"] is empty, this is the first time we
|
|
408
|
+
# are entering the loop so we set the iteration count to 0
|
|
409
|
+
# 2) if it is not a recursive step, we need to determine if this is the step
|
|
410
|
+
# *after* the recursive step. The easiest way to determine that is to
|
|
411
|
+
# look at all inputs (there can be multiple in case of a join) and pop
|
|
412
|
+
# _iteration_stack if it is set. However, since we know that non recursive
|
|
413
|
+
# steps are *never* part of an iteration, we can simplify and just set it
|
|
414
|
+
# to [] without even checking anything. We will have to revisit this if/when
|
|
415
|
+
# more complex loop structures are supported.
|
|
416
|
+
|
|
417
|
+
# Note that just like _foreach_stack, we need to set _iteration_stack to *something*
|
|
418
|
+
# so that it doesn't get clobbered weirdly by merge_artifacts.
|
|
419
|
+
|
|
420
|
+
if is_recursive_step:
|
|
421
|
+
# Case 1)
|
|
422
|
+
if len(inputs) != 1:
|
|
423
|
+
raise MetaflowInternalError(
|
|
424
|
+
"Step *%s* is a recursive step but got multiple inputs." % step_name
|
|
425
|
+
)
|
|
426
|
+
inp = inputs[0]
|
|
427
|
+
if "_iteration_stack" not in inp or not inp["_iteration_stack"]:
|
|
428
|
+
# Case 1b)
|
|
429
|
+
self.flow._iteration_stack = [0]
|
|
430
|
+
else:
|
|
431
|
+
# Case 1a)
|
|
432
|
+
stack = inp["_iteration_stack"]
|
|
433
|
+
stack[-1] += 1
|
|
434
|
+
self.flow._iteration_stack = stack
|
|
435
|
+
else:
|
|
436
|
+
# Case 2)
|
|
437
|
+
self.flow._iteration_stack = []
|
|
438
|
+
|
|
356
439
|
def _clone_flow(self, datastore):
|
|
357
440
|
x = self.flow.__class__(use_cli=False)
|
|
358
441
|
x._set_datastore(datastore)
|
|
@@ -541,6 +624,12 @@ class MetaflowTask(object):
|
|
|
541
624
|
# 3. initialize foreach state
|
|
542
625
|
self._init_foreach(step_name, join_type, inputs, split_index)
|
|
543
626
|
|
|
627
|
+
# 4. initialize the iteration state
|
|
628
|
+
is_recursive_step = (
|
|
629
|
+
node.type == "split-switch" and step_name in node.out_funcs
|
|
630
|
+
)
|
|
631
|
+
self._init_iteration(step_name, inputs, is_recursive_step)
|
|
632
|
+
|
|
544
633
|
# Add foreach stack to metadata of the task
|
|
545
634
|
|
|
546
635
|
foreach_stack = (
|
|
@@ -671,14 +760,20 @@ class MetaflowTask(object):
|
|
|
671
760
|
if join_type:
|
|
672
761
|
# Join step:
|
|
673
762
|
|
|
674
|
-
# Ensure that we have the right number of inputs.
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
)
|
|
763
|
+
# Ensure that we have the right number of inputs.
|
|
764
|
+
if join_type != "foreach":
|
|
765
|
+
# Find the corresponding split node from the graph.
|
|
766
|
+
split_node = self.flow._graph[node.split_parents[-1]]
|
|
767
|
+
# The number of expected inputs is the number of branches
|
|
768
|
+
# from that split -- we can't use in_funcs because there may
|
|
769
|
+
# be more due to split-switch branches that all converge here.
|
|
770
|
+
expected_inputs = len(split_node.out_funcs)
|
|
771
|
+
|
|
772
|
+
if len(inputs) != expected_inputs:
|
|
773
|
+
raise MetaflowDataMissing(
|
|
774
|
+
"Join *%s* expected %d inputs but only %d inputs "
|
|
775
|
+
"were found" % (step_name, expected_inputs, len(inputs))
|
|
776
|
+
)
|
|
682
777
|
|
|
683
778
|
# Multiple input contexts are passed in as an argument
|
|
684
779
|
# to the step function.
|
|
@@ -271,6 +271,9 @@ class ConfigValue(collections.abc.Mapping, dict):
|
|
|
271
271
|
v = obj
|
|
272
272
|
return v
|
|
273
273
|
|
|
274
|
+
def __reduce__(self):
|
|
275
|
+
return (self.__class__, (self.to_dict(),))
|
|
276
|
+
|
|
274
277
|
|
|
275
278
|
class DelayEvaluator(collections.abc.Mapping):
|
|
276
279
|
"""
|
|
@@ -484,7 +487,6 @@ class Config(Parameter, collections.abc.Mapping):
|
|
|
484
487
|
parser: Optional[Union[str, Callable[[str], Dict[Any, Any]]]] = None,
|
|
485
488
|
**kwargs: Dict[str, str]
|
|
486
489
|
):
|
|
487
|
-
|
|
488
490
|
if default is not None and default_value is not None:
|
|
489
491
|
raise MetaflowException(
|
|
490
492
|
"For config '%s', you can only specify default or default_value, not both"
|
|
@@ -463,7 +463,9 @@ class UserStepDecorator(UserStepDecoratorBase):
|
|
|
463
463
|
step_name: str,
|
|
464
464
|
flow: "metaflow.flowspec.FlowSpec",
|
|
465
465
|
exception: Optional[Exception] = None,
|
|
466
|
-
)
|
|
466
|
+
) -> Optional[
|
|
467
|
+
Union[Optional[Exception], Tuple[Optional[Exception], Optional[Dict[str, Any]]]]
|
|
468
|
+
]:
|
|
467
469
|
"""
|
|
468
470
|
Implement this method to perform any action after the execution of a step.
|
|
469
471
|
|
|
@@ -483,9 +485,23 @@ class UserStepDecorator(UserStepDecoratorBase):
|
|
|
483
485
|
The flow object to which the step belongs.
|
|
484
486
|
exception: Optional[Exception]
|
|
485
487
|
The exception raised during the step execution, if any.
|
|
488
|
+
|
|
489
|
+
Returns
|
|
490
|
+
-------
|
|
491
|
+
Optional[Union[Optional[Exception], Tuple[Optional[Exception], Optional[Dict[str, Any]]]]]
|
|
492
|
+
An exception (if None, the step is considered successful)
|
|
493
|
+
OR
|
|
494
|
+
A tuple containing:
|
|
495
|
+
- An exception to be raised (if None, the step is considered successful).
|
|
496
|
+
- A dictionary with values to pass to `self.next()`. If an empty dictionary
|
|
497
|
+
is returned, the default arguments to `self.next()` for this step will be
|
|
498
|
+
used. Return None if you do not want to call `self.next()` at all
|
|
499
|
+
(this is typically the case as the step will call it itself).
|
|
500
|
+
Note that returning None will gobble the exception.
|
|
486
501
|
"""
|
|
487
502
|
if exception:
|
|
488
|
-
|
|
503
|
+
return exception, None
|
|
504
|
+
return None, None
|
|
489
505
|
|
|
490
506
|
@property
|
|
491
507
|
def skip_step(self) -> Union[bool, Dict[str, Any]]:
|
|
@@ -624,24 +640,33 @@ def user_step_decorator(*args, **kwargs):
|
|
|
624
640
|
self._generator = self._generator(step_name, flow, inputs)
|
|
625
641
|
v = self._generator.send(None)
|
|
626
642
|
if isinstance(v, dict):
|
|
627
|
-
# We are
|
|
643
|
+
# We are modifying the behavior of self.next
|
|
628
644
|
if v:
|
|
629
645
|
self.skip_step = v
|
|
630
646
|
else:
|
|
647
|
+
# Emtpy dict is just skip the step
|
|
631
648
|
self.skip_step = True
|
|
632
649
|
return None
|
|
633
650
|
return v
|
|
634
651
|
|
|
635
652
|
def post_step(self, step_name, flow, exception=None):
|
|
653
|
+
to_return = None, None
|
|
636
654
|
try:
|
|
637
655
|
if exception:
|
|
638
656
|
self._generator.throw(exception)
|
|
639
657
|
else:
|
|
640
658
|
self._generator.send(None)
|
|
641
|
-
except StopIteration:
|
|
642
|
-
|
|
659
|
+
except StopIteration as e:
|
|
660
|
+
to_return = e.value
|
|
661
|
+
except Exception as e:
|
|
662
|
+
return e
|
|
643
663
|
else:
|
|
644
|
-
|
|
664
|
+
return (
|
|
665
|
+
None,
|
|
666
|
+
None,
|
|
667
|
+
MetaflowException(" %s should only yield once" % self),
|
|
668
|
+
)
|
|
669
|
+
return to_return
|
|
645
670
|
|
|
646
671
|
return WrapClass
|
|
647
672
|
else:
|
metaflow/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
metaflow_version = "2.
|
|
1
|
+
metaflow_version = "2.18.0.1"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ob-metaflow
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.18.0.1
|
|
4
4
|
Summary: Metaflow: More AI and ML, Less Engineering
|
|
5
5
|
Author: Netflix, Outerbounds & the Metaflow Community
|
|
6
6
|
Author-email: help@outerbounds.co
|
|
@@ -12,7 +12,7 @@ Requires-Dist: boto3
|
|
|
12
12
|
Requires-Dist: pylint
|
|
13
13
|
Requires-Dist: kubernetes
|
|
14
14
|
Provides-Extra: stubs
|
|
15
|
-
Requires-Dist: metaflow-stubs==2.
|
|
15
|
+
Requires-Dist: metaflow-stubs==2.18.0.1; extra == "stubs"
|
|
16
16
|
Dynamic: author
|
|
17
17
|
Dynamic: author-email
|
|
18
18
|
Dynamic: description
|
|
@@ -10,11 +10,11 @@ metaflow/decorators.py,sha256=4g11F5xtXmKRMNfeFd9yKOWpiHAoyxfbfDqIWak1_Q0,30831
|
|
|
10
10
|
metaflow/event_logger.py,sha256=joTVRqZPL87nvah4ZOwtqWX8NeraM_CXKXXGVpKGD8o,780
|
|
11
11
|
metaflow/events.py,sha256=ahjzkSbSnRCK9RZ-9vTfUviz_6gMvSO9DGkJ86X80-k,5300
|
|
12
12
|
metaflow/exception.py,sha256=_m9ZBJM0cooHRslDqfxCPQmkChqaTh6fGxp7HvISnYI,5161
|
|
13
|
-
metaflow/flowspec.py,sha256=
|
|
14
|
-
metaflow/graph.py,sha256=
|
|
13
|
+
metaflow/flowspec.py,sha256=9wsO2_QoO_VHKusKdpslfbwQREOwf0fAzF-DSEA0iZ8,41968
|
|
14
|
+
metaflow/graph.py,sha256=UOeClj-JeORRlZWOQMI1CirkrCpTvVWvRcSwODCajMg,19263
|
|
15
15
|
metaflow/includefile.py,sha256=RtISGl1V48qjkJBakUZ9yPpHV102h7pOIFiKP8PLHpc,20927
|
|
16
16
|
metaflow/integrations.py,sha256=LlsaoePRg03DjENnmLxZDYto3NwWc9z_PtU6nJxLldg,1480
|
|
17
|
-
metaflow/lint.py,sha256=
|
|
17
|
+
metaflow/lint.py,sha256=A2NdUq_MnQal_RUCMC8ZOSR0VYZGyi2mSgwPQB0UzQo,15343
|
|
18
18
|
metaflow/meta_files.py,sha256=vlgJHI8GJUKzXoxdrVoH8yyCF5bhFgwYemUgnyd1wgM,342
|
|
19
19
|
metaflow/metaflow_config.py,sha256=xEAsJ-Fa-fkDq1hzI72Hx9BC00-S1yQoqgSYG9K46AY,24267
|
|
20
20
|
metaflow/metaflow_config_funcs.py,sha256=5GlvoafV6SxykwfL8D12WXSfwjBN_NsyuKE_Q3gjGVE,6738
|
|
@@ -29,14 +29,14 @@ metaflow/parameters.py,sha256=b3rS6P-TeEj2JgPEKaiy0ys1B_JtOGJ6XM0KkY2layc,18649
|
|
|
29
29
|
metaflow/procpoll.py,sha256=U2tE4iK_Mwj2WDyVTx_Uglh6xZ-jixQOo4wrM9OOhxg,2859
|
|
30
30
|
metaflow/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
31
|
metaflow/pylint_wrapper.py,sha256=tJjmdsgtbHTCqg_oA6fV6SbWq_3V5XUgE9xH0zJ1CGU,3004
|
|
32
|
-
metaflow/runtime.py,sha256=
|
|
32
|
+
metaflow/runtime.py,sha256=3R44AFI04LWahbfa2v0yDYIWHIz6sau26p1SnzYFNew,86888
|
|
33
33
|
metaflow/tagging_util.py,sha256=ctyf0Q1gBi0RyZX6J0e9DQGNkNHblV_CITfy66axXB4,2346
|
|
34
|
-
metaflow/task.py,sha256=
|
|
34
|
+
metaflow/task.py,sha256=jnh_qteVIW0sP3Y2MBfJR2eEv_MGnOW1quPO_1OltH0,39244
|
|
35
35
|
metaflow/tuple_util.py,sha256=_G5YIEhuugwJ_f6rrZoelMFak3DqAR2tt_5CapS1XTY,830
|
|
36
36
|
metaflow/unbounded_foreach.py,sha256=p184WMbrMJ3xKYHwewj27ZhRUsSj_kw1jlye5gA9xJk,387
|
|
37
37
|
metaflow/util.py,sha256=g2SOU_CRzJLgDM_UGF9QDMANMAIHAsDRXE6S76_YzsY,14594
|
|
38
38
|
metaflow/vendor.py,sha256=A82CGHfStZGDP5pQ5XzRjFkbN1ZC-vFmghXIrzMDDNg,5868
|
|
39
|
-
metaflow/version.py,sha256=
|
|
39
|
+
metaflow/version.py,sha256=o3sV9E2qFU3v7vlGUZJeRlMRnrnYo34PH8nB138GVhw,30
|
|
40
40
|
metaflow/_vendor/__init__.py,sha256=y_CiwUD3l4eAKvTVDZeqgVujMy31cAM1qjAB-HfI-9s,353
|
|
41
41
|
metaflow/_vendor/typing_extensions.py,sha256=q9zxWa6p6CzF1zZvSkygSlklduHf_b3K7MCxGz7MJRc,134519
|
|
42
42
|
metaflow/_vendor/zipp.py,sha256=ajztOH-9I7KA_4wqDYygtHa6xUBVZgFpmZ8FE74HHHI,8425
|
|
@@ -153,7 +153,7 @@ metaflow/_vendor/yaml/tokens.py,sha256=lTQIzSVw8Mg9wv459-TjiOQe6wVziqaRlqX2_89rp
|
|
|
153
153
|
metaflow/cli_components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
154
154
|
metaflow/cli_components/dump_cmd.py,sha256=SZEX51BWNd1o3H2uHDkYA8KRvou5X8g5rTwpdu5vnNQ,2704
|
|
155
155
|
metaflow/cli_components/init_cmd.py,sha256=AIkQHNlMRsmf8fxXwXQSEWTuv_9nxNY82-IdWsgGjEs,1554
|
|
156
|
-
metaflow/cli_components/run_cmds.py,sha256=
|
|
156
|
+
metaflow/cli_components/run_cmds.py,sha256=_xk2asy3SkqsJfZVhbgYSJ2rkkJe7cvLik6b0HT-704,12264
|
|
157
157
|
metaflow/cli_components/step_cmd.py,sha256=zGJgTv7wxrv34nWDi__CHaC2eS6kItR95EdVGJX803w,4766
|
|
158
158
|
metaflow/cli_components/utils.py,sha256=gpoDociadjnJD7MuiJup_MDR02ZJjjleejr0jPBu29c,6057
|
|
159
159
|
metaflow/client/__init__.py,sha256=1GtQB4Y_CBkzaxg32L1syNQSlfj762wmLrfrDxGi1b8,226
|
|
@@ -176,7 +176,7 @@ metaflow/datastore/datastore_storage.py,sha256=7V43QuiWDQ_Q4oHw9y7Z7X9lYj3GI-LV1
|
|
|
176
176
|
metaflow/datastore/exceptions.py,sha256=r7Ab5FvHIzyFh6kwiptA1lO5nLqWg0xRBoeYGefvapA,373
|
|
177
177
|
metaflow/datastore/flow_datastore.py,sha256=rDMEHdYwub1PwLp2uaK-8CHdd8hiwxqeELXzsUfuqZs,10250
|
|
178
178
|
metaflow/datastore/inputs.py,sha256=i43dXr2xvgtsgKMO9allgCR18bk80GeayeQFyUTH36w,449
|
|
179
|
-
metaflow/datastore/task_datastore.py,sha256=
|
|
179
|
+
metaflow/datastore/task_datastore.py,sha256=XZKC4YJ2kyFTDqwTARNavjQ-oSosjUJbNH777e9OF0c,35262
|
|
180
180
|
metaflow/extension_support/__init__.py,sha256=xLkhh0IzQ70IfF9j6MopMY02SMpEVI_eguksIOEXbDs,52522
|
|
181
181
|
metaflow/extension_support/_empty_file.py,sha256=vz61sSExf5DZH3JCqdfwkp7l_NrJR8HV175kG82yUas,133
|
|
182
182
|
metaflow/extension_support/cmd.py,sha256=hk8iBUUINqvKCDxInKgWpum8ThiRZtHSJP7qBASHzl8,5711
|
|
@@ -199,14 +199,14 @@ metaflow/packaging_sys/tar_backend.py,sha256=nFWuXiwYjWQkFdV2KaZ6gazNVvtY84Eqsh9
|
|
|
199
199
|
metaflow/packaging_sys/utils.py,sha256=x8SVglJvY5mIAilS7MqZi2PpMr6IEyi6RCg3l8hN3G0,2972
|
|
200
200
|
metaflow/packaging_sys/v1.py,sha256=kbNK0-pDAv3QJPZ789TE0UirGXcHbXkVQiyNT815H7A,20631
|
|
201
201
|
metaflow/plugins/__init__.py,sha256=yFxjJOlnfap7tQMNgSgaso2tl_zr1BcWL7KoUKk4c9Y,8617
|
|
202
|
-
metaflow/plugins/catch_decorator.py,sha256=
|
|
202
|
+
metaflow/plugins/catch_decorator.py,sha256=vorlDA6MLB2yHSsEuBoNzAZbrJ6Vknj1qJO9vey2_AI,4523
|
|
203
203
|
metaflow/plugins/debug_logger.py,sha256=mcF5HYzJ0NQmqCMjyVUk3iAP-heroHRIiVWQC6Ha2-I,879
|
|
204
204
|
metaflow/plugins/debug_monitor.py,sha256=Md5X_sDOSssN9pt2D8YcaIjTK5JaQD55UAYTcF6xYF0,1099
|
|
205
205
|
metaflow/plugins/environment_decorator.py,sha256=6m9j2B77d-Ja_l_9CTJ__0O6aB2a8Qt_lAZu6UjAcUA,587
|
|
206
206
|
metaflow/plugins/events_decorator.py,sha256=T_YSK-DlgZhd3ge9PlpTRNaMi15GK0tKZMZl1NdV9DQ,24403
|
|
207
207
|
metaflow/plugins/logs_cli.py,sha256=77W5UNagU2mOKSMMvrQxQmBLRzvmjK-c8dWxd-Ygbqs,11410
|
|
208
|
-
metaflow/plugins/package_cli.py,sha256=
|
|
209
|
-
metaflow/plugins/parallel_decorator.py,sha256=
|
|
208
|
+
metaflow/plugins/package_cli.py,sha256=GOxKJs9Wt0x9VtcTJ2EG_wj6pWnlS0XBFAyHpCzzuvs,2000
|
|
209
|
+
metaflow/plugins/parallel_decorator.py,sha256=wtR_3eRIP3eV7fBIm15oouRjmHBFZ9OklxdaNvttLEQ,9702
|
|
210
210
|
metaflow/plugins/project_decorator.py,sha256=uhwsguEj7OM_E2OnY1ap3MoGocQHeywuJSa-qPuWn-U,7592
|
|
211
211
|
metaflow/plugins/resources_decorator.py,sha256=AtoOwg4mHYHYthg-CAfbfam-QiT0ViuDLDoukoDvF6Q,1347
|
|
212
212
|
metaflow/plugins/retry_decorator.py,sha256=tz_2Tq6GLg3vjDBZp0KKVTk3ADlCvqaWTSf7blmFdUw,1548
|
|
@@ -230,12 +230,13 @@ metaflow/plugins/airflow/sensors/s3_sensor.py,sha256=iDReG-7FKnumrtQg-HY6cCUAAqN
|
|
|
230
230
|
metaflow/plugins/argo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
231
231
|
metaflow/plugins/argo/argo_client.py,sha256=jLz0FjCTBvFLZt-8lZcMQhDcInhgEcGdPrU2Gvh67zA,17080
|
|
232
232
|
metaflow/plugins/argo/argo_events.py,sha256=_C1KWztVqgi3zuH57pInaE9OzABc2NnncC-zdwOMZ-w,5909
|
|
233
|
-
metaflow/plugins/argo/argo_workflows.py,sha256=
|
|
233
|
+
metaflow/plugins/argo/argo_workflows.py,sha256=wE5uL8nMNzguJSQmdaldmv9XSV4_RHkhoTUcN14YmN4,209779
|
|
234
234
|
metaflow/plugins/argo/argo_workflows_cli.py,sha256=L5KwcT6Vd4HqAXFCPGmHUONgM2eOCTbvxdoIs6CQchw,51877
|
|
235
|
-
metaflow/plugins/argo/argo_workflows_decorator.py,sha256=
|
|
235
|
+
metaflow/plugins/argo/argo_workflows_decorator.py,sha256=CLSjPqFTGucZ2_dSQGAYkoWWUZBQ9TCBXul4rxhDj3w,8282
|
|
236
236
|
metaflow/plugins/argo/argo_workflows_deployer.py,sha256=6kHxEnYXJwzNCM9swI8-0AckxtPWqwhZLerYkX8fxUM,4444
|
|
237
237
|
metaflow/plugins/argo/argo_workflows_deployer_objects.py,sha256=ydBE-lP42eNKvep36nQdUBPS3rQQErvoA7rCgyp5M6I,14949
|
|
238
238
|
metaflow/plugins/argo/capture_error.py,sha256=Ys9dscGrTpW-ZCirLBU0gD9qBM0BjxyxGlUMKcwewQc,1852
|
|
239
|
+
metaflow/plugins/argo/conditional_input_paths.py,sha256=kpzwyjXjO7PjeAJMapYX_ajUulFQJvCj-2DhH7OHzy0,645
|
|
239
240
|
metaflow/plugins/argo/exit_hooks.py,sha256=nh8IEkzAtQnbKVnh3N9CVnVKZB39Bjm3e0LFrACsLz8,6109
|
|
240
241
|
metaflow/plugins/argo/generate_input_paths.py,sha256=loYsI6RFX9LlFsHb7Fe-mzlTTtRdySoOu7sYDy-uXK0,881
|
|
241
242
|
metaflow/plugins/argo/jobset_input_paths.py,sha256=-h0E_e0w6FMiBUod9Rf_XOSCtZv_C0exacw4q1SfIfg,501
|
|
@@ -255,7 +256,7 @@ metaflow/plugins/aws/step_functions/event_bridge_client.py,sha256=U9-tqKdih4KR-Z
|
|
|
255
256
|
metaflow/plugins/aws/step_functions/production_token.py,sha256=rREx9djJzKYDiGhPCZ919pSpfrBCYuhSL5WlwnAojNM,1890
|
|
256
257
|
metaflow/plugins/aws/step_functions/schedule_decorator.py,sha256=Ab1rW8O_no4HNZm4__iBmFDCDW0Z8-TgK4lnxHHA6HI,1940
|
|
257
258
|
metaflow/plugins/aws/step_functions/set_batch_environment.py,sha256=ibiGWFHDjKcLfprH3OsX-g2M9lUsh6J-bp7v2cdLhD4,1294
|
|
258
|
-
metaflow/plugins/aws/step_functions/step_functions.py,sha256=
|
|
259
|
+
metaflow/plugins/aws/step_functions/step_functions.py,sha256=3mkd9FCiWe1QlduLq73hlfdA6RonxstSYKw80jZiVqU,53819
|
|
259
260
|
metaflow/plugins/aws/step_functions/step_functions_cli.py,sha256=tLIfDwgdcfBjkjmQMNgVjXY85HoDZNA6lNcOtZZZA1A,26495
|
|
260
261
|
metaflow/plugins/aws/step_functions/step_functions_client.py,sha256=DKpNwAIWElvWjFANs5Ku3rgzjxFoqAD6k-EF8Xhkg3Q,4754
|
|
261
262
|
metaflow/plugins/aws/step_functions/step_functions_decorator.py,sha256=jzDHYmgU_XvLffZDazR_1viow_1qQFblx9UKyjtoM_0,3788
|
|
@@ -282,12 +283,13 @@ metaflow/plugins/cards/exception.py,sha256=2UqlNb-Kxpg6cuLu2sBEIPTIElwlVBsSpeCgD
|
|
|
282
283
|
metaflow/plugins/cards/metadata.py,sha256=tACaw7_XNAICZ4A25celIbgxUF0CxHh7BBpFzKrMLTo,487
|
|
283
284
|
metaflow/plugins/cards/card_modules/__init__.py,sha256=WI2IAsFiKGyqPrHtO9S9-MbyVtUTgWJNL4xjJaBErRo,3437
|
|
284
285
|
metaflow/plugins/cards/card_modules/base.html,sha256=Y208ZKIZqEWWUcoBFTLTdWKAG0C8xH5lmyCRSjaN2FY,21004
|
|
285
|
-
metaflow/plugins/cards/card_modules/basic.py,sha256=
|
|
286
|
+
metaflow/plugins/cards/card_modules/basic.py,sha256=b6aBg7800CjjkQb0J_TOd3JujVR10X2QoXYdwiXFbkE,25831
|
|
286
287
|
metaflow/plugins/cards/card_modules/bundle.css,sha256=ms2wOKftlPM_i6bC_4BkrmqCOj8mYw9OFvRCJF9FSV4,11981
|
|
287
288
|
metaflow/plugins/cards/card_modules/card.py,sha256=6sbqP5mwf7QWvQvX2N_bC78H9ixuI5sQ8612Q5islys,4627
|
|
288
289
|
metaflow/plugins/cards/card_modules/components.py,sha256=Y-Yo7UgSOyTB3zs-wDfUqUKl0PI_BzeY1QGcy2fqE2M,26752
|
|
289
290
|
metaflow/plugins/cards/card_modules/convert_to_native_type.py,sha256=Vcjqn5rfC0kVMdhqDwsYEjknXTbkG_ppraQrQGaQY_E,16245
|
|
290
|
-
metaflow/plugins/cards/card_modules/main.
|
|
291
|
+
metaflow/plugins/cards/card_modules/main.css,sha256=avu7BTB9qj0M8LvqNLUhikUFQhmAJhQQ7REcUgh9zMw,11725
|
|
292
|
+
metaflow/plugins/cards/card_modules/main.js,sha256=1p26spBKCwglJgioKfmAAPgh4pP2Cdp0bq29fWyg58A,1045517
|
|
291
293
|
metaflow/plugins/cards/card_modules/renderer_tools.py,sha256=uiTdKHWFInWgtfWArOUSQLnTwqVd4hAw49jfOfg8rGA,1642
|
|
292
294
|
metaflow/plugins/cards/card_modules/test_cards.py,sha256=t2PZ3QnjCN_KUlDKxAt2FfK1BX2dp8rqK6TjtkCNyew,5876
|
|
293
295
|
metaflow/plugins/cards/card_modules/chevron/__init__.py,sha256=SicpH_1eT76HUTA8aMuiGLRNKTqgYD1Qfutt2NdTL0E,156
|
|
@@ -419,19 +421,19 @@ metaflow/tutorials/08-autopilot/README.md,sha256=GnePFp_q76jPs991lMUqfIIh5zSorIe
|
|
|
419
421
|
metaflow/tutorials/08-autopilot/autopilot.ipynb,sha256=DQoJlILV7Mq9vfPBGW-QV_kNhWPjS5n6SJLqePjFYLY,3191
|
|
420
422
|
metaflow/user_configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
421
423
|
metaflow/user_configs/config_options.py,sha256=d3hKA6WRPe21PdTl7sBnxIp5sE6zBpRtgAGx7hWkkfw,21380
|
|
422
|
-
metaflow/user_configs/config_parameters.py,sha256=
|
|
424
|
+
metaflow/user_configs/config_parameters.py,sha256=1KZC1x7i-M-PfscIEOMUJ5NT2HTzFsB0HtNMTp_8hqE,20967
|
|
423
425
|
metaflow/user_decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
424
426
|
metaflow/user_decorators/common.py,sha256=0u9NRLQ95TfJCjWVEOGT4MJ9WoQgAMBM9kJ2gJGlVjk,5362
|
|
425
427
|
metaflow/user_decorators/mutable_flow.py,sha256=EywKTN3cnXPQF_s62wQaC4a4aH14j8oeqzD3yZaiDxw,19467
|
|
426
428
|
metaflow/user_decorators/mutable_step.py,sha256=-BY0UDXf_RCAEnC5JlLzEXGdiw1KD9oSrSxS_SWaB9Y,16791
|
|
427
429
|
metaflow/user_decorators/user_flow_decorator.py,sha256=2yDwZq9QGv9W-7kEuKwa8o4ZkTvuHJ5ESz7VVrGViAI,9890
|
|
428
|
-
metaflow/user_decorators/user_step_decorator.py,sha256=
|
|
429
|
-
ob_metaflow-2.
|
|
430
|
-
ob_metaflow-2.
|
|
431
|
-
ob_metaflow-2.
|
|
432
|
-
ob_metaflow-2.
|
|
433
|
-
ob_metaflow-2.
|
|
434
|
-
ob_metaflow-2.
|
|
435
|
-
ob_metaflow-2.
|
|
436
|
-
ob_metaflow-2.
|
|
437
|
-
ob_metaflow-2.
|
|
430
|
+
metaflow/user_decorators/user_step_decorator.py,sha256=4558NR8RJtN22OyTwCXO80bAMhMTaRGMoX12b1GMcPc,27232
|
|
431
|
+
ob_metaflow-2.18.0.1.data/data/share/metaflow/devtools/Makefile,sha256=TT4TCq8ALSfqYyGqDPocN5oPcZe2FqoCZxmGO1LmyCc,13760
|
|
432
|
+
ob_metaflow-2.18.0.1.data/data/share/metaflow/devtools/Tiltfile,sha256=Ty5p6AD3MwJAcAnOGv4yMz8fExAsnNQ11r8whK6uzzw,21381
|
|
433
|
+
ob_metaflow-2.18.0.1.data/data/share/metaflow/devtools/pick_services.sh,sha256=DCnrMXwtApfx3B4S-YiZESMyAFHbXa3VuNL0MxPLyiE,2196
|
|
434
|
+
ob_metaflow-2.18.0.1.dist-info/licenses/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
|
|
435
|
+
ob_metaflow-2.18.0.1.dist-info/METADATA,sha256=IYiZU0flSOrwvL1sWwEiCXJfwCRzEXR4m62i_8q7niM,5935
|
|
436
|
+
ob_metaflow-2.18.0.1.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
|
|
437
|
+
ob_metaflow-2.18.0.1.dist-info/entry_points.txt,sha256=RvEq8VFlgGe_FfqGOZi0D7ze1hLD0pAtXeNyGfzc_Yc,103
|
|
438
|
+
ob_metaflow-2.18.0.1.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
|
|
439
|
+
ob_metaflow-2.18.0.1.dist-info/RECORD,,
|
{ob_metaflow-2.17.1.0.data → ob_metaflow-2.18.0.1.data}/data/share/metaflow/devtools/Makefile
RENAMED
|
File without changes
|
{ob_metaflow-2.17.1.0.data → ob_metaflow-2.18.0.1.data}/data/share/metaflow/devtools/Tiltfile
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|