metaflow 2.12.29__tar.gz → 2.12.31__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 (363) hide show
  1. {metaflow-2.12.29/metaflow.egg-info → metaflow-2.12.31}/PKG-INFO +2 -2
  2. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/cli.py +13 -23
  3. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/parameters.py +8 -2
  4. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/argo/argo_workflows.py +8 -4
  5. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/events_decorator.py +253 -72
  6. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +43 -28
  7. metaflow-2.12.31/metaflow/version.py +1 -0
  8. {metaflow-2.12.29 → metaflow-2.12.31/metaflow.egg-info}/PKG-INFO +2 -2
  9. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow.egg-info/requires.txt +1 -1
  10. metaflow-2.12.29/metaflow/version.py +0 -1
  11. {metaflow-2.12.29 → metaflow-2.12.31}/LICENSE +0 -0
  12. {metaflow-2.12.29 → metaflow-2.12.31}/MANIFEST.in +0 -0
  13. {metaflow-2.12.29 → metaflow-2.12.31}/README.md +0 -0
  14. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/R.py +0 -0
  15. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/__init__.py +0 -0
  16. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/__init__.py +0 -0
  17. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/click/__init__.py +0 -0
  18. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  19. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/click/_compat.py +0 -0
  20. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/click/_termui_impl.py +0 -0
  21. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/click/_textwrap.py +0 -0
  22. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/click/_unicodefun.py +0 -0
  23. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/click/_winconsole.py +0 -0
  24. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/click/core.py +0 -0
  25. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/click/decorators.py +0 -0
  26. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/click/exceptions.py +0 -0
  27. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/click/formatting.py +0 -0
  28. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/click/globals.py +0 -0
  29. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/click/parser.py +0 -0
  30. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/click/termui.py +0 -0
  31. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/click/testing.py +0 -0
  32. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/click/types.py +0 -0
  33. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/click/utils.py +0 -0
  34. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
  35. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
  36. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
  37. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
  38. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
  39. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
  40. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
  41. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
  42. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
  43. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/packaging/__init__.py +0 -0
  44. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/packaging/_elffile.py +0 -0
  45. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  46. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  47. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/packaging/_parser.py +0 -0
  48. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/packaging/_structures.py +0 -0
  49. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  50. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/packaging/markers.py +0 -0
  51. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/packaging/py.typed +0 -0
  52. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/packaging/requirements.py +0 -0
  53. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/packaging/specifiers.py +0 -0
  54. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/packaging/tags.py +0 -0
  55. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/packaging/utils.py +0 -0
  56. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/packaging/version.py +0 -0
  57. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/typeguard/__init__.py +0 -0
  58. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/typeguard/_checkers.py +0 -0
  59. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/typeguard/_config.py +0 -0
  60. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/typeguard/_decorators.py +0 -0
  61. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
  62. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/typeguard/_functions.py +0 -0
  63. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/typeguard/_importhook.py +0 -0
  64. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/typeguard/_memo.py +0 -0
  65. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
  66. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/typeguard/_suppression.py +0 -0
  67. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/typeguard/_transformer.py +0 -0
  68. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
  69. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/typeguard/_utils.py +0 -0
  70. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/typeguard/py.typed +0 -0
  71. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/typing_extensions.py +0 -0
  72. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/v3_5/__init__.py +0 -0
  73. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
  74. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
  75. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/v3_5/zipp.py +0 -0
  76. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/v3_6/__init__.py +0 -0
  77. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  78. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  79. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  80. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  81. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  82. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  83. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  84. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  85. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  86. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  87. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/v3_6/zipp.py +0 -0
  88. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/_vendor/zipp.py +0 -0
  89. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/cards.py +0 -0
  90. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/cli_args.py +0 -0
  91. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/client/__init__.py +0 -0
  92. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/client/core.py +0 -0
  93. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/client/filecache.py +0 -0
  94. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/clone_util.py +0 -0
  95. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/cmd/__init__.py +0 -0
  96. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/cmd/configure_cmd.py +0 -0
  97. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/cmd/develop/__init__.py +0 -0
  98. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/cmd/develop/stub_generator.py +0 -0
  99. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/cmd/develop/stubs.py +0 -0
  100. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/cmd/main_cli.py +0 -0
  101. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/cmd/tutorials_cmd.py +0 -0
  102. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/cmd/util.py +0 -0
  103. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/cmd_with_io.py +0 -0
  104. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/datastore/__init__.py +0 -0
  105. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/datastore/content_addressed_store.py +0 -0
  106. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/datastore/datastore_set.py +0 -0
  107. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/datastore/datastore_storage.py +0 -0
  108. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/datastore/exceptions.py +0 -0
  109. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/datastore/flow_datastore.py +0 -0
  110. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/datastore/inputs.py +0 -0
  111. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/datastore/task_datastore.py +0 -0
  112. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/debug.py +0 -0
  113. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/decorators.py +0 -0
  114. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/event_logger.py +0 -0
  115. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/events.py +0 -0
  116. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/exception.py +0 -0
  117. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/extension_support/__init__.py +0 -0
  118. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/extension_support/_empty_file.py +0 -0
  119. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/extension_support/cmd.py +0 -0
  120. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/extension_support/integrations.py +0 -0
  121. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/extension_support/plugins.py +0 -0
  122. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/flowspec.py +0 -0
  123. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/graph.py +0 -0
  124. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/includefile.py +0 -0
  125. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/info_file.py +0 -0
  126. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/integrations.py +0 -0
  127. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/lint.py +0 -0
  128. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/metadata_provider/__init__.py +0 -0
  129. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/metadata_provider/heartbeat.py +0 -0
  130. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/metadata_provider/metadata.py +0 -0
  131. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/metadata_provider/util.py +0 -0
  132. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/metaflow_config.py +0 -0
  133. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/metaflow_config_funcs.py +0 -0
  134. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/metaflow_current.py +0 -0
  135. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/metaflow_environment.py +0 -0
  136. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/metaflow_profile.py +0 -0
  137. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/metaflow_version.py +0 -0
  138. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/mflog/__init__.py +0 -0
  139. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/mflog/mflog.py +0 -0
  140. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/mflog/save_logs.py +0 -0
  141. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/mflog/save_logs_periodically.py +0 -0
  142. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/mflog/tee.py +0 -0
  143. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/monitor.py +0 -0
  144. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/multicore_utils.py +0 -0
  145. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/package.py +0 -0
  146. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/__init__.py +0 -0
  147. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/airflow/__init__.py +0 -0
  148. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/airflow/airflow.py +0 -0
  149. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  150. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  151. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  152. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/airflow/dag.py +0 -0
  153. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/airflow/exception.py +0 -0
  154. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  155. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  156. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  157. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
  158. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
  159. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
  160. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/argo/__init__.py +0 -0
  161. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/argo/argo_client.py +0 -0
  162. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/argo/argo_events.py +0 -0
  163. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/argo/argo_workflows_cli.py +0 -0
  164. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  165. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
  166. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/argo/argo_workflows_deployer_objects.py +0 -0
  167. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/argo/capture_error.py +0 -0
  168. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/argo/generate_input_paths.py +0 -0
  169. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
  170. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/__init__.py +0 -0
  171. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/aws_client.py +0 -0
  172. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/aws_utils.py +0 -0
  173. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/batch/__init__.py +0 -0
  174. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/batch/batch.py +0 -0
  175. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  176. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  177. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
  178. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  179. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  180. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  181. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  182. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  183. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  184. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  185. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  186. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
  187. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
  188. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  189. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  190. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
  191. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +0 -0
  192. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/azure/__init__.py +0 -0
  193. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/azure/azure_credential.py +0 -0
  194. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  195. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
  196. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/azure/azure_tail.py +0 -0
  197. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/azure/azure_utils.py +0 -0
  198. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  199. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/azure/includefile_support.py +0 -0
  200. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/__init__.py +0 -0
  201. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_cli.py +0 -0
  202. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_client.py +0 -0
  203. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_creator.py +0 -0
  204. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_datastore.py +0 -0
  205. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_decorator.py +0 -0
  206. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  207. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_modules/base.html +0 -0
  208. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_modules/basic.py +0 -0
  209. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
  210. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_modules/card.py +0 -0
  211. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  212. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  213. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  214. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  215. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  216. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_modules/components.py +0 -0
  217. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  218. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_modules/main.js +0 -0
  219. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  220. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  221. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_resolver.py +0 -0
  222. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_server.py +0 -0
  223. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
  224. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/component_serializer.py +0 -0
  225. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/cards/exception.py +0 -0
  226. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/catch_decorator.py +0 -0
  227. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/datastores/__init__.py +0 -0
  228. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/datastores/azure_storage.py +0 -0
  229. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/datastores/gs_storage.py +0 -0
  230. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/datastores/local_storage.py +0 -0
  231. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/datastores/s3_storage.py +0 -0
  232. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/datatools/__init__.py +0 -0
  233. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/datatools/local.py +0 -0
  234. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  235. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/datatools/s3/s3.py +0 -0
  236. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/datatools/s3/s3op.py +0 -0
  237. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  238. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  239. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/debug_logger.py +0 -0
  240. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/debug_monitor.py +0 -0
  241. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/__init__.py +0 -0
  242. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/client.py +0 -0
  243. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/client_modules.py +0 -0
  244. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  245. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  246. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  247. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  248. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  249. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  250. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  251. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  252. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  253. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  254. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/consts.py +0 -0
  255. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  256. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  257. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  258. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/server.py +0 -0
  259. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/stub.py +0 -0
  260. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/env_escape/utils.py +0 -0
  261. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/environment_decorator.py +0 -0
  262. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/frameworks/__init__.py +0 -0
  263. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/frameworks/pytorch.py +0 -0
  264. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/gcp/__init__.py +0 -0
  265. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
  266. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  267. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  268. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/gcp/gs_tail.py +0 -0
  269. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/gcp/gs_utils.py +0 -0
  270. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/gcp/includefile_support.py +0 -0
  271. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/kubernetes/__init__.py +0 -0
  272. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
  273. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/kubernetes/kubernetes.py +0 -0
  274. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/kubernetes/kubernetes_cli.py +0 -0
  275. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
  276. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/kubernetes/kubernetes_decorator.py +0 -0
  277. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/kubernetes/kubernetes_job.py +0 -0
  278. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/logs_cli.py +0 -0
  279. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/metadata_providers/__init__.py +0 -0
  280. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/metadata_providers/local.py +0 -0
  281. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/metadata_providers/service.py +0 -0
  282. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/package_cli.py +0 -0
  283. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/parallel_decorator.py +0 -0
  284. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/project_decorator.py +0 -0
  285. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/pypi/__init__.py +0 -0
  286. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/pypi/bootstrap.py +0 -0
  287. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/pypi/conda_decorator.py +0 -0
  288. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/pypi/conda_environment.py +0 -0
  289. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/pypi/micromamba.py +0 -0
  290. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/pypi/pip.py +0 -0
  291. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
  292. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  293. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/pypi/utils.py +0 -0
  294. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/resources_decorator.py +0 -0
  295. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/retry_decorator.py +0 -0
  296. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/secrets/__init__.py +0 -0
  297. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  298. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  299. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/storage_executor.py +0 -0
  300. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/tag_cli.py +0 -0
  301. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  302. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/plugins/timeout_decorator.py +0 -0
  303. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/procpoll.py +0 -0
  304. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/py.typed +0 -0
  305. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/pylint_wrapper.py +0 -0
  306. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/runner/__init__.py +0 -0
  307. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/runner/click_api.py +0 -0
  308. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/runner/deployer.py +0 -0
  309. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/runner/deployer_impl.py +0 -0
  310. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/runner/metaflow_runner.py +0 -0
  311. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/runner/nbdeploy.py +0 -0
  312. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/runner/nbrun.py +0 -0
  313. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/runner/subprocess_manager.py +0 -0
  314. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/runner/utils.py +0 -0
  315. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/runtime.py +0 -0
  316. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/sidecar/__init__.py +0 -0
  317. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/sidecar/sidecar.py +0 -0
  318. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/sidecar/sidecar_messages.py +0 -0
  319. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  320. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/sidecar/sidecar_worker.py +0 -0
  321. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/system/__init__.py +0 -0
  322. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/system/system_logger.py +0 -0
  323. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/system/system_monitor.py +0 -0
  324. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/system/system_utils.py +0 -0
  325. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tagging_util.py +0 -0
  326. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/task.py +0 -0
  327. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tracing/__init__.py +0 -0
  328. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tracing/propagator.py +0 -0
  329. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tracing/span_exporter.py +0 -0
  330. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tracing/tracing_modules.py +0 -0
  331. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tuple_util.py +0 -0
  332. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/00-helloworld/README.md +0 -0
  333. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  334. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/01-playlist/README.md +0 -0
  335. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  336. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  337. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  338. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/02-statistics/README.md +0 -0
  339. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  340. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  341. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/02-statistics/stats.py +0 -0
  342. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  343. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  344. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  345. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  346. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  347. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  348. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  349. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  350. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  351. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/07-worldview/README.md +0 -0
  352. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  353. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/08-autopilot/README.md +0 -0
  354. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  355. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/unbounded_foreach.py +0 -0
  356. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/util.py +0 -0
  357. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow/vendor.py +0 -0
  358. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow.egg-info/SOURCES.txt +0 -0
  359. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow.egg-info/dependency_links.txt +0 -0
  360. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow.egg-info/entry_points.txt +0 -0
  361. {metaflow-2.12.29 → metaflow-2.12.31}/metaflow.egg-info/top_level.txt +0 -0
  362. {metaflow-2.12.29 → metaflow-2.12.31}/setup.cfg +0 -0
  363. {metaflow-2.12.29 → metaflow-2.12.31}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: metaflow
