metaflow 2.13.6__tar.gz → 2.13.8__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.6/metaflow.egg-info → metaflow-2.13.8}/PKG-INFO +2 -2
  2. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/decorators.py +6 -2
  3. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/flowspec.py +33 -1
  4. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metaflow_config.py +3 -0
  5. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/parameters.py +1 -1
  6. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/kubernetes_decorator.py +4 -4
  7. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/bootstrap.py +91 -6
  8. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/micromamba.py +16 -9
  9. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/click_api.py +52 -26
  10. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/deployer_impl.py +14 -5
  11. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/metaflow_runner.py +14 -5
  12. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/user_configs/config_options.py +7 -4
  13. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/user_configs/config_parameters.py +7 -7
  14. metaflow-2.13.8/metaflow/version.py +1 -0
  15. {metaflow-2.13.6 → metaflow-2.13.8/metaflow.egg-info}/PKG-INFO +2 -2
  16. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow.egg-info/requires.txt +1 -1
  17. metaflow-2.13.6/metaflow/version.py +0 -1
  18. {metaflow-2.13.6 → metaflow-2.13.8}/LICENSE +0 -0
  19. {metaflow-2.13.6 → metaflow-2.13.8}/MANIFEST.in +0 -0
  20. {metaflow-2.13.6 → metaflow-2.13.8}/README.md +0 -0
  21. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/R.py +0 -0
  22. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/__init__.py +0 -0
  23. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/__init__.py +0 -0
  24. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/__init__.py +0 -0
  25. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  26. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/_compat.py +0 -0
  27. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/_termui_impl.py +0 -0
  28. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/_textwrap.py +0 -0
  29. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/_unicodefun.py +0 -0
  30. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/_winconsole.py +0 -0
  31. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/core.py +0 -0
  32. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/decorators.py +0 -0
  33. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/exceptions.py +0 -0
  34. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/formatting.py +0 -0
  35. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/globals.py +0 -0
  36. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/parser.py +0 -0
  37. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/termui.py +0 -0
  38. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/testing.py +0 -0
  39. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/types.py +0 -0
  40. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/click/utils.py +0 -0
  41. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
  42. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
  43. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
  44. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
  45. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
  46. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
  47. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
  48. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
  49. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
  50. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/__init__.py +0 -0
  51. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/_elffile.py +0 -0
  52. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  53. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  54. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/_parser.py +0 -0
  55. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/_structures.py +0 -0
  56. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  57. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/markers.py +0 -0
  58. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/py.typed +0 -0
  59. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/requirements.py +0 -0
  60. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/specifiers.py +0 -0
  61. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/tags.py +0 -0
  62. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/utils.py +0 -0
  63. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/packaging/version.py +0 -0
  64. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/__init__.py +0 -0
  65. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_checkers.py +0 -0
  66. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_config.py +0 -0
  67. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_decorators.py +0 -0
  68. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
  69. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_functions.py +0 -0
  70. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_importhook.py +0 -0
  71. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_memo.py +0 -0
  72. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
  73. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_suppression.py +0 -0
  74. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_transformer.py +0 -0
  75. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
  76. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/_utils.py +0 -0
  77. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typeguard/py.typed +0 -0
  78. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/typing_extensions.py +0 -0
  79. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_5/__init__.py +0 -0
  80. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
  81. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
  82. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_5/zipp.py +0 -0
  83. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/__init__.py +0 -0
  84. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  85. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  86. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  87. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  88. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  89. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  90. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  91. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  92. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  93. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  94. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/v3_6/zipp.py +0 -0
  95. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/_vendor/zipp.py +0 -0
  96. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cards.py +0 -0
  97. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cli.py +0 -0
  98. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cli_args.py +0 -0
  99. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cli_components/__init__.py +0 -0
  100. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cli_components/dump_cmd.py +0 -0
  101. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cli_components/init_cmd.py +0 -0
  102. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cli_components/run_cmds.py +0 -0
  103. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cli_components/step_cmd.py +0 -0
  104. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cli_components/utils.py +0 -0
  105. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/client/__init__.py +0 -0
  106. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/client/core.py +0 -0
  107. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/client/filecache.py +0 -0
  108. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/clone_util.py +0 -0
  109. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd/__init__.py +0 -0
  110. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd/configure_cmd.py +0 -0
  111. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd/develop/__init__.py +0 -0
  112. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd/develop/stub_generator.py +0 -0
  113. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd/develop/stubs.py +0 -0
  114. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd/main_cli.py +0 -0
  115. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd/tutorials_cmd.py +0 -0
  116. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd/util.py +0 -0
  117. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/cmd_with_io.py +0 -0
  118. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/datastore/__init__.py +0 -0
  119. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/datastore/content_addressed_store.py +0 -0
  120. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/datastore/datastore_set.py +0 -0
  121. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/datastore/datastore_storage.py +0 -0
  122. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/datastore/exceptions.py +0 -0
  123. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/datastore/flow_datastore.py +0 -0
  124. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/datastore/inputs.py +0 -0
  125. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/datastore/task_datastore.py +0 -0
  126. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/debug.py +0 -0
  127. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/event_logger.py +0 -0
  128. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/events.py +0 -0
  129. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/exception.py +0 -0
  130. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/extension_support/__init__.py +0 -0
  131. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/extension_support/_empty_file.py +0 -0
  132. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/extension_support/cmd.py +0 -0
  133. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/extension_support/integrations.py +0 -0
  134. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/extension_support/plugins.py +0 -0
  135. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/graph.py +0 -0
  136. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/includefile.py +0 -0
  137. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/info_file.py +0 -0
  138. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/integrations.py +0 -0
  139. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/lint.py +0 -0
  140. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metadata_provider/__init__.py +0 -0
  141. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metadata_provider/heartbeat.py +0 -0
  142. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metadata_provider/metadata.py +0 -0
  143. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metadata_provider/util.py +0 -0
  144. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metaflow_config_funcs.py +0 -0
  145. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metaflow_current.py +0 -0
  146. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metaflow_environment.py +0 -0
  147. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metaflow_profile.py +0 -0
  148. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/metaflow_version.py +0 -0
  149. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/mflog/__init__.py +0 -0
  150. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/mflog/mflog.py +0 -0
  151. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/mflog/save_logs.py +0 -0
  152. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/mflog/save_logs_periodically.py +0 -0
  153. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/mflog/tee.py +0 -0
  154. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/monitor.py +0 -0
  155. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/multicore_utils.py +0 -0
  156. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/package.py +0 -0
  157. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/__init__.py +0 -0
  158. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/__init__.py +0 -0
  159. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/airflow.py +0 -0
  160. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  161. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  162. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  163. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/dag.py +0 -0
  164. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/exception.py +0 -0
  165. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  166. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  167. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  168. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
  169. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
  170. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
  171. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/__init__.py +0 -0
  172. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/argo_client.py +0 -0
  173. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/argo_events.py +0 -0
  174. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/argo_workflows.py +0 -0
  175. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/argo_workflows_cli.py +0 -0
  176. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  177. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
  178. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/argo_workflows_deployer_objects.py +0 -0
  179. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/capture_error.py +0 -0
  180. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/generate_input_paths.py +0 -0
  181. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
  182. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/__init__.py +0 -0
  183. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/aws_client.py +0 -0
  184. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/aws_utils.py +0 -0
  185. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/batch/__init__.py +0 -0
  186. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/batch/batch.py +0 -0
  187. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  188. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  189. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
  190. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  191. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  192. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  193. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  194. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  195. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  196. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  197. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  198. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
  199. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
  200. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  201. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  202. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
  203. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +0 -0
  204. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/azure/__init__.py +0 -0
  205. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/azure/azure_credential.py +0 -0
  206. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  207. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
  208. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/azure/azure_tail.py +0 -0
  209. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/azure/azure_utils.py +0 -0
  210. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  211. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/azure/includefile_support.py +0 -0
  212. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/__init__.py +0 -0
  213. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_cli.py +0 -0
  214. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_client.py +0 -0
  215. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_creator.py +0 -0
  216. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_datastore.py +0 -0
  217. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_decorator.py +0 -0
  218. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  219. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/base.html +0 -0
  220. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/basic.py +0 -0
  221. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
  222. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/card.py +0 -0
  223. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  224. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  225. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  226. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  227. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  228. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/components.py +0 -0
  229. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  230. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/main.js +0 -0
  231. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  232. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  233. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_resolver.py +0 -0
  234. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_server.py +0 -0
  235. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
  236. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/component_serializer.py +0 -0
  237. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/cards/exception.py +0 -0
  238. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/catch_decorator.py +0 -0
  239. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datastores/__init__.py +0 -0
  240. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datastores/azure_storage.py +0 -0
  241. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datastores/gs_storage.py +0 -0
  242. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datastores/local_storage.py +0 -0
  243. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datastores/s3_storage.py +0 -0
  244. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datatools/__init__.py +0 -0
  245. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datatools/local.py +0 -0
  246. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  247. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datatools/s3/s3.py +0 -0
  248. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datatools/s3/s3op.py +0 -0
  249. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  250. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  251. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/debug_logger.py +0 -0
  252. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/debug_monitor.py +0 -0
  253. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/__init__.py +0 -0
  254. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/client.py +0 -0
  255. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/client_modules.py +0 -0
  256. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  257. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  258. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  259. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  260. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  261. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  262. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  263. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  264. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  265. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  266. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/consts.py +0 -0
  267. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  268. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  269. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  270. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/server.py +0 -0
  271. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/stub.py +0 -0
  272. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/env_escape/utils.py +0 -0
  273. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/environment_decorator.py +0 -0
  274. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/events_decorator.py +0 -0
  275. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/frameworks/__init__.py +0 -0
  276. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/frameworks/pytorch.py +0 -0
  277. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/gcp/__init__.py +0 -0
  278. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
  279. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  280. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  281. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/gcp/gs_tail.py +0 -0
  282. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/gcp/gs_utils.py +0 -0
  283. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/gcp/includefile_support.py +0 -0
  284. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/__init__.py +0 -0
  285. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
  286. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/kubernetes.py +0 -0
  287. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/kubernetes_cli.py +0 -0
  288. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
  289. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/kubernetes_job.py +0 -0
  290. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +0 -0
  291. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/spot_metadata_cli.py +0 -0
  292. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/kubernetes/spot_monitor_sidecar.py +0 -0
  293. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/logs_cli.py +0 -0
  294. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/metadata_providers/__init__.py +0 -0
  295. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/metadata_providers/local.py +0 -0
  296. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/metadata_providers/service.py +0 -0
  297. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/package_cli.py +0 -0
  298. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/parallel_decorator.py +0 -0
  299. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/project_decorator.py +0 -0
  300. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/__init__.py +0 -0
  301. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/conda_decorator.py +0 -0
  302. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/conda_environment.py +0 -0
  303. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/pip.py +0 -0
  304. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
  305. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  306. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/pypi/utils.py +0 -0
  307. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/resources_decorator.py +0 -0
  308. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/retry_decorator.py +0 -0
  309. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/secrets/__init__.py +0 -0
  310. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  311. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  312. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/storage_executor.py +0 -0
  313. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/tag_cli.py +0 -0
  314. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  315. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/plugins/timeout_decorator.py +0 -0
  316. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/procpoll.py +0 -0
  317. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/py.typed +0 -0
  318. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/pylint_wrapper.py +0 -0
  319. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/__init__.py +0 -0
  320. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/deployer.py +0 -0
  321. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/nbdeploy.py +0 -0
  322. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/nbrun.py +0 -0
  323. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/subprocess_manager.py +0 -0
  324. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runner/utils.py +0 -0
  325. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/runtime.py +0 -0
  326. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/sidecar/__init__.py +0 -0
  327. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/sidecar/sidecar.py +0 -0
  328. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/sidecar/sidecar_messages.py +0 -0
  329. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  330. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/sidecar/sidecar_worker.py +0 -0
  331. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/system/__init__.py +0 -0
  332. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/system/system_logger.py +0 -0
  333. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/system/system_monitor.py +0 -0
  334. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/system/system_utils.py +0 -0
  335. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tagging_util.py +0 -0
  336. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/task.py +0 -0
  337. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tracing/__init__.py +0 -0
  338. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tracing/propagator.py +0 -0
  339. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tracing/span_exporter.py +0 -0
  340. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tracing/tracing_modules.py +0 -0
  341. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tuple_util.py +0 -0
  342. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/00-helloworld/README.md +0 -0
  343. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  344. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/01-playlist/README.md +0 -0
  345. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  346. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  347. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  348. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/02-statistics/README.md +0 -0
  349. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  350. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  351. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/02-statistics/stats.py +0 -0
  352. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  353. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  354. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  355. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  356. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  357. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  358. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  359. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  360. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  361. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/07-worldview/README.md +0 -0
  362. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  363. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/08-autopilot/README.md +0 -0
  364. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  365. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/unbounded_foreach.py +0 -0
  366. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/user_configs/__init__.py +0 -0
  367. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/user_configs/config_decorators.py +0 -0
  368. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/util.py +0 -0
  369. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow/vendor.py +0 -0
  370. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow.egg-info/SOURCES.txt +0 -0
  371. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow.egg-info/dependency_links.txt +0 -0
  372. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow.egg-info/entry_points.txt +0 -0
  373. {metaflow-2.13.6 → metaflow-2.13.8}/metaflow.egg-info/top_level.txt +0 -0
  374. {metaflow-2.13.6 → metaflow-2.13.8}/setup.cfg +0 -0
  375. {metaflow-2.13.6 → metaflow-2.13.8}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: metaflow
