metaflow 2.15.8__py2.py3-none-any.whl → 2.15.10__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.
@@ -1978,6 +1978,15 @@ class ArgoWorkflows(object):
1978
1978
  resources["disk"],
1979
1979
  )
1980
1980
 
1981
+ security_context = resources.get("security_context", None)
1982
+ _security_context = {}
1983
+ if security_context is not None and len(security_context) > 0:
1984
+ _security_context = {
1985
+ "security_context": kubernetes_sdk.V1SecurityContext(
1986
+ **security_context
1987
+ )
1988
+ }
1989
+
1981
1990
  # Create a ContainerTemplate for this node. Ideally, we would have
1982
1991
  # liked to inline this ContainerTemplate and avoid scanning the workflow
1983
1992
  # twice, but due to issues with variable substitution, we will have to
@@ -2034,6 +2043,7 @@ class ArgoWorkflows(object):
2034
2043
  shared_memory=shared_memory,
2035
2044
  port=port,
2036
2045
  qos=resources["qos"],
2046
+ security_context=security_context,
2037
2047
  )
2038
2048
 
2039
2049
  for k, v in env.items():
@@ -2310,6 +2320,7 @@ class ArgoWorkflows(object):
2310
2320
  is not None
2311
2321
  else []
2312
2322
  ),
2323
+ **_security_context,
2313
2324
  ).to_dict()
2314
2325
  )
2315
2326
  )
@@ -40,6 +40,7 @@ unsupported_decorators = {
40
40
  "snowpark": "Step *%s* is marked for execution on Snowpark with Argo Workflows which isn't currently supported.",
41
41
  "slurm": "Step *%s* is marked for execution on Slurm with Argo Workflows which isn't currently supported.",
42
42
  "nvidia": "Step *%s* is marked for execution on Nvidia with Argo Workflows which isn't currently supported.",
43
+ "nvct": "Step *%s* is marked for execution on Nvct with Argo Workflows which isn't currently supported.",
43
44
  }
44
45
 
45
46
 
@@ -1,3 +1,4 @@
1
+ import errno
1
2
  import json
2
3
  import os
3
4
  import re
@@ -137,6 +138,10 @@ class MetaflowS3InvalidRange(MetaflowException):
137
138
  headline = "S3 invalid range"
138
139
 
139
140
 
141
+ class MetaflowS3InsufficientDiskSpace(MetaflowException):
142
+ headline = "Insufficient disk space"
143
+
144
+
140
145
  class S3Object(object):
