metaflow 2.12.21__tar.gz → 2.12.23__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.
Files changed (361) hide show
  1. {metaflow-2.12.21/metaflow.egg-info → metaflow-2.12.23}/PKG-INFO +2 -2
  2. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/cli.py +24 -19
  3. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/client/core.py +1 -1
  4. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/cmd/develop/stub_generator.py +17 -0
  5. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/cmd/develop/stubs.py +3 -3
  6. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/metaflow_version.py +8 -5
  7. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/argo/argo_client.py +2 -0
  8. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/argo/argo_workflows.py +93 -51
  9. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/argo/argo_workflows_cli.py +26 -0
  10. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/kubernetes/kubernetes_client.py +7 -1
  11. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/kubernetes/kubernetes_decorator.py +5 -1
  12. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +7 -1
  13. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/pypi/bootstrap.py +1 -1
  14. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/pypi/micromamba.py +26 -0
  15. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/runner/deployer.py +4 -49
  16. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/runner/metaflow_runner.py +22 -25
  17. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/runner/subprocess_manager.py +33 -17
  18. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/runner/utils.py +53 -1
  19. metaflow-2.12.23/metaflow/version.py +1 -0
  20. {metaflow-2.12.21 → metaflow-2.12.23/metaflow.egg-info}/PKG-INFO +2 -2
  21. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow.egg-info/SOURCES.txt +0 -1
  22. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow.egg-info/requires.txt +1 -1
  23. metaflow-2.12.21/metaflow/plugins/argo/daemon.py +0 -59
  24. metaflow-2.12.21/metaflow/version.py +0 -1
  25. {metaflow-2.12.21 → metaflow-2.12.23}/LICENSE +0 -0
  26. {metaflow-2.12.21 → metaflow-2.12.23}/MANIFEST.in +0 -0
  27. {metaflow-2.12.21 → metaflow-2.12.23}/README.md +0 -0
  28. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/R.py +0 -0
  29. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/__init__.py +0 -0
  30. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/__init__.py +0 -0
  31. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/click/__init__.py +0 -0
  32. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  33. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/click/_compat.py +0 -0
  34. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/click/_termui_impl.py +0 -0
  35. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/click/_textwrap.py +0 -0
  36. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/click/_unicodefun.py +0 -0
  37. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/click/_winconsole.py +0 -0
  38. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/click/core.py +0 -0
  39. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/click/decorators.py +0 -0
  40. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/click/exceptions.py +0 -0
  41. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/click/formatting.py +0 -0
  42. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/click/globals.py +0 -0
  43. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/click/parser.py +0 -0
  44. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/click/termui.py +0 -0
  45. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/click/testing.py +0 -0
  46. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/click/types.py +0 -0
  47. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/click/utils.py +0 -0
  48. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
  49. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
  50. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
  51. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
  52. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
  53. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
  54. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
  55. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
  56. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
  57. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/packaging/__init__.py +0 -0
  58. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/packaging/_elffile.py +0 -0
  59. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  60. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  61. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/packaging/_parser.py +0 -0
  62. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/packaging/_structures.py +0 -0
  63. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  64. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/packaging/markers.py +0 -0
  65. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/packaging/py.typed +0 -0
  66. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/packaging/requirements.py +0 -0
  67. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/packaging/specifiers.py +0 -0
  68. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/packaging/tags.py +0 -0
  69. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/packaging/utils.py +0 -0
  70. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/packaging/version.py +0 -0
  71. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/typeguard/__init__.py +0 -0
  72. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/typeguard/_checkers.py +0 -0
  73. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/typeguard/_config.py +0 -0
  74. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/typeguard/_decorators.py +0 -0
  75. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
  76. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/typeguard/_functions.py +0 -0
  77. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/typeguard/_importhook.py +0 -0
  78. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/typeguard/_memo.py +0 -0
  79. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
  80. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/typeguard/_suppression.py +0 -0
  81. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/typeguard/_transformer.py +0 -0
  82. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
  83. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/typeguard/_utils.py +0 -0
  84. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/typeguard/py.typed +0 -0
  85. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/typing_extensions.py +0 -0
  86. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/v3_5/__init__.py +0 -0
  87. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
  88. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
  89. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/v3_5/zipp.py +0 -0
  90. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/v3_6/__init__.py +0 -0
  91. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  92. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  93. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  94. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  95. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  96. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  97. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  98. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  99. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  100. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  101. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/v3_6/zipp.py +0 -0
  102. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/_vendor/zipp.py +0 -0
  103. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/cards.py +0 -0
  104. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/cli_args.py +0 -0
  105. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/client/__init__.py +0 -0
  106. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/client/filecache.py +0 -0
  107. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/clone_util.py +0 -0
  108. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/cmd/__init__.py +0 -0
  109. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/cmd/configure_cmd.py +0 -0
  110. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/cmd/develop/__init__.py +0 -0
  111. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/cmd/main_cli.py +0 -0
  112. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/cmd/tutorials_cmd.py +0 -0
  113. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/cmd/util.py +0 -0
  114. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/cmd_with_io.py +0 -0
  115. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/datastore/__init__.py +0 -0
  116. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/datastore/content_addressed_store.py +0 -0
  117. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/datastore/datastore_set.py +0 -0
  118. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/datastore/datastore_storage.py +0 -0
  119. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/datastore/exceptions.py +0 -0
  120. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/datastore/flow_datastore.py +0 -0
  121. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/datastore/inputs.py +0 -0
  122. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/datastore/task_datastore.py +0 -0
  123. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/debug.py +0 -0
  124. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/decorators.py +0 -0
  125. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/event_logger.py +0 -0
  126. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/events.py +0 -0
  127. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/exception.py +0 -0
  128. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/extension_support/__init__.py +0 -0
  129. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/extension_support/_empty_file.py +0 -0
  130. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/extension_support/cmd.py +0 -0
  131. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/extension_support/integrations.py +0 -0
  132. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/extension_support/plugins.py +0 -0
  133. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/flowspec.py +0 -0
  134. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/graph.py +0 -0
  135. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/includefile.py +0 -0
  136. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/info_file.py +0 -0
  137. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/integrations.py +0 -0
  138. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/lint.py +0 -0
  139. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/metadata/__init__.py +0 -0
  140. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/metadata/heartbeat.py +0 -0
  141. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/metadata/metadata.py +0 -0
  142. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/metadata/util.py +0 -0
  143. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/metaflow_config.py +0 -0
  144. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/metaflow_config_funcs.py +0 -0
  145. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/metaflow_current.py +0 -0
  146. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/metaflow_environment.py +0 -0
  147. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/metaflow_profile.py +0 -0
  148. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/mflog/__init__.py +0 -0
  149. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/mflog/mflog.py +0 -0
  150. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/mflog/save_logs.py +0 -0
  151. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/mflog/save_logs_periodically.py +0 -0
  152. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/mflog/tee.py +0 -0
  153. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/monitor.py +0 -0
  154. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/multicore_utils.py +0 -0
  155. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/package.py +0 -0
  156. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/parameters.py +0 -0
  157. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/__init__.py +0 -0
  158. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/airflow/__init__.py +0 -0
  159. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/airflow/airflow.py +0 -0
  160. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  161. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  162. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  163. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/airflow/dag.py +0 -0
  164. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/airflow/exception.py +0 -0
  165. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  166. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  167. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  168. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
  169. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
  170. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
  171. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/argo/__init__.py +0 -0
  172. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/argo/argo_events.py +0 -0
  173. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  174. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
  175. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/argo/capture_error.py +0 -0
  176. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/argo/generate_input_paths.py +0 -0
  177. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
  178. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/__init__.py +0 -0
  179. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/aws_client.py +0 -0
  180. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/aws_utils.py +0 -0
  181. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/batch/__init__.py +0 -0
  182. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/batch/batch.py +0 -0
  183. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  184. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  185. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
  186. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  187. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  188. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  189. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  190. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  191. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  192. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  193. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  194. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
  195. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
  196. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  197. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  198. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
  199. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/azure/__init__.py +0 -0
  200. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/azure/azure_credential.py +0 -0
  201. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  202. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
  203. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/azure/azure_tail.py +0 -0
  204. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/azure/azure_utils.py +0 -0
  205. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  206. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/azure/includefile_support.py +0 -0
  207. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/__init__.py +0 -0
  208. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_cli.py +0 -0
  209. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_client.py +0 -0
  210. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_creator.py +0 -0
  211. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_datastore.py +0 -0
  212. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_decorator.py +0 -0
  213. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  214. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_modules/base.html +0 -0
  215. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_modules/basic.py +0 -0
  216. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
  217. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_modules/card.py +0 -0
  218. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  219. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  220. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  221. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  222. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  223. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_modules/components.py +0 -0
  224. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  225. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_modules/main.js +0 -0
  226. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  227. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  228. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_resolver.py +0 -0
  229. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_server.py +0 -0
  230. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
  231. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/component_serializer.py +0 -0
  232. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/cards/exception.py +0 -0
  233. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/catch_decorator.py +0 -0
  234. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/datastores/__init__.py +0 -0
  235. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/datastores/azure_storage.py +0 -0
  236. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/datastores/gs_storage.py +0 -0
  237. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/datastores/local_storage.py +0 -0
  238. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/datastores/s3_storage.py +0 -0
  239. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/datatools/__init__.py +0 -0
  240. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/datatools/local.py +0 -0
  241. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  242. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/datatools/s3/s3.py +0 -0
  243. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/datatools/s3/s3op.py +0 -0
  244. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  245. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  246. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/debug_logger.py +0 -0
  247. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/debug_monitor.py +0 -0
  248. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/__init__.py +0 -0
  249. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/client.py +0 -0
  250. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/client_modules.py +0 -0
  251. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  252. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  253. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  254. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  255. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  256. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  257. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  258. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  259. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  260. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  261. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/consts.py +0 -0
  262. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  263. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  264. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  265. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/server.py +0 -0
  266. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/stub.py +0 -0
  267. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/env_escape/utils.py +0 -0
  268. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/environment_decorator.py +0 -0
  269. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/events_decorator.py +0 -0
  270. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/frameworks/__init__.py +0 -0
  271. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/frameworks/pytorch.py +0 -0
  272. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/gcp/__init__.py +0 -0
  273. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
  274. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  275. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  276. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/gcp/gs_tail.py +0 -0
  277. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/gcp/gs_utils.py +0 -0
  278. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/gcp/includefile_support.py +0 -0
  279. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/kubernetes/__init__.py +0 -0
  280. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
  281. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/kubernetes/kubernetes.py +0 -0
  282. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/kubernetes/kubernetes_cli.py +0 -0
  283. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/kubernetes/kubernetes_job.py +0 -0
  284. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/logs_cli.py +0 -0
  285. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/metadata/__init__.py +0 -0
  286. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/metadata/local.py +0 -0
  287. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/metadata/service.py +0 -0
  288. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/package_cli.py +0 -0
  289. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/parallel_decorator.py +0 -0
  290. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/project_decorator.py +0 -0
  291. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/pypi/__init__.py +0 -0
  292. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/pypi/conda_decorator.py +0 -0
  293. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/pypi/conda_environment.py +0 -0
  294. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/pypi/pip.py +0 -0
  295. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
  296. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  297. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/pypi/utils.py +0 -0
  298. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/resources_decorator.py +0 -0
  299. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/retry_decorator.py +0 -0
  300. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/secrets/__init__.py +0 -0
  301. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  302. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  303. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/storage_executor.py +0 -0
  304. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/tag_cli.py +0 -0
  305. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  306. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/plugins/timeout_decorator.py +0 -0
  307. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/procpoll.py +0 -0
  308. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/py.typed +0 -0
  309. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/pylint_wrapper.py +0 -0
  310. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/runner/__init__.py +0 -0
  311. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/runner/click_api.py +0 -0
  312. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/runner/nbdeploy.py +0 -0
  313. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/runner/nbrun.py +0 -0
  314. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/runtime.py +0 -0
  315. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/sidecar/__init__.py +0 -0
  316. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/sidecar/sidecar.py +0 -0
  317. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/sidecar/sidecar_messages.py +0 -0
  318. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  319. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/sidecar/sidecar_worker.py +0 -0
  320. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/system/__init__.py +0 -0
  321. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/system/system_logger.py +0 -0
  322. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/system/system_monitor.py +0 -0
  323. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/system/system_utils.py +0 -0
  324. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tagging_util.py +0 -0
  325. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/task.py +0 -0
  326. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tracing/__init__.py +0 -0
  327. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tracing/propagator.py +0 -0
  328. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tracing/span_exporter.py +0 -0
  329. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tracing/tracing_modules.py +0 -0
  330. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tuple_util.py +0 -0
  331. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/00-helloworld/README.md +0 -0
  332. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  333. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/01-playlist/README.md +0 -0
  334. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  335. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  336. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  337. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/02-statistics/README.md +0 -0
  338. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  339. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  340. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/02-statistics/stats.py +0 -0
  341. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  342. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  343. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  344. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  345. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  346. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  347. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  348. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  349. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  350. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/07-worldview/README.md +0 -0
  351. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  352. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/08-autopilot/README.md +0 -0
  353. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  354. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/unbounded_foreach.py +0 -0
  355. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/util.py +0 -0
  356. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow/vendor.py +0 -0
  357. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow.egg-info/dependency_links.txt +0 -0
  358. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow.egg-info/entry_points.txt +0 -0
  359. {metaflow-2.12.21 → metaflow-2.12.23}/metaflow.egg-info/top_level.txt +0 -0
  360. {metaflow-2.12.21 → metaflow-2.12.23}/setup.cfg +0 -0
  361. {metaflow-2.12.21 → metaflow-2.12.23}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: metaflow
3
- Version: 2.12.21
3
+ Version: 2.12.23
4
4
  Summary: Metaflow: More Data Science, Less Engineering
5
5
  Author: Metaflow Developers
6
6
  Author-email: help@metaflow.org
@@ -26,7 +26,7 @@ License-File: LICENSE
26
26
  Requires-Dist: requests
27
27
  Requires-Dist: boto3
28
28
  Provides-Extra: stubs
29
- Requires-Dist: metaflow-stubs==2.12.21; extra == "stubs"
29
+ Requires-Dist: metaflow-stubs==2.12.23; extra == "stubs"
30
30
 
31
31
  ![Metaflow_Logo_Horizontal_FullColor_Ribbon_Dark_RGB](https://user-images.githubusercontent.com/763451/89453116-96a57e00-d713-11ea-9fa6-82b29d4d6eff.png)
32
32
 
@@ -1,5 +1,5 @@
1
1
  import inspect
2
- import os
2
+ import json
3
3
  import sys
4
4
  import traceback
5
5
  from datetime import datetime
@@ -7,6 +7,7 @@ from functools import wraps
7
7
 
8
8
  import metaflow.tracing as tracing
9
9
  from metaflow._vendor import click
10
+ from metaflow.client.core import get_metadata
10
11
 
11
12
  from . import decorators, lint, metaflow_version, namespace, parameters, plugins
12
13
  from .cli_args import cli_args
@@ -698,15 +699,17 @@ def resume(
698
699
  runtime.print_workflow_info()
699
700
 
700
701
  runtime.persist_constants()
701
- write_file(
702
- runner_attribute_file,
703
- "%s@%s:%s"
704
- % (
705
- obj.metadata.__class__.TYPE,
706
- obj.metadata.__class__.INFO,
707
- "/".join((obj.flow.name, runtime.run_id)),
708
- ),
709
- )
702
+
703
+ if runner_attribute_file:
704
+ with open(runner_attribute_file, "w") as f:
705
+ json.dump(
706
+ {
707
+ "run_id": runtime.run_id,
708
+ "flow_name": obj.flow.name,
709
+ "metadata": get_metadata(),
710
+ },
711
+ f,
712
+ )
710
713
 
711
714
  # We may skip clone-only resume if this is not a resume leader,
712
715
  # and clone is already complete.
@@ -774,15 +777,17 @@ def run(
774
777
  obj.flow._set_constants(obj.graph, kwargs)
775
778
  runtime.print_workflow_info()
776
779
  runtime.persist_constants()
777
- write_file(
778
- runner_attribute_file,
779
- "%s@%s:%s"
780
- % (
781
- obj.metadata.__class__.TYPE,
782
- obj.metadata.__class__.INFO,
783
- "/".join((obj.flow.name, runtime.run_id)),
784
- ),
785
- )
780
+
781
+ if runner_attribute_file:
782
+ with open(runner_attribute_file, "w") as f:
783
+ json.dump(
784
+ {
785
+ "run_id": runtime.run_id,
786
+ "flow_name": obj.flow.name,
787
+ "metadata": get_metadata(),
788
+ },
789
+ f,
790
+ )
786
791
  runtime.execute()
787
792
 
788
793
 
@@ -2358,7 +2358,7 @@ class Metaflow(object):
2358
2358
  Flow
2359
2359
  Flow with the given name.
2360
2360
  """
2361
- return Flow(id)
2361
+ return Flow(name)
2362
2362
 
2363
2363
 
2364
2364
  _CLASSES["flow"] = Flow
@@ -115,6 +115,11 @@ class StubGenerator:
115
115
  :type members_from_other_modules: List[str]
116
116
  """
117
117
 
118
+ # Let metaflow know we are in stubgen mode. This is sometimes useful to skip
119
+ # some processing like loading libraries, etc. It is used in Metaflow extensions
120
+ # so do not remove even if you do not see a use for it directly in the code.
121
+ os.environ["METAFLOW_STUBGEN"] = "1"
122
+
118
123
  self._write_generated_for = include_generated_for
119
124
  self._pending_modules = ["metaflow"] # type: List[str]
120
125
  self._pending_modules.extend(get_aliased_modules())
@@ -398,6 +403,18 @@ class StubGenerator:
398
403
  name_with_module = self._get_element_name_with_module(clazz.__class__)
399
404
  buff.write("metaclass=" + name_with_module + "):\n")
400
405
 
406
+ # Add class docstring
407
+ if clazz.__doc__:
408
+ buff.write('%s"""\n' % TAB)
409
+ my_doc = cast(str, deindent_docstring(clazz.__doc__))
410
+ init_blank = True
411
+ for line in my_doc.split("\n"):
412
+ if init_blank and len(line.strip()) == 0:
413
+ continue
414
+ init_blank = False
415
+ buff.write("%s%s\n" % (TAB, line.rstrip()))
416
+ buff.write('%s"""\n' % TAB)
417
+
401
418
  # For NamedTuple, we have __annotations__ but no __init__. In that case,
402
419
  # we are going to "create" a __init__ function with the annotations
403
420
  # to show what the class takes.
@@ -170,7 +170,7 @@ def install(ctx: Any, force: bool):
170
170
  "Metaflow stubs are already installed and valid -- use --force to reinstall"
171
171
  )
172
172
  return
173
- mf_version, _ = get_mf_version()
173
+ mf_version, _ = get_mf_version(True)
174
174
  with tempfile.TemporaryDirectory() as tmp_dir:
175
175
  with open(os.path.join(tmp_dir, "setup.py"), "w") as f:
176
176
  f.write(
@@ -261,10 +261,10 @@ def split_version(vers: str) -> Tuple[str, Optional[str]]:
261
261
  return vers_split[0], vers_split[1]
262
262
 
263
263
 
264
- def get_mf_version() -> Tuple[str, Optional[str]]:
264
+ def get_mf_version(public: bool = False) -> Tuple[str, Optional[str]]:
265
265
  from metaflow.metaflow_version import get_version
266
266
 
267
- return split_version(get_version())
267
+ return split_version(get_version(public))
268
268
 
269
269
 
270
270
  def get_stubs_version(stubs_root_path: Optional[str]) -> Tuple[str, Optional[str]]:
@@ -195,11 +195,14 @@ def get_version(public=False):
195
195
  if ext_version is None:
196
196
  ext_version = getattr(extension_module, "__version__", "<unk>")
197
197
  # Update the package information about reported version for the extension
198
- update_package_info(
199
- package_name=pkg_name,
200
- extension_name=ext_name,
201
- package_version=ext_version,
202
- )
198
+ # (only for the full info which is called at least once -- if we update more
199
+ # it will error out since we can only update_package_info once)
200
+ if not public:
201
+ update_package_info(
202
+ package_name=pkg_name,
203
+ extension_name=ext_name,
204
+ package_version=ext_version,
205
+ )
203
206
  ext_versions.append("%s(%s)" % (ext_name, ext_version))
204
207
 
205
208
  # We now have all the information about extensions so we can form the final string
@@ -295,6 +295,8 @@ class ArgoClient(object):
295
295
  "suspend": schedule is None,
296
296
  "schedule": schedule,
297
297
  "timezone": timezone,
298
+ "failedJobsHistoryLimit": 10000, # default is unfortunately 1
299
+ "successfulJobsHistoryLimit": 10000, # default is unfortunately 3
298
300
  "workflowSpec": {"workflowTemplateRef": {"name": name}},
299
301
  },
300
302
  }
@@ -455,11 +455,17 @@ class ArgoWorkflows(object):
455
455
  )
