ob-metaflow 2.13.3.1__tar.gz → 2.13.6.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 (375) hide show
  1. {ob_metaflow-2.13.3.1/ob_metaflow.egg-info → ob_metaflow-2.13.6.1}/PKG-INFO +2 -2
  2. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cli.py +5 -0
  3. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/run_cmds.py +2 -0
  4. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/step_cmd.py +0 -13
  5. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/decorators.py +2 -2
  6. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/parameters.py +3 -1
  7. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/__init__.py +5 -0
  8. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_workflows.py +24 -8
  9. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_decorator.py +53 -20
  10. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/events_decorator.py +120 -149
  11. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes.py +0 -9
  12. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes_cli.py +1 -1
  13. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes_decorator.py +8 -0
  14. ob_metaflow-2.13.6.1/metaflow/plugins/kubernetes/spot_metadata_cli.py +69 -0
  15. ob_metaflow-2.13.6.1/metaflow/plugins/kubernetes/spot_monitor_sidecar.py +109 -0
  16. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/project_decorator.py +33 -5
  17. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/user_configs/config_parameters.py +23 -9
  18. ob_metaflow-2.13.6.1/metaflow/version.py +1 -0
  19. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1/ob_metaflow.egg-info}/PKG-INFO +2 -2
  20. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/ob_metaflow.egg-info/SOURCES.txt +2 -0
  21. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/ob_metaflow.egg-info/requires.txt +1 -1
  22. ob_metaflow-2.13.3.1/metaflow/version.py +0 -1
  23. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/LICENSE +0 -0
  24. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/MANIFEST.in +0 -0
  25. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/README.md +0 -0
  26. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/R.py +0 -0
  27. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/__init__.py +0 -0
  28. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/__init__.py +0 -0
  29. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/__init__.py +0 -0
  30. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  31. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_compat.py +0 -0
  32. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_termui_impl.py +0 -0
  33. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_textwrap.py +0 -0
  34. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_unicodefun.py +0 -0
  35. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/_winconsole.py +0 -0
  36. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/core.py +0 -0
  37. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/decorators.py +0 -0
  38. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/exceptions.py +0 -0
  39. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/formatting.py +0 -0
  40. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/globals.py +0 -0
  41. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/parser.py +0 -0
  42. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/termui.py +0 -0
  43. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/testing.py +0 -0
  44. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/types.py +0 -0
  45. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/click/utils.py +0 -0
  46. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
  47. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
  48. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
  49. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
  50. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
  51. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
  52. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
  53. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
  54. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
  55. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/__init__.py +0 -0
  56. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_elffile.py +0 -0
  57. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  58. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  59. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_parser.py +0 -0
  60. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_structures.py +0 -0
  61. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  62. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/markers.py +0 -0
  63. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/py.typed +0 -0
  64. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/requirements.py +0 -0
  65. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/specifiers.py +0 -0
  66. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/tags.py +0 -0
  67. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/utils.py +0 -0
  68. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/packaging/version.py +0 -0
  69. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/__init__.py +0 -0
  70. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_checkers.py +0 -0
  71. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_config.py +0 -0
  72. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_decorators.py +0 -0
  73. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
  74. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_functions.py +0 -0
  75. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_importhook.py +0 -0
  76. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_memo.py +0 -0
  77. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
  78. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_suppression.py +0 -0
  79. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_transformer.py +0 -0
  80. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
  81. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/_utils.py +0 -0
  82. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typeguard/py.typed +0 -0
  83. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/typing_extensions.py +0 -0
  84. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_5/__init__.py +0 -0
  85. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
  86. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
  87. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_5/zipp.py +0 -0
  88. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/__init__.py +0 -0
  89. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  90. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  91. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  92. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  93. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  94. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  95. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  96. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  97. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  98. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  99. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/v3_6/zipp.py +0 -0
  100. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/_vendor/zipp.py +0 -0
  101. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cards.py +0 -0
  102. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cli_args.py +0 -0
  103. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/__init__.py +0 -0
  104. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/dump_cmd.py +0 -0
  105. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/init_cmd.py +0 -0
  106. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cli_components/utils.py +0 -0
  107. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/client/__init__.py +0 -0
  108. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/client/core.py +0 -0
  109. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/client/filecache.py +0 -0
  110. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/clone_util.py +0 -0
  111. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/__init__.py +0 -0
  112. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/configure_cmd.py +0 -0
  113. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/develop/__init__.py +0 -0
  114. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/develop/stub_generator.py +0 -0
  115. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/develop/stubs.py +0 -0
  116. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/main_cli.py +0 -0
  117. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/tutorials_cmd.py +0 -0
  118. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd/util.py +0 -0
  119. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/cmd_with_io.py +0 -0
  120. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/__init__.py +0 -0
  121. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/content_addressed_store.py +0 -0
  122. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/datastore_set.py +0 -0
  123. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/datastore_storage.py +0 -0
  124. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/exceptions.py +0 -0
  125. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/flow_datastore.py +0 -0
  126. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/inputs.py +0 -0
  127. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/datastore/task_datastore.py +0 -0
  128. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/debug.py +0 -0
  129. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/event_logger.py +0 -0
  130. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/events.py +0 -0
  131. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/exception.py +0 -0
  132. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/extension_support/__init__.py +0 -0
  133. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/extension_support/_empty_file.py +0 -0
  134. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/extension_support/cmd.py +0 -0
  135. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/extension_support/integrations.py +0 -0
  136. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/extension_support/plugins.py +0 -0
  137. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/flowspec.py +0 -0
  138. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/graph.py +0 -0
  139. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/includefile.py +0 -0
  140. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/info_file.py +0 -0
  141. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/integrations.py +0 -0
  142. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/lint.py +0 -0
  143. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metadata_provider/__init__.py +0 -0
  144. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metadata_provider/heartbeat.py +0 -0
  145. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metadata_provider/metadata.py +0 -0
  146. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metadata_provider/util.py +0 -0
  147. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_config.py +0 -0
  148. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_config_funcs.py +0 -0
  149. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_current.py +0 -0
  150. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_environment.py +0 -0
  151. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_profile.py +0 -0
  152. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/metaflow_version.py +0 -0
  153. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/mflog/__init__.py +0 -0
  154. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/mflog/mflog.py +0 -0
  155. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/mflog/save_logs.py +0 -0
  156. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/mflog/save_logs_periodically.py +0 -0
  157. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/mflog/tee.py +0 -0
  158. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/monitor.py +0 -0
  159. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/multicore_utils.py +0 -0
  160. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/package.py +0 -0
  161. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/__init__.py +0 -0
  162. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/airflow.py +0 -0
  163. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  164. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  165. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  166. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/dag.py +0 -0
  167. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/exception.py +0 -0
  168. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  169. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  170. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  171. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
  172. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
  173. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
  174. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/__init__.py +0 -0
  175. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_client.py +0 -0
  176. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_events.py +0 -0
  177. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_workflows_cli.py +0 -0
  178. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  179. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
  180. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/argo_workflows_deployer_objects.py +0 -0
  181. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/capture_error.py +0 -0
  182. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/generate_input_paths.py +0 -0
  183. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
  184. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/__init__.py +0 -0
  185. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/aws_client.py +0 -0
  186. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/aws_utils.py +0 -0
  187. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/batch/__init__.py +0 -0
  188. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/batch/batch.py +0 -0
  189. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  190. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  191. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
  192. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  193. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  194. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  195. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  196. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  197. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  198. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  199. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  200. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
  201. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
  202. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  203. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  204. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
  205. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +0 -0
  206. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/__init__.py +0 -0
  207. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/azure_credential.py +0 -0
  208. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  209. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
  210. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/azure_tail.py +0 -0
  211. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/azure_utils.py +0 -0
  212. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  213. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/azure/includefile_support.py +0 -0
  214. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/__init__.py +0 -0
  215. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_cli.py +0 -0
  216. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_client.py +0 -0
  217. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_creator.py +0 -0
  218. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_datastore.py +0 -0
  219. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  220. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/base.html +0 -0
  221. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/basic.py +0 -0
  222. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
  223. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/card.py +0 -0
  224. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  225. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  226. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  227. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  228. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  229. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/components.py +0 -0
  230. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  231. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/main.js +0 -0
  232. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  233. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  234. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_resolver.py +0 -0
  235. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_server.py +0 -0
  236. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
  237. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/component_serializer.py +0 -0
  238. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/cards/exception.py +0 -0
  239. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/catch_decorator.py +0 -0
  240. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datastores/__init__.py +0 -0
  241. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datastores/azure_storage.py +0 -0
  242. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datastores/gs_storage.py +0 -0
  243. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datastores/local_storage.py +0 -0
  244. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datastores/s3_storage.py +0 -0
  245. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/__init__.py +0 -0
  246. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/local.py +0 -0
  247. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  248. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/s3/s3.py +0 -0
  249. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/s3/s3op.py +0 -0
  250. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  251. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  252. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/debug_logger.py +0 -0
  253. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/debug_monitor.py +0 -0
  254. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/__init__.py +0 -0
  255. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/client.py +0 -0
  256. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/client_modules.py +0 -0
  257. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  258. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  259. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  260. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  261. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  262. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  263. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  264. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  265. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  266. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  267. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/consts.py +0 -0
  268. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  269. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  270. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  271. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/server.py +0 -0
  272. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/stub.py +0 -0
  273. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/env_escape/utils.py +0 -0
  274. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/environment_decorator.py +0 -0
  275. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/frameworks/__init__.py +0 -0
  276. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/frameworks/pytorch.py +0 -0
  277. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/__init__.py +0 -0
  278. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
  279. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  280. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  281. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/gs_tail.py +0 -0
  282. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/gs_utils.py +0 -0
  283. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/gcp/includefile_support.py +0 -0
  284. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/__init__.py +0 -0
  285. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
  286. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
  287. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes_job.py +0 -0
  288. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +0 -0
  289. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/logs_cli.py +0 -0
  290. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/metadata_providers/__init__.py +0 -0
  291. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/metadata_providers/local.py +0 -0
  292. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/metadata_providers/service.py +0 -0
  293. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/package_cli.py +0 -0
  294. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/parallel_decorator.py +0 -0
  295. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/__init__.py +0 -0
  296. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/bootstrap.py +0 -0
  297. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/conda_decorator.py +0 -0
  298. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/conda_environment.py +0 -0
  299. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/micromamba.py +0 -0
  300. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/pip.py +0 -0
  301. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
  302. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  303. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/pypi/utils.py +0 -0
  304. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/resources_decorator.py +0 -0
  305. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/retry_decorator.py +0 -0
  306. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/secrets/__init__.py +0 -0
  307. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  308. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  309. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/storage_executor.py +0 -0
  310. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/tag_cli.py +0 -0
  311. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  312. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/plugins/timeout_decorator.py +0 -0
  313. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/procpoll.py +0 -0
  314. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/py.typed +0 -0
  315. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/pylint_wrapper.py +0 -0
  316. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/__init__.py +0 -0
  317. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/click_api.py +0 -0
  318. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/deployer.py +0 -0
  319. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/deployer_impl.py +0 -0
  320. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/metaflow_runner.py +0 -0
  321. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/nbdeploy.py +0 -0
  322. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/nbrun.py +0 -0
  323. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/subprocess_manager.py +0 -0
  324. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runner/utils.py +0 -0
  325. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/runtime.py +0 -0
  326. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/sidecar/__init__.py +0 -0
  327. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/sidecar/sidecar.py +0 -0
  328. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/sidecar/sidecar_messages.py +0 -0
  329. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  330. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/sidecar/sidecar_worker.py +0 -0
  331. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/system/__init__.py +0 -0
  332. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/system/system_logger.py +0 -0
  333. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/system/system_monitor.py +0 -0
  334. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/system/system_utils.py +0 -0
  335. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tagging_util.py +0 -0
  336. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/task.py +0 -0
  337. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tracing/__init__.py +0 -0
  338. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tracing/propagator.py +0 -0
  339. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tracing/span_exporter.py +0 -0
  340. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tracing/tracing_modules.py +0 -0
  341. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tuple_util.py +0 -0
  342. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/00-helloworld/README.md +0 -0
  343. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  344. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/01-playlist/README.md +0 -0
  345. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  346. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  347. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  348. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/02-statistics/README.md +0 -0
  349. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  350. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  351. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/02-statistics/stats.py +0 -0
  352. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  353. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  354. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  355. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  356. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  357. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  358. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  359. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  360. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  361. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/07-worldview/README.md +0 -0
  362. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  363. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/08-autopilot/README.md +0 -0
  364. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  365. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/unbounded_foreach.py +0 -0
  366. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/user_configs/__init__.py +0 -0
  367. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/user_configs/config_decorators.py +0 -0
  368. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/user_configs/config_options.py +0 -0
  369. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/util.py +0 -0
  370. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/metaflow/vendor.py +0 -0
  371. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/ob_metaflow.egg-info/dependency_links.txt +0 -0
  372. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/ob_metaflow.egg-info/entry_points.txt +0 -0
  373. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/ob_metaflow.egg-info/top_level.txt +0 -0
  374. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/setup.cfg +0 -0
  375. {ob_metaflow-2.13.3.1 → ob_metaflow-2.13.6.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: ob-metaflow
3
- Version: 2.13.3.1
3
+ Version: 2.13.6.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.13.3.1; extra == "stubs"
15
+ Requires-Dist: metaflow-stubs==2.13.6.1; extra == "stubs"
16
16
  Dynamic: author
17
17
  Dynamic: author-email
18
18
  Dynamic: description
@@ -504,6 +504,11 @@ def start(
504
504
  # *after* the run decospecs so that they don't take precedence. In other
505
505
  # words, for the same decorator, we want `myflow.py run --with foo` to
506
506
  # take precedence over any other `foo` decospec
507
+
508
+ # Note that top-level decospecs are used primarily with non run/resume
509
+ # options as well as with the airflow/argo/sfn integrations which pass
510
+ # all the decospecs (the ones from top-level but also the ones from the
511
+ # run/resume level) through the tl decospecs.
507
512
  ctx.obj.tl_decospecs = list(decospecs or [])
508
513
 
509
514
  # initialize current and parameter context for deploy-time parameters
@@ -39,6 +39,8 @@ def before_run(obj, tags, decospecs):
39
39
  + list(obj.environment.decospecs() or [])
40
40
  )
41
41
  if all_decospecs:
42
+ # These decospecs are the ones from run/resume PLUS the ones from the
43
+ # environment (for example the @conda)
42
44
  decorators._attach_decorators(obj.flow, all_decospecs)
43
45
  decorators._init(obj.flow)
44
46
  # Regenerate graph if we attached more decorators
@@ -77,14 +77,6 @@ from ..util import decompress_list
77
77
  default=None,
78
78
  help="Run id of the origin flow, if this task is part of a flow being resumed.",
79
79
  )
