ob-metaflow 2.15.15.1__tar.gz → 2.15.18.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 (407) hide show
  1. {ob_metaflow-2.15.15.1/ob_metaflow.egg-info → ob_metaflow-2.15.18.1}/PKG-INFO +2 -2
  2. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cli.py +14 -2
  3. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cli_components/run_cmds.py +1 -1
  4. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cmd/develop/stub_generator.py +30 -16
  5. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/flowspec.py +16 -4
  6. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/metaflow_config.py +2 -2
  7. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/argo/argo_workflows.py +7 -0
  8. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/argo/argo_workflows_deployer_objects.py +6 -49
  9. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/aws_client.py +6 -0
  10. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_datastore.py +8 -36
  11. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/datatools/s3/s3op.py +1 -1
  12. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/kubernetes/kubernetes.py +4 -0
  13. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/kubernetes/kubernetes_cli.py +8 -0
  14. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/kubernetes/kubernetes_decorator.py +11 -0
  15. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/kubernetes/kubernetes_job.py +4 -2
  16. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +5 -2
  17. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/metadata_providers/service.py +12 -8
  18. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/pypi/conda_environment.py +8 -4
  19. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/pypi/micromamba.py +9 -1
  20. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/runner/deployer.py +49 -0
  21. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/user_configs/config_decorators.py +1 -1
  22. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/user_configs/config_options.py +6 -2
  23. ob_metaflow-2.15.18.1/metaflow/version.py +1 -0
  24. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1/ob_metaflow.egg-info}/PKG-INFO +2 -2
  25. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/ob_metaflow.egg-info/requires.txt +1 -1
  26. ob_metaflow-2.15.15.1/metaflow/version.py +0 -1
  27. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/LICENSE +0 -0
  28. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/MANIFEST.in +0 -0
  29. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/README.md +0 -0
  30. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/devtools/Makefile +0 -0
  31. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/devtools/Tiltfile +0 -0
  32. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/devtools/pick_services.sh +0 -0
  33. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/R.py +0 -0
  34. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/__init__.py +0 -0
  35. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/__init__.py +0 -0
  36. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/click/__init__.py +0 -0
  37. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  38. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/click/_compat.py +0 -0
  39. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/click/_termui_impl.py +0 -0
  40. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/click/_textwrap.py +0 -0
  41. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/click/_unicodefun.py +0 -0
  42. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/click/_winconsole.py +0 -0
  43. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/click/core.py +0 -0
  44. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/click/decorators.py +0 -0
  45. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/click/exceptions.py +0 -0
  46. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/click/formatting.py +0 -0
  47. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/click/globals.py +0 -0
  48. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/click/parser.py +0 -0
  49. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/click/termui.py +0 -0
  50. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/click/testing.py +0 -0
  51. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/click/types.py +0 -0
  52. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/click/utils.py +0 -0
  53. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
  54. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
  55. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
  56. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
  57. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
  58. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
  59. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
  60. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
  61. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
  62. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/packaging/__init__.py +0 -0
  63. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/packaging/_elffile.py +0 -0
  64. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  65. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  66. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/packaging/_parser.py +0 -0
  67. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/packaging/_structures.py +0 -0
  68. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  69. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/packaging/markers.py +0 -0
  70. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/packaging/py.typed +0 -0
  71. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/packaging/requirements.py +0 -0
  72. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/packaging/specifiers.py +0 -0
  73. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/packaging/tags.py +0 -0
  74. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/packaging/utils.py +0 -0
  75. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/packaging/version.py +0 -0
  76. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/typeguard/__init__.py +0 -0
  77. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/typeguard/_checkers.py +0 -0
  78. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/typeguard/_config.py +0 -0
  79. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/typeguard/_decorators.py +0 -0
  80. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
  81. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/typeguard/_functions.py +0 -0
  82. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/typeguard/_importhook.py +0 -0
  83. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/typeguard/_memo.py +0 -0
  84. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
  85. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/typeguard/_suppression.py +0 -0
  86. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/typeguard/_transformer.py +0 -0
  87. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
  88. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/typeguard/_utils.py +0 -0
  89. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/typeguard/py.typed +0 -0
  90. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/typing_extensions.py +0 -0
  91. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_6/__init__.py +0 -0
  92. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  93. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  94. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  95. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  96. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  97. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  98. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  99. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  100. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  101. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  102. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_6/zipp.py +0 -0
  103. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/__init__.py +0 -0
  104. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/importlib_metadata/__init__.py +0 -0
  105. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/importlib_metadata/_adapters.py +0 -0
  106. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/importlib_metadata/_collections.py +0 -0
  107. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/importlib_metadata/_compat.py +0 -0
  108. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/importlib_metadata/_functools.py +0 -0
  109. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/importlib_metadata/_itertools.py +0 -0
  110. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/importlib_metadata/_meta.py +0 -0
  111. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/importlib_metadata/_text.py +0 -0
  112. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/importlib_metadata/py.typed +0 -0
  113. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/typeguard/__init__.py +0 -0
  114. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/typeguard/_checkers.py +0 -0
  115. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/typeguard/_config.py +0 -0
  116. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/typeguard/_decorators.py +0 -0
  117. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/typeguard/_exceptions.py +0 -0
  118. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/typeguard/_functions.py +0 -0
  119. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/typeguard/_importhook.py +0 -0
  120. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/typeguard/_memo.py +0 -0
  121. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/typeguard/_pytest_plugin.py +0 -0
  122. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/typeguard/_suppression.py +0 -0
  123. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/typeguard/_transformer.py +0 -0
  124. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/typeguard/_union_transformer.py +0 -0
  125. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/typeguard/_utils.py +0 -0
  126. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/typeguard/py.typed +0 -0
  127. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/typing_extensions.py +0 -0
  128. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/v3_7/zipp.py +0 -0
  129. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/_vendor/zipp.py +0 -0
  130. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cards.py +0 -0
  131. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cli_args.py +0 -0
  132. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cli_components/__init__.py +0 -0
  133. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cli_components/dump_cmd.py +0 -0
  134. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cli_components/init_cmd.py +0 -0
  135. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cli_components/step_cmd.py +0 -0
  136. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cli_components/utils.py +0 -0
  137. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/client/__init__.py +0 -0
  138. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/client/core.py +0 -0
  139. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/client/filecache.py +0 -0
  140. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/clone_util.py +0 -0
  141. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cmd/__init__.py +0 -0
  142. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cmd/code/__init__.py +0 -0
  143. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cmd/configure_cmd.py +0 -0
  144. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cmd/develop/__init__.py +0 -0
  145. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cmd/develop/stubs.py +0 -0
  146. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cmd/main_cli.py +0 -0
  147. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cmd/make_wrapper.py +0 -0
  148. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cmd/tutorials_cmd.py +0 -0
  149. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cmd/util.py +0 -0
  150. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/cmd_with_io.py +0 -0
  151. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/datastore/__init__.py +0 -0
  152. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/datastore/content_addressed_store.py +0 -0
  153. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/datastore/datastore_set.py +0 -0
  154. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/datastore/datastore_storage.py +0 -0
  155. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/datastore/exceptions.py +0 -0
  156. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/datastore/flow_datastore.py +0 -0
  157. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/datastore/inputs.py +0 -0
  158. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/datastore/task_datastore.py +0 -0
  159. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/debug.py +0 -0
  160. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/decorators.py +0 -0
  161. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/event_logger.py +0 -0
  162. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/events.py +0 -0
  163. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/exception.py +0 -0
  164. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/extension_support/__init__.py +0 -0
  165. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/extension_support/_empty_file.py +0 -0
  166. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/extension_support/cmd.py +0 -0
  167. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/extension_support/integrations.py +0 -0
  168. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/extension_support/plugins.py +0 -0
  169. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/graph.py +0 -0
  170. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/includefile.py +0 -0
  171. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/info_file.py +0 -0
  172. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/integrations.py +0 -0
  173. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/lint.py +0 -0
  174. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/metadata_provider/__init__.py +0 -0
  175. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/metadata_provider/heartbeat.py +0 -0
  176. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/metadata_provider/metadata.py +0 -0
  177. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/metadata_provider/util.py +0 -0
  178. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/metaflow_config_funcs.py +0 -0
  179. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/metaflow_current.py +0 -0
  180. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/metaflow_environment.py +0 -0
  181. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/metaflow_git.py +0 -0
  182. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/metaflow_profile.py +0 -0
  183. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/metaflow_version.py +0 -0
  184. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/mflog/__init__.py +0 -0
  185. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/mflog/mflog.py +0 -0
  186. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/mflog/save_logs.py +0 -0
  187. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/mflog/save_logs_periodically.py +0 -0
  188. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/mflog/tee.py +0 -0
  189. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/monitor.py +0 -0
  190. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/multicore_utils.py +0 -0
  191. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/package.py +0 -0
  192. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/parameters.py +0 -0
  193. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/__init__.py +0 -0
  194. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/airflow/__init__.py +0 -0
  195. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/airflow/airflow.py +0 -0
  196. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  197. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  198. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  199. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/airflow/dag.py +0 -0
  200. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/airflow/exception.py +0 -0
  201. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  202. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  203. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  204. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
  205. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
  206. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
  207. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/argo/__init__.py +0 -0
  208. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/argo/argo_client.py +0 -0
  209. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/argo/argo_events.py +0 -0
  210. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/argo/argo_workflows_cli.py +0 -0
  211. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  212. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
  213. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/argo/capture_error.py +0 -0
  214. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/argo/generate_input_paths.py +0 -0
  215. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
  216. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/__init__.py +0 -0
  217. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/aws_utils.py +0 -0
  218. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/batch/__init__.py +0 -0
  219. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/batch/batch.py +0 -0
  220. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  221. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  222. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
  223. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  224. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  225. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  226. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  227. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  228. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  229. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  230. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  231. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
  232. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
  233. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  234. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  235. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
  236. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +0 -0
  237. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/azure/__init__.py +0 -0
  238. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/azure/azure_credential.py +0 -0
  239. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  240. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
  241. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/azure/azure_tail.py +0 -0
  242. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/azure/azure_utils.py +0 -0
  243. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  244. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/azure/includefile_support.py +0 -0
  245. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/__init__.py +0 -0
  246. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_cli.py +0 -0
  247. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_client.py +0 -0
  248. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_creator.py +0 -0
  249. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_decorator.py +0 -0
  250. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  251. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_modules/base.html +0 -0
  252. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_modules/basic.py +0 -0
  253. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
  254. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_modules/card.py +0 -0
  255. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  256. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  257. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  258. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  259. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  260. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_modules/components.py +0 -0
  261. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  262. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_modules/main.js +0 -0
  263. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  264. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  265. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_resolver.py +0 -0
  266. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_server.py +0 -0
  267. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
  268. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/component_serializer.py +0 -0
  269. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/cards/exception.py +0 -0
  270. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/catch_decorator.py +0 -0
  271. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/datastores/__init__.py +0 -0
  272. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/datastores/azure_storage.py +0 -0
  273. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/datastores/gs_storage.py +0 -0
  274. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/datastores/local_storage.py +0 -0
  275. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/datastores/s3_storage.py +0 -0
  276. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/datatools/__init__.py +0 -0
  277. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/datatools/local.py +0 -0
  278. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  279. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/datatools/s3/s3.py +0 -0
  280. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  281. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  282. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/debug_logger.py +0 -0
  283. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/debug_monitor.py +0 -0
  284. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/__init__.py +0 -0
  285. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/client.py +0 -0
  286. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/client_modules.py +0 -0
  287. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  288. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  289. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  290. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  291. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  292. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  293. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  294. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  295. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  296. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  297. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/consts.py +0 -0
  298. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  299. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  300. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  301. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/server.py +0 -0
  302. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/stub.py +0 -0
  303. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/env_escape/utils.py +0 -0
  304. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/environment_decorator.py +0 -0
  305. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/events_decorator.py +0 -0
  306. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/frameworks/__init__.py +0 -0
  307. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/frameworks/pytorch.py +0 -0
  308. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/gcp/__init__.py +0 -0
  309. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
  310. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  311. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  312. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/gcp/gs_tail.py +0 -0
  313. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/gcp/gs_utils.py +0 -0
  314. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/gcp/includefile_support.py +0 -0
  315. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/kubernetes/__init__.py +0 -0
  316. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
  317. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
  318. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/kubernetes/spot_metadata_cli.py +0 -0
  319. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/kubernetes/spot_monitor_sidecar.py +0 -0
  320. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/logs_cli.py +0 -0
  321. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/metadata_providers/__init__.py +0 -0
  322. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/metadata_providers/local.py +0 -0
  323. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/package_cli.py +0 -0
  324. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/parallel_decorator.py +0 -0
  325. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/project_decorator.py +0 -0
  326. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/pypi/__init__.py +0 -0
  327. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/pypi/bootstrap.py +0 -0
  328. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/pypi/conda_decorator.py +0 -0
  329. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/pypi/parsers.py +0 -0
  330. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/pypi/pip.py +0 -0
  331. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
  332. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  333. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/pypi/utils.py +0 -0
  334. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/resources_decorator.py +0 -0
  335. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/retry_decorator.py +0 -0
  336. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/secrets/__init__.py +0 -0
  337. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  338. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  339. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/storage_executor.py +0 -0
  340. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/tag_cli.py +0 -0
  341. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  342. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/timeout_decorator.py +0 -0
  343. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/uv/__init__.py +0 -0
  344. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/uv/bootstrap.py +0 -0
  345. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/plugins/uv/uv_environment.py +0 -0
  346. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/procpoll.py +0 -0
  347. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/py.typed +0 -0
  348. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/pylint_wrapper.py +0 -0
  349. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/runner/__init__.py +0 -0
  350. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/runner/click_api.py +0 -0
  351. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/runner/deployer_impl.py +0 -0
  352. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/runner/metaflow_runner.py +0 -0
  353. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/runner/nbdeploy.py +0 -0
  354. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/runner/nbrun.py +0 -0
  355. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/runner/subprocess_manager.py +0 -0
  356. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/runner/utils.py +0 -0
  357. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/runtime.py +0 -0
  358. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/sidecar/__init__.py +0 -0
  359. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/sidecar/sidecar.py +0 -0
  360. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/sidecar/sidecar_messages.py +0 -0
  361. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  362. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/sidecar/sidecar_worker.py +0 -0
  363. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/system/__init__.py +0 -0
  364. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/system/system_logger.py +0 -0
  365. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/system/system_monitor.py +0 -0
  366. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/system/system_utils.py +0 -0
  367. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tagging_util.py +0 -0
  368. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/task.py +0 -0
  369. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tracing/__init__.py +0 -0
  370. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tracing/propagator.py +0 -0
  371. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tracing/span_exporter.py +0 -0
  372. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tracing/tracing_modules.py +0 -0
  373. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tuple_util.py +0 -0
  374. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/00-helloworld/README.md +0 -0
  375. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  376. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/01-playlist/README.md +0 -0
  377. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  378. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  379. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  380. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/02-statistics/README.md +0 -0
  381. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  382. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  383. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/02-statistics/stats.py +0 -0
  384. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  385. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  386. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  387. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  388. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  389. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  390. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  391. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  392. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  393. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/07-worldview/README.md +0 -0
  394. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  395. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/08-autopilot/README.md +0 -0
  396. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  397. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/unbounded_foreach.py +0 -0
  398. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/user_configs/__init__.py +0 -0
  399. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/user_configs/config_parameters.py +0 -0
  400. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/util.py +0 -0
  401. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/metaflow/vendor.py +0 -0
  402. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/ob_metaflow.egg-info/SOURCES.txt +0 -0
  403. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/ob_metaflow.egg-info/dependency_links.txt +0 -0
  404. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/ob_metaflow.egg-info/entry_points.txt +0 -0
  405. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/ob_metaflow.egg-info/top_level.txt +0 -0
  406. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/setup.cfg +0 -0
  407. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.18.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ob-metaflow
