metaflow 2.15.10__py2.py3-none-any.whl → 2.15.12__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.
@@ -1191,22 +1191,21 @@ class StubGenerator:
1191
1191
  + "}"
1192
1192
  )
1193
1193
  elif isinstance(default_value, str):
1194
- return "'" + default_value + "'"
1194
+ return repr(default_value) # Use repr() for proper escaping
1195
+ elif isinstance(default_value, (int, float, bool)):
1196
+ return str(default_value)
1197
+ elif default_value is None:
1198
+ return "None"
1195
1199
  else:
1196
- return self._get_element_name_with_module(default_value)
1197
-
1198
- elif str(default_value).startswith("<"):
1200
+ return "..." # For other built-in types not explicitly handled
1201
+ elif inspect.isclass(default_value) or inspect.isfunction(default_value):
1199
1202
  if default_value.__module__ == "builtins":
1200
1203
  return default_value.__name__
1201
1204
  else:
1202
1205
  self._typing_imports.add(default_value.__module__)
1203
1206
  return ".".join([default_value.__module__, default_value.__name__])
1204
1207
  else:
1205
- return (
1206
- str(default_value)
1207
- if not isinstance(default_value, str)
1208
- else '"' + default_value + '"'
1209
- )
1208
+ return "..." # For complex objects like class instances
1210
1209
 
1211
1210
  buff = StringIO()
1212
1211
  if sign is None and func is None:
metaflow/includefile.py CHANGED
@@ -459,7 +459,7 @@ class UploaderV2:
459
459
  @classmethod
460
460
  def encode_url(cls, url_type, url, **kwargs):
