metaflow 2.19.2__py2.py3-none-any.whl → 2.19.4__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.
- metaflow/datastore/flow_datastore.py +2 -1
- metaflow/metaflow_config.py +1 -1
- metaflow/plugins/env_escape/client_modules.py +102 -72
- metaflow/user_decorators/mutable_flow.py +1 -1
- metaflow/version.py +1 -1
- {metaflow-2.19.2.data → metaflow-2.19.4.data}/data/share/metaflow/devtools/Tiltfile +1 -1
- {metaflow-2.19.2.dist-info → metaflow-2.19.4.dist-info}/METADATA +2 -2
- {metaflow-2.19.2.dist-info → metaflow-2.19.4.dist-info}/RECORD +14 -14
- {metaflow-2.19.2.data → metaflow-2.19.4.data}/data/share/metaflow/devtools/Makefile +0 -0
- {metaflow-2.19.2.data → metaflow-2.19.4.data}/data/share/metaflow/devtools/pick_services.sh +0 -0
- {metaflow-2.19.2.dist-info → metaflow-2.19.4.dist-info}/WHEEL +0 -0
- {metaflow-2.19.2.dist-info → metaflow-2.19.4.dist-info}/entry_points.txt +0 -0
- {metaflow-2.19.2.dist-info → metaflow-2.19.4.dist-info}/licenses/LICENSE +0 -0
- {metaflow-2.19.2.dist-info → metaflow-2.19.4.dist-info}/top_level.txt +0 -0
|
@@ -167,7 +167,8 @@ class FlowDataStore(object):
|
|
|
167
167
|
if attempt is not None and attempt <= metaflow_config.MAX_ATTEMPTS - 1:
|
|
168
168
|
attempt_range = range(attempt + 1) if include_prior else [attempt]
|
|
169
169
|
for task_url in task_urls:
|
|
170
|
-
|
|
170
|
+
# task_url can have a trailing slash, so strip this to avoid empty strings in the split
|
|
171
|
+
task_splits = task_url.rstrip("/").split("/")
|
|
171
172
|
# Usually it is flow, run, step, task (so 4 components) -- if we have a
|
|
172
173
|
# fifth one, there is a specific attempt number listed as well.
|
|
173
174
|
task_attempt_range = attempt_range
|
metaflow/metaflow_config.py
CHANGED
|
@@ -605,7 +605,7 @@ def get_pinned_conda_libs(python_version, datastore_type):
|
|
|
605
605
|
pins["google-auth"] = ">=2.11.0"
|
|
606
606
|
pins["google-cloud-secret-manager"] = ">=2.10.0"
|
|
607
607
|
pins["simple-gcp-object-downloader"] = ">=0.1.0"
|
|
608
|
-
pins["packaging"] = ">=24.
|
|
608
|
+
pins["packaging"] = ">=24.0"
|
|
609
609
|
elif datastore_type == "local":
|
|
610
610
|
pass
|
|
611
611
|
else:
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import atexit
|
|
2
2
|
import importlib
|
|
3
|
+
import importlib.util
|
|
3
4
|
import itertools
|
|
4
5
|
import pickle
|
|
5
6
|
import re
|
|
@@ -41,6 +42,8 @@ class _WrappedModule(object):
|
|
|
41
42
|
def __getattr__(self, name):
|
|
42
43
|
if name == "__loader__":
|
|
43
44
|
return self._loader
|
|
45
|
+
if name == "__spec__":
|
|
46
|
+
return importlib.util.spec_from_loader(self._prefix, self._loader)
|
|
44
47
|
if name in ("__name__", "__package__"):
|
|
45
48
|
return self._prefix
|
|
46
49
|
if name in ("__file__", "__path__"):
|
|
@@ -71,7 +74,8 @@ class _WrappedModule(object):
|
|
|
71
74
|
# Try to see if this is a submodule that we can load
|
|
72
75
|
m = None
|
|
73
76
|
try:
|
|
74
|
-
|
|
77
|
+
submodule_name = ".".join([self._prefix, name])
|
|
78
|
+
m = importlib.import_module(submodule_name)
|
|
75
79
|
except ImportError:
|
|
76
80
|
pass
|
|
77
81
|
if m is None:
|
|
@@ -117,7 +121,28 @@ class _WrappedModule(object):
|
|
|
117
121
|
|
|
118
122
|
|
|
119
123
|
class ModuleImporter(object):
|
|
120
|
-
|
|
124
|
+
"""
|
|
125
|
+
A custom import hook that proxies module imports to a different Python environment.
|
|
126
|
+
|
|
127
|
+
This class implements the MetaPathFinder and Loader protocols (PEP 451) to enable
|
|
128
|
+
"environment escape" - allowing the current Python process to import and use modules
|
|
129
|
+
from a different Python interpreter with potentially different versions or packages.
|
|
130
|
+
|
|
131
|
+
When a module is imported through this importer:
|
|
132
|
+
1. A client spawns a server process in the target Python environment
|
|
133
|
+
2. The module is loaded in the remote environment
|
|
134
|
+
3. A _WrappedModule proxy is returned that forwards all operations (function calls,
|
|
135
|
+
attribute access, etc.) to the remote environment via RPC
|
|
136
|
+
4. Data is serialized/deserialized using pickle for cross-environment communication
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
python_executable: Path to the Python interpreter for the remote environment
|
|
140
|
+
pythonpath: Python path to use in the remote environment
|
|
141
|
+
max_pickle_version: Maximum pickle protocol version supported by remote interpreter
|
|
142
|
+
config_dir: Directory containing configuration for the environment escape
|
|
143
|
+
module_prefixes: List of module name prefixes to handle
|
|
144
|
+
"""
|
|
145
|
+
|
|
121
146
|
def __init__(
|
|
122
147
|
self,
|
|
123
148
|
python_executable,
|
|
@@ -135,84 +160,89 @@ class ModuleImporter(object):
|
|
|
135
160
|
self._handled_modules = None
|
|
136
161
|
self._aliases = {}
|
|
137
162
|
|
|
138
|
-
def
|
|
163
|
+
def find_spec(self, fullname, path=None, target=None):
|
|
139
164
|
if self._handled_modules is not None:
|
|
140
165
|
if get_canonical_name(fullname, self._aliases) in self._handled_modules:
|
|
141
|
-
return self
|
|
166
|
+
return importlib.util.spec_from_loader(fullname, self)
|
|
142
167
|
return None
|
|
143
168
|
if any([fullname.startswith(prefix) for prefix in self._module_prefixes]):
|
|
144
169
|
# We potentially handle this
|
|
145
|
-
return self
|
|
170
|
+
return importlib.util.spec_from_loader(fullname, self)
|
|
146
171
|
return None
|
|
147
172
|
|
|
148
|
-
def
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
raise NotImplementedError(
|
|
154
|
-
"Environment escape imports are not supported in Python 2"
|
|
155
|
-
)
|
|
156
|
-
# We initialize a client and query the modules we handle
|
|
157
|
-
# The max_pickle_version is the pickle version that the server (so
|
|
158
|
-
# the underlying interpreter we call into) supports; we determine
|
|
159
|
-
# what version the current environment support and take the minimum
|
|
160
|
-
# of those two
|
|
161
|
-
max_pickle_version = min(self._max_pickle_version, pickle.HIGHEST_PROTOCOL)
|
|
162
|
-
|
|
163
|
-
self._client = Client(
|
|
164
|
-
self._module_prefixes,
|
|
165
|
-
self._python_executable,
|
|
166
|
-
self._pythonpath,
|
|
167
|
-
max_pickle_version,
|
|
168
|
-
self._config_dir,
|
|
169
|
-
)
|
|
170
|
-
atexit.register(_clean_client, self._client)
|
|
171
|
-
|
|
172
|
-
# Get information about overrides and what the server knows about
|
|
173
|
-
exports = self._client.get_exports()
|
|
174
|
-
|
|
175
|
-
prefixes = set()
|
|
176
|
-
export_classes = exports.get("classes", [])
|
|
177
|
-
export_functions = exports.get("functions", [])
|
|
178
|
-
export_values = exports.get("values", [])
|
|
179
|
-
export_exceptions = exports.get("exceptions", [])
|
|
180
|
-
self._aliases = exports.get("aliases", {})
|
|
181
|
-
for name in itertools.chain(
|
|
182
|
-
export_classes,
|
|
183
|
-
export_functions,
|
|
184
|
-
export_values,
|
|
185
|
-
(e[0] for e in export_exceptions),
|
|
186
|
-
):
|
|
187
|
-
splits = name.rsplit(".", 1)
|
|
188
|
-
prefixes.add(splits[0])
|
|
189
|
-
# We will make sure that we create modules even for "empty" prefixes
|
|
190
|
-
# because packages are always loaded hierarchically so if we have
|
|
191
|
-
# something in `a.b.c` but nothing directly in `a`, we still need to
|
|
192
|
-
# create a module named `a`. There is probably a better way of doing this
|
|
193
|
-
all_prefixes = list(prefixes)
|
|
194
|
-
for prefix in all_prefixes:
|
|
195
|
-
parts = prefix.split(".")
|
|
196
|
-
cur = parts[0]
|
|
197
|
-
for i in range(1, len(parts)):
|
|
198
|
-
prefixes.add(cur)
|
|
199
|
-
cur = ".".join([cur, parts[i]])
|
|
200
|
-
|
|
201
|
-
# We now know all the modules that we can handle. We update
|
|
202
|
-
# handled_module and return the module if we have it or raise ImportError
|
|
203
|
-
self._handled_modules = {}
|
|
204
|
-
for prefix in prefixes:
|
|
205
|
-
self._handled_modules[prefix] = _WrappedModule(
|
|
206
|
-
self, prefix, exports, self._client
|
|
207
|
-
)
|
|
173
|
+
def create_module(self, spec):
|
|
174
|
+
# Return the pre-created wrapped module for this spec
|
|
175
|
+
self._initialize_client()
|
|
176
|
+
|
|
177
|
+
fullname = spec.name
|
|
208
178
|
canonical_fullname = get_canonical_name(fullname, self._aliases)
|
|
209
|
-
# Modules are created canonically but we need to
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
179
|
+
# Modules are created canonically but we need to handle any of the aliases.
|
|
180
|
+
wrapped_module = self._handled_modules.get(canonical_fullname)
|
|
181
|
+
if wrapped_module is None:
|
|
182
|
+
raise ImportError(f"No module named '{fullname}'")
|
|
183
|
+
return wrapped_module
|
|
184
|
+
|
|
185
|
+
def exec_module(self, module):
|
|
186
|
+
# No initialization needed since the wrapped module returned by
|
|
187
|
+
# create_module() is fully initialized
|
|
188
|
+
pass
|
|
189
|
+
|
|
190
|
+
def _initialize_client(self):
|
|
191
|
+
if self._client is not None:
|
|
192
|
+
return
|
|
193
|
+
|
|
194
|
+
# We initialize a client and query the modules we handle
|
|
195
|
+
# The max_pickle_version is the pickle version that the server (so
|
|
196
|
+
# the underlying interpreter we call into) supports; we determine
|
|
197
|
+
# what version the current environment support and take the minimum
|
|
198
|
+
# of those two
|
|
199
|
+
max_pickle_version = min(self._max_pickle_version, pickle.HIGHEST_PROTOCOL)
|
|
200
|
+
|
|
201
|
+
self._client = Client(
|
|
202
|
+
self._module_prefixes,
|
|
203
|
+
self._python_executable,
|
|
204
|
+
self._pythonpath,
|
|
205
|
+
max_pickle_version,
|
|
206
|
+
self._config_dir,
|
|
207
|
+
)
|
|
208
|
+
atexit.register(_clean_client, self._client)
|
|
209
|
+
|
|
210
|
+
# Get information about overrides and what the server knows about
|
|
211
|
+
exports = self._client.get_exports()
|
|
212
|
+
|
|
213
|
+
prefixes = set()
|
|
214
|
+
export_classes = exports.get("classes", [])
|
|
215
|
+
export_functions = exports.get("functions", [])
|
|
216
|
+
export_values = exports.get("values", [])
|
|
217
|
+
export_exceptions = exports.get("exceptions", [])
|
|
218
|
+
self._aliases = exports.get("aliases", {})
|
|
219
|
+
for name in itertools.chain(
|
|
220
|
+
export_classes,
|
|
221
|
+
export_functions,
|
|
222
|
+
export_values,
|
|
223
|
+
(e[0] for e in export_exceptions),
|
|
224
|
+
):
|
|
225
|
+
splits = name.rsplit(".", 1)
|
|
226
|
+
prefixes.add(splits[0])
|
|
227
|
+
# We will make sure that we create modules even for "empty" prefixes
|
|
228
|
+
# because packages are always loaded hierarchically so if we have
|
|
229
|
+
# something in `a.b.c` but nothing directly in `a`, we still need to
|
|
230
|
+
# create a module named `a`. There is probably a better way of doing this
|
|
231
|
+
all_prefixes = list(prefixes)
|
|
232
|
+
for prefix in all_prefixes:
|
|
233
|
+
parts = prefix.split(".")
|
|
234
|
+
cur = parts[0]
|
|
235
|
+
for i in range(1, len(parts)):
|
|
236
|
+
prefixes.add(cur)
|
|
237
|
+
cur = ".".join([cur, parts[i]])
|
|
238
|
+
|
|
239
|
+
# We now know all the modules that we can handle. We update
|
|
240
|
+
# handled_module and return the module if we have it or raise ImportError
|
|
241
|
+
self._handled_modules = {}
|
|
242
|
+
for prefix in prefixes:
|
|
243
|
+
self._handled_modules[prefix] = _WrappedModule(
|
|
244
|
+
self, prefix, exports, self._client
|
|
245
|
+
)
|
|
216
246
|
|
|
217
247
|
|
|
218
248
|
def create_modules(python_executable, pythonpath, max_pickle_version, path, prefixes):
|
|
@@ -239,7 +239,7 @@ class MutableFlow:
|
|
|
239
239
|
"Mutable flow removing parameter %s from flow" % var
|
|
240
240
|
)
|
|
241
241
|
# Reset so that we don't list it again
|
|
242
|
-
|
|
242
|
+
self._flow_cls._flow_state.pop(_FlowState.CACHED_PARAMETERS, None)
|
|
243
243
|
return True
|
|
244
244
|
debug.userconf_exec(
|
|
245
245
|
"Mutable flow failed to remove parameter %s from flow" % parameter_name
|
metaflow/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
metaflow_version = "2.19.
|
|
1
|
+
metaflow_version = "2.19.4"
|
|
@@ -630,7 +630,7 @@ if "metadata-service" in enabled_components:
|
|
|
630
630
|
'metadatadb.database=metaflow',
|
|
631
631
|
'metadatadb.host=postgresql',
|
|
632
632
|
'image.repository=public.ecr.aws/outerbounds/metaflow_metadata_service',
|
|
633
|
-
'image.tag=2.
|
|
633
|
+
'image.tag=2.5.0',
|
|
634
634
|
'resources.requests.cpu=25m',
|
|
635
635
|
'resources.requests.memory=64Mi',
|
|
636
636
|
'resources.limits.cpu=50m',
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: metaflow
|
|
3
|
-
Version: 2.19.
|
|
3
|
+
Version: 2.19.4
|
|
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.19.
|
|
29
|
+
Requires-Dist: metaflow-stubs==2.19.4; extra == "stubs"
|
|
30
30
|
Dynamic: author
|
|
31
31
|
Dynamic: author-email
|
|
32
32
|
Dynamic: classifier
|
|
@@ -16,7 +16,7 @@ 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
|
|
19
|
-
metaflow/metaflow_config.py,sha256=
|
|
19
|
+
metaflow/metaflow_config.py,sha256=gI_y2SfJYCBAb1n_dE0oBn9u-vkOUsZvJ2Dm8nEPx30,25670
|
|
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=DWe9yJttDURtUNWmNg6TKr36CQpo_iY-fXG5yxGTQjE,11506
|
|
@@ -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=nyX0NWJAIRk1gImohMYvuS2ZoQup9VO1aiNEIN4Y1Ik,21035
|
|
38
38
|
metaflow/vendor.py,sha256=A82CGHfStZGDP5pQ5XzRjFkbN1ZC-vFmghXIrzMDDNg,5868
|
|
39
|
-
metaflow/version.py,sha256=
|
|
39
|
+
metaflow/version.py,sha256=SxC8AHEAgIIfEqI3iYfosaum_4H5Fptkn4K5f_8UzJc,28
|
|
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
|
|
@@ -174,7 +174,7 @@ metaflow/datastore/content_addressed_store.py,sha256=2ZDn9wpurtHYNwBbwca0ipzHciV
|
|
|
174
174
|
metaflow/datastore/datastore_set.py,sha256=WDgGeySHtt5hr6u3L1XMmd3b_yAJz6_2Ip_bj_Ygsms,2614
|
|
175
175
|
metaflow/datastore/datastore_storage.py,sha256=7V43QuiWDQ_Q4oHw9y7Z7X9lYj3GI-LV1-xB3d2Tt5k,9038
|
|
176
176
|
metaflow/datastore/exceptions.py,sha256=r7Ab5FvHIzyFh6kwiptA1lO5nLqWg0xRBoeYGefvapA,373
|
|
177
|
-
metaflow/datastore/flow_datastore.py,sha256
|
|
177
|
+
metaflow/datastore/flow_datastore.py,sha256=-9S5pWPfyL4yVjVSkNljQ_y1Wq6pfaFH6GglmG5BoTc,14839
|
|
178
178
|
metaflow/datastore/inputs.py,sha256=i43dXr2xvgtsgKMO9allgCR18bk80GeayeQFyUTH36w,449
|
|
179
179
|
metaflow/datastore/spin_datastore.py,sha256=5bhtVNWl4131pMKtBN72DLHxc72QX46JO0sV7r6IpVY,3035
|
|
180
180
|
metaflow/datastore/task_datastore.py,sha256=i9hBON-J0ECV_1uaqAtUGzPcd949mnYQBsqaJfVt15Q,38332
|
|
@@ -317,7 +317,7 @@ metaflow/plugins/datatools/s3/s3tail.py,sha256=boQjQGQMI-bvTqcMP2y7uSlSYLcvWOy7J
|
|
|
317
317
|
metaflow/plugins/datatools/s3/s3util.py,sha256=FgRgaVmEq7-i2dV7q8XK5w5PfFt-xJjZa8WrK8IJfdI,3769
|
|
318
318
|
metaflow/plugins/env_escape/__init__.py,sha256=tGNUZnmPvk52eNs__VK443b3CZ7ogEFTT-s9_n_HF8Q,8837
|
|
319
319
|
metaflow/plugins/env_escape/client.py,sha256=GsFZqjhGttd4eMU_CTw14sfNBV4vBKUUShp4SR0D8k8,25066
|
|
320
|
-
metaflow/plugins/env_escape/client_modules.py,sha256
|
|
320
|
+
metaflow/plugins/env_escape/client_modules.py,sha256=-4eeNz_F09CfKCoyJc6Zxv4OFY7alpbWHHYoFFm05Ik,10580
|
|
321
321
|
metaflow/plugins/env_escape/consts.py,sha256=jafRUdqZnkeKSgpdmRcTmnsVhEhVAjfQ6TKErbRH7wo,1000
|
|
322
322
|
metaflow/plugins/env_escape/data_transferer.py,sha256=wm1Aqf0rTWaq8JgqpiRN0g3N3hX7YAMuhCLRrbOP_9E,12696
|
|
323
323
|
metaflow/plugins/env_escape/exception_transferer.py,sha256=rpcpwDYRf5XqsZvShyQe5eRQ9uBGNdqmyAeB1h-Lofw,5746
|
|
@@ -430,16 +430,16 @@ metaflow/user_configs/config_options.py,sha256=d3hKA6WRPe21PdTl7sBnxIp5sE6zBpRtg
|
|
|
430
430
|
metaflow/user_configs/config_parameters.py,sha256=2LJnDPJ2NuZrM7ZrdOHNSbPw-X3BhM_tJgy0bxBAWAA,20975
|
|
431
431
|
metaflow/user_decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
432
432
|
metaflow/user_decorators/common.py,sha256=0u9NRLQ95TfJCjWVEOGT4MJ9WoQgAMBM9kJ2gJGlVjk,5362
|
|
433
|
-
metaflow/user_decorators/mutable_flow.py,sha256=
|
|
433
|
+
metaflow/user_decorators/mutable_flow.py,sha256=c7cYqj7100K1UYGQCF1B_AttyHwdcwCZWslnZfZnZPo,19504
|
|
434
434
|
metaflow/user_decorators/mutable_step.py,sha256=-BY0UDXf_RCAEnC5JlLzEXGdiw1KD9oSrSxS_SWaB9Y,16791
|
|
435
435
|
metaflow/user_decorators/user_flow_decorator.py,sha256=2yDwZq9QGv9W-7kEuKwa8o4ZkTvuHJ5ESz7VVrGViAI,9890
|
|
436
436
|
metaflow/user_decorators/user_step_decorator.py,sha256=4I1TQlQDMaMSuAJAAm3wo3bFETODC77RtXW11EuUI4A,27837
|
|
437
|
-
metaflow-2.19.
|
|
438
|
-
metaflow-2.19.
|
|
439
|
-
metaflow-2.19.
|
|
440
|
-
metaflow-2.19.
|
|
441
|
-
metaflow-2.19.
|
|
442
|
-
metaflow-2.19.
|
|
443
|
-
metaflow-2.19.
|
|
444
|
-
metaflow-2.19.
|
|
445
|
-
metaflow-2.19.
|
|
437
|
+
metaflow-2.19.4.data/data/share/metaflow/devtools/Makefile,sha256=_otS4tft0V5IzmMJPeVPxoN1_1aUiwC9-2Nu54k40ao,14499
|
|
438
|
+
metaflow-2.19.4.data/data/share/metaflow/devtools/Tiltfile,sha256=ziXgaSg19d4eRDDw3mQkpwsPqeb9lorkfeVQNLqcL5E,23937
|
|
439
|
+
metaflow-2.19.4.data/data/share/metaflow/devtools/pick_services.sh,sha256=PGjQeDIigFHeoQ0asmYNdYDPIOdeYy1UYvkw2wdN4zg,2209
|
|
440
|
+
metaflow-2.19.4.dist-info/licenses/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
|
|
441
|
+
metaflow-2.19.4.dist-info/METADATA,sha256=W2QpM9_r1MlG6JLR-evG00brDWYzQnbOwHtBZvew3X0,6739
|
|
442
|
+
metaflow-2.19.4.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
|
|
443
|
+
metaflow-2.19.4.dist-info/entry_points.txt,sha256=RvEq8VFlgGe_FfqGOZi0D7ze1hLD0pAtXeNyGfzc_Yc,103
|
|
444
|
+
metaflow-2.19.4.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
|
|
445
|
+
metaflow-2.19.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|