ob-metaflow 2.15.15.1__tar.gz → 2.15.17.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.17.1}/PKG-INFO +2 -2
  2. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cli.py +2 -2
  3. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cli_components/run_cmds.py +1 -1
  4. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cmd/develop/stub_generator.py +30 -16
  5. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/flowspec.py +16 -4
  6. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/metaflow_config.py +2 -0
  7. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/argo/argo_workflows.py +7 -0
  8. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/argo/argo_workflows_deployer_objects.py +6 -49
  9. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/aws_client.py +6 -0
  10. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/datatools/s3/s3op.py +1 -1
  11. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/kubernetes/kubernetes.py +4 -0
  12. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/kubernetes/kubernetes_cli.py +8 -0
  13. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/kubernetes/kubernetes_decorator.py +11 -0
  14. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/kubernetes/kubernetes_job.py +4 -2
  15. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +5 -2
  16. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/metadata_providers/service.py +12 -8
  17. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/runner/deployer.py +49 -0
  18. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/user_configs/config_decorators.py +1 -1
  19. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/user_configs/config_options.py +6 -2
  20. ob_metaflow-2.15.17.1/metaflow/version.py +1 -0
  21. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1/ob_metaflow.egg-info}/PKG-INFO +2 -2
  22. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/ob_metaflow.egg-info/requires.txt +1 -1
  23. ob_metaflow-2.15.15.1/metaflow/version.py +0 -1
  24. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/LICENSE +0 -0
  25. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/MANIFEST.in +0 -0
  26. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/README.md +0 -0
  27. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/devtools/Makefile +0 -0
  28. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/devtools/Tiltfile +0 -0
  29. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/devtools/pick_services.sh +0 -0
  30. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/R.py +0 -0
  31. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/__init__.py +0 -0
  32. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/__init__.py +0 -0
  33. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/click/__init__.py +0 -0
  34. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  35. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/click/_compat.py +0 -0
  36. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/click/_termui_impl.py +0 -0
  37. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/click/_textwrap.py +0 -0
  38. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/click/_unicodefun.py +0 -0
  39. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/click/_winconsole.py +0 -0
  40. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/click/core.py +0 -0
  41. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/click/decorators.py +0 -0
  42. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/click/exceptions.py +0 -0
  43. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/click/formatting.py +0 -0
  44. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/click/globals.py +0 -0
  45. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/click/parser.py +0 -0
  46. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/click/termui.py +0 -0
  47. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/click/testing.py +0 -0
  48. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/click/types.py +0 -0
  49. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/click/utils.py +0 -0
  50. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
  51. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
  52. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
  53. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
  54. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
  55. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
  56. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
  57. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
  58. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
  59. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/packaging/__init__.py +0 -0
  60. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/packaging/_elffile.py +0 -0
  61. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  62. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  63. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/packaging/_parser.py +0 -0
  64. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/packaging/_structures.py +0 -0
  65. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  66. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/packaging/markers.py +0 -0
  67. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/packaging/py.typed +0 -0
  68. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/packaging/requirements.py +0 -0
  69. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/packaging/specifiers.py +0 -0
  70. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/packaging/tags.py +0 -0
  71. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/packaging/utils.py +0 -0
  72. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/packaging/version.py +0 -0
  73. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/typeguard/__init__.py +0 -0
  74. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/typeguard/_checkers.py +0 -0
  75. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/typeguard/_config.py +0 -0
  76. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/typeguard/_decorators.py +0 -0
  77. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
  78. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/typeguard/_functions.py +0 -0
  79. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/typeguard/_importhook.py +0 -0
  80. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/typeguard/_memo.py +0 -0
  81. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
  82. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/typeguard/_suppression.py +0 -0
  83. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/typeguard/_transformer.py +0 -0
  84. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
  85. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/typeguard/_utils.py +0 -0
  86. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/typeguard/py.typed +0 -0
  87. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/typing_extensions.py +0 -0
  88. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_6/__init__.py +0 -0
  89. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  90. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  91. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  92. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  93. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  94. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  95. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  96. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  97. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  98. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  99. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_6/zipp.py +0 -0
  100. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/__init__.py +0 -0
  101. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/importlib_metadata/__init__.py +0 -0
  102. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/importlib_metadata/_adapters.py +0 -0
  103. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/importlib_metadata/_collections.py +0 -0
  104. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/importlib_metadata/_compat.py +0 -0
  105. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/importlib_metadata/_functools.py +0 -0
  106. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/importlib_metadata/_itertools.py +0 -0
  107. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/importlib_metadata/_meta.py +0 -0
  108. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/importlib_metadata/_text.py +0 -0
  109. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/importlib_metadata/py.typed +0 -0
  110. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/typeguard/__init__.py +0 -0
  111. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/typeguard/_checkers.py +0 -0
  112. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/typeguard/_config.py +0 -0
  113. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/typeguard/_decorators.py +0 -0
  114. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/typeguard/_exceptions.py +0 -0
  115. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/typeguard/_functions.py +0 -0
  116. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/typeguard/_importhook.py +0 -0
  117. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/typeguard/_memo.py +0 -0
  118. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/typeguard/_pytest_plugin.py +0 -0
  119. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/typeguard/_suppression.py +0 -0
  120. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/typeguard/_transformer.py +0 -0
  121. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/typeguard/_union_transformer.py +0 -0
  122. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/typeguard/_utils.py +0 -0
  123. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/typeguard/py.typed +0 -0
  124. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/typing_extensions.py +0 -0
  125. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/v3_7/zipp.py +0 -0
  126. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/_vendor/zipp.py +0 -0
  127. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cards.py +0 -0
  128. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cli_args.py +0 -0
  129. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cli_components/__init__.py +0 -0
  130. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cli_components/dump_cmd.py +0 -0
  131. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cli_components/init_cmd.py +0 -0
  132. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cli_components/step_cmd.py +0 -0
  133. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cli_components/utils.py +0 -0
  134. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/client/__init__.py +0 -0
  135. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/client/core.py +0 -0
  136. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/client/filecache.py +0 -0
  137. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/clone_util.py +0 -0
  138. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cmd/__init__.py +0 -0
  139. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cmd/code/__init__.py +0 -0
  140. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cmd/configure_cmd.py +0 -0
  141. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cmd/develop/__init__.py +0 -0
  142. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cmd/develop/stubs.py +0 -0
  143. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cmd/main_cli.py +0 -0
  144. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cmd/make_wrapper.py +0 -0
  145. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cmd/tutorials_cmd.py +0 -0
  146. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cmd/util.py +0 -0
  147. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/cmd_with_io.py +0 -0
  148. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/datastore/__init__.py +0 -0
  149. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/datastore/content_addressed_store.py +0 -0
  150. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/datastore/datastore_set.py +0 -0
  151. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/datastore/datastore_storage.py +0 -0
  152. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/datastore/exceptions.py +0 -0
  153. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/datastore/flow_datastore.py +0 -0
  154. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/datastore/inputs.py +0 -0
  155. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/datastore/task_datastore.py +0 -0
  156. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/debug.py +0 -0
  157. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/decorators.py +0 -0
  158. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/event_logger.py +0 -0
  159. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/events.py +0 -0
  160. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/exception.py +0 -0
  161. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/extension_support/__init__.py +0 -0
  162. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/extension_support/_empty_file.py +0 -0
  163. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/extension_support/cmd.py +0 -0
  164. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/extension_support/integrations.py +0 -0
  165. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/extension_support/plugins.py +0 -0
  166. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/graph.py +0 -0
  167. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/includefile.py +0 -0
  168. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/info_file.py +0 -0
  169. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/integrations.py +0 -0
  170. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/lint.py +0 -0
  171. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/metadata_provider/__init__.py +0 -0
  172. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/metadata_provider/heartbeat.py +0 -0
  173. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/metadata_provider/metadata.py +0 -0
  174. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/metadata_provider/util.py +0 -0
  175. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/metaflow_config_funcs.py +0 -0
  176. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/metaflow_current.py +0 -0
  177. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/metaflow_environment.py +0 -0
  178. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/metaflow_git.py +0 -0
  179. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/metaflow_profile.py +0 -0
  180. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/metaflow_version.py +0 -0
  181. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/mflog/__init__.py +0 -0
  182. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/mflog/mflog.py +0 -0
  183. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/mflog/save_logs.py +0 -0
  184. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/mflog/save_logs_periodically.py +0 -0
  185. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/mflog/tee.py +0 -0
  186. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/monitor.py +0 -0
  187. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/multicore_utils.py +0 -0
  188. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/package.py +0 -0
  189. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/parameters.py +0 -0
  190. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/__init__.py +0 -0
  191. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/airflow/__init__.py +0 -0
  192. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/airflow/airflow.py +0 -0
  193. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  194. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  195. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  196. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/airflow/dag.py +0 -0
  197. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/airflow/exception.py +0 -0
  198. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  199. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  200. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  201. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
  202. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
  203. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
  204. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/argo/__init__.py +0 -0
  205. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/argo/argo_client.py +0 -0
  206. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/argo/argo_events.py +0 -0
  207. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/argo/argo_workflows_cli.py +0 -0
  208. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  209. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
  210. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/argo/capture_error.py +0 -0
  211. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/argo/generate_input_paths.py +0 -0
  212. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
  213. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/__init__.py +0 -0
  214. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/aws_utils.py +0 -0
  215. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/batch/__init__.py +0 -0
  216. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/batch/batch.py +0 -0
  217. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  218. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  219. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
  220. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  221. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  222. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  223. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  224. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  225. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  226. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  227. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  228. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
  229. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
  230. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  231. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  232. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
  233. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +0 -0
  234. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/azure/__init__.py +0 -0
  235. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/azure/azure_credential.py +0 -0
  236. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  237. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
  238. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/azure/azure_tail.py +0 -0
  239. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/azure/azure_utils.py +0 -0
  240. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  241. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/azure/includefile_support.py +0 -0
  242. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/__init__.py +0 -0
  243. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_cli.py +0 -0
  244. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_client.py +0 -0
  245. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_creator.py +0 -0
  246. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_datastore.py +0 -0
  247. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_decorator.py +0 -0
  248. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  249. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_modules/base.html +0 -0
  250. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_modules/basic.py +0 -0
  251. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
  252. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_modules/card.py +0 -0
  253. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  254. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  255. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  256. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  257. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  258. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_modules/components.py +0 -0
  259. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  260. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_modules/main.js +0 -0
  261. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  262. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  263. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_resolver.py +0 -0
  264. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_server.py +0 -0
  265. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
  266. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/component_serializer.py +0 -0
  267. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/cards/exception.py +0 -0
  268. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/catch_decorator.py +0 -0
  269. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/datastores/__init__.py +0 -0
  270. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/datastores/azure_storage.py +0 -0
  271. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/datastores/gs_storage.py +0 -0
  272. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/datastores/local_storage.py +0 -0
  273. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/datastores/s3_storage.py +0 -0
  274. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/datatools/__init__.py +0 -0
  275. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/datatools/local.py +0 -0
  276. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  277. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/datatools/s3/s3.py +0 -0
  278. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  279. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  280. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/debug_logger.py +0 -0
  281. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/debug_monitor.py +0 -0
  282. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/__init__.py +0 -0
  283. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/client.py +0 -0
  284. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/client_modules.py +0 -0
  285. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  286. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  287. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  288. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  289. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  290. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  291. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  292. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  293. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  294. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  295. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/consts.py +0 -0
  296. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  297. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  298. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  299. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/server.py +0 -0
  300. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/stub.py +0 -0
  301. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/env_escape/utils.py +0 -0
  302. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/environment_decorator.py +0 -0
  303. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/events_decorator.py +0 -0
  304. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/frameworks/__init__.py +0 -0
  305. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/frameworks/pytorch.py +0 -0
  306. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/gcp/__init__.py +0 -0
  307. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
  308. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  309. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  310. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/gcp/gs_tail.py +0 -0
  311. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/gcp/gs_utils.py +0 -0
  312. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/gcp/includefile_support.py +0 -0
  313. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/kubernetes/__init__.py +0 -0
  314. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
  315. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
  316. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/kubernetes/spot_metadata_cli.py +0 -0
  317. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/kubernetes/spot_monitor_sidecar.py +0 -0
  318. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/logs_cli.py +0 -0
  319. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/metadata_providers/__init__.py +0 -0
  320. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/metadata_providers/local.py +0 -0
  321. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/package_cli.py +0 -0
  322. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/parallel_decorator.py +0 -0
  323. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/project_decorator.py +0 -0
  324. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/pypi/__init__.py +0 -0
  325. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/pypi/bootstrap.py +0 -0
  326. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/pypi/conda_decorator.py +0 -0
  327. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/pypi/conda_environment.py +0 -0
  328. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/pypi/micromamba.py +0 -0
  329. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/pypi/parsers.py +0 -0
  330. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/pypi/pip.py +0 -0
  331. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
  332. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  333. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/pypi/utils.py +0 -0
  334. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/resources_decorator.py +0 -0
  335. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/retry_decorator.py +0 -0
  336. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/secrets/__init__.py +0 -0
  337. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  338. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  339. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/storage_executor.py +0 -0
  340. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/tag_cli.py +0 -0
  341. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  342. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/timeout_decorator.py +0 -0
  343. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/uv/__init__.py +0 -0
  344. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/uv/bootstrap.py +0 -0
  345. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/plugins/uv/uv_environment.py +0 -0
  346. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/procpoll.py +0 -0
  347. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/py.typed +0 -0
  348. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/pylint_wrapper.py +0 -0
  349. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/runner/__init__.py +0 -0
  350. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/runner/click_api.py +0 -0
  351. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/runner/deployer_impl.py +0 -0
  352. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/runner/metaflow_runner.py +0 -0
  353. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/runner/nbdeploy.py +0 -0
  354. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/runner/nbrun.py +0 -0
  355. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/runner/subprocess_manager.py +0 -0
  356. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/runner/utils.py +0 -0
  357. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/runtime.py +0 -0
  358. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/sidecar/__init__.py +0 -0
  359. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/sidecar/sidecar.py +0 -0
  360. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/sidecar/sidecar_messages.py +0 -0
  361. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  362. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/sidecar/sidecar_worker.py +0 -0
  363. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/system/__init__.py +0 -0
  364. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/system/system_logger.py +0 -0
  365. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/system/system_monitor.py +0 -0
  366. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/system/system_utils.py +0 -0
  367. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tagging_util.py +0 -0
  368. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/task.py +0 -0
  369. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tracing/__init__.py +0 -0
  370. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tracing/propagator.py +0 -0
  371. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tracing/span_exporter.py +0 -0
  372. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tracing/tracing_modules.py +0 -0
  373. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tuple_util.py +0 -0
  374. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/00-helloworld/README.md +0 -0
  375. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  376. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/01-playlist/README.md +0 -0
  377. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  378. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  379. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  380. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/02-statistics/README.md +0 -0
  381. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  382. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  383. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/02-statistics/stats.py +0 -0
  384. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  385. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  386. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  387. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  388. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  389. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  390. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  391. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  392. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  393. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/07-worldview/README.md +0 -0
  394. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  395. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/08-autopilot/README.md +0 -0
  396. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  397. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/unbounded_foreach.py +0 -0
  398. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/user_configs/__init__.py +0 -0
  399. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/user_configs/config_parameters.py +0 -0
  400. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/util.py +0 -0
  401. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/metaflow/vendor.py +0 -0
  402. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/ob_metaflow.egg-info/SOURCES.txt +0 -0
  403. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/ob_metaflow.egg-info/dependency_links.txt +0 -0
  404. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/ob_metaflow.egg-info/entry_points.txt +0 -0
  405. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/ob_metaflow.egg-info/top_level.txt +0 -0
  406. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.1}/setup.cfg +0 -0
  407. {ob_metaflow-2.15.15.1 → ob_metaflow-2.15.17.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.17.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.17.1; extra == "stubs"
16
16
  Dynamic: author
17
17
  Dynamic: author-email
18
18
  Dynamic: description
@@ -496,7 +496,7 @@ def start(
496
496
  ctx.obj.echo,
497
497
  ctx.obj.flow_datastore,
498
498
  {
499
- k: ConfigValue(v)
499
+ k: ConfigValue(v) if v is not None else None
500
500
  for k, v in ctx.obj.flow.__class__._flow_state.get(
501
501
  _FlowState.CONFIGS, {}
502
502
  ).items()
@@ -524,7 +524,7 @@ def start(
524
524
  decorators._attach_decorators(ctx.obj.flow, all_decospecs)
525
525
  decorators._init(ctx.obj.flow)
526
526
  # Regenerate graph if we attached more decorators
527
- ctx.obj.flow.__class__._init_attrs()
527
+ ctx.obj.flow.__class__._init_graph()
528
528
  ctx.obj.graph = ctx.obj.flow._graph
529
529
 
530
530
  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):
@@ -371,6 +371,8 @@ KUBERNETES_CONTAINER_IMAGE = from_conf(
371
371
  )
372
372
  # Image pull policy for container images
373
373
  KUBERNETES_IMAGE_PULL_POLICY = from_conf("KUBERNETES_IMAGE_PULL_POLICY", None)
374
+ # Image pull secrets for container images
375
+ KUBERNETES_IMAGE_PULL_SECRETS = from_conf("KUBERNETES_IMAGE_PULL_SECRETS", "")
374
376
  # Default container registry for K8S
375
377
  KUBERNETES_CONTAINER_REGISTRY = from_conf(
376
378
  "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
  ):
@@ -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):
@@ -7,6 +7,55 @@ from typing import ClassVar, Dict, Optional, TYPE_CHECKING
7
7
  from metaflow.exception import MetaflowNotFound
8
8
  from metaflow.metaflow_config import DEFAULT_FROM_DEPLOYMENT_IMPL
9
9
 
10
+
11
+ def generate_fake_flow_file_contents(
12
+ flow_name: str, param_info: dict, project_name: Optional[str] = None
13
+ ):
14
+ params_code = ""
15
+ for _, param_details in param_info.items():
16
+ param_python_var_name = param_details["python_var_name"]
17
+ param_name = param_details["name"]
18
+ param_type = param_details["type"]
19
+ param_help = param_details["description"]
20
+ param_required = param_details["is_required"]
21
+
22
+ if param_type == "JSON":
23
+ params_code += (
24
+ f" {param_python_var_name} = Parameter('{param_name}', "
25
+ f"type=JSONType, help='''{param_help}''', required={param_required})\n"
26
+ )
27
+ elif param_type == "FilePath":
28
+ is_text = param_details.get("is_text", True)
29
+ encoding = param_details.get("encoding", "utf-8")
30
+ params_code += (
31
+ f" {param_python_var_name} = IncludeFile('{param_name}', "
32
+ f"is_text={is_text}, encoding='{encoding}', help='''{param_help}''', "
33
+ f"required={param_required})\n"
34
+ )
35
+ else:
36
+ params_code += (
37
+ f" {param_python_var_name} = Parameter('{param_name}', "
38
+ f"type={param_type}, help='''{param_help}''', required={param_required})\n"
39
+ )
40
+
41
+ project_decorator = f"@project(name='{project_name}')\n" if project_name else ""
42
+
43
+ contents = f"""\
44
+ from metaflow import FlowSpec, Parameter, IncludeFile, JSONType, step, project
45
+ {project_decorator}class {flow_name}(FlowSpec):
46
+ {params_code}
47
+ @step
48
+ def start(self):
49
+ self.next(self.end)
50
+ @step
51
+ def end(self):
52
+ pass
53
+ if __name__ == '__main__':
54
+ {flow_name}()
55
+ """
56
+ return contents
57
+
58
+
10
59
  if TYPE_CHECKING:
11
60
  import metaflow
12
61
  import metaflow.runner.deployer_impl
@@ -200,7 +200,7 @@ class MutableFlow:
200
200
  for name, value in self._flow_cls._flow_state.get(
201
201
  _FlowState.CONFIGS, {}
202
202
  ).items():
203
- yield name, ConfigValue(value)
203
+ yield name, ConfigValue(value) if value is not None else None
204
204
 
205
205
  @property
206
206
  def parameters(self) -> Generator[Tuple[str, Any], None, None]:
@@ -352,7 +352,9 @@ class ConfigInput:
352
352
  return None
353
353
  raise exc from e
354
354
  flow_cls._flow_state[_FlowState.CONFIGS][name] = read_value
355
- to_return[name] = ConfigValue(read_value)
355
+ to_return[name] = (
356
+ ConfigValue(read_value) if read_value is not None else None
357
+ )
356
358
  else:
357
359
  if self._parsers[name]:
358
360
  read_value = self._call_parser(self._parsers[name], val)
@@ -367,7 +369,9 @@ class ConfigInput:
367
369
  continue
368
370
  # TODO: Support YAML
369
371
  flow_cls._flow_state[_FlowState.CONFIGS][name] = read_value
370
- to_return[name] = ConfigValue(read_value)
372
+ to_return[name] = (
373
+ ConfigValue(read_value) if read_value is not None else None
374
+ )
371
375
 
372
376
  reqs = missing_configs.intersection(self._req_configs)
373
377
  for missing in reqs:
@@ -0,0 +1 @@
1
+ metaflow_version = "2.15.17.1"
@@ -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.17.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.17.1; extra == "stubs"
16
16
  Dynamic: author
17
17
  Dynamic: author-email
18
18
  Dynamic: description
@@ -4,4 +4,4 @@ pylint
4
4
  kubernetes
5
5
 
6
6
  [stubs]
7
- metaflow-stubs==2.15.15.1
7
+ metaflow-stubs==2.15.17.1
@@ -1 +0,0 @@
1
- metaflow_version = "2.15.15.1"
File without changes