metaflow 2.13.8__tar.gz → 2.13.10__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 (375) hide show
  1. {metaflow-2.13.8/metaflow.egg-info → metaflow-2.13.10}/PKG-INFO +2 -2
  2. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cli.py +6 -6
  3. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cli_args.py +2 -2
  4. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cmd/develop/stub_generator.py +8 -2
  5. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/datastore/task_datastore.py +11 -32
  6. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/flowspec.py +11 -5
  7. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/metaflow_environment.py +3 -1
  8. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/argo/argo_workflows.py +108 -0
  9. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/argo/argo_workflows_cli.py +47 -7
  10. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/project_decorator.py +18 -0
  11. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/pypi/micromamba.py +23 -11
  12. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/runner/click_api.py +16 -5
  13. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/user_configs/config_decorators.py +19 -14
  14. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/user_configs/config_options.py +1 -1
  15. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/util.py +2 -2
  16. metaflow-2.13.10/metaflow/version.py +1 -0
  17. {metaflow-2.13.8 → metaflow-2.13.10/metaflow.egg-info}/PKG-INFO +2 -2
  18. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow.egg-info/requires.txt +1 -1
  19. metaflow-2.13.8/metaflow/version.py +0 -1
  20. {metaflow-2.13.8 → metaflow-2.13.10}/LICENSE +0 -0
  21. {metaflow-2.13.8 → metaflow-2.13.10}/MANIFEST.in +0 -0
  22. {metaflow-2.13.8 → metaflow-2.13.10}/README.md +0 -0
  23. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/R.py +0 -0
  24. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/__init__.py +0 -0
  25. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/__init__.py +0 -0
  26. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/click/__init__.py +0 -0
  27. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  28. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/click/_compat.py +0 -0
  29. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/click/_termui_impl.py +0 -0
  30. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/click/_textwrap.py +0 -0
  31. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/click/_unicodefun.py +0 -0
  32. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/click/_winconsole.py +0 -0
  33. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/click/core.py +0 -0
  34. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/click/decorators.py +0 -0
  35. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/click/exceptions.py +0 -0
  36. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/click/formatting.py +0 -0
  37. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/click/globals.py +0 -0
  38. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/click/parser.py +0 -0
  39. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/click/termui.py +0 -0
  40. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/click/testing.py +0 -0
  41. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/click/types.py +0 -0
  42. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/click/utils.py +0 -0
  43. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
  44. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
  45. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
  46. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
  47. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
  48. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
  49. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
  50. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
  51. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
  52. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/packaging/__init__.py +0 -0
  53. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/packaging/_elffile.py +0 -0
  54. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  55. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  56. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/packaging/_parser.py +0 -0
  57. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/packaging/_structures.py +0 -0
  58. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  59. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/packaging/markers.py +0 -0
  60. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/packaging/py.typed +0 -0
  61. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/packaging/requirements.py +0 -0
  62. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/packaging/specifiers.py +0 -0
  63. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/packaging/tags.py +0 -0
  64. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/packaging/utils.py +0 -0
  65. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/packaging/version.py +0 -0
  66. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/typeguard/__init__.py +0 -0
  67. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/typeguard/_checkers.py +0 -0
  68. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/typeguard/_config.py +0 -0
  69. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/typeguard/_decorators.py +0 -0
  70. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
  71. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/typeguard/_functions.py +0 -0
  72. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/typeguard/_importhook.py +0 -0
  73. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/typeguard/_memo.py +0 -0
  74. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
  75. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/typeguard/_suppression.py +0 -0
  76. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/typeguard/_transformer.py +0 -0
  77. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
  78. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/typeguard/_utils.py +0 -0
  79. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/typeguard/py.typed +0 -0
  80. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/typing_extensions.py +0 -0
  81. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/v3_5/__init__.py +0 -0
  82. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
  83. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
  84. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/v3_5/zipp.py +0 -0
  85. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/v3_6/__init__.py +0 -0
  86. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  87. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  88. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  89. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  90. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  91. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  92. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  93. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  94. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  95. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  96. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/v3_6/zipp.py +0 -0
  97. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/_vendor/zipp.py +0 -0
  98. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cards.py +0 -0
  99. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cli_components/__init__.py +0 -0
  100. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cli_components/dump_cmd.py +0 -0
  101. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cli_components/init_cmd.py +0 -0
  102. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cli_components/run_cmds.py +0 -0
  103. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cli_components/step_cmd.py +0 -0
  104. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cli_components/utils.py +0 -0
  105. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/client/__init__.py +0 -0
  106. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/client/core.py +0 -0
  107. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/client/filecache.py +0 -0
  108. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/clone_util.py +0 -0
  109. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cmd/__init__.py +0 -0
  110. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cmd/configure_cmd.py +0 -0
  111. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cmd/develop/__init__.py +0 -0
  112. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cmd/develop/stubs.py +0 -0
  113. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cmd/main_cli.py +0 -0
  114. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cmd/tutorials_cmd.py +0 -0
  115. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cmd/util.py +0 -0
  116. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/cmd_with_io.py +0 -0
  117. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/datastore/__init__.py +0 -0
  118. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/datastore/content_addressed_store.py +0 -0
  119. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/datastore/datastore_set.py +0 -0
  120. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/datastore/datastore_storage.py +0 -0
  121. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/datastore/exceptions.py +0 -0
  122. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/datastore/flow_datastore.py +0 -0
  123. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/datastore/inputs.py +0 -0
  124. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/debug.py +0 -0
  125. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/decorators.py +0 -0
  126. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/event_logger.py +0 -0
  127. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/events.py +0 -0
  128. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/exception.py +0 -0
  129. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/extension_support/__init__.py +0 -0
  130. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/extension_support/_empty_file.py +0 -0
  131. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/extension_support/cmd.py +0 -0
  132. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/extension_support/integrations.py +0 -0
  133. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/extension_support/plugins.py +0 -0
  134. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/graph.py +0 -0
  135. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/includefile.py +0 -0
  136. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/info_file.py +0 -0
  137. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/integrations.py +0 -0
  138. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/lint.py +0 -0
  139. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/metadata_provider/__init__.py +0 -0
  140. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/metadata_provider/heartbeat.py +0 -0
  141. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/metadata_provider/metadata.py +0 -0
  142. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/metadata_provider/util.py +0 -0
  143. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/metaflow_config.py +0 -0
  144. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/metaflow_config_funcs.py +0 -0
  145. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/metaflow_current.py +0 -0
  146. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/metaflow_profile.py +0 -0
  147. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/metaflow_version.py +0 -0
  148. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/mflog/__init__.py +0 -0
  149. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/mflog/mflog.py +0 -0
  150. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/mflog/save_logs.py +0 -0
  151. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/mflog/save_logs_periodically.py +0 -0
  152. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/mflog/tee.py +0 -0
  153. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/monitor.py +0 -0
  154. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/multicore_utils.py +0 -0
  155. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/package.py +0 -0
  156. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/parameters.py +0 -0
  157. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/__init__.py +0 -0
  158. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/airflow/__init__.py +0 -0
  159. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/airflow/airflow.py +0 -0
  160. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  161. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  162. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  163. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/airflow/dag.py +0 -0
  164. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/airflow/exception.py +0 -0
  165. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  166. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  167. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  168. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
  169. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
  170. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
  171. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/argo/__init__.py +0 -0
  172. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/argo/argo_client.py +0 -0
  173. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/argo/argo_events.py +0 -0
  174. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  175. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
  176. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/argo/argo_workflows_deployer_objects.py +0 -0
  177. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/argo/capture_error.py +0 -0
  178. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/argo/generate_input_paths.py +0 -0
  179. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
  180. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/__init__.py +0 -0
  181. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/aws_client.py +0 -0
  182. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/aws_utils.py +0 -0
  183. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/batch/__init__.py +0 -0
  184. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/batch/batch.py +0 -0
  185. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  186. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  187. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
  188. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  189. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  190. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  191. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  192. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  193. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  194. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  195. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  196. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
  197. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
  198. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  199. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  200. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
  201. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +0 -0
  202. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/azure/__init__.py +0 -0
  203. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/azure/azure_credential.py +0 -0
  204. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  205. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
  206. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/azure/azure_tail.py +0 -0
  207. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/azure/azure_utils.py +0 -0
  208. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  209. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/azure/includefile_support.py +0 -0
  210. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/__init__.py +0 -0
  211. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_cli.py +0 -0
  212. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_client.py +0 -0
  213. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_creator.py +0 -0
  214. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_datastore.py +0 -0
  215. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_decorator.py +0 -0
  216. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  217. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_modules/base.html +0 -0
  218. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_modules/basic.py +0 -0
  219. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
  220. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_modules/card.py +0 -0
  221. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  222. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  223. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  224. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  225. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  226. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_modules/components.py +0 -0
  227. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  228. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_modules/main.js +0 -0
  229. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  230. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  231. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_resolver.py +0 -0
  232. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_server.py +0 -0
  233. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
  234. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/component_serializer.py +0 -0
  235. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/cards/exception.py +0 -0
  236. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/catch_decorator.py +0 -0
  237. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/datastores/__init__.py +0 -0
  238. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/datastores/azure_storage.py +0 -0
  239. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/datastores/gs_storage.py +0 -0
  240. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/datastores/local_storage.py +0 -0
  241. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/datastores/s3_storage.py +0 -0
  242. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/datatools/__init__.py +0 -0
  243. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/datatools/local.py +0 -0
  244. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  245. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/datatools/s3/s3.py +0 -0
  246. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/datatools/s3/s3op.py +0 -0
  247. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  248. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  249. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/debug_logger.py +0 -0
  250. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/debug_monitor.py +0 -0
  251. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/__init__.py +0 -0
  252. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/client.py +0 -0
  253. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/client_modules.py +0 -0
  254. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  255. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  256. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  257. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  258. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  259. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  260. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  261. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  262. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  263. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  264. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/consts.py +0 -0
  265. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  266. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  267. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  268. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/server.py +0 -0
  269. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/stub.py +0 -0
  270. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/env_escape/utils.py +0 -0
  271. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/environment_decorator.py +0 -0
  272. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/events_decorator.py +0 -0
  273. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/frameworks/__init__.py +0 -0
  274. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/frameworks/pytorch.py +0 -0
  275. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/gcp/__init__.py +0 -0
  276. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
  277. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  278. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  279. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/gcp/gs_tail.py +0 -0
  280. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/gcp/gs_utils.py +0 -0
  281. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/gcp/includefile_support.py +0 -0
  282. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/kubernetes/__init__.py +0 -0
  283. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
  284. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/kubernetes/kubernetes.py +0 -0
  285. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/kubernetes/kubernetes_cli.py +0 -0
  286. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
  287. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/kubernetes/kubernetes_decorator.py +0 -0
  288. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/kubernetes/kubernetes_job.py +0 -0
  289. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +0 -0
  290. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/kubernetes/spot_metadata_cli.py +0 -0
  291. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/kubernetes/spot_monitor_sidecar.py +0 -0
  292. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/logs_cli.py +0 -0
  293. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/metadata_providers/__init__.py +0 -0
  294. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/metadata_providers/local.py +0 -0
  295. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/metadata_providers/service.py +0 -0
  296. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/package_cli.py +0 -0
  297. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/parallel_decorator.py +0 -0
  298. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/pypi/__init__.py +0 -0
  299. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/pypi/bootstrap.py +0 -0
  300. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/pypi/conda_decorator.py +0 -0
  301. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/pypi/conda_environment.py +0 -0
  302. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/pypi/pip.py +0 -0
  303. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
  304. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  305. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/pypi/utils.py +0 -0
  306. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/resources_decorator.py +0 -0
  307. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/retry_decorator.py +0 -0
  308. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/secrets/__init__.py +0 -0
  309. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  310. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  311. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/storage_executor.py +0 -0
  312. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/tag_cli.py +0 -0
  313. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  314. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/plugins/timeout_decorator.py +0 -0
  315. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/procpoll.py +0 -0
  316. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/py.typed +0 -0
  317. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/pylint_wrapper.py +0 -0
  318. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/runner/__init__.py +0 -0
  319. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/runner/deployer.py +0 -0
  320. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/runner/deployer_impl.py +0 -0
  321. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/runner/metaflow_runner.py +0 -0
  322. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/runner/nbdeploy.py +0 -0
  323. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/runner/nbrun.py +0 -0
  324. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/runner/subprocess_manager.py +0 -0
  325. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/runner/utils.py +0 -0
  326. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/runtime.py +0 -0
  327. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/sidecar/__init__.py +0 -0
  328. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/sidecar/sidecar.py +0 -0
  329. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/sidecar/sidecar_messages.py +0 -0
  330. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  331. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/sidecar/sidecar_worker.py +0 -0
  332. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/system/__init__.py +0 -0
  333. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/system/system_logger.py +0 -0
  334. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/system/system_monitor.py +0 -0
  335. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/system/system_utils.py +0 -0
  336. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tagging_util.py +0 -0
  337. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/task.py +0 -0
  338. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tracing/__init__.py +0 -0
  339. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tracing/propagator.py +0 -0
  340. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tracing/span_exporter.py +0 -0
  341. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tracing/tracing_modules.py +0 -0
  342. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tuple_util.py +0 -0
  343. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/00-helloworld/README.md +0 -0
  344. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  345. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/01-playlist/README.md +0 -0
  346. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  347. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  348. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  349. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/02-statistics/README.md +0 -0
  350. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  351. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  352. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/02-statistics/stats.py +0 -0
  353. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  354. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  355. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  356. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  357. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  358. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  359. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  360. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  361. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  362. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/07-worldview/README.md +0 -0
  363. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  364. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/08-autopilot/README.md +0 -0
  365. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  366. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/unbounded_foreach.py +0 -0
  367. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/user_configs/__init__.py +0 -0
  368. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/user_configs/config_parameters.py +0 -0
  369. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow/vendor.py +0 -0
  370. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow.egg-info/SOURCES.txt +0 -0
  371. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow.egg-info/dependency_links.txt +0 -0
  372. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow.egg-info/entry_points.txt +0 -0
  373. {metaflow-2.13.8 → metaflow-2.13.10}/metaflow.egg-info/top_level.txt +0 -0
  374. {metaflow-2.13.8 → metaflow-2.13.10}/setup.cfg +0 -0
  375. {metaflow-2.13.8 → metaflow-2.13.10}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: metaflow
