metaflow 2.15.15__py2.py3-none-any.whl → 2.15.16__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.
@@ -488,9 +488,6 @@ class StubGenerator:
488
488
  self._imports.add(name)
489
489
 
490
490
  def _add_to_typing_check(name, is_module=False):
491
- # if name != self._current_module_name:
492
- # self._typing_imports.add(name)
493
- #
494
491
  if name == "None":
495
492
  return
496
493
  if is_module:
@@ -504,6 +501,24 @@ class StubGenerator:
504
501
  # the current file
505
502
  self._typing_imports.add(splits[0])
506
503
 
504
+ def _format_qualified_class_name(cls: type) -> str:
505
+ """Helper to format a class with its qualified module name"""
506
+ # Special case for NoneType - return None
507
+ if cls.__name__ == "NoneType":
508
+ return "None"
509
+
510
+ module = inspect.getmodule(cls)
511
+ if (
512
+ module
513
+ and module.__name__ != "builtins"
514
+ and module.__name__ != "__main__"
515
+ ):
516
+ module_name = self._get_module_name_alias(module.__name__)
517
+ _add_to_typing_check(module_name, is_module=True)
518
+ return f"{module_name}.{cls.__name__}"
519
+ else:
520
+ return cls.__name__
521
+
507
522
  if isinstance(element, str):
508
523
  # Special case for self referential things (particularly in a class)
509
524
  if element == self._current_name:
@@ -557,19 +572,15 @@ class StubGenerator:
557
572
  return element.__name__
558
573
  elif isinstance(element, type(Ellipsis)):
559
574
  return "..."
560
- # elif (
561
- # isinstance(element, typing._GenericAlias)
562
- # and hasattr(element, "_name")
563
- # and element._name in ("List", "Tuple", "Dict", "Set")
564
- # ):
565
- # # 3.7 has these as _GenericAlias but they don't behave like the ones in 3.10
566
- # _add_to_import("typing")
567
- # return str(element)
568
575
  elif isinstance(element, typing._GenericAlias):
569
576
  # We need to check things recursively in __args__ if it exists
570
577
  args_str = []
571
578
  for arg in getattr(element, "__args__", []):
572
- args_str.append(self._get_element_name_with_module(arg))
579
+ # Special handling for class objects in type arguments
580
+ if isinstance(arg, type):
581
+ args_str.append(_format_qualified_class_name(arg))
582
+ else:
583
+ args_str.append(self._get_element_name_with_module(arg))
573
584
 
574
585
  _add_to_import("typing")
575
586
  if element._name:
@@ -584,12 +595,15 @@ class StubGenerator:
584
595
  args_str = [call_args, args_str[-1]]
585
596
  return "typing.%s[%s]" % (element._name, ", ".join(args_str))
586
597
  else:
587
- return "%s[%s]" % (element.__origin__, ", ".join(args_str))
598
+ # Handle the case where we have a generic type without a _name
599
+ origin = element.__origin__
600
+ if isinstance(origin, type):
601
+ origin_str = _format_qualified_class_name(origin)
602
+ else:
603
+ origin_str = str(origin)
604
+ return "%s[%s]" % (origin_str, ", ".join(args_str))
588
605
  elif isinstance(element, ForwardRef):
589
606
  f_arg = self._get_module_name_alias(element.__forward_arg__)
590
- # if f_arg in ("Run", "Task"): # HACK -- forward references in current.py
591
- # _add_to_import("metaflow")
592
- # f_arg = "metaflow.%s" % f_arg
593
607
  _add_to_typing_check(f_arg)
594
608
  return '"%s"' % f_arg
595
609
  elif inspect.getmodule(element) == inspect.getmodule(typing):
@@ -9,59 +9,16 @@ from metaflow.exception import MetaflowException
9
9
  from metaflow.plugins.argo.argo_client import ArgoClient
10
10
  from metaflow.metaflow_config import KUBERNETES_NAMESPACE
11
11
  from metaflow.plugins.argo.argo_workflows import ArgoWorkflows
