ob-metaflow 2.14.0.2rc0__tar.gz → 2.14.3.1__tar.gz

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 (376) hide show
  1. {ob_metaflow-2.14.0.2rc0/ob_metaflow.egg-info → ob_metaflow-2.14.3.1}/PKG-INFO +2 -2
  2. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cli.py +0 -23
  3. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cli_components/run_cmds.py +34 -14
  4. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cli_components/step_cmd.py +2 -0
  5. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/client/core.py +241 -1
  6. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cmd/main_cli.py +1 -1
  7. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/metadata_provider/heartbeat.py +1 -0
  8. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/metadata_provider/metadata.py +33 -0
  9. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/metaflow_config.py +5 -6
  10. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/mflog/save_logs.py +2 -2
  11. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/argo/argo_workflows.py +12 -14
  12. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/argo/argo_workflows_cli.py +2 -2
  13. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/datatools/s3/s3op.py +4 -4
  14. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/server.py +7 -0
  15. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/stub.py +21 -4
  16. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/kubernetes/kubernetes.py +0 -4
  17. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/kubernetes/kubernetes_cli.py +1 -9
  18. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/kubernetes/kubernetes_decorator.py +0 -5
  19. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/kubernetes/kubernetes_job.py +3 -5
  20. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +0 -8
  21. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/metadata_providers/local.py +66 -0
  22. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/metadata_providers/service.py +51 -0
  23. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/runner/click_api.py +6 -3
  24. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/sidecar/sidecar_worker.py +1 -1
  25. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/task.py +21 -2
  26. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tracing/__init__.py +7 -7
  27. ob_metaflow-2.14.3.1/metaflow/tracing/span_exporter.py +59 -0
  28. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tracing/tracing_modules.py +35 -43
  29. ob_metaflow-2.14.3.1/metaflow/version.py +1 -0
  30. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1/ob_metaflow.egg-info}/PKG-INFO +2 -2
  31. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/ob_metaflow.egg-info/requires.txt +1 -1
  32. ob_metaflow-2.14.0.2rc0/metaflow/tracing/span_exporter.py +0 -66
  33. ob_metaflow-2.14.0.2rc0/metaflow/version.py +0 -1
  34. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/LICENSE +0 -0
  35. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/MANIFEST.in +0 -0
  36. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/README.md +0 -0
  37. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/R.py +0 -0
  38. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/__init__.py +0 -0
  39. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/__init__.py +0 -0
  40. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/click/__init__.py +0 -0
  41. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  42. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/click/_compat.py +0 -0
  43. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/click/_termui_impl.py +0 -0
  44. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/click/_textwrap.py +0 -0
  45. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/click/_unicodefun.py +0 -0
  46. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/click/_winconsole.py +0 -0
  47. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/click/core.py +0 -0
  48. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/click/decorators.py +0 -0
  49. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/click/exceptions.py +0 -0
  50. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/click/formatting.py +0 -0
  51. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/click/globals.py +0 -0
  52. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/click/parser.py +0 -0
  53. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/click/termui.py +0 -0
  54. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/click/testing.py +0 -0
  55. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/click/types.py +0 -0
  56. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/click/utils.py +0 -0
  57. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
  58. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
  59. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
  60. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
  61. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
  62. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
  63. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
  64. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
  65. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
  66. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/packaging/__init__.py +0 -0
  67. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/packaging/_elffile.py +0 -0
  68. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  69. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  70. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/packaging/_parser.py +0 -0
  71. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/packaging/_structures.py +0 -0
  72. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  73. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/packaging/markers.py +0 -0
  74. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/packaging/py.typed +0 -0
  75. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/packaging/requirements.py +0 -0
  76. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/packaging/specifiers.py +0 -0
  77. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/packaging/tags.py +0 -0
  78. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/packaging/utils.py +0 -0
  79. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/packaging/version.py +0 -0
  80. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/typeguard/__init__.py +0 -0
  81. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/typeguard/_checkers.py +0 -0
  82. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/typeguard/_config.py +0 -0
  83. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/typeguard/_decorators.py +0 -0
  84. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
  85. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/typeguard/_functions.py +0 -0
  86. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/typeguard/_importhook.py +0 -0
  87. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/typeguard/_memo.py +0 -0
  88. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
  89. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/typeguard/_suppression.py +0 -0
  90. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/typeguard/_transformer.py +0 -0
  91. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
  92. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/typeguard/_utils.py +0 -0
  93. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/typeguard/py.typed +0 -0
  94. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/typing_extensions.py +0 -0
  95. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/v3_5/__init__.py +0 -0
  96. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
  97. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
  98. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/v3_5/zipp.py +0 -0
  99. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/v3_6/__init__.py +0 -0
  100. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  101. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  102. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  103. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  104. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  105. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  106. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  107. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  108. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  109. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  110. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/v3_6/zipp.py +0 -0
  111. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/_vendor/zipp.py +0 -0
  112. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cards.py +0 -0
  113. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cli_args.py +0 -0
  114. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cli_components/__init__.py +0 -0
  115. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cli_components/dump_cmd.py +0 -0
  116. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cli_components/init_cmd.py +0 -0
  117. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cli_components/utils.py +0 -0
  118. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/client/__init__.py +0 -0
  119. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/client/filecache.py +0 -0
  120. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/clone_util.py +0 -0
  121. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cmd/__init__.py +0 -0
  122. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cmd/configure_cmd.py +0 -0
  123. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cmd/develop/__init__.py +0 -0
  124. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cmd/develop/stub_generator.py +0 -0
  125. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cmd/develop/stubs.py +0 -0
  126. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cmd/tutorials_cmd.py +0 -0
  127. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cmd/util.py +0 -0
  128. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/cmd_with_io.py +0 -0
  129. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/datastore/__init__.py +0 -0
  130. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/datastore/content_addressed_store.py +0 -0
  131. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/datastore/datastore_set.py +0 -0
  132. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/datastore/datastore_storage.py +0 -0
  133. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/datastore/exceptions.py +0 -0
  134. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/datastore/flow_datastore.py +0 -0
  135. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/datastore/inputs.py +0 -0
  136. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/datastore/task_datastore.py +0 -0
  137. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/debug.py +0 -0
  138. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/decorators.py +0 -0
  139. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/event_logger.py +0 -0
  140. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/events.py +0 -0
  141. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/exception.py +0 -0
  142. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/extension_support/__init__.py +0 -0
  143. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/extension_support/_empty_file.py +0 -0
  144. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/extension_support/cmd.py +0 -0
  145. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/extension_support/integrations.py +0 -0
  146. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/extension_support/plugins.py +0 -0
  147. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/flowspec.py +0 -0
  148. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/graph.py +0 -0
  149. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/includefile.py +0 -0
  150. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/info_file.py +0 -0
  151. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/integrations.py +0 -0
  152. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/lint.py +0 -0
  153. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/metadata_provider/__init__.py +0 -0
  154. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/metadata_provider/util.py +0 -0
  155. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/metaflow_config_funcs.py +0 -0
  156. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/metaflow_current.py +0 -0
  157. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/metaflow_environment.py +0 -0
  158. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/metaflow_profile.py +0 -0
  159. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/metaflow_version.py +0 -0
  160. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/mflog/__init__.py +0 -0
  161. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/mflog/mflog.py +0 -0
  162. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/mflog/save_logs_periodically.py +0 -0
  163. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/mflog/tee.py +0 -0
  164. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/monitor.py +0 -0
  165. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/multicore_utils.py +0 -0
  166. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/package.py +0 -0
  167. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/parameters.py +0 -0
  168. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/__init__.py +0 -0
  169. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/airflow/__init__.py +0 -0
  170. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/airflow/airflow.py +0 -0
  171. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  172. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  173. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  174. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/airflow/dag.py +0 -0
  175. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/airflow/exception.py +0 -0
  176. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  177. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  178. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  179. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
  180. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
  181. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
  182. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/argo/__init__.py +0 -0
  183. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/argo/argo_client.py +0 -0
  184. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/argo/argo_events.py +0 -0
  185. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  186. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
  187. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/argo/argo_workflows_deployer_objects.py +0 -0
  188. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/argo/capture_error.py +0 -0
  189. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/argo/generate_input_paths.py +0 -0
  190. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
  191. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/__init__.py +0 -0
  192. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/aws_client.py +0 -0
  193. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/aws_utils.py +0 -0
  194. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/batch/__init__.py +0 -0
  195. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/batch/batch.py +0 -0
  196. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  197. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  198. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
  199. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  200. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  201. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  202. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  203. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  204. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  205. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  206. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  207. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
  208. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
  209. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  210. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  211. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
  212. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +0 -0
  213. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/azure/__init__.py +0 -0
  214. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/azure/azure_credential.py +0 -0
  215. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  216. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
  217. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/azure/azure_tail.py +0 -0
  218. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/azure/azure_utils.py +0 -0
  219. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  220. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/azure/includefile_support.py +0 -0
  221. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/__init__.py +0 -0
  222. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_cli.py +0 -0
  223. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_client.py +0 -0
  224. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_creator.py +0 -0
  225. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_datastore.py +0 -0
  226. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_decorator.py +0 -0
  227. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  228. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_modules/base.html +0 -0
  229. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_modules/basic.py +0 -0
  230. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
  231. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_modules/card.py +0 -0
  232. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  233. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  234. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  235. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  236. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  237. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_modules/components.py +0 -0
  238. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  239. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_modules/main.js +0 -0
  240. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  241. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  242. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_resolver.py +0 -0
  243. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_server.py +0 -0
  244. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
  245. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/component_serializer.py +0 -0
  246. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/cards/exception.py +0 -0
  247. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/catch_decorator.py +0 -0
  248. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/datastores/__init__.py +0 -0
  249. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/datastores/azure_storage.py +0 -0
  250. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/datastores/gs_storage.py +0 -0
  251. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/datastores/local_storage.py +0 -0
  252. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/datastores/s3_storage.py +0 -0
  253. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/datatools/__init__.py +0 -0
  254. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/datatools/local.py +0 -0
  255. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  256. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/datatools/s3/s3.py +0 -0
  257. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  258. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  259. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/debug_logger.py +0 -0
  260. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/debug_monitor.py +0 -0
  261. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/__init__.py +0 -0
  262. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/client.py +0 -0
  263. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/client_modules.py +0 -0
  264. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  265. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  266. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  267. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  268. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  269. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  270. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  271. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  272. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  273. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  274. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/consts.py +0 -0
  275. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  276. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  277. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  278. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/env_escape/utils.py +0 -0
  279. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/environment_decorator.py +0 -0
  280. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/events_decorator.py +0 -0
  281. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/frameworks/__init__.py +0 -0
  282. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/frameworks/pytorch.py +0 -0
  283. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/gcp/__init__.py +0 -0
  284. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
  285. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  286. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  287. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/gcp/gs_tail.py +0 -0
  288. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/gcp/gs_utils.py +0 -0
  289. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/gcp/includefile_support.py +0 -0
  290. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/kubernetes/__init__.py +0 -0
  291. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
  292. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
  293. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/kubernetes/spot_metadata_cli.py +0 -0
  294. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/kubernetes/spot_monitor_sidecar.py +0 -0
  295. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/logs_cli.py +0 -0
  296. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/metadata_providers/__init__.py +0 -0
  297. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/package_cli.py +0 -0
  298. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/parallel_decorator.py +0 -0
  299. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/project_decorator.py +0 -0
  300. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/pypi/__init__.py +0 -0
  301. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/pypi/bootstrap.py +0 -0
  302. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/pypi/conda_decorator.py +0 -0
  303. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/pypi/conda_environment.py +0 -0
  304. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/pypi/micromamba.py +0 -0
  305. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/pypi/pip.py +0 -0
  306. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
  307. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  308. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/pypi/utils.py +0 -0
  309. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/resources_decorator.py +0 -0
  310. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/retry_decorator.py +0 -0
  311. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/secrets/__init__.py +0 -0
  312. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  313. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  314. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/storage_executor.py +0 -0
  315. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/tag_cli.py +0 -0
  316. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  317. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/plugins/timeout_decorator.py +0 -0
  318. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/procpoll.py +0 -0
  319. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/py.typed +0 -0
  320. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/pylint_wrapper.py +0 -0
  321. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/runner/__init__.py +0 -0
  322. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/runner/deployer.py +0 -0
  323. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/runner/deployer_impl.py +0 -0
  324. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/runner/metaflow_runner.py +0 -0
  325. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/runner/nbdeploy.py +0 -0
  326. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/runner/nbrun.py +0 -0
  327. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/runner/subprocess_manager.py +0 -0
  328. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/runner/utils.py +0 -0
  329. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/runtime.py +0 -0
  330. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/sidecar/__init__.py +0 -0
  331. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/sidecar/sidecar.py +0 -0
  332. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/sidecar/sidecar_messages.py +0 -0
  333. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  334. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/system/__init__.py +0 -0
  335. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/system/system_logger.py +0 -0
  336. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/system/system_monitor.py +0 -0
  337. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/system/system_utils.py +0 -0
  338. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tagging_util.py +0 -0
  339. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tracing/propagator.py +0 -0
  340. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tuple_util.py +0 -0
  341. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/00-helloworld/README.md +0 -0
  342. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  343. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/01-playlist/README.md +0 -0
  344. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  345. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  346. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  347. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/02-statistics/README.md +0 -0
  348. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  349. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  350. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/02-statistics/stats.py +0 -0
  351. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  352. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  353. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  354. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  355. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  356. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  357. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  358. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  359. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  360. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/07-worldview/README.md +0 -0
  361. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  362. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/08-autopilot/README.md +0 -0
  363. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  364. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/unbounded_foreach.py +0 -0
  365. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/user_configs/__init__.py +0 -0
  366. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/user_configs/config_decorators.py +0 -0
  367. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/user_configs/config_options.py +0 -0
  368. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/user_configs/config_parameters.py +0 -0
  369. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/util.py +0 -0
  370. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/metaflow/vendor.py +0 -0
  371. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/ob_metaflow.egg-info/SOURCES.txt +0 -0
  372. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/ob_metaflow.egg-info/dependency_links.txt +0 -0
  373. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/ob_metaflow.egg-info/entry_points.txt +0 -0
  374. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/ob_metaflow.egg-info/top_level.txt +0 -0
  375. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/setup.cfg +0 -0
  376. {ob_metaflow-2.14.0.2rc0 → ob_metaflow-2.14.3.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ob-metaflow
3
- Version: 2.14.0.2rc0
3
+ Version: 2.14.3.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.14.0.2rc0; extra == "stubs"
15
+ Requires-Dist: metaflow-stubs==2.14.3.1; extra == "stubs"
16
16
  Dynamic: author
17
17
  Dynamic: author-email
18
18
  Dynamic: description
@@ -16,7 +16,6 @@ from .exception import CommandException, MetaflowException
16
16
  from .flowspec import _FlowState
17
17
  from .graph import FlowGraph
18
18
  from .metaflow_config import (
19
- DECOSPECS,
20
19
  DEFAULT_DATASTORE,
21
20
  DEFAULT_ENVIRONMENT,
22
21
  DEFAULT_EVENT_LOGGER,
@@ -106,26 +105,6 @@ def logger(body="", system_msg=False, head="", bad=False, timestamp=True, nl=Tru
106
105
  click.secho(body, bold=system_msg, fg=LOGGER_BAD_COLOR if bad else None, nl=nl)
107
106
 
108
107
 
109
- def config_merge_cb(ctx, param, value):
110
- # Callback to:
111
- # - read the Click auto_envvar variable from both the
112
- # environment AND the configuration
113
- # - merge that value with the value passed in the command line (value)
114
- # - return the value as a tuple
115
- # Note that this function gets called even if there is no option passed on the
116
- # command line.
117
- # NOTE: Assumes that ctx.auto_envvar_prefix is set to METAFLOW (same as in
118
- # from_conf)
119
-
120
- # Special case where DECOSPECS and value are the same. This happens
121
- # when there is no --with option at the TL and DECOSPECS is read from
122
- # the env var. In this case, click also passes it as value
123
- splits = DECOSPECS.split()
124
- if len(splits) == len(value) and all([a == b for (a, b) in zip(splits, value)]):
125
- return value
126
- return tuple(list(value) + DECOSPECS.split())
127
-
128
-
129
108
  @click.group(
130
109
  cls=LazyGroup,
131
110
  lazy_subcommands={
@@ -238,7 +217,6 @@ def version(obj):
238
217
  lazy_sources=plugins.get_plugin_cli_path(),
239
218
  invoke_without_command=True,
240
219
  )
241
- @tracing.cli_entrypoint("cli/start")
242
220
  # Quiet is eager to make sure it is available when processing --config options since
243
221
  # we need it to construct a context to pass to any DeployTimeField for the default
244
222
  # value.
@@ -285,7 +263,6 @@ def version(obj):
285
263
  multiple=True,
286
264
  help="Add a decorator to all steps. You can specify this option "
287
265
  "multiple times to attach multiple decorators in steps.",
288
- callback=config_merge_cb,
289
266
  )
290
267
  @click.option(
291
268
  "--pylint/--no-pylint",
@@ -8,6 +8,7 @@ from .. import decorators, namespace, parameters, tracing
8
8
  from ..exception import CommandException
9
9
  from ..graph import FlowGraph
10
10
  from ..metaflow_current import current
11
+ from ..metaflow_config import DEFAULT_DECOSPECS
11
12
  from ..package import MetaflowPackage
12
13
  from ..runtime import NativeRuntime
13
14
  from ..system import _system_logger
@@ -70,6 +71,23 @@ def write_file(file_path, content):
70
71
  f.write(str(content))
71
72
 
72
73
 
74
+ def config_merge_cb(ctx, param, value):
75
+ # Callback to:
76
+ # - read the Click auto_envvar variable from both the
77
+ # environment AND the configuration
78
+ # - merge that value with the value passed in the command line (value)
79
+ # - return the value as a tuple
80
+ # Note that this function gets called even if there is no option passed on the
81
+ # command line.
82
+ # NOTE: Assumes that ctx.auto_envvar_prefix is set to METAFLOW (same as in
83
+ # from_conf)
84
+
85
+ # Read decospecs options from the environment (METAFLOW_DEFAULT_DECOSPECS=...)
86
+ # and merge them with the one provided as --with.
87
+ splits = DEFAULT_DECOSPECS.split()
88
+ return tuple(list(value) + splits)
89
+
90
+
73
91
  def common_run_options(func):
74
92
  @click.option(
75
93
  "--tag",
@@ -109,6 +127,7 @@ def common_run_options(func):
109
127
  help="Add a decorator to all steps. You can specify this "
110
128
  "option multiple times to attach multiple decorators "
111
129
  "in steps.",
130
+ callback=config_merge_cb,
112
131
  )
113
132
  @click.option(
114
133
  "--run-id-file",
@@ -166,6 +185,7 @@ def common_run_options(func):
166
185
  )
167
186
  @click.argument("step-to-rerun", required=False)
168
187
  @click.command(help="Resume execution of a previous run of this flow.")
188
+ @tracing.cli("cli/resume")
169
189
  @common_run_options
170
190
  @click.pass_obj
171
191
  def resume(
@@ -283,7 +303,7 @@ def resume(
283
303
 
284
304
  @parameters.add_custom_parameters(deploy_mode=True)
285
305
  @click.command(help="Run the workflow locally.")
286
- @tracing.cli_entrypoint("cli/run")
306
+ @tracing.cli("cli/run")
287
307
  @common_run_options
288
308
  @click.option(
289
309
  "--namespace",
@@ -345,18 +365,18 @@ def run(
345
365
  "msg": "Starting run",
346
366
  },
347
367
  )
368
+
369
+ runtime.print_workflow_info()
370
+ runtime.persist_constants()
371
+ if runner_attribute_file:
372
+ with open(runner_attribute_file, "w", encoding="utf-8") as f:
373
+ json.dump(
374
+ {
375
+ "run_id": runtime.run_id,
376
+ "flow_name": obj.flow.name,
377
+ "metadata": obj.metadata.metadata_str(),
378
+ },
379
+ f,
380
+ )
348
381
  with runtime.run_heartbeat():
349
- runtime.print_workflow_info()
350
- runtime.persist_constants()
351
-
352
- if runner_attribute_file:
353
- with open(runner_attribute_file, "w", encoding="utf-8") as f:
354
- json.dump(
355
- {
356
- "run_id": runtime.run_id,
357
- "flow_name": obj.flow.name,
358
- "metadata": obj.metadata.metadata_str(),
359
- },
360
- f,
361
- )
362
382
  runtime.execute()
@@ -7,9 +7,11 @@ from ..exception import CommandException
7
7
  from ..task import MetaflowTask
8
8
  from ..unbounded_foreach import UBF_CONTROL, UBF_TASK
9
9
  from ..util import decompress_list
10
+ import metaflow.tracing as tracing
10
11
 
11
12
 
12
13
  @click.command(help="Internal command to execute a single task.", hidden=True)
14
+ @tracing.cli("cli/step")
13
15
  @click.argument("step-name")
14
16
  @click.option(
15
17
  "--run-id",
@@ -5,6 +5,7 @@ import os
5
5
  import tarfile
6
6
  from collections import namedtuple
7
7
  from datetime import datetime
8
+ from tempfile import TemporaryDirectory
8
9
  from io import BytesIO
9
10
  from itertools import chain
10
11
  from typing import (
@@ -379,7 +380,7 @@ class MetaflowObject(object):
379
380
  _CLASSES[self._CHILD_CLASS]._NAME,
380
381
  query_filter,
381
382
  self._attempt,
382
- *self.path_components
383
+ *self.path_components,
383
384
  )
384
385
  unfiltered_children = unfiltered_children if unfiltered_children else []
385
386
  children = filter(
@@ -878,6 +879,73 @@ class MetaflowCode(object):
878
879
  """
879
880
  return self._tar
880
881
 
882
+ def extract(self) -> TemporaryDirectory:
883
+ """
884
+ Extracts the code package to a temporary directory.
885
+
886
+ This creates a temporary directory containing all user code
887
+ files from the code package. The temporary directory is
888
+ automatically deleted when the returned TemporaryDirectory
889
+ object is garbage collected or when its cleanup() is called.
890
+
891
+ To preserve the contents to a permanent location, use
892
+ os.replace() which performs a zero-copy move on the same
893
+ filesystem:
894
+
895
+ ```python
896
+ with task.code.extract() as tmp_dir:
897
+ # Move contents to permanent location
898
+ for item in os.listdir(tmp_dir):
899
+ src = os.path.join(tmp_dir, item)
900
+ dst = os.path.join('/path/to/permanent/dir', item)
901
+ os.makedirs(os.path.dirname(dst), exist_ok=True)
902
+ os.replace(src, dst) # Atomic move operation
903
+ ```
904
+ Returns
905
+ -------
906
+ TemporaryDirectory
907
+ A temporary directory containing the extracted code files.
908
+ The directory and its contents are automatically deleted when
909
+ this object is garbage collected.
910
+ """
911
+ exclusions = [
912
+ "metaflow/",
913
+ "metaflow_extensions/",
914
+ "INFO",
915
+ "CONFIG_PARAMETERS",
916
+ "conda.manifest",
917
+ # This file is created when using the conda/pypi features available in
918
+ # nflx-metaflow-extensions: https://github.com/Netflix/metaflow-nflx-extensions
919
+ "condav2-1.cnd",
920
+ ]
921
+ members = [
922
+ m
923
+ for m in self.tarball.getmembers()
924
+ if not any(
925
+ (x.endswith("/") and m.name.startswith(x)) or (m.name == x)
926
+ for x in exclusions
927
+ )
928
+ ]
929
+
930
+ tmp = TemporaryDirectory()
931
+ self.tarball.extractall(tmp.name, members)
932
+ return tmp
933
+
934
+ @property
935
+ def script_name(self) -> str:
936
+ """
937
+ Returns the filename of the Python script containing the FlowSpec.
938
+
939
+ This is the main Python file that was used to execute the flow. For example,
940
+ if your flow is defined in 'myflow.py', this property will return 'myflow.py'.
941
+
942
+ Returns
943
+ -------
944
+ str
945
+ Name of the Python file containing the FlowSpec
946
+ """
947
+ return self._info["script"]
948
+
881
949
  def __str__(self):
882
950
  return "<MetaflowCode: %s>" % self._info["script"]
883
951
 
@@ -1123,6 +1191,143 @@ class Task(MetaflowObject):
1123
1191
  # exclude private data artifacts
1124
1192
  return x.id[0] != "_"
1125
1193
 
1194
+ def _iter_matching_tasks(self, steps, metadata_key, metadata_pattern):
1195
+ """
1196
+ Yield tasks from specified steps matching a foreach path pattern.
1197
+
1198
+ Parameters
1199
+ ----------
1200
+ steps : List[str]
1201
+ List of step names to search for tasks
1202
+ pattern : str
1203
+ Regex pattern to match foreach-indices metadata
1204
+
1205
+ Returns
1206
+ -------
1207
+ Iterator[Task]
1208
+ Tasks matching the foreach path pattern
1209
+ """
1210
+ flow_id, run_id, _, _ = self.path_components
1211
+
1212
+ for step in steps:
1213
+ task_pathspecs = self._metaflow.metadata.filter_tasks_by_metadata(
1214
+ flow_id, run_id, step.id, metadata_key, metadata_pattern
1215
+ )
1216
+ for task_pathspec in task_pathspecs:
1217
+ yield Task(pathspec=task_pathspec, _namespace_check=False)
1218
+
1219
+ @property
1220
+ def parent_tasks(self) -> Iterator["Task"]:
1221
+ """
1222
+ Yields all parent tasks of the current task if one exists.
1223
+
1224
+ Yields
1225
+ ------
1226
+ Task
1227
+ Parent task of the current task
1228
+
1229
+ """
1230
+ flow_id, run_id, _, _ = self.path_components
1231
+
1232
+ steps = list(self.parent.parent_steps)
1233
+ if not steps:
1234
+ return []
1235
+
1236
+ current_path = self.metadata_dict.get("foreach-execution-path", "")
1237
+
1238
+ if len(steps) > 1:
1239
+ # Static join - use exact path matching
1240
+ pattern = current_path or ".*"
1241
+ yield from self._iter_matching_tasks(
1242
+ steps, "foreach-execution-path", pattern
1243
+ )
1244
+ return
1245
+
1246
+ # Handle single step case
1247
+ target_task = Step(
1248
+ f"{flow_id}/{run_id}/{steps[0].id}", _namespace_check=False
1249
+ ).task
1250
+ target_path = target_task.metadata_dict.get("foreach-execution-path")
1251
+
1252
+ if not target_path or not current_path:
1253
+ # (Current task, "A:10") and (Parent task, "")
1254
+ # Pattern: ".*"
1255
+ pattern = ".*"
1256
+ else:
1257
+ current_depth = len(current_path.split(","))
1258
+ target_depth = len(target_path.split(","))
1259
+
1260
+ if current_depth < target_depth:
1261
+ # Foreach join
1262
+ # (Current task, "A:10,B:13") and (Parent task, "A:10,B:13,C:21")
1263
+ # Pattern: "A:10,B:13,.*"
1264
+ pattern = f"{current_path},.*"
1265
+ else:
1266
+ # Foreach split or linear step
1267
+ # Option 1:
1268
+ # (Current task, "A:10,B:13,C:21") and (Parent task, "A:10,B:13")
1269
+ # Option 2:
1270
+ # (Current task, "A:10,B:13") and (Parent task, "A:10,B:13")
1271
+ # Pattern: "A:10,B:13"
1272
+ pattern = ",".join(current_path.split(",")[:target_depth])
1273
+
1274
+ yield from self._iter_matching_tasks(steps, "foreach-execution-path", pattern)
1275
+
1276
+ @property
1277
+ def child_tasks(self) -> Iterator["Task"]:
1278
+ """
1279
+ Yield all child tasks of the current task if one exists.
1280
+
1281
+ Yields
1282
+ ------
1283
+ Task
1284
+ Child task of the current task
1285
+ """
1286
+ flow_id, run_id, _, _ = self.path_components
1287
+ steps = list(self.parent.child_steps)
1288
+ if not steps:
1289
+ return []
1290
+
1291
+ current_path = self.metadata_dict.get("foreach-execution-path", "")
1292
+
1293
+ if len(steps) > 1:
1294
+ # Static split - use exact path matching
1295
+ pattern = current_path or ".*"
1296
+ yield from self._iter_matching_tasks(
1297
+ steps, "foreach-execution-path", pattern
1298
+ )
1299
+ return
1300
+
1301
+ # Handle single step case
1302
+ target_task = Step(
1303
+ f"{flow_id}/{run_id}/{steps[0].id}", _namespace_check=False
1304
+ ).task
1305
+ target_path = target_task.metadata_dict.get("foreach-execution-path")
1306
+
1307
+ if not target_path or not current_path:
1308
+ # (Current task, "A:10") and (Child task, "")
1309
+ # Pattern: ".*"
1310
+ pattern = ".*"
1311
+ else:
1312
+ current_depth = len(current_path.split(","))
1313
+ target_depth = len(target_path.split(","))
1314
+
1315
+ if current_depth < target_depth:
1316
+ # Foreach split
1317
+ # (Current task, "A:10,B:13") and (Child task, "A:10,B:13,C:21")
1318
+ # Pattern: "A:10,B:13,.*"
1319
+ pattern = f"{current_path},.*"
1320
+ else:
1321
+ # Foreach join or linear step
1322
+ # Option 1:
1323
+ # (Current task, "A:10,B:13,C:21") and (Child task, "A:10,B:13")
1324
+ # Option 2:
1325
+ # (Current task, "A:10,B:13") and (Child task, "A:10,B:13")
1326
+ # Pattern: "A:10,B:13"
1327
+ pattern = ",".join(current_path.split(",")[:target_depth])
1328
+
1329
+ yield from self._iter_matching_tasks(steps, "foreach-execution-path", pattern)
1330
+
1126
1331
  @property
1127
1332
  def metadata(self) -> List[Metadata]:
1128
1333
  """
@@ -1837,6 +2042,41 @@ class Step(MetaflowObject):
1837
2042
  for t in self:
1838
2043
  return t.environment_info
1839
2044
 
2045
+ @property
2046
+ def parent_steps(self) -> Iterator["Step"]:
2047
+ """
2048
+ Yields parent steps for the current step.
2049
+
2050
+ Yields
2051
+ ------
2052
+ Step
2053
+ Parent step
2054
+ """
2055
+ graph_info = self.task["_graph_info"].data
2056
+
2057
+ if self.id != "start":
2058
+ flow, run, _ = self.path_components
2059
+ for node_name, attributes in graph_info["steps"].items():
2060
+ if self.id in attributes["next"]:
2061
+ yield Step(f"{flow}/{run}/{node_name}", _namespace_check=False)
2062
+
2063
+ @property
2064
+ def child_steps(self) -> Iterator["Step"]:
2065
+ """
2066
+ Yields child steps for the current step.
2067
+
2068
+ Yields
2069
+ ------
2070
+ Step
2071
+ Child step
2072
+ """
2073
+ graph_info = self.task["_graph_info"].data
2074
+
2075
+ if self.id != "end":
2076
+ flow, run, _ = self.path_components
2077
+ for next_step in graph_info["steps"][self.id]["next"]:
2078
+ yield Step(f"{flow}/{run}/{next_step}", _namespace_check=False)
2079
+
1840
2080
 
1841
2081
  class Run(MetaflowObject):
1842
2082
  """
@@ -12,7 +12,7 @@ import metaflow.tracing as tracing
12
12
 
13
13
 
14
14
  @click.group()
15
- @tracing.cli_entrypoint("cli/main")
15
+ @tracing.cli("cli/main")
16
16
  def main():
17
17
  pass
18
18
 
@@ -52,6 +52,7 @@ class MetadataHeartBeat(object):
52
52
  time.sleep(frequency_secs)
53
53
  retry_counter = 0
54
54
  except HeartBeatException as e:
55
+ print(e)
55
56
  retry_counter = retry_counter + 1
56
57
  time.sleep(1.5**retry_counter)
57
58
 
@@ -5,6 +5,7 @@ import time
5
5
  from collections import namedtuple
6
6
  from itertools import chain
7
7
 
8
+ from typing import List
8
9
  from metaflow.exception import MetaflowInternalError, MetaflowTaggingError
9
10
  from metaflow.tagging_util import validate_tag
10
11
  from metaflow.util import get_username, resolve_identity_as_tuple, is_stringish
@@ -672,6 +673,38 @@ class MetadataProvider(object):
672
673
  if metadata:
673
674
  self.register_metadata(run_id, step_name, task_id, metadata)
674
675
 
676
+ @classmethod
677
+ def filter_tasks_by_metadata(
678
+ cls,
679
+ flow_name: str,
680
+ run_id: str,
681
+ step_name: str,
682
+ field_name: str,
683
+ pattern: str,
684
+ ) -> List[str]:
685
+ """
686
+ Filter tasks by metadata field and pattern, returning task pathspecs that match criteria.
687
+
688
+ Parameters
689
+ ----------
690
+ flow_name : str
691
+ Flow name, that the run belongs to.
692
+ run_id: str
693
+ Run id, together with flow_id, that identifies the specific Run whose tasks to query
694
+ step_name: str
695
+ Step name to query tasks from
696
+ field_name: str
697
+ Metadata field name to query
698
+ pattern: str
699
+ Pattern to match in metadata field value
700
+
701
+ Returns
702
+ -------
703
+ List[str]
704
+ List of task pathspecs that satisfy the query
705
+ """
706
+ raise NotImplementedError()
707
+
675
708
  @staticmethod
676
709
  def _apply_filter(elts, filters):
677
710
  if filters is None:
@@ -248,8 +248,7 @@ DEFAULT_CONTAINER_IMAGE = from_conf("DEFAULT_CONTAINER_IMAGE")
248
248
  # Default container registry
249
249
  DEFAULT_CONTAINER_REGISTRY = from_conf("DEFAULT_CONTAINER_REGISTRY")
250
250
  # Controls whether to include foreach stack information in metadata.
251
- # TODO(Darin, 05/01/24): Remove this flag once we are confident with this feature.
252
- INCLUDE_FOREACH_STACK = from_conf("INCLUDE_FOREACH_STACK", False)
251
+ INCLUDE_FOREACH_STACK = from_conf("INCLUDE_FOREACH_STACK", True)
253
252
  # Maximum length of the foreach value string to be stored in each ForeachFrame.
254
253
  MAXIMUM_FOREACH_VALUE_CHARS = from_conf("MAXIMUM_FOREACH_VALUE_CHARS", 30)
255
254
  # The default runtime limit (In seconds) of jobs launched by any compute provider. Default of 5 days.
@@ -286,7 +285,7 @@ CONTACT_INFO = from_conf(
286
285
  ###
287
286
  # Format is a space separated string of decospecs (what is passed
288
287
  # using --with)
289
- DECOSPECS = from_conf("DECOSPECS", "")
288
+ DEFAULT_DECOSPECS = from_conf("DEFAULT_DECOSPECS", "")
290
289
 
291
290
  ###
292
291
  # AWS Batch configuration
@@ -584,9 +583,9 @@ try:
584
583
  _TOGGLE_DECOSPECS.extend(o)
585
584
  elif not n.startswith("__") and not isinstance(o, types.ModuleType):
586
585
  globals()[n] = o
587
- # If DECOSPECS is set, use that, else extrapolate from extensions
588
- if not DECOSPECS:
589
- DECOSPECS = " ".join(_TOGGLE_DECOSPECS)
586
+ # If DEFAULT_DECOSPECS is set, use that, else extrapolate from extensions
587
+ if not DEFAULT_DECOSPECS:
588
+ DEFAULT_DECOSPECS = " ".join(_TOGGLE_DECOSPECS)
590
589
 
591
590
  finally:
592
591
  # Erase all temporary names to avoid leaking things
@@ -8,12 +8,12 @@ from metaflow.plugins import DATASTORES
8
8
  from metaflow.util import Path
9
9
  from . import TASK_LOG_SOURCE
10
10
 
11
- from metaflow.tracing import cli_entrypoint
11
+ from metaflow.tracing import cli
12
12
 
13
13
  SMALL_FILE_LIMIT = 1024 * 1024
14
14
 
15
15
 
16
- @cli_entrypoint("save_logs")
16
+ @cli("save_logs")
17
17
  def save_logs():
18
18
  def _read_file(path):
19
19
  with open(path, "rb") as f:
@@ -78,13 +78,9 @@ class ArgoWorkflowsSchedulingException(MetaflowException):
78
78
  # List of future enhancements -
79
79
  # 1. Configure Argo metrics.
80
80
  # 2. Support resuming failed workflows within Argo Workflows.
81
- # 3. Support gang-scheduled clusters for distributed PyTorch/TF - One option is to
82
- # use volcano - https://github.com/volcano-sh/volcano/tree/master/example/integrations/argo
83
- # 4. Support GitOps workflows.
84
- # 5. Add Metaflow tags to labels/annotations.
85
- # 6. Support Multi-cluster scheduling - https://github.com/argoproj/argo-workflows/issues/3523#issuecomment-792307297
86
- # 7. Support R lang.
87
- # 8. Ping @savin at slack.outerbounds.co for any feature request
81
+ # 3. Add Metaflow tags to labels/annotations.
82
+ # 4. Support R lang.
83
+ # 5. Ping @savin at slack.outerbounds.co for any feature request
88
84
 
89
85
 
90
86
  class ArgoWorkflows(object):
@@ -743,6 +739,7 @@ class ArgoWorkflows(object):
743
739
  {
744
740
  "slack": bool(self.notify_slack_webhook_url),
745
741
  "pager_duty": bool(self.notify_pager_duty_integration_key),
742
+ "incident_io": bool(self.notify_incident_io_api_key),
746
743
  }
747
744
  )
748
745
  }
@@ -754,6 +751,7 @@ class ArgoWorkflows(object):
754
751
  {
755
752
  "slack": bool(self.notify_slack_webhook_url),
756
753
  "pager_duty": bool(self.notify_pager_duty_integration_key),
754
+ "incident_io": bool(self.notify_incident_io_api_key),
757
755
  }
758
756
  )
759
757
  }
@@ -1966,11 +1964,6 @@ class ArgoWorkflows(object):
1966
1964
  resources["disk"],
1967
1965
  )
1968
1966
 
1969
- extended_resources = resources.get("extended_resources", {})
1970
-
1971
- qos_requests = {**qos_requests, **extended_resources}
1972
- qos_limits = {**qos_limits, **extended_resources}
1973
-
1974
1967
  # Create a ContainerTemplate for this node. Ideally, we would have
1975
1968
  # liked to inline this ContainerTemplate and avoid scanning the workflow
1976
1969
  # twice, but due to issues with variable substitution, we will have to
@@ -2027,7 +2020,6 @@ class ArgoWorkflows(object):
2027
2020
  shared_memory=shared_memory,
2028
2021
  port=port,
2029
2022
  qos=resources["qos"],
2030
- extended_resources=extended_resources,
2031
2023
  )
2032
2024
 
2033
2025
  for k, v in env.items():
@@ -2043,6 +2035,8 @@ class ArgoWorkflows(object):
2043
2035
  kubernetes_labels = {
2044
2036
  "task_id_entropy": "{{inputs.parameters.task-id-entropy}}",
2045
2037
  "num_parallel": "{{inputs.parameters.num-parallel}}",
2038
+ "metaflow/argo-workflows-name": "{{workflow.name}}",
2039
+ "workflows.argoproj.io/workflow": "{{workflow.name}}",
2046
2040
  }
2047
2041
  jobset.labels(
2048
2042
  {
@@ -2334,6 +2328,10 @@ class ArgoWorkflows(object):
2334
2328
  templates.append(self._slack_success_template())
2335
2329
  templates.append(self._pager_duty_change_template())
2336
2330
  templates.append(self._incident_io_change_template())
2331
+
2332
+ # Clean up None values from templates.
2333
+ templates = list(filter(None, templates))
2334
+
2337
2335
  if self.notify_on_error or self.notify_on_success:
2338
2336
  # Warning: terrible hack to workaround a bug in Argo Workflow where the
2339
2337
  # templates listed above do not execute unless there is an
@@ -3682,7 +3680,7 @@ class Template(object):
3682
3680
  def resource(self, action, manifest, success_criteria, failure_criteria):
3683
3681
  self.payload["resource"] = {}
3684
3682
  self.payload["resource"]["action"] = action
3685
- self.payload["setOwnerReference"] = True
3683
+ self.payload["resource"]["setOwnerReference"] = True
3686
3684
  self.payload["resource"]["successCondition"] = success_criteria
3687
3685
  self.payload["resource"]["failureCondition"] = failure_criteria
3688
3686
  self.payload["resource"]["manifest"] = manifest
@@ -168,12 +168,12 @@ def argo_workflows(obj, name=None):
168
168
  )
169
169
  @click.option(
170
170
  "--notify-slack-webhook-url",
171
- default="",
171
+ default=None,
172
172
  help="Slack incoming webhook url for workflow success/failure notifications.",
173
173
  )
174
174
  @click.option(
175
175
  "--notify-pager-duty-integration-key",
176
- default="",
176
+ default=None,
177
177
  help="PagerDuty Events API V2 Integration key for workflow success/failure notifications.",
178
178
  )
179
179
  @click.option(