ob-metaflow 2.15.3.1__tar.gz → 2.15.5.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 (385) hide show
  1. ob_metaflow-2.15.5.1/PKG-INFO +87 -0
  2. ob_metaflow-2.15.5.1/README.md +63 -0
  3. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/devtools/Makefile +14 -4
  4. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/devtools/Tiltfile +4 -4
  5. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/argo/argo_client.py +9 -2
  6. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/argo/argo_workflows.py +79 -28
  7. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/argo/argo_workflows_cli.py +16 -25
  8. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/argo/argo_workflows_deployer_objects.py +5 -2
  9. ob_metaflow-2.15.5.1/metaflow/plugins/cards/card_modules/main.js +254 -0
  10. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/metadata_providers/service.py +16 -7
  11. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/runner/click_api.py +5 -1
  12. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/runner/deployer.py +3 -2
  13. ob_metaflow-2.15.5.1/metaflow/version.py +1 -0
  14. ob_metaflow-2.15.5.1/ob_metaflow.egg-info/PKG-INFO +87 -0
  15. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/ob_metaflow.egg-info/requires.txt +1 -1
  16. ob_metaflow-2.15.3.1/PKG-INFO +0 -94
  17. ob_metaflow-2.15.3.1/README.md +0 -70
  18. ob_metaflow-2.15.3.1/metaflow/plugins/cards/card_modules/main.js +0 -252
  19. ob_metaflow-2.15.3.1/metaflow/version.py +0 -1
  20. ob_metaflow-2.15.3.1/ob_metaflow.egg-info/PKG-INFO +0 -94
  21. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/LICENSE +0 -0
  22. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/MANIFEST.in +0 -0
  23. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/devtools/pick_services.sh +0 -0
  24. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/R.py +0 -0
  25. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/__init__.py +0 -0
  26. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/__init__.py +0 -0
  27. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/click/__init__.py +0 -0
  28. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  29. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/click/_compat.py +0 -0
  30. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/click/_termui_impl.py +0 -0
  31. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/click/_textwrap.py +0 -0
  32. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/click/_unicodefun.py +0 -0
  33. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/click/_winconsole.py +0 -0
  34. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/click/core.py +0 -0
  35. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/click/decorators.py +0 -0
  36. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/click/exceptions.py +0 -0
  37. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/click/formatting.py +0 -0
  38. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/click/globals.py +0 -0
  39. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/click/parser.py +0 -0
  40. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/click/termui.py +0 -0
  41. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/click/testing.py +0 -0
  42. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/click/types.py +0 -0
  43. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/click/utils.py +0 -0
  44. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
  45. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
  46. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
  47. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
  48. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
  49. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
  50. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
  51. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
  52. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
  53. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/packaging/__init__.py +0 -0
  54. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/packaging/_elffile.py +0 -0
  55. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  56. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  57. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/packaging/_parser.py +0 -0
  58. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/packaging/_structures.py +0 -0
  59. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  60. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/packaging/markers.py +0 -0
  61. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/packaging/py.typed +0 -0
  62. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/packaging/requirements.py +0 -0
  63. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/packaging/specifiers.py +0 -0
  64. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/packaging/tags.py +0 -0
  65. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/packaging/utils.py +0 -0
  66. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/packaging/version.py +0 -0
  67. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/typeguard/__init__.py +0 -0
  68. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/typeguard/_checkers.py +0 -0
  69. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/typeguard/_config.py +0 -0
  70. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/typeguard/_decorators.py +0 -0
  71. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
  72. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/typeguard/_functions.py +0 -0
  73. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/typeguard/_importhook.py +0 -0
  74. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/typeguard/_memo.py +0 -0
  75. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
  76. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/typeguard/_suppression.py +0 -0
  77. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/typeguard/_transformer.py +0 -0
  78. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
  79. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/typeguard/_utils.py +0 -0
  80. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/typeguard/py.typed +0 -0
  81. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/typing_extensions.py +0 -0
  82. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/v3_5/__init__.py +0 -0
  83. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
  84. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
  85. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/v3_5/zipp.py +0 -0
  86. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/v3_6/__init__.py +0 -0
  87. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  88. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  89. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  90. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  91. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  92. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  93. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  94. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  95. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  96. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  97. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/v3_6/zipp.py +0 -0
  98. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/_vendor/zipp.py +0 -0
  99. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cards.py +0 -0
  100. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cli.py +0 -0
  101. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cli_args.py +0 -0
  102. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cli_components/__init__.py +0 -0
  103. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cli_components/dump_cmd.py +0 -0
  104. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cli_components/init_cmd.py +0 -0
  105. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cli_components/run_cmds.py +0 -0
  106. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cli_components/step_cmd.py +0 -0
  107. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cli_components/utils.py +0 -0
  108. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/client/__init__.py +0 -0
  109. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/client/core.py +0 -0
  110. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/client/filecache.py +0 -0
  111. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/clone_util.py +0 -0
  112. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cmd/__init__.py +0 -0
  113. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cmd/code/__init__.py +0 -0
  114. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cmd/configure_cmd.py +0 -0
  115. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cmd/develop/__init__.py +0 -0
  116. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cmd/develop/stub_generator.py +0 -0
  117. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cmd/develop/stubs.py +0 -0
  118. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cmd/main_cli.py +0 -0
  119. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cmd/make_wrapper.py +0 -0
  120. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cmd/tutorials_cmd.py +0 -0
  121. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cmd/util.py +0 -0
  122. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/cmd_with_io.py +0 -0
  123. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/datastore/__init__.py +0 -0
  124. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/datastore/content_addressed_store.py +0 -0
  125. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/datastore/datastore_set.py +0 -0
  126. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/datastore/datastore_storage.py +0 -0
  127. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/datastore/exceptions.py +0 -0
  128. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/datastore/flow_datastore.py +0 -0
  129. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/datastore/inputs.py +0 -0
  130. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/datastore/task_datastore.py +0 -0
  131. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/debug.py +0 -0
  132. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/decorators.py +0 -0
  133. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/event_logger.py +0 -0
  134. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/events.py +0 -0
  135. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/exception.py +0 -0
  136. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/extension_support/__init__.py +0 -0
  137. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/extension_support/_empty_file.py +0 -0
  138. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/extension_support/cmd.py +0 -0
  139. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/extension_support/integrations.py +0 -0
  140. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/extension_support/plugins.py +0 -0
  141. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/flowspec.py +0 -0
  142. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/graph.py +0 -0
  143. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/includefile.py +0 -0
  144. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/info_file.py +0 -0
  145. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/integrations.py +0 -0
  146. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/lint.py +0 -0
  147. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/metadata_provider/__init__.py +0 -0
  148. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/metadata_provider/heartbeat.py +0 -0
  149. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/metadata_provider/metadata.py +0 -0
  150. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/metadata_provider/util.py +0 -0
  151. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/metaflow_config.py +0 -0
  152. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/metaflow_config_funcs.py +0 -0
  153. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/metaflow_current.py +0 -0
  154. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/metaflow_environment.py +0 -0
  155. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/metaflow_profile.py +0 -0
  156. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/metaflow_version.py +0 -0
  157. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/mflog/__init__.py +0 -0
  158. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/mflog/mflog.py +0 -0
  159. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/mflog/save_logs.py +0 -0
  160. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/mflog/save_logs_periodically.py +0 -0
  161. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/mflog/tee.py +0 -0
  162. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/monitor.py +0 -0
  163. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/multicore_utils.py +0 -0
  164. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/package.py +0 -0
  165. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/parameters.py +0 -0
  166. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/__init__.py +0 -0
  167. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/airflow/__init__.py +0 -0
  168. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/airflow/airflow.py +0 -0
  169. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  170. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  171. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  172. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/airflow/dag.py +0 -0
  173. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/airflow/exception.py +0 -0
  174. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  175. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  176. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  177. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
  178. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
  179. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
  180. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/argo/__init__.py +0 -0
  181. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/argo/argo_events.py +0 -0
  182. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  183. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
  184. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/argo/capture_error.py +0 -0
  185. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/argo/generate_input_paths.py +0 -0
  186. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
  187. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/__init__.py +0 -0
  188. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/aws_client.py +0 -0
  189. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/aws_utils.py +0 -0
  190. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/batch/__init__.py +0 -0
  191. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/batch/batch.py +0 -0
  192. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  193. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  194. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
  195. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  196. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  197. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  198. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  199. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  200. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  201. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  202. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  203. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
  204. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
  205. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  206. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  207. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
  208. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +0 -0
  209. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/azure/__init__.py +0 -0
  210. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/azure/azure_credential.py +0 -0
  211. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  212. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
  213. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/azure/azure_tail.py +0 -0
  214. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/azure/azure_utils.py +0 -0
  215. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  216. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/azure/includefile_support.py +0 -0
  217. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/__init__.py +0 -0
  218. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_cli.py +0 -0
  219. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_client.py +0 -0
  220. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_creator.py +0 -0
  221. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_datastore.py +0 -0
  222. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_decorator.py +0 -0
  223. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  224. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_modules/base.html +0 -0
  225. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_modules/basic.py +0 -0
  226. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
  227. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_modules/card.py +0 -0
  228. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  229. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  230. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  231. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  232. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  233. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_modules/components.py +0 -0
  234. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  235. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  236. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  237. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_resolver.py +0 -0
  238. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_server.py +0 -0
  239. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
  240. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/component_serializer.py +0 -0
  241. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/cards/exception.py +0 -0
  242. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/catch_decorator.py +0 -0
  243. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/datastores/__init__.py +0 -0
  244. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/datastores/azure_storage.py +0 -0
  245. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/datastores/gs_storage.py +0 -0
  246. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/datastores/local_storage.py +0 -0
  247. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/datastores/s3_storage.py +0 -0
  248. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/datatools/__init__.py +0 -0
  249. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/datatools/local.py +0 -0
  250. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  251. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/datatools/s3/s3.py +0 -0
  252. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/datatools/s3/s3op.py +0 -0
  253. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  254. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  255. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/debug_logger.py +0 -0
  256. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/debug_monitor.py +0 -0
  257. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/__init__.py +0 -0
  258. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/client.py +0 -0
  259. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/client_modules.py +0 -0
  260. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  261. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  262. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  263. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  264. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  265. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  266. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  267. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  268. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  269. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  270. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/consts.py +0 -0
  271. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  272. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  273. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  274. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/server.py +0 -0
  275. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/stub.py +0 -0
  276. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/env_escape/utils.py +0 -0
  277. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/environment_decorator.py +0 -0
  278. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/events_decorator.py +0 -0
  279. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/frameworks/__init__.py +0 -0
  280. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/frameworks/pytorch.py +0 -0
  281. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/gcp/__init__.py +0 -0
  282. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
  283. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  284. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  285. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/gcp/gs_tail.py +0 -0
  286. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/gcp/gs_utils.py +0 -0
  287. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/gcp/includefile_support.py +0 -0
  288. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/kubernetes/__init__.py +0 -0
  289. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
  290. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/kubernetes/kubernetes.py +0 -0
  291. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/kubernetes/kubernetes_cli.py +0 -0
  292. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
  293. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/kubernetes/kubernetes_decorator.py +0 -0
  294. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/kubernetes/kubernetes_job.py +0 -0
  295. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +0 -0
  296. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/kubernetes/spot_metadata_cli.py +0 -0
  297. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/kubernetes/spot_monitor_sidecar.py +0 -0
  298. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/logs_cli.py +0 -0
  299. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/metadata_providers/__init__.py +0 -0
  300. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/metadata_providers/local.py +0 -0
  301. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/package_cli.py +0 -0
  302. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/parallel_decorator.py +0 -0
  303. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/project_decorator.py +0 -0
  304. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/pypi/__init__.py +0 -0
  305. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/pypi/bootstrap.py +0 -0
  306. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/pypi/conda_decorator.py +0 -0
  307. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/pypi/conda_environment.py +0 -0
  308. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/pypi/micromamba.py +0 -0
  309. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/pypi/parsers.py +0 -0
  310. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/pypi/pip.py +0 -0
  311. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
  312. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  313. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/pypi/utils.py +0 -0
  314. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/resources_decorator.py +0 -0
  315. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/retry_decorator.py +0 -0
  316. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/secrets/__init__.py +0 -0
  317. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  318. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  319. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/storage_executor.py +0 -0
  320. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/tag_cli.py +0 -0
  321. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  322. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/plugins/timeout_decorator.py +0 -0
  323. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/procpoll.py +0 -0
  324. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/py.typed +0 -0
  325. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/pylint_wrapper.py +0 -0
  326. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/runner/__init__.py +0 -0
  327. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/runner/deployer_impl.py +0 -0
  328. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/runner/metaflow_runner.py +0 -0
  329. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/runner/nbdeploy.py +0 -0
  330. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/runner/nbrun.py +0 -0
  331. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/runner/subprocess_manager.py +0 -0
  332. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/runner/utils.py +0 -0
  333. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/runtime.py +0 -0
  334. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/sidecar/__init__.py +0 -0
  335. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/sidecar/sidecar.py +0 -0
  336. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/sidecar/sidecar_messages.py +0 -0
  337. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  338. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/sidecar/sidecar_worker.py +0 -0
  339. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/system/__init__.py +0 -0
  340. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/system/system_logger.py +0 -0
  341. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/system/system_monitor.py +0 -0
  342. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/system/system_utils.py +0 -0
  343. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tagging_util.py +0 -0
  344. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/task.py +0 -0
  345. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tracing/__init__.py +0 -0
  346. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tracing/propagator.py +0 -0
  347. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tracing/span_exporter.py +0 -0
  348. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tracing/tracing_modules.py +0 -0
  349. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tuple_util.py +0 -0
  350. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/00-helloworld/README.md +0 -0
  351. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  352. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/01-playlist/README.md +0 -0
  353. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  354. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  355. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  356. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/02-statistics/README.md +0 -0
  357. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  358. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  359. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/02-statistics/stats.py +0 -0
  360. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  361. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  362. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  363. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  364. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  365. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  366. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  367. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  368. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  369. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/07-worldview/README.md +0 -0
  370. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  371. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/08-autopilot/README.md +0 -0
  372. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  373. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/unbounded_foreach.py +0 -0
  374. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/user_configs/__init__.py +0 -0
  375. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/user_configs/config_decorators.py +0 -0
  376. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/user_configs/config_options.py +0 -0
  377. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/user_configs/config_parameters.py +0 -0
  378. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/util.py +0 -0
  379. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/metaflow/vendor.py +0 -0
  380. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/ob_metaflow.egg-info/SOURCES.txt +0 -0
  381. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/ob_metaflow.egg-info/dependency_links.txt +0 -0
  382. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/ob_metaflow.egg-info/entry_points.txt +0 -0
  383. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/ob_metaflow.egg-info/top_level.txt +0 -0
  384. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/setup.cfg +0 -0
  385. {ob_metaflow-2.15.3.1 → ob_metaflow-2.15.5.1}/setup.py +0 -0