461
461
  return_value = {
462
- "note": "Internal representation of IncludeFile(%s)" % url,
462
+ "note": "Internal representation of IncludeFile",
463
463
  "type": cls.file_type,
464
464
  "sub-type": url_type,
465
465
  "url": url,
@@ -472,7 +472,7 @@ class UploaderV2:
472
472
  r = UploaderV1.store(flow_name, path, is_text, encoding, handler, echo)
473
473
 
474
474
  # In V2, we store size for faster access
475
- r["note"] = "Internal representation of IncludeFile(%s)" % path
475
+ r["note"] = "Internal representation of IncludeFile"
476
476
  r["type"] = cls.file_type
477
477
  r["sub-type"] = "uploaded"
478
478
  r["size"] = os.stat(path).st_size
@@ -452,7 +452,15 @@ ESCAPE_HATCH_WARNING = from_conf("ESCAPE_HATCH_WARNING", True)
452
452
  ###
453
453
  # Debug configuration
454
454
  ###
455
- DEBUG_OPTIONS = ["subcommand", "sidecar", "s3client", "tracing", "stubgen", "userconf"]
455
+ DEBUG_OPTIONS = [
456
+ "subcommand",
457
+ "sidecar",
458
+ "s3client",
459
+ "tracing",
460
+ "stubgen",
461
+ "userconf",
462
+ "conda",
463
+ ]
456
464
 
457
465
  for typ in DEBUG_OPTIONS:
458
466
  vars()["DEBUG_%s" % typ.upper()] = from_conf("DEBUG_%s" % typ.upper(), False)
@@ -2732,7 +2732,7 @@ class ArgoWorkflows(object):
2732
2732
  "type": "section",
2733
2733
  "text": {
2734
2734
  "type": "mrkdwn",
2735
- "text": ":metaflow: Environment details"
2735
+ "text": "Environment details"
2736
2736
  },
2737
2737
  "fields": [
2738
2738
  {
@@ -2750,7 +2750,7 @@ class ArgoWorkflows(object):
2750
2750
  "type": "section",
2751
2751
  "text": {
2752
2752
  "type": "mrkdwn",
2753
- "text": ":metaflow: Environment details"
2753
+ "text": "Environment details"
2754
2754
  }
2755
2755
  }
2756
2756
 
@@ -353,7 +353,9 @@ class AzureStorage(DataStoreStorage):
353
353
  byte_stream, metadata = byte_stream
354
354
  tmp_filename = os.path.join(tmpdir, str(uuid.uuid4()))
355
355
  with open(tmp_filename, "wb") as f:
356
- f.write(byte_stream.read())
356
+ # make sure to close the file handle after reading.
357
+ with byte_stream as bytes:
358
+ f.write(bytes.read())
357
359
  # Fully finish writing the file, before submitting work. Careful with indentation.
358
360
 
359
361
  futures.append(
@@ -119,7 +119,9 @@ class _GSRootClient(object):
119
119
  blob.metadata = {"metaflow-user-attributes": json.dumps(metadata)}
120
120
  from google.cloud.storage.retry import DEFAULT_RETRY
121
121
 
122
- blob.upload_from_filename(tmpfile, retry=DEFAULT_RETRY)
122
+ blob.upload_from_filename(
123
+ tmpfile, retry=DEFAULT_RETRY, timeout=(14400, 60)
124
+ ) # generous timeout for massive uploads. Use the same values as for Azure (connection_timeout, read_timeout)
123
125
  except Exception as e:
124
126
  process_gs_exception(e)
125
127
 
@@ -225,7 +227,9 @@ class GSStorage(DataStoreStorage):
225
227
  byte_stream, metadata = byte_stream
226
228
  tmp_filename = os.path.join(tmpdir, str(uuid.uuid4()))
227
229
  with open(tmp_filename, "wb") as f:
228
- f.write(byte_stream.read())
230
+ # make sure to close the file handle after reading.
231
+ with byte_stream as bytes:
232
+ f.write(bytes.read())
229
233
  # Fully finish writing the file, before submitting work. Careful with indentation.
230
234
 
231
235
  futures.append(
@@ -18,7 +18,6 @@ from itertools import starmap, chain, islice
18
18
 
19
19
  from boto3.exceptions import RetriesExceededError, S3UploadFailedError
20
20
  from boto3.s3.transfer import TransferConfig
21
- from botocore.config import Config
22
21
  from botocore.exceptions import ClientError, SSLError
23
22
 
24
23
  try:
@@ -50,13 +49,11 @@ from metaflow.plugins.datatools.s3.s3util import (
50
49
  import metaflow.tracing as tracing
51
50
  from metaflow.metaflow_config import (
52
51
  S3_WORKER_COUNT,
53
- S3_CLIENT_RETRY_CONFIG,
54
52
  )
55
53
 
56
54
  DOWNLOAD_FILE_THRESHOLD = 2 * TransferConfig().multipart_threshold
57
55
  DOWNLOAD_MAX_CHUNK = 2 * 1024 * 1024 * 1024 - 1
58
56
 
59
- DEFAULT_S3_CLIENT_PARAMS = {"config": Config(retries=S3_CLIENT_RETRY_CONFIG)}
60
57
  RANGE_MATCH = re.compile(r"bytes (?P<start>[0-9]+)-(?P<end>[0-9]+)/(?P<total>[0-9]+)")
61
58
 
62
59
  # from botocore ClientError MSG_TEMPLATE:
@@ -132,7 +129,7 @@ def normalize_client_error(err):
132
129
  try:
133
130
  return int(error_code)
134
131
  except ValueError:
135
- if error_code in ("AccessDenied", "AllAccessDisabled"):
132
+ if error_code in ("AccessDenied", "AllAccessDisabled", "InvalidAccessKeyId"):
136
133
  return 403
137
134
  if error_code == "NoSuchKey":
138
135
  return 404
@@ -830,7 +827,7 @@ def lst(
830
827
  s3config = S3Config(
831
828
  s3role,
832
829
  json.loads(s3sessionvars) if s3sessionvars else None,
833
- json.loads(s3clientparams) if s3clientparams else DEFAULT_S3_CLIENT_PARAMS,
830
+ json.loads(s3clientparams) if s3clientparams else None,
834
831
  )
835
832
 
836
833
  urllist = []
@@ -963,7 +960,7 @@ def put(
963
960
  s3config = S3Config(
964
961
  s3role,
965
962
  json.loads(s3sessionvars) if s3sessionvars else None,
966
- json.loads(s3clientparams) if s3clientparams else DEFAULT_S3_CLIENT_PARAMS,
963
+ json.loads(s3clientparams) if s3clientparams else None,
967
964
  )
968
965
 
969
966
  urls = list(starmap(_make_url, _files()))
@@ -1110,7 +1107,7 @@ def get(
1110
1107
  s3config = S3Config(
1111
1108
  s3role,
1112
1109
  json.loads(s3sessionvars) if s3sessionvars else None,
1113
- json.loads(s3clientparams) if s3clientparams else DEFAULT_S3_CLIENT_PARAMS,
1110
+ json.loads(s3clientparams) if s3clientparams else None,
1114
1111
  )
1115
1112
 
1116
1113
  # Construct a list of URL (prefix) objects
@@ -1259,7 +1256,7 @@ def info(
1259
1256
  s3config = S3Config(
1260
1257
  s3role,
1261
1258
  json.loads(s3sessionvars) if s3sessionvars else None,
1262
- json.loads(s3clientparams) if s3clientparams else DEFAULT_S3_CLIENT_PARAMS,
1259
+ json.loads(s3clientparams) if s3clientparams else None,
1263
1260
  )
1264
1261
 
1265
1262
  # Construct a list of URL (prefix) objects
@@ -13,6 +13,7 @@ from hashlib import sha256
13
13
  from io import BufferedIOBase, BytesIO
14
14
  from urllib.parse import unquote, urlparse
15
15
 
16
+ from metaflow.debug import debug
16
17
  from metaflow.exception import MetaflowException
17
18
  from metaflow.metaflow_config import get_pinned_conda_libs
18
19
  from metaflow.metaflow_environment import MetaflowEnvironment
@@ -117,6 +118,11 @@ class CondaEnvironment(MetaflowEnvironment):
117
118
  )
118
119
 
119
120
  def cache(storage, results, type_):
121
+ debug.conda_exec(
122
+ "Caching packages for %s environments %s"
123
+ % (type_, [result[0] for result in results])
124
+ )
125
+
120
126
  def _path(url, local_path):
121
127
  # Special handling for VCS packages
122
128
  if url.startswith("git+"):
@@ -169,14 +175,25 @@ class CondaEnvironment(MetaflowEnvironment):
169
175
  )
170
176
  for url, package in local_packages.items()
171
177
  ]
178
+ debug.conda_exec(
179
+ "Caching %s new packages to the datastore for %s environment %s"
180
+ % (
181
+ len(list_of_path_and_filehandle),
182
+ type_,
183
+ [result[0] for result in results],
184
+ )
185
+ )
172
186
  storage.save_bytes(
173
187
  list_of_path_and_filehandle,
174
188
  len_hint=len(list_of_path_and_filehandle),
189
+ # overwrite=True,
175
190
  )
176
191
  for id_, packages, _, platform in results:
177
192
  if id_ in dirty:
178
193
  self.write_to_environment_manifest([id_, platform, type_], packages)
179
194
 
195
+ debug.conda_exec("Finished caching packages.")
196
+
180
197
  storage = None
181
198
  if self.datastore_type not in ["local"]:
182
199
  # Initialize storage for caching if using a remote datastore
@@ -192,44 +209,85 @@ class CondaEnvironment(MetaflowEnvironment):
192
209
  # 6. Create and cache PyPI environments in parallel
193
210
  with ThreadPoolExecutor() as executor:
194
211
  # Start all conda solves in parallel
195
- conda_futures = [
212
+ debug.conda_exec("Solving packages for Conda environments..")
213
+ conda_solve_futures = [
196
214
  executor.submit(lambda x: solve(*x, "conda"), env)
197
215
  for env in environments("conda")
198
216
  ]
217
+ conda_create_futures = []
199
218
 
200
219
  pypi_envs = {env[0]: env for env in environments("pypi")}
201
- pypi_futures = []
220
+ pypi_solve_futures = []
221
+ pypi_create_futures = []
202
222
 
223
+ cache_futures = []
203
224
  # Process conda results sequentially for downloads
204
- for future in as_completed(conda_futures):
225
+ for future in as_completed(conda_solve_futures):
205
226
  result = future.result()
206
227
  # Sequential conda download
228
+ debug.conda_exec(
229
+ "Downloading packages for Conda environment %s" % result[0]
230
+ )
207
231
  self.solvers["conda"].download(*result)
208
232
  # Parallel conda create and cache
209
- create_future = executor.submit(self.solvers["conda"].create, *result)
233
+ conda_create_future = executor.submit(
234
+ self.solvers["conda"].create, *result
235
+ )
210
236
  if storage:
211
- executor.submit(cache, storage, [result], "conda")
237
+ cache_futures.append(
238
+ executor.submit(cache, storage, [result], "conda")
239
+ )
212
240
 
213
241
  # Queue PyPI solve to start after conda create
214
242
  if result[0] in pypi_envs:
243
+ debug.conda_exec(
244
+ "Solving packages for PyPI environment %s" % result[0]
245
+ )
215
246
  # solve pypi envs uniquely
216
247
  pypi_env = pypi_envs.pop(result[0])
217
248
 
218
249
  def pypi_solve(env):
219
- create_future.result() # Wait for conda create
250
+ conda_create_future.result() # Wait for conda create
220
251
  return solve(*env, "pypi")
221
252
 
222
- pypi_futures.append(executor.submit(pypi_solve, pypi_env))
253
+ pypi_solve_futures.append(executor.submit(pypi_solve, pypi_env))
254
+ else:
255
+ # add conda create future to the generic list
256
+ conda_create_futures.append(conda_create_future)
223
257
 
224
258
  # Process PyPI results sequentially for downloads
225
- for solve_future in pypi_futures:
259
+ for solve_future in as_completed(pypi_solve_futures):
226
260
  result = solve_future.result()
227
261
  # Sequential PyPI download
262
+ debug.conda_exec(
263
+ "Downloading packages for PyPI environment %s" % result[0]
264
+ )
228
265
  self.solvers["pypi"].download(*result)
229
266
  # Parallel PyPI create and cache
230
- executor.submit(self.solvers["pypi"].create, *result)
267
+ pypi_create_futures.append(
268
+ executor.submit(self.solvers["pypi"].create, *result)
269
+ )
231
270
  if storage:
232
- executor.submit(cache, storage, [result], "pypi")
271
+ cache_futures.append(
272
+ executor.submit(cache, storage, [result], "pypi")
273
+ )
274
+
275
+ # Raise exceptions for conda create
276
+ debug.conda_exec("Checking results for Conda create..")
277
+ for future in as_completed(conda_create_futures):
278
+ future.result()
279
+
280
+ # Raise exceptions for pypi create
281
+ debug.conda_exec("Checking results for PyPI create..")
282
+ for future in as_completed(pypi_create_futures):
283
+ future.result()
284
+
285
+ # Raise exceptions for caching
286
+ debug.conda_exec("Checking results for caching..")
287
+ for future in as_completed(cache_futures):
288
+ # check for result in order to raise any exceptions.
289
+ future.result()
290
+
233
291
  self.logger("Virtual environment(s) bootstrapped!")
234
292
 
235
293
  def executable(self, step_name, default=None):
@@ -6,6 +6,7 @@ import subprocess
6
6
  import tempfile
7
7
  import time
8
8
 
9
+ from metaflow.debug import debug
9
10
  from metaflow.exception import MetaflowException
10
11
  from metaflow.util import which
11
12
 
@@ -71,6 +72,7 @@ class Micromamba(object):
71
72
 
72
73
  # Install Micromamba on the fly.
73
74
  # TODO: Make this optional at some point.
75
+ debug.conda_exec("No Micromamba binary found. Installing micromamba")
74
76
  _install_micromamba(self._path_to_hidden_micromamba)
75
77
  self._bin = which(
76
78
  os.path.join(self._path_to_hidden_micromamba, "bin/micromamba")
@@ -98,6 +100,7 @@ class Micromamba(object):
98
100
  # environment
99
101
  # 4. Multiple solves can progress at the same time while relying on the same
100
102
  # index
103
+ debug.conda_exec("Solving packages for conda environment %s" % id_)
101
104
  with tempfile.TemporaryDirectory() as tmp_dir:
102
105
  env = {
103
106
  "MAMBA_ADD_PIP_AS_PYTHON_DEPENDENCY": "true",
@@ -158,6 +161,7 @@ class Micromamba(object):
158
161
  if self.path_to_environment(id_, platform):
159
162
  return
160
163
 
164
+ debug.conda_exec("Downloading packages for conda environment %s" % id_)
161
165
  with tempfile.TemporaryDirectory() as tmp_dir:
162
166
  env = {
163
167
  "CONDA_SUBDIR": platform,
@@ -190,6 +194,7 @@ class Micromamba(object):
190
194
  if platform != self.platform() or self.path_to_environment(id_, platform):
191
195
  return
192
196
 
197
+ debug.conda_exec("Creating local Conda environment %s" % id_)
193
198
  prefix = "{env_dirs}/{keyword}/{platform}/{id}".format(
194
199
  env_dirs=self.info()["envs_dirs"][0],
195
200
  platform=platform,
@@ -8,6 +8,7 @@ from concurrent.futures import ThreadPoolExecutor
8
8
  from itertools import chain, product
9
9
  from urllib.parse import unquote
10
10
 
11
+ from metaflow.debug import debug
11
12
  from metaflow.exception import MetaflowException
12
13
 
13
14
  from .micromamba import Micromamba
@@ -66,6 +67,7 @@ class Pip(object):
66
67
  msg += "for id {id}".format(id=id_)
67
68
  raise PipException(msg)
68
69
 
70
+ debug.conda_exec("Solving packages for PyPI environment %s" % id_)
69
71
  with tempfile.TemporaryDirectory() as tmp_dir:
70
72
  report = "{tmp_dir}/report.json".format(tmp_dir=tmp_dir)
71
73
  implementations, platforms, abis = zip(
@@ -152,6 +154,7 @@ class Pip(object):
152
154
  custom_index_url, extra_index_urls = self.indices(prefix)
153
155
 
154
156
  # build wheels if needed
157
+ debug.conda_exec("Building wheels for PyPI environment %s if necessary" % id_)
155
158
  with ThreadPoolExecutor() as executor:
156
159
 
157
160
  def _build(key, package):
@@ -212,6 +215,7 @@ class Pip(object):
212
215
  ]
213
216
  )
214
217
 
218
+ debug.conda_exec("Downloading packages for PyPI environment %s" % id_)
215
219
  cmd = [
216
220
  "download",
217
221
  "--no-deps",
@@ -251,6 +255,7 @@ class Pip(object):
251
255
  # Pip can't install packages if the underlying virtual environment doesn't
252
256
  # share the same platform
253
257
  if self.micromamba.platform() == platform:
258
+ debug.conda_exec("Installing packages for local PyPI environment %s" % id_)
254
259
  cmd = [
255
260
  "install",
256
261
  "--no-compile",
metaflow/version.py CHANGED
@@ -1 +1 @@
1
- metaflow_version = "2.15.10"
1
+ metaflow_version = "2.15.12"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: metaflow
3
- Version: 2.15.10
3
+ Version: 2.15.12
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.10; extra == "stubs"
29
+ Requires-Dist: metaflow-stubs==2.15.12; extra == "stubs"
30
30
  Dynamic: author
31
31
  Dynamic: author-email
32
32
  Dynamic: classifier
@@ -12,11 +12,11 @@ metaflow/events.py,sha256=ahjzkSbSnRCK9RZ-9vTfUviz_6gMvSO9DGkJ86X80-k,5300
12
12
  metaflow/exception.py,sha256=_m9ZBJM0cooHRslDqfxCPQmkChqaTh6fGxp7HvISnYI,5161
13
13
  metaflow/flowspec.py,sha256=GgbTeUBtG3AmZwIF-prRFMsZqFYGVysd5xBS9IPIPBs,35953
14
14
  metaflow/graph.py,sha256=cdpnWr85aEj_rRn-7EjbndWjr_i8Dt3P7-oPUW0NNpI,12393
15
- metaflow/includefile.py,sha256=kWKDSlzVcRVNGG9PV5eB3o2ynrzqhVsfaLtkqjshn7Q,20948
15
+ metaflow/includefile.py,sha256=RtISGl1V48qjkJBakUZ9yPpHV102h7pOIFiKP8PLHpc,20927
16
16
  metaflow/info_file.py,sha256=wtf2_F0M6dgiUu74AFImM8lfy5RrUw5Yj7Rgs2swKRY,686
17
17
  metaflow/integrations.py,sha256=LlsaoePRg03DjENnmLxZDYto3NwWc9z_PtU6nJxLldg,1480
18
18
  metaflow/lint.py,sha256=x4p6tnRzYqNNniCGXyrUW0WuYfTUgnaOMRivxvnxask,11661
19
- metaflow/metaflow_config.py,sha256=IXTmqV2Ny1SuW18v7t6_DYzL8eWqLG3dkm1ohf8rPCM,23770
19
+ metaflow/metaflow_config.py,sha256=Piw0awvuFarzl1DuTmOZ52-sNcLPV7g5UmsOO9BHnJE,23810
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=CWG90qpfz9iJ6hHhFlAmMVNALn2v_5eTVk3mFbQR4Pw,8379
@@ -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=TmvdoNgSSOj8vRXQ742Hmg2q7XLz3WdGatF-u_YzsjE,29
40
+ metaflow/version.py,sha256=dD3j_x5O0hfjAQPJKDb9TeRB-4TB5uLRZjcMD1OL9-k,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
@@ -154,7 +154,7 @@ metaflow/cmd/tutorials_cmd.py,sha256=8FdlKkicTOhCIDKcBR5b0Oz6giDvS-EMY3o9skIrRqw
154
154
  metaflow/cmd/util.py,sha256=jS_0rUjOnGGzPT65fzRLdGjrYAOOLA4jU2S0HJLV0oc,406
155
155
  metaflow/cmd/code/__init__.py,sha256=VO4dNM9M9LHYy5nTgEiJvCV1RBl8lpDlYGJm6GIcaBA,7413
156
156
  metaflow/cmd/develop/__init__.py,sha256=p1Sy8yU1MEKSrH5ttOWOZvNcI1qYu6J6jghdTHwPgOw,689
157
- metaflow/cmd/develop/stub_generator.py,sha256=bo2yWe0kvCZ-3arEFe9eAnPN-h8oNNPcQsDwsL350UM,65217
157
+ metaflow/cmd/develop/stub_generator.py,sha256=gERNsibYL030xR0OjA60AkS3HotRCNa5N2n1QQpgqcE,65358
158
158
  metaflow/cmd/develop/stubs.py,sha256=Q0ERQHGb0cC8P6eb0mQlE1RHUo8sCJ2zFvIW7rL6C_g,11889
159
159
  metaflow/datastore/__init__.py,sha256=VxP6ddJt3rwiCkpiSfAhyVkUCOe1pgZZsytVEJzFmSQ,155
160
160
  metaflow/datastore/content_addressed_store.py,sha256=6T7tNqL29kpmecyMLHF35RhoSBOb-OZcExnsB65AvnI,7641
@@ -210,7 +210,7 @@ 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=_Mf5l1nJy2M1h-dsTdbsGAH3_sRI8pYg3djniutY6QA,186566
213
+ metaflow/plugins/argo/argo_workflows.py,sha256=oX-e4o_CxTQP5DJ7zMQwckcobXZJz6hPxLs3fsHSnm8,186544
214
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
@@ -275,15 +275,15 @@ metaflow/plugins/cards/card_modules/chevron/renderer.py,sha256=dm5ufR9-qnx94D9Bt
275
275
  metaflow/plugins/cards/card_modules/chevron/tokenizer.py,sha256=lQU9OELUE9a5Xu4snGhEV_YTT34iyUHVBuM1YO016Sw,7400
276
276
  metaflow/plugins/cards/card_viewer/viewer.html,sha256=qZJGzhZhQ1gugsknRP7zkAPPfUAtvemK1UKqXoGff5M,11593
277
277
  metaflow/plugins/datastores/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
278
- metaflow/plugins/datastores/azure_storage.py,sha256=QvIUQGOZF1oKeRJXbl3RsV1MnO3OMfLzheoo0UNWn7E,16670
279
- metaflow/plugins/datastores/gs_storage.py,sha256=ED1xfXNDiPkqma5PEui8HCv0b4ImHK_rlUMQJD9UNes,9622
278
+ metaflow/plugins/datastores/azure_storage.py,sha256=GGzOxK8coHR9PQYmR39jn37D0s-XIJOVMuRKaJ3B8eo,16787
279
+ metaflow/plugins/datastores/gs_storage.py,sha256=8KV4SM7GPI21-86UjMATmSCbVzxDHlMWlRsQ-zQngTg,9899
280
280
  metaflow/plugins/datastores/local_storage.py,sha256=igrBDphhyu7EFIUj3BWcO7beiZbNnJLq--lF45UYSyI,4750
281
281
  metaflow/plugins/datastores/s3_storage.py,sha256=CZdNqaKtxDXQbEg2YHyphph3hWcLIE50puenm0WGVpk,5473
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
285
  metaflow/plugins/datatools/s3/s3.py,sha256=3xrWD6pXoVRpuAQHyLGVya79UIE0S8AqAqe2prg4yMw,67182
286
- metaflow/plugins/datatools/s3/s3op.py,sha256=20XEOCCK_nAVm92ZOjLPTzLnTs9xrIX0Gj-ELxkuNPY,47742
286
+ metaflow/plugins/datatools/s3/s3op.py,sha256=9DAIlvK5kYVmgo3rL-XY_3k7CoLUXaWqduBza13Xqv8,47543
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
@@ -331,10 +331,10 @@ metaflow/plugins/metadata_providers/service.py,sha256=9j0db_EOGFdb49YTgr9q4EWqVA
331
331
  metaflow/plugins/pypi/__init__.py,sha256=0YFZpXvX7HCkyBFglatual7XGifdA1RwC3U4kcizyak,1037
332
332
  metaflow/plugins/pypi/bootstrap.py,sha256=SNONquX6QnTbu7htmhaQeVeZ2ofaFaUCDScRIrTTERc,14718
333
333
  metaflow/plugins/pypi/conda_decorator.py,sha256=N0HGiaS1mRsa6qT4eYzu2C3DHtas22QIXowW4vEl44M,15961
334
- metaflow/plugins/pypi/conda_environment.py,sha256=JuTfGfUML_AoeW4ASGkqPbm8OqtWsbtRwDNwrRTRqS4,22274
335
- metaflow/plugins/pypi/micromamba.py,sha256=LLJ2dGGOEyld07W8iI6dtE01h2Y1PQnBhU-dMBssZ3c,16502
334
+ metaflow/plugins/pypi/conda_environment.py,sha256=C7WolJm1dgBQofd6vOk8KCr3U754TyAr4bOpkhosxfM,24582
335
+ metaflow/plugins/pypi/micromamba.py,sha256=XAuZulI7O2Q_Zgtx28yjAqHco6tHiPQxoy_vsf1kWm8,16843
336
336
  metaflow/plugins/pypi/parsers.py,sha256=gpOOG2Ph95wI73MWCAi7XjpK0gYhv5k5YIGBs73QPuE,8556
337
- metaflow/plugins/pypi/pip.py,sha256=H0cIy8odpZ-JTn4SwF0b74tuC3uRU7X8TdAQJ2kODG8,13971
337
+ metaflow/plugins/pypi/pip.py,sha256=WhPyA18RoVT40sqbZRJdCEij4euL9PZwLfm1SrAKqmU,14333
338
338
  metaflow/plugins/pypi/pypi_decorator.py,sha256=ybNgo-T5Z_0W2KNuED0pdjyI0qygZ4a1MXAzKqdHt_E,7250
339
339
  metaflow/plugins/pypi/pypi_environment.py,sha256=FYMg8kF3lXqcLfRYWD83a9zpVjcoo_TARqMGZ763rRk,230
340
340
  metaflow/plugins/pypi/utils.py,sha256=W8OhDrhz7YIE-2MSSN5Rj7AmESwsN5YDmdnro152J4w,3551
@@ -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.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,,
396
+ metaflow-2.15.12.data/data/share/metaflow/devtools/Makefile,sha256=5n89OGIC_kE4wxtEI66VCucN-b-1w5bqvGeZYmeRGz8,13737
397
+ metaflow-2.15.12.data/data/share/metaflow/devtools/Tiltfile,sha256=P5_rn_F3xYLN1_cEAQ9mNeS22HG2rb8beKIz2RIK6fU,20634
398
+ metaflow-2.15.12.data/data/share/metaflow/devtools/pick_services.sh,sha256=DCnrMXwtApfx3B4S-YiZESMyAFHbXa3VuNL0MxPLyiE,2196
399
+ metaflow-2.15.12.dist-info/licenses/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
400
+ metaflow-2.15.12.dist-info/METADATA,sha256=vsaYPYVJ9CZN2BmpaTIFgOd97tgHYpOwaVufYO-giZg,6742
401
+ metaflow-2.15.12.dist-info/WHEEL,sha256=_z0Kb-VmhLeNt2nZ-PsoQBjD25rP0tBwgAyRYD7oTKI,109
402
+ metaflow-2.15.12.dist-info/entry_points.txt,sha256=RvEq8VFlgGe_FfqGOZi0D7ze1hLD0pAtXeNyGfzc_Yc,103
403
+ metaflow-2.15.12.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
404
+ metaflow-2.15.12.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.1.0)
2
+ Generator: setuptools (80.7.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any