456
456
  seen.add(norm)
457
457
 
458
- if param.kwargs.get("type") == JSONType or isinstance(
459
- param.kwargs.get("type"), FilePathClass
460
- ):
461
- # Special-case this to avoid touching core
458
+ extra_attrs = {}
459
+ if param.kwargs.get("type") == JSONType:
460
+ param_type = str(param.kwargs.get("type").name)
461
+ elif isinstance(param.kwargs.get("type"), FilePathClass):
462
462
  param_type = str(param.kwargs.get("type").name)
463
+ extra_attrs["is_text"] = getattr(
464
+ param.kwargs.get("type"), "_is_text", True
465
+ )
466
+ extra_attrs["encoding"] = getattr(
467
+ param.kwargs.get("type"), "_encoding", "utf-8"
468
+ )
463
469
  else:
464
470
  param_type = str(param.kwargs.get("type").__name__)
465
471
 
@@ -487,6 +493,7 @@ class ArgoWorkflows(object):
487
493
  type=param_type,
488
494
  description=param.kwargs.get("help"),
489
495
  is_required=is_required,
496
+ **extra_attrs
490
497
  )
491
498
  return parameters
492
499
 
@@ -1483,7 +1490,11 @@ class ArgoWorkflows(object):
1483
1490
  # {{foo.bar['param_name']}}.