80
- @click.option(
81
- "--with",
82
- "decospecs",
83
- multiple=True,
84
- help="Add a decorator to this task. You can specify this "
85
- "option multiple times to attach multiple decorators "
86
- "to this task.",
87
- )
88
80
  @click.option(
89
81
  "--ubf-context",
90
82
  default="none",
@@ -112,7 +104,6 @@ def step(
112
104
  max_user_code_retries=None,
113
105
  clone_only=None,
114
106
  clone_run_id=None,
115
- decospecs=None,
116
107
  ubf_context="none",
117
108
  num_parallel=None,
118
109
  ):
@@ -136,10 +127,6 @@ def step(
136
127
  raise CommandException("Function *%s* is not a step." % step_name)
137
128
  echo("Executing a step, *%s*" % step_name, fg="magenta", bold=False)
138
129
 
139
- if decospecs:
140
- decorators._attach_decorators_to_step(func, decospecs)
141
- decorators._init(ctx.obj.flow)
142
-
143
130
  step_kwargs = ctx.params
144
131
  # Remove argument `step_name` from `step_kwargs`.
145
132
  step_kwargs.pop("step_name", None)
@@ -150,8 +150,8 @@ class Decorator(object):
150
150
  return
151
151
 
152
152
  # Note that by design, later values override previous ones.
153
- self.attributes = unpack_delayed_evaluator(self.attributes)
154
- self._user_defined_attributes.update(self.attributes.keys())
153
+ self.attributes, new_user_attributes = unpack_delayed_evaluator(self.attributes)
154
+ self._user_defined_attributes.update(new_user_attributes)
155
155
  self.attributes = resolve_delayed_evaluator(self.attributes)
156
156
 
157
157
  self._ran_init = True
@@ -367,7 +367,9 @@ class Parameter(object):
367
367
  )
368
368
 
369
369
  # Resolve any value from configurations
370
- self.kwargs = unpack_delayed_evaluator(self.kwargs, ignore_errors=ignore_errors)
370
+ self.kwargs, _ = unpack_delayed_evaluator(
371
+ self.kwargs, ignore_errors=ignore_errors
372
+ )
371
373
  # Do it one item at a time so errors are ignored at that level (as opposed to
372
374
  # at the entire kwargs level)
373
375
  self.kwargs = {
@@ -16,6 +16,7 @@ CLIS_DESC = [
16
16
  ("argo-workflows", ".argo.argo_workflows_cli.cli"),
17
17
  ("card", ".cards.card_cli.cli"),
18
18
  ("tag", ".tag_cli.cli"),
19
+ ("spot-metadata", ".kubernetes.spot_metadata_cli.cli"),
19
20
  ("logs", ".logs_cli.cli"),
20
21
  ]
21
22
 
@@ -104,6 +105,10 @@ SIDECARS_DESC = [
104
105
  "save_logs_periodically",
105
106
  "..mflog.save_logs_periodically.SaveLogsPeriodicallySidecar",
106
107
  ),
108
+ (
109
+ "spot_termination_monitor",
110
+ ".kubernetes.spot_monitor_sidecar.SpotTerminationMonitorSidecar",
111
+ ),
107
112
  ("heartbeat", "metaflow.metadata_provider.heartbeat.MetadataHeartBeat"),
108
113
  ]
109
114
 
@@ -625,6 +625,16 @@ class ArgoWorkflows(object):
625
625
  for event in trigger_on_finish_deco.triggers:
626
626
  # Actual filters are deduced here since we don't have access to
627
627
  # the current object in the @trigger_on_finish decorator.
628
+ project_name = event.get("project") or current.get("project_name")
629
+ branch_name = event.get("branch") or current.get("branch_name")
630
+ # validate that we have complete project info for an event name
631
+ if project_name or branch_name:
632
+ if not (project_name and branch_name):
633
+ # if one of the two is missing, we would end up listening to an event that will never be broadcast.
634
+ raise ArgoWorkflowsException(
635
+ "Incomplete project info. Please specify both 'project' and 'project_branch' or use the @project decorator"
636
+ )
637
+
628
638
  triggers.append(
629
639
  {
630
640
  # Make sure this remains consistent with the event name format
@@ -633,18 +643,16 @@ class ArgoWorkflows(object):
633
643
  % ".".join(
634
644
  v
635
645
  for v in [
636
- event.get("project") or current.get("project_name"),
637
- event.get("branch") or current.get("branch_name"),
646
+ project_name,
647
+ branch_name,
638
648
  event["flow"],
639
649
  ]
640
650
  if v
641
651
  ),
642
652
  "filters": {
643
653
  "auto-generated-by-metaflow": True,
644
- "project_name": event.get("project")
645
- or current.get("project_name"),
646
- "branch_name": event.get("branch")
647
- or current.get("branch_name"),
654
+ "project_name": project_name,
655
+ "branch_name": branch_name,
648
656
  # TODO: Add a time filters to guard against cached events
649
657
  },
650
658
  "type": "run",
@@ -842,8 +850,15 @@ class ArgoWorkflows(object):
842
850
  Metadata()
843
851
  .labels(self._base_labels)
844
852
  .label("app.kubernetes.io/name", "metaflow-task")
845
- .annotations(annotations)
846
- .annotations(self._base_annotations)
853
+ .annotations(
854
+ {
855
+ **annotations,
856
+ **self._base_annotations,
857
+ **{
858
+ "metaflow/run_id": "argo-{{workflow.name}}"
859
+ }, # we want pods of the workflow to have the run_id as an annotation as well
860
+ }
861
+ )
847
862
  )
848
863
  # Set the entrypoint to flow name
849
864
  .entrypoint(self.flow.name)
@@ -1706,6 +1721,7 @@ class ArgoWorkflows(object):
1706
1721
  },
1707
1722
  **{
1708
1723
  # Some optional values for bookkeeping
1724
+ "METAFLOW_FLOW_FILENAME": os.path.basename(sys.argv[0]),
1709
1725
  "METAFLOW_FLOW_NAME": self.flow.name,
1710
1726
  "METAFLOW_STEP_NAME": node.name,
1711
1727
  "METAFLOW_RUN_ID": run_id,
@@ -76,6 +76,12 @@ class CardDecorator(StepDecorator):
76
76
 
77
77
  card_creator = None
78
78
 
79
+ _config_values = None
80
+
81
+ _config_file_name = None
82
+
83
+ task_finished_decos = 0
84
+
79
85
  def __init__(self, *args, **kwargs):
80
86
  super(CardDecorator, self).__init__(*args, **kwargs)
81
87
  self._task_datastore = None
@@ -106,6 +112,25 @@ class CardDecorator(StepDecorator):
106
112
  def _increment_step_counter(cls):
107
113
  cls.step_counter += 1
108
114
 
115
+ @classmethod
116
+ def _increment_completed_counter(cls):
117
+ cls.task_finished_decos += 1
118
+
119
+ @classmethod
120
+ def _set_config_values(cls, config_values):
121
+ cls._config_values = config_values
122
+
123
+ @classmethod
124
+ def _set_config_file_name(cls, flow):
125
+ # Only create a config file from the very first card decorator.
126
+ if cls._config_values and not cls._config_file_name:
127
+ with tempfile.NamedTemporaryFile(
128
+ mode="w", encoding="utf-8", delete=False
129
+ ) as config_file:
130
+ config_value = dump_config_values(flow)
131
+ json.dump(config_value, config_file)
132
+ cls._config_file_name = config_file.name
133
+
109
134
  def step_init(
110
135
  self, flow, graph, step_name, decorators, environment, flow_datastore, logger
111
136
  ):
@@ -116,11 +141,13 @@ class CardDecorator(StepDecorator):
116
141
 
117
142
  # We check for configuration options. We do this here before they are
118
143
  # converted to properties.
119
- self._config_values = [
120
- (config.name, ConfigInput.make_key_name(config.name))
121
- for _, config in flow._get_parameters()
122
- if config.IS_CONFIG_PARAMETER
123
- ]
144
+ self._set_config_values(
145
+ [
146
+ (config.name, ConfigInput.make_key_name(config.name))
147
+ for _, config in flow._get_parameters()
148
+ if config.IS_CONFIG_PARAMETER
149
+ ]
150
+ )
124
151
 
125
152
  self.card_options = self.attributes["options"]
126
153
 
@@ -159,15 +186,11 @@ class CardDecorator(StepDecorator):
159
186
 
160
187
  # If we have configs, we need to dump them to a file so we can re-use them
161
188
  # when calling the card creation subprocess.
162
- if self._config_values:
163
- with tempfile.NamedTemporaryFile(
164
- mode="w", encoding="utf-8", delete=False
165
- ) as config_file:
166
- config_value = dump_config_values(flow)
167
- json.dump(config_value, config_file)
168
- self._config_file_name = config_file.name
169
- else:
170
- self._config_file_name = None
189
+ # Since a step can contain multiple card decorators, and all the card creation processes
190
+ # will reference the same config file (because of how the CardCreator is created (only single class instance)),
191
+ # we need to ensure that a single config file is being referenced for all card create commands.
192
+ # This config file will be removed when the last card decorator has finished creating its card.
193
+ self._set_config_file_name(flow)
171
194
 
172
195
  card_type = self.attributes["type"]
173
196
  card_class = get_card_class(card_type)
@@ -246,12 +269,7 @@ class CardDecorator(StepDecorator):
246
269
  self.card_creator.create(mode="render", final=True, **create_options)
247
270
  self.card_creator.create(mode="refresh", final=True, **create_options)
248
271
 
249
- # Unlink the config file if it exists
250
- if self._config_file_name:
251
- try:
252
- os.unlink(self._config_file_name)
253
- except Exception as e:
254
- pass
272
+ self._cleanup(step_name)
255
273
 
256
274
  @staticmethod
257
275
  def _options(mapping):
@@ -286,3 +304,18 @@ class CardDecorator(StepDecorator):
286
304
  top_level_options["local-config-file"] = self._config_file_name
287
305
 
288
306
  return list(self._options(top_level_options))
307
+
308
+ def task_exception(
309
+ self, exception, step_name, flow, graph, retry_count, max_user_code_retries
310
+ ):
311
+ self._cleanup(step_name)
312
+
313
+ def _cleanup(self, step_name):
314
+ self._increment_completed_counter()
315
+ if self.task_finished_decos == self.total_decos_on_step[step_name]:
316
+ # Unlink the config file if it exists
317
+ if self._config_file_name:
318
+ try:
319
+ os.unlink(self._config_file_name)
320
+ except Exception as e:
321
+ pass
@@ -362,11 +362,7 @@ class TriggerOnFinishDecorator(FlowDecorator):
362
362
  """
363
363
 
364
364
  name = "trigger_on_finish"
365
- defaults = {
366
- "flow": None, # flow_name or project_flow_name
367
- "flows": [], # flow_names or project_flow_names
368
- "options": {},
369
- }
365
+
370
366
  options = {
371
367
  "trigger": dict(
372
368
  multiple=True,
@@ -374,6 +370,14 @@ class TriggerOnFinishDecorator(FlowDecorator):
374
370
  help="Specify run pathspec for testing @trigger_on_finish locally.",
375
371
  ),
376
372
  }
373
+ defaults = {
374
+ "flow": None, # flow_name or project_flow_name
375
+ "flows": [], # flow_names or project_flow_names
376
+ "options": {},
377
+ # Re-enable if you want to support TL options directly in the decorator like
378
+ # for @project decorator
379
+ # **{k: v["default"] for k, v in options.items()},
380
+ }
377
381
 
378
382
  def flow_init(
379
383
  self,
@@ -394,111 +398,23 @@ class TriggerOnFinishDecorator(FlowDecorator):
394
398
  )
395
399
  elif self.attributes["flow"]:
396
400
  # flow supports the format @trigger_on_finish(flow='FooFlow')
397
- if is_stringish(self.attributes["flow"]):
398
- self.triggers.append(
399
- {
400
- "fq_name": self.attributes["flow"],
401
- }
402
- )
403
- elif isinstance(self.attributes["flow"], dict):
404
- if "name" not in self.attributes["flow"]:
405
- raise MetaflowException(
406
- "The *flow* attribute for *@trigger_on_finish* is missing the "
407
- "*name* key."
408
- )
409
- flow_name = self.attributes["flow"]["name"]
410
-
411
- if not is_stringish(flow_name) or "." in flow_name:
412
- raise MetaflowException(
413
- "The *name* attribute of the *flow* is not a valid string"
414
- )
415
- result = {"fq_name": flow_name}
416
- if "project" in self.attributes["flow"]:
417
- if is_stringish(self.attributes["flow"]["project"]):
418
- result["project"] = self.attributes["flow"]["project"]
419
- else:
420
- raise MetaflowException(
421
- "The *project* attribute of the *flow* is not a string"
422
- )
423
- if "project_branch" in self.attributes["flow"]:
424
- if is_stringish(self.attributes["flow"]["project_branch"]):
425
- result["branch"] = self.attributes["flow"]["project_branch"]
426
- else:
427
- raise MetaflowException(
428
- "The *project_branch* attribute of the *flow* is not a string"
429
- )
430
- self.triggers.append(result)
431
- elif callable(self.attributes["flow"]) and not isinstance(
401
+ flow = self.attributes["flow"]
402
+ if callable(flow) and not isinstance(
432
403
  self.attributes["flow"], DeployTimeField
433
404
  ):
434
- trig = DeployTimeField(
435
- "fq_name", [str, dict], None, self.attributes["flow"], False
436
- )
405
+ trig = DeployTimeField("fq_name", [str, dict], None, flow, False)
437
406
  self.triggers.append(trig)
438
407
  else:
439
- raise MetaflowException(
440
- "Incorrect type for *flow* attribute in *@trigger_on_finish* "
441
- " decorator. Supported type is string or Dict[str, str] - \n"
442
- "@trigger_on_finish(flow='FooFlow') or "
443
- "@trigger_on_finish(flow={'name':'FooFlow', 'project_branch': 'branch'})"
444
- )
408
+ self.triggers.extend(self._parse_static_triggers([flow]))
445
409
  elif self.attributes["flows"]:
446
410
  # flows attribute supports the following formats -
447
411
  # 1. flows=['FooFlow', 'BarFlow']
448
- if isinstance(self.attributes["flows"], list):
449
- for flow in self.attributes["flows"]:
450
- if is_stringish(flow):
451
- self.triggers.append(
452
- {
453
- "fq_name": flow,
454
- }
455
- )
456
- elif isinstance(flow, dict):
457
- if "name" not in flow:
458
- raise MetaflowException(
459
- "One or more flows in the *flows* attribute for "
460
- "*@trigger_on_finish* is missing the "
461
- "*name* key."
462
- )
463
- flow_name = flow["name"]
464
-
465
- if not is_stringish(flow_name) or "." in flow_name:
466
- raise MetaflowException(
467
- "The *name* attribute '%s' is not a valid string"
468
- % str(flow_name)
469
- )
470
- result = {"fq_name": flow_name}
471
- if "project" in flow:
472
- if is_stringish(flow["project"]):
473
- result["project"] = flow["project"]
474
- else:
475
- raise MetaflowException(
476
- "The *project* attribute of the *flow* '%s' is not "
477
- "a string" % flow_name
478
- )
479
- if "project_branch" in flow:
480
- if is_stringish(flow["project_branch"]):
481
- result["branch"] = flow["project_branch"]
482
- else:
483
- raise MetaflowException(
484
- "The *project_branch* attribute of the *flow* %s "
485
- "is not a string" % flow_name
486
- )
487
- self.triggers.append(result)
488
- else:
489
- raise MetaflowException(
490
- "One or more flows in *flows* attribute in "
491
- "*@trigger_on_finish* decorator have an incorrect type. "
492
- "Supported type is string or Dict[str, str]- \n"
493
- "@trigger_on_finish(flows=['FooFlow', 'BarFlow']"
494
- )
495
- elif callable(self.attributes["flows"]) and not isinstance(
496
- self.attributes["flows"], DeployTimeField
497
- ):
498
- trig = DeployTimeField(
499
- "flows", list, None, self.attributes["flows"], False
500
- )
412
+ flows = self.attributes["flows"]
413
+ if callable(flows) and not isinstance(flows, DeployTimeField):
414
+ trig = DeployTimeField("flows", list, None, flows, False)
501
415
  self.triggers.append(trig)
416
+ elif isinstance(flows, list):
417
+ self.triggers.extend(self._parse_static_triggers(flows))
502
418
  else:
503
419
  raise MetaflowException(
504
420
  "Incorrect type for *flows* attribute in *@trigger_on_finish* "
@@ -515,37 +431,48 @@ class TriggerOnFinishDecorator(FlowDecorator):
515
431
  for trigger in self.triggers:
516
432
  if isinstance(trigger, DeployTimeField):
517
433
  continue
518
- if trigger["fq_name"].count(".") == 0:
519
- # fully qualified name is just the flow name
520
- trigger["flow"] = trigger["fq_name"]
521
- elif trigger["fq_name"].count(".") >= 2:
522
- # fully qualified name is of the format - project.branch.flow_name
523
- trigger["project"], tail = trigger["fq_name"].split(".", maxsplit=1)
524
- trigger["branch"], trigger["flow"] = tail.rsplit(".", maxsplit=1)
525
- else:
526
- raise MetaflowException(
527
- "Incorrect format for *flow* in *@trigger_on_finish* "
528
- "decorator. Specify either just the *flow_name* or a fully "
529
- "qualified name like *project_name.branch_name.flow_name*."
530
- )
531
- # TODO: Also sanity check project and branch names
532
- if not re.match(r"^[A-Za-z0-9_]+$", trigger["flow"]):
533
- raise MetaflowException(
534
- "Invalid flow name *%s* in *@trigger_on_finish* "
535
- "decorator. Only alphanumeric characters and "
536
- "underscores(_) are allowed." % trigger["flow"]
537
- )
434
+ self._parse_fq_name(trigger)
538
435
 
539
436
  self.options = self.attributes["options"]
540
437
 
541
438
  # Handle scenario for local testing using --trigger.
439
+
440
+ # Re-enable this code if you want to support passing trigger directly in the
441
+ # decorator in a way similar to how production and branch are passed in the
442
+ # project decorator.
443
+
444
+ # # This is overkill since default is None for all options but adding this code
445
+ # # to make it safe if other non None-default options are added in the future.
446
+ # for op in options:
447
+ # if (
448
+ # op in self._user_defined_attributes
449
+ # and options[op] != self.defaults[op]
450
+ # and self.attributes[op] != options[op]
451
+ # ):
452
+ # # Exception if:
453
+ # # - the user provides a value in the attributes field
454
+ # # - AND the user provided a value in the command line (non default)
455
+ # # - AND the values are different
456
+ # # Note that this won't raise an error if the user provided the default
457
+ # # value in the command line and provided one in attribute but although
458
+ # # slightly inconsistent, it is not incorrect.
459
+ # raise MetaflowException(
460
+ # "You cannot pass %s as both a command-line argument and an attribute "
461
+ # "of the @trigger_on_finish decorator." % op
462
+ # )
463
+
464
+ # if "trigger" in self._user_defined_attributes:
465
+ # trigger_option = self.attributes["trigger"]
466
+ # else:
467
+ trigger_option = options["trigger"]
468
+
542
469
  self._option_values = options
543
- if options["trigger"]:
470
+ if trigger_option:
544
471
  from metaflow import Run
545
472
  from metaflow.events import Trigger
546
473
 
547
474
  run_objs = []
548
- for run_pathspec in options["trigger"]:
475
+ for run_pathspec in trigger_option:
549
476
  if len(run_pathspec.split("/")) != 2:
550
477
  raise MetaflowException(
551
478
  "Incorrect format for run pathspec for *--trigger*. "
@@ -559,9 +486,67 @@ class TriggerOnFinishDecorator(FlowDecorator):
559
486
  run_objs.append(run_obj)
560
487
  current._update_env({"trigger": Trigger.from_runs(run_objs)})
561
488
 
489
+ @staticmethod
490
+ def _parse_static_triggers(flows):
491
+ results = []
492
+ for flow in flows:
493
+ if is_stringish(flow):
494
+ results.append(
495
+ {
496
+ "fq_name": flow,
497
+ }
498
+ )
499
+ elif isinstance(flow, dict):
500
+ if "name" not in flow:
501
+ if len(flows) > 1:
502
+ raise MetaflowException(
503
+ "One or more flows in the *flows* attribute for "
504
+ "*@trigger_on_finish* is missing the "
505
+ "*name* key."
506
+ )
507
+ raise MetaflowException(
508
+ "The *flow* attribute for *@trigger_on_finish* is missing the "
509
+ "*name* key."
510
+ )
511
+ flow_name = flow["name"]
512
+
513
+ if not is_stringish(flow_name) or "." in flow_name:
514
+ raise MetaflowException(
515
+ f"The *name* attribute of the *flow* {flow_name} is not a valid string"
516
+ )
517
+ result = {"fq_name": flow_name}
518
+ if "project" in flow:
519
+ if is_stringish(flow["project"]):
520
+ result["project"] = flow["project"]
521
+ else:
522
+ raise MetaflowException(
523
+ f"The *project* attribute of the *flow* {flow_name} is not a string"
524
+ )
525
+ if "project_branch" in flow:
526
+ if is_stringish(flow["project_branch"]):
527
+ result["branch"] = flow["project_branch"]
528
+ else:
529
+ raise MetaflowException(
530
+ f"The *project_branch* attribute of the *flow* {flow_name} is not a string"
531
+ )
532
+ results.append(result)
533
+ else:
534
+ if len(flows) > 1:
535
+ raise MetaflowException(
536
+ "One or more flows in the *flows* attribute for "
537
+ "*@trigger_on_finish* decorator have an incorrect type. "
538
+ "Supported type is string or Dict[str, str]- \n"
539
+ "@trigger_on_finish(flows=['FooFlow', 'BarFlow']"
540
+ )
541
+ raise MetaflowException(
542
+ "Incorrect type for *flow* attribute in *@trigger_on_finish* "
543
+ " decorator. Supported type is string or Dict[str, str] - \n"
544
+ "@trigger_on_finish(flow='FooFlow') or "
545
+ "@trigger_on_finish(flow={'name':'FooFlow', 'project_branch': 'branch'})"
546
+ )
547
+ return results
548
+
562
549
  def _parse_fq_name(self, trigger):
563
- if isinstance(trigger, DeployTimeField):
564
- trigger["fq_name"] = deploy_time_eval(trigger["fq_name"])
565
550
  if trigger["fq_name"].count(".") == 0:
566
551
  # fully qualified name is just the flow name
567
552
  trigger["flow"] = trigger["fq_name"]
@@ -581,32 +566,18 @@ class TriggerOnFinishDecorator(FlowDecorator):
581
566
  "decorator. Only alphanumeric characters and "
582
567
  "underscores(_) are allowed." % trigger["flow"]
583
568
  )
584
- return trigger
585
569
 
586
570
  def format_deploytime_value(self):
587
- for trigger in self.triggers:
588
- # Case were trigger is a function that returns a list
589
- # Need to do this bc we need to iterate over list and process
590
- if isinstance(trigger, DeployTimeField):
591
- deploy_value = deploy_time_eval(trigger)
592
- if isinstance(deploy_value, list):
593
- self.triggers = deploy_value
571
+ if len(self.triggers) == 1 and isinstance(self.triggers[0], DeployTimeField):
572
+ deploy_value = deploy_time_eval(self.triggers[0])
573
+ if isinstance(deploy_value, list):
574
+ self.triggers = deploy_value
594
575
  else:
595
- break
596
- for trigger in self.triggers:
597
- # Entire trigger is a function (returns either string or dict)
598
- old_trig = trigger
599
- if isinstance(trigger, DeployTimeField):
600
- trigger = deploy_time_eval(trigger)
601
- if isinstance(trigger, dict):
602
- trigger["fq_name"] = trigger.get("name")
603
- trigger["project"] = trigger.get("project")
604
- trigger["branch"] = trigger.get("project_branch")
605
- # We also added this bc it won't be formatted yet
606
- if isinstance(trigger, str):
607
- trigger = {"fq_name": trigger}
608
- trigger = self._parse_fq_name(trigger)
609
- self.triggers[self.triggers.index(old_trig)] = trigger
576
+ self.triggers = [deploy_value]
577
+ triggers = self._parse_static_triggers(self.triggers)
578
+ for trigger in triggers:
579
+ self._parse_fq_name(trigger)
580
+ self.triggers = triggers
610
581
 
611
582
  def get_top_level_options(self):
612
583
  return list(self._option_values.items())
@@ -685,15 +685,6 @@ class Kubernetes(object):
685
685
  for name, value in system_annotations.items():
686
686
  job.annotation(name, value)
687
687
 
688
- (
689
- job.annotation("metaflow/run_id", run_id)
690
- .annotation("metaflow/step_name", step_name)
691
- .annotation("metaflow/task_id", task_id)
692
- .annotation("metaflow/attempt", attempt)
693
- .label("app.kubernetes.io/name", "metaflow-task")
694
- .label("app.kubernetes.io/part-of", "metaflow")
695
- )
696
-
697
688
  return job
698
689
 
699
690
  def create_k8sjob(self, job):
@@ -190,7 +190,7 @@ def step(
190
190
  executable = ctx.obj.environment.executable(step_name, executable)
191
191
 
192
192
  # Set environment
193
- env = {}
193
+ env = {"METAFLOW_FLOW_FILENAME": os.path.basename(sys.argv[0])}
194
194
  env_deco = [deco for deco in node.decorators if deco.name == "environment"]
195
195
  if env_deco:
196
196
  env = env_deco[0].attributes["vars"]