ob-metaflow 2.15.7.2__tar.gz → 2.15.11.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 (411) hide show
  1. {ob_metaflow-2.15.7.2/ob_metaflow.egg-info → ob_metaflow-2.15.11.1}/PKG-INFO +2 -2
  2. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/devtools/Makefile +2 -0
  3. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cli.py +8 -0
  4. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cli_components/run_cmds.py +2 -2
  5. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/main_cli.py +1 -1
  6. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/includefile.py +2 -2
  7. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metadata_provider/metadata.py +35 -0
  8. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metaflow_config.py +6 -0
  9. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metaflow_environment.py +6 -1
  10. ob_metaflow-2.15.11.1/metaflow/metaflow_git.py +115 -0
  11. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metaflow_version.py +2 -2
  12. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/__init__.py +1 -0
  13. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/argo_workflows.py +13 -2
  14. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/argo_workflows_cli.py +1 -0
  15. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/aws_client.py +4 -3
  16. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datastores/gs_storage.py +3 -1
  17. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datatools/s3/s3.py +54 -45
  18. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datatools/s3/s3op.py +149 -62
  19. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/kubernetes.py +4 -0
  20. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/kubernetes_cli.py +8 -0
  21. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/kubernetes_decorator.py +10 -0
  22. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/kubernetes_job.py +8 -0
  23. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +7 -0
  24. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/conda_decorator.py +2 -1
  25. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/conda_environment.py +1 -0
  26. ob_metaflow-2.15.11.1/metaflow/plugins/uv/bootstrap.py +100 -0
  27. ob_metaflow-2.15.11.1/metaflow/plugins/uv/uv_environment.py +70 -0
  28. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runner/deployer.py +8 -2
  29. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runner/deployer_impl.py +6 -2
  30. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runner/metaflow_runner.py +7 -2
  31. ob_metaflow-2.15.11.1/metaflow/user_configs/__init__.py +0 -0
  32. ob_metaflow-2.15.11.1/metaflow/version.py +1 -0
  33. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1/ob_metaflow.egg-info}/PKG-INFO +2 -2
  34. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/ob_metaflow.egg-info/SOURCES.txt +4 -0
  35. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/ob_metaflow.egg-info/requires.txt +1 -1
  36. ob_metaflow-2.15.7.2/metaflow/version.py +0 -1
  37. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/LICENSE +0 -0
  38. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/MANIFEST.in +0 -0
  39. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/README.md +0 -0
  40. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/devtools/Tiltfile +0 -0
  41. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/devtools/pick_services.sh +0 -0
  42. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/R.py +0 -0
  43. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/__init__.py +0 -0
  44. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/__init__.py +0 -0
  45. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/__init__.py +0 -0
  46. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  47. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/_compat.py +0 -0
  48. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/_termui_impl.py +0 -0
  49. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/_textwrap.py +0 -0
  50. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/_unicodefun.py +0 -0
  51. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/_winconsole.py +0 -0
  52. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/core.py +0 -0
  53. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/decorators.py +0 -0
  54. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/exceptions.py +0 -0
  55. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/formatting.py +0 -0
  56. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/globals.py +0 -0
  57. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/parser.py +0 -0
  58. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/termui.py +0 -0
  59. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/testing.py +0 -0
  60. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/types.py +0 -0
  61. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/click/utils.py +0 -0
  62. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
  63. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
  64. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
  65. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
  66. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
  67. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
  68. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
  69. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
  70. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
  71. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/__init__.py +0 -0
  72. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/_elffile.py +0 -0
  73. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  74. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  75. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/_parser.py +0 -0
  76. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/_structures.py +0 -0
  77. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  78. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/markers.py +0 -0
  79. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/py.typed +0 -0
  80. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/requirements.py +0 -0
  81. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/specifiers.py +0 -0
  82. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/tags.py +0 -0
  83. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/utils.py +0 -0
  84. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/packaging/version.py +0 -0
  85. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/__init__.py +0 -0
  86. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_checkers.py +0 -0
  87. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_config.py +0 -0
  88. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_decorators.py +0 -0
  89. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
  90. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_functions.py +0 -0
  91. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_importhook.py +0 -0
  92. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_memo.py +0 -0
  93. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
  94. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_suppression.py +0 -0
  95. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_transformer.py +0 -0
  96. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
  97. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/_utils.py +0 -0
  98. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typeguard/py.typed +0 -0
  99. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/typing_extensions.py +0 -0
  100. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_5/__init__.py +0 -0
  101. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
  102. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
  103. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_5/zipp.py +0 -0
  104. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/__init__.py +0 -0
  105. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  106. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  107. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  108. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  109. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  110. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  111. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  112. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  113. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  114. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  115. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_6/zipp.py +0 -0
  116. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/__init__.py +0 -0
  117. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/__init__.py +0 -0
  118. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/_adapters.py +0 -0
  119. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/_collections.py +0 -0
  120. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/_compat.py +0 -0
  121. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/_functools.py +0 -0
  122. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/_itertools.py +0 -0
  123. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/_meta.py +0 -0
  124. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/_text.py +0 -0
  125. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/importlib_metadata/py.typed +0 -0
  126. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/__init__.py +0 -0
  127. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_checkers.py +0 -0
  128. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_config.py +0 -0
  129. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_decorators.py +0 -0
  130. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_exceptions.py +0 -0
  131. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_functions.py +0 -0
  132. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_importhook.py +0 -0
  133. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_memo.py +0 -0
  134. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_pytest_plugin.py +0 -0
  135. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_suppression.py +0 -0
  136. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_transformer.py +0 -0
  137. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_union_transformer.py +0 -0
  138. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/_utils.py +0 -0
  139. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typeguard/py.typed +0 -0
  140. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/typing_extensions.py +0 -0
  141. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/v3_7/zipp.py +0 -0
  142. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/_vendor/zipp.py +0 -0
  143. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cards.py +0 -0
  144. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cli_args.py +0 -0
  145. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cli_components/__init__.py +0 -0
  146. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cli_components/dump_cmd.py +0 -0
  147. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cli_components/init_cmd.py +0 -0
  148. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cli_components/step_cmd.py +0 -0
  149. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cli_components/utils.py +0 -0
  150. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/client/__init__.py +0 -0
  151. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/client/core.py +0 -0
  152. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/client/filecache.py +0 -0
  153. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/clone_util.py +0 -0
  154. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/__init__.py +0 -0
  155. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/code/__init__.py +0 -0
  156. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/configure_cmd.py +0 -0
  157. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/develop/__init__.py +0 -0
  158. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/develop/stub_generator.py +0 -0
  159. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/develop/stubs.py +0 -0
  160. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/make_wrapper.py +0 -0
  161. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/tutorials_cmd.py +0 -0
  162. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd/util.py +0 -0
  163. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/cmd_with_io.py +0 -0
  164. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/datastore/__init__.py +0 -0
  165. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/datastore/content_addressed_store.py +0 -0
  166. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/datastore/datastore_set.py +0 -0
  167. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/datastore/datastore_storage.py +0 -0
  168. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/datastore/exceptions.py +0 -0
  169. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/datastore/flow_datastore.py +0 -0
  170. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/datastore/inputs.py +0 -0
  171. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/datastore/task_datastore.py +0 -0
  172. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/debug.py +0 -0
  173. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/decorators.py +0 -0
  174. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/event_logger.py +0 -0
  175. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/events.py +0 -0
  176. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/exception.py +0 -0
  177. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/extension_support/__init__.py +0 -0
  178. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/extension_support/_empty_file.py +0 -0
  179. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/extension_support/cmd.py +0 -0
  180. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/extension_support/integrations.py +0 -0
  181. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/extension_support/plugins.py +0 -0
  182. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/flowspec.py +0 -0
  183. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/graph.py +0 -0
  184. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/info_file.py +0 -0
  185. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/integrations.py +0 -0
  186. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/lint.py +0 -0
  187. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metadata_provider/__init__.py +0 -0
  188. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metadata_provider/heartbeat.py +0 -0
  189. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metadata_provider/util.py +0 -0
  190. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metaflow_config_funcs.py +0 -0
  191. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metaflow_current.py +0 -0
  192. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/metaflow_profile.py +0 -0
  193. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/mflog/__init__.py +0 -0
  194. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/mflog/mflog.py +0 -0
  195. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/mflog/save_logs.py +0 -0
  196. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/mflog/save_logs_periodically.py +0 -0
  197. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/mflog/tee.py +0 -0
  198. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/monitor.py +0 -0
  199. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/multicore_utils.py +0 -0
  200. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/package.py +0 -0
  201. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/parameters.py +0 -0
  202. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/__init__.py +0 -0
  203. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/airflow.py +0 -0
  204. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  205. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  206. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  207. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/dag.py +0 -0
  208. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/exception.py +0 -0
  209. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  210. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  211. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  212. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
  213. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
  214. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
  215. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/__init__.py +0 -0
  216. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/argo_client.py +0 -0
  217. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/argo_events.py +0 -0
  218. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  219. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
  220. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/argo_workflows_deployer_objects.py +0 -0
  221. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/capture_error.py +0 -0
  222. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/generate_input_paths.py +0 -0
  223. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
  224. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/__init__.py +0 -0
  225. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/aws_utils.py +0 -0
  226. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/batch/__init__.py +0 -0
  227. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/batch/batch.py +0 -0
  228. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  229. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  230. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
  231. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  232. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  233. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  234. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  235. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  236. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  237. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  238. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  239. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
  240. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
  241. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  242. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  243. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
  244. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +0 -0
  245. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/azure/__init__.py +0 -0
  246. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/azure/azure_credential.py +0 -0
  247. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  248. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
  249. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/azure/azure_tail.py +0 -0
  250. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/azure/azure_utils.py +0 -0
  251. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  252. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/azure/includefile_support.py +0 -0
  253. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/__init__.py +0 -0
  254. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_cli.py +0 -0
  255. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_client.py +0 -0
  256. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_creator.py +0 -0
  257. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_datastore.py +0 -0
  258. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_decorator.py +0 -0
  259. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  260. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/base.html +0 -0
  261. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/basic.py +0 -0
  262. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
  263. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/card.py +0 -0
  264. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  265. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  266. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  267. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  268. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  269. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/components.py +0 -0
  270. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  271. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/main.js +0 -0
  272. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  273. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  274. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_resolver.py +0 -0
  275. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_server.py +0 -0
  276. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
  277. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/component_serializer.py +0 -0
  278. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/cards/exception.py +0 -0
  279. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/catch_decorator.py +0 -0
  280. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datastores/__init__.py +0 -0
  281. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datastores/azure_storage.py +0 -0
  282. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datastores/local_storage.py +0 -0
  283. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datastores/s3_storage.py +0 -0
  284. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datatools/__init__.py +0 -0
  285. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datatools/local.py +0 -0
  286. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  287. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  288. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  289. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/debug_logger.py +0 -0
  290. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/debug_monitor.py +0 -0
  291. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/__init__.py +0 -0
  292. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/client.py +0 -0
  293. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/client_modules.py +0 -0
  294. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  295. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  296. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  297. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  298. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  299. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  300. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  301. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  302. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  303. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  304. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/consts.py +0 -0
  305. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  306. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  307. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  308. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/server.py +0 -0
  309. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/stub.py +0 -0
  310. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/env_escape/utils.py +0 -0
  311. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/environment_decorator.py +0 -0
  312. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/events_decorator.py +0 -0
  313. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/frameworks/__init__.py +0 -0
  314. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/frameworks/pytorch.py +0 -0
  315. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/gcp/__init__.py +0 -0
  316. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
  317. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  318. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  319. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/gcp/gs_tail.py +0 -0
  320. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/gcp/gs_utils.py +0 -0
  321. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/gcp/includefile_support.py +0 -0
  322. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/__init__.py +0 -0
  323. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
  324. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
  325. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/spot_metadata_cli.py +0 -0
  326. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/kubernetes/spot_monitor_sidecar.py +0 -0
  327. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/logs_cli.py +0 -0
  328. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/metadata_providers/__init__.py +0 -0
  329. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/metadata_providers/local.py +0 -0
  330. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/metadata_providers/service.py +0 -0
  331. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/package_cli.py +0 -0
  332. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/parallel_decorator.py +0 -0
  333. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/project_decorator.py +0 -0
  334. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/__init__.py +0 -0
  335. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/bootstrap.py +0 -0
  336. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/micromamba.py +0 -0
  337. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/parsers.py +0 -0
  338. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/pip.py +0 -0
  339. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
  340. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  341. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/pypi/utils.py +0 -0
  342. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/resources_decorator.py +0 -0
  343. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/retry_decorator.py +0 -0
  344. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/secrets/__init__.py +0 -0
  345. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  346. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  347. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/storage_executor.py +0 -0
  348. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/tag_cli.py +0 -0
  349. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  350. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/plugins/timeout_decorator.py +0 -0
  351. {ob_metaflow-2.15.7.2/metaflow/runner → ob_metaflow-2.15.11.1/metaflow/plugins/uv}/__init__.py +0 -0
  352. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/procpoll.py +0 -0
  353. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/py.typed +0 -0
  354. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/pylint_wrapper.py +0 -0
  355. {ob_metaflow-2.15.7.2/metaflow/user_configs → ob_metaflow-2.15.11.1/metaflow/runner}/__init__.py +0 -0
  356. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runner/click_api.py +0 -0
  357. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runner/nbdeploy.py +0 -0
  358. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runner/nbrun.py +0 -0
  359. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runner/subprocess_manager.py +0 -0
  360. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runner/utils.py +0 -0
  361. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/runtime.py +0 -0
  362. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/sidecar/__init__.py +0 -0
  363. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/sidecar/sidecar.py +0 -0
  364. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/sidecar/sidecar_messages.py +0 -0
  365. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  366. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/sidecar/sidecar_worker.py +0 -0
  367. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/system/__init__.py +0 -0
  368. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/system/system_logger.py +0 -0
  369. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/system/system_monitor.py +0 -0
  370. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/system/system_utils.py +0 -0
  371. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tagging_util.py +0 -0
  372. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/task.py +0 -0
  373. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tracing/__init__.py +0 -0
  374. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tracing/propagator.py +0 -0
  375. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tracing/span_exporter.py +0 -0
  376. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tracing/tracing_modules.py +0 -0
  377. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tuple_util.py +0 -0
  378. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/00-helloworld/README.md +0 -0
  379. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  380. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/01-playlist/README.md +0 -0
  381. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  382. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  383. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  384. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/02-statistics/README.md +0 -0
  385. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  386. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  387. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/02-statistics/stats.py +0 -0
  388. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  389. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  390. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  391. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  392. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  393. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  394. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  395. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  396. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  397. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/07-worldview/README.md +0 -0
  398. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  399. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/08-autopilot/README.md +0 -0
  400. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  401. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/unbounded_foreach.py +0 -0
  402. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/user_configs/config_decorators.py +0 -0
  403. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/user_configs/config_options.py +0 -0
  404. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/user_configs/config_parameters.py +0 -0
  405. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/util.py +0 -0
  406. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/metaflow/vendor.py +0 -0
  407. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/ob_metaflow.egg-info/dependency_links.txt +0 -0
  408. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/ob_metaflow.egg-info/entry_points.txt +0 -0
  409. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/ob_metaflow.egg-info/top_level.txt +0 -0
  410. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/setup.cfg +0 -0
  411. {ob_metaflow-2.15.7.2 → ob_metaflow-2.15.11.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ob-metaflow
3
- Version: 2.15.7.2
3
+ Version: 2.15.11.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.7.2; extra == "stubs"
15
+ Requires-Dist: metaflow-stubs==2.15.11.1; extra == "stubs"
16
16
  Dynamic: author
17
17
  Dynamic: author-email
18
18
  Dynamic: description
@@ -260,6 +260,7 @@ shell: setup-tilt
260
260
  env METAFLOW_HOME="$(DEVTOOLS_DIR)" \
261
261
  METAFLOW_PROFILE=local \
262
262
  AWS_CONFIG_FILE="$(DEVTOOLS_DIR)/aws_config" \
263
+ AWS_SHARED_CREDENTIALS_FILE= \
263
264
  "$$user_shell" -i; \
264
265
  else \
265
266
  env METAFLOW_HOME="$(DEVTOOLS_DIR)" \
@@ -301,6 +302,7 @@ create-dev-shell: setup-tilt
301
302
  echo " env METAFLOW_HOME=\"$(DEVTOOLS_DIR)\" \\" >> $$SHELL_PATH && \
302
303
  echo " METAFLOW_PROFILE=local \\" >> $$SHELL_PATH && \
303
304
  echo " AWS_CONFIG_FILE=\"$(DEVTOOLS_DIR)/aws_config\" \\" >> $$SHELL_PATH && \
305
+ echo " AWS_SHARED_CREDENTIALS_FILE= \\" >> $$SHELL_PATH && \
304
306
  echo " \"\$$user_shell\" -i" >> $$SHELL_PATH && \
305
307
  echo "else" >> $$SHELL_PATH && \
306
308
  echo " env METAFLOW_HOME=\"$(DEVTOOLS_DIR)\" \\" >> $$SHELL_PATH && \
@@ -17,6 +17,7 @@ from .flowspec import _FlowState
17
17
  from .graph import FlowGraph
18
18
  from .metaflow_config import (
19
19
  DEFAULT_DATASTORE,
20
+ DEFAULT_DECOSPECS,
20
21
  DEFAULT_ENVIRONMENT,
21
22
  DEFAULT_EVENT_LOGGER,
22
23
  DEFAULT_METADATA,
@@ -509,9 +510,16 @@ def start(
509
510
  ):
510
511
  # run/resume are special cases because they can add more decorators with --with,
511
512
  # so they have to take care of themselves.
513
+
512
514
  all_decospecs = ctx.obj.tl_decospecs + list(
513
515
  ctx.obj.environment.decospecs() or []
514
516
  )
517
+
518
+ # We add the default decospecs for everything except init and step since in those
519
+ # cases, the decospecs will already have been handled by either a run/resume
520
+ # or a scheduler setting them up in their own way.
521
+ if ctx.saved_args[0] not in ("step", "init"):
522
+ all_decospecs += DEFAULT_DECOSPECS.split()
515
523
  if all_decospecs:
516
524
  decorators._attach_decorators(ctx.obj.flow, all_decospecs)
517
525
  decorators._init(ctx.obj.flow)
@@ -71,7 +71,7 @@ def write_file(file_path, content):
71
71
  f.write(str(content))
72
72
 
73
73
 
74
- def config_merge_cb(ctx, param, value):
74
+ def config_callback(ctx, param, value):
75
75
  # Callback to:
76
76
  # - read the Click auto_envvar variable from both the
77
77
  # environment AND the configuration
@@ -127,7 +127,7 @@ def common_run_options(func):
127
127
  help="Add a decorator to all steps. You can specify this "
128
128
  "option multiple times to attach multiple decorators "
129
129
  "in steps.",
130
- callback=config_merge_cb,
130
+ callback=config_callback,
131
131
  )
132
132
  @click.option(
133
133
  "--run-id-file",
@@ -94,7 +94,7 @@ def start(ctx):
94
94
  echo("(%s)\n" % version, fg="magenta", bold=False)
95
95
 
96
96
  if ctx.invoked_subcommand is None:
97
- echo("More data science, less engineering\n", fg="magenta")
97
+ echo("More AI, less engineering\n", fg="magenta")
98
98
 
99
99
  lnk_sz = max(len(lnk) for lnk in CONTACT_INFO.values()) + 1
100
100
  for what, lnk in CONTACT_INFO.items():
@@ -459,7 +459,7 @@ class UploaderV2:
459
459
  @classmethod
460
460
  def encode_url(cls, url_type, url, **kwargs):
461
461
  return_value = {
462
- "note": "Internal representation of IncludeFile(%s)" % url,
462
+ "note": "Internal representation of IncludeFile",
463
463
  "type": cls.file_type,
464
464
  "sub-type": url_type,
465
465
  "url": url,
@@ -472,7 +472,7 @@ class UploaderV2:
472
472
  r = UploaderV1.store(flow_name, path, is_text, encoding, handler, echo)
473
473
 
474
474
  # In V2, we store size for faster access
475
- r["note"] = "Internal representation of IncludeFile(%s)" % path
475
+ r["note"] = "Internal representation of IncludeFile"
476
476
  r["type"] = cls.file_type
477
477
  r["sub-type"] = "uploaded"
478
478
  r["size"] = os.stat(path).st_size
@@ -630,6 +630,20 @@ class MetadataProvider(object):
630
630
  sys_info["r_version"] = env["r_version_code"]
631
631
  return sys_info
632
632
 
633
+ def _get_git_info_as_dict(self):
634
+ git_info = {}
635
+ env = self._environment.get_environment_info()
636
+ for key in [
637
+ "repo_url",
638
+ "branch_name",
639
+ "commit_sha",
640
+ "has_uncommitted_changes",
641
+ ]:
642
+ if key in env and env[key]:
643
+ git_info[key] = env[key]
644
+
645
+ return git_info
646
+
633
647
  def _get_system_tags(self):
634
648
  """Convert system info dictionary into a list of system tags"""
635
649
  return [
@@ -670,6 +684,27 @@ class MetadataProvider(object):
670
684
  tags=["attempt_id:{0}".format(attempt)],
671
685
  )
672
686
  )
687
+ # Add script name as metadata
688
+ script_name = self._environment.get_environment_info()["script"]
689
+ metadata.append(
690
+ MetaDatum(
691
+ field="script-name",
692
+ value=script_name,
693
+ type="script-name",
694
+ tags=["attempt_id:{0}".format(attempt)],
695
+ )
696
+ )
697
+ # And add git metadata
698
+ git_info = self._get_git_info_as_dict()
699
+ if git_info:
700
+ metadata.append(
701
+ MetaDatum(
702
+ field="git-info",
703
+ value=json.dumps(git_info),
704
+ type="git-info",
705
+ tags=["attempt_id:{0}".format(attempt)],
706
+ )
707
+ )
673
708
  if metadata:
674
709
  self.register_metadata(run_id, step_name, task_id, metadata)
675
710
 
@@ -109,6 +109,12 @@ S3_WORKER_COUNT = from_conf("S3_WORKER_COUNT", 64)
109
109
  # top-level retries)
110
110
  S3_TRANSIENT_RETRY_COUNT = from_conf("S3_TRANSIENT_RETRY_COUNT", 20)
111
111
 
112
+ # S3 retry configuration used in the aws client
113
+ # Use the adaptive retry strategy by default
114
+ S3_CLIENT_RETRY_CONFIG = from_conf(
115
+ "S3_CLIENT_RETRY_CONFIG", {"max_attempts": 10, "mode": "adaptive"}
116
+ )
117
+
112
118
  # Threshold to start printing warnings for an AWS retry
113
119
  RETRY_WARNING_THRESHOLD = 3
114
120
 
@@ -4,6 +4,7 @@ import sys
4
4
 
5
5
  from .util import get_username
6
6
  from . import metaflow_version
7
+ from . import metaflow_git
7
8
  from metaflow.exception import MetaflowException
8
9
  from metaflow.extension_support import dump_module_info
9
10
  from metaflow.mflog import BASH_MFLOG, BASH_FLUSH_LOGS
@@ -197,6 +198,10 @@ class MetaflowEnvironment(object):
197
198
  "python_version_code": "%d.%d.%d" % sys.version_info[:3],
198
199
  "metaflow_version": metaflow_version.get_version(),
199
200
  "script": os.path.basename(os.path.abspath(sys.argv[0])),
201
+ # Add git info
202
+ **metaflow_git.get_repository_info(
203
+ path=os.path.dirname(os.path.abspath(sys.argv[0]))
204
+ ),
200
205
  }
201
206
  if R.use_r():
202
207
  env["metaflow_r_version"] = R.metaflow_r_version()
@@ -206,7 +211,7 @@ class MetaflowEnvironment(object):
206
211
  # Information about extension modules (to load them in the proper order)
207
212
  ext_key, ext_val = dump_module_info()
208
213
  env[ext_key] = ext_val
209
- return env
214
+ return {k: v for k, v in env.items() if v is not None and v != ""}
210
215
 
211
216
  def executable(self, step_name, default=None):
212
217
  if default is not None:
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env python
2
+ """Get git repository information for the package
3
+
4
+ Functions to retrieve git repository details like URL, branch name,
5
+ and commit SHA for Metaflow code provenance tracking.
6
+ """
7
+
8
+ import os
9
+ import subprocess
10
+ from typing import Dict, List, Optional, Tuple, Union
11
+
12
+ # Cache for git information to avoid repeated subprocess calls
13
+ _git_info_cache = None
14
+
15
+ __all__ = ("get_repository_info",)
16
+
17
+
18
+ def _call_git(
19
+ args: List[str], path=Union[str, os.PathLike]
20
+ ) -> Tuple[Optional[str], Optional[int], bool]:
21
+ """
22
+ Call git with provided args.
23
+
24
+ Returns
25
+ -------
26
+ tuple : Tuple containing
27
+ (stdout, exitcode, failure) of the call
28
+ """
29
+ try:
30
+ result = subprocess.run(
31
+ ["git", *args],
32
+ cwd=path,
33
+ capture_output=True,
34
+ text=True,
35
+ check=False,
36
+ )
37
+ return result.stdout.strip(), result.returncode, False
38
+ except (OSError, subprocess.SubprocessError):
39
+ # Covers subprocess timeouts and other errors which would not lead to an exit code
40
+ return None, None, True
41
+
42
+
43
+ def _get_repo_url(path: Union[str, os.PathLike]) -> Optional[str]:
44
+ """Get the repository URL from git config"""
45
+ stdout, returncode, _failed = _call_git(
46
+ ["config", "--get", "remote.origin.url"], path
47
+ )
48
+ if returncode == 0:
49
+ url = stdout
50
+ # Convert SSH URLs to HTTPS for clickable links
51
+ if url.startswith("git@"):
52
+ parts = url.split(":", 1)
53
+ if len(parts) == 2:
54
+ domain = parts[0].replace("git@", "")
55
+ repo_path = parts[1]
56
+ url = f"https://{domain}/{repo_path}"
57
+ return url
58
+ return None
59
+
60
+
61
+ def _get_branch_name(path: Union[str, os.PathLike]) -> Optional[str]:
62
+ """Get the current git branch name"""
63
+ stdout, returncode, _failed = _call_git(["rev-parse", "--abbrev-ref", "HEAD"], path)
64
+ return stdout if returncode == 0 else None
65
+
66
+
67
+ def _get_commit_sha(path: Union[str, os.PathLike]) -> Optional[str]:
68
+ """Get the current git commit SHA"""
69
+ stdout, returncode, _failed = _call_git(["rev-parse", "HEAD"], path)
70
+ return stdout if returncode == 0 else None
71
+
72
+
73
+ def _is_in_git_repo(path: Union[str, os.PathLike]) -> bool:
74
+ """Check if we're currently in a git repository"""
75
+ stdout, returncode, _failed = _call_git(
76
+ ["rev-parse", "--is-inside-work-tree"], path
77
+ )
78
+ return returncode == 0 and stdout == "true"
79
+
80
+
81
+ def _has_uncommitted_changes(path: Union[str, os.PathLike]) -> Optional[bool]:
82
+ """Check if the git repository has uncommitted changes"""
83
+ _stdout, returncode, failed = _call_git(
84
+ ["diff-index", "--quiet", "HEAD", "--"], path
85
+ )
86
+ if failed:
87
+ return None
88
+ return returncode != 0
89
+
90
+
91
+ def get_repository_info(path: Union[str, os.PathLike]) -> Dict[str, Union[str, bool]]:
92
+ """Get git repository information for a path
93
+
94
+ Returns:
95
+ dict: Dictionary containing:
96
+ repo_url: Repository URL (converted to HTTPS if from SSH)
97
+ branch_name: Current branch name
98
+ commit_sha: Current commit SHA
99
+ has_uncommitted_changes: Boolean indicating if there are uncommitted changes
100
+ """
101
+ global _git_info_cache
102
+
103
+ if _git_info_cache is not None:
104
+ return _git_info_cache
105
+
106
+ _git_info_cache = {}
107
+ if _is_in_git_repo(path):
108
+ _git_info_cache = {
109
+ "repo_url": _get_repo_url(path),
110
+ "branch_name": _get_branch_name(path),
111
+ "commit_sha": _get_commit_sha(path),
112
+ "has_uncommitted_changes": _has_uncommitted_changes(path),
113
+ }
114
+
115
+ return _git_info_cache
@@ -27,11 +27,11 @@ if name == "nt":
27
27
  """find the path to the git executable on Windows"""
28
28
  # first see if git is in the path
29
29
  try:
30
- check_output(["where", "/Q", "git"])
30
+ subprocess.check_output(["where", "/Q", "git"])
31
31
  # if this command succeeded, git is in the path
32
32
  return "git"
33
33
  # catch the exception thrown if git was not found
34
- except CalledProcessError:
34
+ except subprocess.CalledProcessError:
35
35
  pass
36
36
  # There are several locations where git.exe may be hiding
37
37
  possible_locations = []
@@ -75,6 +75,7 @@ FLOW_DECORATORS_DESC = [
75
75
  ENVIRONMENTS_DESC = [
76
76
  ("conda", ".pypi.conda_environment.CondaEnvironment"),
77
77
  ("pypi", ".pypi.pypi_environment.PyPIEnvironment"),
78
+ ("uv", ".uv.uv_environment.UVEnvironment"),
78
79
  ]
79
80
 
80
81
  # Add metadata providers here
@@ -1992,6 +1992,15 @@ class ArgoWorkflows(object):
1992
1992
  resources["disk"],
1993
1993
  )
1994
1994
 
1995
+ security_context = resources.get("security_context", None)
1996
+ _security_context = {}
1997
+ if security_context is not None and len(security_context) > 0:
1998
+ _security_context = {
1999
+ "security_context": kubernetes_sdk.V1SecurityContext(
2000
+ **security_context
2001
+ )
2002
+ }
2003
+
1995
2004
  # Create a ContainerTemplate for this node. Ideally, we would have
1996
2005
  # liked to inline this ContainerTemplate and avoid scanning the workflow
1997
2006
  # twice, but due to issues with variable substitution, we will have to
@@ -2048,6 +2057,7 @@ class ArgoWorkflows(object):
2048
2057
  shared_memory=shared_memory,
2049
2058
  port=port,
2050
2059
  qos=resources["qos"],
2060
+ security_context=security_context,
2051
2061
  )