141
146
  """
142
147
  This object represents a path or an object in S3,
@@ -1377,8 +1382,10 @@ class S3(object):
1377
1382
  elif error_code == "NoSuchBucket":
1378
1383
  raise MetaflowS3URLException("Specified S3 bucket doesn't exist.")
1379
1384
  error = str(err)
1385
+ except OSError as e:
1386
+ if e.errno == errno.ENOSPC:
1387
+ raise MetaflowS3InsufficientDiskSpace(str(e))
1380
1388
  except Exception as ex:
1381
- # TODO specific error message for out of disk space
1382
1389
  error = str(ex)
1383
1390
  if tmp:
1384
1391
  os.unlink(tmp.name)
@@ -1,5 +1,6 @@
1
1
  from __future__ import print_function
2
2
 
3
+ import errno
3
4
  import json
4
5
  import time
5
6
  import math
@@ -108,6 +109,7 @@ ERROR_VERIFY_FAILED = 9
108
109
  ERROR_LOCAL_FILE_NOT_FOUND = 10
109
110
  ERROR_INVALID_RANGE = 11
110
111
  ERROR_TRANSIENT = 12
112
+ ERROR_OUT_OF_DISK_SPACE = 13
111
113
 
112
114
 
113
115
  def format_result_line(idx, prefix, url="", local=""):
@@ -277,6 +279,17 @@ def worker(result_file_name, queue, mode, s3config):
277
279
  err = convert_to_client_error(e)
278
280
  handle_client_error(err, idx, result_file)
279
281
  continue
282
+ except OSError as e:
283
+ tmp.close()
284
+ os.unlink(tmp.name)
285
+ if e.errno == errno.ENOSPC:
286
+ result_file.write(
287
+ "%d %d\n" % (idx, -ERROR_OUT_OF_DISK_SPACE)
288
+ )
289
+ else:
290
+ result_file.write("%d %d\n" % (idx, -ERROR_TRANSIENT))
291
+ result_file.flush()
292
+ continue
280
293
  except (SSLError, Exception) as e:
281
294
  tmp.close()
282
295
  os.unlink(tmp.name)
@@ -643,6 +656,8 @@ def exit(exit_code, url):
643
656
  msg = "Local file not found: %s" % url
644
657
  elif exit_code == ERROR_TRANSIENT:
645
658
  msg = "Transient error for url: %s" % url
659
+ elif exit_code == ERROR_OUT_OF_DISK_SPACE:
660
+ msg = "Out of disk space when downloading URL: %s" % url
646
661
  else:
647
662
  msg = "Unknown error"
648
663
  print("s3op failed:\n%s" % msg, file=sys.stderr)
@@ -1173,6 +1188,8 @@ def get(
1173
1188
  )
1174
1189
  if verify:
1175
1190
  verify_info.append((url, sz))
1191
+ elif sz == -ERROR_OUT_OF_DISK_SPACE:
1192
+ exit(ERROR_OUT_OF_DISK_SPACE, url)
1176
1193
  elif sz == -ERROR_URL_ACCESS_DENIED:
1177
1194
  denied_url = url
1178
1195
  break
@@ -194,6 +194,7 @@ class Kubernetes(object):
194
194
  port=None,
195
195
  num_parallel=None,
196
196
  qos=None,
197
+ security_context=None,
197
198
  ):
198
199
  name = "js-%s" % str(uuid4())[:6]
199
200
  jobset = (
@@ -227,6 +228,7 @@ class Kubernetes(object):
227
228
  port=port,
228
229
  num_parallel=num_parallel,
229
230
  qos=qos,
231
+ security_context=security_context,
230
232
  )
231
233
  .environment_variable("METAFLOW_CODE_SHA", code_package_sha)
232
234
  .environment_variable("METAFLOW_CODE_URL", code_package_url)
@@ -488,6 +490,7 @@ class Kubernetes(object):
488
490
  name_pattern=None,
489
491
  qos=None,
490
492
  annotations=None,
493
+ security_context=None,
491
494
  ):
492
495
  if env is None:
493
496
  env = {}
@@ -530,6 +533,7 @@ class Kubernetes(object):
530
533
  shared_memory=shared_memory,
531
534
  port=port,
532
535
  qos=qos,
536
+ security_context=security_context,
533
537
  )
534
538
  .environment_variable("METAFLOW_CODE_SHA", code_package_sha)
535
539
  .environment_variable("METAFLOW_CODE_URL", code_package_url)
@@ -145,6 +145,12 @@ def kubernetes():
145
145
  type=JSONTypeClass(),
146
146
  multiple=False,
147
147
  )
148
+ @click.option(
149
+ "--security-context",
150
+ default=None,
151
+ type=JSONTypeClass(),
152
+ multiple=False,
153
+ )
148
154
  @click.pass_context
149
155
  def step(
150
156
  ctx,
@@ -176,6 +182,7 @@ def step(
176
182
  qos=None,
177
183
  labels=None,
178
184
  annotations=None,
185
+ security_context=None,
179
186
  **kwargs
180
187
  ):
181
188
  def echo(msg, stream="stderr", job_id=None, **kwargs):
@@ -319,6 +326,7 @@ def step(
319
326
  qos=qos,
320
327
  labels=labels,
321
328
  annotations=annotations,
329
+ security_context=security_context,
322
330
  )
323
331
  except Exception:
324
332
  traceback.print_exc(chain=False)
@@ -122,6 +122,14 @@ class KubernetesDecorator(StepDecorator):
122
122
  Only applicable when @parallel is used.
123
123
  qos: str, default: Burstable
124
124
  Quality of Service class to assign to the pod. Supported values are: Guaranteed, Burstable, BestEffort
125
+
126
+ security_context: Dict[str, Any], optional, default None
127
+ Container security context. Applies to the task container. Allows the following keys:
128
+ - privileged: bool, optional, default None
129
+ - allow_privilege_escalation: bool, optional, default None
130
+ - run_as_user: int, optional, default None
131
+ - run_as_group: int, optional, default None
132
+ - run_as_non_root: bool, optional, default None
125
133
  """
126
134
 
127
135
  name = "kubernetes"
@@ -152,6 +160,7 @@ class KubernetesDecorator(StepDecorator):
152
160
  "executable": None,
153
161
  "hostname_resolution_timeout": 10 * 60,
154
162
  "qos": KUBERNETES_QOS,
163
+ "security_context": None,
155
164
  }
156
165
  package_url = None
157
166
  package_sha = None
@@ -474,6 +483,7 @@ class KubernetesDecorator(StepDecorator):
474
483
  "persistent_volume_claims",
475
484
  "labels",
476
485
  "annotations",
486
+ "security_context",
477
487
  ]:
478
488
  cli_args.command_options[k] = json.dumps(v)
479
489
  else:
@@ -80,6 +80,13 @@ class KubernetesJob(object):
80
80
  self._kwargs["disk"],
81
81
  )
82
82
 
83
+ security_context = self._kwargs.get("security_context", {})
84
+ _security_context = {}
85
+ if security_context is not None and len(security_context) > 0:
86
+ _security_context = {
87
+ "security_context": client.V1SecurityContext(**security_context)
88
+ }
89
+
83
90
  return client.V1JobSpec(
84
91
  # Retries are handled by Metaflow when it is responsible for
85
92
  # executing the flow. The responsibility is moved to Kubernetes
@@ -203,6 +210,7 @@ class KubernetesJob(object):
203
210
  if self._kwargs["persistent_volume_claims"] is not None
204
211
  else []
205
212
  ),
213
+ **_security_context,
206
214
  )
207
215
  ],
208
216
  node_selector=self._kwargs.get("node_selector"),
@@ -562,6 +562,12 @@ class JobSetSpec(object):
562
562
  self._kwargs["memory"],
563
563
  self._kwargs["disk"],
564
564
  )
565
+ security_context = self._kwargs.get("security_context", {})
566
+ _security_context = {}
567
+ if security_context is not None and len(security_context) > 0:
568
+ _security_context = {
569
+ "security_context": client.V1SecurityContext(**security_context)
570
+ }
565
571
  return dict(
566
572
  name=self.name,
567
573
  template=client.api_client.ApiClient().sanitize_for_serialization(
@@ -708,6 +714,7 @@ class JobSetSpec(object):
708
714
  is not None
709
715
  else []
710
716
  ),
717
+ **_security_context,
711
718
  )
712
719
  ],
713
720
  node_selector=self._kwargs.get("node_selector"),
@@ -227,7 +227,8 @@ class CondaStepDecorator(StepDecorator):
227
227
  self.interpreter = (
228
228
  self.environment.interpreter(self.step)
229
229
  if not any(
230
- decorator.name in ["batch", "kubernetes", "nvidia", "snowpark", "slurm"]
230
+ decorator.name
231
+ in ["batch", "kubernetes", "nvidia", "snowpark", "slurm", "nvct"]
231
232
  for decorator in next(
232
233
  step for step in self.flow if step.name == self.step
233
234
  ).decorators
@@ -326,6 +326,7 @@ class CondaEnvironment(MetaflowEnvironment):
326
326
  "nvidia",
327
327
  "snowpark",
328
328
  "slurm",
329
+ "nvct",
329
330
  ]:
330
331
  target_platform = getattr(decorator, "target_platform", "linux-64")
331
332
  break
@@ -1,3 +1,4 @@
1
+ import os
1
2
  import json
2
3
  import time
3
4
 
@@ -52,7 +53,7 @@ class Deployer(metaclass=DeployerMeta):
52
53
  Parameters
53
54
  ----------
54
55
  flow_file : str
55
- Path to the flow file to deploy.
56
+ Path to the flow file to deploy, relative to current directory.
56
57
  show_output : bool, default True
57
58
  Show the 'stdout' and 'stderr' to the console by default.
58
59
  profile : Optional[str], default None
@@ -80,7 +81,12 @@ class Deployer(metaclass=DeployerMeta):
80
81
  file_read_timeout: int = 3600,
81
82
  **kwargs,
82
83
  ):
83
- self.flow_file = flow_file
84
+ # Convert flow_file to absolute path if it's relative
85
+ if not os.path.isabs(flow_file):
86
+ self.flow_file = os.path.abspath(flow_file)
87
+ else:
88
+ self.flow_file = flow_file
89
+
84
90
  self.show_output = show_output
85
91
  self.profile = profile
86
92
  self.env = env
@@ -25,7 +25,7 @@ class DeployerImpl(object):
25
25
  Parameters
26
26
  ----------
27
27
  flow_file : str
