metaflow 2.17.1__py2.py3-none-any.whl → 2.17.2__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.
- metaflow/cli_components/run_cmds.py +15 -0
- metaflow/flowspec.py +91 -1
- metaflow/graph.py +152 -13
- metaflow/lint.py +66 -3
- metaflow/plugins/argo/argo_workflows.py +5 -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 +28 -28
- metaflow/runtime.py +57 -14
- metaflow/task.py +62 -34
- metaflow/user_decorators/user_step_decorator.py +24 -5
- metaflow/version.py +1 -1
- {metaflow-2.17.1.dist-info → metaflow-2.17.2.dist-info}/METADATA +2 -2
- {metaflow-2.17.1.dist-info → metaflow-2.17.2.dist-info}/RECORD +22 -21
- {metaflow-2.17.1.data → metaflow-2.17.2.data}/data/share/metaflow/devtools/Makefile +0 -0
- {metaflow-2.17.1.data → metaflow-2.17.2.data}/data/share/metaflow/devtools/Tiltfile +0 -0
- {metaflow-2.17.1.data → metaflow-2.17.2.data}/data/share/metaflow/devtools/pick_services.sh +0 -0
- {metaflow-2.17.1.dist-info → metaflow-2.17.2.dist-info}/WHEEL +0 -0
- {metaflow-2.17.1.dist-info → metaflow-2.17.2.dist-info}/entry_points.txt +0 -0
- {metaflow-2.17.1.dist-info → metaflow-2.17.2.dist-info}/licenses/LICENSE +0 -0
- {metaflow-2.17.1.dist-info → metaflow-2.17.2.dist-info}/top_level.txt +0 -0
metaflow/runtime.py
CHANGED
@@ -820,9 +820,11 @@ class NativeRuntime(object):
|
|
820
820
|
# matching_split is the split-parent of the finished task
|
821
821
|
matching_split = self._graph[self._graph[next_step].split_parents[-1]]
|
822
822
|
_, foreach_stack = task.finished_id
|
823
|
-
|
823
|
+
|
824
|
+
direct_parents = set(self._graph[next_step].in_funcs)
|
825
|
+
|
826
|
+
# next step is a foreach join
|
824
827
|
if matching_split.type == "foreach":
|
825
|
-
# next step is a foreach join
|
826
828
|
|
827
829
|
def siblings(foreach_stack):
|
828
830
|
top = foreach_stack[-1]
|
@@ -831,29 +833,46 @@ class NativeRuntime(object):
|
|
831
833
|
yield tuple(bottom + [top._replace(index=index)])
|
832
834
|
|
833
835
|
# required tasks are all split-siblings of the finished task
|
834
|
-
required_tasks =
|
835
|
-
|
836
|
-
|
836
|
+
required_tasks = list(
|
837
|
+
filter(
|
838
|
+
lambda x: x is not None,
|
839
|
+
[
|
840
|
+
self._finished.get((p, s))
|
841
|
+
for p in direct_parents
|
842
|
+
for s in siblings(foreach_stack)
|
843
|
+
],
|
844
|
+
)
|
845
|
+
)
|
846
|
+
required_count = task.finished_id[1][-1].num_splits
|
837
847
|
join_type = "foreach"
|
838
848
|
index = self._translate_index(task, next_step, "join")
|
839
849
|
else:
|
840
850
|
# next step is a split
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
851
|
+
required_tasks = list(
|
852
|
+
filter(
|
853
|
+
lambda x: x is not None,
|
854
|
+
[
|
855
|
+
self._finished.get((p, foreach_stack))
|
856
|
+
for p in direct_parents
|
857
|
+
],
|
858
|
+
)
|
859
|
+
)
|
860
|
+
required_count = len(matching_split.out_funcs)
|
846
861
|
join_type = "linear"
|
847
862
|
index = self._translate_index(task, next_step, "linear")
|
848
|
-
|
849
|
-
|
850
|
-
# all tasks to be joined are ready. Schedule the next join step.
|
863
|
+
if len(required_tasks) == required_count:
|
864
|
+
# We have all the required previous tasks to schedule a join
|
851
865
|
self._queue_push(
|
852
866
|
next_step,
|
853
867
|
{"input_paths": required_tasks, "join_type": join_type},
|
854
868
|
index,
|
855
869
|
)
|
856
870
|
|
871
|
+
def _queue_task_switch(self, task, next_steps):
|
872
|
+
chosen_step = next_steps[0]
|
873
|
+
index = self._translate_index(task, chosen_step, "linear")
|
874
|
+
self._queue_push(chosen_step, {"input_paths": [task.path]}, index)
|
875
|
+
|
857
876
|
def _queue_task_foreach(self, task, next_steps):
|
858
877
|
# CHECK: this condition should be enforced by the linter but
|
859
878
|
# let's assert that the assumption holds
|
@@ -930,7 +949,28 @@ class NativeRuntime(object):
|
|
930
949
|
next_steps = []
|
931
950
|
foreach = None
|
932
951
|
expected = self._graph[task.step].out_funcs
|
933
|
-
if
|
952
|
+
if self._graph[task.step].type == "split-switch":
|
953
|
+
if len(next_steps) != 1:
|
954
|
+
msg = (
|
955
|
+
"Switch step *{step}* should transition to exactly "
|
956
|
+
"one step at runtime, but got: {actual}"
|
957
|
+
)
|
958
|
+
raise MetaflowInternalError(
|
959
|
+
msg.format(step=task.step, actual=", ".join(next_steps))
|
960
|
+
)
|
961
|
+
if next_steps[0] not in expected:
|
962
|
+
msg = (
|
963
|
+
"Switch step *{step}* transitioned to unexpected "
|
964
|
+
"step *{actual}*. Expected one of: {expected}"
|
965
|
+
)
|
966
|
+
raise MetaflowInternalError(
|
967
|
+
msg.format(
|
968
|
+
step=task.step,
|
969
|
+
actual=next_steps[0],
|
970
|
+
expected=", ".join(expected),
|
971
|
+
)
|
972
|
+
)
|
973
|
+
elif next_steps != expected:
|
934
974
|
msg = (
|
935
975
|
"Based on static analysis of the code, step *{step}* "
|
936
976
|
"was expected to transition to step(s) *{expected}*. "
|
@@ -954,6 +994,9 @@ class NativeRuntime(object):
|
|
954
994
|
elif foreach:
|
955
995
|
# Next step is a foreach child
|
956
996
|
self._queue_task_foreach(task, next_steps)
|
997
|
+
elif self._graph[task.step].type == "split-switch":
|
998
|
+
# Next step is switch - queue the chosen step
|
999
|
+
self._queue_task_switch(task, next_steps)
|
957
1000
|
else:
|
958
1001
|
# Next steps are normal linear steps
|
959
1002
|
for step in next_steps:
|
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,66 @@ 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
|
117
|
+
|
118
|
+
# We back out of the stack of generators
|
119
|
+
for w in reversed(wrappers_stack):
|
120
|
+
r = w.post_step(orig_step_func.name, self.flow, raised_exception)
|
121
|
+
if r is None or isinstance(r, Exception):
|
122
|
+
raised_exception = None
|
123
|
+
elif isinstance(r, tuple):
|
124
|
+
raised_exception, fake_next_call_args = r
|
125
|
+
else:
|
126
|
+
raise RuntimeError(
|
127
|
+
"Invalid return value from a UserStepDecorator. Expected an"
|
128
|
+
"exception or an exception and arguments for self.next, got: %s" % r
|
129
|
+
)
|
130
|
+
if raised_exception:
|
131
|
+
# We have an exception that we need to propagate
|
132
|
+
raise raised_exception
|
108
133
|
|
109
|
-
if
|
110
|
-
#
|
134
|
+
if fake_next_call_args or had_raised_exception:
|
135
|
+
# We want to override the next call or we caught an exception (in which
|
136
|
+
# case the regular step code didn't call self.next). In this case,
|
111
137
|
# we need to set the transition variables
|
112
138
|
# properly. We call the next function as needed
|
113
139
|
# We also do this in case we want to gobble the exception.
|
114
140
|
graph_node = self.flow._graph[orig_step_func.name]
|
115
141
|
out_funcs = [getattr(self.flow, f) for f in graph_node.out_funcs]
|
116
142
|
if out_funcs:
|
117
|
-
if isinstance(
|
143
|
+
if isinstance(fake_next_call_args, dict) and fake_next_call_args:
|
144
|
+
# Not an empty dictionary -- we use this as arguments for the next
|
145
|
+
# call
|
146
|
+
self.flow.next(*out_funcs, **fake_next_call_args)
|
147
|
+
elif (
|
148
|
+
fake_next_call_args == True
|
149
|
+
or fake_next_call_args == {}
|
150
|
+
or had_raised_exception
|
151
|
+
):
|
118
152
|
# We need to extract things from the self.next. This is not possible
|
119
153
|
# in the case where there was a num_parallel.
|
120
154
|
if graph_node.parallel_foreach:
|
@@ -126,23 +160,11 @@ class MetaflowTask(object):
|
|
126
160
|
self.flow.next(*out_funcs, foreach=graph_node.foreach_param)
|
127
161
|
else:
|
128
162
|
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
163
|
else:
|
134
164
|
raise RuntimeError(
|
135
165
|
"Invalid value passed to self.next; expected "
|
136
|
-
" bool of a dictionary; got: %s" %
|
166
|
+
" bool of a dictionary; got: %s" % fake_next_call_args
|
137
167
|
)
|
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
168
|
|
147
169
|
def _init_parameters(self, parameter_ds, passdown=True):
|
148
170
|
cls = self.flow.__class__
|
@@ -671,14 +693,20 @@ class MetaflowTask(object):
|
|
671
693
|
if join_type:
|
672
694
|
# Join step:
|
673
695
|
|
674
|
-
# Ensure that we have the right number of inputs.
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
)
|
696
|
+
# Ensure that we have the right number of inputs.
|
697
|
+
if join_type != "foreach":
|
698
|
+
# Find the corresponding split node from the graph.
|
699
|
+
split_node = self.flow._graph[node.split_parents[-1]]
|
700
|
+
# The number of expected inputs is the number of branches
|
701
|
+
# from that split -- we can't use in_funcs because there may
|
702
|
+
# be more due to split-switch branches that all converge here.
|
703
|
+
expected_inputs = len(split_node.out_funcs)
|
704
|
+
|
705
|
+
if len(inputs) != expected_inputs:
|
706
|
+
raise MetaflowDataMissing(
|
707
|
+
"Join *%s* expected %d inputs but only %d inputs "
|
708
|
+
"were found" % (step_name, expected_inputs, len(inputs))
|
709
|
+
)
|
682
710
|
|
683
711
|
# Multiple input contexts are passed in as an argument
|
684
712
|
# to the step function.
|
@@ -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,27 @@ 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
|
643
661
|
else:
|
644
662
|
raise MetaflowException(" %s should only yield once" % self)
|
663
|
+
return to_return
|
645
664
|
|
646
665
|
return WrapClass
|
647
666
|
else:
|
metaflow/version.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
metaflow_version = "2.17.
|
1
|
+
metaflow_version = "2.17.2"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: metaflow
|
3
|
-
Version: 2.17.
|
3
|
+
Version: 2.17.2
|
4
4
|
Summary: Metaflow: More AI and ML, Less Engineering
|
5
5
|
Author: Metaflow Developers
|
6
6
|
Author-email: help@metaflow.org
|
@@ -26,7 +26,7 @@ License-File: LICENSE
|
|
26
26
|
Requires-Dist: requests
|
27
27
|
Requires-Dist: boto3
|
28
28
|
Provides-Extra: stubs
|
29
|
-
Requires-Dist: metaflow-stubs==2.17.
|
29
|
+
Requires-Dist: metaflow-stubs==2.17.2; extra == "stubs"
|
30
30
|
Dynamic: author
|
31
31
|
Dynamic: author-email
|
32
32
|
Dynamic: classifier
|
@@ -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=3Ova0lGbUZzxV89vqw3bX-dCSaVXfGUz3Tm9a8cmtSI,19198
|
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=2VLHNgxmHDtUcudvyfPCFIlbDy1pW7GFjNPBWtKZVjA,14102
|
18
18
|
metaflow/meta_files.py,sha256=vlgJHI8GJUKzXoxdrVoH8yyCF5bhFgwYemUgnyd1wgM,342
|
19
19
|
metaflow/metaflow_config.py,sha256=lsdfr_1eS4cP6g1OgLWePKzUIypUGVjNxffRhKlFWfA,24102
|
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=QjmWeaphyP4U8CI0fN9rVFOXvkC0yNr7-bnSG0fNhWQ,79508
|
33
33
|
metaflow/tagging_util.py,sha256=ctyf0Q1gBi0RyZX6J0e9DQGNkNHblV_CITfy66axXB4,2346
|
34
|
-
metaflow/task.py,sha256=
|
34
|
+
metaflow/task.py,sha256=O8swwqdSPZ_IyAC0GzjLyRVIyHH2C5iv19AtC8shFXs,35932
|
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=DFll4EtubWgJ0_Be3Jf5YZwLdJK51S1YQrLHAWICFgA,28
|
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
|
@@ -230,7 +230,7 @@ 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=C_u3E2yNkk-40vqnj7lYbXLF3M_DP3xwAgfDZJPpdCs,189375
|
234
234
|
metaflow/plugins/argo/argo_workflows_cli.py,sha256=L5KwcT6Vd4HqAXFCPGmHUONgM2eOCTbvxdoIs6CQchw,51877
|
235
235
|
metaflow/plugins/argo/argo_workflows_decorator.py,sha256=ogCSBmwsC2C3eusydrgjuAJd4qK18f1sI4jJwA4Fd-o,7800
|
236
236
|
metaflow/plugins/argo/argo_workflows_deployer.py,sha256=6kHxEnYXJwzNCM9swI8-0AckxtPWqwhZLerYkX8fxUM,4444
|
@@ -255,7 +255,7 @@ metaflow/plugins/aws/step_functions/event_bridge_client.py,sha256=U9-tqKdih4KR-Z
|
|
255
255
|
metaflow/plugins/aws/step_functions/production_token.py,sha256=rREx9djJzKYDiGhPCZ919pSpfrBCYuhSL5WlwnAojNM,1890
|
256
256
|
metaflow/plugins/aws/step_functions/schedule_decorator.py,sha256=Ab1rW8O_no4HNZm4__iBmFDCDW0Z8-TgK4lnxHHA6HI,1940
|
257
257
|
metaflow/plugins/aws/step_functions/set_batch_environment.py,sha256=ibiGWFHDjKcLfprH3OsX-g2M9lUsh6J-bp7v2cdLhD4,1294
|
258
|
-
metaflow/plugins/aws/step_functions/step_functions.py,sha256=
|
258
|
+
metaflow/plugins/aws/step_functions/step_functions.py,sha256=3mkd9FCiWe1QlduLq73hlfdA6RonxstSYKw80jZiVqU,53819
|
259
259
|
metaflow/plugins/aws/step_functions/step_functions_cli.py,sha256=tLIfDwgdcfBjkjmQMNgVjXY85HoDZNA6lNcOtZZZA1A,26495
|
260
260
|
metaflow/plugins/aws/step_functions/step_functions_client.py,sha256=DKpNwAIWElvWjFANs5Ku3rgzjxFoqAD6k-EF8Xhkg3Q,4754
|
261
261
|
metaflow/plugins/aws/step_functions/step_functions_decorator.py,sha256=jzDHYmgU_XvLffZDazR_1viow_1qQFblx9UKyjtoM_0,3788
|
@@ -282,12 +282,13 @@ metaflow/plugins/cards/exception.py,sha256=2UqlNb-Kxpg6cuLu2sBEIPTIElwlVBsSpeCgD
|
|
282
282
|
metaflow/plugins/cards/metadata.py,sha256=tACaw7_XNAICZ4A25celIbgxUF0CxHh7BBpFzKrMLTo,487
|
283
283
|
metaflow/plugins/cards/card_modules/__init__.py,sha256=WI2IAsFiKGyqPrHtO9S9-MbyVtUTgWJNL4xjJaBErRo,3437
|
284
284
|
metaflow/plugins/cards/card_modules/base.html,sha256=Y208ZKIZqEWWUcoBFTLTdWKAG0C8xH5lmyCRSjaN2FY,21004
|
285
|
-
metaflow/plugins/cards/card_modules/basic.py,sha256=
|
285
|
+
metaflow/plugins/cards/card_modules/basic.py,sha256=b6aBg7800CjjkQb0J_TOd3JujVR10X2QoXYdwiXFbkE,25831
|
286
286
|
metaflow/plugins/cards/card_modules/bundle.css,sha256=ms2wOKftlPM_i6bC_4BkrmqCOj8mYw9OFvRCJF9FSV4,11981
|
287
287
|
metaflow/plugins/cards/card_modules/card.py,sha256=6sbqP5mwf7QWvQvX2N_bC78H9ixuI5sQ8612Q5islys,4627
|
288
288
|
metaflow/plugins/cards/card_modules/components.py,sha256=Y-Yo7UgSOyTB3zs-wDfUqUKl0PI_BzeY1QGcy2fqE2M,26752
|
289
289
|
metaflow/plugins/cards/card_modules/convert_to_native_type.py,sha256=Vcjqn5rfC0kVMdhqDwsYEjknXTbkG_ppraQrQGaQY_E,16245
|
290
|
-
metaflow/plugins/cards/card_modules/main.
|
290
|
+
metaflow/plugins/cards/card_modules/main.css,sha256=avu7BTB9qj0M8LvqNLUhikUFQhmAJhQQ7REcUgh9zMw,11725
|
291
|
+
metaflow/plugins/cards/card_modules/main.js,sha256=UHwjWFWevGPjOFIzWAqY63j2UdBq_z-LociaG4QVxfU,1043692
|
291
292
|
metaflow/plugins/cards/card_modules/renderer_tools.py,sha256=uiTdKHWFInWgtfWArOUSQLnTwqVd4hAw49jfOfg8rGA,1642
|
292
293
|
metaflow/plugins/cards/card_modules/test_cards.py,sha256=t2PZ3QnjCN_KUlDKxAt2FfK1BX2dp8rqK6TjtkCNyew,5876
|
293
294
|
metaflow/plugins/cards/card_modules/chevron/__init__.py,sha256=SicpH_1eT76HUTA8aMuiGLRNKTqgYD1Qfutt2NdTL0E,156
|
@@ -425,13 +426,13 @@ metaflow/user_decorators/common.py,sha256=0u9NRLQ95TfJCjWVEOGT4MJ9WoQgAMBM9kJ2gJ
|
|
425
426
|
metaflow/user_decorators/mutable_flow.py,sha256=EywKTN3cnXPQF_s62wQaC4a4aH14j8oeqzD3yZaiDxw,19467
|
426
427
|
metaflow/user_decorators/mutable_step.py,sha256=-BY0UDXf_RCAEnC5JlLzEXGdiw1KD9oSrSxS_SWaB9Y,16791
|
427
428
|
metaflow/user_decorators/user_flow_decorator.py,sha256=2yDwZq9QGv9W-7kEuKwa8o4ZkTvuHJ5ESz7VVrGViAI,9890
|
428
|
-
metaflow/user_decorators/user_step_decorator.py,sha256=
|
429
|
-
metaflow-2.17.
|
430
|
-
metaflow-2.17.
|
431
|
-
metaflow-2.17.
|
432
|
-
metaflow-2.17.
|
433
|
-
metaflow-2.17.
|
434
|
-
metaflow-2.17.
|
435
|
-
metaflow-2.17.
|
436
|
-
metaflow-2.17.
|
437
|
-
metaflow-2.17.
|
429
|
+
metaflow/user_decorators/user_step_decorator.py,sha256=bZvg16RUWgfGrAx5tgKT_1aTK7urp0usK59jnV-yR8s,27054
|
430
|
+
metaflow-2.17.2.data/data/share/metaflow/devtools/Makefile,sha256=TT4TCq8ALSfqYyGqDPocN5oPcZe2FqoCZxmGO1LmyCc,13760
|
431
|
+
metaflow-2.17.2.data/data/share/metaflow/devtools/Tiltfile,sha256=Ty5p6AD3MwJAcAnOGv4yMz8fExAsnNQ11r8whK6uzzw,21381
|
432
|
+
metaflow-2.17.2.data/data/share/metaflow/devtools/pick_services.sh,sha256=DCnrMXwtApfx3B4S-YiZESMyAFHbXa3VuNL0MxPLyiE,2196
|
433
|
+
metaflow-2.17.2.dist-info/licenses/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
|
434
|
+
metaflow-2.17.2.dist-info/METADATA,sha256=k7dArvAiiqXpK0U-Hq_JxzJ9gDuJTktKJxJpr5msH8A,6740
|
435
|
+
metaflow-2.17.2.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
|
436
|
+
metaflow-2.17.2.dist-info/entry_points.txt,sha256=RvEq8VFlgGe_FfqGOZi0D7ze1hLD0pAtXeNyGfzc_Yc,103
|
437
|
+
metaflow-2.17.2.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
|
438
|
+
metaflow-2.17.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|