1484
1491
  # https://argoproj.github.io/argo-events/tutorials/02-parameterization/
1485
1492
  # http://masterminds.github.io/sprig/strings.html
1486
- "--%s={{workflow.parameters.%s}}"
1493
+ (
1494
+ "--%s='{{workflow.parameters.%s}}'"
1495
+ if parameter["type"] == "JSON"
1496
+ else "--%s={{workflow.parameters.%s}}"
1497
+ )
1487
1498
  % (parameter["name"], parameter["name"])
1488
1499
  for parameter in self.parameters.values()
1489
1500
  ]
@@ -2515,10 +2526,29 @@ class ArgoWorkflows(object):
2515
2526
  # Use all the affordances available to _parameters task
2516
2527
  executable = self.environment.executable("_parameters")
2517
2528
  run_id = "argo-{{workflow.name}}"
2518
- entrypoint = [executable, "-m metaflow.plugins.argo.daemon"]
2519
- heartbeat_cmds = "{entrypoint} --flow_name {flow_name} --run_id {run_id} {tags} heartbeat".format(
2529
+ script_name = os.path.basename(sys.argv[0])
2530
+ entrypoint = [executable, script_name]
2531
+ # FlowDecorators can define their own top-level options. These might affect run level information
2532
+ # so it is important to pass these to the heartbeat process as well, as it might be the first task to register a run.
2533
+ top_opts_dict = {}
2534
+ for deco in flow_decorators(self.flow):
2535
+ top_opts_dict.update(deco.get_top_level_options())
2536
+
2537
+ top_level = list(dict_to_cli_options(top_opts_dict)) + [
2538
+ "--quiet",
2539
+ "--metadata=%s" % self.metadata.TYPE,
2540
+ "--environment=%s" % self.environment.TYPE,
2541
+ "--datastore=%s" % self.flow_datastore.TYPE,
2542
+ "--datastore-root=%s" % self.flow_datastore.datastore_root,
2543
+ "--event-logger=%s" % self.event_logger.TYPE,
2544
+ "--monitor=%s" % self.monitor.TYPE,
2545
+ "--no-pylint",
2546
+ "--with=argo_workflows_internal:auto-emit-argo-events=%i"
2547
+ % self.auto_emit_argo_events,
2548
+ ]
2549
+ heartbeat_cmds = "{entrypoint} {top_level} argo-workflows heartbeat --run_id {run_id} {tags}".format(
2520
2550
  entrypoint=" ".join(entrypoint),
2521
- flow_name=self.flow.name,
2551
+ top_level=" ".join(top_level) if top_level else "",
2522
2552
  run_id=run_id,
2523
2553
  tags=" ".join(["--tag %s" % t for t in self.tags]) if self.tags else "",
2524
2554
  )
@@ -2569,12 +2599,16 @@ class ArgoWorkflows(object):
2569
2599
  "METAFLOW_SERVICE_URL": SERVICE_INTERNAL_URL,
2570
2600
  "METAFLOW_SERVICE_HEADERS": json.dumps(SERVICE_HEADERS),
2571
2601
  "METAFLOW_USER": "argo-workflows",
2602
+ "METAFLOW_DATASTORE_SYSROOT_S3": DATASTORE_SYSROOT_S3,
2603
+ "METAFLOW_DATATOOLS_S3ROOT": DATATOOLS_S3ROOT,
2572
2604
  "METAFLOW_DEFAULT_DATASTORE": self.flow_datastore.TYPE,
2573
2605
  "METAFLOW_DEFAULT_METADATA": DEFAULT_METADATA,
2606
+ "METAFLOW_CARD_S3ROOT": CARD_S3ROOT,
2574
2607
  "METAFLOW_KUBERNETES_WORKLOAD": 1,
2608
+ "METAFLOW_KUBERNETES_FETCH_EC2_METADATA": KUBERNETES_FETCH_EC2_METADATA,
2575
2609
  "METAFLOW_RUNTIME_ENVIRONMENT": "kubernetes",
2576
2610
  "METAFLOW_OWNER": self.username,
2577
- "METAFLOW_PRODUCTION_TOKEN": self.production_token,
2611
+ "METAFLOW_PRODUCTION_TOKEN": self.production_token, # Used in identity resolving. This affects system tags.
2578
2612
  }
