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.

Files changed (29) hide show
  1. metaflow/cli_components/run_cmds.py +15 -0
  2. metaflow/datastore/task_datastore.py +3 -0
  3. metaflow/flowspec.py +91 -1
  4. metaflow/graph.py +154 -13
  5. metaflow/lint.py +94 -3
  6. metaflow/plugins/argo/argo_workflows.py +367 -11
  7. metaflow/plugins/argo/argo_workflows_decorator.py +9 -0
  8. metaflow/plugins/argo/conditional_input_paths.py +21 -0
  9. metaflow/plugins/aws/step_functions/step_functions.py +6 -0
  10. metaflow/plugins/cards/card_modules/basic.py +14 -2
  11. metaflow/plugins/cards/card_modules/main.css +1 -0
  12. metaflow/plugins/cards/card_modules/main.js +31 -31
  13. metaflow/plugins/catch_decorator.py +9 -0
  14. metaflow/plugins/package_cli.py +1 -1
  15. metaflow/plugins/parallel_decorator.py +7 -0
  16. metaflow/runtime.py +217 -34
  17. metaflow/task.py +129 -34
  18. metaflow/user_configs/config_parameters.py +3 -1
  19. metaflow/user_decorators/user_step_decorator.py +31 -6
  20. metaflow/version.py +1 -1
  21. {ob_metaflow-2.17.1.0.dist-info → ob_metaflow-2.18.0.1.dist-info}/METADATA +2 -2
  22. {ob_metaflow-2.17.1.0.dist-info → ob_metaflow-2.18.0.1.dist-info}/RECORD +29 -27
  23. {ob_metaflow-2.17.1.0.data → ob_metaflow-2.18.0.1.data}/data/share/metaflow/devtools/Makefile +0 -0
  24. {ob_metaflow-2.17.1.0.data → ob_metaflow-2.18.0.1.data}/data/share/metaflow/devtools/Tiltfile +0 -0
  25. {ob_metaflow-2.17.1.0.data → ob_metaflow-2.18.0.1.data}/data/share/metaflow/devtools/pick_services.sh +0 -0
  26. {ob_metaflow-2.17.1.0.dist-info → ob_metaflow-2.18.0.1.dist-info}/WHEEL +0 -0
  27. {ob_metaflow-2.17.1.0.dist-info → ob_metaflow-2.18.0.1.dist-info}/entry_points.txt +0 -0
  28. {ob_metaflow-2.17.1.0.dist-info → ob_metaflow-2.18.0.1.dist-info}/licenses/LICENSE +0 -0
  29. {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
- do_next = False
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 have nothing to run
84
- do_next = w.skip_step
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
- if not do_next:
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
- do_next = wrapped_func(self.flow)
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
- do_next = wrapped_func(self.flow, input_obj)
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
- if do_next or raised_exception:
110
- # If we are skipping the step, or executed a wrapped function,
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(do_next, bool) or raised_exception:
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" % do_next
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. The
675
- # foreach case is checked above.
676
- if join_type != "foreach" and len(inputs) != len(node.in_funcs):
677
- raise MetaflowDataMissing(
678
- "Join *%s* expected %d "
679
- "inputs but only %d inputs "
680
- "were found" % (step_name, len(node.in_funcs), len(inputs))
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
- raise exception
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 skipping the step
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
- pass
659
+ except StopIteration as e:
660
+ to_return = e.value
661
+ except Exception as e:
662
+ return e
643
663
  else:
644
- raise MetaflowException(" %s should only yield once" % self)
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.17.1.0"
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.17.1.0
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.17.1.0; extra == "stubs"
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=hCONv0wlC-MgxNUDWzDtS_4ayr-0sqPNUdnpXJ75b1Y,37944
14
- metaflow/graph.py,sha256=alPCQPexm-0hjquQgLYNhoe6PbXL_LXMg1L__G1DxYw,13183
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=x4p6tnRzYqNNniCGXyrUW0WuYfTUgnaOMRivxvnxask,11661
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=KwHKZ6kNZuC8HgL_r0-gTi9Y-GPAhTz0tNXydQFjZO4,77617
32
+ metaflow/runtime.py,sha256=3R44AFI04LWahbfa2v0yDYIWHIz6sau26p1SnzYFNew,86888
33
33
  metaflow/tagging_util.py,sha256=ctyf0Q1gBi0RyZX6J0e9DQGNkNHblV_CITfy66axXB4,2346
34
- metaflow/task.py,sha256=1DslU1CHoEeFIilABQvk4Zbpl-yCdZMEkECnv2LQAZg,34356
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=BSTYiilmAaJnLpNqTlo1aJOoSCKxFfrvjA2GeMaLsag,30
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=xULZQ2UrxLNsWjQIZd38EbOGNBw8UJT7w_T19UbS_fg,11555
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=bEti1X5rvKBQykfvsoAnmHXel_itZbI5MeLrEpWPHPQ,35059
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=UOM2taN_OL2RPpuJhwEOA9ZALm0-hHD0XS2Hn2GUev0,4061
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=4OIBmuSSmQ6utWbeMln9HzQXnC9UYm3SilsHzf_sqbo,2002
209
- metaflow/plugins/parallel_decorator.py,sha256=cUv_CrMwdItDqQScp5bg18JteSS6p0Ms70mCzD5YcNU,9180
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=vdPn3fF1ckJ03u23aY9j2Q9nbZuazsa7tBnQxJsyBU8,191318
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=ogCSBmwsC2C3eusydrgjuAJd4qK18f1sI4jJwA4Fd-o,7800
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=Svz232OA5UewY5W9gfDk-xGqiWyCNPkuUwlPxe9g5j8,53577
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=vFWijqHnil-d337qRztfekgySSkZJjCNLUbhU-u1Csw,25405
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.js,sha256=72mKcMEjrne7TlLxc-LkxTJVoM4z2pLWGtU1NzHtlWM,1043628
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=Loa5wu3vIs0SLyGhbOo8b88nWgCuZ09k24EqC_lI7n4,20890
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=JYNGXONWCpzwn-_bF5WiAkof4Ii9tRS4xdK8ojSxG6M,26007
429
- ob_metaflow-2.17.1.0.data/data/share/metaflow/devtools/Makefile,sha256=TT4TCq8ALSfqYyGqDPocN5oPcZe2FqoCZxmGO1LmyCc,13760
430
- ob_metaflow-2.17.1.0.data/data/share/metaflow/devtools/Tiltfile,sha256=Ty5p6AD3MwJAcAnOGv4yMz8fExAsnNQ11r8whK6uzzw,21381
431
- ob_metaflow-2.17.1.0.data/data/share/metaflow/devtools/pick_services.sh,sha256=DCnrMXwtApfx3B4S-YiZESMyAFHbXa3VuNL0MxPLyiE,2196
432
- ob_metaflow-2.17.1.0.dist-info/licenses/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
433
- ob_metaflow-2.17.1.0.dist-info/METADATA,sha256=2pWayM0wZWVziunp1PLGQUlUg2f64gEumfQc24e6zrQ,5935
434
- ob_metaflow-2.17.1.0.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
435
- ob_metaflow-2.17.1.0.dist-info/entry_points.txt,sha256=RvEq8VFlgGe_FfqGOZi0D7ze1hLD0pAtXeNyGfzc_Yc,103
436
- ob_metaflow-2.17.1.0.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
437
- ob_metaflow-2.17.1.0.dist-info/RECORD,,
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,,