28
- Path to the flow file to deploy.
28
+ Path to the flow file to deploy, relative to current directory.
29
29
  show_output : bool, default True
30
30
  Show the 'stdout' and 'stderr' to the console by default.
31
31
  profile : Optional[str], default None
@@ -80,7 +80,11 @@ class DeployerImpl(object):
80
80
  from metaflow.cli import start
81
81
  from metaflow.runner.click_api import MetaflowAPI
82
82
 
83
- self.flow_file = flow_file
83
+ # Convert flow_file to absolute path if it's relative
84
+ if not os.path.isabs(flow_file):
85
+ self.flow_file = os.path.abspath(flow_file)
86
+ else:
87
+ self.flow_file = flow_file
84
88
  self.show_output = show_output
85
89
  self.profile = profile
86
90
  self.env = env
@@ -229,7 +229,7 @@ class Runner(metaclass=RunnerMeta):
229
229
  Parameters
230
230
  ----------
231
231
  flow_file : str
232
- Path to the flow file to run
232
+ Path to the flow file to run, relative to current directory.
233
233
  show_output : bool, default True
234
234
  Show the 'stdout' and 'stderr' to the console by default,
235
235
  Only applicable for synchronous 'run' and 'resume' functions.
@@ -286,7 +286,12 @@ class Runner(metaclass=RunnerMeta):
286
286
  from metaflow.cli import start
287
287
  from metaflow.runner.click_api import MetaflowAPI
288
288
 
289
- self.flow_file = flow_file
289
+ # Convert flow_file to absolute path if it's relative
290
+ if not os.path.isabs(flow_file):
291
+ self.flow_file = os.path.abspath(flow_file)
292
+ else:
293
+ self.flow_file = flow_file
294
+
290
295
  self.show_output = show_output
291
296
 
292
297
  self.env_vars = os.environ.copy()
metaflow/version.py CHANGED
@@ -1 +1 @@
1
- metaflow_version = "2.15.8"
1
+ metaflow_version = "2.15.10"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: metaflow
3
- Version: 2.15.8
3
+ Version: 2.15.10
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.8; extra == "stubs"
29
+ Requires-Dist: metaflow-stubs==2.15.10; 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=mJBkV5tShIyCsLDeM1zygQGeciQVMrVPm_qI8Oi33G0,14656
39
39
  metaflow/vendor.py,sha256=LZgXrh7ZSDmD32D1T5jj3OKKpXIqqxKzdMAOc5V0SD4,5162
40
- metaflow/version.py,sha256=8XQw9A4nDWkRa2GDc805yvkVhCHDDAZj-jh2ZCyveec,28
40
+ metaflow/version.py,sha256=TmvdoNgSSOj8vRXQ742Hmg2q7XLz3WdGatF-u_YzsjE,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
@@ -210,8 +210,8 @@ metaflow/plugins/airflow/sensors/s3_sensor.py,sha256=iDReG-7FKnumrtQg-HY6cCUAAqN
210
210
  metaflow/plugins/argo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
211
211
  metaflow/plugins/argo/argo_client.py,sha256=A1kI9rjVjCadDsBscZ2Wk8xRBI6GNgWV6SU7TyrdfrI,16530
212
212
  metaflow/plugins/argo/argo_events.py,sha256=_C1KWztVqgi3zuH57pInaE9OzABc2NnncC-zdwOMZ-w,5909
213
- metaflow/plugins/argo/argo_workflows.py,sha256=nF42vquNFcWBv4_XdCC8l5a1agFxGgVFZYkatOYzOQA,186081
214
- metaflow/plugins/argo/argo_workflows_cli.py,sha256=Ka-ea4x19E6DrYgGm5ZwormxEbTGdun8fyHl-mh0tfc,38265
213
+ metaflow/plugins/argo/argo_workflows.py,sha256=_Mf5l1nJy2M1h-dsTdbsGAH3_sRI8pYg3djniutY6QA,186566
214
+ metaflow/plugins/argo/argo_workflows_cli.py,sha256=X_GfJpc7jfP7DGuttl7U952767eBF6Ut45aWgoJzHVI,38375
215
215
  metaflow/plugins/argo/argo_workflows_decorator.py,sha256=ogCSBmwsC2C3eusydrgjuAJd4qK18f1sI4jJwA4Fd-o,7800
216
216
  metaflow/plugins/argo/argo_workflows_deployer.py,sha256=6kHxEnYXJwzNCM9swI8-0AckxtPWqwhZLerYkX8fxUM,4444