3
- Version: 2.12.29
3
+ Version: 2.12.31
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.29; extra == "stubs"
29
+ Requires-Dist: metaflow-stubs==2.12.31; 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
 
@@ -282,31 +282,21 @@ def dump(obj, input_path, private=None, max_value_size=None, include=None, file=
282
282
  else:
283
283
  ds_list = list(datastore_set) # get all tasks
284
284
 
285
- tasks_processed = False
286
285
  for ds in ds_list:
287
- if ds is not None:
288
- tasks_processed = True
289
- echo(
290
- "Dumping output of run_id=*{run_id}* "
291
- "step=*{step}* task_id=*{task_id}*".format(
292
- run_id=ds.run_id, step=ds.step_name, task_id=ds.task_id
293
- ),
294
- fg="magenta",
295
- )
296
-
297
- if file is None:
298
- echo_always(
299
- ds.format(**kwargs),
300
- highlight="green",
301
- highlight_bold=False,
302
- err=False,
303
- )
304
- else:
305
- output[ds.pathspec] = ds.to_dict(**kwargs)
286
+ echo(
287
+ "Dumping output of run_id=*{run_id}* "
288
+ "step=*{step}* task_id=*{task_id}*".format(
289
+ run_id=ds.run_id, step=ds.step_name, task_id=ds.task_id
290
+ ),
291
+ fg="magenta",
292
+ )
306
293
 
307
- if not tasks_processed:
308
- echo(f"No task(s) found for pathspec {input_path}", fg="red")
309
- return
294
+ if file is None:
295
+ echo_always(
296
+ ds.format(**kwargs), highlight="green", highlight_bold=False, err=False
297
+ )
298
+ else:
299
+ output[ds.pathspec] = ds.to_dict(**kwargs)
310
300
 
311
301
  if file is not None:
312
302
  with open(file, "wb") as f:
@@ -151,6 +151,7 @@ class DeployTimeField(object):
151
151
  return self._check_type(val, deploy_time)
152
152
 
153
153
  def _check_type(self, val, deploy_time):
154
+
154
155
  # it is easy to introduce a deploy-time function that accidentally
155
156
  # returns a value whose type is not compatible with what is defined
156
157
  # in Parameter. Let's catch those mistakes early here, instead of
@@ -158,7 +159,7 @@ class DeployTimeField(object):
158
159
 
159
160
  # note: this doesn't work with long in Python2 or types defined as
160
161
  # click types, e.g. click.INT
161
- TYPES = {bool: "bool", int: "int", float: "float", list: "list"}
162
+ TYPES = {bool: "bool", int: "int", float: "float", list: "list", dict: "dict"}
162
163
 
163
164
  msg = (
164
165
  "The value returned by the deploy-time function for "
@@ -166,7 +167,12 @@ class DeployTimeField(object):
166
167
  % (self.parameter_name, self.field)
167
168
  )
168
169
 
169
- if self.parameter_type in TYPES:
170
+ if isinstance(self.parameter_type, list):
171
+ if not any(isinstance(val, x) for x in self.parameter_type):
172
+ msg += "Expected one of the following %s." % TYPES[self.parameter_type]
173
+ raise ParameterFieldTypeMismatch(msg)
174
+ return str(val) if self.return_str else val
175
+ elif self.parameter_type in TYPES:
170
176
  if type(val) != self.parameter_type:
171
177
  msg += "Expected a %s." % TYPES[self.parameter_type]
172
178
  raise ParameterFieldTypeMismatch(msg)
@@ -522,7 +522,9 @@ class ArgoWorkflows(object):
522
522
  params = set(
523
523
  [param.name.lower() for var, param in self.flow._get_parameters()]
524
524
  )
525
- for event in self.flow._flow_decorators.get("trigger")[0].triggers:
525
+ trigger_deco = self.flow._flow_decorators.get("trigger")[0]
526
+ trigger_deco.format_deploytime_value()
527
+ for event in trigger_deco.triggers:
526
528
  parameters = {}
527
529
  # TODO: Add a check to guard against names starting with numerals(?)
528
530
  if not re.match(r"^[A-Za-z0-9_.-]+$", event["name"]):
@@ -562,9 +564,11 @@ class ArgoWorkflows(object):
562
564
 
563
565
  # @trigger_on_finish decorator
564
566
  if self.flow._flow_decorators.get("trigger_on_finish"):
565
- for event in self.flow._flow_decorators.get("trigger_on_finish")[
566
- 0
567
- ].triggers:
567
+ trigger_on_finish_deco = self.flow._flow_decorators.get(
568
+ "trigger_on_finish"
569
+ )[0]
570
+ trigger_on_finish_deco.format_deploytime_value()
571
+ for event in trigger_on_finish_deco.triggers:
568
572
  # Actual filters are deduced here since we don't have access to
569
573
  # the current object in the @trigger_on_finish decorator.
570
574
  triggers.append(
@@ -1,9 +1,11 @@
1
1
  import re
2
+ import json
2
3
 
3
4
  from metaflow import current
4
5
  from metaflow.decorators import FlowDecorator
5
6
  from metaflow.exception import MetaflowException
6
7
  from metaflow.util import is_stringish
8
+ from metaflow.parameters import DeployTimeField, deploy_time_eval
7
9
 
8
10
  # TODO: Support dynamic parameter mapping through a context object that exposes
9
11
  # flow name and user name similar to parameter context
@@ -68,6 +70,75 @@ class TriggerDecorator(FlowDecorator):
68
70
  "options": {},
69
71
  }
70
72
 
73
+ def process_event_name(self, event):
74
+ if is_stringish(event):
75
+ return {"name": str(event)}
76
+ elif isinstance(event, dict):
77
+ if "name" not in event:
78
+ raise MetaflowException(
79
+ "The *event* attribute for *@trigger* is missing the *name* key."
80
+ )
81
+ if callable(event["name"]) and not isinstance(
82
+ event["name"], DeployTimeField
83
+ ):
84
+ event["name"] = DeployTimeField(
85
+ "event_name", str, None, event["name"], False
86
+ )
87
+ event["parameters"] = self.process_parameters(event.get("parameters", {}))
88
+ return event
89
+ elif callable(event) and not isinstance(event, DeployTimeField):
90
+ return DeployTimeField("event", [str, dict], None, event, False)
91
+ else:
92
+ raise MetaflowException(
93
+ "Incorrect format for *event* attribute in *@trigger* decorator. "
94
+ "Supported formats are string and dictionary - \n"
95
+ "@trigger(event='foo') or @trigger(event={'name': 'foo', "
96
+ "'parameters': {'alpha': 'beta'}})"
97
+ )
98
+
99
+ def process_parameters(self, parameters):
100
+ new_param_values = {}
101
+ if isinstance(parameters, (list, tuple)):
102
+ for mapping in parameters:
103
+ if is_stringish(mapping):
104
+ new_param_values[mapping] = mapping
105
+ elif callable(mapping) and not isinstance(mapping, DeployTimeField):
106
+ mapping = DeployTimeField(
107
+ "parameter_val", str, None, mapping, False
108
+ )
109
+ new_param_values[mapping] = mapping
110
+ elif isinstance(mapping, (list, tuple)) and len(mapping) == 2:
111
+ if callable(mapping[0]) and not isinstance(
112
+ mapping[0], DeployTimeField
113
+ ):
114
+ mapping[0] = DeployTimeField(
115
+ "parameter_val", str, None, mapping[0], False
116
+ )
117
+ if callable(mapping[1]) and not isinstance(
118
+ mapping[1], DeployTimeField
119
+ ):
120
+ mapping[1] = DeployTimeField(
121
+ "parameter_val", str, None, mapping[1], False
122
+ )
123
+ new_param_values[mapping[0]] = mapping[1]
124
+ else:
125
+ raise MetaflowException(
126
+ "The *parameters* attribute for event is invalid. "
127
+ "It should be a list/tuple of strings and lists/tuples of size 2"
128
+ )
129
+ elif callable(parameters) and not isinstance(parameters, DeployTimeField):
130
+ return DeployTimeField(
131
+ "parameters", [list, dict, tuple], None, parameters, False
132
+ )
133
+ elif isinstance(parameters, dict):
134
+ for key, value in parameters.items():
135
+ if callable(key) and not isinstance(key, DeployTimeField):
136
+ key = DeployTimeField("flow_parameter", str, None, key, False)
137
+ if callable(value) and not isinstance(value, DeployTimeField):
138
+ value = DeployTimeField("signal_parameter", str, None, value, False)
139
+ new_param_values[key] = value
140
+ return new_param_values
141
+
71
142
  def flow_init(
72
143
  self,
73
144
  flow_name,
@@ -86,41 +157,9 @@ class TriggerDecorator(FlowDecorator):
86
157
  "attributes in *@trigger* decorator."
87
158
  )
88
159
  elif self.attributes["event"]:
89
- # event attribute supports the following formats -
90
- # 1. event='table.prod_db.members'
91
- # 2. event={'name': 'table.prod_db.members',
92
- # 'parameters': {'alpha': 'member_weight'}}
93
- if is_stringish(self.attributes["event"]):
94
- self.triggers.append({"name": str(self.attributes["event"])})
95
- elif isinstance(self.attributes["event"], dict):
96
- if "name" not in self.attributes["event"]:
97
- raise MetaflowException(
98
- "The *event* attribute for *@trigger* is missing the "
99
- "*name* key."
100
- )
101
- param_value = self.attributes["event"].get("parameters", {})
102
- if isinstance(param_value, (list, tuple)):
103
- new_param_value = {}
104
- for mapping in param_value:
105
- if is_stringish(mapping):
106
- new_param_value[mapping] = mapping
107
- elif isinstance(mapping, (list, tuple)) and len(mapping) == 2:
108
- new_param_value[mapping[0]] = mapping[1]
109
- else:
110
- raise MetaflowException(
111
- "The *parameters* attribute for event '%s' is invalid. "
112
- "It should be a list/tuple of strings and lists/tuples "
113
- "of size 2" % self.attributes["event"]["name"]
114
- )
115
- self.attributes["event"]["parameters"] = new_param_value
116
- self.triggers.append(self.attributes["event"])
117
- else:
118
- raise MetaflowException(
119
- "Incorrect format for *event* attribute in *@trigger* decorator. "
120
- "Supported formats are string and dictionary - \n"
121
- "@trigger(event='foo') or @trigger(event={'name': 'foo', "
122
- "'parameters': {'alpha': 'beta'}})"
123
- )
160
+ event = self.attributes["event"]
161
+ processed_event = self.process_event_name(event)
162
+ self.triggers.append(processed_event)
124
163
  elif self.attributes["events"]:
125
164
  # events attribute supports the following formats -
126
165
  # 1. events=[{'name': 'table.prod_db.members',
@@ -128,43 +167,17 @@ class TriggerDecorator(FlowDecorator):
128
167
  # {'name': 'table.prod_db.metadata',
129
168
  # 'parameters': {'beta': 'grade'}}]
130
169
  if isinstance(self.attributes["events"], list):
170
+ # process every event in events
131
171
  for event in self.attributes["events"]:
132
- if is_stringish(event):
133
- self.triggers.append({"name": str(event)})
134
- elif isinstance(event, dict):
135
- if "name" not in event:
136
- raise MetaflowException(
137
- "One or more events in *events* attribute for "
138
- "*@trigger* are missing the *name* key."
139
- )
140
- param_value = event.get("parameters", {})
141
- if isinstance(param_value, (list, tuple)):
142
- new_param_value = {}
143
- for mapping in param_value:
144
- if is_stringish(mapping):
145
- new_param_value[mapping] = mapping
146
- elif (
147
- isinstance(mapping, (list, tuple))
148
- and len(mapping) == 2
149
- ):
150
- new_param_value[mapping[0]] = mapping[1]
151
- else:
152
- raise MetaflowException(
153
- "The *parameters* attribute for event '%s' is "
154
- "invalid. It should be a list/tuple of strings "
155
- "and lists/tuples of size 2" % event["name"]
156
- )
157
- event["parameters"] = new_param_value
158
- self.triggers.append(event)
159
- else:
160
- raise MetaflowException(
161
- "One or more events in *events* attribute in *@trigger* "
162
- "decorator have an incorrect format. Supported format "
163
- "is dictionary - \n"
164
- "@trigger(events=[{'name': 'foo', 'parameters': {'alpha': "
165
- "'beta'}}, {'name': 'bar', 'parameters': "
166
- "{'gamma': 'kappa'}}])"
167
- )
172
+ processed_event = self.process_event_name(event)
173
+ self.triggers.append("processed event", processed_event)
174
+ elif callable(self.attributes["events"]) and not isinstance(
175
+ self.attributes["events"], DeployTimeField
176
+ ):
177
+ trig = DeployTimeField(
178
+ "events", list, None, self.attributes["events"], False
179
+ )
180
+ self.triggers.append(trig)
168
181
  else:
169
182
  raise MetaflowException(
170
183
  "Incorrect format for *events* attribute in *@trigger* decorator. "
@@ -178,7 +191,12 @@ class TriggerDecorator(FlowDecorator):
178
191
  raise MetaflowException("No event(s) specified in *@trigger* decorator.")
179
192
 
180
193
  # same event shouldn't occur more than once
181
- names = [x["name"] for x in self.triggers]
194
+ names = [
195
+ x["name"]
196
+ for x in self.triggers
197
+ if not isinstance(x, DeployTimeField)
198
+ and not isinstance(x["name"], DeployTimeField)
199
+ ]
182
200
  if len(names) != len(set(names)):
183
201
  raise MetaflowException(
184
202
  "Duplicate event names defined in *@trigger* decorator."
@@ -188,6 +206,104 @@ class TriggerDecorator(FlowDecorator):
188
206
 
189
207
  # TODO: Handle scenario for local testing using --trigger.
190
208
 
209
+ def format_deploytime_value(self):
210
+ new_triggers = []
211
+ for trigger in self.triggers:
212
+ # Case where trigger is a function that returns a list of events
213
+ # Need to do this bc we need to iterate over list later
214
+ if isinstance(trigger, DeployTimeField):
215
+ evaluated_trigger = deploy_time_eval(trigger)
216
+ if isinstance(evaluated_trigger, dict):
217
+ trigger = evaluated_trigger
218
+ elif isinstance(evaluated_trigger, str):
219
+ trigger = {"name": evaluated_trigger}
220
+ if isinstance(evaluated_trigger, list):
221
+ for trig in evaluated_trigger:
222
+ if is_stringish(trig):
223
+ new_triggers.append({"name": trig})
224
+ else: # dict or another deploytimefield
225
+ new_triggers.append(trig)
226
+ else:
227
+ new_triggers.append(trigger)
228
+ else:
229
+ new_triggers.append(trigger)
230
+
231
+ self.triggers = new_triggers
232
+ for trigger in self.triggers:
233
+ old_trigger = trigger
234
+ trigger_params = trigger.get("parameters", {})
235
+ # Case where param is a function (can return list or dict)
236
+ if isinstance(trigger_params, DeployTimeField):
237
+ trigger_params = deploy_time_eval(trigger_params)
238
+ # If params is a list of strings, convert to dict with same key and value
239
+ if isinstance(trigger_params, (list, tuple)):
240
+ new_trigger_params = {}
241
+ for mapping in trigger_params:
242
+ if is_stringish(mapping) or callable(mapping):
243
+ new_trigger_params[mapping] = mapping
244
+ elif callable(mapping) and not isinstance(mapping, DeployTimeField):
245
+ mapping = DeployTimeField(
246
+ "parameter_val", str, None, mapping, False
247
+ )
248
+ new_trigger_params[mapping] = mapping
249
+ elif isinstance(mapping, (list, tuple)) and len(mapping) == 2:
250
+ if callable(mapping[0]) and not isinstance(
251
+ mapping[0], DeployTimeField
252
+ ):
253
+ mapping[0] = DeployTimeField(
254
+ "parameter_val",
255
+ str,
256
+ None,
257
+ mapping[1],
258
+ False,
259
+ )
260
+ if callable(mapping[1]) and not isinstance(
261
+ mapping[1], DeployTimeField
262
+ ):
263
+ mapping[1] = DeployTimeField(
264
+ "parameter_val",
265
+ str,
266
+ None,
267
+ mapping[1],
268
+ False,
269
+ )
270
+
271
+ new_trigger_params[mapping[0]] = mapping[1]
272
+ else:
273
+ raise MetaflowException(
274
+ "The *parameters* attribute for event '%s' is invalid. "
275
+ "It should be a list/tuple of strings and lists/tuples "
276
+ "of size 2" % self.attributes["event"]["name"]
277
+ )
278
+ trigger_params = new_trigger_params
279
+ trigger["parameters"] = trigger_params
280
+
281
+ trigger_name = trigger.get("name")
282
+ # Case where just the name is a function (always a str)
283
+ if isinstance(trigger_name, DeployTimeField):
284
+ trigger_name = deploy_time_eval(trigger_name)
285
+ trigger["name"] = trigger_name
286
+
287
+ # Third layer
288
+ # {name:, parameters:[func, ..., ...]}
289
+ # {name:, parameters:{func : func2}}
290
+ for trigger in self.triggers:
291
+ old_trigger = trigger
292
+ trigger_params = trigger.get("parameters", {})
293
+ new_trigger_params = {}
294
+ for key, value in trigger_params.items():
295
+ if isinstance(value, DeployTimeField) and key is value:
296
+ evaluated_param = deploy_time_eval(value)
297
+ new_trigger_params[evaluated_param] = evaluated_param
298
+ elif isinstance(value, DeployTimeField):
299
+ new_trigger_params[key] = deploy_time_eval(value)
300
+ elif isinstance(key, DeployTimeField):
301
+ new_trigger_params[deploy_time_eval(key)] = value
302
+ else:
303
+ new_trigger_params[key] = value
304
+ trigger["parameters"] = new_trigger_params
305
+ self.triggers[self.triggers.index(old_trigger)] = trigger
306
+
191
307
 
192
308
  class TriggerOnFinishDecorator(FlowDecorator):
193
309
  """
@@ -312,6 +428,13 @@ class TriggerOnFinishDecorator(FlowDecorator):
312
428
  "The *project_branch* attribute of the *flow* is not a string"
313
429
  )
314
430
  self.triggers.append(result)
431
+ elif callable(self.attributes["flow"]) and not isinstance(
432
+ self.attributes["flow"], DeployTimeField
433
+ ):
434
+ trig = DeployTimeField(
435
+ "fq_name", [str, dict], None, self.attributes["flow"], False
436
+ )
437
+ self.triggers.append(trig)
315
438
  else:
316
439
  raise MetaflowException(
317
440
  "Incorrect type for *flow* attribute in *@trigger_on_finish* "
@@ -369,6 +492,13 @@ class TriggerOnFinishDecorator(FlowDecorator):
369
492
  "Supported type is string or Dict[str, str]- \n"
370
493
  "@trigger_on_finish(flows=['FooFlow', 'BarFlow']"
371
494
  )
495
+ elif callable(self.attributes["flows"]) and not isinstance(
496
+ self.attributes["flows"], DeployTimeField
497
+ ):
498
+ trig = DeployTimeField(
499
+ "flows", list, None, self.attributes["flows"], False
500
+ )
501
+ self.triggers.append(trig)
372
502
  else:
373
503
  raise MetaflowException(
374
504
  "Incorrect type for *flows* attribute in *@trigger_on_finish* "
@@ -383,6 +513,8 @@ class TriggerOnFinishDecorator(FlowDecorator):
383
513
 
384
514
  # Make triggers @project aware
385
515
  for trigger in self.triggers:
516
+ if isinstance(trigger, DeployTimeField):
517
+ continue
386
518
  if trigger["fq_name"].count(".") == 0:
387
519
  # fully qualified name is just the flow name
388
520
  trigger["flow"] = trigger["fq_name"]
@@ -427,5 +559,54 @@ class TriggerOnFinishDecorator(FlowDecorator):
427
559
  run_objs.append(run_obj)
428
560
  current._update_env({"trigger": Trigger.from_runs(run_objs)})
429
561
 
562
+ def _parse_fq_name(self, trigger):
563
+ if isinstance(trigger, DeployTimeField):
564
+ trigger["fq_name"] = deploy_time_eval(trigger["fq_name"])
565
+ if trigger["fq_name"].count(".") == 0:
566
+ # fully qualified name is just the flow name
567
+ trigger["flow"] = trigger["fq_name"]
568
+ elif trigger["fq_name"].count(".") >= 2:
569
+ # fully qualified name is of the format - project.branch.flow_name
570
+ trigger["project"], tail = trigger["fq_name"].split(".", maxsplit=1)
571
+ trigger["branch"], trigger["flow"] = tail.rsplit(".", maxsplit=1)
572
+ else:
573
+ raise MetaflowException(
574
+ "Incorrect format for *flow* in *@trigger_on_finish* "
575
+ "decorator. Specify either just the *flow_name* or a fully "
576
+ "qualified name like *project_name.branch_name.flow_name*."
577
+ )
578
+ if not re.match(r"^[A-Za-z0-9_]+$", trigger["flow"]):
579
+ raise MetaflowException(
580
+ "Invalid flow name *%s* in *@trigger_on_finish* "
581
+ "decorator. Only alphanumeric characters and "
582
+ "underscores(_) are allowed." % trigger["flow"]
583
+ )
584
+ return trigger
585
+
586
+ def format_deploytime_value(self):
587
+ for trigger in self.triggers:
588
+ # Case were trigger is a function that returns a list
589
+ # Need to do this bc we need to iterate over list and process
590
+ if isinstance(trigger, DeployTimeField):
591
+ deploy_value = deploy_time_eval(trigger)
592
+ if isinstance(deploy_value, list):
593
+ self.triggers = deploy_value
594
+ else:
595
+ break
596
+ for trigger in self.triggers:
597
+ # Entire trigger is a function (returns either string or dict)
598
+ old_trig = trigger
599
+ if isinstance(trigger, DeployTimeField):
600
+ trigger = deploy_time_eval(trigger)
601
+ if isinstance(trigger, dict):
602
+ trigger["fq_name"] = trigger.get("name")
603
+ trigger["project"] = trigger.get("project")
604
+ trigger["branch"] = trigger.get("project_branch")
605
+ # We also added this bc it won't be formatted yet
606
+ if isinstance(trigger, str):
607
+ trigger = {"fq_name": trigger}
608
+ trigger = self._parse_fq_name(trigger)
609
+ self.triggers[self.triggers.index(old_trig)] = trigger
610
+
430
611
  def get_top_level_options(self):
431
612
  return list(self._option_values.items())
@@ -4,7 +4,6 @@ import math
4
4
  import random
5
5
  import time
6
6
  from collections import namedtuple
7
-
8
7
  from metaflow.exception import MetaflowException
9
8
  from metaflow.metaflow_config import KUBERNETES_JOBSET_GROUP, KUBERNETES_JOBSET_VERSION
10
9
  from metaflow.tracing import inject_tracing_vars
@@ -320,33 +319,49 @@ class RunningJobSet(object):
320
319
  def kill(self):
321
320
  plural = "jobsets"
322
321
  client = self._client.get()
323
- # Get the jobset
324
- with client.ApiClient() as api_client:
325
- api_instance = client.CustomObjectsApi(api_client)
326
- try:
327
- obj = api_instance.get_namespaced_custom_object(
328
- group=self._group,
329
- version=self._version,
330
- namespace=self._namespace,
331
- plural=plural,
332
- name=self._name,
333
- )
334
-
335
- # Suspend the jobset
336
- obj["spec"]["suspend"] = True
337
-
338
- api_instance.replace_namespaced_custom_object(
339
- group=self._group,
340
- version=self._version,
341
- namespace=self._namespace,
342
- plural=plural,
343
- name=obj["metadata"]["name"],
344
- body=obj,
345
- )
346
- except Exception as e:
347
- raise KubernetesJobsetException(
348
- "Exception when suspending existing jobset: %s\n" % e
349
- )
322
+ try:
323
+ # Killing the control pod will trigger the jobset to mark everything as failed.
324
+ # Since jobsets have a successPolicy set to `All` which ensures that everything has
325
+ # to succeed for the jobset to succeed.
326
+ from kubernetes.stream import stream
327
+
328
+ control_pod = self._fetch_pod()
329
+ stream(
330
+ client.CoreV1Api().connect_get_namespaced_pod_exec,
331
+ name=control_pod["metadata"]["name"],
332
+ namespace=control_pod["metadata"]["namespace"],
333
+ command=[
334
+ "/bin/sh",
335
+ "-c",
336
+ "/sbin/killall5",
337
+ ],
338
+ stderr=True,
339
+ stdin=False,
340
+ stdout=True,
341
+ tty=False,
342
+ )
343
+ except Exception as e:
344
+ with client.ApiClient() as api_client:
345
+ # If we are unable to kill the control pod then
346
+ # Delete the jobset to kill the subsequent pods.
347
+ # There are a few reasons for deleting a jobset to kill it :
348
+ # 1. Jobset has a `suspend` attribute to suspend it's execution, but this
349
+ # doesn't play nicely when jobsets are deployed with other components like kueue.
350
+ # 2. Jobset doesn't play nicely when we mutate status
351
+ # 3. Deletion is a gaurenteed way of removing any pods.
352
+ api_instance = client.CustomObjectsApi(api_client)
353
+ try:
354
+ api_instance.delete_namespaced_custom_object(
355
+ group=self._group,
356
+ version=self._version,
357
+ namespace=self._namespace,
358
+ plural=plural,
359
+ name=self._name,
360
+ )
361
+ except Exception as e:
362
+ raise KubernetesJobsetException(
363
+ "Exception when deleting existing jobset: %s\n" % e
364
+ )
350
365
 
351
366
  @property
352
367
  def id(self):
@@ -0,0 +1 @@
1
+ metaflow_version = "2.12.31"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: metaflow
3
- Version: 2.12.29
3
+ Version: 2.12.31
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.29; extra == "stubs"
29
+ Requires-Dist: metaflow-stubs==2.12.31; 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
 
@@ -2,4 +2,4 @@ requests
2
2
  boto3
3
3
 
4
4
  [stubs]
5
- metaflow-stubs==2.12.29
5
+ metaflow-stubs==2.12.31
@@ -1 +0,0 @@
1
- metaflow_version = "2.12.29"
File without changes
File without changes
File without changes
File without changes