metaflow 2.13.3__py2.py3-none-any.whl → 2.13.4__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.py CHANGED
@@ -504,6 +504,11 @@ def start(
504
504
  # *after* the run decospecs so that they don't take precedence. In other
505
505
  # words, for the same decorator, we want `myflow.py run --with foo` to
506
506
  # take precedence over any other `foo` decospec
507
+
508
+ # Note that top-level decospecs are used primarily with non run/resume
509
+ # options as well as with the airflow/argo/sfn integrations which pass
510
+ # all the decospecs (the ones from top-level but also the ones from the
511
+ # run/resume level) through the tl decospecs.
507
512
  ctx.obj.tl_decospecs = list(decospecs or [])
508
513
 
509
514
  # initialize current and parameter context for deploy-time parameters
@@ -39,6 +39,8 @@ def before_run(obj, tags, decospecs):
39
39
  + list(obj.environment.decospecs() or [])
40
40
  )
41
41
  if all_decospecs:
42
+ # These decospecs are the ones from run/resume PLUS the ones from the
43
+ # environment (for example the @conda)
42
44
  decorators._attach_decorators(obj.flow, all_decospecs)
43
45
  decorators._init(obj.flow)
44
46
  # Regenerate graph if we attached more decorators
@@ -77,14 +77,6 @@ from ..util import decompress_list
77
77
  default=None,
78
78
  help="Run id of the origin flow, if this task is part of a flow being resumed.",
79
79
  )