12
- from metaflow.runner.deployer import Deployer, DeployedFlow, TriggeredRun
12
+ from metaflow.runner.deployer import (
13
+ Deployer,
14
+ DeployedFlow,
15
+ TriggeredRun,
16
+ generate_fake_flow_file_contents,
17
+ )
13
18
 
14
19
  from metaflow.runner.utils import get_lower_level_group, handle_timeout, temporary_fifo
15
20
 
16
21
 
17
- def generate_fake_flow_file_contents(
18
- flow_name: str, param_info: dict, project_name: Optional[str] = None
19
- ):
20
- params_code = ""
21
- for _, param_details in param_info.items():
22
- param_python_var_name = param_details["python_var_name"]
23
- param_name = param_details["name"]
24
- param_type = param_details["type"]
25
- param_help = param_details["description"]
26
- param_required = param_details["is_required"]
27
-
28
- if param_type == "JSON":
29
- params_code += (
30
- f" {param_python_var_name} = Parameter('{param_name}', "
31
- f"type=JSONType, help='''{param_help}''', required={param_required})\n"
32
- )
33
- elif param_type == "FilePath":
34
- is_text = param_details.get("is_text", True)
35
- encoding = param_details.get("encoding", "utf-8")
36
- params_code += (
37
- f" {param_python_var_name} = IncludeFile('{param_name}', "
38
- f"is_text={is_text}, encoding='{encoding}', help='''{param_help}''', "
39
- f"required={param_required})\n"
40
- )
41
- else:
42
- params_code += (
43
- f" {param_python_var_name} = Parameter('{param_name}', "
44
- f"type={param_type}, help='''{param_help}''', required={param_required})\n"
45
- )
46
-
47
- project_decorator = f"@project(name='{project_name}')\n" if project_name else ""
48
-
49
- contents = f"""\
50
- from metaflow import FlowSpec, Parameter, IncludeFile, JSONType, step, project
51
- {project_decorator}class {flow_name}(FlowSpec):
52
- {params_code}
53
- @step
54
- def start(self):
55
- self.next(self.end)
56
- @step
57
- def end(self):
58
- pass
59
- if __name__ == '__main__':
60
- {flow_name}()
61
- """
62
- return contents
63
-
64
-
65
22
  class ArgoWorkflowsTriggeredRun(TriggeredRun):