3
- Version: 2.13.8
3
+ Version: 2.13.10
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.13.8; extra == "stubs"
29
+ Requires-Dist: metaflow-stubs==2.13.10; extra == "stubs"
30
30
  Dynamic: author
31
31
  Dynamic: author-email
32
32
  Dynamic: classifier
@@ -206,15 +206,15 @@ def output_raw(obj, json):
206
206
  else:
207
207
  _graph = str(obj.graph)
208
208
  _msg = "Internal representation of the flow:"
209
- echo(_msg, fg="magenta", bold=False)
209
+ echo_always(_msg, fg="magenta", bold=False)
210
210
  echo_always(_graph, err=False)
211
211
 
212
212
 
213
213
  @cli.command(help="Visualize the flow with Graphviz.")
214
214
  @click.pass_obj
215
215
  def output_dot(obj):
216
- echo("Visualizing the flow as a GraphViz graph", fg="magenta", bold=False)
217
- echo(
216
+ echo_always("Visualizing the flow as a GraphViz graph", fg="magenta", bold=False)
217
+ echo_always(
218
218
  "Try piping the output to 'dot -Tpng -o graph.png' to produce "
219
219
  "an actual image.",
220
220
  indent=True,
@@ -330,7 +330,7 @@ def start(
330
330
  event_logger=None,
331
331
  monitor=None,
332
332
  local_config_file=None,
333
- config_file=None,
333
+ config=None,
334
334
  config_value=None,
335
335
  **deco_options
336
336
  ):
@@ -383,7 +383,7 @@ def start(
383
383
  # When we process the options, the first one processed will return None and the
384
384
  # second one processed will return the actual options. The order of processing
385
385
  # depends on what (and in what order) the user specifies on the command line.
386
- config_options = config_file or config_value
386
+ config_options = config or config_value
387
387
 
388
388
  if (
389
389
  hasattr(ctx, "saved_args")
@@ -396,7 +396,7 @@ def start(
396
396
  # if we need to in the first place
397
397
  if getattr(ctx.obj, "has_cl_config_options", False):
398
398
  raise click.UsageError(
399
- "Cannot specify --config-file or --config-value with 'resume'"
399
+ "Cannot specify --config or --config-value with 'resume'"
400
400
  )
401
401
  # We now load the config artifacts from the original run id
402
402
  run_id = None
@@ -72,10 +72,10 @@ class CLIArgs(object):
72
72
  # keyword in Python, so we call it 'decospecs' in click args
73
73
  if k == "decospecs":
74
74
  k = "with"
75
- if k in ("config_file", "config_value"):
75
+ if k in ("config", "config_value"):
76
76
  # Special handling here since we gather them all in one option but actually
77
77
  # need to send them one at a time using --config-value <name> kv.<name>.
78
- # Note it can be either config_file or config_value depending
78
+ # Note it can be either config or config_value depending
79
79
  # on click processing order.
80
80
  for config_name in v.keys():
81
81
  yield "--config-value"
@@ -1133,8 +1133,14 @@ class StubGenerator:
1133
1133
  result = result[1:]
1134
1134
  # Add doc to first and last overloads. Jedi uses the last one and pycharm
1135
1135
  # the first one. Go figure.
1136
- result[0] = (result[0][0], docs["func_doc"])
1137
- result[-1] = (result[-1][0], docs["func_doc"])
1136
+ result[0] = (
1137
+ result[0][0],
1138
+ docs["func_doc"] + "\nParameters\n----------\n" + docs["param_doc"],
1139
+ )
1140
+ result[-1] = (
1141
+ result[-1][0],
1142
+ docs["func_doc"] + "\nParameters\n----------\n" + docs["param_doc"],
1143
+ )
1138
1144
  return result
1139
1145
 
1140
1146
  def _generate_function_stub(
@@ -253,7 +253,7 @@ class TaskDataStore(object):
253
253
 
254
254
  @only_if_not_done
255
255
  @require_mode("w")
256
- def save_artifacts(self, artifacts_iter, force_v4=False, len_hint=0):
256
+ def save_artifacts(self, artifacts_iter, len_hint=0):
257
257
  """
258
258
  Saves Metaflow Artifacts (Python objects) to the datastore and stores
259
259
  any relevant metadata needed to retrieve them.
@@ -269,11 +269,6 @@ class TaskDataStore(object):
269
269
  artifacts : Iterator[(string, object)]
270
270
  Iterator over the human-readable name of the object to save
271
271
  and the object itself
272
- force_v4 : boolean or Dict[string -> boolean]
273
- Indicates whether the artifact should be pickled using the v4
274
- version of pickle. If a single boolean, applies to all artifacts.
275
- If a dictionary, applies to the object named only. Defaults to False
276
- if not present or not specified
277
272
  len_hint: integer
278
273
  Estimated number of items in artifacts_iter
279
274
  """
@@ -281,40 +276,24 @@ class TaskDataStore(object):
281
276
 
282
277
  def pickle_iter():
283
278
  for name, obj in artifacts_iter:
284
- do_v4 = (
285
- force_v4 and force_v4
286
- if isinstance(force_v4, bool)
287
- else force_v4.get(name, False)
288
- )
289
- if do_v4:
290
- encode_type = "gzip+pickle-v4"
291
- if encode_type not in self._encodings:
292
- raise DataException(
293
- "Artifact *%s* requires a serialization encoding that "
294
- "requires Python 3.4 or newer." % name
295
- )
279
+ encode_type = "gzip+pickle-v4"
280
+ if encode_type in self._encodings:
296
281
  try:
297
282
  blob = pickle.dumps(obj, protocol=4)
298
283
  except TypeError as e:
299
- raise UnpicklableArtifactException(name)
284
+ raise UnpicklableArtifactException(name) from e
300
285
  else:
301
286
  try:
302
287
  blob = pickle.dumps(obj, protocol=2)
303
288
  encode_type = "gzip+pickle-v2"
304
- except (SystemError, OverflowError):
305
- encode_type = "gzip+pickle-v4"
306
- if encode_type not in self._encodings:
307
- raise DataException(
308
- "Artifact *%s* is very large (over 2GB). "
309
- "You need to use Python 3.4 or newer if you want to "
310
- "serialize large objects." % name
311
- )
312
- try:
313
- blob = pickle.dumps(obj, protocol=4)
314
- except TypeError as e:
315
- raise UnpicklableArtifactException(name)
289
+ except (SystemError, OverflowError) as e:
290
+ raise DataException(
291
+ "Artifact *%s* is very large (over 2GB). "
292
+ "You need to use Python 3.4 or newer if you want to "
293
+ "serialize large objects." % name
294
+ ) from e
316
295
  except TypeError as e:
317
- raise UnpicklableArtifactException(name)
296
+ raise UnpicklableArtifactException(name) from e
318
297
 
319
298
  self._info[name] = {
320
299
  "size": len(blob),
@@ -223,17 +223,18 @@ class FlowSpec(metaclass=FlowSpecMeta):
223
223
  seen.add(norm)
224
224
 
225
225
  @classmethod
226
- def _process_config_decorators(cls, config_options, ignore_errors=False):
226
+ def _process_config_decorators(cls, config_options, process_configs=True):
227
227
 
228
228
  # Fast path for no user configurations
229
- if not cls._flow_state.get(_FlowState.CONFIG_DECORATORS) and all(
230
- len(step.config_decorators) == 0 for step in cls._steps
229
+ if not process_configs or (
230
+ not cls._flow_state.get(_FlowState.CONFIG_DECORATORS)
231
+ and all(len(step.config_decorators) == 0 for step in cls._steps)
231
232
  ):
232
233
  # Process parameters to allow them to also use config values easily
233
234
  for var, param in cls._get_parameters():
234
235
  if param.IS_CONFIG_PARAMETER:
235
236
  continue
236
- param.init(ignore_errors)
237
+ param.init(not process_configs)
237
238
  return None
238
239
 
239
240
  debug.userconf_exec("Processing mutating step/flow decorators")
@@ -258,6 +259,11 @@ class FlowSpec(metaclass=FlowSpecMeta):
258
259
  debug.userconf_exec("Setting config %s to %s" % (var, str(val)))
259
260
  setattr(cls, var, val)
260
261
 
262
+ # Reset cached parameters since we have replaced configs already with ConfigValue
263
+ # so they are not parameters anymore to be re-evaluated when we do _get_parameters
264
+ if _FlowState.CACHED_PARAMETERS in cls._flow_state:
265
+ del cls._flow_state[_FlowState.CACHED_PARAMETERS]
266
+
261
267
  # Run all the decorators. Step decorators are directly in the step and
262
268
  # we will run those first and *then* we run all the flow level decorators
263
269
  for step in cls._steps:
@@ -277,7 +283,7 @@ class FlowSpec(metaclass=FlowSpecMeta):
277
283
  setattr(cls, step.name, step)
278
284
 
279
285
  mutable_flow = MutableFlow(cls)
280
- for deco in cls._flow_state[_FlowState.CONFIG_DECORATORS]:
286
+ for deco in cls._flow_state.get(_FlowState.CONFIG_DECORATORS, []):
281
287
  if isinstance(deco, CustomFlowDecorator):
282
288
  # Sanity check to make sure we are applying the decorator to the right
283
289
  # class
@@ -125,7 +125,9 @@ class MetaflowEnvironment(object):
125
125
  )
126
126
 
127
127
  def _get_install_dependencies_cmd(self, datastore_type):
128
- base_cmd = "{} -m pip install -qqq".format(self._python())
128
+ base_cmd = "{} -m pip install -qqq --no-compile --no-cache-dir --disable-pip-version-check".format(
129
+ self._python()
130
+ )
129
131
 
130
132
  datastore_packages = {
131
133
  "s3": ["boto3"],
@@ -111,6 +111,9 @@ class ArgoWorkflows(object):
111
111
  notify_on_success=False,
112
112
  notify_slack_webhook_url=None,
113
113
  notify_pager_duty_integration_key=None,
114
+ notify_incident_io_api_key=None,
115
+ incident_io_success_severity_id=None,
116
+ incident_io_error_severity_id=None,
114
117
  enable_heartbeat_daemon=True,
115
118
  enable_error_msg_capture=False,
116
119
  ):
@@ -160,6 +163,9 @@ class ArgoWorkflows(object):
160
163
  self.notify_on_success = notify_on_success
161
164
  self.notify_slack_webhook_url = notify_slack_webhook_url
162
165
  self.notify_pager_duty_integration_key = notify_pager_duty_integration_key
166
+ self.notify_incident_io_api_key = notify_incident_io_api_key
167
+ self.incident_io_success_severity_id = incident_io_success_severity_id
168
+ self.incident_io_error_severity_id = incident_io_error_severity_id
163
169
  self.enable_heartbeat_daemon = enable_heartbeat_daemon
164
170
  self.enable_error_msg_capture = enable_error_msg_capture
165
171
  self.parameters = self._process_parameters()
@@ -891,6 +897,17 @@ class ArgoWorkflows(object):
891
897
  and self.notify_pager_duty_integration_key
892
898
  else {}
893
899
  ),
900
+ **(
901
+ {
902
+ # workflow status maps to Completed
903
+ "notify-incident-io-on-success": LifecycleHook()
904
+ .expression("workflow.status == 'Succeeded'")
905
+ .template("notify-incident-io-on-success"),
906
+ }
907
+ if self.notify_on_success
908
+ and self.notify_incident_io_api_key
909
+ else {}
910
+ ),
894
911
  **(
895
912
  {
896
913
  # workflow status maps to Failed or Error
@@ -918,6 +935,19 @@ class ArgoWorkflows(object):
918
935
  and self.notify_pager_duty_integration_key
919
936
  else {}
920
937
  ),
938
+ **(
939
+ {
940
+ # workflow status maps to Failed or Error
941
+ "notify-incident-io-on-failure": LifecycleHook()
942
+ .expression("workflow.status == 'Failed'")
943
+ .template("notify-incident-io-on-error"),
944
+ "notify-incident-io-on-error": LifecycleHook()
945
+ .expression("workflow.status == 'Error'")
946
+ .template("notify-incident-io-on-error"),
947
+ }
948
+ if self.notify_on_error and self.notify_incident_io_api_key
949
+ else {}
950
+ ),
921
951
  # Warning: terrible hack to workaround a bug in Argo Workflow
922
952
  # where the hooks listed above do not execute unless
923
953
  # there is an explicit exit hook. as and when this
@@ -2270,9 +2300,11 @@ class ArgoWorkflows(object):
2270
2300
  if self.notify_on_error:
2271
2301
  templates.append(self._slack_error_template())
2272
2302
  templates.append(self._pager_duty_alert_template())
2303
+ templates.append(self._incident_io_alert_template())
2273
2304
  if self.notify_on_success:
2274
2305
  templates.append(self._slack_success_template())
2275
2306
  templates.append(self._pager_duty_change_template())
2307
+ templates.append(self._incident_io_change_template())
2276
2308
  if self.notify_on_error or self.notify_on_success:
2277
2309
  # Warning: terrible hack to workaround a bug in Argo Workflow where the
2278
2310
  # templates listed above do not execute unless there is an
@@ -2466,6 +2498,82 @@ class ArgoWorkflows(object):
2466
2498
  )
2467
2499
  )
2468
2500
 
2501
+ def _incident_io_alert_template(self):
2502
+ if self.notify_incident_io_api_key is None:
2503
+ return None
2504
+ if self.incident_io_error_severity_id is None:
2505
+ raise MetaflowException(
2506
+ "Creating incidents for errors requires a severity id."
2507
+ )
2508
+ return Template("notify-incident-io-on-error").http(
2509
+ Http("POST")
2510
+ .url("https://api.incident.io/v2/incidents")
2511
+ .header("Content-Type", "application/json")
2512
+ .header("Authorization", "Bearer %s" % self.notify_incident_io_api_key)
2513
+ .body(
2514
+ json.dumps(
2515
+ {
2516
+ "idempotency_key": "argo-{{workflow.name}}", # use run id to deduplicate alerts.
2517
+ "visibility": "public",
2518
+ "severity_id": self.incident_io_error_severity_id,
2519
+ "name": "Flow %s has failed." % self.flow.name,
2520
+ "summary": "Metaflow run %s/argo-{{workflow.name}} failed! %s"
2521
+ % (self.flow.name, self._incident_io_ui_urls_for_run()),
2522
+ # TODO: Add support for custom field entries.
2523
+ }
2524
+ )
2525
+ )
2526
+ )
2527
+
2528
+ def _incident_io_change_template(self):
2529
+ if self.notify_incident_io_api_key is None:
2530
+ return None
2531
+ if self.incident_io_success_severity_id is None:
2532
+ raise MetaflowException(
2533
+ "Creating incidents for successes requires a severity id."
2534
+ )
2535
+ return Template("notify-incident-io-on-success").http(
2536
+ Http("POST")
2537
+ .url("https://api.incident.io/v2/incidents")
2538
+ .header("Content-Type", "application/json")
2539
+ .header("Authorization", "Bearer %s" % self.notify_incident_io_api_key)
2540
+ .body(
2541
+ json.dumps(
2542
+ {
2543
+ "idempotency_key": "argo-{{workflow.name}}", # use run id to deduplicate alerts.
2544
+ "visibility": "public",
2545
+ "severity_id": self.incident_io_success_severity_id,
2546
+ # TODO: Do we need to make incident type configurable for successes? otherwise they are created as 'investigating'
2547
+ # "incident_type_id": ""
2548
+ "name": "Flow %s has succeeded." % self.flow.name,
2549
+ "summary": "Metaflow run %s/argo-{{workflow.name}} succeeded!%s"
2550
+ % (self.flow.name, self._incident_io_ui_urls_for_run()),
2551
+ # TODO: Add support for custom field entries.
2552
+ }
2553
+ )
2554
+ )
2555
+ )
2556
+
2557
+ def _incident_io_ui_urls_for_run(self):
2558
+ links = []
2559
+ if UI_URL:
2560
+ url = "[Metaflow UI](%s/%s/%s)" % (
2561
+ UI_URL.rstrip("/"),
2562
+ self.flow.name,
2563
+ "argo-{{workflow.name}}",
2564
+ )
2565
+ links.append(url)
2566
+ if ARGO_WORKFLOWS_UI_URL:
2567
+ url = "[Argo UI](%s/workflows/%s/%s)" % (
2568
+ ARGO_WORKFLOWS_UI_URL.rstrip("/"),
2569
+ "{{workflow.namespace}}",
2570
+ "{{workflow.name}}",
2571
+ )
2572
+ links.append(url)
2573
+ if links:
2574
+ links = ["See details for the run at: ", *links]
2575
+ return "\n\n".join(links)
2576
+
2469
2577
  def _pager_duty_change_template(self):
2470
2578
  # https://developer.pagerduty.com/docs/ZG9jOjExMDI5NTgy-send-a-change-event
2471
2579
  if self.notify_pager_duty_integration_key is None:
@@ -176,6 +176,21 @@ def argo_workflows(obj, name=None):
176
176
  default="",
177
177
  help="PagerDuty Events API V2 Integration key for workflow success/failure notifications.",
178
178
  )
179
+ @click.option(
180
+ "--notify-incident-io-api-key",
181
+ default=None,
182
+ help="Incident.io API V2 key for workflow success/failure notifications.",
183
+ )
184
+ @click.option(
185
+ "--incident-io-success-severity-id",
186
+ default=None,
187
+ help="Incident.io severity id for success alerts.",
188
+ )
189
+ @click.option(
190
+ "--incident-io-error-severity-id",
191
+ default=None,
192
+ help="Incident.io severity id for error alerts.",
193
+ )
179
194
  @click.option(
180
195
  "--enable-heartbeat-daemon/--no-enable-heartbeat-daemon",
181
196
  default=False,
@@ -213,6 +228,9 @@ def create(
213
228
  notify_on_success=False,
214
229
  notify_slack_webhook_url=None,
215
230
  notify_pager_duty_integration_key=None,
231
+ notify_incident_io_api_key=None,
232
+ incident_io_success_severity_id=None,
233
+ incident_io_error_severity_id=None,
216
234
  enable_heartbeat_daemon=True,
217
235
  deployer_attribute_file=None,
218
236
  enable_error_msg_capture=False,
@@ -268,6 +286,9 @@ def create(
268
286
  notify_on_success,
269
287
  notify_slack_webhook_url,
270
288
  notify_pager_duty_integration_key,
289
+ notify_incident_io_api_key,
290
+ incident_io_success_severity_id,
291
+ incident_io_error_severity_id,
271
292
  enable_heartbeat_daemon,
272
293
  enable_error_msg_capture,
273
294
  )
@@ -442,6 +463,9 @@ def make_flow(
442
463
  notify_on_success,
443
464
  notify_slack_webhook_url,
444
465
  notify_pager_duty_integration_key,
466
+ notify_incident_io_api_key,
467
+ incident_io_success_severity_id,
468
+ incident_io_error_severity_id,
445
469
  enable_heartbeat_daemon,
446
470
  enable_error_msg_capture,
447
471
  ):
@@ -453,17 +477,30 @@ def make_flow(
453
477
  )
454
478
 
455
479
  if (notify_on_error or notify_on_success) and not (
456
- notify_slack_webhook_url or notify_pager_duty_integration_key
480
+ notify_slack_webhook_url
481
+ or notify_pager_duty_integration_key
482
+ or notify_incident_io_api_key
457
483
  ):
458
484
  raise MetaflowException(
459
- "Notifications require specifying an incoming Slack webhook url via --notify-slack-webhook-url or "
460
- "PagerDuty events v2 integration key via --notify-pager-duty-integration-key.\n If you would like to set up "
461
- "notifications for your Slack workspace, follow the instructions at "
462
- "https://api.slack.com/messaging/webhooks to generate a webhook url.\n For notifications through PagerDuty, "
463
- "generate an integration key by following the instructions at "
464
- "https://support.pagerduty.com/docs/services-and-integrations#create-a-generic-events-api-integration"
485
+ "Notifications require specifying an incoming Slack webhook url via --notify-slack-webhook-url, PagerDuty events v2 integration key via --notify-pager-duty-integration-key or\n"
486
+ "Incident.io integration API key via --notify-incident-io-api-key.\n"
487
+ " If you would like to set up notifications for your Slack workspace, follow the instructions at "
488
+ "https://api.slack.com/messaging/webhooks to generate a webhook url.\n"
489
+ " For notifications through PagerDuty, generate an integration key by following the instructions at "
490
+ "https://support.pagerduty.com/docs/services-and-integrations#create-a-generic-events-api-integration\n"
491
+ " For notifications through Incident.io, generate an API key with a permission to create incidents."
465
492
  )
466
493
 
494
+ if notify_incident_io_api_key:
495
+ if notify_on_error and incident_io_error_severity_id is None:
496
+ raise MetaflowException(
497
+ "Incident.io error notifications require a severity id. Please set one with --incident-io-error-severity-id"
498
+ )
499
+
500
+ if notify_on_success and incident_io_success_severity_id is None:
501
+ raise MetaflowException(
502
+ "Incident.io success notifications require a severity id. Please set one with --incident-io-success-severity-id"
503
+ )
467
504
  # Attach @kubernetes and @environment decorator to the flow to
468
505
  # ensure that the related decorator hooks are invoked.
469
506
  decorators._attach_decorators(
@@ -507,6 +544,9 @@ def make_flow(
507
544
  notify_on_success=notify_on_success,
508
545
  notify_slack_webhook_url=notify_slack_webhook_url,
509
546
  notify_pager_duty_integration_key=notify_pager_duty_integration_key,
547
+ notify_incident_io_api_key=notify_incident_io_api_key,
548
+ incident_io_success_severity_id=incident_io_success_severity_id,
549
+ incident_io_error_severity_id=incident_io_error_severity_id,
510
550
  enable_heartbeat_daemon=enable_heartbeat_daemon,
511
551
  enable_error_msg_capture=enable_error_msg_capture,
512
552
  )
@@ -26,6 +26,24 @@ class ProjectDecorator(FlowDecorator):
26
26
  projects that use the same production scheduler. The name may
27
27
  contain only lowercase alphanumeric characters and underscores.
28
28
 
29
+ branch : Optional[str], default None
30
+ The branch to use. If not specified, the branch is set to
31
+ `user.<username>` unless `production` is set to `True`. This can
32
+ also be set on the command line using `--branch` as a top-level option.
33
+ It is an error to specify `branch` in the decorator and on the command line.
34
+
35
+ production : bool, default False
36
+ Whether or not the branch is the production branch. This can also be set on the
37
+ command line using `--production` as a top-level option. It is an error to specify
38
+ `production` in the decorator and on the command line.
39
+ The project branch name will be:
40
+ - if `branch` is specified:
41
+ - if `production` is True: `prod.<branch>`
42
+ - if `production` is False: `test.<branch>`
43
+ - if `branch` is not specified:
44
+ - if `production` is True: `prod`
45
+ - if `production` is False: `user.<username>`
46
+
29
47
  MF Add To Current
30
48
  -----------------
31
49
  project_name -> str
@@ -10,6 +10,7 @@ from metaflow.exception import MetaflowException
10
10
  from metaflow.util import which
11
11
 
12
12
  from .utils import MICROMAMBA_MIRROR_URL, MICROMAMBA_URL, conda_platform
13
+ from threading import Lock
13
14
 
14
15
 
15
16
  class MicromambaException(MetaflowException):
@@ -54,22 +55,33 @@ class Micromamba(object):
54
55
  or which(os.path.join(self._path_to_hidden_micromamba, "bin/micromamba"))
55
56
  )
56
57
 
58
+ # We keep a mutex as environments are resolved in parallel,
59
+ # which causes a race condition in case micromamba needs to be installed first.
60
+ self.install_mutex = Lock()
61
+
57
62
  @property
58
- def bin(self):
63
+ def bin(self) -> str:
59
64
  "Defer installing Micromamba until when the binary path is actually requested"
60
65
  if self._bin is not None:
61
66
  return self._bin
62
- # Install Micromamba on the fly.
63
- # TODO: Make this optional at some point.
64
- _install_micromamba(self._path_to_hidden_micromamba)
65
- self._bin = which(
66
- os.path.join(self._path_to_hidden_micromamba, "bin/micromamba")
67
- )
67
+ with self.install_mutex:
68
+ # another check as micromamba might have been installed when the mutex is released.
69
+ if self._bin is not None:
70
+ return self._bin
71
+
72
+ # Install Micromamba on the fly.
73
+ # TODO: Make this optional at some point.
74
+ _install_micromamba(self._path_to_hidden_micromamba)
75
+ self._bin = which(
76
+ os.path.join(self._path_to_hidden_micromamba, "bin/micromamba")
77
+ )
78
+
79
+ if self._bin is None:
80
+ msg = "No installation for *Micromamba* found.\n"
81
+ msg += "Visit https://mamba.readthedocs.io/en/latest/micromamba-installation.html for installation instructions."
82
+ raise MetaflowException(msg)
68
83
 
69
- if self._bin is None:
70
- msg = "No installation for *Micromamba* found.\n"
71
- msg += "Visit https://mamba.readthedocs.io/en/latest/micromamba-installation.html for installation instructions."
72
- raise MetaflowException(msg)
84
+ return self._bin
73
85
 
74
86
  def solve(self, id_, packages, python, platform):
75
87
  # Performance enhancements
@@ -41,6 +41,7 @@ from metaflow.exception import MetaflowException
41
41
  from metaflow.includefile import FilePathClass
42
42
  from metaflow.metaflow_config import CLICK_API_PROCESS_CONFIG
43
43
  from metaflow.parameters import JSONTypeClass, flow_context
44
+ from metaflow.user_configs.config_decorators import CustomFlowDecorator
44
45
  from metaflow.user_configs.config_options import (
45
46
  ConfigValue,
46
47
  ConvertDictOrStr,
@@ -252,10 +253,14 @@ def extract_flow_class_from_file(flow_file: str) -> FlowSpec:
252
253
  # Cache the loaded module
253
254
  loaded_modules[flow_file] = module
254
255
 
255
- classes = inspect.getmembers(module, inspect.isclass)
256
+ classes = inspect.getmembers(
257
+ module, lambda x: inspect.isclass(x) or isinstance(x, CustomFlowDecorator)
258
+ )
256
259
  flow_cls = None
257
260
 
258
261
  for _, kls in classes:
262
+ if isinstance(kls, CustomFlowDecorator):
263
+ kls = kls._flow_cls
259
264
  if (
260
265
  kls is not FlowSpec
261
266
  and kls.__module__ == module_name
@@ -444,10 +449,10 @@ class MetaflowAPI(object):
444
449
  ds = opts.get("datastore", defaults["datastore"])
445
450
  quiet = opts.get("quiet", defaults["quiet"])
446
451
  is_default = False
447
- config_file = opts.get("config-file")
452
+ config_file = opts.get("config")
448
453
  if config_file is None:
449
454
  is_default = True
450
- config_file = defaults.get("config_file")
455
+ config_file = defaults.get("config")
451
456
 
452
457
  if config_file:
453
458
  config_file = map(
@@ -480,7 +485,7 @@ class MetaflowAPI(object):
480
485
  # Process both configurations; the second one will return all the merged
481
486
  # configuration options properly processed.
482
487
  self._config_input.process_configs(
483
- self._flow_cls.__name__, "config_file", config_file, quiet, ds
488
+ self._flow_cls.__name__, "config", config_file, quiet, ds
484
489
  )
485
490
  config_options = self._config_input.process_configs(
486
491
  self._flow_cls.__name__, "config_value", config_value, quiet, ds
@@ -493,7 +498,7 @@ class MetaflowAPI(object):
493
498
  # it will init all parameters (config_options will be None)
494
499
  # We ignore any errors if we don't check the configs in the click API.
495
500
  new_cls = self._flow_cls._process_config_decorators(
496
- config_options, ignore_errors=not CLICK_API_PROCESS_CONFIG
501
+ config_options, process_configs=CLICK_API_PROCESS_CONFIG
497
502
  )
498
503
  if new_cls:
499
504
  self._flow_cls = new_cls
@@ -522,6 +527,12 @@ def extract_all_params(cmd_obj: Union[click.Command, click.Group]):
522
527
  )
523
528
  arg_parameters[each_param.name] = each_param
524
529
  elif isinstance(each_param, click.Option):
530
+ if each_param.hidden:
531
+ # Skip hidden options because users should not be setting those.
532
+ # These are typically internal only options (used by the Runner in part
533
+ # for example to pass state files or configs to pass local-config-file).
534
+ continue
535
+
525
536
  opt_params_sigs[each_param.name], annotations[each_param.name] = (
526
537
  get_inspect_param_obj(each_param, inspect.Parameter.KEYWORD_ONLY)
527
538
  )