3
- Version: 2.13.6
3
+ Version: 2.13.8
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.6; extra == "stubs"
29
+ Requires-Dist: metaflow-stubs==2.13.8; extra == "stubs"
30
30
  Dynamic: author
31
31
  Dynamic: author-email
32
32
  Dynamic: classifier
@@ -591,9 +591,13 @@ def _init_flow_decorators(
591
591
  )
592
592
  else:
593
593
  # Each "non-multiple" flow decorator is only allowed to have one set of options
594
+ # Note that there may be no deco_options if a MutableFlow config injected
595
+ # the decorator.
594
596
  deco_flow_init_options = {
595
- option: deco_options[option.replace("-", "_")]
596
- for option in deco.options
597
+ option: deco_options.get(
598
+ option.replace("-", "_"), option_info["default"]
599
+ )
600
+ for option, option_info in deco.options.items()
597
601
  }
598
602
  for deco in decorators:
599
603
  deco.flow_init(
@@ -86,6 +86,11 @@ class FlowSpecMeta(type):
86
86
  super().__init__(name, bases, attrs)
87
87
  if name == "FlowSpec":
88
88
  return
89
+
90
+ from .decorators import (
91
+ DuplicateFlowDecoratorException,
92
+ ) # Prevent circular import
93
+
89
94
  # We store some state in the flow class itself. This is primarily used to
90
95
  # attach global state to a flow. It is *not* an actual global because of
91
96
  # Runner/NBRunner. This is also created here in the meta class to avoid it being
@@ -98,6 +103,31 @@ class FlowSpecMeta(type):
98
103
  # Keys are _FlowState enum values
99
104
  cls._flow_state = {}
100
105
 
106
+ # We inherit stuff from our parent classes as well -- we need to be careful
107
+ # in terms of the order; we will follow the MRO with the following rules:
108
+ # - decorators (cls._flow_decorators) will cause an error if they do not
109
+ # support multiple and we see multiple instances of the same
110
+ # - config decorators will be joined
111
+ # - configs will be added later directly by the class; base class configs will
112
+ # be taken into account as they would be inherited.
113
+
114
+ # We only need to do this for the base classes since the current class will
115
+ # get updated as decorators are parsed.
116
+ for base in cls.__mro__:
117
+ if base != cls and base != FlowSpec and issubclass(base, FlowSpec):
118
+ # Take care of decorators
119
+ for deco_name, deco in base._flow_decorators.items():
120
+ if deco_name in cls._flow_decorators and not deco.allow_multiple:
121
+ raise DuplicateFlowDecoratorException(deco_name)
122
+ cls._flow_decorators.setdefault(deco_name, []).extend(deco)
123
+
124
+ # Take care of configs and config decorators
125
+ base_configs = base._flow_state.get(_FlowState.CONFIG_DECORATORS)
126
+ if base_configs:
127
+ cls._flow_state.setdefault(_FlowState.CONFIG_DECORATORS, []).extend(
128
+ base_configs
129
+ )
130
+
101
131
  cls._init_attrs()
102
132
 
103
133
  def _init_attrs(cls):
@@ -196,7 +226,9 @@ class FlowSpec(metaclass=FlowSpecMeta):
196
226
  def _process_config_decorators(cls, config_options, ignore_errors=False):
197
227
 
198
228
  # Fast path for no user configurations
199
- if not cls._flow_state.get(_FlowState.CONFIG_DECORATORS):
229
+ if not cls._flow_state.get(_FlowState.CONFIG_DECORATORS) and all(
230
+ len(step.config_decorators) == 0 for step in cls._steps
231
+ ):
200
232
  # Process parameters to allow them to also use config values easily
201
233
  for var, param in cls._get_parameters():
202
234
  if param.IS_CONFIG_PARAMETER:
@@ -433,6 +433,9 @@ CONDA_PACKAGE_GSROOT = from_conf("CONDA_PACKAGE_GSROOT")
433
433
  # should result in an appreciable speedup in flow environment initialization.
434
434
  CONDA_DEPENDENCY_RESOLVER = from_conf("CONDA_DEPENDENCY_RESOLVER", "conda")
435
435
 
436
+ # Default to not using fast init binary.
437
+ CONDA_USE_FAST_INIT = from_conf("CONDA_USE_FAST_INIT", False)
438
+
436
439
  ###
437
440
  # Escape hatch configuration
438
441
  ###
@@ -316,7 +316,7 @@ class Parameter(object):
316
316
  help : str, optional, default None
317
317
  Help text to show in `run --help`.
318
318
  required : bool, optional, default None
319
- Require that the user specified a value for the parameter. Note that if
319
+ Require that the user specifies a value for the parameter. Note that if
320
320
  a default is provide, the required flag is ignored.
321
321
  A value of None is equivalent to False.
322
322
  show_default : bool, optional, default None
@@ -600,10 +600,10 @@ class KubernetesDecorator(StepDecorator):
600
600
  # local file system after the user code has finished execution.
601
601
  # This happens via datastore as a communication bridge.
602
602
 
603
- # TODO: There is no guarantee that task_prestep executes before
604
- # task_finished is invoked. That will result in AttributeError:
605
- # 'KubernetesDecorator' object has no attribute 'metadata' error.
606
- if self.metadata.TYPE == "local":
603
+ # TODO: There is no guarantee that task_pre_step executes before
604
+ # task_finished is invoked.
605
+ # For now we guard against the missing metadata object in this case.
606
+ if hasattr(self, "metadata") and self.metadata.TYPE == "local":
607
607
  # Note that the datastore is *always* Amazon S3 (see
608
608
  # runtime_task_created function).
609
609
  sync_local_metadata_to_datastore(
@@ -10,7 +10,7 @@ import tarfile
10
10
  import time
11
11
  from urllib.error import URLError
12
12
  from urllib.request import urlopen
13
- from metaflow.metaflow_config import DATASTORE_LOCAL_DIR
13
+ from metaflow.metaflow_config import DATASTORE_LOCAL_DIR, CONDA_USE_FAST_INIT
14
14
  from metaflow.plugins import DATASTORES
15
15
  from metaflow.plugins.pypi.utils import MICROMAMBA_MIRROR_URL, MICROMAMBA_URL
16
16
  from metaflow.util import which
@@ -19,6 +19,8 @@ import warnings
19
19
 
20
20
  from . import MAGIC_FILE, _datastore_packageroot
21
21
 
22
+ FAST_INIT_BIN_URL = "https://fast-flow-init.outerbounds.sh/{platform}/fast-env-0.1.1.gz"
23
+
22
24
  # Bootstraps a valid conda virtual environment composed of conda and pypi packages
23
25
 
24
26
 
@@ -58,9 +60,14 @@ if __name__ == "__main__":
58
60
  # fi
59
61
  # fi
60
62
 
61
- def run_cmd(cmd):
63
+ def run_cmd(cmd, stdin_str=None):
62
64
  result = subprocess.run(
63
- cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True
65
+ cmd,
66
+ shell=True,
67
+ input=stdin_str,
68
+ stdout=subprocess.PIPE,
69
+ stderr=subprocess.PIPE,
70
+ text=True,
64
71
  )
65
72
  if result.returncode != 0:
66
73
  print(f"Bootstrap failed while executing: {cmd}")
@@ -68,6 +75,58 @@ if __name__ == "__main__":
68
75
  print("Stderr:", result.stderr)
69
76
  sys.exit(1)
70
77
 
78
+ @timer
79
+ def install_fast_initializer(architecture):
80
+ import gzip
81
+
82
+ fast_initializer_path = os.path.join(
83
+ os.getcwd(), "fast-initializer", "bin", "fast-initializer"
84
+ )
85
+
86
+ if which("fast-initializer"):
87
+ return which("fast-initializer")
88
+ if os.path.exists(fast_initializer_path):
89
+ os.environ["PATH"] += os.pathsep + os.path.dirname(fast_initializer_path)
90
+ return fast_initializer_path
91
+
92
+ url = FAST_INIT_BIN_URL.format(platform=architecture)
93
+
94
+ # Prepare directory once
95
+ os.makedirs(os.path.dirname(fast_initializer_path), exist_ok=True)
96
+
97
+ # Download and decompress in one go
98
+ def _download_and_extract(url):
99
+ headers = {
100
+ "Accept-Encoding": "gzip, deflate, br",
101
+ "Connection": "keep-alive",
102
+ "User-Agent": "python-urllib",
103
+ }
104
+
105
+ max_retries = 3
106
+ for attempt in range(max_retries):
107
+ try:
108
+ req = Request(url, headers=headers)
109
+ with urlopen(req) as response:
110
+ with gzip.GzipFile(fileobj=response) as gz:
111
+ with open(fast_initializer_path, "wb") as f:
112
+ f.write(gz.read())
113
+ break
114
+ except (URLError, IOError) as e:
115
+ if attempt == max_retries - 1:
116
+ raise Exception(
117
+ f"Failed to download fast-initializer after {max_retries} attempts: {e}"
118
+ )
119
+ time.sleep(2**attempt)
120
+
121
+ _download_and_extract(url)
122
+
123
+ # Set executable permission
124
+ os.chmod(fast_initializer_path, 0o755)
125
+
126
+ # Update PATH only once at the end
127
+ os.environ["PATH"] += os.pathsep + os.path.dirname(fast_initializer_path)
128
+ return fast_initializer_path
129
+
71
130
  @timer
72
131
  def install_micromamba(architecture):
73
132
  micromamba_dir = os.path.join(os.getcwd(), "micromamba")
@@ -268,6 +327,29 @@ if __name__ == "__main__":
268
327
  # wait for conda environment to be created
269
328
  futures["conda_env"].result()
270
329
 
330
+ @timer
331
+ def fast_setup_environment(architecture, storage, env, prefix, pkgs_dir):
332
+ install_fast_initializer(architecture)
333
+
334
+ # Get package urls
335
+ conda_pkgs = env["conda"]
336
+ pypi_pkgs = env.get("pypi", [])
337
+ conda_pkg_urls = [package["path"] for package in conda_pkgs]
338
+ pypi_pkg_urls = [package["path"] for package in pypi_pkgs]
339
+
340
+ # Create string with package URLs
341
+ all_package_urls = ""
342
+ for url in conda_pkg_urls:
343
+ all_package_urls += f"{storage.datastore_root}/{url}\n"
344
+ all_package_urls += "---\n"
345
+ for url in pypi_pkg_urls:
346
+ all_package_urls += f"{storage.datastore_root}/{url}\n"
347
+
348
+ # Initialize environment
349
+ # NOTE: For the time being the fast-initializer only works for the S3 datastore implementation
350
+ cmd = f"fast-initializer --prefix {prefix} --packages-dir {pkgs_dir}"
351
+ run_cmd(cmd, all_package_urls)
352
+
271
353
  if len(sys.argv) != 5:
272
354
  print("Usage: bootstrap.py <flow_name> <id> <datastore_type> <architecture>")
273
355
  sys.exit(1)
@@ -299,9 +381,12 @@ if __name__ == "__main__":
299
381
  with open(os.path.join(manifest_dir, MAGIC_FILE)) as f:
300
382
  env = json.load(f)[id_][architecture]
301
383
 
302
- setup_environment(
303
- architecture, storage, env, prefix, conda_pkgs_dir, pypi_pkgs_dir
304
- )
384
+ if CONDA_USE_FAST_INIT:
385
+ fast_setup_environment(architecture, storage, env, prefix, pkgs_dir)
386
+ else:
387
+ setup_environment(
388
+ architecture, storage, env, prefix, conda_pkgs_dir, pypi_pkgs_dir
389
+ )
305
390
 
306
391
  except Exception as e:
307
392
  print(f"Error: {str(e)}", file=sys.stderr)
@@ -37,7 +37,7 @@ class Micromamba(object):
37
37
  _home = os.environ.get("METAFLOW_TOKEN_HOME")
38
38
  else:
39
39
  _home = os.environ.get("METAFLOW_HOME", "~/.metaflowconfig")
40
- _path_to_hidden_micromamba = os.path.join(
40
+ self._path_to_hidden_micromamba = os.path.join(
41
41
  os.path.expanduser(_home),
42
42
  "micromamba",
43
43
  )
@@ -47,19 +47,26 @@ class Micromamba(object):
47
47
  else:
48
48
  self.logger = lambda *args, **kwargs: None # No-op logger if not provided
49
49
 
50
- self.bin = (
50
+ self._bin = (
51
51
  which(os.environ.get("METAFLOW_PATH_TO_MICROMAMBA") or "micromamba")
52
52
  or which("./micromamba") # to support remote execution
53
53
  or which("./bin/micromamba")
54
- or which(os.path.join(_path_to_hidden_micromamba, "bin/micromamba"))
54
+ or which(os.path.join(self._path_to_hidden_micromamba, "bin/micromamba"))
55
55
  )
56
- if self.bin is None:
57
- # Install Micromamba on the fly.
58
- # TODO: Make this optional at some point.
59
- _install_micromamba(_path_to_hidden_micromamba)
60
- self.bin = which(os.path.join(_path_to_hidden_micromamba, "bin/micromamba"))
61
56
 
62
- if self.bin is None:
57
+ @property
58
+ def bin(self):
59
+ "Defer installing Micromamba until when the binary path is actually requested"
60
+ if self._bin is not None:
61
+ 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
+ )
68
+
69
+ if self._bin is None:
63
70
  msg = "No installation for *Micromamba* found.\n"
64
71
  msg += "Visit https://mamba.readthedocs.io/en/latest/micromamba-installation.html for installation instructions."
65
72
  raise MetaflowException(msg)
@@ -16,7 +16,7 @@ import itertools
16
16
  import uuid
17
17
  import json
18
18
  from collections import OrderedDict
19
- from typing import Any, Callable, Dict, List, Optional
19
+ from typing import Any, Callable, Dict, List, Optional, Type
20
20
  from typing import OrderedDict as TOrderedDict
21
21
  from typing import Tuple as TTuple
22
22
  from typing import Union
@@ -96,8 +96,13 @@ def _method_sanity_check(
96
96
  check_type(supplied_v, annotations[supplied_k])
97
97
  except TypeCheckError:
98
98
  raise TypeError(
99
- "Invalid type for '%s', expected: '%s', default is '%s'"
100
- % (supplied_k, annotations[supplied_k], defaults[supplied_k])
99
+ "Invalid type for '%s' (%s), expected: '%s', default is '%s'"
100
+ % (
101
+ supplied_k,
102
+ type(supplied_k),
103
+ annotations[supplied_k],
104
+ defaults[supplied_k],
105
+ )
101
106
  )
102
107
 
103
108
  # Clean up values to make them into what click expects
@@ -184,26 +189,35 @@ def _lazy_load_command(
184
189
  raise AttributeError()
185
190
 
186
191
 
187
- def get_annotation(param: Union[click.Argument, click.Option]):
192
+ def get_annotation(param: click.Parameter) -> TTuple[Type, bool]:
188
193
  py_type = click_to_python_types[type(param.type)]
194
+ if param.nargs == -1:
195
+ # This is the equivalent of *args effectively
196
+ # so the type annotation should be the type of the
197
+ # elements in the list
198
+ return py_type, True
189
199
  if not param.required:
190
- if param.multiple or param.nargs == -1:
191
- return Optional[List[py_type]]
200
+ if param.multiple or param.nargs > 1:
201
+ return Optional[Union[List[py_type], TTuple[py_type]]], False
192
202
  else:
193
- return Optional[py_type]
203
+ return Optional[py_type], False
194
204
  else:
195
- if param.multiple or param.nargs == -1:
196
- return List[py_type]
205
+ if param.multiple or param.nargs > 1:
206
+ return Union[List[py_type], TTuple[py_type]], False
197
207
  else:
198
- return py_type
208
+ return py_type, False
199
209
 
200
210
 
201
211
  def get_inspect_param_obj(p: Union[click.Argument, click.Option], kind: str):
202
- return inspect.Parameter(
203
- name=p.name,
204
- kind=kind,
205
- default=p.default,
206
- annotation=get_annotation(p),
212
+ annotation, is_vararg = get_annotation(p)
213
+ return (
214
+ inspect.Parameter(
215
+ name="args" if is_vararg else p.name,
216
+ kind=inspect.Parameter.VAR_POSITIONAL if is_vararg else kind,
217
+ default=inspect.Parameter.empty if is_vararg else p.default,
218
+ annotation=annotation,
219
+ ),
220
+ annotation,
207
221
  )
208
222
 
209
223
 
@@ -224,21 +238,29 @@ def extract_flow_class_from_file(flow_file: str) -> FlowSpec:
224
238
  path_was_added = True
225
239
 
226
240
  try:
241
+ # Get module name from the file path
242
+ module_name = os.path.splitext(os.path.basename(flow_file))[0]
243
+
227
244
  # Check if the module has already been loaded
228
245
  if flow_file in loaded_modules:
229
246
  module = loaded_modules[flow_file]
230
247
  else:
231
248
  # Load the module if it's not already loaded
232
- spec = importlib.util.spec_from_file_location("module", flow_file)
249
+ spec = importlib.util.spec_from_file_location(module_name, flow_file)
233
250
  module = importlib.util.module_from_spec(spec)
234
251
  spec.loader.exec_module(module)
235
252
  # Cache the loaded module
236
253
  loaded_modules[flow_file] = module
237
- classes = inspect.getmembers(module, inspect.isclass)
238
254
 
255
+ classes = inspect.getmembers(module, inspect.isclass)
239
256
  flow_cls = None
257
+
240
258
  for _, kls in classes:
241
- if kls != FlowSpec and issubclass(kls, FlowSpec):
259
+ if (
260
+ kls is not FlowSpec
261
+ and kls.__module__ == module_name
262
+ and issubclass(kls, FlowSpec)
263
+ ):
242
264
  if flow_cls is not None:
243
265
  raise MetaflowException(
244
266
  "Multiple FlowSpec classes found in %s" % flow_file
@@ -319,7 +341,7 @@ class MetaflowAPI(object):
319
341
  defaults,
320
342
  ) = extract_all_params(cli_collection)
321
343
 
322
- def _method(_self, **kwargs):
344
+ def _method(_self, *args, **kwargs):
323
345
  method_params = _method_sanity_check(
324
346
  possible_arg_params,
325
347
  possible_opt_params,
@@ -371,6 +393,8 @@ class MetaflowAPI(object):
371
393
  else:
372
394
  components.append(v)
373
395
  for k, v in options.items():
396
+ if v is None:
397
+ continue
374
398
  if isinstance(v, list):
375
399
  for i in v:
376
400
  if isinstance(i, tuple):
@@ -379,6 +403,9 @@ class MetaflowAPI(object):
379
403
  else:
380
404
  components.append("--%s" % k)
381
405
  components.append(str(i))
406
+ elif v is None:
407
+ continue # Skip None values -- they are defaults and converting
408
+ # them to string will not be what the user wants
382
409
  else:
383
410
  components.append("--%s" % k)
384
411
  if v != "flag":
@@ -490,17 +517,16 @@ def extract_all_params(cmd_obj: Union[click.Command, click.Group]):
490
517
 
491
518
  for each_param in cmd_obj.params:
492
519
  if isinstance(each_param, click.Argument):
493
- arg_params_sigs[each_param.name] = get_inspect_param_obj(
494
- each_param, inspect.Parameter.POSITIONAL_ONLY
520
+ arg_params_sigs[each_param.name], annotations[each_param.name] = (
521
+ get_inspect_param_obj(each_param, inspect.Parameter.POSITIONAL_ONLY)
495
522
  )
496
523
  arg_parameters[each_param.name] = each_param
497
524
  elif isinstance(each_param, click.Option):
498
- opt_params_sigs[each_param.name] = get_inspect_param_obj(
499
- each_param, inspect.Parameter.KEYWORD_ONLY
525
+ opt_params_sigs[each_param.name], annotations[each_param.name] = (
526
+ get_inspect_param_obj(each_param, inspect.Parameter.KEYWORD_ONLY)
500
527
  )
501
528
  opt_parameters[each_param.name] = each_param
502
529
 
503
- annotations[each_param.name] = get_annotation(each_param)
504
530
  defaults[each_param.name] = each_param.default
505
531
 
506
532
  # first, fill in positional arguments
@@ -537,7 +563,7 @@ def extract_group(cmd_obj: click.Group, flow_parameters: List[Parameter]) -> Cal
537
563
  defaults,
538
564
  ) = extract_all_params(cmd_obj)
539
565
 
540
- def _method(_self, **kwargs):
566
+ def _method(_self, *args, **kwargs):
541
567
  method_params = _method_sanity_check(
542
568
  possible_arg_params, possible_opt_params, annotations, defaults, **kwargs
543
569
  )
@@ -570,7 +596,7 @@ def extract_command(
570
596
  defaults,
571
597
  ) = extract_all_params(cmd_obj)
572
598
 
573
- def _method(_self, **kwargs):
599
+ def _method(_self, *args, **kwargs):
574
600
  method_params = _method_sanity_check(
575
601
  possible_arg_params, possible_opt_params, annotations, defaults, **kwargs
576
602
  )
@@ -63,11 +63,20 @@ class DeployerImpl(object):
63
63
 
64
64
  from metaflow.parameters import flow_context
65
65
 
66
- if "metaflow.cli" in sys.modules:
67
- # Reload the CLI with an "empty" flow -- this will remove any configuration
68
- # options. They are re-added in from_cli (called below).
69
- with flow_context(None) as _:
70
- importlib.reload(sys.modules["metaflow.cli"])
66
+ # Reload the CLI with an "empty" flow -- this will remove any configuration
67
+ # and parameter options. They are re-added in from_cli (called below).
68
+ to_reload = [
69
+ "metaflow.cli",
70
+ "metaflow.cli_components.run_cmds",
71
+ "metaflow.cli_components.init_cmd",
72
+ ]
73
+ with flow_context(None):
74
+ [
75
+ importlib.reload(sys.modules[module])
76
+ for module in to_reload
77
+ if module in sys.modules
78
+ ]
79
+
71
80
  from metaflow.cli import start
72
81
  from metaflow.runner.click_api import MetaflowAPI
73
82
 
@@ -269,11 +269,20 @@ class Runner(metaclass=RunnerMeta):
269
269
 
270
270
  from metaflow.parameters import flow_context
271
271
 
272
- if "metaflow.cli" in sys.modules:
273
- # Reload the CLI with an "empty" flow -- this will remove any configuration
274
- # options. They are re-added in from_cli (called below).
275
- with flow_context(None) as _:
276
- importlib.reload(sys.modules["metaflow.cli"])
272
+ # Reload the CLI with an "empty" flow -- this will remove any configuration
273
+ # and parameter options. They are re-added in from_cli (called below).
274
+ to_reload = [
275
+ "metaflow.cli",
276
+ "metaflow.cli_components.run_cmds",
277
+ "metaflow.cli_components.init_cmd",
278
+ ]
279
+ with flow_context(None):
280
+ [
281
+ importlib.reload(sys.modules[module])
282
+ for module in to_reload
283
+ if module in sys.modules
284
+ ]
285
+
277
286
  from metaflow.cli import start
278
287
  from metaflow.runner.click_api import MetaflowAPI
279
288
 
@@ -169,7 +169,7 @@ class ConfigInput:
169
169
  "Please contact support."
170
170
  )
171
171
  cls.loaded_configs = all_configs
172
- return cls.loaded_configs.get(config_name, None)
172
+ return cls.loaded_configs[config_name]
173
173
 
174
174
  def process_configs(
175
175
  self,
@@ -326,6 +326,8 @@ class ConfigInput:
326
326
  for name, val in merged_configs.items():
327
327
  if val is None:
328
328
  missing_configs.add(name)
329
+ to_return[name] = None
330
+ flow_cls._flow_state[_FlowState.CONFIGS][name] = None
329
331
  continue
330
332
  if val.startswith(_CONVERTED_DEFAULT_NO_FILE):
331
333
  no_default_file.append(name)
@@ -339,15 +341,16 @@ class ConfigInput:
339
341
  val = val[len(_DEFAULT_PREFIX) :]
340
342
  if val.startswith("kv."):
341
343
  # This means to load it from a file
342
- read_value = self.get_config(val[3:])
343
- if read_value is None:
344
+ try:
345
+ read_value = self.get_config(val[3:])
346
+ except KeyError as e:
344
347
  exc = click.UsageError(
345
348
  "Could not find configuration '%s' in INFO file" % val
346
349
  )
347
350
  if click_obj:
348
351
  click_obj.delayed_config_exception = exc
349
352
  return None
350
- raise exc
353
+ raise exc from e
351
354
  flow_cls._flow_state[_FlowState.CONFIGS][name] = read_value
352
355
  to_return[name] = ConfigValue(read_value)
353
356
  else:
@@ -290,17 +290,17 @@ class Config(Parameter, collections.abc.Mapping):
290
290
  default : Union[str, Callable[[ParameterContext], str], optional, default None
291
291
  Default path from where to read this configuration. A function implies that the
292
292
  value will be computed using that function.
293
- You can only specify default or default_value.
293
+ You can only specify default or default_value, not both.
294
294
  default_value : Union[str, Dict[str, Any], Callable[[ParameterContext, Union[str, Dict[str, Any]]], Any], optional, default None
295
295
  Default value for the parameter. A function
296
296
  implies that the value will be computed using that function.
297
- You can only specify default or default_value.
297
+ You can only specify default or default_value, not both.
298
298
  help : str, optional, default None
299
299
  Help text to show in `run --help`.
300
300
  required : bool, optional, default None
301
- Require that the user specified a value for the configuration. Note that if
302
- a default is provided, the required flag is ignored. A value of None is
303
- equivalent to False.
301
+ Require that the user specifies a value for the configuration. Note that if
302
+ a default or default_value is provided, the required flag is ignored.
303
+ A value of None is equivalent to False.
304
304
  parser : Union[str, Callable[[str], Dict[Any, Any]]], optional, default None
305
305
  If a callable, it is a function that can parse the configuration string
306
306
  into an arbitrarily nested dictionary. If a string, the string should refer to
@@ -330,13 +330,13 @@ class Config(Parameter, collections.abc.Mapping):
330
330
  **kwargs: Dict[str, str]
331
331
  ):
332
332
 
333
- if default and default_value:
333
+ if default is not None and default_value is not None:
334
334
  raise MetaflowException(
335
335
  "For config '%s', you can only specify default or default_value, not both"
336
336
  % name
337
337
  )
338
338
  self._default_is_file = default is not None
339
- kwargs["default"] = default or default_value
339
+ kwargs["default"] = default if default is not None else default_value
340
340
  super(Config, self).__init__(
341
341
  name, required=required, help=help, type=str, **kwargs
342
342
  )
@@ -0,0 +1 @@
1
+ metaflow_version = "2.13.8"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: metaflow
3
- Version: 2.13.6
3
+ Version: 2.13.8
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.6; extra == "stubs"
29
+ Requires-Dist: metaflow-stubs==2.13.8; extra == "stubs"
30
30
  Dynamic: author
31
31
  Dynamic: author-email
32
32
  Dynamic: classifier
@@ -2,4 +2,4 @@ requests
2
2
  boto3
3
3
 
4
4
  [stubs]
5
- metaflow-stubs==2.13.6
5
+ metaflow-stubs==2.13.8
@@ -1 +0,0 @@
1
- metaflow_version = "2.13.6"
File without changes
File without changes
File without changes
File without changes