3
- Version: 2.15.15.1
3
+ Version: 2.15.18.1
4
4
  Summary: Metaflow: More AI and ML, 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.15.15.1; extra == "stubs"
15
+ Requires-Dist: metaflow-stubs==2.15.18.1; extra == "stubs"
16
16
  Dynamic: author
17
17
  Dynamic: author-email
18
18
  Dynamic: description
@@ -1,5 +1,6 @@
1
1
  import functools
2
2
  import inspect
3
+ import os
3
4
  import sys
4
5
  import traceback
5
6
  from datetime import datetime
@@ -242,6 +243,14 @@ def version(obj):
242
243
  type=click.Choice(["local"] + [m.TYPE for m in ENVIRONMENTS]),
243
244
  help="Execution environment type",
244
245
  )
246
+ @click.option(
247
+ "--force-rebuild-environments/--no-force-rebuild-environments",
248
+ is_flag=True,
249
+ default=False,
250
+ hidden=True,
251
+ type=bool,
252
+ help="Explicitly rebuild the execution environments",
253
+ )
245
254
  # See comment for --quiet
246
255
  @click.option(
247
256
  "--datastore",
@@ -300,6 +309,7 @@ def start(
300
309
  quiet=False,
301
310
  metadata=None,
302
311
  environment=None,
312
+ force_rebuild_environments=False,
303
313
  datastore=None,
304
314
  datastore_root=None,
305
315
  decospecs=None,
@@ -435,6 +445,8 @@ def start(
435
445
  ctx.obj.environment = [
436
446
  e for e in ENVIRONMENTS + [MetaflowEnvironment] if e.TYPE == environment
437
447
  ][0](ctx.obj.flow)
448
+ # set force rebuild flag for environments that support it.
449
+ ctx.obj.environment._force_rebuild = force_rebuild_environments
438
450
  ctx.obj.environment.validate_environment(ctx.obj.logger, datastore)
439
451
 
440
452
  ctx.obj.event_logger = LOGGING_SIDECARS[event_logger](
@@ -496,7 +508,7 @@ def start(
496
508
  ctx.obj.echo,
497
509
  ctx.obj.flow_datastore,
498
510
  {
499
- k: ConfigValue(v)
511
+ k: ConfigValue(v) if v is not None else None
500
512
  for k, v in ctx.obj.flow.__class__._flow_state.get(
501
513
  _FlowState.CONFIGS, {}
502
514
  ).items()
@@ -524,7 +536,7 @@ def start(
524
536
  decorators._attach_decorators(ctx.obj.flow, all_decospecs)
525
537
  decorators._init(ctx.obj.flow)
526
538
  # Regenerate graph if we attached more decorators
527
- ctx.obj.flow.__class__._init_attrs()
539
+ ctx.obj.flow.__class__._init_graph()
528
540
  ctx.obj.graph = ctx.obj.flow._graph
529
541
 
530
542
  decorators._init_step_decorators(
@@ -45,7 +45,7 @@ def before_run(obj, tags, decospecs):
45
45
  decorators._attach_decorators(obj.flow, all_decospecs)
46
46
  decorators._init(obj.flow)
47
47
  # Regenerate graph if we attached more decorators
48
- obj.flow.__class__._init_attrs()
48
+ obj.flow.__class__._init_graph()
49
49
  obj.graph = obj.flow._graph
50
50
 
51
51
  obj.check(obj.graph, obj.flow, obj.environment, pylint=obj.pylint)
@@ -488,9 +488,6 @@ class StubGenerator:
488
488
  self._imports.add(name)
489
489
 
490
490
  def _add_to_typing_check(name, is_module=False):
491
- # if name != self._current_module_name:
492
- # self._typing_imports.add(name)
493
- #
494
491
  if name == "None":
495
492
  return
496
493
  if is_module:
@@ -504,6 +501,24 @@ class StubGenerator:
504
501
  # the current file
505
502
  self._typing_imports.add(splits[0])
506
503
 
504
+ def _format_qualified_class_name(cls: type) -> str:
505
+ """Helper to format a class with its qualified module name"""
506
+ # Special case for NoneType - return None
507
+ if cls.__name__ == "NoneType":
508
+ return "None"
509
+
510
+ module = inspect.getmodule(cls)
511
+ if (
512
+ module
513
+ and module.__name__ != "builtins"
514
+ and module.__name__ != "__main__"
515
+ ):
516
+ module_name = self._get_module_name_alias(module.__name__)
517
+ _add_to_typing_check(module_name, is_module=True)
518
+ return f"{module_name}.{cls.__name__}"
519
+ else:
520
+ return cls.__name__
521
+
507
522
  if isinstance(element, str):
508
523
  # Special case for self referential things (particularly in a class)
509
524
  if element == self._current_name:
@@ -557,19 +572,15 @@ class StubGenerator:
557
572
  return element.__name__
558
573
  elif isinstance(element, type(Ellipsis)):
559
574
  return "..."
560
- # elif (
561
- # isinstance(element, typing._GenericAlias)
562
- # and hasattr(element, "_name")
563
- # and element._name in ("List", "Tuple", "Dict", "Set")
564
- # ):
565
- # # 3.7 has these as _GenericAlias but they don't behave like the ones in 3.10
566
- # _add_to_import("typing")
567
- # return str(element)
568
575
  elif isinstance(element, typing._GenericAlias):
569
576
  # We need to check things recursively in __args__ if it exists
570
577
  args_str = []
571
578
  for arg in getattr(element, "__args__", []):
572
- args_str.append(self._get_element_name_with_module(arg))
579
+ # Special handling for class objects in type arguments
580
+ if isinstance(arg, type):
581
+ args_str.append(_format_qualified_class_name(arg))
582
+ else:
583
+ args_str.append(self._get_element_name_with_module(arg))
573
584
 
574
585
  _add_to_import("typing")
575
586
  if element._name:
@@ -584,12 +595,15 @@ class StubGenerator:
584
595
  args_str = [call_args, args_str[-1]]
585
596
  return "typing.%s[%s]" % (element._name, ", ".join(args_str))
586
597
  else:
587
- return "%s[%s]" % (element.__origin__, ", ".join(args_str))
598
+ # Handle the case where we have a generic type without a _name
599
+ origin = element.__origin__
600
+ if isinstance(origin, type):
601
+ origin_str = _format_qualified_class_name(origin)
602
+ else:
603
+ origin_str = str(origin)
604
+ return "%s[%s]" % (origin_str, ", ".join(args_str))
588
605
  elif isinstance(element, ForwardRef):
589
606
  f_arg = self._get_module_name_alias(element.__forward_arg__)
590
- # if f_arg in ("Run", "Task"): # HACK -- forward references in current.py
591
- # _add_to_import("metaflow")
592
- # f_arg = "metaflow.%s" % f_arg
593
607
  _add_to_typing_check(f_arg)
594
608
  return '"%s"' % f_arg
595
609
  elif inspect.getmodule(element) == inspect.getmodule(typing):
@@ -87,6 +87,9 @@ class FlowSpecMeta(type):
87
87
  if name == "FlowSpec":
88
88
  return
89
89
 
90
+ cls._init_attrs()
91
+
92
+ def _init_attrs(cls):
90
93
  from .decorators import (
91
94
  DuplicateFlowDecoratorException,
92
95
  ) # Prevent circular import
@@ -103,6 +106,12 @@ class FlowSpecMeta(type):
103
106
  # Keys are _FlowState enum values
104
107
  cls._flow_state = {}
105
108
 
109
+ # Keep track if configs have been processed -- this is particularly applicable
110
+ # for the Runner/Deployer where calling multiple APIs on the same flow could
111
+ # cause the configs to be processed multiple times. For a given flow, once
112
+ # the configs have been processed, we do not process them again.
113
+ cls._configs_processed = False
114
+
106
115
  # We inherit stuff from our parent classes as well -- we need to be careful
107
116
  # in terms of the order; we will follow the MRO with the following rules:
108
117
  # - decorators (cls._flow_decorators) will cause an error if they do not
@@ -127,10 +136,9 @@ class FlowSpecMeta(type):
127
136
  cls._flow_state.setdefault(_FlowState.CONFIG_DECORATORS, []).extend(
128
137
  base_configs
129
138
  )
139
+ cls._init_graph()
130
140
 
131
- cls._init_attrs()
132
-
133
- def _init_attrs(cls):
141
+ def _init_graph(cls):
134
142
  # Graph and steps are specific to the class -- store here so we can access
135
143
  # in class method _process_config_decorators
136
144
  cls._graph = FlowGraph(cls)
@@ -225,6 +233,10 @@ class FlowSpec(metaclass=FlowSpecMeta):
225
233
  @classmethod
226
234
  def _process_config_decorators(cls, config_options, process_configs=True):
227
235
 
236
+ if cls._configs_processed:
237
+ return None
238
+ cls._configs_processed = True
239
+
228
240
  # Fast path for no user configurations
229
241
  if not process_configs or (
230
242
  not cls._flow_state.get(_FlowState.CONFIG_DECORATORS)
@@ -325,7 +337,7 @@ class FlowSpec(metaclass=FlowSpecMeta):
325
337
  parameters.replace_flow_context(cls)
326
338
 
327
339
  # Re-calculate class level attributes after modifying the class
328
- cls._init_attrs()
340
+ cls._init_graph()
329
341
  return cls
330
342
 
331
343
  def _set_constants(self, graph, kwargs, config_options):
@@ -214,8 +214,6 @@ CARD_GSROOT = from_conf(
214
214
  )
215
215
  CARD_NO_WARNING = from_conf("CARD_NO_WARNING", False)
216
216
 
217
- SKIP_CARD_DUALWRITE = from_conf("SKIP_CARD_DUALWRITE", False)
218
-
219
217
  RUNTIME_CARD_RENDER_INTERVAL = from_conf("RUNTIME_CARD_RENDER_INTERVAL", 60)
220
218
 
221
219
  # Azure storage account URL
@@ -371,6 +369,8 @@ KUBERNETES_CONTAINER_IMAGE = from_conf(
371
369
  )
372
370
  # Image pull policy for container images
373
371
  KUBERNETES_IMAGE_PULL_POLICY = from_conf("KUBERNETES_IMAGE_PULL_POLICY", None)
372
+ # Image pull secrets for container images
373
+ KUBERNETES_IMAGE_PULL_SECRETS = from_conf("KUBERNETES_IMAGE_PULL_SECRETS", "")
374
374
  # Default container registry for K8S
375
375
  KUBERNETES_CONTAINER_REGISTRY = from_conf(
376
376
  "KUBERNETES_CONTAINER_REGISTRY", DEFAULT_CONTAINER_REGISTRY
@@ -2021,6 +2021,7 @@ class ArgoWorkflows(object):
2021
2021
  namespace=resources["namespace"],
2022
2022
  image=resources["image"],
2023
2023
  image_pull_policy=resources["image_pull_policy"],
2024
+ image_pull_secrets=resources["image_pull_secrets"],
2024
2025
  service_account=resources["service_account"],
2025
2026
  secrets=(
2026
2027
  [
@@ -2209,6 +2210,8 @@ class ArgoWorkflows(object):
2209
2210
  .node_selectors(resources.get("node_selector"))
2210
2211
  # Set tolerations
2211
2212
  .tolerations(resources.get("tolerations"))
2213
+ # Set image pull secrets
2214
+ .image_pull_secrets(resources.get("image_pull_secrets"))
2212
2215
  # Set container
2213
2216
  .container(
2214
2217
  # TODO: Unify the logic with kubernetes.py
@@ -3785,6 +3788,10 @@ class Template(object):
3785
3788
  self.payload["tolerations"] = tolerations
3786
3789
  return self
3787
3790
 
3791
+ def image_pull_secrets(self, image_pull_secrets):
3792
+ self.payload["image_pull_secrets"] = image_pull_secrets
3793
+ return self
3794
+
3788
3795
  def to_json(self):
3789
3796
  return self.payload
3790
3797
 
@@ -9,59 +9,16 @@ from metaflow.exception import MetaflowException
9
9
  from metaflow.plugins.argo.argo_client import ArgoClient
10
10
  from metaflow.metaflow_config import KUBERNETES_NAMESPACE
11
11
  from metaflow.plugins.argo.argo_workflows import ArgoWorkflows
12
- from metaflow.runner.deployer import Deployer, DeployedFlow, TriggeredRun
12
+ from metaflow.runner.deployer import (
13
+ Deployer,
14
+ DeployedFlow,
15
+ TriggeredRun,
16
+ generate_fake_flow_file_contents,
17
+ )
13
18
 
14
19
  from metaflow.runner.utils import get_lower_level_group, handle_timeout, temporary_fifo
15
20
 
16
21
 
17
- def generate_fake_flow_file_contents(
18
- flow_name: str, param_info: dict, project_name: Optional[str] = None
19
- ):
20
- params_code = ""
21
- for _, param_details in param_info.items():
22
- param_python_var_name = param_details["python_var_name"]
23
- param_name = param_details["name"]
24
- param_type = param_details["type"]
25
- param_help = param_details["description"]
26
- param_required = param_details["is_required"]
27
-
28
- if param_type == "JSON":
29
- params_code += (
30
- f" {param_python_var_name} = Parameter('{param_name}', "
31
- f"type=JSONType, help='''{param_help}''', required={param_required})\n"
32
- )
33
- elif param_type == "FilePath":
34
- is_text = param_details.get("is_text", True)
35
- encoding = param_details.get("encoding", "utf-8")
36
- params_code += (
37
- f" {param_python_var_name} = IncludeFile('{param_name}', "
38
- f"is_text={is_text}, encoding='{encoding}', help='''{param_help}''', "
39
- f"required={param_required})\n"
40
- )
41
- else:
42
- params_code += (
43
- f" {param_python_var_name} = Parameter('{param_name}', "
44
- f"type={param_type}, help='''{param_help}''', required={param_required})\n"
45
- )
46
-
47
- project_decorator = f"@project(name='{project_name}')\n" if project_name else ""
48
-
49
- contents = f"""\
50
- from metaflow import FlowSpec, Parameter, IncludeFile, JSONType, step, project
51
- {project_decorator}class {flow_name}(FlowSpec):
52
- {params_code}
53
- @step
54
- def start(self):
55
- self.next(self.end)
56
- @step
57
- def end(self):
58
- pass
59
- if __name__ == '__main__':
60
- {flow_name}()
61
- """
62
- return contents
63
-
64
-
65
22
  class ArgoWorkflowsTriggeredRun(TriggeredRun):
66
23
  """
67
24
  A class representing a triggered Argo Workflow execution.
@@ -35,6 +35,12 @@ class Boto3ClientProvider(object):
35
35
  "Could not import module 'boto3'. Install boto3 first."
36
36
  )
37
37
 
38
+ # Convert dictionary config to Config object if needed
39
+ if "config" in client_params and not isinstance(
40
+ client_params["config"], Config
41
+ ):
42
+ client_params["config"] = Config(**client_params["config"])
43
+
38
44
  if module == "s3" and (
39
45
  "config" not in client_params or client_params["config"].retries is None
40
46
  ):
@@ -16,7 +16,6 @@ from metaflow.metaflow_config import (
16
16
  CARD_SUFFIX,
17
17
  CARD_AZUREROOT,
18
18
  CARD_GSROOT,
19
- SKIP_CARD_DUALWRITE,
20
19
  )
21
20
  import metaflow.metaflow_config as metaflow_config
22
21
 
@@ -231,23 +230,6 @@ class CardDatastore(object):
231
230
 
232
231
  def save_card(self, uuid, card_type, card_html, card_id=None, overwrite=True):
233
232
  card_file_name = card_type
234
- # TEMPORARY_WORKAROUND: FIXME (LATER) : Fix the duplication of below block in a few months.
235
- # Check file blame to understand the age of this temporary workaround.
236
-
237
- # This function will end up saving cards at two locations.
238
- # Thereby doubling the number of cards. (Which is a temporary fix)
239
- # Why do this ? :
240
- # When cards were introduced there was an assumption made about task-ids being unique.
241
- # This assumption was incorrect.
242
- # Only the pathspec needs to be unique but there is no such guarantees about task-ids.
243
- # When task-ids are non-unique, card read would result in finding incorrect cards.
244
- # This happens because cards were stored based on task-ids.
245
- # If we immediately switch from storing based on task-ids to a step-name abstraction folder,
246
- # then card reading will crash for many users.
247
- # It would especially happen for users who are accessing cards created by a newer
248
- # MF client from an older version of MF client.
249
- # It will also easily end up breaking the metaflow-ui (which maybe using a client from an older version).
250
- # Hence, we are writing cards to both paths so that we can introduce breaking changes later in the future.
251
233
  card_path_with_steps = self.get_card_location(
252
234
  self._get_card_write_path(),
253
235
  card_file_name,
@@ -255,24 +237,10 @@ class CardDatastore(object):
255
237
  card_id=card_id,
256
238
  suffix=CardNameSuffix.CARD,
257
239
  )
258
- if SKIP_CARD_DUALWRITE:
259
- self._backend.save_bytes(
260
- [(card_path_with_steps, BytesIO(bytes(card_html, "utf-8")))],
261
- overwrite=overwrite,
262
- )
263
- else:
264
- card_path_without_steps = self.get_card_location(
265
- self._get_card_read_path(with_steps=False),
266
- card_file_name,
267
- uuid,
268
- card_id=card_id,
269
- suffix=CardNameSuffix.CARD,
270
- )
271
- for cp in [card_path_with_steps, card_path_without_steps]:
272
- self._backend.save_bytes(
273
- [(cp, BytesIO(bytes(card_html, "utf-8")))], overwrite=overwrite
274
- )
275
-
240
+ self._backend.save_bytes(
241
+ [(card_path_with_steps, BytesIO(bytes(card_html, "utf-8")))],
242
+ overwrite=overwrite,
243
+ )
276
244
  return self.info_from_path(card_path_with_steps, suffix=CardNameSuffix.CARD)
277
245
 
278
246
  def _list_card_paths(self, card_type=None, card_hash=None, card_id=None):
@@ -283,6 +251,10 @@ class CardDatastore(object):
283
251
  )
284
252
 
285
253
  if len(card_paths_with_steps) == 0:
254
+ # The listing logic is reading the cards with steps and without steps
255
+ # because earlier versions of clients (ones that wrote cards before June 2022),
256
+ # would have written cards without steps. So as a fallback we will try to check for the
257
+ # cards without steps.
286
258
  card_paths_without_steps = self._backend.list_content(
287
259
  [self._get_card_read_path(with_steps=False)]
288
260
  )
@@ -131,7 +131,7 @@ def normalize_client_error(err):
131
131
  except ValueError:
132
132
  if error_code in ("AccessDenied", "AllAccessDisabled", "InvalidAccessKeyId"):
133
133
  return 403
134
- if error_code == "NoSuchKey":
134
+ if error_code in ("NoSuchKey", "NoSuchBucket"):
135
135
  return 404
136
136
  if error_code == "InvalidRange":
137
137
  return 416
@@ -170,6 +170,7 @@ class Kubernetes(object):
170
170
  code_package_ds,
171
171
  docker_image,
172
172
  docker_image_pull_policy,
173
+ image_pull_secrets=None,
173
174
  step_cli=None,
174
175
  service_account=None,
175
176
  secrets=None,
@@ -206,6 +207,7 @@ class Kubernetes(object):
206
207
  node_selector=node_selector,
207
208
  image=docker_image,
208
209
  image_pull_policy=docker_image_pull_policy,
210
+ image_pull_secrets=image_pull_secrets,
209
211
  cpu=cpu,
210
212
  memory=memory,
211
213
  disk=disk,
@@ -483,6 +485,7 @@ class Kubernetes(object):
483
485
  step_cli,
484
486
  docker_image,
485
487
  docker_image_pull_policy,
488
+ image_pull_secrets=None,
486
489
  service_account=None,
487
490
  secrets=None,
488
491
  node_selector=None,
@@ -529,6 +532,7 @@ class Kubernetes(object):
529
532
  ),
530
533
  image=docker_image,
531
534
  image_pull_policy=docker_image_pull_policy,
535
+ image_pull_secrets=image_pull_secrets,
532
536
  cpu=cpu,
533
537
  memory=memory,
534
538
  disk=disk,
@@ -53,6 +53,12 @@ def kubernetes():
53
53
  default=None,
54
54
  help="Optional Docker Image Pull Policy for Kubernetes pod.",
55
55
  )
56
+ @click.option(
57
+ "--image-pull-secrets",
58
+ default=None,
59
+ type=JSONTypeClass(),
60
+ multiple=False,
61
+ )
56
62
  @click.option(
57
63
  "--service-account",
58
64
  help="IRSA requirement for Kubernetes pod.",
@@ -160,6 +166,7 @@ def step(
160
166
  executable=None,
161
167
  image=None,
162
168
  image_pull_policy=None,
169
+ image_pull_secrets=None,
163
170
  service_account=None,
164
171
  secrets=None,
165
172
  node_selector=None,
@@ -303,6 +310,7 @@ def step(
303
310
  step_cli=step_cli,
304
311
  docker_image=image,
305
312
  docker_image_pull_policy=image_pull_policy,
313
+ image_pull_secrets=image_pull_secrets,
306
314
  service_account=service_account,
307
315
  secrets=secrets,
308
316
  node_selector=node_selector,
@@ -18,6 +18,7 @@ from metaflow.metaflow_config import (
18
18
  KUBERNETES_FETCH_EC2_METADATA,
19
19
  KUBERNETES_GPU_VENDOR,
20
20
  KUBERNETES_IMAGE_PULL_POLICY,
21
+ KUBERNETES_IMAGE_PULL_SECRETS,
21
22
  KUBERNETES_MEMORY,
22
23
  KUBERNETES_LABELS,
23
24
  KUBERNETES_ANNOTATIONS,
@@ -74,6 +75,10 @@ class KubernetesDecorator(StepDecorator):
74
75
  not, a default Docker image mapping to the current version of Python is used.
75
76
  image_pull_policy: str, default KUBERNETES_IMAGE_PULL_POLICY
76
77
  If given, the imagePullPolicy to be applied to the Docker image of the step.
78
+ image_pull_secrets: List[str], default []
79
+ The default is extracted from METAFLOW_KUBERNETES_IMAGE_PULL_SECRETS.
80
+ Kubernetes image pull secrets to use when pulling container images
81
+ in Kubernetes.
77
82
  service_account : str, default METAFLOW_KUBERNETES_SERVICE_ACCOUNT
78
83
  Kubernetes service account to use when launching pod in Kubernetes.
79
84
  secrets : List[str], optional, default None
@@ -141,6 +146,7 @@ class KubernetesDecorator(StepDecorator):
141
146
  "disk": "10240",
142
147
  "image": None,
143
148
  "image_pull_policy": None,
149
+ "image_pull_secrets": None, # e.g., ["regcred"]
144
150
  "service_account": None,
145
151
  "secrets": None, # e.g., mysecret
146
152
  "node_selector": None, # e.g., kubernetes.io/os=linux
@@ -194,6 +200,10 @@ class KubernetesDecorator(StepDecorator):
194
200
  )
195
201
  if not self.attributes["image_pull_policy"] and KUBERNETES_IMAGE_PULL_POLICY:
196
202
  self.attributes["image_pull_policy"] = KUBERNETES_IMAGE_PULL_POLICY
203
+ if not self.attributes["image_pull_secrets"] and KUBERNETES_IMAGE_PULL_SECRETS:
204
+ self.attributes["image_pull_secrets"] = json.loads(
205
+ KUBERNETES_IMAGE_PULL_SECRETS
206
+ )
197
207
 
198
208
  if isinstance(self.attributes["node_selector"], str):
199
209
  self.attributes["node_selector"] = parse_kube_keyvalue_list(
@@ -494,6 +504,7 @@ class KubernetesDecorator(StepDecorator):
494
504
  for key, val in v.items()
495
505
  ]
496
506
  elif k in [
507
+ "image_pull_secrets",
497
508
  "tolerations",
498
509
  "persistent_volume_claims",
499
510
  "labels",
@@ -235,8 +235,10 @@ class KubernetesJob(object):
235
235
  )
236
236
  ],
237
237
  node_selector=self._kwargs.get("node_selector"),
238
- # TODO (savin): Support image_pull_secrets
239
- # image_pull_secrets=?,
238
+ image_pull_secrets=[
239
+ client.V1LocalObjectReference(secret)
240
+ for secret in self._kwargs.get("image_pull_secrets") or []
241
+ ],
240
242
  # TODO (savin): Support preemption policies
241
243
  # preemption_policy=?,
242
244
  #
@@ -718,8 +718,11 @@ class JobSetSpec(object):
718
718
  )
719
719
  ],
720
720
  node_selector=self._kwargs.get("node_selector"),
721
- # TODO (savin): Support image_pull_secrets
722
- # image_pull_secrets=?,
721
+ image_pull_secrets=[
722
+ client.V1LocalObjectReference(secret)
723
+ for secret in self._kwargs.get("image_pull_secrets")
724
+ or []
725
+ ],
723
726
  # TODO (savin): Support preemption policies
724
727
  # preemption_policy=?,
725
728
  #
@@ -72,14 +72,18 @@ class ServiceMetadataProvider(MetadataProvider):
72
72
  @classmethod
73
73
  def compute_info(cls, val):
74
74
  v = val.rstrip("/")
75
- try:
76
- resp = cls._session.get(
77
- os.path.join(v, "ping"), headers=SERVICE_HEADERS.copy()
78
- )
79
- resp.raise_for_status()
80
- except: # noqa E722
81
- raise ValueError("Metaflow service [%s] unreachable." % v)
82
- return v
75
+ for i in range(SERVICE_RETRY_COUNT):
76
+ try:
77
+ resp = cls._session.get(
78
+ os.path.join(v, "ping"), headers=SERVICE_HEADERS.copy()
79
+ )
80
+ resp.raise_for_status()
81
+ except: # noqa E722
82
+ time.sleep(2 ** (i - 1))
83
+ else:
84
+ return v
85
+
86
+ raise ValueError("Metaflow service [%s] unreachable." % v)
83
87
 
84
88
  @classmethod
85
89
  def default_info(cls):
@@ -32,6 +32,7 @@ class CondaEnvironmentException(MetaflowException):
32
32
  class CondaEnvironment(MetaflowEnvironment):
33
33
  TYPE = "conda"
34
34
  _filecache = None
35
+ _force_rebuild = False
35
36
 
36
37
  def __init__(self, flow):
37
38
  self.flow = flow
@@ -71,7 +72,7 @@ class CondaEnvironment(MetaflowEnvironment):
71
72
  self.logger = make_thread_safe(logger)
72
73
 
73
74
  # TODO: Wire up logging
74
- micromamba = Micromamba(self.logger)
75
+ micromamba = Micromamba(self.logger, self._force_rebuild)
75
76
  self.solvers = {"conda": micromamba, "pypi": Pip(micromamba, self.logger)}
76
77
 
77
78
  def init_environment(self, echo, only_steps=None):
@@ -107,7 +108,10 @@ class CondaEnvironment(MetaflowEnvironment):
107
108
  return (
108
109
  id_,
109
110
  (
110
- self.read_from_environment_manifest([id_, platform, type_])
111
+ (
112
+ not self._force_rebuild
113
+ and self.read_from_environment_manifest([id_, platform, type_])
114
+ )
111
115
  or self.write_to_environment_manifest(
112
116
  [id_, platform, type_],
113
117
  self.solvers[type_].solve(id_, **environment),
@@ -153,7 +157,7 @@ class CondaEnvironment(MetaflowEnvironment):
153
157
  _meta = copy.deepcopy(local_packages)
154
158
  for id_, packages, _, _ in results:
155
159
  for package in packages:
156
- if package.get("path"):
160
+ if package.get("path") and not self._force_rebuild:
157
161
  # Cache only those packages that manifest is unaware of
158
162
  local_packages.pop(package["url"], None)
159
163
  else:
@@ -186,7 +190,7 @@ class CondaEnvironment(MetaflowEnvironment):
186
190
  storage.save_bytes(
187
191
  list_of_path_and_filehandle,
188
192
  len_hint=len(list_of_path_and_filehandle),
189
- # overwrite=True,
193
+ overwrite=self._force_rebuild,
190
194
  )
191
195
  for id_, packages, _, platform in results:
192
196
  if id_ in dirty: