metaflow 2.12.12__tar.gz → 2.12.14__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 (359) hide show
  1. {metaflow-2.12.12/metaflow.egg-info → metaflow-2.12.14}/PKG-INFO +2 -2
  2. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cli.py +3 -3
  3. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/client/core.py +2 -0
  4. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/flowspec.py +2 -1
  5. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/graph.py +7 -3
  6. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metaflow_config.py +11 -2
  7. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metaflow_config_funcs.py +51 -3
  8. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metaflow_environment.py +36 -21
  9. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/argo_workflows.py +9 -0
  10. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/argo_workflows_cli.py +2 -2
  11. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/argo_workflows_deployer.py +3 -1
  12. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/aws_utils.py +16 -0
  13. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/batch/batch_decorator.py +1 -0
  14. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +3 -1
  15. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/kubernetes/kubernetes.py +26 -0
  16. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/kubernetes/kubernetes_decorator.py +15 -0
  17. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/conda_decorator.py +4 -4
  18. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/pypi_decorator.py +13 -4
  19. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runner/deployer.py +46 -3
  20. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runner/metaflow_runner.py +7 -1
  21. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runner/nbdeploy.py +3 -0
  22. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runner/nbrun.py +5 -0
  23. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runtime.py +26 -13
  24. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/util.py +19 -0
  25. metaflow-2.12.14/metaflow/version.py +1 -0
  26. {metaflow-2.12.12 → metaflow-2.12.14/metaflow.egg-info}/PKG-INFO +2 -2
  27. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow.egg-info/requires.txt +1 -1
  28. metaflow-2.12.12/metaflow/version.py +0 -1
  29. {metaflow-2.12.12 → metaflow-2.12.14}/LICENSE +0 -0
  30. {metaflow-2.12.12 → metaflow-2.12.14}/MANIFEST.in +0 -0
  31. {metaflow-2.12.12 → metaflow-2.12.14}/README.md +0 -0
  32. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/R.py +0 -0
  33. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/__init__.py +0 -0
  34. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/__init__.py +0 -0
  35. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/__init__.py +0 -0
  36. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  37. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/_compat.py +0 -0
  38. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/_termui_impl.py +0 -0
  39. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/_textwrap.py +0 -0
  40. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/_unicodefun.py +0 -0
  41. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/_winconsole.py +0 -0
  42. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/core.py +0 -0
  43. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/decorators.py +0 -0
  44. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/exceptions.py +0 -0
  45. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/formatting.py +0 -0
  46. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/globals.py +0 -0
  47. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/parser.py +0 -0
  48. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/termui.py +0 -0
  49. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/testing.py +0 -0
  50. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/types.py +0 -0
  51. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/click/utils.py +0 -0
  52. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
  53. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
  54. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
  55. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
  56. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
  57. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
  58. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
  59. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
  60. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
  61. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/__init__.py +0 -0
  62. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/_elffile.py +0 -0
  63. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  64. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  65. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/_parser.py +0 -0
  66. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/_structures.py +0 -0
  67. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  68. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/markers.py +0 -0
  69. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/py.typed +0 -0
  70. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/requirements.py +0 -0
  71. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/specifiers.py +0 -0
  72. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/tags.py +0 -0
  73. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/utils.py +0 -0
  74. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/packaging/version.py +0 -0
  75. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/__init__.py +0 -0
  76. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_checkers.py +0 -0
  77. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_config.py +0 -0
  78. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_decorators.py +0 -0
  79. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
  80. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_functions.py +0 -0
  81. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_importhook.py +0 -0
  82. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_memo.py +0 -0
  83. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
  84. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_suppression.py +0 -0
  85. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_transformer.py +0 -0
  86. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
  87. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/_utils.py +0 -0
  88. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typeguard/py.typed +0 -0
  89. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/typing_extensions.py +0 -0
  90. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_5/__init__.py +0 -0
  91. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
  92. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
  93. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_5/zipp.py +0 -0
  94. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/__init__.py +0 -0
  95. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  96. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  97. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  98. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  99. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  100. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  101. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  102. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  103. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  104. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  105. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/v3_6/zipp.py +0 -0
  106. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/_vendor/zipp.py +0 -0
  107. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cards.py +0 -0
  108. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cli_args.py +0 -0
  109. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/client/__init__.py +0 -0
  110. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/client/filecache.py +0 -0
  111. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/clone_util.py +0 -0
  112. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd/__init__.py +0 -0
  113. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd/configure_cmd.py +0 -0
  114. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd/develop/__init__.py +0 -0
  115. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd/develop/stub_generator.py +0 -0
  116. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd/develop/stubs.py +0 -0
  117. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd/main_cli.py +0 -0
  118. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd/tutorials_cmd.py +0 -0
  119. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd/util.py +0 -0
  120. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/cmd_with_io.py +0 -0
  121. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/datastore/__init__.py +0 -0
  122. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/datastore/content_addressed_store.py +0 -0
  123. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/datastore/datastore_set.py +0 -0
  124. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/datastore/datastore_storage.py +0 -0
  125. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/datastore/exceptions.py +0 -0
  126. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/datastore/flow_datastore.py +0 -0
  127. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/datastore/inputs.py +0 -0
  128. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/datastore/task_datastore.py +0 -0
  129. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/debug.py +0 -0
  130. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/decorators.py +0 -0
  131. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/event_logger.py +0 -0
  132. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/events.py +0 -0
  133. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/exception.py +0 -0
  134. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/extension_support/__init__.py +0 -0
  135. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/extension_support/_empty_file.py +0 -0
  136. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/extension_support/cmd.py +0 -0
  137. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/extension_support/integrations.py +0 -0
  138. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/extension_support/plugins.py +0 -0
  139. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/includefile.py +0 -0
  140. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/integrations.py +0 -0
  141. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/lint.py +0 -0
  142. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metadata/__init__.py +0 -0
  143. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metadata/heartbeat.py +0 -0
  144. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metadata/metadata.py +0 -0
  145. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metadata/util.py +0 -0
  146. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metaflow_current.py +0 -0
  147. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metaflow_profile.py +0 -0
  148. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/metaflow_version.py +0 -0
  149. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/mflog/__init__.py +0 -0
  150. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/mflog/mflog.py +0 -0
  151. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/mflog/save_logs.py +0 -0
  152. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/mflog/save_logs_periodically.py +0 -0
  153. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/mflog/tee.py +0 -0
  154. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/monitor.py +0 -0
  155. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/multicore_utils.py +0 -0
  156. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/package.py +0 -0
  157. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/parameters.py +0 -0
  158. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/__init__.py +0 -0
  159. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/__init__.py +0 -0
  160. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/airflow.py +0 -0
  161. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  162. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  163. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  164. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/dag.py +0 -0
  165. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/exception.py +0 -0
  166. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  167. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  168. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  169. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
  170. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
  171. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
  172. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/__init__.py +0 -0
  173. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/argo_client.py +0 -0
  174. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/argo_events.py +0 -0
  175. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  176. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/capture_error.py +0 -0
  177. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/daemon.py +0 -0
  178. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/generate_input_paths.py +0 -0
  179. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
  180. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/__init__.py +0 -0
  181. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/aws_client.py +0 -0
  182. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/batch/__init__.py +0 -0
  183. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/batch/batch.py +0 -0
  184. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  185. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  186. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  187. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  188. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  189. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  190. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  191. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  192. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  193. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  194. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
  195. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
  196. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  197. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  198. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/azure/__init__.py +0 -0
  199. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/azure/azure_credential.py +0 -0
  200. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  201. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
  202. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/azure/azure_tail.py +0 -0
  203. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/azure/azure_utils.py +0 -0
  204. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  205. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/azure/includefile_support.py +0 -0
  206. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/__init__.py +0 -0
  207. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_cli.py +0 -0
  208. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_client.py +0 -0
  209. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_creator.py +0 -0
  210. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_datastore.py +0 -0
  211. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_decorator.py +0 -0
  212. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  213. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/base.html +0 -0
  214. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/basic.py +0 -0
  215. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
  216. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/card.py +0 -0
  217. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  218. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  219. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  220. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  221. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  222. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/components.py +0 -0
  223. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  224. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/main.js +0 -0
  225. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  226. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  227. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_resolver.py +0 -0
  228. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_server.py +0 -0
  229. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
  230. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/component_serializer.py +0 -0
  231. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/cards/exception.py +0 -0
  232. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/catch_decorator.py +0 -0
  233. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datastores/__init__.py +0 -0
  234. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datastores/azure_storage.py +0 -0
  235. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datastores/gs_storage.py +0 -0
  236. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datastores/local_storage.py +0 -0
  237. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datastores/s3_storage.py +0 -0
  238. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datatools/__init__.py +0 -0
  239. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datatools/local.py +0 -0
  240. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  241. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datatools/s3/s3.py +0 -0
  242. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datatools/s3/s3op.py +0 -0
  243. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  244. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  245. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/debug_logger.py +0 -0
  246. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/debug_monitor.py +0 -0
  247. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/__init__.py +0 -0
  248. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/client.py +0 -0
  249. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/client_modules.py +0 -0
  250. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  251. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  252. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  253. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  254. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  255. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  256. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  257. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  258. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  259. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  260. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/consts.py +0 -0
  261. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  262. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  263. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  264. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/server.py +0 -0
  265. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/stub.py +0 -0
  266. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/env_escape/utils.py +0 -0
  267. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/environment_decorator.py +0 -0
  268. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/events_decorator.py +0 -0
  269. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/frameworks/__init__.py +0 -0
  270. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/frameworks/pytorch.py +0 -0
  271. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/gcp/__init__.py +0 -0
  272. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
  273. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  274. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  275. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/gcp/gs_tail.py +0 -0
  276. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/gcp/gs_utils.py +0 -0
  277. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/gcp/includefile_support.py +0 -0
  278. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/kubernetes/__init__.py +0 -0
  279. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/kubernetes/kubernetes_cli.py +0 -0
  280. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
  281. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/kubernetes/kubernetes_job.py +0 -0
  282. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +0 -0
  283. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/logs_cli.py +0 -0
  284. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/metadata/__init__.py +0 -0
  285. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/metadata/local.py +0 -0
  286. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/metadata/service.py +0 -0
  287. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/package_cli.py +0 -0
  288. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/parallel_decorator.py +0 -0
  289. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/project_decorator.py +0 -0
  290. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/__init__.py +0 -0
  291. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/bootstrap.py +0 -0
  292. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/conda_environment.py +0 -0
  293. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/micromamba.py +0 -0
  294. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/pip.py +0 -0
  295. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  296. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/pypi/utils.py +0 -0
  297. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/resources_decorator.py +0 -0
  298. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/retry_decorator.py +0 -0
  299. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/secrets/__init__.py +0 -0
  300. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  301. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  302. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/storage_executor.py +0 -0
  303. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/tag_cli.py +0 -0
  304. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  305. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/plugins/timeout_decorator.py +0 -0
  306. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/procpoll.py +0 -0
  307. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/py.typed +0 -0
  308. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/pylint_wrapper.py +0 -0
  309. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runner/__init__.py +0 -0
  310. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runner/click_api.py +0 -0
  311. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runner/subprocess_manager.py +0 -0
  312. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/runner/utils.py +0 -0
  313. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/sidecar/__init__.py +0 -0
  314. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/sidecar/sidecar.py +0 -0
  315. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/sidecar/sidecar_messages.py +0 -0
  316. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  317. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/sidecar/sidecar_worker.py +0 -0
  318. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/system/__init__.py +0 -0
  319. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/system/system_logger.py +0 -0
  320. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/system/system_monitor.py +0 -0
  321. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/system/system_utils.py +0 -0
  322. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tagging_util.py +0 -0
  323. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/task.py +0 -0
  324. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tracing/__init__.py +0 -0
  325. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tracing/propagator.py +0 -0
  326. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tracing/span_exporter.py +0 -0
  327. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tracing/tracing_modules.py +0 -0
  328. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tuple_util.py +0 -0
  329. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/00-helloworld/README.md +0 -0
  330. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  331. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/01-playlist/README.md +0 -0
  332. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  333. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  334. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  335. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/02-statistics/README.md +0 -0
  336. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  337. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  338. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/02-statistics/stats.py +0 -0
  339. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  340. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  341. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  342. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  343. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  344. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  345. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  346. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  347. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  348. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/07-worldview/README.md +0 -0
  349. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  350. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/08-autopilot/README.md +0 -0
  351. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  352. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/unbounded_foreach.py +0 -0
  353. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow/vendor.py +0 -0
  354. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow.egg-info/SOURCES.txt +0 -0
  355. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow.egg-info/dependency_links.txt +0 -0
  356. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow.egg-info/entry_points.txt +0 -0
  357. {metaflow-2.12.12 → metaflow-2.12.14}/metaflow.egg-info/top_level.txt +0 -0
  358. {metaflow-2.12.12 → metaflow-2.12.14}/setup.cfg +0 -0
  359. {metaflow-2.12.12 → metaflow-2.12.14}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: metaflow