80
- @click.option(
81
- "--with",
82
- "decospecs",
83
- multiple=True,
84
- help="Add a decorator to this task. You can specify this "
85
- "option multiple times to attach multiple decorators "
86
- "to this task.",
87
- )
88
80
  @click.option(
89
81
  "--ubf-context",
90
82
  default="none",
@@ -112,7 +104,6 @@ def step(
112
104
  max_user_code_retries=None,
113
105
  clone_only=None,
114
106
  clone_run_id=None,
115
- decospecs=None,
116
107
  ubf_context="none",
117
108
  num_parallel=None,
118
109
  ):
@@ -136,10 +127,6 @@ def step(
136
127
  raise CommandException("Function *%s* is not a step." % step_name)
137
128
  echo("Executing a step, *%s*" % step_name, fg="magenta", bold=False)
138
129
 
139
- if decospecs:
140
- decorators._attach_decorators_to_step(func, decospecs)
141
- decorators._init(ctx.obj.flow)
142
-
143
130
  step_kwargs = ctx.params
144
131
  # Remove argument `step_name` from `step_kwargs`.
145
132
  step_kwargs.pop("step_name", None)
metaflow/decorators.py CHANGED
@@ -150,8 +150,8 @@ class Decorator(object):
150
150
  return
151
151
 
152
152
  # Note that by design, later values override previous ones.
153
- self.attributes = unpack_delayed_evaluator(self.attributes)
154
- self._user_defined_attributes.update(self.attributes.keys())
153
+ self.attributes, new_user_attributes = unpack_delayed_evaluator(self.attributes)
154
+ self._user_defined_attributes.update(new_user_attributes)
155
155
  self.attributes = resolve_delayed_evaluator(self.attributes)
156
156
 
157
157
  self._ran_init = True
metaflow/parameters.py CHANGED
@@ -367,7 +367,9 @@ class Parameter(object):
367
367
  )
368
368
 
369
369
  # Resolve any value from configurations
370
- self.kwargs = unpack_delayed_evaluator(self.kwargs, ignore_errors=ignore_errors)
370
+ self.kwargs, _ = unpack_delayed_evaluator(
371
+ self.kwargs, ignore_errors=ignore_errors
372
+ )
371
373
  # Do it one item at a time so errors are ignored at that level (as opposed to
372
374
  # at the entire kwargs level)
373
375
  self.kwargs = {
@@ -76,6 +76,12 @@ class CardDecorator(StepDecorator):
76
76
 
77
77
  card_creator = None
78
78
 
79
+ _config_values = None
80
+
81
+ _config_file_name = None
82
+
83
+ task_finished_decos = 0
84
+
79
85
  def __init__(self, *args, **kwargs):
80
86
  super(CardDecorator, self).__init__(*args, **kwargs)
81
87
  self._task_datastore = None
@@ -106,6 +112,25 @@ class CardDecorator(StepDecorator):
106
112
  def _increment_step_counter(cls):
107
113
  cls.step_counter += 1
108
114
 
115
+ @classmethod
116
+ def _increment_completed_counter(cls):
117
+ cls.task_finished_decos += 1
118
+
119
+ @classmethod
120
+ def _set_config_values(cls, config_values):
121
+ cls._config_values = config_values
122
+
123
+ @classmethod
124
+ def _set_config_file_name(cls, flow):
125
+ # Only create a config file from the very first card decorator.
126
+ if cls._config_values and not cls._config_file_name:
127
+ with tempfile.NamedTemporaryFile(
128
+ mode="w", encoding="utf-8", delete=False
129
+ ) as config_file:
130
+ config_value = dump_config_values(flow)
131
+ json.dump(config_value, config_file)
132
+ cls._config_file_name = config_file.name
133
+
109
134
  def step_init(
110
135
  self, flow, graph, step_name, decorators, environment, flow_datastore, logger
111
136
  ):
@@ -116,11 +141,13 @@ class CardDecorator(StepDecorator):
116
141
 
117
142
  # We check for configuration options. We do this here before they are
118
143
  # converted to properties.
119
- self._config_values = [
120
- (config.name, ConfigInput.make_key_name(config.name))
121
- for _, config in flow._get_parameters()
122
- if config.IS_CONFIG_PARAMETER
123
- ]
144
+ self._set_config_values(
145
+ [
146
+ (config.name, ConfigInput.make_key_name(config.name))
147
+ for _, config in flow._get_parameters()
148
+ if config.IS_CONFIG_PARAMETER
149
+ ]
150
+ )
124
151
 
125
152
  self.card_options = self.attributes["options"]
126
153
 
@@ -159,15 +186,11 @@ class CardDecorator(StepDecorator):
159
186
 
160
187
  # If we have configs, we need to dump them to a file so we can re-use them
161
188
  # when calling the card creation subprocess.
162
- if self._config_values:
163
- with tempfile.NamedTemporaryFile(
164
- mode="w", encoding="utf-8", delete=False
165
- ) as config_file:
166
- config_value = dump_config_values(flow)
167
- json.dump(config_value, config_file)
168
- self._config_file_name = config_file.name
169
- else:
170
- self._config_file_name = None
189
+ # Since a step can contain multiple card decorators, and all the card creation processes
190
+ # will reference the same config file (because of how the CardCreator is created (only single class instance)),
191
+ # we need to ensure that a single config file is being referenced for all card create commands.
192
+ # This config file will be removed when the last card decorator has finished creating its card.
193
+ self._set_config_file_name(flow)
171
194
 
172
195
  card_type = self.attributes["type"]
173
196
  card_class = get_card_class(card_type)
@@ -246,12 +269,7 @@ class CardDecorator(StepDecorator):
246
269
  self.card_creator.create(mode="render", final=True, **create_options)
247
270
  self.card_creator.create(mode="refresh", final=True, **create_options)
248
271
 
249
- # Unlink the config file if it exists
250
- if self._config_file_name:
251
- try:
252
- os.unlink(self._config_file_name)
253
- except Exception as e:
254
- pass
272
+ self._cleanup(step_name)
255
273
 
256
274
  @staticmethod
257
275
  def _options(mapping):
@@ -286,3 +304,18 @@ class CardDecorator(StepDecorator):
286
304
  top_level_options["local-config-file"] = self._config_file_name
287
305
 
288
306
  return list(self._options(top_level_options))
307
+
308
+ def task_exception(
309
+ self, exception, step_name, flow, graph, retry_count, max_user_code_retries
310
+ ):
311
+ self._cleanup(step_name)
312
+
313
+ def _cleanup(self, step_name):
314
+ self._increment_completed_counter()
315
+ if self.task_finished_decos == self.total_decos_on_step[step_name]:
316
+ # Unlink the config file if it exists
317
+ if self._config_file_name:
318
+ try:
319
+ os.unlink(self._config_file_name)
320
+ except Exception as e:
321
+ pass
@@ -362,11 +362,7 @@ class TriggerOnFinishDecorator(FlowDecorator):
362
362
  """
363
363
 
364
364
  name = "trigger_on_finish"
365
- defaults = {
366
- "flow": None, # flow_name or project_flow_name
367
- "flows": [], # flow_names or project_flow_names
368
- "options": {},
369
- }
365
+
370
366
  options = {
371
367
  "trigger": dict(
372
368
  multiple=True,
@@ -374,6 +370,14 @@ class TriggerOnFinishDecorator(FlowDecorator):
374
370
  help="Specify run pathspec for testing @trigger_on_finish locally.",
375
371
  ),
376
372
  }
373
+ defaults = {
374
+ "flow": None, # flow_name or project_flow_name
375
+ "flows": [], # flow_names or project_flow_names
376
+ "options": {},
377
+ # Re-enable if you want to support TL options directly in the decorator like
378
+ # for @project decorator
379
+ # **{k: v["default"] for k, v in options.items()},
380
+ }
377
381
 
378
382
  def flow_init(
379
383
  self,
@@ -539,13 +543,43 @@ class TriggerOnFinishDecorator(FlowDecorator):
539
543
  self.options = self.attributes["options"]
540
544
 
541
545
  # Handle scenario for local testing using --trigger.
546
+
547
+ # Re-enable this code if you want to support passing trigger directly in the
548
+ # decorator in a way similar to how production and branch are passed in the
549
+ # project decorator.
550
+
551
+ # # This is overkill since default is None for all options but adding this code
552
+ # # to make it safe if other non None-default options are added in the future.
553
+ # for op in options:
554
+ # if (
555
+ # op in self._user_defined_attributes
556
+ # and options[op] != self.defaults[op]
557
+ # and self.attributes[op] != options[op]
558
+ # ):
559
+ # # Exception if:
560
+ # # - the user provides a value in the attributes field
561
+ # # - AND the user provided a value in the command line (non default)
562
+ # # - AND the values are different
563
+ # # Note that this won't raise an error if the user provided the default
564
+ # # value in the command line and provided one in attribute but although
565
+ # # slightly inconsistent, it is not incorrect.
566
+ # raise MetaflowException(
567
+ # "You cannot pass %s as both a command-line argument and an attribute "
568
+ # "of the @trigger_on_finish decorator." % op
569
+ # )
570
+
571
+ # if "trigger" in self._user_defined_attributes:
572
+ # trigger_option = self.attributes["trigger"]
573
+ # else:
574
+ trigger_option = options["trigger"]
575
+
542
576
  self._option_values = options
543
- if options["trigger"]:
577
+ if trigger_option:
544
578
  from metaflow import Run
545
579
  from metaflow.events import Trigger
546
580
 
547
581
  run_objs = []
548
- for run_pathspec in options["trigger"]:
582
+ for run_pathspec in trigger_option:
549
583
  if len(run_pathspec.split("/")) != 2:
550
584
  raise MetaflowException(
551
585
  "Incorrect format for run pathspec for *--trigger*. "
@@ -72,7 +72,6 @@ class ProjectDecorator(FlowDecorator):
72
72
  """
73
73
 
74
74
  name = "project"
75
- defaults = {"name": None}
76
75
 
77
76
  options = {
78
77
  "production": dict(
@@ -91,19 +90,48 @@ class ProjectDecorator(FlowDecorator):
91
90
  ),
92
91
  }
93
92
 
93
+ defaults = {"name": None, **{k: v["default"] for k, v in options.items()}}
94
+
94
95
  def flow_init(
95
96
  self, flow, graph, environment, flow_datastore, metadata, logger, echo, options
96
97
  ):
97
98
  self._option_values = options
98
99
  project_name = self.attributes.get("name")
100
+ for op in options:
101
+ if (
102
+ op in self._user_defined_attributes
103
+ and options[op] != self.defaults[op]
104
+ and self.attributes[op] != options[op]
105
+ ):
106
+ # Exception if:
107
+ # - the user provides a value in the attributes field
108
+ # - AND the user provided a value in the command line (non default)
109
+ # - AND the values are different
110
+ # Note that this won't raise an error if the user provided the default
111
+ # value in the command line and provided one in attribute but although
112
+ # slightly inconsistent, it is not incorrect.
113
+ raise MetaflowException(
114
+ "You cannot pass %s as both a command-line argument and an attribute "
115
+ "of the @project decorator." % op
116
+ )
117
+ if "branch" in self._user_defined_attributes:
118
+ project_branch = self.attributes["branch"]
119
+ else:
120
+ project_branch = options["branch"]
121
+
122
+ if "production" in self._user_defined_attributes:
123
+ project_production = self.attributes["production"]
124
+ else:
125
+ project_production = options["production"]
126
+
99
127
  project_flow_name, branch_name = format_name(
100
128
  flow.name,
101
129
  project_name,
102
- options["production"],
103
- options["branch"],
130
+ project_production,
131
+ project_branch,
104
132
  get_username(),
105
133
  )
106
- is_user_branch = options["branch"] is None and not options["production"]
134
+ is_user_branch = project_branch is None and not project_production
107
135
  echo(
108
136
  "Project: *%s*, Branch: *%s*" % (project_name, branch_name),
109
137
  fg="magenta",
@@ -114,7 +142,7 @@ class ProjectDecorator(FlowDecorator):
114
142
  "project_name": project_name,
115
143
  "branch_name": branch_name,
116
144
  "is_user_branch": is_user_branch,
117
- "is_production": options["production"],
145
+ "is_production": project_production,
118
146
  "project_flow_name": project_flow_name,
119
147
  }
120
148
  )
@@ -3,7 +3,7 @@ import json
3
3
  import os
4
4
  import re
5
5
 
6
- from typing import Any, Callable, Dict, Optional, TYPE_CHECKING, Union
6
+ from typing import Any, Callable, Dict, List, Optional, Tuple, TYPE_CHECKING, Union
7
7
 
8
8
 
9
9
  from ..exception import MetaflowException
@@ -171,7 +171,7 @@ class DelayEvaluator(collections.abc.Mapping):
171
171
  yield "%s%d" % (UNPACK_KEY, id(self))
172
172
 
173
173
  def __getitem__(self, key):
174
- if key == "%s%d" % (UNPACK_KEY, id(self)):
174
+ if isinstance(key, str) and key == "%s%d" % (UNPACK_KEY, id(self)):
175
175
  return self
176
176
  if self._access is None:
177
177
  raise KeyError(key)
@@ -196,12 +196,23 @@ class DelayEvaluator(collections.abc.Mapping):
196
196
  if flow_cls is None:
197
197
  # We are not executing inside a flow (ie: not the CLI)
198
198
  raise MetaflowException(
199
- "Config object can only be used directly in the FlowSpec defining them. "
200
- "If using outside of the FlowSpec, please use ConfigEval"
199
+ "Config object can only be used directly in the FlowSpec defining them "
200
+ "(or their flow decorators)."
201
201
  )
202
202
  if self._access is not None:
203
203
  # Build the final expression by adding all the fields in access as . fields
204
- self._config_expr = ".".join([self._config_expr] + self._access)
204
+ access_list = [self._config_expr]
205
+ for a in self._access:
206
+ if isinstance(a, str):
207
+ access_list.append(a)
208
+ elif isinstance(a, DelayEvaluator):
209
+ # Supports things like config[other_config.selector].var
210
+ access_list.append(a())
211
+ else:
212
+ raise MetaflowException(
213
+ "Field '%s' of type '%s' is not supported" % (str(a), type(a))
214
+ )
215
+ self._config_expr = ".".join(access_list)
205
216
  # Evaluate the expression setting the config values as local variables
206
217
  try:
207
218
  return eval(
@@ -369,7 +380,7 @@ class Config(Parameter, collections.abc.Mapping):
369
380
 
370
381
  def __getitem__(self, key):
371
382
  self._init_delayed_evaluator()
372
- if key.startswith(UNPACK_KEY):
383
+ if isinstance(key, str) and key.startswith(UNPACK_KEY):
373
384
  return self._delayed_evaluator[key]
374
385
  return DelayEvaluator(self.name.lower())[key]
375
386
 
@@ -406,17 +417,20 @@ def resolve_delayed_evaluator(v: Any, ignore_errors: bool = False) -> Any:
406
417
 
407
418
  def unpack_delayed_evaluator(
408
419
  to_unpack: Dict[str, Any], ignore_errors: bool = False
409
- ) -> Dict[str, Any]:
420
+ ) -> Tuple[Dict[str, Any], List[str]]:
410
421
  result = {}
422
+ new_keys = []
411
423
  for k, v in to_unpack.items():
412
424
  if not isinstance(k, str) or not k.startswith(UNPACK_KEY):
413
425
  result[k] = v
414
426
  else:
415
427
  # k.startswith(UNPACK_KEY)
416
428
  try:
417
- result.update(resolve_delayed_evaluator(v))
429
+ new_vals = resolve_delayed_evaluator(v)
430
+ new_keys.extend(new_vals.keys())
431
+ result.update(new_vals)
418
432
  except Exception as e:
419
433
  if ignore_errors:
420
434
  continue
421
435
  raise e
422
- return result
436
+ return result, new_keys
metaflow/version.py CHANGED
@@ -1 +1 @@
1
- metaflow_version = "2.13.3"
1
+ metaflow_version = "2.13.4"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: metaflow
3
- Version: 2.13.3
3
+ Version: 2.13.4
4
4
  Summary: Metaflow: More Data Science, 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.13.3; extra == "stubs"
29
+ Requires-Dist: metaflow-stubs==2.13.4; extra == "stubs"
30
30
  Dynamic: author
31
31
  Dynamic: author-email
32
32
  Dynamic: classifier
@@ -1,12 +1,12 @@
1
1
  metaflow/R.py,sha256=CqVfIatvmjciuICNnoyyNGrwE7Va9iXfLdFbQa52hwA,3958
2
2
  metaflow/__init__.py,sha256=fbhdWiWnEoAX4KnzRHMY_iQcT-uYlMWhzrXPKvK0i5g,5832
3
3
  metaflow/cards.py,sha256=IbRmredvmFEU0V6JL7DR8wCESwVmmZJubr6x24bo7U4,442
4
- metaflow/cli.py,sha256=IfUZd9fiUrT_MaSUnahmdPXK81DB06NNhUO2aXe0_PI,21600
4
+ metaflow/cli.py,sha256=zTXaVpfAa0NBvAbBe7trS1kMRkzOIdt7_Vi1q6J1FGQ,21877
5
5
  metaflow/cli_args.py,sha256=muIh9pdVqMRG09uAYFKcAcUKFyDE4N3Wm6YahWRaUNI,3594
6
6
  metaflow/clone_util.py,sha256=LSuVbFpPUh92UW32DBcnZbL0FFw-4w3CLa0tpEbCkzk,2066
7
7
  metaflow/cmd_with_io.py,sha256=kl53HkAIyv0ecpItv08wZYczv7u3msD1VCcciqigqf0,588
8
8
  metaflow/debug.py,sha256=HEmt_16tJtqHXQXsqD9pqOFe3CWR5GZ7VwpaYQgnRdU,1466
9
- metaflow/decorators.py,sha256=BxzcxPkc8SvVTDD5pNhE3bmy7bYn6pBPEF-WYjnw-MY,23911
9
+ metaflow/decorators.py,sha256=5xgIUuIcO52dKGUQ8fe-pmULdXIUwwMy86Uz2OZxOkw,23929
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
@@ -25,7 +25,7 @@ metaflow/metaflow_version.py,sha256=duhIzfKZtcxMVMs2uiBqBvUarSHJqyWDwMhaBOQd_g0,
25
25
  metaflow/monitor.py,sha256=T0NMaBPvXynlJAO_avKtk8OIIRMyEuMAyF8bIp79aZU,5323
26
26
  metaflow/multicore_utils.py,sha256=yEo5T6Gemn4_vl8b6IOz7fsTUYtEyqa3AaKZgJY96Wc,4974
27
27
  metaflow/package.py,sha256=yfwVMVB1mD-Sw94KwXNK3N-26YHoKMn6btrcgd67Izs,7845
28
- metaflow/parameters.py,sha256=3mCV8d-Bj7n2sByl0pN3hRVLXvYnSL9c53_wxWGSwG8,18596
28
+ metaflow/parameters.py,sha256=ycSTJzQc3rOburSl9prD__qgCxlPU0Cx8ntdEYuzoYU,18621
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=zzBY9YaSUZOGH-ypDKAv2B_7XcoyMZj-zCoCrmYqNRc,2865
@@ -36,7 +36,7 @@ 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=hKjHl6NYJkKBSU2tzdVbddfOX1zWK73T4GCO42A0XB4,14666
38
38
  metaflow/vendor.py,sha256=FchtA9tH22JM-eEtJ2c9FpUdMn8sSb1VHuQS56EcdZk,5139
39
- metaflow/version.py,sha256=vTW1Ih7wy7uSI7lhDQCu5vyGmRMRnjva76buvTQFNsQ,28
39
+ metaflow/version.py,sha256=drr-g04woqZf71pNYGX7pz8CSPausyn9M8cgyFIvKlE,28
40
40
  metaflow/_vendor/__init__.py,sha256=y_CiwUD3l4eAKvTVDZeqgVujMy31cAM1qjAB-HfI-9s,353
41
41
  metaflow/_vendor/typing_extensions.py,sha256=0nUs5p1A_UrZigrAVBoOEM6TxU37zzPDUtiij1ZwpNc,110417
42
42
  metaflow/_vendor/zipp.py,sha256=ajztOH-9I7KA_4wqDYygtHa6xUBVZgFpmZ8FE74HHHI,8425
@@ -113,8 +113,8 @@ metaflow/_vendor/v3_6/importlib_metadata/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCe
113
113
  metaflow/cli_components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
114
114
  metaflow/cli_components/dump_cmd.py,sha256=SZEX51BWNd1o3H2uHDkYA8KRvou5X8g5rTwpdu5vnNQ,2704
115
115
  metaflow/cli_components/init_cmd.py,sha256=Er-BO59UEUV1HIsg81bRtZWT2D2IZNMp93l-AoZLCls,1519
116
- metaflow/cli_components/run_cmds.py,sha256=yBJfmQiICi2yEIluy9yixPb4IE84U6b4e_oiIrq7nKY,10437
117
- metaflow/cli_components/step_cmd.py,sha256=Mkztidy-wxYH7KyLSVsWK7SeYPJIeihpDClzTn9-2oo,5057
116
+ metaflow/cli_components/run_cmds.py,sha256=BMkki6gwtJw0ULLP0XkrwZvxWDE5BV10KCfZn6-gIEo,10562
117
+ metaflow/cli_components/step_cmd.py,sha256=oIkJRdCzXTPmSPEuCHYfjp7Cat_3jBY2StbuEkTPH2I,4706
118
118
  metaflow/cli_components/utils.py,sha256=gpoDociadjnJD7MuiJup_MDR02ZJjjleejr0jPBu29c,6057
119
119
  metaflow/client/__init__.py,sha256=1GtQB4Y_CBkzaxg32L1syNQSlfj762wmLrfrDxGi1b8,226
120
120
  metaflow/client/core.py,sha256=Ka6G12h6pS_046cej0c8npvaBGpiKyvJ1bGbRFZL6Kg,75437
@@ -154,11 +154,11 @@ metaflow/plugins/catch_decorator.py,sha256=UOM2taN_OL2RPpuJhwEOA9ZALm0-hHD0XS2Hn
154
154
  metaflow/plugins/debug_logger.py,sha256=mcF5HYzJ0NQmqCMjyVUk3iAP-heroHRIiVWQC6Ha2-I,879
155
155
  metaflow/plugins/debug_monitor.py,sha256=Md5X_sDOSssN9pt2D8YcaIjTK5JaQD55UAYTcF6xYF0,1099
156
156
  metaflow/plugins/environment_decorator.py,sha256=6m9j2B77d-Ja_l_9CTJ__0O6aB2a8Qt_lAZu6UjAcUA,587
157
- metaflow/plugins/events_decorator.py,sha256=8YSapp_sT3UzNrb6cYBJ19-wmX_CKow6OOJN8kNVnpg,26456
157
+ metaflow/plugins/events_decorator.py,sha256=WsLcuy-FmXpQ6mvm431deTB2hE-fPYILgbVSWHRXslQ,28121
158
158
  metaflow/plugins/logs_cli.py,sha256=77W5UNagU2mOKSMMvrQxQmBLRzvmjK-c8dWxd-Ygbqs,11410
159
159
  metaflow/plugins/package_cli.py,sha256=-J6D4cupHfWSZ4GEFo2yy9Je9oL3owRWm5pEJwaiqd4,1649
160
160
  metaflow/plugins/parallel_decorator.py,sha256=GR6LKIW7_S7AoU50Ar2_0nndVtO2epdn3LuthE0vKMQ,9127
161
- metaflow/plugins/project_decorator.py,sha256=eJOe0Ea7CbUCReEhR_XQvRkhV6jyRqDxM72oZI7EMCk,5336
161
+ metaflow/plugins/project_decorator.py,sha256=_hMh1-wEGQxckBYw3020auPccGkIaCXvqdT8kGrEJLU,6630
162
162
  metaflow/plugins/resources_decorator.py,sha256=AtoOwg4mHYHYthg-CAfbfam-QiT0ViuDLDoukoDvF6Q,1347
163
163
  metaflow/plugins/retry_decorator.py,sha256=tz_2Tq6GLg3vjDBZp0KKVTk3ADlCvqaWTSf7blmFdUw,1548
164
164
  metaflow/plugins/storage_executor.py,sha256=FqAgR0-L9MuqN8fRtTe4jjUfJL9lqt6fQkYaglAjRbk,6137
@@ -224,7 +224,7 @@ metaflow/plugins/cards/card_cli.py,sha256=XyiU5f6i_xjFHPyowWGs9mKQm9fm3dK6id-IKs
224
224
  metaflow/plugins/cards/card_client.py,sha256=30dFBoC3axc261GeV7QCIs_V1OHhRtS31S0wEWsjw90,9501
225
225
  metaflow/plugins/cards/card_creator.py,sha256=vRz1EUFa4xQ1fUIWzqyACViC6D7KGFaq5XlLIEssXTI,7741
226
226
  metaflow/plugins/cards/card_datastore.py,sha256=3K19wE0CZVvOpuYUytftIYYnHHn3pMZJE87FMD6OYlM,14244
227
- metaflow/plugins/cards/card_decorator.py,sha256=bEiHVrlvhbR51Y1qVlQ5WrYCtjZDl5IW9df2JqouBgg,10804
227
+ metaflow/plugins/cards/card_decorator.py,sha256=nU-uZ4_ubU7bCsSb6uT61YnN8ruo43_FzqZ24MsZpKg,12070
228
228
  metaflow/plugins/cards/card_resolver.py,sha256=bjyujYpGUFbLJNwXNGHlHhL4f-gVdVKebl7XW1vWDtE,717
229
229
  metaflow/plugins/cards/card_server.py,sha256=DHv0RcepaPULWbkDahiEMrU5A281Cfb0DvHLUYd8JsU,11772
230
230
  metaflow/plugins/cards/component_serializer.py,sha256=gxG5leRVJEzMqRYKs3vIzy2ijFNEI3fX1AzHgfX-D8A,37249
@@ -357,10 +357,10 @@ metaflow/tutorials/08-autopilot/autopilot.ipynb,sha256=DQoJlILV7Mq9vfPBGW-QV_kNh
357
357
  metaflow/user_configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
358
358
  metaflow/user_configs/config_decorators.py,sha256=Tj0H88UT8Q6pylXxHXgiA6cqnNlw4d3mR7M8J9g3ZUg,20139
359
359
  metaflow/user_configs/config_options.py,sha256=Knpiax_YGmYAdR3zKmaepN8puW1MyL9g6-eMGAkcylo,20942
360
- metaflow/user_configs/config_parameters.py,sha256=lWWqJ5BSvCEZIL_JTmy9sYmmyPhgh7wj6Zy_U9TRSFQ,14763
361
- metaflow-2.13.3.dist-info/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
362
- metaflow-2.13.3.dist-info/METADATA,sha256=pWisXiUY5xDzvsAWZa5jyaDBAzWkyOFXZ3m8lDpEz-g,6121
363
- metaflow-2.13.3.dist-info/WHEEL,sha256=9Hm2OB-j1QcCUq9Jguht7ayGIIZBRTdOXD1qg9cCgPM,109
364
- metaflow-2.13.3.dist-info/entry_points.txt,sha256=IKwTN1T3I5eJL3uo_vnkyxVffcgnRdFbKwlghZfn27k,57
365
- metaflow-2.13.3.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
366
- metaflow-2.13.3.dist-info/RECORD,,
360
+ metaflow/user_configs/config_parameters.py,sha256=T0Zz18o9zKEV7mMcKotFWvXixhJpotLRBVrKx6ENErQ,15416
361
+ metaflow-2.13.4.dist-info/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
362
+ metaflow-2.13.4.dist-info/METADATA,sha256=PBmkd2ZuaamBlNTJCyBWZWWVO8xs8J1anqV4YV_P4kQ,6121
363
+ metaflow-2.13.4.dist-info/WHEEL,sha256=9Hm2OB-j1QcCUq9Jguht7ayGIIZBRTdOXD1qg9cCgPM,109
364
+ metaflow-2.13.4.dist-info/entry_points.txt,sha256=IKwTN1T3I5eJL3uo_vnkyxVffcgnRdFbKwlghZfn27k,57
365
+ metaflow-2.13.4.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
366
+ metaflow-2.13.4.dist-info/RECORD,,