metaflow 2.12.38__py2.py3-none-any.whl → 2.13__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.
Files changed (41) hide show
  1. metaflow/__init__.py +1 -1
  2. metaflow/cli.py +111 -36
  3. metaflow/cli_args.py +2 -2
  4. metaflow/cli_components/run_cmds.py +3 -1
  5. metaflow/datastore/flow_datastore.py +2 -2
  6. metaflow/exception.py +8 -2
  7. metaflow/flowspec.py +48 -36
  8. metaflow/graph.py +28 -27
  9. metaflow/includefile.py +2 -2
  10. metaflow/lint.py +35 -20
  11. metaflow/metaflow_config.py +5 -0
  12. metaflow/parameters.py +11 -4
  13. metaflow/plugins/argo/argo_workflows_deployer_objects.py +47 -1
  14. metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +13 -10
  15. metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +3 -0
  16. metaflow/plugins/cards/card_creator.py +1 -0
  17. metaflow/plugins/cards/card_decorator.py +46 -8
  18. metaflow/plugins/pypi/bootstrap.py +196 -61
  19. metaflow/plugins/pypi/conda_decorator.py +14 -26
  20. metaflow/plugins/pypi/conda_environment.py +76 -21
  21. metaflow/plugins/pypi/micromamba.py +42 -15
  22. metaflow/plugins/pypi/pip.py +8 -3
  23. metaflow/plugins/pypi/pypi_decorator.py +10 -9
  24. metaflow/runner/click_api.py +175 -39
  25. metaflow/runner/deployer.py +1 -1
  26. metaflow/runner/deployer_impl.py +8 -3
  27. metaflow/runner/metaflow_runner.py +10 -2
  28. metaflow/runner/nbdeploy.py +2 -0
  29. metaflow/runner/nbrun.py +1 -1
  30. metaflow/runner/subprocess_manager.py +3 -1
  31. metaflow/runner/utils.py +41 -19
  32. metaflow/user_configs/config_options.py +87 -34
  33. metaflow/user_configs/config_parameters.py +44 -25
  34. metaflow/util.py +2 -2
  35. metaflow/version.py +1 -1
  36. {metaflow-2.12.38.dist-info → metaflow-2.13.dist-info}/METADATA +2 -2
  37. {metaflow-2.12.38.dist-info → metaflow-2.13.dist-info}/RECORD +41 -41
  38. {metaflow-2.12.38.dist-info → metaflow-2.13.dist-info}/LICENSE +0 -0
  39. {metaflow-2.12.38.dist-info → metaflow-2.13.dist-info}/WHEEL +0 -0
  40. {metaflow-2.12.38.dist-info → metaflow-2.13.dist-info}/entry_points.txt +0 -0
  41. {metaflow-2.12.38.dist-info → metaflow-2.13.dist-info}/top_level.txt +0 -0
@@ -15,7 +15,7 @@ from ..util import get_username
15
15
 
16
16
  _CONVERT_PREFIX = "@!c!@:"
17
17
  _DEFAULT_PREFIX = "@!d!@:"
18
- _NO_FILE = "@!n!@"
18
+ _NO_FILE = "@!n!@:"
19
19
 
20
20
  _CONVERTED_DEFAULT = _CONVERT_PREFIX + _DEFAULT_PREFIX
21
21
  _CONVERTED_NO_FILE = _CONVERT_PREFIX + _NO_FILE
@@ -41,7 +41,8 @@ class ConvertPath(click.Path):
41
41
  is_default = False
42
42
  if value and value.startswith(_DEFAULT_PREFIX):
43
43
  is_default = True
44
- value = super().convert(value[len(_DEFAULT_PREFIX) :], param, ctx)
44
+ value = value[len(_DEFAULT_PREFIX) :]
45
+ value = super().convert(value, param, ctx)
45
46
  return self.convert_value(value, is_default)
46
47
 
47
48
  @staticmethod
@@ -170,7 +171,15 @@ class ConfigInput:
170
171
  cls.loaded_configs = all_configs
171
172
  return cls.loaded_configs.get(config_name, None)
172
173
 
173
- def process_configs(self, ctx, param, value):
174
+ def process_configs(
175
+ self,
176
+ flow_name: str,
177
+ param_name: str,
178
+ param_value: Dict[str, Optional[str]],
179
+ quiet: bool,
180
+ datastore: str,
181
+ click_obj: Optional[Any] = None,
182
+ ):
174
183
  from ..cli import echo_always, echo_dev_null # Prevent circular import
175
184
  from ..flowspec import _FlowState # Prevent circular import
176
185
 
@@ -198,31 +207,32 @@ class ConfigInput:
198
207
  # - the default (including None if there is no default). If the default is
199
208
  # not None, it will start with _CONVERTED_DEFAULT since Click will make
200
209
  # the value go through ConvertPath or ConvertDictOrStr
201
- # - the actual value passed through prefixed with _CONVERT_PREFIX
210
+ # - the actual value passed through prefixed with _CONVERT_PREFIX
202
211
 
203
212
  debug.userconf_exec(
204
213
  "Processing configs for %s -- incoming values: %s"
205
- % (param.name, str(value))
214
+ % (param_name, str(param_value))
206
215
  )
207
216
 
208
217
  do_return = self._value_values is None and self._path_values is None
209
218
  # We only keep around non default values. We could simplify by checking just one
210
219
  # value and if it is default it means all are but this doesn't seem much more effort
211
220
  # and is clearer
212
- if param.name == "config_value_options":
221
+ if param_name == "config_value":
213
222
  self._value_values = {
214
223
  k.lower(): v
215
- for k, v in value
224
+ for k, v in param_value
216
225
  if v is not None and not v.startswith(_CONVERTED_DEFAULT)
217
226
  }