3
- Version: 2.12.12
3
+ Version: 2.12.14
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.12; extra == "stubs"
29
+ Requires-Dist: metaflow-stubs==2.12.14; 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
 
@@ -650,7 +650,7 @@ def resume(
650
650
  )
651
651
 
652
652
  if step_to_rerun is None:
653
- clone_steps = set()
653
+ steps_to_rerun = set()
654
654
  else:
655
655
  # validate step name
656
656
  if step_to_rerun not in obj.graph.nodes:
@@ -660,7 +660,7 @@ def resume(
660
660
  step_to_rerun, ",".join(list(obj.graph.nodes.keys()))
661
661
  )
662
662
  )
663
- clone_steps = {step_to_rerun}
663
+ steps_to_rerun = {step_to_rerun}
664
664
 
665
665
  if run_id:
666
666
  # Run-ids that are provided by the metadata service are always integers.
@@ -688,7 +688,7 @@ def resume(
688
688
  clone_run_id=origin_run_id,
689
689
  clone_only=clone_only,
690
690
  reentrant=reentrant,
691
- clone_steps=clone_steps,
691
+ steps_to_rerun=steps_to_rerun,
692
692
  max_workers=max_workers,
693
693
  max_num_splits=max_num_splits,
694
694
  max_log_size=max_log_size * 1024 * 1024,
@@ -1027,6 +1027,8 @@ class MetaflowData(object):
1027
1027
  self._artifacts = dict((art.id, art) for art in artifacts)
1028
1028
 
1029
1029
  def __getattr__(self, name: str):
1030
+ if name not in self._artifacts:
1031
+ raise AttributeError(name)
1030
1032
  return self._artifacts[name].data
1031
1033
 
1032
1034
  def __contains__(self, var):
@@ -17,6 +17,7 @@ from .exception import (
17
17
  )
18
18
  from .graph import FlowGraph
19
19
  from .unbounded_foreach import UnboundedForeachInput
20
+ from .util import to_pod
20
21
  from .metaflow_config import INCLUDE_FOREACH_STACK, MAXIMUM_FOREACH_VALUE_CHARS
21
22
 
22
23
  # For Python 3 compatibility
@@ -201,7 +202,7 @@ class FlowSpec(metaclass=_FlowSpecMeta):
201
202
  "decorators": [
202
203
  {
203
204
  "name": deco.name,
204
- "attributes": deco.attributes,
205
+ "attributes": to_pod(deco.attributes),
205
206
  "statically_defined": deco.statically_defined,
206
207
  }
207
208
  for deco in flow_decorators(self)
@@ -3,6 +3,9 @@ import ast
3
3
  import re
4
4
 
5
5
 
6
+ from .util import to_pod
7
+
8
+
6
9
  def deindent_docstring(doc):
7
10
  if doc:
8
11
  # Find the indent to remove from the docstring. We consider the following possibilities:
@@ -72,7 +75,6 @@ class DAGNode(object):
72
75
  return "%s.%s" % (expr.value.id, expr.attr)
73
76
 
74
77
  def _parse(self, func_ast):
75
-
76
78
  self.num_args = len(func_ast.args.args)
77
79
  tail = func_ast.body[-1]
78
80
 
@@ -171,6 +173,8 @@ class FlowGraph(object):
171
173
  self.name = flow.__name__
172
174
  self.nodes = self._create_nodes(flow)
173
175
  self.doc = deindent_docstring(flow.__doc__)
176
+ # nodes sorted in topological order.
177
+ self.sorted_nodes = []
174
178
  self._traverse_graph()
175
179
  self._postprocess()
176
180
 
@@ -197,6 +201,7 @@ class FlowGraph(object):
197
201
 
198
202
  def _traverse_graph(self):
199
203
  def traverse(node, seen, split_parents):
204
+ self.sorted_nodes.append(node.name)
200
205
  if node.type in ("split", "foreach"):
201
206
  node.split_parents = split_parents
202
207
  split_parents = split_parents + [node.name]
@@ -262,7 +267,6 @@ class FlowGraph(object):
262
267
  )
263
268
 
264
269
  def output_steps(self):
265
-
266
270
  steps_info = {}
267
271
  graph_structure = []
268
272
 
@@ -286,7 +290,7 @@ class FlowGraph(object):
286
290
  "decorators": [
287
291
  {
288
292
  "name": deco.name,
289
- "attributes": deco.attributes,
293
+ "attributes": to_pod(deco.attributes),
290
294
  "statically_defined": deco.statically_defined,
291
295
  }
292
296
  for deco in node.decorators
@@ -15,6 +15,17 @@ if sys.platform == "darwin":
15
15
  ## value, either set `METAFLOW_DEFAULT_DATASTORE` in your configuration file or set
16
16
  ## an environment variable called `METAFLOW_DEFAULT_DATASTORE`
17
17
 
18
+ ##
19
+ # Constants (NOTE: these need to live before any from_conf)
20
+ ##
21
+
22
+ # Path to the local directory to store artifacts for 'local' datastore.
23
+ DATASTORE_LOCAL_DIR = ".metaflow"
24
+
25
+ # Local configuration file (in .metaflow) containing overrides per-project
26
+ LOCAL_CONFIG_FILE = "config.json"
27
+
28
+
18
29
  ###
19
30
  # Default configuration
20
31
  ###
@@ -42,8 +53,6 @@ USER = from_conf("USER")
42
53
  ###
43
54
  # Datastore configuration
44
55
  ###
45
- # Path to the local directory to store artifacts for 'local' datastore.
46
- DATASTORE_LOCAL_DIR = ".metaflow"
47
56
  DATASTORE_SYSROOT_LOCAL = from_conf("DATASTORE_SYSROOT_LOCAL")
48
57
  # S3 bucket and prefix to store artifacts for 's3' datastore.
49
58
  DATASTORE_SYSROOT_S3 = from_conf("DATASTORE_SYSROOT_S3")
@@ -32,8 +32,40 @@ def init_config():
32
32
  return config
33
33
 
34
34
 
35
+ def init_local_config():
36
+ # This function is heavily inspired from LocalStorage.get_datastore_root_from_config
37
+ # but simplifies certain things and also does not depend on DATASTORE_SYSROOT_LOCAL.
38
+ #
39
+ # In other words, since this config is meant to be local to a directory, it does not
40
+ # check in DATASTORE_SYSROOT_LOCAL but only up the current getcwd() path. This also
41
+ # prevents nasty circular dependencies :)
42
+
43
+ from metaflow.metaflow_config import DATASTORE_LOCAL_DIR, LOCAL_CONFIG_FILE
44
+
45
+ current_path = os.getcwd()
46
+ check_dir = os.path.join(current_path, DATASTORE_LOCAL_DIR)
47
+ check_dir = os.path.realpath(check_dir)
48
+ while not os.path.isdir(check_dir):
49
+ new_path = os.path.dirname(current_path)
50
+ if new_path == current_path: # No longer making upward progress
51
+ return {}
52
+ current_path = new_path
53
+ check_dir = os.path.join(current_path, DATASTORE_LOCAL_DIR)
54
+ path_to_config = os.path.join(check_dir, LOCAL_CONFIG_FILE)
55
+ # We found a directory to look for the config file in
56
+ if os.path.exists(path_to_config):
57
+ with open(path_to_config, encoding="utf-8") as f:
58
+ return json.load(f)
59
+ return {}
60
+
61
+
35
62
  # Initialize defaults required to setup environment variables.
36
- METAFLOW_CONFIG = init_config()
63
+ # (initialized lazily in from_conf since init_local_config requires
64
+ # some configuration values
65
+
66
+ METAFLOW_CONFIG = None
67
+
68
+ METAFLOW_LOCAL_CONFIG = None
37
69
 
38
70
  _all_configs = {}
39
71
 
@@ -51,7 +83,13 @@ def config_values(include=0):
51
83
 
52
84
  def from_conf(name, default=None, validate_fn=None):
53
85
  """
54
- First try to pull value from environment, then from metaflow config JSON
86
+ Pull value from the environment or configuration.
87
+ Order is:
88
+ 1. Environment (use any environment variable explicitly set by user)
89
+ 2. Local config (use any value set in the local config file -- so stuff in
90
+ .metaflow/project.json for example)
91
+ 3. Global config (use any value set in the global config file)
92
+ 4. Default
55
93
 
56
94
  Prior to a value being returned, we will validate using validate_fn (if provided).
57
95
  Only non-None values are validated.
@@ -59,9 +97,19 @@ def from_conf(name, default=None, validate_fn=None):
59
97
  validate_fn should accept (name, value).
60
98
  If the value validates, return None, else raise an MetaflowException.
61
99
  """
100
+ global METAFLOW_CONFIG, METAFLOW_LOCAL_CONFIG
101
+
102
+ if METAFLOW_CONFIG is None:
103
+ METAFLOW_CONFIG = init_config()
104
+ if METAFLOW_LOCAL_CONFIG is None:
105
+ METAFLOW_LOCAL_CONFIG = init_local_config()
106
+
62
107
  is_default = True
63
108
  env_name = "METAFLOW_%s" % name
64
- value = os.environ.get(env_name, METAFLOW_CONFIG.get(env_name, default))
109
+ value = os.environ.get(
110
+ env_name,
111
+ METAFLOW_LOCAL_CONFIG.get(env_name, METAFLOW_CONFIG.get(env_name, default)),
112
+ )
65
113
  if validate_fn and value is not None:
66
114
  validate_fn(env_name, value)
67
115
  if default is not None:
@@ -89,10 +89,16 @@ class MetaflowEnvironment(object):
89
89
  It should work silently if everything goes well.
90
90
  """
91
91
  if datastore_type == "s3":
92
- return (
93
- '%s -m awscli ${METAFLOW_S3_ENDPOINT_URL:+--endpoint-url=\\"${METAFLOW_S3_ENDPOINT_URL}\\"} '
94
- + "s3 cp %s job.tar >/dev/null"
95
- ) % (self._python(), code_package_url)
92
+ from .plugins.aws.aws_utils import parse_s3_full_path
93
+
94
+ bucket, s3_object = parse_s3_full_path(code_package_url)
95
+ # NOTE: the script quoting is extremely sensitive due to the way shlex.split operates and this being inserted
96
+ # into a quoted command elsewhere.
97
+ return "{python} -c '{script}'".format(
98
+ python=self._python(),
99
+ script='import boto3, os; boto3.client(\\"s3\\", endpoint_url=os.getenv(\\"METAFLOW_S3_ENDPOINT_URL\\")).download_file(\\"%s\\", \\"%s\\", \\"job.tar\\")'
100
+ % (bucket, s3_object),
101
+ )
96
102
  elif datastore_type == "azure":
97
103
  from .plugins.azure.azure_utils import parse_azure_full_path
98
104
 
@@ -119,25 +125,34 @@ class MetaflowEnvironment(object):
119
125
  )
120
126
 
121
127
  def _get_install_dependencies_cmd(self, datastore_type):
122
- cmds = ["%s -m pip install requests -qqq" % self._python()]
123
- if datastore_type == "s3":
124
- cmds.append("%s -m pip install awscli boto3 -qqq" % self._python())
125
- elif datastore_type == "azure":
126
- cmds.append(
127
- "%s -m pip install azure-identity azure-storage-blob azure-keyvault-secrets simple-azure-blob-downloader -qqq"
128
- % self._python()
129
- )
130
- elif datastore_type == "gs":
131
- cmds.append(
132
- "%s -m pip install google-cloud-storage google-auth simple-gcp-object-downloader google-cloud-secret-manager -qqq"
133
- % self._python()
134
- )
135
- else:
128
+ base_cmd = "{} -m pip install -qqq".format(self._python())
129
+
130
+ datastore_packages = {
131
+ "s3": ["boto3"],
132
+ "azure": [
133
+ "azure-identity",
134
+ "azure-storage-blob",
135
+ "azure-keyvault-secrets",
136
+ "simple-azure-blob-downloader",
137
+ ],
138
+ "gs": [
139
+ "google-cloud-storage",
140
+ "google-auth",
141
+ "simple-gcp-object-downloader",
142
+ "google-cloud-secret-manager",
143
+ ],
144
+ }
145
+
146
+ if datastore_type not in datastore_packages:
136
147
  raise NotImplementedError(
137
- "We don't know how to generate an install dependencies cmd for datastore %s"
138
- % datastore_type
148
+ "Unknown datastore type: {}".format(datastore_type)
139
149
  )
140
- return " && ".join(cmds)
150
+
151
+ cmd = "{} {}".format(
152
+ base_cmd, " ".join(datastore_packages[datastore_type] + ["requests"])
153
+ )
154
+ # skip pip installs if we know that packages might already be available
155
+ return "if [ -z $METAFLOW_SKIP_INSTALL_DEPENDENCIES ]; then {}; fi".format(cmd)
141
156
 
142
157
  def get_package_commands(self, code_package_url, datastore_type):
143
158
  cmds = [
@@ -1658,6 +1658,9 @@ class ArgoWorkflows(object):
1658
1658
 
1659
1659
  # support Metaflow sandboxes
1660
1660
  env["METAFLOW_INIT_SCRIPT"] = KUBERNETES_SANDBOX_INIT_SCRIPT
1661
+ env["METAFLOW_KUBERNETES_SANDBOX_INIT_SCRIPT"] = (
1662
+ KUBERNETES_SANDBOX_INIT_SCRIPT
1663
+ )
1661
1664
 
1662
1665
  # support for @secret
1663
1666
  env["METAFLOW_DEFAULT_SECRETS_BACKEND_TYPE"] = DEFAULT_SECRETS_BACKEND_TYPE
@@ -1673,6 +1676,12 @@ class ArgoWorkflows(object):
1673
1676
  )
1674
1677
  env["METAFLOW_DATASTORE_SYSROOT_AZURE"] = DATASTORE_SYSROOT_AZURE
1675
1678
  env["METAFLOW_CARD_AZUREROOT"] = CARD_AZUREROOT
1679
+ env["METAFLOW_ARGO_WORKFLOWS_KUBERNETES_SECRETS"] = (
1680
+ ARGO_WORKFLOWS_KUBERNETES_SECRETS
1681
+ )
1682
+ env["METAFLOW_ARGO_WORKFLOWS_ENV_VARS_TO_SKIP"] = (
1683
+ ARGO_WORKFLOWS_ENV_VARS_TO_SKIP
1684
+ )
1676
1685
 
1677
1686
  # support for GCP
1678
1687
  env["METAFLOW_DATASTORE_SYSROOT_GS"] = DATASTORE_SYSROOT_GS
@@ -172,7 +172,7 @@ def argo_workflows(obj, name=None):
172
172
  )
173
173
  @click.option(
174
174
  "--enable-heartbeat-daemon/--no-enable-heartbeat-daemon",
175
- default=False,
175
+ default=True,
176
176
  show_default=True,
177
177
  help="Use a daemon container to broadcast heartbeats.",
178
178
  )
@@ -186,7 +186,7 @@ def argo_workflows(obj, name=None):
186
186
  )
187
187
  @click.option(
188
188
  "--enable-error-msg-capture/--no-enable-error-msg-capture",
189
- default=False,
189
+ default=True,
190
190
  show_default=True,
191
191
  help="Capture stack trace of first failed task in exit hook.",
192
192
  )
@@ -226,7 +226,9 @@ def trigger(instance: DeployedFlow, **kwargs):
226
226
  )
227
227
 
228
228
  command_obj = instance.deployer.spm.get(pid)
229
- content = handle_timeout(tfp_runner_attribute, command_obj)
229
+ content = handle_timeout(
230
+ tfp_runner_attribute, command_obj, instance.deployer.file_read_timeout
231
+ )
230
232
 
231
233
  if command_obj.process.returncode == 0:
232
234
  triggered_run = TriggeredRun(deployer=instance.deployer, content=content)
@@ -4,6 +4,22 @@ import requests
4
4
  from metaflow.exception import MetaflowException
5
5
 
6
6
 
7
+ def parse_s3_full_path(s3_uri):
8
+ from urllib.parse import urlparse
9
+
10
+ # <scheme>://<netloc>/<path>;<params>?<query>#<fragment>
11
+ scheme, netloc, path, _, _, _ = urlparse(s3_uri)
12
+ assert scheme == "s3"
13
+ assert netloc is not None
14
+
15
+ bucket = netloc
16
+ path = path.lstrip("/").rstrip("/")
17
+ if path == "":
18
+ path = None
19
+
20
+ return bucket, path
21
+
22
+
7
23
  def get_ec2_instance_metadata():
8
24
  """
9
25
  Fetches the EC2 instance metadata through AWS instance metadata service
@@ -123,6 +123,7 @@ class BatchDecorator(StepDecorator):
123
123
  "ephemeral_storage": None,
124
124
  "log_driver": None,
125
125
  "log_options": None,
126
+ "executable": None,
126
127
  }
127
128
  resource_defaults = {
128
129
  "cpu": "1",
@@ -193,7 +193,9 @@ def trigger(instance: DeployedFlow, **kwargs):
193
193
  )
194
194
 
195
195
  command_obj = instance.deployer.spm.get(pid)
196
- content = handle_timeout(tfp_runner_attribute, command_obj)
196
+ content = handle_timeout(
197
+ tfp_runner_attribute, command_obj, instance.deployer.file_read_timeout
198
+ )
197
199
 
198
200
  if command_obj.process.returncode == 0:
199
201
  triggered_run = TriggeredRun(deployer=instance.deployer, content=content)
@@ -17,6 +17,8 @@ from metaflow.metaflow_config import (
17
17
  ARGO_EVENTS_INTERNAL_WEBHOOK_URL,
18
18
  ARGO_EVENTS_SERVICE_ACCOUNT,
19
19
  ARGO_EVENTS_WEBHOOK_AUTH,
20
+ ARGO_WORKFLOWS_KUBERNETES_SECRETS,
21
+ ARGO_WORKFLOWS_ENV_VARS_TO_SKIP,
20
22
  AWS_SECRETS_MANAGER_DEFAULT_REGION,
21
23
  AZURE_KEY_VAULT_PREFIX,
22
24
  AZURE_STORAGE_BLOB_SERVICE_ENDPOINT,
@@ -280,6 +282,18 @@ class Kubernetes(object):
280
282
  .environment_variable(
281
283
  "METAFLOW_INIT_SCRIPT", KUBERNETES_SANDBOX_INIT_SCRIPT
282
284
  )
285
+ .environment_variable(
286
+ "METAFLOW_KUBERNETES_SANDBOX_INIT_SCRIPT",
287
+ KUBERNETES_SANDBOX_INIT_SCRIPT,
288
+ )
289
+ .environment_variable(
290
+ "METAFLOW_ARGO_WORKFLOWS_KUBERNETES_SECRETS",
291
+ ARGO_WORKFLOWS_KUBERNETES_SECRETS,
292
+ )
293
+ .environment_variable(
294
+ "METAFLOW_ARGO_WORKFLOWS_ENV_VARS_TO_SKIP",
295
+ ARGO_WORKFLOWS_ENV_VARS_TO_SKIP,
296
+ )
283
297
  .environment_variable("METAFLOW_OTEL_ENDPOINT", OTEL_ENDPOINT)
284
298
  # Skip setting METAFLOW_DATASTORE_SYSROOT_LOCAL because metadata sync
285
299
  # between the local user instance and the remote Kubernetes pod
@@ -565,6 +579,18 @@ class Kubernetes(object):
565
579
  .environment_variable(
566
580
  "METAFLOW_INIT_SCRIPT", KUBERNETES_SANDBOX_INIT_SCRIPT
567
581
  )
582
+ .environment_variable(
583
+ "METAFLOW_KUBERNETES_SANDBOX_INIT_SCRIPT",
584
+ KUBERNETES_SANDBOX_INIT_SCRIPT,
585
+ )
586
+ .environment_variable(
587
+ "METAFLOW_ARGO_WORKFLOWS_KUBERNETES_SECRETS",
588
+ ARGO_WORKFLOWS_KUBERNETES_SECRETS,
589
+ )
590
+ .environment_variable(
591
+ "METAFLOW_ARGO_WORKFLOWS_ENV_VARS_TO_SKIP",
592
+ ARGO_WORKFLOWS_ENV_VARS_TO_SKIP,
593
+ )
568
594
  .environment_variable("METAFLOW_OTEL_ENDPOINT", OTEL_ENDPOINT)
569
595
  # Skip setting METAFLOW_DATASTORE_SYSROOT_LOCAL because metadata sync
570
596
  # between the local user instance and the remote Kubernetes pod
@@ -97,6 +97,9 @@ class KubernetesDecorator(StepDecorator):
97
97
  Shared memory size (in MiB) required for this step
98
98
  port: int, optional
99
99
  Port number to specify in the Kubernetes job object
100
+ compute_pool : str, optional, default None
101
+ Compute pool to be used for for this step.
102
+ If not specified, any accessible compute pool within the perimeter is used.
100
103
  """
101
104
 
102
105
  name = "kubernetes"
@@ -121,6 +124,8 @@ class KubernetesDecorator(StepDecorator):
121
124
  "persistent_volume_claims": None, # e.g., {"pvc-name": "/mnt/vol", "another-pvc": "/mnt/vol2"}
122
125
  "shared_memory": None,
123
126
  "port": None,
127
+ "compute_pool": None,
128
+ "executable": None,
124
129
  }
125
130
  package_url = None
126
131
  package_sha = None
@@ -153,6 +158,12 @@ class KubernetesDecorator(StepDecorator):
153
158
  self.attributes["node_selector"] = parse_kube_keyvalue_list(
154
159
  self.attributes["node_selector"].split(",")
155
160
  )
161
+ if self.attributes["compute_pool"]:
162
+ if self.attributes["node_selector"] is None:
163
+ self.attributes["node_selector"] = {}
164
+ self.attributes["node_selector"].update(
165
+ {"outerbounds.co/compute-pool": self.attributes["compute_pool"]}
166
+ )
156
167
 
157
168
  if self.attributes["tolerations"]:
158
169
  try:
@@ -370,9 +381,13 @@ class KubernetesDecorator(StepDecorator):
370
381
  cli_args.command_args.append(self.package_sha)
371
382
  cli_args.command_args.append(self.package_url)
372
383
 
384
+ # skip certain keys as CLI arguments
385
+ _skip_keys = ["compute_pool"]
373
386
  # --namespace is used to specify Metaflow namespace (a different
374
387
  # concept from k8s namespace).
375
388
  for k, v in self.attributes.items():
389
+ if k in _skip_keys:
390
+ continue
376
391
  if k == "namespace":
377
392
  cli_args.command_options["k8s_namespace"] = v
378
393
  elif k in {"node_selector"} and v:
@@ -100,9 +100,9 @@ class CondaStepDecorator(StepDecorator):
100
100
  # --environment=pypi to --environment=conda
101
101
  _supported_virtual_envs.extend(["pypi"])
102
102
 
103
- # TODO: Hardcoded for now to support Docker environment.
103
+ # TODO: Hardcoded for now to support the fast bakery environment.
104
104
  # We should introduce a more robust mechanism for appending supported environments, for example from within extensions.
105
- _supported_virtual_envs.extend(["docker"])
105
+ _supported_virtual_envs.extend(["fast-bakery"])
106
106
 
107
107
  # The --environment= requirement ensures that valid virtual environments are
108
108
  # created for every step to execute it, greatly simplifying the @conda
@@ -344,9 +344,9 @@ class CondaFlowDecorator(FlowDecorator):
344
344
  # --environment=pypi to --environment=conda
345
345
  _supported_virtual_envs.extend(["pypi"])
346
346
 
347
- # TODO: Hardcoded for now to support Docker environment.
347
+ # TODO: Hardcoded for now to support the fast bakery environment.
348
348
  # We should introduce a more robust mechanism for appending supported environments, for example from within extensions.
349
- _supported_virtual_envs.extend(["docker"])
349
+ _supported_virtual_envs.extend(["fast-bakery"])
350
350
 
351
351
  # The --environment= requirement ensures that valid virtual environments are
352
352
  # created for every step to execute it, greatly simplifying the @conda
@@ -24,6 +24,12 @@ class PyPIStepDecorator(StepDecorator):
24
24
  name = "pypi"
25
25
  defaults = {"packages": {}, "python": None, "disabled": None} # wheels
26
26
 
27
+ def __init__(self, attributes=None, statically_defined=False):
28
+ self._user_defined_attributes = (
29
+ attributes.copy() if attributes is not None else {}
30
+ )
31
+ super().__init__(attributes, statically_defined)
32
+
27
33
  def step_init(self, flow, graph, step, decos, environment, flow_datastore, logger):
28
34
  # The init_environment hook for Environment creates the relevant virtual
29
35
  # environments. The step_init hook sets up the relevant state for that hook to
@@ -70,9 +76,9 @@ class PyPIStepDecorator(StepDecorator):
70
76
  # --environment=pypi to --environment=conda
71
77
  _supported_virtual_envs.extend(["pypi"])
72
78
 
73
- # TODO: Hardcoded for now to support Docker environment.
79
+ # TODO: Hardcoded for now to support the fast bakery environment.
74
80
  # We should introduce a more robust mechanism for appending supported environments, for example from within extensions.
75
- _supported_virtual_envs.extend(["docker"])
81
+ _supported_virtual_envs.extend(["fast-bakery"])
76
82
 
77
83
  # The --environment= requirement ensures that valid virtual environments are
78
84
  # created for every step to execute it, greatly simplifying the @pypi
@@ -88,6 +94,9 @@ class PyPIStepDecorator(StepDecorator):
88
94
  )
89
95
  )
90
96
 
97
+ def is_attribute_user_defined(self, name):
98
+ return name in self._user_defined_attributes
99
+
91
100
 
92
101
  class PyPIFlowDecorator(FlowDecorator):
93
102
  """
@@ -123,9 +132,9 @@ class PyPIFlowDecorator(FlowDecorator):
123
132
  # --environment=pypi to --environment=conda
124
133
  _supported_virtual_envs.extend(["pypi"])
125
134
 
126
- # TODO: Hardcoded for now to support Docker environment.
135
+ # TODO: Hardcoded for now to support the fast bakery environment.
127
136
  # We should introduce a more robust mechanism for appending supported environments, for example from within extensions.
128
- _supported_virtual_envs.extend(["docker"])
137
+ _supported_virtual_envs.extend(["fast-bakery"])
129
138
 
130
139
  # The --environment= requirement ensures that valid virtual environments are
131
140
  # created for every step to execute it, greatly simplifying the @conda