2052
2062
 
2053
2063
  for k, v in env.items():
@@ -2333,6 +2343,7 @@ class ArgoWorkflows(object):
2333
2343
  is not None
2334
2344
  else []
2335
2345
  ),
2346
+ **_security_context,
2336
2347
  ).to_dict()
2337
2348
  )
2338
2349
  )
@@ -2762,7 +2773,7 @@ class ArgoWorkflows(object):
2762
2773
  "type": "section",
2763
2774
  "text": {
2764
2775
  "type": "mrkdwn",
2765
- "text": ":metaflow: Environment details"
2776
+ "text": "Environment details"
2766
2777
  },
2767
2778
  "fields": [
2768
2779
  {
@@ -2780,7 +2791,7 @@ class ArgoWorkflows(object):
2780
2791
  "type": "section",
2781
2792
  "text": {
2782
2793
  "type": "mrkdwn",
2783
- "text": ":metaflow: Environment details"
2794
+ "text": "Environment details"
2784
2795
  }
2785
2796
  }
2786
2797
 
@@ -40,6 +40,7 @@ unsupported_decorators = {
40
40
  "snowpark": "Step *%s* is marked for execution on Snowpark with Argo Workflows which isn't currently supported.",
41
41
  "slurm": "Step *%s* is marked for execution on Slurm with Argo Workflows which isn't currently supported.",
42
42
  "nvidia": "Step *%s* is marked for execution on Nvidia with Argo Workflows which isn't currently supported.",
43
+ "nvct": "Step *%s* is marked for execution on Nvct with Argo Workflows which isn't currently supported.",
43
44
  }
44
45
 
45
46
 
@@ -14,6 +14,7 @@ class Boto3ClientProvider(object):
14
14
  AWS_SANDBOX_ENABLED,
15
15
  AWS_SANDBOX_STS_ENDPOINT_URL,
16
16
  AWS_SANDBOX_API_KEY,
17
+ S3_CLIENT_RETRY_CONFIG,
17
18
  )