218
227
  else:
219
228
  self._path_values = {
220
229
  k.lower(): v
221
- for k, v in value
230
+ for k, v in param_value
222
231
  if v is not None and not v.startswith(_CONVERTED_DEFAULT)
223
232
  }
224
233
  if do_return:
225
- # One of config_value_options or config_file_options will be None
234
+ # One of values["value"] or values["path"] is None -- we are in the first
235
+ # go around
226
236
  debug.userconf_exec("Incomplete config options; waiting for more")
227
237
  return None
228
238
 
@@ -233,8 +243,13 @@ class ConfigInput:
233
243
  # down configurations (like METAFLOW_FLOW_CONFIG) could still be present and
234
244
  # would cause an issue -- we can ignore those as the kv. values should trump
235
245
  # everything else.
246
+ # NOTE: These are all *non default* keys
236
247
  all_keys = set(self._value_values).union(self._path_values)
237
- # Make sure we have at least some keys (ie: some non default values)
248
+
249
+ if all_keys and click_obj:
250
+ click_obj.has_cl_config_options = True
251
+ # Make sure we have at least some non default keys (we need some if we have
252
+ # all kv)
238
253
  has_all_kv = all_keys and all(
239
254
  self._value_values.get(k, "").startswith(_CONVERT_PREFIX + "kv.")
240
255
  for k in all_keys
@@ -244,27 +259,35 @@ class ConfigInput:
244
259
  to_return = {}
245
260
 
246
261
  if not has_all_kv:
247
- # Check that the user didn't provide *both* a path and a value.
262
+ # Check that the user didn't provide *both* a path and a value. Again, these
263
+ # are only user-provided (not defaults)
248
264
  common_keys = set(self._value_values or []).intersection(
249
265
  [k for k, v in self._path_values.items()] or []
250
266
  )
251
267
  if common_keys:
252
- raise click.UsageError(
268
+ exc = click.UsageError(
253
269
  "Cannot provide both a value and a file for the same configuration. "
254
270
  "Found such values for '%s'" % "', '".join(common_keys)
255
271
  )
272
+ if click_obj:
273
+ click_obj.delayed_config_exception = exc
274
+ return None
275
+ raise exc
256
276
 
257
- all_values = dict(self._path_values or {})
258
- all_values.update(self._value_values or {})
277
+ all_values = dict(self._path_values)
278
+ all_values.update(self._value_values)
259
279
 
260
280
  debug.userconf_exec("All config values: %s" % str(all_values))
261
281
 
262
282
  merged_configs = {}
283
+ # Now look at everything (including defaults)
263
284
  for name, (val, is_path) in self._defaults.items():
264
285
  n = name.lower()
265
286
  if n in all_values:
287
+ # We have the value provided by the user -- use that.
266
288
  merged_configs[n] = all_values[n]
267
289
  else:
290
+ # No value provided by the user -- use the default
268
291
  if isinstance(val, DeployTimeField):
269
292
  # This supports a default value that is a deploy-time field (similar
270
293
  # to Parameter).)
@@ -273,25 +296,27 @@ class ConfigInput:
273
296
  # of circularity. Note also that quiet and datastore are *eager*
274
297
  # options so are available here.
275
298
  param_ctx = ParameterContext(
276
- flow_name=ctx.obj.flow.name,
299
+ flow_name=flow_name,
277
300
  user_name=get_username(),
278
301
  parameter_name=n,
279
- logger=(
280
- echo_dev_null if ctx.params["quiet"] else echo_always
281
- ),
282
- ds_type=ctx.params["datastore"],
302
+ logger=(echo_dev_null if quiet else echo_always),
303
+ ds_type=datastore,
283
304
  configs=None,
284
305
  )
285
306
  val = val.fun(param_ctx)
286
307
  if is_path:
287
308
  # This is a file path
288
- merged_configs[n] = ConvertPath.convert_value(val, False)
309
+ merged_configs[n] = ConvertPath.convert_value(val, True)
289
310
  else:
290
311
  # This is a value
291
- merged_configs[n] = ConvertDictOrStr.convert_value(val, False)
312
+ merged_configs[n] = ConvertDictOrStr.convert_value(val, True)
292
313
  else:
293
314
  debug.userconf_exec("Fast path due to pre-processed values")
294
315
  merged_configs = self._value_values
316
+
317
+ if click_obj:
318
+ click_obj.has_config_options = True
319
+
295
320
  debug.userconf_exec("Configs merged with defaults: %s" % str(merged_configs))
296
321
 
297
322
  missing_configs = set()
@@ -302,20 +327,27 @@ class ConfigInput:
302
327
  if val is None:
303
328
  missing_configs.add(name)
304
329
  continue
305
- if val.startswith(_CONVERTED_NO_FILE):
306
- no_file.append(name)
307
- continue
308
330
  if val.startswith(_CONVERTED_DEFAULT_NO_FILE):
309
331
  no_default_file.append(name)
310
332
  continue
333
+ if val.startswith(_CONVERTED_NO_FILE):
334
+ no_file.append(name)
335
+ continue
336
+
311
337
  val = val[len(_CONVERT_PREFIX) :] # Remove the _CONVERT_PREFIX
338
+ if val.startswith(_DEFAULT_PREFIX): # Remove the _DEFAULT_PREFIX if needed
339
+ val = val[len(_DEFAULT_PREFIX) :]
312
340
  if val.startswith("kv."):
313
341
  # This means to load it from a file
314
342
  read_value = self.get_config(val[3:])
315
343
  if read_value is None:
316
- raise click.UsageError(
344
+ exc = click.UsageError(
317
345
  "Could not find configuration '%s' in INFO file" % val
318
346
  )
347
+ if click_obj:
348
+ click_obj.delayed_config_exception = exc
349
+ return None
350
+ raise exc
319
351
  flow_cls._flow_state[_FlowState.CONFIGS][name] = read_value
320
352
  to_return[name] = ConfigValue(read_value)
321
353
  else:
@@ -348,13 +380,27 @@ class ConfigInput:
348
380
  % (merged_configs[missing][len(_CONVERTED_DEFAULT_NO_FILE) :], missing)
349
381
  )
350
382
  if msgs:
351
- raise click.UsageError(
383
+ exc = click.UsageError(
352
384
  "Bad values passed for configuration options: %s" % ", ".join(msgs)
353
385
  )
386
+ if click_obj:
387
+ click_obj.delayed_config_exception = exc
388
+ return None
389
+ raise exc
354
390
 
355
391
  debug.userconf_exec("Finalized configs: %s" % str(to_return))
356
392
  return to_return
357
393
 
394
+ def process_configs_click(self, ctx, param, value):
395
+ return self.process_configs(
396
+ ctx.obj.flow.name,
397
+ param.name,
398
+ value,
399
+ ctx.params["quiet"],
400
+ ctx.params["datastore"],
401
+ click_obj=ctx.obj,
402
+ )
403
+
358
404
  def __str__(self):
359
405
  return repr(self)
360
406
 
@@ -399,7 +445,7 @@ class LocalFileInput(click.Path):
399
445
  return "LocalFileInput"
400
446
 
401
447
 
402
- def config_options(cmd):
448
+ def config_options_with_config_input(cmd):
403
449
  help_strs = []
404
450
  required_names = []
405
451
  defaults = {}
@@ -407,7 +453,7 @@ def config_options(cmd):
407
453
  parsers = {}
408
454
  flow_cls = getattr(current_flow, "flow_cls", None)
409
455
  if flow_cls is None:
410
- return cmd
456
+ return cmd, None
411
457
 
412
458
  parameters = [p for _, p in flow_cls._get_parameters() if p.IS_CONFIG_PARAMETER]
413
459
  # List all the configuration options
@@ -432,20 +478,22 @@ def config_options(cmd):
432
478
  parsers[arg.name.lower()] = arg.parser
433
479
 
434
480
  if not config_seen:
435
- # No configurations -- don't add anything
436
- return cmd
481
+ # No configurations -- don't add anything; we set it to False so that it
482
+ # can be checked whether or not we called this.
483
+ return cmd, False
437
484
 
438
485
  help_str = (
439
486
  "Configuration options for the flow. "
440
- "Multiple configurations can be specified."
487
+ "Multiple configurations can be specified. Cannot be used with resume."
441
488
  )
442
489
  help_str = "\n\n".join([help_str] + help_strs)
443
- cb_func = ConfigInput(required_names, defaults, parsers).process_configs
490
+ config_input = ConfigInput(required_names, defaults, parsers)
491
+ cb_func = config_input.process_configs_click
444
492
 
445
493
  cmd.params.insert(
446
494
  0,
447
495
  click.Option(
448
- ["--config-value", "config_value_options"],
496
+ ["--config-value", "config_value"],
449
497
  nargs=2,
450
498
  multiple=True,
451
499
  type=MultipleTuple([click.Choice(config_seen), ConvertDictOrStr()]),
@@ -470,7 +518,7 @@ def config_options(cmd):
470
518
  cmd.params.insert(
471
519
  0,
472
520
  click.Option(
473
- ["--config", "config_file_options"],
521
+ ["--config", "config_file"],
474
522
  nargs=2,
475
523
  multiple=True,
476
524
  type=MultipleTuple([click.Choice(config_seen), ConvertPath()]),
@@ -492,4 +540,9 @@ def config_options(cmd):
492
540
  required=False,
493
541
  ),
494
542
  )
543
+ return cmd, config_input
544
+
545
+
546
+ def config_options(cmd):
547
+ cmd, _ = config_options_with_config_input(cmd)
495
548
  return cmd
@@ -70,10 +70,6 @@ class ConfigValue(collections.abc.Mapping):
70
70
  # as well as a [] notation.
71
71
 
72
72
  def __init__(self, data: Dict[str, Any]):
73
- if any(not ID_PATTERN.match(k) for k in data.keys()):
74
- raise MetaflowException(
75
- "All keys in the configuration must be valid Python identifiers"
76
- )
77
73
  self._data = data
78
74
 
79
75
  def __getattr__(self, key: str) -> Any:
@@ -177,7 +173,10 @@ class DelayEvaluator(collections.abc.Mapping):
177
173
  def __getitem__(self, key):
178
174
  if key == "%s%d" % (UNPACK_KEY, id(self)):
179
175
  return self
180
- raise KeyError(key)
176
+ if self._access is None:
177
+ raise KeyError(key)
178
+ self._access.append(key)
179
+ return self
181
180
 
182
181
  def __len__(self):
183
182
  return 1
@@ -338,7 +337,9 @@ class Config(Parameter, collections.abc.Mapping):
338
337
  self._computed_value = None
339
338
 
340
339
  def load_parameter(self, v):
341
- return v
340
+ if v is None:
341
+ return None
342
+ return ConfigValue(v)
342
343
 
343
344
  def _store_value(self, v: Any) -> None:
344
345
  self._computed_value = v
@@ -358,29 +359,47 @@ class Config(Parameter, collections.abc.Mapping):
358
359
  return DelayEvaluator(self.name.lower())[key]
359
360
 
360
361
 
361
- def resolve_delayed_evaluator(v: Any) -> Any:
362
- if isinstance(v, DelayEvaluator):
363
- return v()
364
- if isinstance(v, dict):
365
- return {
366
- resolve_delayed_evaluator(k): resolve_delayed_evaluator(v)
367
- for k, v in v.items()
368
- }
369
- if isinstance(v, list):
370
- return [resolve_delayed_evaluator(x) for x in v]
371
- if isinstance(v, tuple):
372
- return tuple(resolve_delayed_evaluator(x) for x in v)
373
- if isinstance(v, set):
374
- return {resolve_delayed_evaluator(x) for x in v}
375
- return v
376
-
377
-
378
- def unpack_delayed_evaluator(to_unpack: Dict[str, Any]) -> Dict[str, Any]:
362
+ def resolve_delayed_evaluator(v: Any, ignore_errors: bool = False) -> Any:
363
+ try:
364
+ if isinstance(v, DelayEvaluator):
365
+ return v()
366
+ if isinstance(v, dict):
367
+ return {
368
+ resolve_delayed_evaluator(k): resolve_delayed_evaluator(v)
369
+ for k, v in v.items()
370
+ }
371
+ if isinstance(v, list):
372
+ return [resolve_delayed_evaluator(x) for x in v]
373
+ if isinstance(v, tuple):
374
+ return tuple(resolve_delayed_evaluator(x) for x in v)
375
+ if isinstance(v, set):
376
+ return {resolve_delayed_evaluator(x) for x in v}
377
+ return v
378
+ except Exception as e:
379
+ if ignore_errors:
380
+ # Assumption is that default value of None is always allowed.
381
+ # This code path is *only* used when evaluating Parameters AND they
382
+ # use configs in their attributes AND the runner/deployer is being used
383
+ # AND CLICK_API_PROCESS_CONFIG is False. In those cases, all attributes in
384
+ # Parameter can be set to None except for required and show_default
385
+ # and even in those cases, a wrong value will have very limited consequence.
386
+ return None
387
+ raise e
388
+
389
+
390
+ def unpack_delayed_evaluator(
391
+ to_unpack: Dict[str, Any], ignore_errors: bool = False
392
+ ) -> Dict[str, Any]:
379
393
  result = {}
380
394
  for k, v in to_unpack.items():
381
395
  if not isinstance(k, str) or not k.startswith(UNPACK_KEY):
382
396
  result[k] = v
383
397
  else:
384
398
  # k.startswith(UNPACK_KEY)
385
- result.update(resolve_delayed_evaluator(v[k]))
399
+ try:
400
+ result.update(resolve_delayed_evaluator(v[k]))
401
+ except Exception as e:
402
+ if ignore_errors:
403
+ continue
404
+ raise e
386
405
  return result
metaflow/util.py CHANGED
@@ -307,10 +307,10 @@ def dict_to_cli_options(params):
307
307
  # keyword in Python, so we call it 'decospecs' in click args
308
308
  if k == "decospecs":
309
309
  k = "with"
310
- if k in ("config_file_options", "config_value_options"):
310
+ if k in ("config_file", "config_value"):
311
311
  # Special handling here since we gather them all in one option but actually
312
312
  # need to send them one at a time using --config-value <name> kv.<name>
313
- # Note it can be either config_file_options or config_value_options depending
313
+ # Note it can be either config_file or config_value depending
314
314
  # on click processing order.
315
315
  for config_name in v.keys():
316
316
  yield "--config-value"
metaflow/version.py CHANGED
@@ -1 +1 @@
1
- metaflow_version = "2.12.38"
1
+ metaflow_version = "2.13"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: metaflow
3
- Version: 2.12.38
3
+ Version: 2.13
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.12.38; extra == "stubs"
29
+ Requires-Dist: metaflow-stubs==2.13; extra == "stubs"
30
30
 
31
31
  ![Metaflow_Logo_Horizontal_FullColor_Ribbon_Dark_RGB](https://user-images.githubusercontent.com/763451/89453116-96a57e00-d713-11ea-9fa6-82b29d4d6eff.png)
32
32
 
@@ -1,22 +1,22 @@
1
1
  metaflow/R.py,sha256=CqVfIatvmjciuICNnoyyNGrwE7Va9iXfLdFbQa52hwA,3958
2
- metaflow/__init__.py,sha256=yeHIcwunlMyp_1Y6D9iuCbWi4atVMoEp2F_6-CagnDs,5819
2
+ metaflow/__init__.py,sha256=fbhdWiWnEoAX4KnzRHMY_iQcT-uYlMWhzrXPKvK0i5g,5832
3
3
  metaflow/cards.py,sha256=tP1_RrtmqdFh741pqE4t98S7SA0MtGRlGvRICRZF1Mg,426
4
- metaflow/cli.py,sha256=aE3CtoLcD8wsdR-mUDVbi8RuyrQOUzfzq_iqjHROjZ8,18429
5
- metaflow/cli_args.py,sha256=nz6ZN-gv-NFTFrfHCBJRy_JtzV42iltXI4V4-sBTukE,3626
4
+ metaflow/cli.py,sha256=IfUZd9fiUrT_MaSUnahmdPXK81DB06NNhUO2aXe0_PI,21600
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
9
  metaflow/decorators.py,sha256=BxzcxPkc8SvVTDD5pNhE3bmy7bYn6pBPEF-WYjnw-MY,23911
10
10
  metaflow/event_logger.py,sha256=joTVRqZPL87nvah4ZOwtqWX8NeraM_CXKXXGVpKGD8o,780
11
11
  metaflow/events.py,sha256=ahjzkSbSnRCK9RZ-9vTfUviz_6gMvSO9DGkJ86X80-k,5300
12
- metaflow/exception.py,sha256=KC1LHJQzzYkWib0DeQ4l_A2r8VaudywsSqIQuq1RDZU,4954
13
- metaflow/flowspec.py,sha256=ZJ8g5q41I0YaKp_5_pZczPT_H9coVHA3uwyVADWxgo8,33538
14
- metaflow/graph.py,sha256=HFJ7V_bPSht_NHIm8BejrSqOX2fyBQpVOczRCliRw08,11975
15
- metaflow/includefile.py,sha256=lMPJxxGJ-U1iqsJdUxFN5Sdcf6lb6FER39eVySJHfxg,20914
12
+ metaflow/exception.py,sha256=_m9ZBJM0cooHRslDqfxCPQmkChqaTh6fGxp7HvISnYI,5161
13
+ metaflow/flowspec.py,sha256=Ph4HrZPQ7t3Z7T3vAoNKlHCd7ejsOFkMrfXGpqttVtU,33952
14
+ metaflow/graph.py,sha256=cdpnWr85aEj_rRn-7EjbndWjr_i8Dt3P7-oPUW0NNpI,12393
15
+ metaflow/includefile.py,sha256=kWKDSlzVcRVNGG9PV5eB3o2ynrzqhVsfaLtkqjshn7Q,20948
16
16
  metaflow/info_file.py,sha256=wtf2_F0M6dgiUu74AFImM8lfy5RrUw5Yj7Rgs2swKRY,686
17
17
  metaflow/integrations.py,sha256=LlsaoePRg03DjENnmLxZDYto3NwWc9z_PtU6nJxLldg,1480
18
- metaflow/lint.py,sha256=5rj1MlpluxyPTSINjtMoJ7viotyNzfjtBJSAihlAwMU,10870
19
- metaflow/metaflow_config.py,sha256=f2lUcfkdUVVts9t05Wh6kzCcbQ_JUxnFAzUHjO-Cfsk,23051
18
+ metaflow/lint.py,sha256=x4p6tnRzYqNNniCGXyrUW0WuYfTUgnaOMRivxvnxask,11661
19
+ metaflow/metaflow_config.py,sha256=AAhrK6f6CTm2ek8ZQJBLPmmkYzY_giBXPmso3i7fzSI,23266
20
20
  metaflow/metaflow_config_funcs.py,sha256=5GlvoafV6SxykwfL8D12WXSfwjBN_NsyuKE_Q3gjGVE,6738
21
21
  metaflow/metaflow_current.py,sha256=pfkXmkyHeMJhxIs6HBJNBEaBDpcl5kz9Wx5mW6F_3qo,7164
22
22
  metaflow/metaflow_environment.py,sha256=rojFyGdyY56sN1HaEb1-0XX53Q3XPNnl0SaH-8xXZ8w,7987
@@ -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=cftYDVz8j7gQ9cdtRPx9VVhPNwKakHEecDrlagos7x4,18238
28
+ metaflow/parameters.py,sha256=UVnRakZ-LHsc0ZFbDKNcLMZSWBvP-Ylw7P1_YjBHjDA,18595
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
@@ -34,9 +34,9 @@ metaflow/tagging_util.py,sha256=ctyf0Q1gBi0RyZX6J0e9DQGNkNHblV_CITfy66axXB4,2346
34
34
  metaflow/task.py,sha256=xVVLWy8NH16OlLu2VoOb1OfiFzcOVVCdQldlmb1Zb_w,29691
35
35
  metaflow/tuple_util.py,sha256=_G5YIEhuugwJ_f6rrZoelMFak3DqAR2tt_5CapS1XTY,830
36
36
  metaflow/unbounded_foreach.py,sha256=p184WMbrMJ3xKYHwewj27ZhRUsSj_kw1jlye5gA9xJk,387
37
- metaflow/util.py,sha256=wA25u2oXP-mHuDJM8Yx9gnPGZa9dP5tP1RWD9EULPow,14698
37
+ metaflow/util.py,sha256=hKjHl6NYJkKBSU2tzdVbddfOX1zWK73T4GCO42A0XB4,14666
38
38
  metaflow/vendor.py,sha256=FchtA9tH22JM-eEtJ2c9FpUdMn8sSb1VHuQS56EcdZk,5139
39
- metaflow/version.py,sha256=kjSTwD2udYmEmclSTkhC0i7uIhUTBLw_NyG4uykyRS4,29
39
+ metaflow/version.py,sha256=BaRwavZkdhCd56-Zxg8AtAsFnVpBuCJItv_SPS2apM4,26
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,7 +113,7 @@ 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=hgSPO5it4xG22ObZ3y5o8Vpf5DbZokX-Rjg-lACPLcY,10352
116
+ metaflow/cli_components/run_cmds.py,sha256=yBJfmQiICi2yEIluy9yixPb4IE84U6b4e_oiIrq7nKY,10437
117
117
  metaflow/cli_components/step_cmd.py,sha256=Mkztidy-wxYH7KyLSVsWK7SeYPJIeihpDClzTn9-2oo,5057
118
118
  metaflow/cli_components/utils.py,sha256=gpoDociadjnJD7MuiJup_MDR02ZJjjleejr0jPBu29c,6057
119
119
  metaflow/client/__init__.py,sha256=1GtQB4Y_CBkzaxg32L1syNQSlfj762wmLrfrDxGi1b8,226
@@ -132,7 +132,7 @@ metaflow/datastore/content_addressed_store.py,sha256=6T7tNqL29kpmecyMLHF35RhoSBO
132
132
  metaflow/datastore/datastore_set.py,sha256=R5pwnxg1DD8kBY9vElvd2eMknrvwTyiSwvQs67_z9bc,2361
133
133
  metaflow/datastore/datastore_storage.py,sha256=7V43QuiWDQ_Q4oHw9y7Z7X9lYj3GI-LV1-xB3d2Tt5k,9038
134
134
  metaflow/datastore/exceptions.py,sha256=r7Ab5FvHIzyFh6kwiptA1lO5nLqWg0xRBoeYGefvapA,373
135
- metaflow/datastore/flow_datastore.py,sha256=kbJcOLYnvPHgJfZ_WWkD9LJSX1PHI1K6f9oVUu08A9U,10235
135
+ metaflow/datastore/flow_datastore.py,sha256=rDMEHdYwub1PwLp2uaK-8CHdd8hiwxqeELXzsUfuqZs,10250
136
136
  metaflow/datastore/inputs.py,sha256=i43dXr2xvgtsgKMO9allgCR18bk80GeayeQFyUTH36w,449
137
137
  metaflow/datastore/task_datastore.py,sha256=oIlA4COEghSNVPqsw9BA7og4nyiZy7375BBRQ09Sw4E,36176
138
138
  metaflow/extension_support/__init__.py,sha256=2z0c4R8zsVmEFOMGT2Jujsl6xveDVa9KLll7moL58NE,52984
@@ -185,7 +185,7 @@ metaflow/plugins/argo/argo_workflows.py,sha256=lPPPKlHgz2cKYHM8mdq8Aywoi6vYytyCz
185
185
  metaflow/plugins/argo/argo_workflows_cli.py,sha256=k8rDbHMXF-A0CxxEnVMvk_9OYobPIyjF-PHBGYfH8b4,36752
186
186
  metaflow/plugins/argo/argo_workflows_decorator.py,sha256=QdM1rK9gM-lDhyZldK8WqvFqJDvfJ7i3JPR5Uzaq2as,7887
187
187
  metaflow/plugins/argo/argo_workflows_deployer.py,sha256=6kHxEnYXJwzNCM9swI8-0AckxtPWqwhZLerYkX8fxUM,4444
188
- metaflow/plugins/argo/argo_workflows_deployer_objects.py,sha256=GJ1Jsm5KHYaBbJjKRz82Cwhi_PN1XnMiSmL1C0LNLYQ,12318
188
+ metaflow/plugins/argo/argo_workflows_deployer_objects.py,sha256=bs0E8WJGQYXuwi6u0OiwTn_jkfeKb5DywCmuJHeRl8I,13949
189
189
  metaflow/plugins/argo/capture_error.py,sha256=Ys9dscGrTpW-ZCirLBU0gD9qBM0BjxyxGlUMKcwewQc,1852
190
190
  metaflow/plugins/argo/generate_input_paths.py,sha256=loYsI6RFX9LlFsHb7Fe-mzlTTtRdySoOu7sYDy-uXK0,881
191
191
  metaflow/plugins/argo/jobset_input_paths.py,sha256=_JhZWngA6p9Q_O2fx3pdzKI0WE-HPRHz_zFvY2pHPTQ,525
@@ -198,7 +198,7 @@ metaflow/plugins/aws/batch/batch_cli.py,sha256=gVQMWBLeuqO3U3PhVJSHLwa-CNHsmW0Cv
198
198
  metaflow/plugins/aws/batch/batch_client.py,sha256=ddlGG0Vk1mkO7tcvJjDvNAVsVLOlqddF7MA1kKfHSqM,28830
199
199
  metaflow/plugins/aws/batch/batch_decorator.py,sha256=1MAhri-A_CYN2op0LPZikWL30m5h0w05XA8PXqb-Gk8,17561
200
200
  metaflow/plugins/aws/secrets_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
201
- metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py,sha256=JtFUVu00Cg0FzAizgrPLXmrMqsT7YeQMkQlgeivUxcE,7986
201
+ metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py,sha256=bBrGw4gRcKX9SLD8iKqPm_S_Zw5Y6F8AjxP6jPbkPpI,8136
202
202
  metaflow/plugins/aws/step_functions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
203
203
  metaflow/plugins/aws/step_functions/dynamo_db_client.py,sha256=c1nFZc9v_dLTD3iD-75I6wrlM6oM7YmxpFPTRo8Tra0,2327
204
204
  metaflow/plugins/aws/step_functions/event_bridge_client.py,sha256=U9-tqKdih4KR-ZDRhFc-jHmYIcHgpS4swfgtTxNMB94,2690
@@ -210,7 +210,7 @@ metaflow/plugins/aws/step_functions/step_functions_cli.py,sha256=4RsVtkw_3FO9Y2H
210
210
  metaflow/plugins/aws/step_functions/step_functions_client.py,sha256=DKpNwAIWElvWjFANs5Ku3rgzjxFoqAD6k-EF8Xhkg3Q,4754
211
211
  metaflow/plugins/aws/step_functions/step_functions_decorator.py,sha256=LoZC5BuQLqyFtfE-sGla26l2xXlCKN9aSvIlzPKV134,3800
212
212
  metaflow/plugins/aws/step_functions/step_functions_deployer.py,sha256=JKYtDhKivtXUWPklprZFzkqezh14loGDmk8mNk6QtpI,3714
213
- metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py,sha256=EbBd0m1GL5E7hIP2sBFgyRXo2XTf6qMZdxLA8VjXGX8,7219
213
+ metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py,sha256=-ElC48q739UJk4qGEYj6H7p8nZ4xsm1iJwh5B7kEsFE,7319
214
214
  metaflow/plugins/azure/__init__.py,sha256=GuuhTVC-zSdyAf79a1wiERMq0Zts7fwVT7t9fAf234A,100
215
215
  metaflow/plugins/azure/azure_credential.py,sha256=JmdGEbVzgxy8ucqnQDdTTI_atyMX9WSZUw3qYOo7RhE,2174
216
216
  metaflow/plugins/azure/azure_exceptions.py,sha256=NnbwpUC23bc61HZjJmeXztY0tBNn_Y_VpIpDDuYWIZ0,433
@@ -222,9 +222,9 @@ metaflow/plugins/azure/includefile_support.py,sha256=2kBnjR-Rl1cSoZsrgvl3t4tf1qs
222
222
  metaflow/plugins/cards/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
223
223
  metaflow/plugins/cards/card_cli.py,sha256=LN0B_Bvb7qJxRyvzR2uvRctt5xrC4SqZo0rkQgExQKo,35040
224
224
  metaflow/plugins/cards/card_client.py,sha256=30dFBoC3axc261GeV7QCIs_V1OHhRtS31S0wEWsjw90,9501
225
- metaflow/plugins/cards/card_creator.py,sha256=E_NCmWPK6DzkqigtpUpeddCDbjnKF6dJcE6IvWzwiyA,7740
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=rrPcWzxmN8sKprBsPVr8Ds0X6LEVq90_MimzBws0x0Q,9251
227
+ metaflow/plugins/cards/card_decorator.py,sha256=bEiHVrlvhbR51Y1qVlQ5WrYCtjZDl5IW9df2JqouBgg,10804
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=Row7c_8_euJcF_I1lWHdgMRj7dvAb69O-jZTmxS9h8k,37223
@@ -298,26 +298,26 @@ metaflow/plugins/metadata_providers/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uz
298
298
  metaflow/plugins/metadata_providers/local.py,sha256=9UAxe9caN6kU1lkSlIoJbRGgTqsMa62cBTnyMwhqiaA,22446
299
299
  metaflow/plugins/metadata_providers/service.py,sha256=NKZfFMamx6upP6aFRJfXlfYIhySgFNzz6kbp1yPD7LA,20222
300
300
  metaflow/plugins/pypi/__init__.py,sha256=0YFZpXvX7HCkyBFglatual7XGifdA1RwC3U4kcizyak,1037
301
- metaflow/plugins/pypi/bootstrap.py,sha256=FI-itExqIz7DUzLnnkGwoB60rFBviygpIFThUtqk_4E,5227
302
- metaflow/plugins/pypi/conda_decorator.py,sha256=XSdY2jDMzJdEL-P0YYJYx4-IinMjB40aqDk8QNbkbNk,16388
303
- metaflow/plugins/pypi/conda_environment.py,sha256=IGHIphHm1e8UEJX-PvyTesfKRCpxtJIc1pxJ5Wen-aU,19765
304
- metaflow/plugins/pypi/micromamba.py,sha256=QaZYMy5w4esW2w_Lb9kZdWU07EtZD_Ky00MVlA4FJw0,14079
305
- metaflow/plugins/pypi/pip.py,sha256=Uewmt6-meLyPhNLiAOAkDdfd1P4Go07bkQUD0uE5VIs,13827
306
- metaflow/plugins/pypi/pypi_decorator.py,sha256=N1fqebjChbg9mji7vZpqv2BKDSVBDPZ-QRGUyMgoUqI,7260
301
+ metaflow/plugins/pypi/bootstrap.py,sha256=aIMY7vmVt-EhNQQgppjnM8QKHsKvAdFoKVyRTDLyH1c,10238
302
+ metaflow/plugins/pypi/conda_decorator.py,sha256=piFcE4uGmWhhbGlxMK0GHd7BGEyqy6r9BFy8Mjoi80Q,15937
303
+ metaflow/plugins/pypi/conda_environment.py,sha256=BpeyenJXsZtHBqDShO-_oOrY4w9iGREqLJ0kaPu_ulA,22032
304
+ metaflow/plugins/pypi/micromamba.py,sha256=8rkEzBJLvMY6RD3fttHMrW_MT-GZz970yxnIb8wVVa4,15026
305
+ metaflow/plugins/pypi/pip.py,sha256=IVy6uR3ymL2pNoxNig-WKAnHRcH09a1JbHgMEOYLyoI,14012
306
+ metaflow/plugins/pypi/pypi_decorator.py,sha256=ybNgo-T5Z_0W2KNuED0pdjyI0qygZ4a1MXAzKqdHt_E,7250
307
307
  metaflow/plugins/pypi/pypi_environment.py,sha256=FYMg8kF3lXqcLfRYWD83a9zpVjcoo_TARqMGZ763rRk,230
308
308
  metaflow/plugins/pypi/utils.py,sha256=ds1Mnv_DaxGnLAYp7ozg_K6oyguGyNhvHfE-75Ia1YA,2836
309
309
  metaflow/plugins/secrets/__init__.py,sha256=mhJaN2eMS_ZZVewAMR2E-JdP5i0t3v9e6Dcwd-WpruE,310
310
310
  metaflow/plugins/secrets/inline_secrets_provider.py,sha256=EChmoBGA1i7qM3jtYwPpLZDBybXLergiDlN63E0u3x8,294
311
311
  metaflow/plugins/secrets/secrets_decorator.py,sha256=s-sFzPWOjahhpr5fMj-ZEaHkDYAPTO0isYXGvaUwlG8,11273
312
312
  metaflow/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
313
- metaflow/runner/click_api.py,sha256=BicwlQRGrLhy2xOYo89IV9pu5L8ZkGGTUI2FTsrq33I,15944
314
- metaflow/runner/deployer.py,sha256=goCCDq9mRJIrH5-9HU6E6J55pYoju--CtM1zADTzHvY,8967
315
- metaflow/runner/deployer_impl.py,sha256=QjMoTM1IviRK-dZ7WB3vGExpaScOCESlHxSR9ZoAkgA,5625
316
- metaflow/runner/metaflow_runner.py,sha256=PrAEJhWqjbGuu4IsnxCSLLf8o4AqqRpeTM7rCMbOAvg,14827
317
- metaflow/runner/nbdeploy.py,sha256=UYo3Yfw1wlBFnUHjs_RngnWcWj9CDdMYaMqt9wZx0rk,4035
318
- metaflow/runner/nbrun.py,sha256=otWTsCkrVSdxlaxXNrRc9oyjdgQR8mHHhL8NAO0B5iE,7286
319
- metaflow/runner/subprocess_manager.py,sha256=lUD59T663Ar4ZcsUOk8VehaV1pRIg-QoWT_s_dFOVGI,21953
320
- metaflow/runner/utils.py,sha256=JTWBFxQ2dru-dL2tI-8dIIVvQn_S3asGU9Ma6eeN7rc,8818
313
+ metaflow/runner/click_api.py,sha256=13CM3RsH3dJ6YJTQnNafLEZ_teTnYMyfoR2Cf5baVbM,21772
314
+ metaflow/runner/deployer.py,sha256=Yas_SZCss3kfJw3hLC8_IyzgiytUFGoEGHz-l-rBBKk,8980
315
+ metaflow/runner/deployer_impl.py,sha256=nzQJiJxjgZxewkkK5pHshfVeZOUUf5-FzS0pPJimktM,5930
316
+ metaflow/runner/metaflow_runner.py,sha256=GS-12UwxiIUByMoIMG3gAROxC2ShZEtS1dOSpWEaP8Y,15131
317
+ metaflow/runner/nbdeploy.py,sha256=Sp5w-6nCZwjHaRBHWxi8udya-RYnJOB76KNLjB4L7Gs,4166
318
+ metaflow/runner/nbrun.py,sha256=LhJu-Teoi7wTkNxg0kpNPVXFxH_9P4lvtp0ysMEIFJ8,7299
319
+ metaflow/runner/subprocess_manager.py,sha256=K6uZXnqdgeW0vHUAVwoolSpDSLp1EVHiBtyD7f_vwac,22050
320
+ metaflow/runner/utils.py,sha256=jC-Z5xzGEEa6Qc71U_5r1wHsS-qYV7-czv1BO-q2MSs,10213
321
321
  metaflow/sidecar/__init__.py,sha256=1mmNpmQ5puZCpRmmYlCOeieZ4108Su9XQ4_EqF1FGOU,131
322
322
  metaflow/sidecar/sidecar.py,sha256=EspKXvPPNiyRToaUZ51PS5TT_PzrBNAurn_wbFnmGr0,1334
323
323
  metaflow/sidecar/sidecar_messages.py,sha256=zPsCoYgDIcDkkvdC9MEpJTJ3y6TSGm2JWkRc4vxjbFA,1071
@@ -356,11 +356,11 @@ metaflow/tutorials/08-autopilot/README.md,sha256=GnePFp_q76jPs991lMUqfIIh5zSorIe
356
356
  metaflow/tutorials/08-autopilot/autopilot.ipynb,sha256=DQoJlILV7Mq9vfPBGW-QV_kNhWPjS5n6SJLqePjFYLY,3191
357
357
  metaflow/user_configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
358
358
  metaflow/user_configs/config_decorators.py,sha256=Tj0H88UT8Q6pylXxHXgiA6cqnNlw4d3mR7M8J9g3ZUg,20139
359
- metaflow/user_configs/config_options.py,sha256=3l293IQHOE-DqNzDt7kc1vLWMLuevoJceYVQ43dEhQY,19165
360
- metaflow/user_configs/config_parameters.py,sha256=cBlnhLoax-QbpD46oofuLUJhT3_8WHscLNDSpO8hWOU,13098
361
- metaflow-2.12.38.dist-info/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
362
- metaflow-2.12.38.dist-info/METADATA,sha256=x6ZBy_CGEAQaUrUfP_VOX_DRHZxICz8M4_uBZMO01WY,5908
363
- metaflow-2.12.38.dist-info/WHEEL,sha256=pxeNX5JdtCe58PUSYP9upmc7jdRPgvT0Gm9kb1SHlVw,109
364
- metaflow-2.12.38.dist-info/entry_points.txt,sha256=IKwTN1T3I5eJL3uo_vnkyxVffcgnRdFbKwlghZfn27k,57
365
- metaflow-2.12.38.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
366
- metaflow-2.12.38.dist-info/RECORD,,
359
+ metaflow/user_configs/config_options.py,sha256=Knpiax_YGmYAdR3zKmaepN8puW1MyL9g6-eMGAkcylo,20942
360
+ metaflow/user_configs/config_parameters.py,sha256=yDiaajJGP-9W_tA_6hVuw8HDF8n5zJBccCjcrTGOYDE,13912
361
+ metaflow-2.13.dist-info/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
362
+ metaflow-2.13.dist-info/METADATA,sha256=BIUZgy3qZMHJjWyxV0fBXluV1DM7WCLhg4YslOkHhIA,5902
363
+ metaflow-2.13.dist-info/WHEEL,sha256=pxeNX5JdtCe58PUSYP9upmc7jdRPgvT0Gm9kb1SHlVw,109
364
+ metaflow-2.13.dist-info/entry_points.txt,sha256=IKwTN1T3I5eJL3uo_vnkyxVffcgnRdFbKwlghZfn27k,57
365
+ metaflow-2.13.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
366
+ metaflow-2.13.dist-info/RECORD,,