217
217
  metaflow/plugins/argo/argo_workflows_deployer_objects.py,sha256=lRRHUcpiyJZFltthxZoIp7aJWwy7pcdhaRm0etKN9es,14182
@@ -282,8 +282,8 @@ metaflow/plugins/datastores/s3_storage.py,sha256=CZdNqaKtxDXQbEg2YHyphph3hWcLIE5
282
282
  metaflow/plugins/datatools/__init__.py,sha256=ge4L16OBQLy2J_MMvoHg3lMfdm-MluQgRWoyZ5GCRnk,1267
283
283
  metaflow/plugins/datatools/local.py,sha256=FJvMOBcjdyhSPHmdLocBSiIT0rmKkKBmsaclxH75x08,4233
284
284
  metaflow/plugins/datatools/s3/__init__.py,sha256=14tr9fPjN3ULW5IOfKHeG7Uhjmgm7LMtQHfz1SFv-h8,248
285
- metaflow/plugins/datatools/s3/s3.py,sha256=ThISU4XjXhDqAtfgH_PgtNp0OxF_bhzCgNozYIeMa7g,66993
286
- metaflow/plugins/datatools/s3/s3op.py,sha256=I7XkDJvVvvLt8SmXNSZjSNONIa2m3QlT5-ZL8g6erno,46936
285
+ metaflow/plugins/datatools/s3/s3.py,sha256=3xrWD6pXoVRpuAQHyLGVya79UIE0S8AqAqe2prg4yMw,67182
286
+ metaflow/plugins/datatools/s3/s3op.py,sha256=20XEOCCK_nAVm92ZOjLPTzLnTs9xrIX0Gj-ELxkuNPY,47742
287
287
  metaflow/plugins/datatools/s3/s3tail.py,sha256=boQjQGQMI-bvTqcMP2y7uSlSYLcvWOy7J3ZUaF78NAA,2597
288
288
  metaflow/plugins/datatools/s3/s3util.py,sha256=FgRgaVmEq7-i2dV7q8XK5w5PfFt-xJjZa8WrK8IJfdI,3769
289
289
  metaflow/plugins/env_escape/__init__.py,sha256=tGNUZnmPvk52eNs__VK443b3CZ7ogEFTT-s9_n_HF8Q,8837
@@ -317,12 +317,12 @@ metaflow/plugins/gcp/gs_utils.py,sha256=ZmIGFse1qYyvAVrwga23PQUzF6dXEDLLsZ2F-YRm
317
317
  metaflow/plugins/gcp/includefile_support.py,sha256=OQO0IVWv4ObboL0VqEZwcDOyj9ORLdur66JToxQ84vU,3887
318
318
  metaflow/plugins/kubernetes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
319
319
  metaflow/plugins/kubernetes/kube_utils.py,sha256=jdFMGbEmIow-oli26v31W9CmbZXigx06b3D_xIobpk0,4140
320
- metaflow/plugins/kubernetes/kubernetes.py,sha256=g_E5jBhoMSDzGFnP5PDQiVPPllUr1wulVcG3tz247G8,29668
321
- metaflow/plugins/kubernetes/kubernetes_cli.py,sha256=PY-aMaVelHddHq3jqEEu9cvNl7xEjT2lFFADN9dXMkw,13918
320
+ metaflow/plugins/kubernetes/kubernetes.py,sha256=EUO2RepV4eudwoPv2Jha7w9f_h7sRT0gmwuVAqOWV2c,29832
321
+ metaflow/plugins/kubernetes/kubernetes_cli.py,sha256=fMpUUwfIaZ2vs_cH2q1r0iged2J4skTAYT0YrhLy3hY,14103
322
322
  metaflow/plugins/kubernetes/kubernetes_client.py,sha256=tuvXP-QKpdeSmzVolB2R_TaacOr5DIb0j642eKcjsiM,6491
323
- metaflow/plugins/kubernetes/kubernetes_decorator.py,sha256=ydJ6WyatCSwUzq_xGcjG1nCp1yRNhSyh09z0Y1cwDNI,30896
324
- metaflow/plugins/kubernetes/kubernetes_job.py,sha256=pO9ExyAVCDoAoWFn9oFcos2aa0MQk4_D61O-T4E10E8,31826
325
- metaflow/plugins/kubernetes/kubernetes_jobsets.py,sha256=XjduAYY_H-jX3lGK6b-jYt6QnDvC2ac3qIAgr-iDsCQ,42543
323
+ metaflow/plugins/kubernetes/kubernetes_decorator.py,sha256=aA7nNxgXep9jFR7xBVWTL3cFej0kofA2dcZSBnSNPx0,31403
324
+ metaflow/plugins/kubernetes/kubernetes_job.py,sha256=Eew4a7T7xbJvLeIFnLQzWU9fkRg92RHrFCaE8sCcfa4,32175
325
+ metaflow/plugins/kubernetes/kubernetes_jobsets.py,sha256=Q1PBtj_p8ofx46DRjO-7HN8Lt-ZZHwC6CD1JDF3Labo,42903
326
326
  metaflow/plugins/kubernetes/spot_metadata_cli.py,sha256=an0nWCxgflmqIPBCBrlb4m3DereDFFJBLt-KKhqcHc8,1670
327
327
  metaflow/plugins/kubernetes/spot_monitor_sidecar.py,sha256=zrWU-smQwPnL6MBHmzTxWyEA00R6iKKQbhhy50xFwQ8,3832
328
328
  metaflow/plugins/metadata_providers/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
@@ -330,8 +330,8 @@ metaflow/plugins/metadata_providers/local.py,sha256=Z0CXaGZJbAkj4II3WspJi-uCCtSh
330
330
  metaflow/plugins/metadata_providers/service.py,sha256=9j0db_EOGFdb49YTgr9q4EWqVAm1YUaW-Baj5gyRqIo,22809
331
331
  metaflow/plugins/pypi/__init__.py,sha256=0YFZpXvX7HCkyBFglatual7XGifdA1RwC3U4kcizyak,1037
332
332
  metaflow/plugins/pypi/bootstrap.py,sha256=SNONquX6QnTbu7htmhaQeVeZ2ofaFaUCDScRIrTTERc,14718
333
- metaflow/plugins/pypi/conda_decorator.py,sha256=piFcE4uGmWhhbGlxMK0GHd7BGEyqy6r9BFy8Mjoi80Q,15937
334
- metaflow/plugins/pypi/conda_environment.py,sha256=yeTPGuu38EQ8aYzXUbc6cLc9b2NMLLEnxS-C73PcDHk,22250
333
+ metaflow/plugins/pypi/conda_decorator.py,sha256=N0HGiaS1mRsa6qT4eYzu2C3DHtas22QIXowW4vEl44M,15961
334
+ metaflow/plugins/pypi/conda_environment.py,sha256=JuTfGfUML_AoeW4ASGkqPbm8OqtWsbtRwDNwrRTRqS4,22274
335
335
  metaflow/plugins/pypi/micromamba.py,sha256=LLJ2dGGOEyld07W8iI6dtE01h2Y1PQnBhU-dMBssZ3c,16502
336
336
  metaflow/plugins/pypi/parsers.py,sha256=gpOOG2Ph95wI73MWCAi7XjpK0gYhv5k5YIGBs73QPuE,8556
337
337
  metaflow/plugins/pypi/pip.py,sha256=H0cIy8odpZ-JTn4SwF0b74tuC3uRU7X8TdAQJ2kODG8,13971
@@ -346,9 +346,9 @@ metaflow/plugins/uv/bootstrap.py,sha256=Yp_G3dHhXX5GwmpAASdZr28fDu69pucakST954Vm
346
346
  metaflow/plugins/uv/uv_environment.py,sha256=yKoC4t_TrVoN2tH6pV_XOpH3QvObmkRurM_I85Fa-x8,2577
347
347
  metaflow/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
348
348
  metaflow/runner/click_api.py,sha256=nAT1mSV40YKiHTyTr4RDZBCGgGFV6K0TXCTL4xtUOAc,23492
349
- metaflow/runner/deployer.py,sha256=6ixXonNyLB1dfTNl1HVGVT5M8CybXDUa3oFTabn9Sp8,9099
350
- metaflow/runner/deployer_impl.py,sha256=Kab9rLoA3EiBJDtTTulhPCeKzqiljW366nx2Tm0LYy0,6143
351
- metaflow/runner/metaflow_runner.py,sha256=L302ew_BPBPs-NnW8n92dqqbqmHwrwGL5D6kTZvl5vY,16074
349
+ metaflow/runner/deployer.py,sha256=SejRSiC5R0dCS7WaKePHd0fiXZ5ZK34S8CUCJnoIUjc,9318
350
+ metaflow/runner/deployer_impl.py,sha256=0UvR9tyRBUYlLaNXZgYM0aZYkYv6Vmqq8IOD0Y4V5M8,6351
351
+ metaflow/runner/metaflow_runner.py,sha256=3ox7JcJWuN1cUtmdQ4Al-Zp88HT6KGyouRKopzdColI,16284
352
352
  metaflow/runner/nbdeploy.py,sha256=Sp5w-6nCZwjHaRBHWxi8udya-RYnJOB76KNLjB4L7Gs,4166
353
353
  metaflow/runner/nbrun.py,sha256=LhJu-Teoi7wTkNxg0kpNPVXFxH_9P4lvtp0ysMEIFJ8,7299
354
354
  metaflow/runner/subprocess_manager.py,sha256=vqrOgRAtQYfTEBFFF7iRzrqbhFaVTRZohms4Kt7jxJA,22300
@@ -393,12 +393,12 @@ metaflow/user_configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
393
393
  metaflow/user_configs/config_decorators.py,sha256=qCKVAvd0NKgaCxQ2OThes5-DYHXq6A1HqURubYNeFdw,20481
394
394
  metaflow/user_configs/config_options.py,sha256=m6jccSpzI4qUJ7vyYkYBIf8G3V0Caunxg_k7zg4Zlqg,21067
395
395
  metaflow/user_configs/config_parameters.py,sha256=oeJGVKu1ao_YQX6Lg6P2FEv5k5-_F4sARLlVpTW9ezM,15502
396
- metaflow-2.15.8.data/data/share/metaflow/devtools/Makefile,sha256=5n89OGIC_kE4wxtEI66VCucN-b-1w5bqvGeZYmeRGz8,13737
397
- metaflow-2.15.8.data/data/share/metaflow/devtools/Tiltfile,sha256=P5_rn_F3xYLN1_cEAQ9mNeS22HG2rb8beKIz2RIK6fU,20634
398
- metaflow-2.15.8.data/data/share/metaflow/devtools/pick_services.sh,sha256=DCnrMXwtApfx3B4S-YiZESMyAFHbXa3VuNL0MxPLyiE,2196
399
- metaflow-2.15.8.dist-info/licenses/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
400
- metaflow-2.15.8.dist-info/METADATA,sha256=ySz1B2qdeOjZ2eLXO35Za8JOhmgsxBP747BNFBLbBn8,6740
401
- metaflow-2.15.8.dist-info/WHEEL,sha256=MAQBAzGbXNI3bUmkDsiV_duv8i-gcdnLzw7cfUFwqhU,109
402
- metaflow-2.15.8.dist-info/entry_points.txt,sha256=RvEq8VFlgGe_FfqGOZi0D7ze1hLD0pAtXeNyGfzc_Yc,103
403
- metaflow-2.15.8.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
404
- metaflow-2.15.8.dist-info/RECORD,,
396
+ metaflow-2.15.10.data/data/share/metaflow/devtools/Makefile,sha256=5n89OGIC_kE4wxtEI66VCucN-b-1w5bqvGeZYmeRGz8,13737
397
+ metaflow-2.15.10.data/data/share/metaflow/devtools/Tiltfile,sha256=P5_rn_F3xYLN1_cEAQ9mNeS22HG2rb8beKIz2RIK6fU,20634
398
+ metaflow-2.15.10.data/data/share/metaflow/devtools/pick_services.sh,sha256=DCnrMXwtApfx3B4S-YiZESMyAFHbXa3VuNL0MxPLyiE,2196
399
+ metaflow-2.15.10.dist-info/licenses/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
400
+ metaflow-2.15.10.dist-info/METADATA,sha256=1WbwvJhEhKbVwd6A2QAtAb3BOPdahwn5bFVijWfEzO4,6742
401
+ metaflow-2.15.10.dist-info/WHEEL,sha256=_itY3bZllKbLk93i0gzNzdweAt5eocJdfN7atrjOnvQ,109
402
+ metaflow-2.15.10.dist-info/entry_points.txt,sha256=RvEq8VFlgGe_FfqGOZi0D7ze1hLD0pAtXeNyGfzc_Yc,103
403
+ metaflow-2.15.10.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
404
+ metaflow-2.15.10.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: setuptools (80.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any