ob-metaflow 2.18.7.5__py2.py3-none-any.whl → 2.18.9.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.

metaflow/includefile.py CHANGED
@@ -7,9 +7,10 @@ import json
7
7
  import os
8
8
 
9
9
  from hashlib import sha1
10
- from typing import Any, Callable, Dict, Optional
10
+ from typing import Any, Callable, Dict, Optional, Union
11
11
 
12
12
  from metaflow._vendor import click
13
+ from metaflow._vendor import yaml
13
14
 
14
15
  from .exception import MetaflowException
15
16
  from .parameters import (
@@ -20,7 +21,7 @@ from .parameters import (
20
21
  )
21
22
 
22
23
  from .plugins import DATACLIENTS
23
- from .user_configs.config_parameters import ConfigValue
24
+ from .user_configs.config_options import ConfigInput
24
25
  from .util import get_username
25
26
 
26
27
  import functools
@@ -261,6 +262,12 @@ class IncludeFile(Parameter):
261
262
  show_default : bool, default True
262
263
  If True, show the default value in the help text. A value of None is equivalent
263
264
  to True.
265
+ parser : Union[str, Callable[[str], Any]], optional, default None
266
+ If a callable, it is a function that can parse the file contents
267
+ into any desired format. If a string, the string should refer to
268
+ a function (like "my_parser_package.my_parser.my_parser_function") which should
269
+ be able to parse the file contents. If the name starts with a ".", it is assumed
270
+ to be relative to "metaflow".
264
271
  """
265
272
 
266
273
  def __init__(
@@ -270,6 +277,7 @@ class IncludeFile(Parameter):
270
277
  is_text: Optional[bool] = None,
271
278
  encoding: Optional[str] = None,
272
279
  help: Optional[str] = None,
280
+ parser: Optional[Union[str, Callable[[str], Any]]] = None,
273
281
  **kwargs: Dict[str, str]
274
282
  ):
275
283
  self._includefile_overrides = {}
@@ -277,6 +285,7 @@ class IncludeFile(Parameter):
277
285
  self._includefile_overrides["is_text"] = is_text
278
286
  if encoding is not None:
279
287
  self._includefile_overrides["encoding"] = encoding
288
+ self._parser = parser
280
289
  # NOTA: Right now, there is an issue where these can't be overridden by config
281
290
  # in all circumstances. Ignoring for now.
282
291
  super(IncludeFile, self).__init__(
@@ -336,7 +345,20 @@ class IncludeFile(Parameter):
336
345
  def load_parameter(self, v):
337
346
  if v is None:
338
347
  return v
339
- return v.decode(self.name, var_type="Parameter")
348
+
349
+ # Get the raw content from the file
350
+ content = v.decode(self.name, var_type="Parameter")
351
+ # If a parser is specified, use it to parse the content
352
+ if self._parser is not None:
353
+ try:
354
+ return ConfigInput._call_parser(self._parser, content)
355
+ except Exception as e:
356
+ raise MetaflowException(
357
+ "Failed to parse content in parameter '%s' using parser: %s"
358
+ % (self.name, str(e))
359
+ ) from e
360
+
361
+ return content
340
362
 
341
363
  @staticmethod
342
364
  def _eval_default(is_text, encoding, default_path):
@@ -170,6 +170,7 @@ DEPLOYER_IMPL_PROVIDERS_DESC = [
170
170
  ]
171
171
 
172
172
  TL_PLUGINS_DESC = [
173
+ ("yaml_parser", ".parsers.yaml_parser"),
173
174
  ("requirements_txt_parser", ".pypi.parsers.requirements_txt_parser"),
174
175
  ("pyproject_toml_parser", ".pypi.parsers.pyproject_toml_parser"),
175
176
  ("conda_environment_yml_parser", ".pypi.parsers.conda_environment_yml_parser"),
@@ -1385,6 +1385,9 @@ class S3(object):
1385
1385
  except OSError as e:
1386
1386
  if e.errno == errno.ENOSPC:
1387
1387
  raise MetaflowS3InsufficientDiskSpace(str(e))
1388
+ except MetaflowException as ex:
1389
+ # Re-raise Metaflow exceptions (including TimeoutException)
1390
+ raise
1388
1391
  except Exception as ex:
1389
1392
  error = str(ex)
1390
1393
  if tmp:
@@ -50,6 +50,7 @@ import metaflow.tracing as tracing
50
50
  from metaflow.metaflow_config import (
51
51
  S3_WORKER_COUNT,
52
52
  )
53
+ from metaflow.exception import MetaflowException
53
54
 
54
55
  DOWNLOAD_FILE_THRESHOLD = 2 * TransferConfig().multipart_threshold
55
56
  DOWNLOAD_MAX_CHUNK = 2 * 1024 * 1024 * 1024 - 1
@@ -287,6 +288,11 @@ def worker(result_file_name, queue, mode, s3config):
287
288
  result_file.write("%d %d\n" % (idx, -ERROR_TRANSIENT))
288
289
  result_file.flush()
289
290
  continue
291
+ except MetaflowException:
292
+ # Re-raise Metaflow exceptions (including TimeoutException)
293
+ tmp.close()
294
+ os.unlink(tmp.name)
295
+ raise
290
296
  except (SSLError, Exception) as e:
291
297
  tmp.close()
292
298
  os.unlink(tmp.name)
@@ -357,6 +363,9 @@ def worker(result_file_name, queue, mode, s3config):
357
363
  err = convert_to_client_error(e)
358
364
  handle_client_error(err, idx, result_file)
359
365
  continue
366
+ except MetaflowException:
367
+ # Re-raise Metaflow exceptions (including TimeoutException)
368
+ raise
360
369
  except (SSLError, Exception) as e:
361
370
  # assume anything else is transient
362
371
  result_file.write("%d %d\n" % (idx, -ERROR_TRANSIENT))
@@ -385,6 +394,10 @@ def convert_to_client_error(e):
385
394
 
386
395
 
387
396
  def handle_client_error(err, idx, result_file):
397
+ # Handle all MetaflowExceptions as fatal
398
+ if isinstance(err, MetaflowException):
399
+ raise err
400
+
388
401
  error_code = normalize_client_error(err)
389
402
  if error_code == 404:
390
403
  result_file.write("%d %d\n" % (idx, -ERROR_URL_NOT_FOUND))
@@ -0,0 +1,16 @@
1
+ from metaflow._vendor import yaml
2
+
3
+
4
+ def yaml_parser(content: str) -> dict:
5
+ """
6
+ Parse YAML content to a dictionary.
7
+
8
+ Parameters
9
+ ----------
10
+ content : str
11
+
12
+ Returns
13
+ -------
14
+ dict
15
+ """
16
+ return yaml.safe_load(content)
metaflow/version.py CHANGED
@@ -1 +1 @@
1
- metaflow_version = "2.18.7.5"
1
+ metaflow_version = "2.18.9.1"
@@ -14,6 +14,17 @@
14
14
  version_settings(constraint='>=0.22.2')
15
15
  allow_k8s_contexts('minikube')
16
16
 
17
+ # Version configuration for components
18
+ JOBSET_VERSION = os.getenv("JOBSET_VERSION", "v0.8.2")
19
+
20
+ # Argo Workflows versions
21
+ ARGO_WORKFLOWS_HELM_CHART_VERSION = os.getenv("ARGO_WORKFLOWS_HELM_CHART_VERSION", "0.45.2") # Helm chart version
22
+ ARGO_WORKFLOWS_IMAGE_TAG = os.getenv("ARGO_WORKFLOWS_IMAGE_TAG", "v3.6.0") # Argo Workflows application version
23
+
24
+ # Argo Events versions
25
+ ARGO_EVENTS_HELM_CHART_VERSION = os.getenv("ARGO_EVENTS_HELM_CHART_VERSION", "2.4.8") # Helm chart version
26
+ ARGO_EVENTS_IMAGE_TAG = os.getenv("ARGO_EVENTS_IMAGE_TAG", "v1.9.2") # Argo Events application version
27
+
17
28
  components = {
18
29
  "metadata-service": ["postgresql"],
19
30
  "ui": ["postgresql", "minio"],
@@ -21,9 +32,10 @@ components = {
21
32
  "postgresql": [],
22
33
  "argo-workflows": [],
23
34
  "argo-events": ["argo-workflows"],
35
+ "jobset": [],
24
36
  }
25
37
 
26
- services_env = os.getenv("SERVICES", "").strip().lower()
38
+ services_env = os.getenv("SERVICES", "all").strip().lower()
27
39
 
28
40
  if services_env:
29
41
  if services_env == "all":
@@ -205,6 +217,7 @@ if "postgresql" in enabled_components:
205
217
  if "argo-workflows" in enabled_components:
206
218
  helm_remote(
207
219
  'argo-workflows',
220
+ version=ARGO_WORKFLOWS_HELM_CHART_VERSION,
208
221
  repo_name='argo',
209
222
  repo_url='https://argoproj.github.io/argo-helm',
210
223
  set=[
@@ -220,7 +233,9 @@ if "argo-workflows" in enabled_components:
220
233
  'controller.resources.requests.memory=128Mi',
221
234
  'controller.resources.requests.cpu=50m',
222
235
  'controller.resources.limits.memory=256Mi',
223
- 'controller.resources.limits.cpu=100m'
236
+ 'controller.resources.limits.cpu=100m',
237
+ # Image version overrides
238
+ 'images.tag=%s' % ARGO_WORKFLOWS_IMAGE_TAG,
224
239
  ]
225
240
  )
226
241
 
@@ -307,6 +322,7 @@ if "argo-workflows" in enabled_components:
307
322
  if "argo-events" in enabled_components:
308
323
  helm_remote(
309
324
  'argo-events',
325
+ version=ARGO_EVENTS_HELM_CHART_VERSION,
310
326
  repo_name='argo',
311
327
  repo_url='https://argoproj.github.io/argo-helm',
312
328
  set=[
@@ -334,6 +350,8 @@ if "argo-events" in enabled_components:
334
350
  'configs.jetstream.versions[1].natsImage=nats:2.9.15',
335
351
  'configs.jetstream.versions[1].startCommand=/nats-server',
336
352
  'configs.jetstream.versions[1].version=2.9.15',
353
+ # Image version overrides
354
+ 'global.image.tag=%s' % ARGO_EVENTS_IMAGE_TAG,
337
355
  ]
338
356
  )
339
357
 
@@ -541,6 +559,62 @@ if "argo-events" in enabled_components:
541
559
  config_resources.append('argo-events-controller-manager')
542
560
  config_resources.append('argo-events-webhook-eventsource-svc')
543
561
 
562
+ #################################################
563
+ # JOBSET
564
+ #################################################
565
+ if "jobset" in enabled_components:
566
+ # Apply JobSet manifests directly from GitHub releases
567
+ jobset_manifest_url = "https://github.com/kubernetes-sigs/jobset/releases/download/%s/manifests.yaml" % JOBSET_VERSION
568
+
569
+ cmd = "curl -sSL %s" % (jobset_manifest_url)
570
+ k8s_yaml(
571
+ local(
572
+ cmd,
573
+ )
574
+ )
575
+
576
+ k8s_resource(
577
+ 'jobset-controller-manager',
578
+ labels=['jobset'],
579
+ )
580
+
581
+ metaflow_config["METAFLOW_KUBERNETES_JOBSET_ENABLED"] = "true"
582
+
583
+ config_resources.append('jobset-controller-manager')
584
+
585
+ # ClusterRole for jobset operations
586
+ k8s_yaml(encode_yaml({
587
+ 'apiVersion': 'rbac.authorization.k8s.io/v1',
588
+ 'kind': 'ClusterRole',
589
+ 'metadata': {
590
+ 'name': 'jobset-full-access'
591
+ },
592
+ 'rules': [{
593
+ 'apiGroups': ['jobset.x-k8s.io'],
594
+ 'resources': ['jobsets'],
595
+ 'verbs': ['*']
596
+ }]
597
+ }))
598
+
599
+ # ClusterRoleBinding for default service account to access jobsets
600
+ k8s_yaml(encode_yaml({
601
+ 'apiVersion': 'rbac.authorization.k8s.io/v1',
602
+ 'kind': 'ClusterRoleBinding',
603
+ 'metadata': {
604
+ 'name': 'default-jobset-binding'
605
+ },
606
+ 'subjects': [{
607
+ 'kind': 'ServiceAccount',
608
+ 'name': 'default',
609
+ 'namespace': 'default'
610
+ }],
611
+ 'roleRef': {
612
+ 'kind': 'ClusterRole',
613
+ 'name': 'jobset-full-access',
614
+ 'apiGroup': 'rbac.authorization.k8s.io'
615
+ }
616
+ }))
617
+
544
618
  #################################################
545
619
  # METADATA SERVICE
546
620
  #################################################
@@ -18,6 +18,7 @@ SERVICE_OPTIONS=(
18
18
  "ui"
19
19
  "argo-workflows"
20
20
  "argo-events"
21
+ "jobset"
21
22
  )
22
23
 
23
24
  gum style "$LOGO" \
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ob-metaflow
3
- Version: 2.18.7.5
3
+ Version: 2.18.9.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.18.7.5; extra == "stubs"
15
+ Requires-Dist: metaflow-stubs==2.18.9.1; extra == "stubs"
16
16
  Dynamic: author
17
17
  Dynamic: author-email
18
18
  Dynamic: description
@@ -86,3 +86,4 @@ We'd love to hear from you. Join our community [Slack workspace](http://slack.ou
86
86
  ## Contributing
87
87
  We welcome contributions to Metaflow. Please see our [contribution guide](https://docs.metaflow.org/introduction/contributing-to-metaflow) for more details.
88
88
 
89
+
@@ -12,7 +12,7 @@ metaflow/events.py,sha256=ahjzkSbSnRCK9RZ-9vTfUviz_6gMvSO9DGkJ86X80-k,5300
12
12
  metaflow/exception.py,sha256=_m9ZBJM0cooHRslDqfxCPQmkChqaTh6fGxp7HvISnYI,5161
13
13
  metaflow/flowspec.py,sha256=9wsO2_QoO_VHKusKdpslfbwQREOwf0fAzF-DSEA0iZ8,41968
14
14
  metaflow/graph.py,sha256=UOeClj-JeORRlZWOQMI1CirkrCpTvVWvRcSwODCajMg,19263
15
- metaflow/includefile.py,sha256=RtISGl1V48qjkJBakUZ9yPpHV102h7pOIFiKP8PLHpc,20927
15
+ metaflow/includefile.py,sha256=NXERo_halboBCjvnS5iCjnBMyCMlQMnT2mRe6kxl2xU,21978
16
16
  metaflow/integrations.py,sha256=LlsaoePRg03DjENnmLxZDYto3NwWc9z_PtU6nJxLldg,1480
17
17
  metaflow/lint.py,sha256=A2NdUq_MnQal_RUCMC8ZOSR0VYZGyi2mSgwPQB0UzQo,15343
18
18
  metaflow/meta_files.py,sha256=vlgJHI8GJUKzXoxdrVoH8yyCF5bhFgwYemUgnyd1wgM,342
@@ -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=g2SOU_CRzJLgDM_UGF9QDMANMAIHAsDRXE6S76_YzsY,14594
38
38
  metaflow/vendor.py,sha256=A82CGHfStZGDP5pQ5XzRjFkbN1ZC-vFmghXIrzMDDNg,5868
39
- metaflow/version.py,sha256=wr7-KAbKDrPvB4XEDBnfNF9mwf_ORPReiVhKweI1UQ4,30
39
+ metaflow/version.py,sha256=VXnTFv7difhCqOiu2Rrnc4LOaj3sTVQlAoY6KrPgrWQ,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
@@ -198,7 +198,7 @@ metaflow/packaging_sys/distribution_support.py,sha256=VvikZBCH8N1TBZZ2Twk8jH1brm
198
198
  metaflow/packaging_sys/tar_backend.py,sha256=nFWuXiwYjWQkFdV2KaZ6gazNVvtY84Eqsh9txhU3pNY,3010
199
199
  metaflow/packaging_sys/utils.py,sha256=x8SVglJvY5mIAilS7MqZi2PpMr6IEyi6RCg3l8hN3G0,2972
200
200
  metaflow/packaging_sys/v1.py,sha256=kbNK0-pDAv3QJPZ789TE0UirGXcHbXkVQiyNT815H7A,20631
201
- metaflow/plugins/__init__.py,sha256=yFxjJOlnfap7tQMNgSgaso2tl_zr1BcWL7KoUKk4c9Y,8617
201
+ metaflow/plugins/__init__.py,sha256=XBocLBSWEPAeeakhTb6HGuocykkVukmnUuQgg-gGWEk,8662
202
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
@@ -207,6 +207,7 @@ metaflow/plugins/events_decorator.py,sha256=FULT_Iuue9KsLyNhHOL46uw8cdT-Viq8rmcg
207
207
  metaflow/plugins/logs_cli.py,sha256=77W5UNagU2mOKSMMvrQxQmBLRzvmjK-c8dWxd-Ygbqs,11410
208
208
  metaflow/plugins/package_cli.py,sha256=GOxKJs9Wt0x9VtcTJ2EG_wj6pWnlS0XBFAyHpCzzuvs,2000
209
209
  metaflow/plugins/parallel_decorator.py,sha256=wtR_3eRIP3eV7fBIm15oouRjmHBFZ9OklxdaNvttLEQ,9702
210
+ metaflow/plugins/parsers.py,sha256=y92kMEFmbBvzU7EjZSFgml3S6EOLwY5Qmb4Jwk7leUw,249
210
211
  metaflow/plugins/project_decorator.py,sha256=uhwsguEj7OM_E2OnY1ap3MoGocQHeywuJSa-qPuWn-U,7592
211
212
  metaflow/plugins/resources_decorator.py,sha256=AtoOwg4mHYHYthg-CAfbfam-QiT0ViuDLDoukoDvF6Q,1347
212
213
  metaflow/plugins/retry_decorator.py,sha256=tz_2Tq6GLg3vjDBZp0KKVTk3ADlCvqaWTSf7blmFdUw,1548
@@ -306,8 +307,8 @@ metaflow/plugins/datastores/s3_storage.py,sha256=CZdNqaKtxDXQbEg2YHyphph3hWcLIE5
306
307
  metaflow/plugins/datatools/__init__.py,sha256=ge4L16OBQLy2J_MMvoHg3lMfdm-MluQgRWoyZ5GCRnk,1267
307
308
  metaflow/plugins/datatools/local.py,sha256=FJvMOBcjdyhSPHmdLocBSiIT0rmKkKBmsaclxH75x08,4233
308
309
  metaflow/plugins/datatools/s3/__init__.py,sha256=14tr9fPjN3ULW5IOfKHeG7Uhjmgm7LMtQHfz1SFv-h8,248
309
- metaflow/plugins/datatools/s3/s3.py,sha256=3xrWD6pXoVRpuAQHyLGVya79UIE0S8AqAqe2prg4yMw,67182
310
- metaflow/plugins/datatools/s3/s3op.py,sha256=nDFgc5m0ud-uK4D2_vyweGpGoMjESxu3TlX86zA1MdQ,47561
310
+ metaflow/plugins/datatools/s3/s3.py,sha256=b07QwYvfKvR1k0eZ_b5Hk4XQnQs3ORk6b0nvCwfZL8w,67324
311
+ metaflow/plugins/datatools/s3/s3op.py,sha256=3GOtIV08gmAo7XE6NNnsSUxTTRIsvgPJn7CC0U5E7XY,48129
311
312
  metaflow/plugins/datatools/s3/s3tail.py,sha256=boQjQGQMI-bvTqcMP2y7uSlSYLcvWOy7J3ZUaF78NAA,2597
312
313
  metaflow/plugins/datatools/s3/s3util.py,sha256=FgRgaVmEq7-i2dV7q8XK5w5PfFt-xJjZa8WrK8IJfdI,3769
313
314
  metaflow/plugins/env_escape/__init__.py,sha256=tGNUZnmPvk52eNs__VK443b3CZ7ogEFTT-s9_n_HF8Q,8837
@@ -428,12 +429,12 @@ metaflow/user_decorators/mutable_flow.py,sha256=EywKTN3cnXPQF_s62wQaC4a4aH14j8oe
428
429
  metaflow/user_decorators/mutable_step.py,sha256=-BY0UDXf_RCAEnC5JlLzEXGdiw1KD9oSrSxS_SWaB9Y,16791
429
430
  metaflow/user_decorators/user_flow_decorator.py,sha256=2yDwZq9QGv9W-7kEuKwa8o4ZkTvuHJ5ESz7VVrGViAI,9890
430
431
  metaflow/user_decorators/user_step_decorator.py,sha256=4558NR8RJtN22OyTwCXO80bAMhMTaRGMoX12b1GMcPc,27232
431
- ob_metaflow-2.18.7.5.data/data/share/metaflow/devtools/Makefile,sha256=TT4TCq8ALSfqYyGqDPocN5oPcZe2FqoCZxmGO1LmyCc,13760
432
- ob_metaflow-2.18.7.5.data/data/share/metaflow/devtools/Tiltfile,sha256=Ty5p6AD3MwJAcAnOGv4yMz8fExAsnNQ11r8whK6uzzw,21381
433
- ob_metaflow-2.18.7.5.data/data/share/metaflow/devtools/pick_services.sh,sha256=DCnrMXwtApfx3B4S-YiZESMyAFHbXa3VuNL0MxPLyiE,2196
434
- ob_metaflow-2.18.7.5.dist-info/licenses/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
435
- ob_metaflow-2.18.7.5.dist-info/METADATA,sha256=7S0AlPeNebxn0NgvuCNDdr867lfbZuZHnf03RlrvslA,5935
436
- ob_metaflow-2.18.7.5.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
437
- ob_metaflow-2.18.7.5.dist-info/entry_points.txt,sha256=RvEq8VFlgGe_FfqGOZi0D7ze1hLD0pAtXeNyGfzc_Yc,103
438
- ob_metaflow-2.18.7.5.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
439
- ob_metaflow-2.18.7.5.dist-info/RECORD,,
432
+ ob_metaflow-2.18.9.1.data/data/share/metaflow/devtools/Makefile,sha256=TT4TCq8ALSfqYyGqDPocN5oPcZe2FqoCZxmGO1LmyCc,13760
433
+ ob_metaflow-2.18.9.1.data/data/share/metaflow/devtools/Tiltfile,sha256=8-VMYGdEBFp73Ur5BzQn7TxxkMBMhwJszsVhR_ftgBU,23892
434
+ ob_metaflow-2.18.9.1.data/data/share/metaflow/devtools/pick_services.sh,sha256=PGjQeDIigFHeoQ0asmYNdYDPIOdeYy1UYvkw2wdN4zg,2209
435
+ ob_metaflow-2.18.9.1.dist-info/licenses/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
436
+ ob_metaflow-2.18.9.1.dist-info/METADATA,sha256=nlw2RXeC4Si_MUdE4HsupPx9ujhkoFYlyobwPy-jt8M,5936
437
+ ob_metaflow-2.18.9.1.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
438
+ ob_metaflow-2.18.9.1.dist-info/entry_points.txt,sha256=RvEq8VFlgGe_FfqGOZi0D7ze1hLD0pAtXeNyGfzc_Yc,103
439
+ ob_metaflow-2.18.9.1.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
440
+ ob_metaflow-2.18.9.1.dist-info/RECORD,,