18
19
 
19
20
  if session_vars is None:
@@ -37,10 +38,10 @@ class Boto3ClientProvider(object):
37
38
  if module == "s3" and (
38
39
  "config" not in client_params or client_params["config"].retries is None
39
40
  ):
40
- # Use the adaptive retry strategy by default -- do not set anything if
41
- # the user has already set something
41
+ # do not set anything if the user has already set something
42
42
  config = client_params.get("config", Config())
43
- config.retries = {"max_attempts": 10, "mode": "adaptive"}
43
+ config.retries = S3_CLIENT_RETRY_CONFIG
44
+ client_params["config"] = config
44
45
 
45
46
  if AWS_SANDBOX_ENABLED:
46
47
  # role is ignored in the sandbox
@@ -119,7 +119,9 @@ class _GSRootClient(object):
119
119
  blob.metadata = {"metaflow-user-attributes": json.dumps(metadata)}
120
120
  from google.cloud.storage.retry import DEFAULT_RETRY
121
121
 
122
- blob.upload_from_filename(tmpfile, retry=DEFAULT_RETRY)
122
+ blob.upload_from_filename(
123
+ tmpfile, retry=DEFAULT_RETRY, timeout=(14400, 60)
124
+ ) # generous timeout for massive uploads. Use the same values as for Azure (connection_timeout, read_timeout)
123
125
  except Exception as e:
124
126
  process_gs_exception(e)
125
127
 
@@ -1,3 +1,4 @@
1
+ import errno
1
2
  import json
2
3
  import os
3
4
  import re
@@ -18,6 +19,7 @@ from metaflow.metaflow_config import (
18
19
  S3_RETRY_COUNT,
19
20
  S3_TRANSIENT_RETRY_COUNT,
20
21
  S3_SERVER_SIDE_ENCRYPTION,
22
+ S3_WORKER_COUNT,
21
23
  TEMPDIR,
22
24
  )
23
25
  from metaflow.util import (
@@ -136,6 +138,10 @@ class MetaflowS3InvalidRange(MetaflowException):
136
138
  headline = "S3 invalid range"
137
139
 
138
140
 
141
+ class MetaflowS3InsufficientDiskSpace(MetaflowException):
142
+ headline = "Insufficient disk space"
143
+
144
+
139
145
  class S3Object(object):
140
146
  """
141
147
  This object represents a path or an object in S3,
@@ -1376,8 +1382,10 @@ class S3(object):
1376
1382
  elif error_code == "NoSuchBucket":
1377
1383
  raise MetaflowS3URLException("Specified S3 bucket doesn't exist.")
1378
1384
  error = str(err)
1385
+ except OSError as e:
1386
+ if e.errno == errno.ENOSPC:
1387
+ raise MetaflowS3InsufficientDiskSpace(str(e))
1379
1388
  except Exception as ex:
1380
- # TODO specific error message for out of disk space
1381
1389
  error = str(ex)
1382
1390
  if tmp:
1383
1391
  os.unlink(tmp.name)
@@ -1390,9 +1398,31 @@ class S3(object):
1390
1398
  )
1391
1399
 
1392
1400
  # add some jitter to make sure retries are not synchronized
1393
- def _jitter_sleep(self, trynum, multiplier=2):
1394
- interval = multiplier**trynum + random.randint(0, 10)
1395
- time.sleep(interval)
1401
+ def _jitter_sleep(
1402
+ self, trynum: int, base: int = 2, cap: int = 360, jitter: float = 0.1
1403
+ ) -> None:
1404
+ """
1405
+ Sleep for an exponentially increasing interval with added jitter.
1406
+
1407
+ Parameters
1408
+ ----------
1409
+ trynum: The current retry attempt number.
1410
+ base: The base multiplier for the exponential backoff.
1411
+ cap: The maximum interval to sleep.
1412
+ jitter: The maximum jitter percentage to add to the interval.
1413
+ """
1414
+ # Calculate the exponential backoff interval
1415
+ interval = min(cap, base**trynum)
1416
+
1417
+ # Add random jitter
1418
+ jitter_value = interval * jitter * random.uniform(-1, 1)
1419
+ interval_with_jitter = interval + jitter_value
1420
+
1421
+ # Ensure the interval is not negative
1422
+ interval_with_jitter = max(0, interval_with_jitter)
1423
+
1424
+ # Sleep for the calculated interval
1425
+ time.sleep(interval_with_jitter)
1396
1426
 
1397
1427
  # NOTE: re: _read_many_files and _put_many_files
1398
1428
  # All file IO is through binary files - we write bytes, we read
@@ -1480,20 +1510,17 @@ class S3(object):
1480
1510
  # - a known transient failure (SlowDown for example) in which case we will
1481
1511
  # retry *only* the inputs that have this transient failure.
1482
1512
  # - an unknown failure (something went wrong but we cannot say if it was
1483
- # a known permanent failure or something else). In this case, we retry
1484
- # the operation completely.
1513
+ # a known permanent failure or something else). In this case, we assume
1514
+ # it's a transient failure and retry only those inputs (same as above).
1485
1515
  #
1486
- # There are therefore two retry counts:
1487
- # - the transient failure retry count: how many times do we try on known
1488
- # transient errors
1489
- # - the top-level retry count: how many times do we try on unknown failures
1490
- #
1491
- # Note that, if the operation runs out of transient failure retries, it will
1492
- # count as an "unknown" failure (ie: it will be retried according to the
1493
- # outer top-level retry count). In other words, you can potentially have
1494
- # transient_retry_count * retry_count tries).
1495
- # Finally, if on transient failures, we make NO progress (ie: no input is
1496
- # successfully processed), that counts as an "unknown" failure.
1516
+ # NOTES(npow): 2025-05-13
1517
+ # Previously, this code would also retry the fatal failures, including no_progress
1518
+ # and unknown failures, from the beginning. This is not ideal because:
1519
+ # 1. Fatal errors are not supposed to be retried.
1520
+ # 2. Retrying from the beginning does not improve the situation, and is
1521
+ # wasteful since we have already uploaded some files.
1522
+ # 3. The number of transient errors is far more than fatal errors, so we
1523
+ # can be optimistic and assume the unknown errors are transient.
1497
1524
  cmdline = [sys.executable, os.path.abspath(s3op.__file__), mode]
1498
1525
  recursive_get = False
1499
1526
  for key, value in options.items():
@@ -1528,7 +1555,6 @@ class S3(object):
1528
1555
  # Otherwise, we cap the failure rate at 90%
1529
1556
  return min(90, self._s3_inject_failures)
1530
1557
 
1531
- retry_count = 0 # Number of retries (excluding transient failures)
1532
1558
  transient_retry_count = 0 # Number of transient retries (per top-level retry)
1533
1559
  inject_failures = _inject_failure_rate()
1534
1560
  out_lines = [] # List to contain the lines returned by _s3op_with_retries
@@ -1595,7 +1621,12 @@ class S3(object):
1595
1621
  # things, this will shrink more and more until we are doing a
1596
1622
  # single operation at a time. If things start going better, it
1597
1623
  # will increase by 20% every round.
1598
- max_count = min(int(last_ok_count * 1.2), len(pending_retries))
1624
+ #
1625
+ # If we made no progress (last_ok_count == 0) we retry at most
1626
+ # 2*S3_WORKER_COUNT from whatever is left in `pending_retries`
1627
+ max_count = min(
1628
+ int(last_ok_count * 1.2), len(pending_retries)
1629
+ ) or min(2 * S3_WORKER_COUNT, len(pending_retries))
1599
1630
  tmp_input.writelines(pending_retries[:max_count])
1600
1631
  tmp_input.flush()
1601
1632
  debug.s3client_exec(
@@ -1712,38 +1743,16 @@ class S3(object):
1712
1743
  _update_out_lines(out_lines, ok_lines, resize=loop_count == 0)
1713
1744
  return 0, 0, inject_failures, err_out
1714
1745
 
1715
- while retry_count <= S3_RETRY_COUNT:
1746
+ while transient_retry_count <= S3_TRANSIENT_RETRY_COUNT:
1716
1747
  (
1717
1748
  last_ok_count,
1718
1749
  last_retry_count,
1719
1750
  inject_failures,
1720
1751
  err_out,
1721
1752
  ) = try_s3_op(last_ok_count, pending_retries, out_lines, inject_failures)
1722
- if err_out or (
1723
- last_retry_count != 0
1724
- and (
1725
- last_ok_count == 0
1726
- or transient_retry_count > S3_TRANSIENT_RETRY_COUNT
1727
- )
1728
- ):
1729
- # We had a fatal failure (err_out is not None)
1730
- # or we made no progress (last_ok_count is 0)
1731
- # or we are out of transient retries
1732
- # so we will restart from scratch (being very conservative)
1733
- retry_count += 1
1734
- err_msg = err_out
1735
- if err_msg is None and last_ok_count == 0:
1736
- err_msg = "No progress"
1737
- if err_msg is None:
1738
- err_msg = "Too many transient errors"
1739
- print(
1740
- "S3 non-transient error (attempt #%d): %s" % (retry_count, err_msg)
1741
- )
1742
- _reset()
1743
- if retry_count <= S3_RETRY_COUNT:
1744
- self._jitter_sleep(retry_count)
1745
- continue
1746
- elif last_retry_count != 0:
1753
+ if err_out:
1754
+ break
1755
+ if last_retry_count != 0:
1747
1756
  # During our last try, we did not manage to process everything we wanted
1748
1757
  # due to a transient failure so we try again.
1749
1758
  transient_retry_count += 1