@@ -0,0 +1,87 @@
1
+ Metadata-Version: 2.2
2
+ Name: ob-metaflow
3
+ Version: 2.15.5.1
4
+ Summary: Metaflow: More AI and ML, Less Engineering
5
+ Author: Netflix, Outerbounds & the Metaflow Community
6
+ Author-email: help@outerbounds.co
7
+ License: Apache License 2.0
8
+ Description-Content-Type: text/markdown
9
+ License-File: LICENSE
10
+ Requires-Dist: requests
11
+ Requires-Dist: boto3
12
+ Requires-Dist: pylint
13
+ Requires-Dist: kubernetes
14
+ Provides-Extra: stubs
15
+ Requires-Dist: metaflow-stubs==2.15.5.1; extra == "stubs"
16
+ Dynamic: author
17
+ Dynamic: author-email
18
+ Dynamic: description
19
+ Dynamic: description-content-type
20
+ Dynamic: license
21
+ Dynamic: provides-extra
22
+ Dynamic: requires-dist
23
+ Dynamic: summary
24
+
25
+ ![Metaflow_Logo_Horizontal_FullColor_Ribbon_Dark_RGB](https://user-images.githubusercontent.com/763451/89453116-96a57e00-d713-11ea-9fa6-82b29d4d6eff.png)
26
+
27
+ # Metaflow
28
+
29
+ [Metaflow](https://metaflow.org) is a human-centric framework designed to help scientists and engineers **build and manage real-life AI and ML systems**. Serving teams of all sizes and scale, Metaflow streamlines the entire development lifecycle—from rapid prototyping in notebooks to reliable, maintainable production deployments—enabling teams to iterate quickly and deliver robust systems efficiently.
30
+
31
+ Originally developed at [Netflix](https://netflixtechblog.com/open-sourcing-metaflow-a-human-centric-framework-for-data-science-fa72e04a5d9) and now supported by [Outerbounds](https://outerbounds.com), Metaflow is designed to boost the productivity for research and engineering teams working on [a wide variety of projects](https://netflixtechblog.com/supporting-diverse-ml-systems-at-netflix-2d2e6b6d205d), from classical statistics to state-of-the-art deep learning and foundation models. By unifying code, data, and compute at every stage, Metaflow ensures seamless, end-to-end management of real-world AI and ML systems.
32
+
33
+ Today, Metaflow powers thousands of AI and ML experiences across a diverse array of companies, large and small, including Amazon, Doordash, Dyson, Goldman Sachs, Ramp, and [many others](ADOPTERS.md). At Netflix alone, Metaflow supports over 3000 AI and ML projects, executes hundreds of millions of data-intensive high-performance compute jobs processing petabytes of data and manages tens of petabytes of models and artifacts for hundreds of users across its AI, ML, data science, and engineering teams.
34
+
35
+ ## From prototype to production (and back)
36
+
37
+ Metaflow provides a simple and friendly pythonic [API](https://docs.metaflow.org) that covers foundational needs of AI and ML systems:
38
+ <img src="./docs/prototype-to-prod.png" width="800px">
39
+
40
+ 1. [Rapid local prototyping](https://docs.metaflow.org/metaflow/basics), [support for notebooks](https://docs.metaflow.org/metaflow/managing-flows/notebook-runs), and built-in support for [experiment tracking, versioning](https://docs.metaflow.org/metaflow/client) and [visualization](https://docs.metaflow.org/metaflow/visualizing-results).
41
+ 2. [Effortlessly scale horizontally and vertically in your cloud](https://docs.metaflow.org/scaling/remote-tasks/introduction), utilizing both CPUs and GPUs, with [fast data access](https://docs.metaflow.org/scaling/data) for running [massive embarrassingly parallel](https://docs.metaflow.org/metaflow/basics#foreach) as well as [gang-scheduled](https://docs.metaflow.org/scaling/remote-tasks/distributed-computing) compute workloads [reliably](https://docs.metaflow.org/scaling/failures) and [efficiently](https://docs.metaflow.org/scaling/checkpoint/introduction).
42
+ 3. [Easily manage dependencies](https://docs.metaflow.org/scaling/dependencies) and [deploy with one-click](https://docs.metaflow.org/production/introduction) to highly available production orchestrators with built in support for [reactive orchestration](https://docs.metaflow.org/production/event-triggering).
43
+
44
+ For full documentation, check out our [API Reference](https://docs.metaflow.org/api) or see our [Release Notes](https://github.com/Netflix/metaflow/releases) for the latest features and improvements.
45
+
46
+
47
+ ## Getting started
48
+
49
+ Getting up and running is easy. If you don't know where to start, [Metaflow sandbox](https://outerbounds.com/sandbox) will have you running and exploring in seconds.
50
+
51
+ ### Installing Metaflow
52
+
53
+ To install Metaflow in your Python environment from [PyPI](https://pypi.org/project/metaflow/):
54
+
55
+ ```sh
56
+ pip install metaflow
57
+ ```
58
+ Alternatively, using [conda-forge](https://anaconda.org/conda-forge/metaflow):
59
+
60
+ ```sh
61
+ conda install -c conda-forge metaflow
62
+ ```
63
+
64
+ Once installed, a great way to get started is by following our [tutorial](https://docs.metaflow.org/getting-started/tutorials). It walks you through creating and running your first Metaflow flow step by step.
65
+
66
+ For more details on Metaflow’s features and best practices, check out:
67
+ - [How Metaflow works](https://docs.metaflow.org/metaflow/basics)
68
+ - [Additional resources](https://docs.metaflow.org/introduction/metaflow-resources)
69
+
70
+ If you need help, don’t hesitate to reach out on our [Slack community](http://slack.outerbounds.co/)!
71
+
72
+
73
+ ### Deploying infrastructure for Metaflow in your cloud
74
+ <img src="./docs/multicloud.png" width="800px">
75
+
76
+
77
+ While you can get started with Metaflow easily on your laptop, the main benefits of Metaflow lie in its ability to [scale out to external compute clusters](https://docs.metaflow.org/scaling/remote-tasks/introduction)
78
+ and to [deploy to production-grade workflow orchestrators](https://docs.metaflow.org/production/introduction). To benefit from these features, follow this [guide](https://outerbounds.com/engineering/welcome/) to
79
+ configure Metaflow and the infrastructure behind it appropriately.
80
+
81
+
82
+ ## Get in touch
83
+ We'd love to hear from you. Join our community [Slack workspace](http://slack.outerbounds.co/)!
84
+
85
+ ## Contributing
86
+ We welcome contributions to Metaflow. Please see our [contribution guide](https://docs.metaflow.org/introduction/contributing-to-metaflow) for more details.
87
+
@@ -0,0 +1,63 @@
1
+ ![Metaflow_Logo_Horizontal_FullColor_Ribbon_Dark_RGB](https://user-images.githubusercontent.com/763451/89453116-96a57e00-d713-11ea-9fa6-82b29d4d6eff.png)
2
+
3
+ # Metaflow
4
+
5
+ [Metaflow](https://metaflow.org) is a human-centric framework designed to help scientists and engineers **build and manage real-life AI and ML systems**. Serving teams of all sizes and scale, Metaflow streamlines the entire development lifecycle—from rapid prototyping in notebooks to reliable, maintainable production deployments—enabling teams to iterate quickly and deliver robust systems efficiently.
6
+
7
+ Originally developed at [Netflix](https://netflixtechblog.com/open-sourcing-metaflow-a-human-centric-framework-for-data-science-fa72e04a5d9) and now supported by [Outerbounds](https://outerbounds.com), Metaflow is designed to boost the productivity for research and engineering teams working on [a wide variety of projects](https://netflixtechblog.com/supporting-diverse-ml-systems-at-netflix-2d2e6b6d205d), from classical statistics to state-of-the-art deep learning and foundation models. By unifying code, data, and compute at every stage, Metaflow ensures seamless, end-to-end management of real-world AI and ML systems.
8
+
9
+ Today, Metaflow powers thousands of AI and ML experiences across a diverse array of companies, large and small, including Amazon, Doordash, Dyson, Goldman Sachs, Ramp, and [many others](ADOPTERS.md). At Netflix alone, Metaflow supports over 3000 AI and ML projects, executes hundreds of millions of data-intensive high-performance compute jobs processing petabytes of data and manages tens of petabytes of models and artifacts for hundreds of users across its AI, ML, data science, and engineering teams.
10
+
11
+ ## From prototype to production (and back)
12
+
13
+ Metaflow provides a simple and friendly pythonic [API](https://docs.metaflow.org) that covers foundational needs of AI and ML systems:
14
+ <img src="./docs/prototype-to-prod.png" width="800px">
15
+
16
+ 1. [Rapid local prototyping](https://docs.metaflow.org/metaflow/basics), [support for notebooks](https://docs.metaflow.org/metaflow/managing-flows/notebook-runs), and built-in support for [experiment tracking, versioning](https://docs.metaflow.org/metaflow/client) and [visualization](https://docs.metaflow.org/metaflow/visualizing-results).
17
+ 2. [Effortlessly scale horizontally and vertically in your cloud](https://docs.metaflow.org/scaling/remote-tasks/introduction), utilizing both CPUs and GPUs, with [fast data access](https://docs.metaflow.org/scaling/data) for running [massive embarrassingly parallel](https://docs.metaflow.org/metaflow/basics#foreach) as well as [gang-scheduled](https://docs.metaflow.org/scaling/remote-tasks/distributed-computing) compute workloads [reliably](https://docs.metaflow.org/scaling/failures) and [efficiently](https://docs.metaflow.org/scaling/checkpoint/introduction).
18
+ 3. [Easily manage dependencies](https://docs.metaflow.org/scaling/dependencies) and [deploy with one-click](https://docs.metaflow.org/production/introduction) to highly available production orchestrators with built in support for [reactive orchestration](https://docs.metaflow.org/production/event-triggering).
19
+
20
+ For full documentation, check out our [API Reference](https://docs.metaflow.org/api) or see our [Release Notes](https://github.com/Netflix/metaflow/releases) for the latest features and improvements.
21
+
22
+
23
+ ## Getting started
24
+
25
+ Getting up and running is easy. If you don't know where to start, [Metaflow sandbox](https://outerbounds.com/sandbox) will have you running and exploring in seconds.
26
+
27
+ ### Installing Metaflow
28
+
29
+ To install Metaflow in your Python environment from [PyPI](https://pypi.org/project/metaflow/):
30
+
31
+ ```sh
32
+ pip install metaflow
33
+ ```
34
+ Alternatively, using [conda-forge](https://anaconda.org/conda-forge/metaflow):
35
+
36
+ ```sh
37
+ conda install -c conda-forge metaflow
38
+ ```
39
+
40
+ Once installed, a great way to get started is by following our [tutorial](https://docs.metaflow.org/getting-started/tutorials). It walks you through creating and running your first Metaflow flow step by step.
41
+
42
+ For more details on Metaflow’s features and best practices, check out:
43
+ - [How Metaflow works](https://docs.metaflow.org/metaflow/basics)
44
+ - [Additional resources](https://docs.metaflow.org/introduction/metaflow-resources)
45
+
46
+ If you need help, don’t hesitate to reach out on our [Slack community](http://slack.outerbounds.co/)!
47
+
48
+
49
+ ### Deploying infrastructure for Metaflow in your cloud
50
+ <img src="./docs/multicloud.png" width="800px">
51
+
52
+
53
+ While you can get started with Metaflow easily on your laptop, the main benefits of Metaflow lie in its ability to [scale out to external compute clusters](https://docs.metaflow.org/scaling/remote-tasks/introduction)
54
+ and to [deploy to production-grade workflow orchestrators](https://docs.metaflow.org/production/introduction). To benefit from these features, follow this [guide](https://outerbounds.com/engineering/welcome/) to
55
+ configure Metaflow and the infrastructure behind it appropriately.
56
+
57
+
58
+ ## Get in touch
59
+ We'd love to hear from you. Join our community [Slack workspace](http://slack.outerbounds.co/)!
60
+
61
+ ## Contributing
62
+ We welcome contributions to Metaflow. Please see our [contribution guide](https://docs.metaflow.org/introduction/contributing-to-metaflow) for more details.
63
+
@@ -22,6 +22,7 @@ DEVTOOLS_DIR := $(MKFILE_DIR).devtools
22
22
  PICK_SERVICES := $(MKFILE_DIR)pick_services.sh
23
23
  MINIKUBE_DIR := $(DEVTOOLS_DIR)/minikube
24
24
  MINIKUBE := $(MINIKUBE_DIR)/minikube
25
+ HELM_DIR := $(DEVTOOLS_DIR)/helm
25
26
  TILT_DIR := $(DEVTOOLS_DIR)/tilt
26
27
  TILT := $(TILT_DIR)/tilt
27
28
  TILTFILE := $(MKFILE_DIR)/Tiltfile
@@ -51,9 +52,18 @@ endif
51
52
 
52
53
  install-helm:
53
54
  @if ! command -v helm >/dev/null 2>&1; then \
54
- echo "📥 Installing Helm $(HELM_VERSION) (may require sudo access)..."; \
55
- curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | HELM_INSTALL_VERSION=$(HELM_VERSION) bash; \
55
+ echo "📥 Installing Helm $(HELM_VERSION)..."; \
56
+ mkdir -p "$(HELM_DIR)"; \
57
+ curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 \
58
+ | HELM_INSTALL_VERSION="$(HELM_VERSION)" \
59
+ USE_SUDO="false" \
60
+ PATH="$(HELM_DIR):$$PATH" \
61
+ HELM_INSTALL_DIR="$(HELM_DIR)" \
62
+ bash; \
63
+ chmod +x "$(HELM_DIR)/helm"; \
56
64
  echo "✅ Helm installation complete"; \
65
+ else \
66
+ echo "✅ Helm is already installed at $$(command -v helm)"; \
57
67
  fi
58
68
 
59
69
  check-docker:
@@ -99,7 +109,7 @@ install-gum:
99
109
  @if ! command -v gum >/dev/null 2>&1; then \
100
110
  echo "📥 Installing gum..."; \
101
111
  if [ "$(shell uname)" = "Darwin" ]; then \
102
- HOMEBREW_NO_AUTO_UPDATE=1 brew install gum; \
112
+ HOMEBREW_NO_AUTO_UPDATE=1 brew install gum|| { echo "❌ Failed to install gum via Homebrew"; exit 1; }; \
103
113
  elif command -v apt-get >/dev/null 2>&1; then \
104
114
  curl -fsSL -o /tmp/gum.deb \
105
115
  "https://github.com/charmbracelet/gum/releases/download/$(GUM_VERSION)/gum_$(GUM_VERSION:v%=%)_$(arch).deb"; \
@@ -182,7 +192,7 @@ up: install-brew check-docker install-curl install-gum setup-minikube install-he
182
192
  @echo 'PATH="$(MINIKUBE_DIR):$(TILT_DIR):$$PATH" $(MINIKUBE) tunnel &' >> $(DEVTOOLS_DIR)/start.sh
183
193
  @echo 'echo -e "🚀 Starting Tilt with selected services..."' >> $(DEVTOOLS_DIR)/start.sh
184
194
  @echo 'echo -e "\033[1;38;5;46m\n🔥 \033[1;38;5;196mNext Steps:\033[0;38;5;46m Use \033[3mmetaflow-dev shell\033[23m to switch to the development\n environment'\''s shell and start executing your Metaflow flows.\n\033[0m"' >> "$(DEVTOOLS_DIR)/start.sh"
185
- @echo 'PATH="$(MINIKUBE_DIR):$(TILT_DIR):$$PATH" SERVICES="$$SERVICES" tilt up -f $(TILTFILE)' >> $(DEVTOOLS_DIR)/start.sh
195
+ @echo 'PATH="$(HELM_DIR):$(MINIKUBE_DIR):$(TILT_DIR):$$PATH" SERVICES="$$SERVICES" tilt up -f $(TILTFILE)' >> $(DEVTOOLS_DIR)/start.sh
186
196
  @echo 'wait' >> $(DEVTOOLS_DIR)/start.sh
187
197
  @chmod +x $(DEVTOOLS_DIR)/start.sh
188
198
  @$(DEVTOOLS_DIR)/start.sh
@@ -529,8 +529,8 @@ if "metadata-service" in enabled_components:
529
529
  'metadatadb.password=metaflow123',
530
530
  'metadatadb.database=metaflow',
531
531
  'metadatadb.host=postgresql',
532
- 'image.repository=public.ecr.aws/p7g1e3j4/metaflow-service',
533
- 'image.tag=2.4.13-fbcc7d04',
532
+ 'image.repository=public.ecr.aws/outerbounds/metaflow_metadata_service',
533
+ 'image.tag=2.4.13-2-g70af4ed',
534
534
  'resources.requests.cpu=25m',
535
535
  'resources.requests.memory=64Mi',
536
536
  'resources.limits.cpu=50m',
@@ -567,8 +567,8 @@ if "ui" in enabled_components:
567
567
  'uiBackend.metadatadb.host=postgresql',
568
568
  'uiBackend.metaflowDatastoreSysRootS3=s3://metaflow-test',
569
569
  'uiBackend.metaflowS3EndpointURL=http://minio.default.svc.cluster.local:9000',
570
- 'uiBackend.image.name=public.ecr.aws/p7g1e3j4/metaflow-service',
571
- 'uiBackend.image.tag=2.4.13-fbcc7d04',
570
+ 'uiBackend.image.name=public.ecr.aws/outerbounds/metaflow_metadata_service',
571
+ 'uiBackend.image.tag=2.4.13-2-g70af4ed',
572
572
  'uiBackend.env[0].name=AWS_ACCESS_KEY_ID',
573
573
  'uiBackend.env[0].value=rootuser',
574
574
  'uiBackend.env[1].name=AWS_SECRET_ACCESS_KEY',
@@ -256,12 +256,19 @@ class ArgoClient(object):
256
256
  json.loads(e.body)["message"] if e.body is not None else e.reason
257
257
  )
258
258
 
259
- def trigger_workflow_template(self, name, parameters={}):
259
+ def trigger_workflow_template(self, name, usertype, username, parameters={}):
260
260
  client = self._client.get()
261
261
  body = {
262
262
  "apiVersion": "argoproj.io/v1alpha1",
263
263
  "kind": "Workflow",
264
- "metadata": {"generateName": name + "-"},
264
+ "metadata": {
265
+ "generateName": name + "-",
266
+ "annotations": {
267
+ "metaflow/triggered_by_user": json.dumps(
268
+ {"type": usertype, "name": username}
269
+ )
270
+ },
271
+ },
265
272
  "spec": {
266
273
  "workflowTemplateRef": {"name": name},
267
274
  "arguments": {
@@ -65,6 +65,7 @@ from metaflow.util import (
65
65
  )
66
66
 
67
67
  from .argo_client import ArgoClient
68
+ from metaflow.util import resolve_identity
68
69
 
69
70
 
70
71
  class ArgoWorkflowsException(MetaflowException):
@@ -109,8 +110,7 @@ class ArgoWorkflows(object):
109
110
  notify_slack_webhook_url=None,
110
111
  notify_pager_duty_integration_key=None,
111
112
  notify_incident_io_api_key=None,
112
- incident_io_success_severity_id=None,
113
- incident_io_error_severity_id=None,
113
+ incident_io_alert_source_config_id=None,
114
114
  enable_heartbeat_daemon=True,
115
115
  enable_error_msg_capture=False,
116
116
  ):
@@ -161,8 +161,7 @@ class ArgoWorkflows(object):
161
161
  self.notify_slack_webhook_url = notify_slack_webhook_url
162
162
  self.notify_pager_duty_integration_key = notify_pager_duty_integration_key
163
163
  self.notify_incident_io_api_key = notify_incident_io_api_key
164
- self.incident_io_success_severity_id = incident_io_success_severity_id
165
- self.incident_io_error_severity_id = incident_io_error_severity_id
164
+ self.incident_io_alert_source_config_id = incident_io_alert_source_config_id
166
165
  self.enable_heartbeat_daemon = enable_heartbeat_daemon
167
166
  self.enable_error_msg_capture = enable_error_msg_capture
168
167
  self.parameters = self._process_parameters()
@@ -316,8 +315,16 @@ class ArgoWorkflows(object):
316
315
  "Workflows before proceeding." % name
317
316
  )
318
317
  try:
318
+ id_parts = resolve_identity().split(":")
319
+ parts_size = len(id_parts)
320
+ usertype = id_parts[0] if parts_size > 0 else "unknown"
321
+ username = id_parts[1] if parts_size > 1 else "unknown"
322
+
319
323
  return ArgoClient(namespace=KUBERNETES_NAMESPACE).trigger_workflow_template(
320
- name, parameters
324
+ name,
325
+ usertype,
326
+ username,
327
+ parameters,
321
328
  )
322
329
  except Exception as e:
323
330
  raise ArgoWorkflowsException(str(e))
@@ -2528,25 +2535,49 @@ class ArgoWorkflows(object):
2528
2535
  def _incident_io_alert_template(self):
2529
2536
  if self.notify_incident_io_api_key is None:
2530
2537
  return None
2531
- if self.incident_io_error_severity_id is None:
2538
+ if self.incident_io_alert_source_config_id is None:
2532
2539
  raise MetaflowException(
2533
- "Creating incidents for errors requires a severity id."
2540
+ "Creating alerts for errors requires a alert source config ID."
2534
2541
  )
2542
+ ui_links = self._incident_io_ui_urls_for_run()
2535
2543
  return Template("notify-incident-io-on-error").http(
2536
2544
  Http("POST")
2537
- .url("https://api.incident.io/v2/incidents")
2545
+ .url(
2546
+ "https://api.incident.io/v2/alert_events/http/%s"
2547
+ % self.incident_io_alert_source_config_id
2548
+ )
2538
2549
  .header("Content-Type", "application/json")
2539
2550
  .header("Authorization", "Bearer %s" % self.notify_incident_io_api_key)
2540
2551
  .body(
2541
2552
  json.dumps(
2542
2553
  {
2543
2554
  "idempotency_key": "argo-{{workflow.name}}", # use run id to deduplicate alerts.
2544
- "visibility": "public",
2545
- "severity_id": self.incident_io_error_severity_id,
2546
- "name": "Flow %s has failed." % self.flow.name,
2547
- "summary": "Metaflow run %s/argo-{{workflow.name}} failed! %s"
2548
- % (self.flow.name, self._incident_io_ui_urls_for_run()),
2549
- # TODO: Add support for custom field entries.
2555
+ "status": "firing",
2556
+ "title": "Flow %s has failed." % self.flow.name,
2557
+ "description": "Metaflow run {run_pathspec} failed!{urls}".format(
2558
+ run_pathspec="%s/argo-{{workflow.name}}" % self.flow.name,
2559
+ urls=(
2560
+ "\n\nSee details for the run at:\n\n"
2561
+ + "\n\n".join(ui_links)
2562
+ if ui_links
2563
+ else ""
2564
+ ),
2565
+ ),
2566
+ "source_url": (
2567
+ "%s/%s/%s"
2568
+ % (
2569
+ UI_URL.rstrip("/"),
2570
+ self.flow.name,
2571
+ "argo-{{workflow.name}}",
2572
+ )
2573
+ if UI_URL
2574
+ else None
2575
+ ),
2576
+ "metadata": {
2577
+ "run_status": "failed",
2578
+ "flow_name": self.flow.name,
2579
+ "run_id": "argo-{{workflow.name}}",
2580
+ },
2550
2581
  }
2551
2582
  )
2552
2583
  )
@@ -2555,27 +2586,49 @@ class ArgoWorkflows(object):
2555
2586
  def _incident_io_change_template(self):
2556
2587
  if self.notify_incident_io_api_key is None:
2557
2588
  return None
2558
- if self.incident_io_success_severity_id is None:
2589
+ if self.incident_io_alert_source_config_id is None:
2559
2590
  raise MetaflowException(
2560
- "Creating incidents for successes requires a severity id."
2591
+ "Creating alerts for successes requires an alert source config ID."
2561
2592
  )
2593
+ ui_links = self._incident_io_ui_urls_for_run()
2562
2594
  return Template("notify-incident-io-on-success").http(
2563
2595
  Http("POST")
2564
- .url("https://api.incident.io/v2/incidents")
2596
+ .url(
2597
+ "https://api.incident.io/v2/alert_events/http/%s"
2598
+ % self.incident_io_alert_source_config_id
2599
+ )
2565
2600
  .header("Content-Type", "application/json")
2566
2601
  .header("Authorization", "Bearer %s" % self.notify_incident_io_api_key)
2567
2602
  .body(
2568
2603
  json.dumps(
2569
2604
  {
2570
2605
  "idempotency_key": "argo-{{workflow.name}}", # use run id to deduplicate alerts.
2571
- "visibility": "public",
2572
- "severity_id": self.incident_io_success_severity_id,
2573
- # TODO: Do we need to make incident type configurable for successes? otherwise they are created as 'investigating'
2574
- # "incident_type_id": ""
2575
- "name": "Flow %s has succeeded." % self.flow.name,
2576
- "summary": "Metaflow run %s/argo-{{workflow.name}} succeeded!%s"
2577
- % (self.flow.name, self._incident_io_ui_urls_for_run()),
2578
- # TODO: Add support for custom field entries.
2606
+ "status": "firing",
2607
+ "title": "Flow %s has succeeded." % self.flow.name,
2608
+ "description": "Metaflow run {run_pathspec} succeeded!{urls}".format(
2609
+ run_pathspec="%s/argo-{{workflow.name}}" % self.flow.name,
2610
+ urls=(
2611
+ "\n\nSee details for the run at:\n\n"
2612
+ + "\n\n".join(ui_links)
2613
+ if ui_links
2614
+ else ""
2615
+ ),
2616
+ ),
2617
+ "source_url": (
2618
+ "%s/%s/%s"
2619
+ % (
2620
+ UI_URL.rstrip("/"),
2621
+ self.flow.name,
2622
+ "argo-{{workflow.name}}",
2623
+ )
2624
+ if UI_URL
2625
+ else None
2626
+ ),
2627
+ "metadata": {
2628
+ "run_status": "succeeded",
2629
+ "flow_name": self.flow.name,
2630
+ "run_id": "argo-{{workflow.name}}",
2631
+ },
2579
2632
  }
2580
2633
  )
2581
2634
  )
@@ -2597,9 +2650,7 @@ class ArgoWorkflows(object):
2597
2650
  "{{workflow.name}}",
2598
2651
  )
2599
2652
  links.append(url)
2600
- if links:
2601
- links = ["See details for the run at: ", *links]
2602
- return "\n\n".join(links)
2653
+ return links
2603
2654
 
2604
2655
  def _pager_duty_change_template(self):
2605
2656
  # https://developer.pagerduty.com/docs/ZG9jOjExMDI5NTgy-send-a-change-event
@@ -130,6 +130,7 @@ def argo_workflows(obj, name=None):
130
130
  is_flag=True,
131
131
  default=False,
132
132
  help="Only print out JSON sent to Argo Workflows. Do not deploy anything.",
133
+ hidden=True,
133
134
  )
134
135
  @click.option(
135
136
  "--max-workers",
@@ -182,14 +183,9 @@ def argo_workflows(obj, name=None):
182
183
  help="Incident.io API V2 key for workflow success/failure notifications.",
183
184
  )
184
185
  @click.option(
185
- "--incident-io-success-severity-id",
186
- default=None,
187
- help="Incident.io severity id for success alerts.",
188
- )
189
- @click.option(
190
- "--incident-io-error-severity-id",
186
+ "--incident-io-alert-source-config-id",
191
187
  default=None,
192
- help="Incident.io severity id for error alerts.",
188
+ help="Incident.io Alert source config ID. Example '01GW2G3V0S59R238FAHPDS1R66'",
193
189
  )
194
190
  @click.option(
195
191
  "--enable-heartbeat-daemon/--no-enable-heartbeat-daemon",
@@ -229,8 +225,7 @@ def create(
229
225
  notify_slack_webhook_url=None,
230
226
  notify_pager_duty_integration_key=None,
231
227
  notify_incident_io_api_key=None,
232
- incident_io_success_severity_id=None,
233
- incident_io_error_severity_id=None,
228
+ incident_io_alert_source_config_id=None,
234
229
  enable_heartbeat_daemon=True,
235
230
  deployer_attribute_file=None,
236
231
  enable_error_msg_capture=False,
@@ -287,8 +282,7 @@ def create(
287
282
  notify_slack_webhook_url,
288
283
  notify_pager_duty_integration_key,
289
284
  notify_incident_io_api_key,
290
- incident_io_success_severity_id,
291
- incident_io_error_severity_id,
285
+ incident_io_alert_source_config_id,
292
286
  enable_heartbeat_daemon,
293
287
  enable_error_msg_capture,
294
288
  )
@@ -464,8 +458,7 @@ def make_flow(
464
458
  notify_slack_webhook_url,
465
459
  notify_pager_duty_integration_key,
466
460
  notify_incident_io_api_key,
467
- incident_io_success_severity_id,
468
- incident_io_error_severity_id,
461
+ incident_io_alert_source_config_id,
469
462
  enable_heartbeat_daemon,
470
463
  enable_error_msg_capture,
471
464
  ):
@@ -488,19 +481,18 @@ def make_flow(
488
481
  "https://api.slack.com/messaging/webhooks to generate a webhook url.\n"
489
482
  " For notifications through PagerDuty, generate an integration key by following the instructions at "
490
483
  "https://support.pagerduty.com/docs/services-and-integrations#create-a-generic-events-api-integration\n"
491
- " For notifications through Incident.io, generate an API key with a permission to create incidents."
484
+ " For notifications through Incident.io, generate an alert source config."
492
485
  )
493
486
 
494
- if notify_incident_io_api_key:
495
- if notify_on_error and incident_io_error_severity_id is None:
496
- raise MetaflowException(
497
- "Incident.io error notifications require a severity id. Please set one with --incident-io-error-severity-id"
498
- )
487
+ if (
488
+ (notify_on_error or notify_on_success)
489
+ and notify_incident_io_api_key
490
+ and incident_io_alert_source_config_id is None
491
+ ):
492
+ raise MetaflowException(
493
+ "Incident.io alerts require an alert source configuration ID. Please set one with --incident-io-alert-source-config-id"
494
+ )
499
495
 
500
- if notify_on_success and incident_io_success_severity_id is None:
501
- raise MetaflowException(
502
- "Incident.io success notifications require a severity id. Please set one with --incident-io-success-severity-id"
503
- )
504
496
  # Attach @kubernetes and @environment decorator to the flow to
505
497
  # ensure that the related decorator hooks are invoked.
506
498
  decorators._attach_decorators(
@@ -545,8 +537,7 @@ def make_flow(
545
537
  notify_slack_webhook_url=notify_slack_webhook_url,
546
538
  notify_pager_duty_integration_key=notify_pager_duty_integration_key,
547
539
  notify_incident_io_api_key=notify_incident_io_api_key,
548
- incident_io_success_severity_id=incident_io_success_severity_id,
549
- incident_io_error_severity_id=incident_io_error_severity_id,
540
+ incident_io_alert_source_config_id=incident_io_alert_source_config_id,
550
541
  enable_heartbeat_daemon=enable_heartbeat_daemon,
551
542
  enable_error_msg_capture=enable_error_msg_capture,
552
543
  )
@@ -171,12 +171,16 @@ class ArgoWorkflowsTriggeredRun(TriggeredRun):
171
171
  command_obj.sync_wait()
172
172
  return command_obj.process.returncode == 0
173
173
 
174
- def wait_for_completion(self, timeout: Optional[int] = None):
174
+ def wait_for_completion(
175
+ self, check_interval: int = 5, timeout: Optional[int] = None
176
+ ):
175
177
  """
176
178
  Wait for the workflow to complete or timeout.
177
179
 
178
180
  Parameters
179
181
  ----------
182
+ check_interval: int, default: 5
183
+ Frequency of checking for workflow completion, in seconds.
180
184
  timeout : int, optional, default None
181
185
  Maximum time in seconds to wait for workflow completion.
182
186
  If None, waits indefinitely.
@@ -187,7 +191,6 @@ class ArgoWorkflowsTriggeredRun(TriggeredRun):
187
191
  If the workflow does not complete within the specified timeout period.
188
192
  """
189
193
  start_time = time.time()
190
- check_interval = 5
191
194
  while self.is_running:
192
195
  if timeout is not None and (time.time() - start_time) > timeout:
193
196
  raise TimeoutError(