2579
2613
  # support Metaflow sandboxes
2580
2614
  env["METAFLOW_INIT_SCRIPT"] = KUBERNETES_SANDBOX_INIT_SCRIPT
@@ -2597,50 +2631,54 @@ class ArgoWorkflows(object):
2597
2631
  )
2598
2632
  from kubernetes import client as kubernetes_sdk
2599
2633
 
2600
- return DaemonTemplate("heartbeat-daemon").container(
2601
- to_camelcase(
2602
- kubernetes_sdk.V1Container(
2603
- name="main",
2604
- # TODO: Make the image configurable
2605
- image=resources["image"],
2606
- command=cmds,
2607
- env=[
2608
- kubernetes_sdk.V1EnvVar(name=k, value=str(v))
2609
- for k, v in env.items()
2610
- ],
2611
- env_from=[
2612
- kubernetes_sdk.V1EnvFromSource(
2613
- secret_ref=kubernetes_sdk.V1SecretEnvSource(
2614
- name=str(k),
2615
- # optional=True
2634
+ return (
2635
+ DaemonTemplate("heartbeat-daemon")
2636
+ .service_account_name(resources["service_account"])
2637
+ .container(
2638
+ to_camelcase(
2639
+ kubernetes_sdk.V1Container(
2640
+ name="main",
2641
+ # TODO: Make the image configurable
2642
+ image=resources["image"],
2643
+ command=cmds,
2644
+ env=[
2645
+ kubernetes_sdk.V1EnvVar(name=k, value=str(v))
2646
+ for k, v in env.items()
2647
+ ],
2648
+ env_from=[
2649
+ kubernetes_sdk.V1EnvFromSource(
2650
+ secret_ref=kubernetes_sdk.V1SecretEnvSource(
2651
+ name=str(k),
2652
+ # optional=True
2653
+ )
2616
2654
  )
2617
- )
2618
- for k in list(
2619
- []
2620
- if not resources.get("secrets")
2621
- else (
2622
- [resources.get("secrets")]
2623
- if isinstance(resources.get("secrets"), str)
2624
- else resources.get("secrets")
2655
+ for k in list(
2656
+ []
2657
+ if not resources.get("secrets")
2658
+ else (
2659
+ [resources.get("secrets")]
2660
+ if isinstance(resources.get("secrets"), str)
2661
+ else resources.get("secrets")
2662
+ )
2625
2663
  )
2626
- )
2627
- + KUBERNETES_SECRETS.split(",")
2628
- + ARGO_WORKFLOWS_KUBERNETES_SECRETS.split(",")
2629
- if k
2630
- ],
2631
- resources=kubernetes_sdk.V1ResourceRequirements(
2632
- # NOTE: base resources for this are kept to a minimum to save on running costs.
2633
- # This has an adverse effect on startup time for the daemon, which can be completely
2634
- # alleviated by using a base image that has the required dependencies pre-installed
2635
- requests={
2636
- "cpu": "200m",
2637
- "memory": "100Mi",
2638
- },
2639
- limits={
2640
- "cpu": "200m",
2641
- "memory": "100Mi",
2642
- },
2643
- ),
2664
+ + KUBERNETES_SECRETS.split(",")
2665
+ + ARGO_WORKFLOWS_KUBERNETES_SECRETS.split(",")
2666
+ if k
2667
+ ],
2668
+ resources=kubernetes_sdk.V1ResourceRequirements(
2669
+ # NOTE: base resources for this are kept to a minimum to save on running costs.
2670
+ # This has an adverse effect on startup time for the daemon, which can be completely
2671
+ # alleviated by using a base image that has the required dependencies pre-installed
2672
+ requests={
2673
+ "cpu": "200m",
2674
+ "memory": "100Mi",
2675
+ },
2676
+ limits={
2677
+ "cpu": "200m",
2678
+ "memory": "100Mi",
2679
+ },
2680
+ ),
2681
+ )
2644
2682
  )
2645
2683
  )
2646
2684
  )
@@ -3262,6 +3300,10 @@ class DaemonTemplate(object):
3262
3300
  self.payload["container"] = container
3263
3301
  return self
3264
3302
 
3303
+ def service_account_name(self, service_account_name):
3304
+ self.payload["serviceAccountName"] = service_account_name
3305
+ return self
3306
+
3265
3307
  def to_json(self):
3266
3308
  return self.payload
3267
3309
 
@@ -4,6 +4,7 @@ import platform
4
4
  import re
5
5
  import sys
6
6
  from hashlib import sha1
7
+ from time import sleep
7
8
 
8
9
  from metaflow import JSONType, Run, current, decorators, parameters
9
10
  from metaflow._vendor import click
@@ -959,6 +960,31 @@ def list_workflow_templates(obj, all=None):
959
960
  obj.echo_always(template_name)
960
961
 
961
962
 
963
+ # Internal CLI command to run a heartbeat daemon in an Argo Workflows Daemon container.
964
+ @argo_workflows.command(hidden=True, help="start heartbeat process for a run")
965
+ @click.option("--run_id", required=True)
966
+ @click.option(
967
+ "--tag",
968
+ "tags",
969
+ multiple=True,
970
+ default=None,
971
+ help="Annotate all objects produced by Argo Workflows runs "
972
+ "with the given tag. You can specify this option multiple "
973
+ "times to attach multiple tags.",
974
+ )
975
+ @click.pass_obj
976
+ def heartbeat(obj, run_id, tags=None):
977
+ # Try to register a run in case the start task has not taken care of it yet.
978
+ obj.metadata.register_run_id(run_id, tags)
979
+ # Start run heartbeat
980
+ obj.metadata.start_run_heartbeat(obj.flow.name, run_id)
981
+ # Keepalive loop
982
+ while True:
983
+ # Do not pollute daemon logs with anything unnecessary,
984
+ # as they might be extremely long running.
985
+ sleep(10)
986
+
987
+
962
988
  def validate_run_id(
963
989
  workflow_name, token_prefix, authorize, run_id, instructions_fn=None
964
990
  ):
@@ -121,7 +121,10 @@ class KubernetesClient(object):
121
121
  job_api = self._client.BatchV1Api()
122
122
  pods = self._find_active_pods(flow_name, run_id, user)
123
123
 
124
+ active_pods = False
125
+
124
126
  def _kill_pod(pod):
127
+ active_pods = True
125
128
  echo("Killing Kubernetes pod %s\n" % pod.metadata.name)
126
129
  try:
127
130
  stream(
@@ -155,7 +158,10 @@ class KubernetesClient(object):
155
158
  echo("failed to kill pod %s - %s" % (pod.metadata.name, str(e)))
156
159
 
157
160
  with ThreadPoolExecutor() as executor:
158
- executor.map(_kill_pod, list(pods))
161
+ executor.map(_kill_pod, pods)
162
+
163
+ if not active_pods:
164
+ echo("No active Kubernetes pods found for run *%s*" % run_id)
159
165
 
160
166
  def jobset(self, **kwargs):
161
167
  return KubernetesJobSet(self, **kwargs)
@@ -543,7 +543,11 @@ class KubernetesDecorator(StepDecorator):
543
543
 
544
544
  # TODO: Unify this method with the multi-node setup in @batch
545
545
  def _setup_multinode_environment():
546
- # FIXME: what about MF_MASTER_PORT
546
+ # TODO [FIXME SOON]
547
+ # Even if Kubernetes may deploy control pods before worker pods, there is always a
548
+ # possibility that the worker pods may start before the control. In the case that this happens,
549
+ # the worker pods will not be able to resolve the control pod's IP address and this will cause
550
+ # the worker pods to fail. This function should account for this in the near future.
547
551
  import socket
548
552
 
549
553
  try:
@@ -866,7 +866,13 @@ class KubernetesJobSet(object):
866
866
  spec=dict(
867
867
  replicatedJobs=[self.control.dump(), self.worker.dump()],
868
868
  suspend=False,
869
- startupPolicy=None,
869
+ startupPolicy=dict(
870
+ # We explicitly set an InOrder Startup policy so that
871
+ # we can ensure that the control pod starts before the worker pods.
872
+ # This is required so that when worker pods try to access the control's IP
873
+ # we are able to resolve the control's IP address.
874
+ startupPolicyOrder="InOrder"
875
+ ),
870
876
  successPolicy=None,
871
877
  # The Failure Policy helps setting the number of retries for the jobset.
872
878
  # but we don't rely on it and instead rely on either the local scheduler
@@ -89,7 +89,7 @@ if __name__ == "__main__":
89
89
  # TODO: micromamba installation can be pawned off to micromamba.py
90
90
  f"""set -e;
91
91
  if ! command -v micromamba >/dev/null 2>&1; then
92
- mkdir micromamba;
92
+ mkdir -p micromamba;
93
93
  python -c "import requests, bz2, sys; data = requests.get('https://micro.mamba.pm/api/micromamba/{architecture}/1.5.7').content; sys.stdout.buffer.write(bz2.decompress(data))" | tar -xv -C $(pwd)/micromamba bin/micromamba --strip-components 1;
94
94
  export PATH=$PATH:$(pwd)/micromamba;
95
95
  if ! command -v micromamba >/dev/null 2>&1; then
@@ -253,7 +253,33 @@ class Micromamba(object):
253
253
  try:
254
254
  output = json.loads(e.output)
255
255
  err = []
256
+ v_pkgs = ["__cuda", "__glibc"]
256
257
  for error in output.get("solver_problems", []):
258
+ # raise a specific error message for virtual package related errors
259
+ match = next((p for p in v_pkgs if p in error), None)
260
+ if match is not None:
261
+ vpkg_name = match[2:]
262
+ # try to strip version from error msg which are of the format:
263
+ # nothing provides <__vpkg> >=2.17,<3.0.a0 needed by <pkg_name>
264
+ try:
265
+ vpkg_version = error[
266
+ len("nothing provides %s " % match) : error.index(
267
+ " needed by"
268
+ )
269
+ ]
270
+ except ValueError:
271
+ vpkg_version = None
272
+ raise MicromambaException(
273
+ "Please set the environment variable CONDA_OVERRIDE_{var} to a specific version{version} of {name}.\n"
274
+ "Here is an example of supplying environment variables through the command line -\n\n"
275
+ "CONDA_OVERRIDE_{var}=<{name}-version> python flow.py <args>".format(
276
+ var=vpkg_name.upper(),
277
+ version=(
278
+ "" if not vpkg_version else (" (%s)" % vpkg_version)
279
+ ),
280
+ name=vpkg_name,
281
+ ),
282
+ )
257
283
  err.append(error)
258
284
  raise MicromambaException(
259
285
  msg.format(
@@ -6,56 +6,11 @@ import importlib
6
6
  import functools
7
7
  import tempfile
8
8
 
9
- from subprocess import CalledProcessError
10
9
  from typing import Optional, Dict, ClassVar
11
10
 
12
11
  from metaflow.exception import MetaflowNotFound
13
- from metaflow.runner.subprocess_manager import CommandManager, SubprocessManager
14
- from metaflow.runner.utils import read_from_file_when_ready
15
-
16
-
17
- def handle_timeout(
18
- tfp_runner_attribute, command_obj: CommandManager, file_read_timeout: int
19
- ):
20
- """
21
- Handle the timeout for a running subprocess command that reads a file
22
- and raises an error with appropriate logs if a TimeoutError occurs.
23
-
24
- Parameters
25
- ----------
26
- tfp_runner_attribute : NamedTemporaryFile
27
- Temporary file that stores runner attribute data.
28
- command_obj : CommandManager
29
- Command manager object that encapsulates the running command details.
30
- file_read_timeout : int
31
- Timeout for reading the file.
32
-
33
- Returns
34
- -------
35
- str
36
- Content read from the temporary file.
37
-
38
- Raises
39
- ------
40
- RuntimeError
41
- If a TimeoutError occurs, it raises a RuntimeError with the command's
42
- stdout and stderr logs.
43
- """
44
- try:
45
- content = read_from_file_when_ready(
46
- tfp_runner_attribute.name, command_obj, timeout=file_read_timeout
47
- )
48
- return content
49
- except (CalledProcessError, TimeoutError) as e:
50
- stdout_log = open(command_obj.log_files["stdout"]).read()
51
- stderr_log = open(command_obj.log_files["stderr"]).read()
52
- command = " ".join(command_obj.command)
53
- error_message = "Error executing: '%s':\n" % command
54
- if stdout_log.strip():
55
- error_message += "\nStdout:\n%s\n" % stdout_log
56
- if stderr_log.strip():
57
- error_message += "\nStderr:\n%s\n" % stderr_log
58
- raise RuntimeError(error_message) from e
12
+ from metaflow.runner.subprocess_manager import SubprocessManager
13
+ from metaflow.runner.utils import handle_timeout
59
14
 
60
15
 
61
16
  def get_lower_level_group(
@@ -209,7 +164,7 @@ class TriggeredRun(object):
209
164
  elif callable(v):
210
165
  setattr(self, k, functools.partial(v, self))
211
166
  else:
212
- setattr(self.__class__, k, property(fget=lambda _, v=v: v))
167
+ setattr(self, k, v)
213
168
 
214
169
  def wait_for_run(self, timeout=None):
215
170
  """
@@ -287,7 +242,7 @@ class DeployedFlow(object):
287
242
  elif callable(v):
288
243
  setattr(self, k, functools.partial(v, self))
289
244
  else:
290
- setattr(self.__class__, k, property(fget=lambda _, v=v: v))
245
+ setattr(self, k, v)
291
246
 
292
247
 
293
248
  class DeployerImpl(object):