66
23
  """
67
24
  A class representing a triggered Argo Workflow execution.
@@ -35,6 +35,12 @@ class Boto3ClientProvider(object):
35
35
  "Could not import module 'boto3'. Install boto3 first."
36
36
  )
37
37
 
38
+ # Convert dictionary config to Config object if needed
39
+ if "config" in client_params and not isinstance(
40
+ client_params["config"], Config
41
+ ):
42
+ client_params["config"] = Config(**client_params["config"])
43
+
38
44
  if module == "s3" and (
39
45
  "config" not in client_params or client_params["config"].retries is None
40
46
  ):
@@ -131,7 +131,7 @@ def normalize_client_error(err):
131
131
  except ValueError:
132
132
  if error_code in ("AccessDenied", "AllAccessDisabled", "InvalidAccessKeyId"):
133
133
  return 403
134
- if error_code == "NoSuchKey":
134
+ if error_code in ("NoSuchKey", "NoSuchBucket"):
135
135
  return 404
136
136
  if error_code == "InvalidRange":
137
137
  return 416
@@ -72,14 +72,18 @@ class ServiceMetadataProvider(MetadataProvider):
72
72
  @classmethod
73
73
  def compute_info(cls, val):
74
74
  v = val.rstrip("/")
75
- try:
76
- resp = cls._session.get(
77
- os.path.join(v, "ping"), headers=SERVICE_HEADERS.copy()
78
- )
79
- resp.raise_for_status()
80
- except: # noqa E722
81
- raise ValueError("Metaflow service [%s] unreachable." % v)
82
- return v
75
+ for i in range(SERVICE_RETRY_COUNT):
76
+ try:
77
+ resp = cls._session.get(
78
+ os.path.join(v, "ping"), headers=SERVICE_HEADERS.copy()
79
+ )
80
+ resp.raise_for_status()
81
+ except: # noqa E722
82
+ time.sleep(2 ** (i - 1))
83
+ else:
84
+ return v
85
+
86
+ raise ValueError("Metaflow service [%s] unreachable." % v)
83
87
 
84
88
  @classmethod
85
89
  def default_info(cls):
@@ -7,6 +7,55 @@ from typing import ClassVar, Dict, Optional, TYPE_CHECKING
7
7
  from metaflow.exception import MetaflowNotFound
8
8
  from metaflow.metaflow_config import DEFAULT_FROM_DEPLOYMENT_IMPL
9
9
 
10
+
11
+ def generate_fake_flow_file_contents(
12
+ flow_name: str, param_info: dict, project_name: Optional[str] = None
13
+ ):
14
+ params_code = ""
15
+ for _, param_details in param_info.items():
16
+ param_python_var_name = param_details["python_var_name"]
17
+ param_name = param_details["name"]
18
+ param_type = param_details["type"]
19
+ param_help = param_details["description"]
20
+ param_required = param_details["is_required"]
21
+
22
+ if param_type == "JSON":
23
+ params_code += (
24
+ f" {param_python_var_name} = Parameter('{param_name}', "
25
+ f"type=JSONType, help='''{param_help}''', required={param_required})\n"
26
+ )
27
+ elif param_type == "FilePath":
28
+ is_text = param_details.get("is_text", True)
29
+ encoding = param_details.get("encoding", "utf-8")
30
+ params_code += (
31
+ f" {param_python_var_name} = IncludeFile('{param_name}', "
32
+ f"is_text={is_text}, encoding='{encoding}', help='''{param_help}''', "
33
+ f"required={param_required})\n"
34
+ )
35
+ else:
36
+ params_code += (
37
+ f" {param_python_var_name} = Parameter('{param_name}', "
38
+ f"type={param_type}, help='''{param_help}''', required={param_required})\n"
39
+ )
40
+
41
+ project_decorator = f"@project(name='{project_name}')\n" if project_name else ""
42
+
43
+ contents = f"""\
44
+ from metaflow import FlowSpec, Parameter, IncludeFile, JSONType, step, project
45
+ {project_decorator}class {flow_name}(FlowSpec):
46
+ {params_code}
47
+ @step
48
+ def start(self):
49
+ self.next(self.end)
50
+ @step
51
+ def end(self):
52
+ pass
53
+ if __name__ == '__main__':
54
+ {flow_name}()
55
+ """
56
+ return contents
57
+
58
+
10
59
  if TYPE_CHECKING:
11
60
  import metaflow
12
61
  import metaflow.runner.deployer_impl
metaflow/version.py CHANGED
@@ -1 +1 @@
1
- metaflow_version = "2.15.15"
1
+ metaflow_version = "2.15.16"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: metaflow
3
- Version: 2.15.15
3
+ Version: 2.15.16
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.15.15; extra == "stubs"
29
+ Requires-Dist: metaflow-stubs==2.15.16; extra == "stubs"
30
30
  Dynamic: author
31
31
  Dynamic: author-email
32
32
  Dynamic: classifier
@@ -37,7 +37,7 @@ metaflow/tuple_util.py,sha256=_G5YIEhuugwJ_f6rrZoelMFak3DqAR2tt_5CapS1XTY,830
37
37
  metaflow/unbounded_foreach.py,sha256=p184WMbrMJ3xKYHwewj27ZhRUsSj_kw1jlye5gA9xJk,387
38
38
  metaflow/util.py,sha256=MCXCjcGwpuR7y9euBf1GTNRHPtlh6fCpdPMEtbULefw,14554
39
39
  metaflow/vendor.py,sha256=EDZokNMrx1PU07jNMiWFMFtC7TL03pMXZ1kKn13k-2g,5139
40
- metaflow/version.py,sha256=kaBr2LKw5BD1g4Djq9V4UUoD8zZL1Z0KuPHK6Oj-wj4,29
40
+ metaflow/version.py,sha256=YpO6EM1pbJPb-iNbMpxXLeHlRbuglsV3WHXkWdqr2gA,29
41
41
  metaflow/_vendor/__init__.py,sha256=y_CiwUD3l4eAKvTVDZeqgVujMy31cAM1qjAB-HfI-9s,353
42
42
  metaflow/_vendor/typing_extensions.py,sha256=q9zxWa6p6CzF1zZvSkygSlklduHf_b3K7MCxGz7MJRc,134519
43
43
  metaflow/_vendor/zipp.py,sha256=ajztOH-9I7KA_4wqDYygtHa6xUBVZgFpmZ8FE74HHHI,8425
@@ -150,7 +150,7 @@ metaflow/cmd/tutorials_cmd.py,sha256=8FdlKkicTOhCIDKcBR5b0Oz6giDvS-EMY3o9skIrRqw
150
150
  metaflow/cmd/util.py,sha256=jS_0rUjOnGGzPT65fzRLdGjrYAOOLA4jU2S0HJLV0oc,406
151
151
  metaflow/cmd/code/__init__.py,sha256=VO4dNM9M9LHYy5nTgEiJvCV1RBl8lpDlYGJm6GIcaBA,7413
152
152
  metaflow/cmd/develop/__init__.py,sha256=p1Sy8yU1MEKSrH5ttOWOZvNcI1qYu6J6jghdTHwPgOw,689
153
- metaflow/cmd/develop/stub_generator.py,sha256=gERNsibYL030xR0OjA60AkS3HotRCNa5N2n1QQpgqcE,65358
153
+ metaflow/cmd/develop/stub_generator.py,sha256=8Ap5rCC2lKOq4KQJ_LTuhQGj2xXYJ_Nnc1h842PsGBs,65929
154
154
  metaflow/cmd/develop/stubs.py,sha256=J8DtpaN3okiPeeAqhxuUe9wQDlW4YYmZgKsVZLlVt0k,11181
155
155
  metaflow/datastore/__init__.py,sha256=VxP6ddJt3rwiCkpiSfAhyVkUCOe1pgZZsytVEJzFmSQ,155
156
156
  metaflow/datastore/content_addressed_store.py,sha256=6T7tNqL29kpmecyMLHF35RhoSBOb-OZcExnsB65AvnI,7641
@@ -210,12 +210,12 @@ metaflow/plugins/argo/argo_workflows.py,sha256=oX-e4o_CxTQP5DJ7zMQwckcobXZJz6hPx
210
210
  metaflow/plugins/argo/argo_workflows_cli.py,sha256=1bdG8BQgwyfHooBidyY1Aw52uwjCxq2Edt0bO7qezWM,38375
211
211
  metaflow/plugins/argo/argo_workflows_decorator.py,sha256=ogCSBmwsC2C3eusydrgjuAJd4qK18f1sI4jJwA4Fd-o,7800
212
212
  metaflow/plugins/argo/argo_workflows_deployer.py,sha256=6kHxEnYXJwzNCM9swI8-0AckxtPWqwhZLerYkX8fxUM,4444
213
- metaflow/plugins/argo/argo_workflows_deployer_objects.py,sha256=c_lRGBypwxC4qh0H1JDjDq_cqEwUEqVyXIcqaFPSX8M,14184
213
+ metaflow/plugins/argo/argo_workflows_deployer_objects.py,sha256=7OiapcIM_r-aBkuIobhofgLC5NRJHC-p9bvBmxvhqoM,12500
214
214
  metaflow/plugins/argo/capture_error.py,sha256=Ys9dscGrTpW-ZCirLBU0gD9qBM0BjxyxGlUMKcwewQc,1852
215
215
  metaflow/plugins/argo/generate_input_paths.py,sha256=loYsI6RFX9LlFsHb7Fe-mzlTTtRdySoOu7sYDy-uXK0,881
216
216
  metaflow/plugins/argo/jobset_input_paths.py,sha256=-h0E_e0w6FMiBUod9Rf_XOSCtZv_C0exacw4q1SfIfg,501
217
217
  metaflow/plugins/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
218
- metaflow/plugins/aws/aws_client.py,sha256=lMIGE06LNeOfqbEXVhXKU8kx3gTFwu14Si5n4y1W9KM,4039
218
+ metaflow/plugins/aws/aws_client.py,sha256=BTiLMXa1agjja-N73oWinaOZHs-lGPbfKJG8CqdRgaU,4287
219
219
  metaflow/plugins/aws/aws_utils.py,sha256=kNd61C54Y3WxrL7KSjoKydRjBQ1p3exc9QXux-jZyDE,7510
220
220
  metaflow/plugins/aws/batch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
221
221
  metaflow/plugins/aws/batch/batch.py,sha256=e9ssahWM18GnipPK2sqYB-ztx9w7Eoo7YtWyEtufYxs,17787
@@ -279,7 +279,7 @@ metaflow/plugins/datatools/__init__.py,sha256=ge4L16OBQLy2J_MMvoHg3lMfdm-MluQgRW
279
279
  metaflow/plugins/datatools/local.py,sha256=FJvMOBcjdyhSPHmdLocBSiIT0rmKkKBmsaclxH75x08,4233
280
280
  metaflow/plugins/datatools/s3/__init__.py,sha256=14tr9fPjN3ULW5IOfKHeG7Uhjmgm7LMtQHfz1SFv-h8,248
281
281
  metaflow/plugins/datatools/s3/s3.py,sha256=3xrWD6pXoVRpuAQHyLGVya79UIE0S8AqAqe2prg4yMw,67182
282
- metaflow/plugins/datatools/s3/s3op.py,sha256=9DAIlvK5kYVmgo3rL-XY_3k7CoLUXaWqduBza13Xqv8,47543
282
+ metaflow/plugins/datatools/s3/s3op.py,sha256=nDFgc5m0ud-uK4D2_vyweGpGoMjESxu3TlX86zA1MdQ,47561
283
283
  metaflow/plugins/datatools/s3/s3tail.py,sha256=boQjQGQMI-bvTqcMP2y7uSlSYLcvWOy7J3ZUaF78NAA,2597
284
284
  metaflow/plugins/datatools/s3/s3util.py,sha256=FgRgaVmEq7-i2dV7q8XK5w5PfFt-xJjZa8WrK8IJfdI,3769
285
285
  metaflow/plugins/env_escape/__init__.py,sha256=tGNUZnmPvk52eNs__VK443b3CZ7ogEFTT-s9_n_HF8Q,8837
@@ -323,7 +323,7 @@ metaflow/plugins/kubernetes/spot_metadata_cli.py,sha256=an0nWCxgflmqIPBCBrlb4m3D
323
323
  metaflow/plugins/kubernetes/spot_monitor_sidecar.py,sha256=zrWU-smQwPnL6MBHmzTxWyEA00R6iKKQbhhy50xFwQ8,3832
324
324
  metaflow/plugins/metadata_providers/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
325
325
  metaflow/plugins/metadata_providers/local.py,sha256=Z0CXaGZJbAkj4II3WspJi-uCCtShH64yaXZQ5i9Ym7g,24390
326
- metaflow/plugins/metadata_providers/service.py,sha256=9j0db_EOGFdb49YTgr9q4EWqVAm1YUaW-Baj5gyRqIo,22809
326
+ metaflow/plugins/metadata_providers/service.py,sha256=5UlK0R5M9_nq2J6MgJgCZwqAC3bEsofFbglq1K4p4QI,22942
327
327
  metaflow/plugins/pypi/__init__.py,sha256=0YFZpXvX7HCkyBFglatual7XGifdA1RwC3U4kcizyak,1037
328
328
  metaflow/plugins/pypi/bootstrap.py,sha256=NaQboUVNJc90gmUa69-cK_T3G7piHNNsUSaN96IJoic,14745
329
329
  metaflow/plugins/pypi/conda_decorator.py,sha256=N0HGiaS1mRsa6qT4eYzu2C3DHtas22QIXowW4vEl44M,15961
@@ -342,7 +342,7 @@ metaflow/plugins/uv/bootstrap.py,sha256=nKucPuEk6IEuu9R3aJtaTaOsD1eZjmQ4iz0t4vYF
342
342
  metaflow/plugins/uv/uv_environment.py,sha256=6hUaWrTgqHyzS6igGQUXpS6jb_GHv3Wq9ZrWhZgEals,2587
343
343
  metaflow/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
344
344
  metaflow/runner/click_api.py,sha256=u9Y1bu9vN13ektBs-L8lg2oxb5oYvGe1dPJjV2shMAw,23727
345
- metaflow/runner/deployer.py,sha256=SejRSiC5R0dCS7WaKePHd0fiXZ5ZK34S8CUCJnoIUjc,9318
345
+ metaflow/runner/deployer.py,sha256=U-hwf4gVzwUlXgnkfTW3y1daGXvo5eP4HTQZwb-vS0g,11058
346
346
  metaflow/runner/deployer_impl.py,sha256=zTING0_fwP44JcGo69DuNrVut5KqdBVzYOM7MYTZgIY,7049
347
347
  metaflow/runner/metaflow_runner.py,sha256=BaDAp-3tCPwJRy_R8hLTAu6L0qjjuQmjeo-L1inhr_c,17498
348
348
  metaflow/runner/nbdeploy.py,sha256=Sp5w-6nCZwjHaRBHWxi8udya-RYnJOB76KNLjB4L7Gs,4166
@@ -389,12 +389,12 @@ metaflow/user_configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
389
389
  metaflow/user_configs/config_decorators.py,sha256=qCKVAvd0NKgaCxQ2OThes5-DYHXq6A1HqURubYNeFdw,20481
390
390
  metaflow/user_configs/config_options.py,sha256=aB53M-2WkDPo_TRLAcC8v89Wy8-oxflfW4l-xlb5pDI,21089
391
391
  metaflow/user_configs/config_parameters.py,sha256=Eyiqcz4YV_z4algDHAh2gaejGFgIdHk8Vix9AUdPSh0,20989
392
- metaflow-2.15.15.data/data/share/metaflow/devtools/Makefile,sha256=5n89OGIC_kE4wxtEI66VCucN-b-1w5bqvGeZYmeRGz8,13737
393
- metaflow-2.15.15.data/data/share/metaflow/devtools/Tiltfile,sha256=P5_rn_F3xYLN1_cEAQ9mNeS22HG2rb8beKIz2RIK6fU,20634
394
- metaflow-2.15.15.data/data/share/metaflow/devtools/pick_services.sh,sha256=DCnrMXwtApfx3B4S-YiZESMyAFHbXa3VuNL0MxPLyiE,2196
395
- metaflow-2.15.15.dist-info/licenses/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
396
- metaflow-2.15.15.dist-info/METADATA,sha256=rbgxYGmgI9YS37Hrb7FP2cQoUsAlGLl5gdwVkQER2r0,6742
397
- metaflow-2.15.15.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
398
- metaflow-2.15.15.dist-info/entry_points.txt,sha256=RvEq8VFlgGe_FfqGOZi0D7ze1hLD0pAtXeNyGfzc_Yc,103
399
- metaflow-2.15.15.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
400
- metaflow-2.15.15.dist-info/RECORD,,
392
+ metaflow-2.15.16.data/data/share/metaflow/devtools/Makefile,sha256=5n89OGIC_kE4wxtEI66VCucN-b-1w5bqvGeZYmeRGz8,13737
393
+ metaflow-2.15.16.data/data/share/metaflow/devtools/Tiltfile,sha256=P5_rn_F3xYLN1_cEAQ9mNeS22HG2rb8beKIz2RIK6fU,20634
394
+ metaflow-2.15.16.data/data/share/metaflow/devtools/pick_services.sh,sha256=DCnrMXwtApfx3B4S-YiZESMyAFHbXa3VuNL0MxPLyiE,2196
395
+ metaflow-2.15.16.dist-info/licenses/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
396
+ metaflow-2.15.16.dist-info/METADATA,sha256=tJxdSSfjh56YThcF7BrwHK50l86Ku5Pb-KFZt0nSiyU,6742
397
+ metaflow-2.15.16.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
398
+ metaflow-2.15.16.dist-info/entry_points.txt,sha256=RvEq8VFlgGe_FfqGOZi0D7ze1hLD0pAtXeNyGfzc_Yc,103
399
+ metaflow-2.15.16.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
400
+ metaflow-2.15.16.dist-info/RECORD,,