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

Files changed (35) hide show
  1. metaflow/__init__.py +11 -21
  2. metaflow/client/core.py +1 -1
  3. metaflow/cmd/main_cli.py +3 -2
  4. metaflow/extension_support/__init__.py +120 -29
  5. metaflow/flowspec.py +4 -0
  6. metaflow/info_file.py +25 -0
  7. metaflow/metaflow_config.py +0 -1
  8. metaflow/metaflow_current.py +3 -1
  9. metaflow/metaflow_environment.py +1 -7
  10. metaflow/metaflow_version.py +130 -64
  11. metaflow/package.py +2 -1
  12. metaflow/plugins/argo/argo_workflows.py +47 -8
  13. metaflow/plugins/argo/argo_workflows_cli.py +26 -0
  14. metaflow/plugins/aws/batch/batch_client.py +3 -0
  15. metaflow/plugins/kubernetes/kube_utils.py +25 -0
  16. metaflow/plugins/kubernetes/kubernetes.py +3 -0
  17. metaflow/plugins/kubernetes/kubernetes_cli.py +84 -1
  18. metaflow/plugins/kubernetes/kubernetes_client.py +97 -0
  19. metaflow/plugins/kubernetes/kubernetes_decorator.py +4 -0
  20. metaflow/plugins/parallel_decorator.py +4 -0
  21. metaflow/plugins/pypi/bootstrap.py +2 -0
  22. metaflow/plugins/pypi/conda_decorator.py +7 -1
  23. metaflow/runner/click_api.py +13 -1
  24. metaflow/runner/deployer.py +9 -2
  25. metaflow/runner/metaflow_runner.py +4 -2
  26. metaflow/runner/subprocess_manager.py +8 -3
  27. metaflow/runner/utils.py +19 -2
  28. metaflow/version.py +1 -1
  29. {ob_metaflow-2.12.19.1.dist-info → ob_metaflow-2.12.22.1.dist-info}/METADATA +2 -2
  30. {ob_metaflow-2.12.19.1.dist-info → ob_metaflow-2.12.22.1.dist-info}/RECORD +34 -33
  31. {ob_metaflow-2.12.19.1.dist-info → ob_metaflow-2.12.22.1.dist-info}/WHEEL +1 -1
  32. metaflow/plugins/argo/daemon.py +0 -59
  33. {ob_metaflow-2.12.19.1.dist-info → ob_metaflow-2.12.22.1.dist-info}/LICENSE +0 -0
  34. {ob_metaflow-2.12.19.1.dist-info → ob_metaflow-2.12.22.1.dist-info}/entry_points.txt +0 -0
  35. {ob_metaflow-2.12.19.1.dist-info → ob_metaflow-2.12.22.1.dist-info}/top_level.txt +0 -0
@@ -24,6 +24,8 @@ class ParallelDecorator(StepDecorator):
24
24
  The total number of tasks created by @parallel
25
25
  - node_index : int
26
26
  The index of the current task in all the @parallel tasks.
27
+ - control_task_id : Optional[str]
28
+ The task ID of the control task. Available to all tasks.
27
29
 
28
30
  is_parallel -> bool
29
31
  True if the current step is a @parallel step.
@@ -67,6 +69,7 @@ class ParallelDecorator(StepDecorator):
67
69
  main_ip=os.environ.get("MF_PARALLEL_MAIN_IP", "127.0.0.1"),
68
70
  num_nodes=int(os.environ.get("MF_PARALLEL_NUM_NODES", "1")),
69
71
  node_index=int(os.environ.get("MF_PARALLEL_NODE_INDEX", "0")),
72
+ control_task_id=os.environ.get("MF_PARALLEL_CONTROL_TASK_ID", None),
70
73
  )
71
74
  ),
72
75
  )
@@ -177,6 +180,7 @@ def _local_multinode_control_task_step_func(
177
180
  num_parallel = foreach_iter.num_parallel
178
181
  os.environ["MF_PARALLEL_NUM_NODES"] = str(num_parallel)
179
182
  os.environ["MF_PARALLEL_MAIN_IP"] = "127.0.0.1"
183
+ os.environ["MF_PARALLEL_CONTROL_TASK_ID"] = str(current.task_id)
180
184
 
181
185
  run_id = current.run_id
182
186
  step_name = current.step_name
@@ -103,6 +103,7 @@ if __name__ == "__main__":
103
103
  echo "@EXPLICIT" > "$tmpfile";
104
104
  ls -d {conda_pkgs_dir}/*/* >> "$tmpfile";
105
105
  export PATH=$PATH:$(pwd)/micromamba;
106
+ export CONDA_PKGS_DIRS=$(pwd)/micromamba/pkgs;
106
107
  micromamba create --yes --offline --no-deps --safety-checks=disabled --no-extra-safety-checks --prefix {prefix} --file "$tmpfile";
107
108
  rm "$tmpfile"''',
108
109
  ]
@@ -123,6 +124,7 @@ if __name__ == "__main__":
123
124
  [
124
125
  f"""set -e;
125
126
  export PATH=$PATH:$(pwd)/micromamba;
127
+ export CONDA_PKGS_DIRS=$(pwd)/micromamba/pkgs;
126
128
  micromamba run --prefix {prefix} python -m pip --disable-pip-version-check install --root-user-action=ignore --no-compile {pypi_pkgs_dir}/*.whl --no-user"""
127
129
  ]
128
130
  )
@@ -12,7 +12,7 @@ from metaflow.metadata import MetaDatum
12
12
  from metaflow.metaflow_environment import InvalidEnvironmentException
13
13
  from metaflow.util import get_metaflow_root
14
14
 
15
- from ... import INFO_FILE
15
+ from ...info_file import INFO_FILE
16
16
 
17
17
 
18
18
  class CondaStepDecorator(StepDecorator):
@@ -353,6 +353,12 @@ class CondaFlowDecorator(FlowDecorator):
353
353
  def flow_init(
354
354
  self, flow, graph, environment, flow_datastore, metadata, logger, echo, options
355
355
  ):
356
+ # NOTE: Important for extensions implementing custom virtual environments.
357
+ # Without this steps will not have an implicit conda step decorator on them unless the environment adds one in its decospecs.
358
+ from metaflow import decorators
359
+
360
+ decorators._attach_decorators(flow, ["conda"])
361
+
356
362
  # @conda uses a conda environment to create a virtual environment.
357
363
  # The conda environment can be created through micromamba.
358
364
  _supported_virtual_envs = ["conda"]
@@ -1,3 +1,4 @@
1
+ import os
1
2
  import sys
2
3
 
3
4
  if sys.version_info < (3, 7):
@@ -12,6 +13,7 @@ import importlib
12
13
  import inspect
13
14
  import itertools
14
15
  import uuid
16
+ import json
15
17
  from collections import OrderedDict
16
18
  from typing import Any, Callable, Dict, List, Optional
17
19
  from typing import OrderedDict as TOrderedDict
@@ -37,6 +39,9 @@ from metaflow.exception import MetaflowException
37
39
  from metaflow.includefile import FilePathClass
38
40
  from metaflow.parameters import JSONTypeClass, flow_context
39
41
 
42
+ # Define a recursive type alias for JSON
43
+ JSON = Union[Dict[str, "JSON"], List["JSON"], str, int, float, bool, None]
44
+
40
45
  click_to_python_types = {
41
46
  StringParamType: str,
42
47
  IntParamType: int,
@@ -48,7 +53,7 @@ click_to_python_types = {
48
53
  Tuple: tuple,
49
54
  Choice: str,
50
55
  File: str,
51
- JSONTypeClass: str,
56
+ JSONTypeClass: JSON,
52
57
  FilePathClass: str,
53
58
  }
54
59
 
@@ -82,6 +87,11 @@ def _method_sanity_check(
82
87
  % (supplied_k, annotations[supplied_k], defaults[supplied_k])
83
88
  )
84
89
 
90
+ # because Click expects stringified JSON..
91
+ supplied_v = (
92
+ json.dumps(supplied_v) if annotations[supplied_k] == JSON else supplied_v
93
+ )
94
+
85
95
  if supplied_k in possible_arg_params:
86
96
  cli_name = possible_arg_params[supplied_k].opts[0].strip("-")
87
97
  method_params["args"][cli_name] = supplied_v
@@ -142,6 +152,8 @@ loaded_modules = {}
142
152
 
143
153
 
144
154
  def extract_flow_class_from_file(flow_file: str) -> FlowSpec:
155
+ if not os.path.exists(flow_file):
156
+ raise FileNotFoundError("Flow file not present at '%s'" % flow_file)
145
157
  # Check if the module has already been loaded
146
158
  if flow_file in loaded_modules:
147
159
  module = loaded_modules[flow_file]
@@ -5,6 +5,8 @@ import time
5
5
  import importlib
6
6
  import functools
7
7
  import tempfile
8
+
9
+ from subprocess import CalledProcessError
8
10
  from typing import Optional, Dict, ClassVar
9
11
 
10
12
  from metaflow.exception import MetaflowNotFound
@@ -25,6 +27,8 @@ def handle_timeout(
25
27
  Temporary file that stores runner attribute data.
26
28
  command_obj : CommandManager
27
29
  Command manager object that encapsulates the running command details.
30
+ file_read_timeout : int
31
+ Timeout for reading the file.
28
32
 
29
33
  Returns
30
34
  -------
@@ -39,10 +43,10 @@ def handle_timeout(
39
43
  """
40
44
  try:
41
45
  content = read_from_file_when_ready(
42
- tfp_runner_attribute.name, timeout=file_read_timeout
46
+ tfp_runner_attribute.name, command_obj, timeout=file_read_timeout
43
47
  )
44
48
  return content
45
- except TimeoutError as e:
49
+ except (CalledProcessError, TimeoutError) as e:
46
50
  stdout_log = open(command_obj.log_files["stdout"]).read()
47
51
  stderr_log = open(command_obj.log_files["stderr"]).read()
48
52
  command = " ".join(command_obj.command)
@@ -397,6 +401,9 @@ class DeployerImpl(object):
397
401
  self.name = content.get("name")
398
402
  self.flow_name = content.get("flow_name")
399
403
  self.metadata = content.get("metadata")
404
+ # Additional info is used to pass additional deployer specific information.
405
+ # It is used in non-OSS deployers (extensions).
406
+ self.additional_info = content.get("additional_info", {})
400
407
 
401
408
  if command_obj.process.returncode == 0:
402
409
  deployed_flow = DeployedFlow(deployer=self)
@@ -2,6 +2,8 @@ import importlib
2
2
  import os
3
3
  import sys
4
4
  import tempfile
5
+
6
+ from subprocess import CalledProcessError
5
7
  from typing import Dict, Iterator, Optional, Tuple
6
8
 
7
9
  from metaflow import Run, metadata
@@ -275,13 +277,13 @@ class Runner(object):
275
277
 
276
278
  # Set the correct metadata from the runner_attribute file corresponding to this run.
277
279
  content = read_from_file_when_ready(
278
- tfp_runner_attribute.name, timeout=self.file_read_timeout
280
+ tfp_runner_attribute.name, command_obj, timeout=self.file_read_timeout
279
281
  )
280
282
  metadata_for_flow, pathspec = content.rsplit(":", maxsplit=1)
281
283
  metadata(metadata_for_flow)
282
284
  run_object = Run(pathspec, _namespace_check=False)
283
285
  return ExecutingRun(self, command_obj, run_object)
284
- except TimeoutError as e:
286
+ except (CalledProcessError, TimeoutError) as e:
285
287
  stdout_log = open(command_obj.log_files["stdout"]).read()
286
288
  stderr_log = open(command_obj.log_files["stderr"]).read()
287
289
  command = " ".join(command_obj.command)
@@ -1,18 +1,22 @@
1
1
  import asyncio
2
2
  import os
3
+ import time
3
4
  import shutil
4
5
  import signal
5
6
  import subprocess
6
7
  import sys
7
8
  import tempfile
8
9
  import threading
9
- import time
10
10
  from typing import Callable, Dict, Iterator, List, Optional, Tuple
11
11
 
12
12
 
13
13
  def kill_process_and_descendants(pid, termination_timeout):
14
+ # TODO: there's a race condition that new descendants might
15
+ # spawn b/w the invocations of 'pkill' and 'kill'.
16
+ # Needs to be fixed in future.
14
17
  try:
15
18
  subprocess.check_call(["pkill", "-TERM", "-P", str(pid)])
19
+ subprocess.check_call(["kill", "-TERM", str(pid)])
16
20
  except subprocess.CalledProcessError:
17
21
  pass
18
22
 
@@ -20,6 +24,7 @@ def kill_process_and_descendants(pid, termination_timeout):
20
24
 
21
25
  try:
22
26
  subprocess.check_call(["pkill", "-KILL", "-P", str(pid)])
27
+ subprocess.check_call(["kill", "-KILL", str(pid)])
23
28
  except subprocess.CalledProcessError:
24
29
  pass
25
30
 
@@ -436,13 +441,13 @@ class CommandManager(object):
436
441
  if self.run_called:
437
442
  shutil.rmtree(self.temp_dir, ignore_errors=True)
438
443
 
439
- async def kill(self, termination_timeout: float = 1):
444
+ async def kill(self, termination_timeout: float = 5):
440
445
  """
441
446
  Kill the subprocess and its descendants.
442
447
 
443
448
  Parameters
444
449
  ----------
445
- termination_timeout : float, default 1
450
+ termination_timeout : float, default 5
446
451
  The time to wait after sending a SIGTERM to the process and its descendants
447
452
  before sending a SIGKILL.
448
453
  """
metaflow/runner/utils.py CHANGED
@@ -1,7 +1,12 @@
1
1
  import os
2
2
  import ast
3
3
  import time
4
- from typing import Dict
4
+
5
+ from subprocess import CalledProcessError
6
+ from typing import Dict, TYPE_CHECKING
7
+
8
+ if TYPE_CHECKING:
9
+ from .subprocess_manager import CommandManager
5
10
 
6
11
 
7
12
  def get_current_cell(ipython):
@@ -35,11 +40,23 @@ def clear_and_set_os_environ(env: Dict):
35
40
  os.environ.update(env)
36
41
 
37
42
 
38
- def read_from_file_when_ready(file_path: str, timeout: float = 5):
43
+ def read_from_file_when_ready(
44
+ file_path: str, command_obj: "CommandManager", timeout: float = 5
45
+ ):
39
46
  start_time = time.time()
40
47
  with open(file_path, "r", encoding="utf-8") as file_pointer:
41
48
  content = file_pointer.read()
42
49
  while not content:
50
+ if command_obj.process.poll() is not None:
51
+ # Check to make sure the file hasn't been read yet to avoid a race
52
+ # where the file is written between the end of this while loop and the
53
+ # poll call above.
54
+ content = file_pointer.read()
55
+ if content:
56
+ break
57
+ raise CalledProcessError(
58
+ command_obj.process.returncode, command_obj.command
59
+ )
43
60
  if time.time() - start_time > timeout:
44
61
  raise TimeoutError(
45
62
  "Timeout while waiting for file content from '%s'" % file_path
metaflow/version.py CHANGED
@@ -1 +1 @@
1
- metaflow_version = "2.12.19.1"
1
+ metaflow_version = "2.12.22.1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ob-metaflow
3
- Version: 2.12.19.1
3
+ Version: 2.12.22.1
4
4
  Summary: Metaflow: More Data Science, 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.12.19.1; extra == "stubs"
15
+ Requires-Dist: metaflow-stubs==2.12.22.1; extra == "stubs"
16
16
 
17
17
  ![Metaflow_Logo_Horizontal_FullColor_Ribbon_Dark_RGB](https://user-images.githubusercontent.com/763451/89453116-96a57e00-d713-11ea-9fa6-82b29d4d6eff.png)
18
18
 
@@ -1,5 +1,5 @@
1
1
  metaflow/R.py,sha256=CqVfIatvmjciuICNnoyyNGrwE7Va9iXfLdFbQa52hwA,3958
2
- metaflow/__init__.py,sha256=PRCu_YigqL-wzR79NZqMzqtm66VgUkqFQ506CO-eUCg,6340
2
+ metaflow/__init__.py,sha256=mrvSL4mgwJOGkNWmk0cdSJSFz1aIhF5K4mdLgOfQbME,6010
3
3
  metaflow/cards.py,sha256=tP1_RrtmqdFh741pqE4t98S7SA0MtGRlGvRICRZF1Mg,426
4
4
  metaflow/cli.py,sha256=fa6dx6F2PKtq0oeMxRM2efA9LyE108jGZQvYCtiUS94,34274
5
5
  metaflow/cli_args.py,sha256=lcgBGNTvfaiPxiUnejAe60Upt9swG6lRy1_3OqbU6MY,2616
@@ -10,20 +10,21 @@ metaflow/decorators.py,sha256=hbJwRlZuLbl6t7fOsTiH7Sux4Lx6zgEEpldIXoM5TQc,21540
10
10
  metaflow/event_logger.py,sha256=joTVRqZPL87nvah4ZOwtqWX8NeraM_CXKXXGVpKGD8o,780
11
11
  metaflow/events.py,sha256=ahjzkSbSnRCK9RZ-9vTfUviz_6gMvSO9DGkJ86X80-k,5300
12
12
  metaflow/exception.py,sha256=KC1LHJQzzYkWib0DeQ4l_A2r8VaudywsSqIQuq1RDZU,4954
13
- metaflow/flowspec.py,sha256=0-NnCKiX4oJ21Spb5PJkl2IvHoJxBcpi8CQrZEGB2Ag,27178
13
+ metaflow/flowspec.py,sha256=4w7Hm1aFSmVBOq0x9-LtFAq4eDjFb5F6Rdyh_NW41BQ,27270
14
14
  metaflow/graph.py,sha256=HFJ7V_bPSht_NHIm8BejrSqOX2fyBQpVOczRCliRw08,11975
15
15
  metaflow/includefile.py,sha256=yHczcZ_U0SrasxSNhZb3DIBzx8UZnrJCl3FzvpEQLOA,19753
16
+ metaflow/info_file.py,sha256=wtf2_F0M6dgiUu74AFImM8lfy5RrUw5Yj7Rgs2swKRY,686
16
17
  metaflow/integrations.py,sha256=LlsaoePRg03DjENnmLxZDYto3NwWc9z_PtU6nJxLldg,1480
17
18
  metaflow/lint.py,sha256=5rj1MlpluxyPTSINjtMoJ7viotyNzfjtBJSAihlAwMU,10870
18
- metaflow/metaflow_config.py,sha256=MxVBlIXpLmvudB09WwuWzcYZtNmnIKdxhHuLaNG9IZA,23018
19
+ metaflow/metaflow_config.py,sha256=J11vmCjjffr2Koddo1OuymZFheW-0UaTD6rec2Hp0Gk,23017
19
20
  metaflow/metaflow_config_funcs.py,sha256=5GlvoafV6SxykwfL8D12WXSfwjBN_NsyuKE_Q3gjGVE,6738
20
- metaflow/metaflow_current.py,sha256=5Kri7fzj-rtIJVr5xh5kPKwZ0T73_4egZybzlDR-fgc,7136
21
- metaflow/metaflow_environment.py,sha256=D7zHYqe8aLZVwJ20nx19vmsNW29Kf3PVE8hbBjVQin8,8115
21
+ metaflow/metaflow_current.py,sha256=pC-EMnAsnvBLvLd61W6MvfiCKcboryeui9f6r8z_sg8,7161
22
+ metaflow/metaflow_environment.py,sha256=rojFyGdyY56sN1HaEb1-0XX53Q3XPNnl0SaH-8xXZ8w,7987
22
23
  metaflow/metaflow_profile.py,sha256=jKPEW-hmAQO-htSxb9hXaeloLacAh41A35rMZH6G8pA,418
23
- metaflow/metaflow_version.py,sha256=mPQ6g_3XjNdi0NrxDzwlW8ZH0nMyYpwqmJ04P7TIdP0,4774
24
+ metaflow/metaflow_version.py,sha256=lOsrhMfHdKXBPS-673sZb48dK2FJhr34rIwLqMFeG9I,7291
24
25
  metaflow/monitor.py,sha256=T0NMaBPvXynlJAO_avKtk8OIIRMyEuMAyF8bIp79aZU,5323
25
26
  metaflow/multicore_utils.py,sha256=vdTNgczVLODifscUbbveJbuSDOl3Y9pAxhr7sqYiNf4,4760
26
- metaflow/package.py,sha256=sOvRpnvqVaQa6eR8lwcfb5HYCGqmpYFPm-cLgOEdl04,7377
27
+ metaflow/package.py,sha256=QutDP6WzjwGk1UCKXqBfXa9F10Q--FlRr0J7fwlple0,7399
27
28
  metaflow/parameters.py,sha256=l8qnhBG9C4wf_FkXWjq5sapUA6npLdR7pyB0PPQ-KF0,15712
28
29
  metaflow/procpoll.py,sha256=U2tE4iK_Mwj2WDyVTx_Uglh6xZ-jixQOo4wrM9OOhxg,2859
29
30
  metaflow/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -35,7 +36,7 @@ metaflow/tuple_util.py,sha256=_G5YIEhuugwJ_f6rrZoelMFak3DqAR2tt_5CapS1XTY,830
35
36
  metaflow/unbounded_foreach.py,sha256=p184WMbrMJ3xKYHwewj27ZhRUsSj_kw1jlye5gA9xJk,387
36
37
  metaflow/util.py,sha256=olAvJK3y1it_k99MhLulTaAJo7OFVt5rnrD-ulIFLCU,13616
37
38
  metaflow/vendor.py,sha256=FchtA9tH22JM-eEtJ2c9FpUdMn8sSb1VHuQS56EcdZk,5139
38
- metaflow/version.py,sha256=XY6g1qJ5R4LqOmhFOzlgSJpLjqBMlxLI69hn8Pur3ig,31
39
+ metaflow/version.py,sha256=MeZM-8MzkvMaKzlO6Il3_BkQ6liKzbdGUDS7Zf9ygEI,31
39
40
  metaflow/_vendor/__init__.py,sha256=y_CiwUD3l4eAKvTVDZeqgVujMy31cAM1qjAB-HfI-9s,353
40
41
  metaflow/_vendor/typing_extensions.py,sha256=0nUs5p1A_UrZigrAVBoOEM6TxU37zzPDUtiij1ZwpNc,110417
41
42
  metaflow/_vendor/zipp.py,sha256=ajztOH-9I7KA_4wqDYygtHa6xUBVZgFpmZ8FE74HHHI,8425
@@ -110,11 +111,11 @@ metaflow/_vendor/v3_6/importlib_metadata/_meta.py,sha256=_F48Hu_jFxkfKWz5wcYS8vO
110
111
  metaflow/_vendor/v3_6/importlib_metadata/_text.py,sha256=HCsFksZpJLeTP3NEk_ngrAeXVRRtTrtyh9eOABoRP4A,2166
111
112
  metaflow/_vendor/v3_6/importlib_metadata/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
113
  metaflow/client/__init__.py,sha256=1GtQB4Y_CBkzaxg32L1syNQSlfj762wmLrfrDxGi1b8,226
113
- metaflow/client/core.py,sha256=L4COrMyQgSAWkXIPoXFFQ3OqGnoHfePsBZdJQvShU1E,74162
114
+ metaflow/client/core.py,sha256=jnFTP_XLTLJCHRqaxGKYDn1ZwB_v6a1AAkULlLmJGOk,74171
114
115
  metaflow/client/filecache.py,sha256=Wy0yhhCqC1JZgebqi7z52GCwXYnkAqMZHTtxThvwBgM,15229
115
116
  metaflow/cmd/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
116
117
  metaflow/cmd/configure_cmd.py,sha256=o-DKnUf2FBo_HiMVyoyzQaGBSMtpbEPEdFTQZ0hkU-k,33396
117
- metaflow/cmd/main_cli.py,sha256=Yunxh0QFUPgGYMe0eeGrbmxtZGVdJPCgkd4P1x_j8B4,2950
118
+ metaflow/cmd/main_cli.py,sha256=E546zT_jYQKysmjwfpEgzZd5QMsyirs28M2s0OPU93E,2966
118
119
  metaflow/cmd/tutorials_cmd.py,sha256=8FdlKkicTOhCIDKcBR5b0Oz6giDvS-EMY3o9skIrRqw,5156
119
120
  metaflow/cmd/util.py,sha256=jS_0rUjOnGGzPT65fzRLdGjrYAOOLA4jU2S0HJLV0oc,406
120
121
  metaflow/cmd/develop/__init__.py,sha256=p1Sy8yU1MEKSrH5ttOWOZvNcI1qYu6J6jghdTHwPgOw,689
@@ -128,7 +129,7 @@ metaflow/datastore/exceptions.py,sha256=r7Ab5FvHIzyFh6kwiptA1lO5nLqWg0xRBoeYGefv
128
129
  metaflow/datastore/flow_datastore.py,sha256=kbJcOLYnvPHgJfZ_WWkD9LJSX1PHI1K6f9oVUu08A9U,10235
129
130
  metaflow/datastore/inputs.py,sha256=i43dXr2xvgtsgKMO9allgCR18bk80GeayeQFyUTH36w,449
130
131
  metaflow/datastore/task_datastore.py,sha256=-aDvRUUEaWq0chiGzCCSYmsTP8T-gjs0eowvy2Xyaug,36167
131
- metaflow/extension_support/__init__.py,sha256=FF-GdIkxiHSqdwCN5xkW5A0DQn3B8GpnphIFDBpLEr0,49432
132
+ metaflow/extension_support/__init__.py,sha256=2z0c4R8zsVmEFOMGT2Jujsl6xveDVa9KLll7moL58NE,52984
132
133
  metaflow/extension_support/_empty_file.py,sha256=HENjnM4uAfeNygxMB_feCCWORFoSat9n_QwzSx2oXPw,109
133
134
  metaflow/extension_support/cmd.py,sha256=hk8iBUUINqvKCDxInKgWpum8ThiRZtHSJP7qBASHzl8,5711
134
135
  metaflow/extension_support/integrations.py,sha256=AWAh-AZ-vo9IxuAVEjGw3s8p_NMm2DKHYx10oC51gPU,5506
@@ -150,7 +151,7 @@ metaflow/plugins/environment_decorator.py,sha256=6m9j2B77d-Ja_l_9CTJ__0O6aB2a8Qt
150
151
  metaflow/plugins/events_decorator.py,sha256=c2GcH6Mspbey3wBkjM5lqxaNByFOzYDQdllLpXzRNv8,18283
151
152
  metaflow/plugins/logs_cli.py,sha256=77W5UNagU2mOKSMMvrQxQmBLRzvmjK-c8dWxd-Ygbqs,11410
152
153
  metaflow/plugins/package_cli.py,sha256=-J6D4cupHfWSZ4GEFo2yy9Je9oL3owRWm5pEJwaiqd4,1649
153
- metaflow/plugins/parallel_decorator.py,sha256=wXBmEnnOmWI46-Lcry_CArkujj6YOrfzAwVVw1kgpPI,8591
154
+ metaflow/plugins/parallel_decorator.py,sha256=hRYTdw3iJjxBEws2rtrZaCHojOaDoO0Pu08ckl-Z5bU,8876
154
155
  metaflow/plugins/project_decorator.py,sha256=eJOe0Ea7CbUCReEhR_XQvRkhV6jyRqDxM72oZI7EMCk,5336
155
156
  metaflow/plugins/resources_decorator.py,sha256=3MMZ7uptDf99795_RcSOq4h0N3OFlKpd3ahIEsozBBs,1333
156
157
  metaflow/plugins/retry_decorator.py,sha256=tz_2Tq6GLg3vjDBZp0KKVTk3ADlCvqaWTSf7blmFdUw,1548
@@ -174,12 +175,11 @@ metaflow/plugins/airflow/sensors/s3_sensor.py,sha256=iDReG-7FKnumrtQg-HY6cCUAAqN
174
175
  metaflow/plugins/argo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
175
176
  metaflow/plugins/argo/argo_client.py,sha256=MKKhMCbWOPzf6z5zQQiyDRHHkAXcO7ipboDZDqAAvOk,15849
176
177
  metaflow/plugins/argo/argo_events.py,sha256=_C1KWztVqgi3zuH57pInaE9OzABc2NnncC-zdwOMZ-w,5909
177
- metaflow/plugins/argo/argo_workflows.py,sha256=BzlJ4_3Lz4MZgxrnr2xpkEts0ZB4CBRzG76WK3ony1w,170676
178
- metaflow/plugins/argo/argo_workflows_cli.py,sha256=X2j_F0xF8-K30ebM4dSLOTteDKXbr-jMN18oMpl5S6Y,36313
178
+ metaflow/plugins/argo/argo_workflows.py,sha256=HFCebPkWZA4zhWlRJ37cfsSvjOgVwmzsRFgw8UJ3Rg0,172892
179
+ metaflow/plugins/argo/argo_workflows_cli.py,sha256=E_PyhOtxuS2F8DwhBANsRZCMxpeZ5rfID8eksfSOPm8,37231
179
180
  metaflow/plugins/argo/argo_workflows_decorator.py,sha256=yprszMdbE3rBTcEA9VR0IEnPjTprUauZBc4SBb-Q7sA,7878
180
181
  metaflow/plugins/argo/argo_workflows_deployer.py,sha256=wSSZtThn_VPvE_Wu6NB1L0Q86LmBJh9g009v_lpvBPM,8125
181
182
  metaflow/plugins/argo/capture_error.py,sha256=Ys9dscGrTpW-ZCirLBU0gD9qBM0BjxyxGlUMKcwewQc,1852
182
- metaflow/plugins/argo/daemon.py,sha256=dJOS_UUISXBYffi3oGVKPwq4Pa4P_nGBGL15piPaPto,1776
183
183
  metaflow/plugins/argo/generate_input_paths.py,sha256=loYsI6RFX9LlFsHb7Fe-mzlTTtRdySoOu7sYDy-uXK0,881
184
184
  metaflow/plugins/argo/jobset_input_paths.py,sha256=_JhZWngA6p9Q_O2fx3pdzKI0WE-HPRHz_zFvY2pHPTQ,525
185
185
  metaflow/plugins/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -188,7 +188,7 @@ metaflow/plugins/aws/aws_utils.py,sha256=Y9C1asbn6C3WuFaOCOka_hNAy__HQYx1tXjCTiW
188
188
  metaflow/plugins/aws/batch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
189
189
  metaflow/plugins/aws/batch/batch.py,sha256=e9ssahWM18GnipPK2sqYB-ztx9w7Eoo7YtWyEtufYxs,17787
190
190
  metaflow/plugins/aws/batch/batch_cli.py,sha256=6PTbyajRgdy0XmjyJLBTdKdiOB84dcovQQ8sFXlJqko,11749
191
- metaflow/plugins/aws/batch/batch_client.py,sha256=s9ZHhxQPPoBQijLUgn6_16QOaD4-22U_44uJbp-yLkI,28565
191
+ metaflow/plugins/aws/batch/batch_client.py,sha256=ddlGG0Vk1mkO7tcvJjDvNAVsVLOlqddF7MA1kKfHSqM,28830
192
192
  metaflow/plugins/aws/batch/batch_decorator.py,sha256=dyC3xl_iB0BQT6mzWSa3oRBH3YE734XpIhxKue38KcU,17526
193
193
  metaflow/plugins/aws/secrets_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
194
194
  metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py,sha256=JtFUVu00Cg0FzAizgrPLXmrMqsT7YeQMkQlgeivUxcE,7986
@@ -279,18 +279,19 @@ metaflow/plugins/gcp/gs_tail.py,sha256=Jl_wvnzU7dub07A-DOAuP5FeccNIrPM-CeL1xKFs1
279
279
  metaflow/plugins/gcp/gs_utils.py,sha256=ZmIGFse1qYyvAVrwga23PQUzF6dXEDLLsZ2F-YRmvow,2030
280
280
  metaflow/plugins/gcp/includefile_support.py,sha256=vIDeR-MiJuUh-2S2pV7Z7FBkhIWwtHXaRrj76MWGRiY,3869
281
281
  metaflow/plugins/kubernetes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
282
- metaflow/plugins/kubernetes/kubernetes.py,sha256=sP5BDnjv-5cLm8i7E5YiJygWN4yNRQHt-hhOmysKm1k,31051
283
- metaflow/plugins/kubernetes/kubernetes_cli.py,sha256=qBDdr1Lvtt-RO9pB-9_HTOPdzAmDvvJ0aiQ1OoCcrMU,10892
284
- metaflow/plugins/kubernetes/kubernetes_client.py,sha256=GKg-gT3qhXMRQV-sG1YyoOf3Z32NXr_wwEN2ytMVSEg,2471
285
- metaflow/plugins/kubernetes/kubernetes_decorator.py,sha256=MATnWGxfC62MJnRPR-LqybxoWolZb7CRh1Tkv5GbqLE,26162
282
+ metaflow/plugins/kubernetes/kube_utils.py,sha256=fYDlvqi8jYPsWijDwT6Z2qhQswyFqv7tiwtic_I80Vg,749
283
+ metaflow/plugins/kubernetes/kubernetes.py,sha256=bKBqgZXnIDkoa4xKtKoV6InPtYQy4CujfvcbQ3Pvsbc,31305
284
+ metaflow/plugins/kubernetes/kubernetes_cli.py,sha256=sFZ9Zrjef85vCO0MGpUF-em8Pw3dePFb3hbX3PtAH4I,13463
285
+ metaflow/plugins/kubernetes/kubernetes_client.py,sha256=LuKX9rejRySIajnfmDoNkQ6HrOMjwIMbHAOT7wgF9i8,6362
286
+ metaflow/plugins/kubernetes/kubernetes_decorator.py,sha256=_RnMafj_oV2uh3qzib0qC3U7YqqP0bo-u2CHi0FbroI,26511
286
287
  metaflow/plugins/kubernetes/kubernetes_job.py,sha256=Cfkee8LbXC17jSXWoeNdomQRvF_8YSeXNg1gvxm6E_M,31806
287
288
  metaflow/plugins/kubernetes/kubernetes_jobsets.py,sha256=sCVuy-PRN60s5HWpnRvFmnljS41k70sBoPO3nOtl2ZE,40800
288
289
  metaflow/plugins/metadata/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
289
290
  metaflow/plugins/metadata/local.py,sha256=YhLJC5zjVJrvQFIyQ92ZBByiUmhCC762RUX7ITX12O8,22428
290
291
  metaflow/plugins/metadata/service.py,sha256=ihq5F7KQZlxvYwzH_-jyP2aWN_I96i2vp92j_d697s8,20204
291
292
  metaflow/plugins/pypi/__init__.py,sha256=0YFZpXvX7HCkyBFglatual7XGifdA1RwC3U4kcizyak,1037
292
- metaflow/plugins/pypi/bootstrap.py,sha256=Tvc4_QKIx-A8j5Aq8ccWZrrxNM8csN40rK8HmxDx-Z8,5106
293
- metaflow/plugins/pypi/conda_decorator.py,sha256=D5B6xnBc2KUNPhaD0J062CGM1Jzo6D2bxhSU87KrmCM,15372
293
+ metaflow/plugins/pypi/bootstrap.py,sha256=LSRjpDhtpvYqCC0lDPIWvZsrHW7PXx626NDzdYjFeVM,5224
294
+ metaflow/plugins/pypi/conda_decorator.py,sha256=fPeXxvmg51oSFTnlguNlcWUIdXHA9OuMnp9ElaxQPFo,15695
294
295
  metaflow/plugins/pypi/conda_environment.py,sha256=NSBcN4oD_RZONOUrnubLh-ur8EfS0h9PM4r7GNZczyc,19685
295
296
  metaflow/plugins/pypi/micromamba.py,sha256=67FiIZZz0Kig9EcN7bZLObsE6Z1MFyo4Dp93fd3Grcc,12178
296
297
  metaflow/plugins/pypi/pip.py,sha256=7B06mPOs5MvY33xbzPVYZlBr1iKMYaN-n8uulL9zSVg,13649
@@ -301,13 +302,13 @@ metaflow/plugins/secrets/__init__.py,sha256=mhJaN2eMS_ZZVewAMR2E-JdP5i0t3v9e6Dcw
301
302
  metaflow/plugins/secrets/inline_secrets_provider.py,sha256=EChmoBGA1i7qM3jtYwPpLZDBybXLergiDlN63E0u3x8,294
302
303
  metaflow/plugins/secrets/secrets_decorator.py,sha256=s-sFzPWOjahhpr5fMj-ZEaHkDYAPTO0isYXGvaUwlG8,11273
303
304
  metaflow/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
304
- metaflow/runner/click_api.py,sha256=vrrIb5DtVYhCW_hB7wPgj6Q0o-h1bBSWiYnKTOyC454,13452
305
- metaflow/runner/deployer.py,sha256=nArjnErc0rOaZW612VRKDOT5594jwzeu86w5zW1LX6U,13558
306
- metaflow/runner/metaflow_runner.py,sha256=AO9nwr5qUbZWmsbFdjkUJrvFlaylz7WvxslvHsIqDYc,15371
305
+ metaflow/runner/click_api.py,sha256=Qfg4BOz5K2LaXTYBsi1y4zTfNIsGGHBVF3UkorX_-o8,13878
306
+ metaflow/runner/deployer.py,sha256=ddYv2UFE7lOFD3EPg4REzMdeLqg5WQhAXkdgMD5bUY8,13920
307
+ metaflow/runner/metaflow_runner.py,sha256=zRlnM2j5QLBh9OboPUuaQ4_WpwFaqrCedKBOpjjtxDw,15449
307
308
  metaflow/runner/nbdeploy.py,sha256=fP1s_5MeiDyT_igP82pB5EUqX9rOy2s06Hyc-OUbOvQ,4115
308
309
  metaflow/runner/nbrun.py,sha256=lmvhzMCz7iC9LSPGRijifW1wMXxa4RW_jVmpdjQi22E,7261
309
- metaflow/runner/subprocess_manager.py,sha256=0knxWZYJx8srMv6wTPYKOC6tn4-airnyI7Vbqfb3iXY,19567
310
- metaflow/runner/utils.py,sha256=FibdEj8CDnx1a-Je5KUQTwHuNbtkFm1unXGarj0D8ok,1394
310
+ metaflow/runner/subprocess_manager.py,sha256=FJh2C6wJlNnvwE00wyK6zxjf8R49PRRHeVcnPvlO4-0,19839
311
+ metaflow/runner/utils.py,sha256=jFlQf9fVvNRd4c6VKv0KwQ8kez_re7kC2VCRgHVMSsM,2051
311
312
  metaflow/sidecar/__init__.py,sha256=1mmNpmQ5puZCpRmmYlCOeieZ4108Su9XQ4_EqF1FGOU,131
312
313
  metaflow/sidecar/sidecar.py,sha256=EspKXvPPNiyRToaUZ51PS5TT_PzrBNAurn_wbFnmGr0,1334
313
314
  metaflow/sidecar/sidecar_messages.py,sha256=zPsCoYgDIcDkkvdC9MEpJTJ3y6TSGm2JWkRc4vxjbFA,1071
@@ -344,9 +345,9 @@ metaflow/tutorials/07-worldview/README.md,sha256=5vQTrFqulJ7rWN6r20dhot9lI2sVj9W
344
345
  metaflow/tutorials/07-worldview/worldview.ipynb,sha256=ztPZPI9BXxvW1QdS2Tfe7LBuVzvFvv0AToDnsDJhLdE,2237
345
346
  metaflow/tutorials/08-autopilot/README.md,sha256=GnePFp_q76jPs991lMUqfIIh5zSorIeWznyiUxzeUVE,1039
346
347
  metaflow/tutorials/08-autopilot/autopilot.ipynb,sha256=DQoJlILV7Mq9vfPBGW-QV_kNhWPjS5n6SJLqePjFYLY,3191
347
- ob_metaflow-2.12.19.1.dist-info/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
348
- ob_metaflow-2.12.19.1.dist-info/METADATA,sha256=dlRjUFXgU42VFrt4kFUosjHtZgpgCwHnItdgQvXtx1w,5143
349
- ob_metaflow-2.12.19.1.dist-info/WHEEL,sha256=O8iI_RpvXnU2dkdPNf_wSffaC9hi-VsSQKnuYEptk_s,109
350
- ob_metaflow-2.12.19.1.dist-info/entry_points.txt,sha256=IKwTN1T3I5eJL3uo_vnkyxVffcgnRdFbKwlghZfn27k,57
351
- ob_metaflow-2.12.19.1.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
352
- ob_metaflow-2.12.19.1.dist-info/RECORD,,
348
+ ob_metaflow-2.12.22.1.dist-info/LICENSE,sha256=nl_Lt5v9VvJ-5lWJDT4ddKAG-VZ-2IaLmbzpgYDz2hU,11343
349
+ ob_metaflow-2.12.22.1.dist-info/METADATA,sha256=zA1Cn4lel8UBUz2u78BMzN2CI9h1NvEVc58S43IUAVM,5143
350
+ ob_metaflow-2.12.22.1.dist-info/WHEEL,sha256=AHX6tWk3qWuce7vKLrj7lnulVHEdWoltgauo8bgCXgU,109
351
+ ob_metaflow-2.12.22.1.dist-info/entry_points.txt,sha256=IKwTN1T3I5eJL3uo_vnkyxVffcgnRdFbKwlghZfn27k,57
352
+ ob_metaflow-2.12.22.1.dist-info/top_level.txt,sha256=v1pDHoWaSaKeuc5fKTRSfsXCKSdW1zvNVmvA-i0if3o,9
353
+ ob_metaflow-2.12.22.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (74.1.1)
2
+ Generator: setuptools (75.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any
@@ -1,59 +0,0 @@
1
- from collections import namedtuple
2
- from time import sleep
3
- from metaflow.metaflow_config import DEFAULT_METADATA
4
- from metaflow.metaflow_environment import MetaflowEnvironment
5
- from metaflow.plugins import METADATA_PROVIDERS
6
- from metaflow._vendor import click
7
-
8
-
9
- class CliState:
10
- pass
11
-
12
-
13
- @click.group()
14
- @click.option("--flow_name", required=True)
15
- @click.option("--run_id", required=True)
16
- @click.option(
17
- "--tag",
18
- "tags",
19
- multiple=True,
20
- default=None,
21
- help="Annotate all objects produced by Argo Workflows runs "
22
- "with the given tag. You can specify this option multiple "
23
- "times to attach multiple tags.",
24
- )
25
- @click.pass_context
26
- def cli(ctx, flow_name, run_id, tags=None):
27
- ctx.obj = CliState()
28
- ctx.obj.flow_name = flow_name
29
- ctx.obj.run_id = run_id
30
- ctx.obj.tags = tags
31
- # Use a dummy flow to initialize the environment and metadata service,
32
- # as we only need a name for the flow object.
33
- flow = namedtuple("DummyFlow", "name")
34
- dummyflow = flow(flow_name)
35
-
36
- # Initialize a proper metadata service instance
37
- environment = MetaflowEnvironment(dummyflow)
38
-
39
- ctx.obj.metadata = [m for m in METADATA_PROVIDERS if m.TYPE == DEFAULT_METADATA][0](
40
- environment, dummyflow, None, None
41
- )
42
-
43
-
44
- @cli.command(help="start heartbeat process for a run")
45
- @click.pass_obj
46
- def heartbeat(obj):
47
- # Try to register a run in case the start task has not taken care of it yet.
48
- obj.metadata.register_run_id(obj.run_id, obj.tags)
49
- # Start run heartbeat
50
- obj.metadata.start_run_heartbeat(obj.flow_name, obj.run_id)
51
- # Keepalive loop
52
- while True:
53
- # Do not pollute daemon logs with anything unnecessary,
54
- # as they might be extremely long running.
55
- sleep(10)
56
-
57
-
58
- if __name__ == "__main__":
59
- cli()