metaflow 2.12.3__tar.gz → 2.12.5__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 (347) hide show
  1. {metaflow-2.12.3/metaflow.egg-info → metaflow-2.12.5}/PKG-INFO +2 -2
  2. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/R.py +10 -7
  3. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/cli.py +1 -1
  4. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/client/core.py +55 -15
  5. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/decorators.py +8 -7
  6. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/flowspec.py +21 -15
  7. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/parameters.py +42 -1
  8. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/airflow/airflow.py +1 -1
  9. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/airflow/sensors/base_sensor.py +4 -4
  10. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/airflow/sensors/external_task_sensor.py +2 -2
  11. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/airflow/sensors/s3_sensor.py +2 -2
  12. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/argo/argo_workflows.py +1 -1
  13. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/step_functions/step_functions.py +1 -1
  14. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_cli.py +36 -25
  15. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_modules/basic.py +13 -0
  16. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/stub.py +3 -1
  17. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/pypi/bootstrap.py +1 -1
  18. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/pypi/conda_environment.py +7 -9
  19. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/runner/click_api.py +18 -9
  20. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/runner/metaflow_runner.py +4 -0
  21. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/runtime.py +2 -8
  22. metaflow-2.12.5/metaflow/version.py +1 -0
  23. {metaflow-2.12.3 → metaflow-2.12.5/metaflow.egg-info}/PKG-INFO +2 -2
  24. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow.egg-info/requires.txt +1 -1
  25. metaflow-2.12.3/metaflow/version.py +0 -1
  26. {metaflow-2.12.3 → metaflow-2.12.5}/LICENSE +0 -0
  27. {metaflow-2.12.3 → metaflow-2.12.5}/MANIFEST.in +0 -0
  28. {metaflow-2.12.3 → metaflow-2.12.5}/README.md +0 -0
  29. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/__init__.py +0 -0
  30. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/__init__.py +0 -0
  31. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/click/__init__.py +0 -0
  32. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  33. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/click/_compat.py +0 -0
  34. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/click/_termui_impl.py +0 -0
  35. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/click/_textwrap.py +0 -0
  36. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/click/_unicodefun.py +0 -0
  37. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/click/_winconsole.py +0 -0
  38. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/click/core.py +0 -0
  39. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/click/decorators.py +0 -0
  40. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/click/exceptions.py +0 -0
  41. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/click/formatting.py +0 -0
  42. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/click/globals.py +0 -0
  43. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/click/parser.py +0 -0
  44. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/click/termui.py +0 -0
  45. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/click/testing.py +0 -0
  46. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/click/types.py +0 -0
  47. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/click/utils.py +0 -0
  48. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
  49. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
  50. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
  51. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
  52. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
  53. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
  54. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
  55. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
  56. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
  57. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/packaging/__init__.py +0 -0
  58. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/packaging/_elffile.py +0 -0
  59. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  60. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  61. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/packaging/_parser.py +0 -0
  62. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/packaging/_structures.py +0 -0
  63. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  64. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/packaging/markers.py +0 -0
  65. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/packaging/py.typed +0 -0
  66. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/packaging/requirements.py +0 -0
  67. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/packaging/specifiers.py +0 -0
  68. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/packaging/tags.py +0 -0
  69. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/packaging/utils.py +0 -0
  70. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/packaging/version.py +0 -0
  71. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/typeguard/__init__.py +0 -0
  72. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/typeguard/_checkers.py +0 -0
  73. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/typeguard/_config.py +0 -0
  74. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/typeguard/_decorators.py +0 -0
  75. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
  76. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/typeguard/_functions.py +0 -0
  77. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/typeguard/_importhook.py +0 -0
  78. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/typeguard/_memo.py +0 -0
  79. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
  80. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/typeguard/_suppression.py +0 -0
  81. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/typeguard/_transformer.py +0 -0
  82. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
  83. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/typeguard/_utils.py +0 -0
  84. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/typeguard/py.typed +0 -0
  85. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/typing_extensions.py +0 -0
  86. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/v3_5/__init__.py +0 -0
  87. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
  88. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
  89. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/v3_5/zipp.py +0 -0
  90. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/v3_6/__init__.py +0 -0
  91. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  92. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  93. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  94. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  95. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  96. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  97. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  98. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  99. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  100. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  101. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/v3_6/zipp.py +0 -0
  102. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/_vendor/zipp.py +0 -0
  103. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/cards.py +0 -0
  104. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/cli_args.py +0 -0
  105. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/client/__init__.py +0 -0
  106. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/client/filecache.py +0 -0
  107. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/clone_util.py +0 -0
  108. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/cmd/__init__.py +0 -0
  109. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/cmd/configure_cmd.py +0 -0
  110. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/cmd/develop/__init__.py +0 -0
  111. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/cmd/develop/stub_generator.py +0 -0
  112. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/cmd/develop/stubs.py +0 -0
  113. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/cmd/main_cli.py +0 -0
  114. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/cmd/tutorials_cmd.py +0 -0
  115. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/cmd/util.py +0 -0
  116. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/cmd_with_io.py +0 -0
  117. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/datastore/__init__.py +0 -0
  118. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/datastore/content_addressed_store.py +0 -0
  119. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/datastore/datastore_set.py +0 -0
  120. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/datastore/datastore_storage.py +0 -0
  121. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/datastore/exceptions.py +0 -0
  122. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/datastore/flow_datastore.py +0 -0
  123. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/datastore/inputs.py +0 -0
  124. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/datastore/task_datastore.py +0 -0
  125. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/debug.py +0 -0
  126. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/event_logger.py +0 -0
  127. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/events.py +0 -0
  128. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/exception.py +0 -0
  129. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/extension_support/__init__.py +0 -0
  130. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/extension_support/_empty_file.py +0 -0
  131. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/extension_support/cmd.py +0 -0
  132. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/extension_support/integrations.py +0 -0
  133. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/extension_support/plugins.py +0 -0
  134. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/graph.py +0 -0
  135. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/includefile.py +0 -0
  136. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/integrations.py +0 -0
  137. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/lint.py +0 -0
  138. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/metadata/__init__.py +0 -0
  139. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/metadata/heartbeat.py +0 -0
  140. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/metadata/metadata.py +0 -0
  141. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/metadata/util.py +0 -0
  142. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/metaflow_config.py +0 -0
  143. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/metaflow_config_funcs.py +0 -0
  144. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/metaflow_current.py +0 -0
  145. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/metaflow_environment.py +0 -0
  146. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/metaflow_profile.py +0 -0
  147. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/metaflow_version.py +0 -0
  148. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/mflog/__init__.py +0 -0
  149. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/mflog/mflog.py +0 -0
  150. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/mflog/save_logs.py +0 -0
  151. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/mflog/save_logs_periodically.py +0 -0
  152. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/mflog/tee.py +0 -0
  153. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/monitor.py +0 -0
  154. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/multicore_utils.py +0 -0
  155. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/package.py +0 -0
  156. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/__init__.py +0 -0
  157. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/airflow/__init__.py +0 -0
  158. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  159. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  160. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  161. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/airflow/dag.py +0 -0
  162. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/airflow/exception.py +0 -0
  163. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  164. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  165. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  166. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/argo/__init__.py +0 -0
  167. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/argo/argo_client.py +0 -0
  168. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/argo/argo_events.py +0 -0
  169. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/argo/argo_workflows_cli.py +0 -0
  170. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  171. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/argo/generate_input_paths.py +0 -0
  172. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/__init__.py +0 -0
  173. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/aws_client.py +0 -0
  174. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/aws_utils.py +0 -0
  175. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/batch/__init__.py +0 -0
  176. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/batch/batch.py +0 -0
  177. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  178. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  179. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
  180. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  181. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  182. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  183. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  184. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  185. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  186. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  187. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  188. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
  189. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  190. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  191. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/azure/__init__.py +0 -0
  192. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/azure/azure_credential.py +0 -0
  193. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  194. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
  195. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/azure/azure_tail.py +0 -0
  196. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/azure/azure_utils.py +0 -0
  197. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  198. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/azure/includefile_support.py +0 -0
  199. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/__init__.py +0 -0
  200. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_client.py +0 -0
  201. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_creator.py +0 -0
  202. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_datastore.py +0 -0
  203. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_decorator.py +0 -0
  204. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  205. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_modules/base.html +0 -0
  206. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
  207. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_modules/card.py +0 -0
  208. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  209. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  210. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  211. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  212. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  213. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_modules/components.py +0 -0
  214. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  215. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_modules/main.js +0 -0
  216. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  217. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  218. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_resolver.py +0 -0
  219. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_server.py +0 -0
  220. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
  221. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/component_serializer.py +0 -0
  222. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/cards/exception.py +0 -0
  223. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/catch_decorator.py +0 -0
  224. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/datastores/__init__.py +0 -0
  225. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/datastores/azure_storage.py +0 -0
  226. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/datastores/gs_storage.py +0 -0
  227. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/datastores/local_storage.py +0 -0
  228. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/datastores/s3_storage.py +0 -0
  229. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/datatools/__init__.py +0 -0
  230. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/datatools/local.py +0 -0
  231. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  232. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/datatools/s3/s3.py +0 -0
  233. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/datatools/s3/s3op.py +0 -0
  234. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  235. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  236. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/debug_logger.py +0 -0
  237. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/debug_monitor.py +0 -0
  238. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/__init__.py +0 -0
  239. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/client.py +0 -0
  240. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/client_modules.py +0 -0
  241. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  242. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  243. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  244. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  245. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  246. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  247. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  248. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  249. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  250. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  251. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/consts.py +0 -0
  252. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  253. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  254. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  255. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/server.py +0 -0
  256. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/env_escape/utils.py +0 -0
  257. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/environment_decorator.py +0 -0
  258. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/events_decorator.py +0 -0
  259. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/frameworks/__init__.py +0 -0
  260. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/frameworks/pytorch.py +0 -0
  261. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/gcp/__init__.py +0 -0
  262. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
  263. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  264. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  265. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/gcp/gs_tail.py +0 -0
  266. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/gcp/gs_utils.py +0 -0
  267. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/gcp/includefile_support.py +0 -0
  268. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/kubernetes/__init__.py +0 -0
  269. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/kubernetes/kubernetes.py +0 -0
  270. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/kubernetes/kubernetes_cli.py +0 -0
  271. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
  272. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/kubernetes/kubernetes_decorator.py +0 -0
  273. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/kubernetes/kubernetes_job.py +0 -0
  274. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +0 -0
  275. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/logs_cli.py +0 -0
  276. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/metadata/__init__.py +0 -0
  277. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/metadata/local.py +0 -0
  278. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/metadata/service.py +0 -0
  279. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/package_cli.py +0 -0
  280. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/parallel_decorator.py +0 -0
  281. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/project_decorator.py +0 -0
  282. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/pypi/__init__.py +0 -0
  283. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/pypi/conda_decorator.py +0 -0
  284. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/pypi/micromamba.py +0 -0
  285. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/pypi/pip.py +0 -0
  286. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
  287. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  288. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/pypi/utils.py +0 -0
  289. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/resources_decorator.py +0 -0
  290. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/retry_decorator.py +0 -0
  291. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/secrets/__init__.py +0 -0
  292. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  293. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  294. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/storage_executor.py +0 -0
  295. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/tag_cli.py +0 -0
  296. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  297. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/plugins/timeout_decorator.py +0 -0
  298. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/procpoll.py +0 -0
  299. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/py.typed +0 -0
  300. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/pylint_wrapper.py +0 -0
  301. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/runner/__init__.py +0 -0
  302. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/runner/nbrun.py +0 -0
  303. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/runner/subprocess_manager.py +0 -0
  304. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/sidecar/__init__.py +0 -0
  305. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/sidecar/sidecar.py +0 -0
  306. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/sidecar/sidecar_messages.py +0 -0
  307. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  308. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/sidecar/sidecar_worker.py +0 -0
  309. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tagging_util.py +0 -0
  310. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/task.py +0 -0
  311. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tracing/__init__.py +0 -0
  312. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tracing/propagator.py +0 -0
  313. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tracing/span_exporter.py +0 -0
  314. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tracing/tracing_modules.py +0 -0
  315. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tuple_util.py +0 -0
  316. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/00-helloworld/README.md +0 -0
  317. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  318. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/01-playlist/README.md +0 -0
  319. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  320. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  321. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  322. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/02-statistics/README.md +0 -0
  323. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  324. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  325. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/02-statistics/stats.py +0 -0
  326. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  327. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  328. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  329. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  330. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  331. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  332. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  333. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  334. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  335. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/07-worldview/README.md +0 -0
  336. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  337. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/08-autopilot/README.md +0 -0
  338. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  339. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/unbounded_foreach.py +0 -0
  340. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/util.py +0 -0
  341. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow/vendor.py +0 -0
  342. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow.egg-info/SOURCES.txt +0 -0
  343. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow.egg-info/dependency_links.txt +0 -0
  344. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow.egg-info/entry_points.txt +0 -0
  345. {metaflow-2.12.3 → metaflow-2.12.5}/metaflow.egg-info/top_level.txt +0 -0
  346. {metaflow-2.12.3 → metaflow-2.12.5}/setup.cfg +0 -0
  347. {metaflow-2.12.3 → metaflow-2.12.5}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: metaflow
3
- Version: 2.12.3
3
+ Version: 2.12.5
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.3; extra == "stubs"
29
+ Requires-Dist: metaflow-stubs==2.12.5; 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
 
@@ -3,6 +3,7 @@ import sys
3
3
  from importlib import util as imp_util, machinery as imp_machinery
4
4
  from tempfile import NamedTemporaryFile
5
5
 
6
+ from . import parameters
6
7
  from .util import to_bytes
7
8
 
8
9
  R_FUNCTIONS = {}
@@ -125,15 +126,17 @@ def run(
125
126
  flow = module.FLOW(use_cli=False)
126
127
 
127
128
  from . import exception
128
- from . import cli
129
129
 
130
130
  try:
131
- cli.main(
132
- flow,
133
- args=metaflow_args,
134
- handle_exceptions=False,
135
- entrypoint=full_cmdline[: -len(metaflow_args)],
136
- )
131
+ with parameters.flow_context(flow.__class__) as _:
132
+ from . import cli
133
+
134
+ cli.main(
135
+ flow,
136
+ args=metaflow_args,
137
+ handle_exceptions=False,
138
+ entrypoint=full_cmdline[: -len(metaflow_args)],
139
+ )
137
140
  except exception.MetaflowException as e:
138
141
  cli.print_metaflow_exception(e)
139
142
  os.remove(tmp.name)
@@ -946,7 +946,7 @@ def start(
946
946
  ctx.obj.environment = [
947
947
  e for e in ENVIRONMENTS + [MetaflowEnvironment] if e.TYPE == environment
948
948
  ][0](ctx.obj.flow)
949
- ctx.obj.environment.validate_environment(echo, datastore)
949
+ ctx.obj.environment.validate_environment(ctx.obj.logger, datastore)
950
950
 
951
951
  ctx.obj.event_logger = LOGGING_SIDECARS[event_logger](
952
952
  flow=ctx.obj.flow, env=ctx.obj.environment
@@ -268,11 +268,13 @@ class MetaflowObject(object):
268
268
  _object: Optional["MetaflowObject"] = None,
269
269
  _parent: Optional["MetaflowObject"] = None,
270
270
  _namespace_check: bool = True,
271
+ _current_namespace: Optional[str] = None,
271
272
  ):
272
273
  self._metaflow = Metaflow()
273
274
  self._parent = _parent
274
275
  self._path_components = None
275
276
  self._attempt = attempt
277
+ self._current_namespace = _current_namespace or get_namespace()
276
278
  self._namespace_check = _namespace_check
277
279
 
278
280
  if self._attempt is not None:
@@ -339,8 +341,8 @@ class MetaflowObject(object):
339
341
  self._user_tags = frozenset(self._object.get("tags") or [])
340
342
  self._system_tags = frozenset(self._object.get("system_tags") or [])
341
343
 
342
- if self._namespace_check and not self.is_in_namespace():
343
- raise MetaflowNamespaceMismatch(current_namespace)
344
+ if self._namespace_check and not self._is_in_namespace(self._current_namespace):
345
+ raise MetaflowNamespaceMismatch(self._current_namespace)
344
346
 
345
347
  def _get_object(self, *path_components):
346
348
  result = self._metaflow.metadata.get_object(
@@ -365,8 +367,8 @@ class MetaflowObject(object):
365
367
  query_filter = {}
366
368
 
367
369
  # skip namespace filtering if _namespace_check is unset.
368
- if self._namespace_check and current_namespace:
369
- query_filter = {"any_tags": current_namespace}
370
+ if self._namespace_check and self._current_namespace:
371
+ query_filter = {"any_tags": self._current_namespace}
370
372
 
371
373
  unfiltered_children = self._metaflow.metadata.get_object(
372
374
  self._NAME,
@@ -383,7 +385,10 @@ class MetaflowObject(object):
383
385
  attempt=self._attempt,
384
386
  _object=obj,
385
387
  _parent=self,
386
- _namespace_check=False,
388
+ _namespace_check=self._namespace_check,
389
+ _current_namespace=self._current_namespace
390
+ if self._namespace_check
391
+ else None,
387
392
  )
388
393
  for obj in unfiltered_children
389
394
  ),
@@ -422,6 +427,23 @@ class MetaflowObject(object):
422
427
 
423
428
  If the current namespace is None, this will always return True.
424
429
 
430
+ Returns
431
+ -------
432
+ bool
433
+ Whether or not the object is in the current namespace
434
+ """
435
+ return self._is_in_namespace(current_namespace)
436
+
437
+ def _is_in_namespace(self, ns: str) -> bool:
438
+ """
439
+ Returns whether this object is in namespace passed in.
440
+
441
+ If the current namespace is None, this will always return True.
442
+
443
+ Parameters
444
+ ----------
445
+ ns : str
446
+ Namespace to check if the object is in.
425
447
  Returns
426
448
  -------
427
449
  bool
@@ -430,7 +452,7 @@ class MetaflowObject(object):
430
452
  if self._NAME == "flow":
431
453
  return any(True for _ in self)
432
454
  else:
433
- return current_namespace is None or current_namespace in self._tags
455
+ return ns is None or ns in self._tags
434
456
 
435
457
  def __str__(self):
436
458
  if self._attempt is not None:
@@ -479,6 +501,9 @@ class MetaflowObject(object):
479
501
  _object=obj,
480
502
  _parent=self,
481
503
  _namespace_check=self._namespace_check,
504
+ _current_namespace=self._current_namespace
505
+ if self._namespace_check
506
+ else None,
482
507
  )
483
508
  else:
484
509
  raise KeyError(id)
@@ -509,7 +534,20 @@ class MetaflowObject(object):
509
534
  pathspec=pathspec, attempt=attempt, _namespace_check=namespace_check
510
535
  )
511
536
 
512
- _UNPICKLE_FUNC = {"2.8.4": _unpickle_284}
537
+ def _unpickle_2124(self, data):
538
+ if len(data) != 4:
539
+ raise MetaflowInternalError(
540
+ "Unexpected size of array: {}".format(len(data))
541
+ )
542
+ pathspec, attempt, ns, namespace_check = data
543
+ self.__init__(
544
+ pathspec=pathspec,
545
+ attempt=attempt,
546
+ _namespace_check=namespace_check,
547
+ _current_namespace=ns,
548
+ )
549
+
550
+ _UNPICKLE_FUNC = {"2.8.4": _unpickle_284, "2.12.4": _unpickle_2124}
513
551
 
514
552
  def __setstate__(self, state):
515
553
  """
@@ -529,12 +567,13 @@ class MetaflowObject(object):
529
567
  self._UNPICKLE_FUNC[version](self, state["data"])
530
568
  else:
531
569
  # For backward compatibility: handles pickled objects that were serialized without a __getstate__ override
532
- # We set namespace_check to False if it doesn't exist for the same
533
- # reason as the one listed in __getstate__
570
+ # We set namespace_check to False if it doesn't exist so that the user can
571
+ # continue accessing this object once unpickled.
534
572
  self.__init__(
535
573
  pathspec=state.get("_pathspec", None),
536
574
  attempt=state.get("_attempt", None),
537
575
  _namespace_check=state.get("_namespace_check", False),
576
+ _current_namespace=None,
538
577
  )
539
578
 
540
579
  def __getstate__(self):
@@ -546,16 +585,17 @@ class MetaflowObject(object):
546
585
  from this object) are pickled (serialized) in a later version of Metaflow, it may not be possible
547
586
  to unpickle (deserialize) them in a previous version of Metaflow.
548
587
  """
549
- # Note that we set _namespace_check to False because we want the user to
550
- # be able to access this object even after unpickling it. If we set it to
551
- # True, it would check the namespace again at the time of unpickling even
552
- # if the user properly got the object in the first place and pickled it.
588
+ # Note that we now record the namespace at the time of the object creation so
589
+ # we don't need to force namespace_check to be False and can properly continue
590
+ # checking for the namespace even after unpickling since we will know which
591
+ # namespace to check.
553
592
  return {
554
- "version": "2.8.4",
593
+ "version": "2.12.4",
555
594
  "data": [
556
595
  self.pathspec,
557
596
  self._attempt,
558
- False,
597
+ self._current_namespace,
598
+ self._namespace_check,
559
599
  ],
560
600
  }
561
601
 
@@ -11,6 +11,8 @@ from .exception import (
11
11
  InvalidDecoratorAttribute,
12
12
  )
13
13
 
14
+ from .parameters import current_flow
15
+
14
16
  from metaflow._vendor import click
15
17
 
16
18
  try:
@@ -174,13 +176,9 @@ class Decorator(object):
174
176
 
175
177
 
176
178
  class FlowDecorator(Decorator):
177
- _flow_decorators = []
178
179
  options = {}
179
180
 
180
181
  def __init__(self, *args, **kwargs):
181
- # Note that this assumes we are executing one flow per process, so we have a global list of
182
- # _flow_decorators. A similar setup is used in parameters.
183
- self._flow_decorators.append(self)
184
182
  super(FlowDecorator, self).__init__(*args, **kwargs)
185
183
 
186
184
  def flow_init(
@@ -206,7 +204,10 @@ class FlowDecorator(Decorator):
206
204
  # compare this to parameters.add_custom_parameters
207
205
  def add_decorator_options(cmd):
208
206
  seen = {}
209
- for deco in flow_decorators():
207
+ flow_cls = getattr(current_flow, "flow_cls", None)
208
+ if flow_cls is None:
209
+ return cmd
210
+ for deco in flow_decorators(flow_cls):
210
211
  for option, kwargs in deco.options.items():
211
212
  if option in seen:
212
213
  msg = (
@@ -222,8 +223,8 @@ def add_decorator_options(cmd):
222
223
  return cmd
223
224
 
224
225
 
225
- def flow_decorators():
226
- return FlowDecorator._flow_decorators
226
+ def flow_decorators(flow_cls):
227
+ return [d for deco_list in flow_cls._flow_decorators.values() for d in deco_list]
227
228
 
228
229
 
229
230
  class StepDecorator(Decorator):
@@ -53,7 +53,18 @@ class ParallelUBF(UnboundedForeachInput):
53
53
  return item or 0 # item is None for the control task, but it is also split 0
54
54
 
55
55
 
56
- class FlowSpec(object):
56
+ class _FlowSpecMeta(type):
57
+ def __new__(cls, name, bases, dct):
58
+ f = super().__new__(cls, name, bases, dct)
59
+ # This makes sure to give _flow_decorators to each
60
+ # child class (and not share it with the FlowSpec base
61
+ # class). This is important to not make a "global"
62
+ # _flow_decorators
63
+ f._flow_decorators = {}
64
+ return f
65
+
66
+
67
+ class FlowSpec(metaclass=_FlowSpecMeta):
57
68
  """
58
69
  Main class from which all Flows should inherit.
59
70
 
@@ -83,8 +94,6 @@ class FlowSpec(object):
83
94
  # names starting with `_` as those are already excluded from `_get_parameters`.
84
95
  _NON_PARAMETERS = {"cmd", "foreach_stack", "index", "input", "script_name", "name"}
85
96
 
86
- _flow_decorators = {}
87
-
88
97
  def __init__(self, use_cli=True):
89
98
  """
90
99
  Construct a FlowSpec
@@ -104,15 +113,11 @@ class FlowSpec(object):
104
113
  self._graph = FlowGraph(self.__class__)
105
114
  self._steps = [getattr(self, node.name) for node in self._graph]
106
115
 
107
- # This must be set before calling cli.main() below (or specifically, add_custom_parameters)
108
- parameters.parameters = [p for _, p in self._get_parameters()]
109
-
110
116
  if use_cli:
111
- # we import cli here to make sure custom parameters in
112
- # args.py get fully evaluated before cli.py is imported.
113
- from . import cli
117
+ with parameters.flow_context(self.__class__) as _:
118
+ from . import cli
114
119
 
115
- cli.main(self)
120
+ cli.main(self)
116
121
 
117
122
  @property
118
123
  def script_name(self) -> str:
@@ -192,18 +197,19 @@ class FlowSpec(object):
192
197
  "attributes": deco.attributes,
193
198
  "statically_defined": deco.statically_defined,
194
199
  }
195
- for deco in flow_decorators()
200
+ for deco in flow_decorators(self)
196
201
  if not deco.name.startswith("_")
197
202
  ],
198
203
  }
199
204
  self._graph_info = graph_info
200
205
 
201
- def _get_parameters(self):
202
- for var in dir(self):
203
- if var[0] == "_" or var in self._NON_PARAMETERS:
206
+ @classmethod
207
+ def _get_parameters(cls):
208
+ for var in dir(cls):
209
+ if var[0] == "_" or var in cls._NON_PARAMETERS:
204
210
  continue
205
211
  try:
206
- val = getattr(self, var)
212
+ val = getattr(cls, var)
207
213
  except:
208
214
  continue
209
215
  if isinstance(val, Parameter):
@@ -1,4 +1,8 @@
1
1
  import json
2
+
3
+ from contextlib import contextmanager
4
+ from threading import local
5
+
2
6
  from typing import Any, Callable, Dict, NamedTuple, Optional, Type, Union
3
7
 
4
8
  from metaflow._vendor import click
@@ -31,7 +35,40 @@ ParameterContext = NamedTuple(
31
35
  ],
32
36
  )
33
37
 
34
- parameters = [] # Set by FlowSpec.__init__()
38
+
39
+ # When we launch a flow, we need to know the parameters so we can
40
+ # attach them with add_custom_parameters to commands. This used to be a global
41
+ # but causes problems when multiple FlowSpec are loaded (as can happen when using
42
+ # the Runner or just if multiple Flows are defined and instantiated). To minimally
43
+ # impact code, we now create the CLI with a thread local value of the FlowSpec
44
+ # that is being used to create the CLI which enables us to extract the parameters
45
+ # directly from the Flow.
46
+ current_flow = local()
47
+
48
+
49
+ @contextmanager
50
+ def flow_context(flow_cls):
51
+ """
52
+ Context manager to set the current flow for the thread. This is used
53
+ to extract the parameters from the FlowSpec that is being used to create
54
+ the CLI.
55
+ """
56
+ # Use a stack because with the runner this can get called multiple times in
57
+ # a nested fashion
58
+ current_flow.flow_cls_stack = getattr(current_flow, "flow_cls_stack", [])
59
+ current_flow.flow_cls_stack.insert(0, flow_cls)
60
+ current_flow.flow_cls = current_flow.flow_cls_stack[0]
61
+ try:
62
+ yield
63
+ finally:
64
+ current_flow.flow_cls_stack = current_flow.flow_cls_stack[1:]
65
+ if len(current_flow.flow_cls_stack) == 0:
66
+ del current_flow.flow_cls_stack
67
+ del current_flow.flow_cls
68
+ else:
69
+ current_flow.flow_cls = current_flow.flow_cls_stack[0]
70
+
71
+
35
72
  context_proto = None
36
73
 
37
74
 
@@ -391,6 +428,10 @@ def add_custom_parameters(deploy_mode=False):
391
428
  cmd.has_flow_params = True
392
429
  # Iterate over parameters in reverse order so cmd.params lists options
393
430
  # in the order they are defined in the FlowSpec subclass
431
+ flow_cls = getattr(current_flow, "flow_cls", None)
432
+ if flow_cls is None:
433
+ return cmd
434
+ parameters = [p for _, p in flow_cls._get_parameters()]
394
435
  for arg in parameters[::-1]:
395
436
  kwargs = arg.option_kwargs(deploy_mode)
396
437
  cmd.params.insert(0, click.Option(("--" + arg.name,), **kwargs))
@@ -539,7 +539,7 @@ class Airflow(object):
539
539
  # FlowDecorators can define their own top-level options. They are
540
540
  # responsible for adding their own top-level options and values through
541
541
  # the get_top_level_options() hook. See similar logic in runtime.py.
542
- for deco in flow_decorators():
542
+ for deco in flow_decorators(self.flow):
543
543
  top_opts_dict.update(deco.get_top_level_options())
544
544
 
545
545
  top_opts = list(dict_to_cli_options(top_opts_dict))
@@ -1,5 +1,5 @@
1
1
  import uuid
2
- from metaflow.decorators import FlowDecorator
2
+ from metaflow.decorators import FlowDecorator, flow_decorators
3
3
  from ..exception import AirflowException
4
4
  from ..airflow_utils import AirflowTask, id_creator, TASK_ID_HASH_LEN
5
5
 
@@ -49,7 +49,7 @@ class AirflowSensorDecorator(FlowDecorator):
49
49
  operator_type=self.operator_type,
50
50
  ).set_operator_args(**{k: v for k, v in task_args.items() if v is not None})
51
51
 
52
- def validate(self):
52
+ def validate(self, flow):
53
53
  """
54
54
  Validate if the arguments for the sensor are correct.
55
55
  """
@@ -58,7 +58,7 @@ class AirflowSensorDecorator(FlowDecorator):
58
58
  if self.attributes["name"] is None:
59
59
  deco_index = [
60
60
  d._id
61
- for d in self._flow_decorators
61
+ for d in flow_decorators(flow)
62
62
  if issubclass(d.__class__, AirflowSensorDecorator)
63
63
  ].index(self._id)
64
64
  self._airflow_task_name = "%s-%s" % (
@@ -71,4 +71,4 @@ class AirflowSensorDecorator(FlowDecorator):
71
71
  def flow_init(
72
72
  self, flow, graph, environment, flow_datastore, metadata, logger, echo, options
73
73
  ):
74
- self.validate()
74
+ self.validate(flow)
@@ -85,7 +85,7 @@ class ExternalTaskSensorDecorator(AirflowSensorDecorator):
85
85
  )
86
86
  return task_args
87
87
 
88
- def validate(self):
88
+ def validate(self, flow):
89
89
  if self.attributes["external_dag_id"] is None:
90
90
  raise AirflowException(
91
91
  "`%s` argument of `@%s`cannot be `None`."
@@ -131,4 +131,4 @@ class ExternalTaskSensorDecorator(AirflowSensorDecorator):
131
131
  self.name,
132
132
  )
133
133
  )
134
- super().validate()
134
+ super().validate(flow)
@@ -58,9 +58,9 @@ class S3KeySensorDecorator(AirflowSensorDecorator):
58
58
  # `verify` is a airflow variable.
59
59
  )
60
60
 
61
- def validate(self):
61
+ def validate(self, flow):
62
62
  if self.attributes["bucket_key"] is None:
63
63
  raise AirflowException(
64
64
  "`bucket_key` for `@%s`cannot be empty." % (self.name)
65
65
  )
66
- super().validate()
66
+ super().validate(flow)
@@ -1237,7 +1237,7 @@ class ArgoWorkflows(object):
1237
1237
  # FlowDecorators can define their own top-level options. They are
1238
1238
  # responsible for adding their own top-level options and values through
1239
1239
  # the get_top_level_options() hook. See similar logic in runtime.py.
1240
- for deco in flow_decorators():
1240
+ for deco in flow_decorators(self.flow):
1241
1241
  top_opts_dict.update(deco.get_top_level_options())
1242
1242
 
1243
1243
  top_level = list(dict_to_cli_options(top_opts_dict)) + [
@@ -881,7 +881,7 @@ class StepFunctions(object):
881
881
  # FlowDecorators can define their own top-level options. They are
882
882
  # responsible for adding their own top-level options and values through
883
883
  # the get_top_level_options() hook. See similar logic in runtime.py.
884
- for deco in flow_decorators():
884
+ for deco in flow_decorators(self.flow):
885
885
  top_opts_dict.update(deco.get_top_level_options())
886
886
 
887
887
  top_opts = list(dict_to_cli_options(top_opts_dict))
@@ -388,6 +388,22 @@ def card_read_options_and_arguments(func):
388
388
  return wrapper
389
389
 
390
390
 
391
+ def _extract_reload_token(data, task, mf_card):
392
+ if "render_seq" not in data:
393
+ return "never"
394
+
395
+ if data["render_seq"] == "final":
396
+ # final data update should always trigger a card reload to show
397
+ # the final card, hence a different token for the final update
398
+ return "final"
399
+ elif mf_card.RELOAD_POLICY == mf_card.RELOAD_POLICY_ALWAYS:
400
+ return "render-seq-%s" % data["render_seq"]
401
+ elif mf_card.RELOAD_POLICY == mf_card.RELOAD_POLICY_NEVER:
402
+ return "never"
403
+ elif mf_card.RELOAD_POLICY == mf_card.RELOAD_POLICY_ONCHANGE:
404
+ return mf_card.reload_content_token(task, data)
405
+
406
+
391
407
  def update_card(mf_card, mode, task, data, timeout_value=None):
392
408
  """
393
409
  This method will be responsible for creating a card/data-update based on the `mode`.
@@ -432,31 +448,21 @@ def update_card(mf_card, mode, task, data, timeout_value=None):
432
448
  - `timeout_stack_trace` : stack trace of the function if it timed out.
433
449
  """
434
450
 
435
- def _reload_token():
436
- if "render_seq" not in data:
437
- return "never"
438
-
439
- if data["render_seq"] == "final":
440
- # final data update should always trigger a card reload to show
441
- # the final card, hence a different token for the final update
442
- return "final"
443
- elif mf_card.RELOAD_POLICY == mf_card.RELOAD_POLICY_ALWAYS:
444
- return "render-seq-%s" % data["render_seq"]
445
- elif mf_card.RELOAD_POLICY == mf_card.RELOAD_POLICY_NEVER:
446
- return "never"
447
- elif mf_card.RELOAD_POLICY == mf_card.RELOAD_POLICY_ONCHANGE:
448
- return mf_card.reload_content_token(task, data)
449
-
450
451
  def _add_token_html(html):
451
452
  if html is None:
452
453
  return None
453
- return html.replace(mf_card.RELOAD_POLICY_TOKEN, _reload_token())
454
+ return html.replace(
455
+ mf_card.RELOAD_POLICY_TOKEN,
456
+ _extract_reload_token(data=data, task=task, mf_card=mf_card),
457
+ )
454
458
 
455
459
  def _add_token_json(json_msg):
456
460
  if json_msg is None:
457
461
  return None
458
462
  return {
459
- "reload_token": _reload_token(),
463
+ "reload_token": _extract_reload_token(
464
+ data=data, task=task, mf_card=mf_card
465
+ ),
460
466
  "data": json_msg,
461
467
  "created_on": time.time(),
462
468
  }
@@ -740,8 +746,16 @@ def create(
740
746
  # 3. `refresh` is implemented but it raises an exception. (We do nothing. Don't store anything.)
741
747
  # 4. `refresh` is implemented but it times out. (We do nothing. Don't store anything.)
742
748
 
749
+ def _render_error_card(stack_trace):
750
+ _card = error_card()
751
+ token = _extract_reload_token(data, task, _card)
752
+ return _card.render(
753
+ task,
754
+ stack_trace=stack_trace,
755
+ ).replace(mf_card.RELOAD_POLICY_TOKEN, token)
756
+
743
757
  if error_stack_trace is not None and mode != "refresh":
744
- rendered_content = error_card().render(task, stack_trace=error_stack_trace)
758
+ rendered_content = _render_error_card(error_stack_trace)
745
759
  elif (
746
760
  rendered_info.is_implemented
747
761
  and rendered_info.timed_out
@@ -753,18 +767,15 @@ def create(
753
767
  "To increase the timeout duration for card rendering, please set the `timeout` parameter in the @card decorator. "
754
768
  "\nStack Trace : \n%s"
755
769
  ) % (timeout, rendered_info.timeout_stack_trace)
756
- rendered_content = error_card().render(
757
- task,
758
- stack_trace=timeout_stack_trace,
759
- )
770
+ rendered_content = _render_error_card(timeout_stack_trace)
760
771
  elif (
761
772
  rendered_info.is_implemented
762
773
  and rendered_info.data is None
763
774
  and render_error_card
764
775
  and mode != "refresh"
765
776
  ):
766
- rendered_content = error_card().render(
767
- task, stack_trace="No information rendered from card of type %s" % type
777
+ rendered_content = _render_error_card(
778
+ "No information rendered from card of type %s" % type
768
779
  )
769
780
  elif (
770
781
  not rendered_info.is_implemented
@@ -775,7 +786,7 @@ def create(
775
786
  "Card of type %s is a runtime time card with no `render_runtime` implemented. "
776
787
  "Please implement `render_runtime` method to allow rendering this card at runtime."
777
788
  ) % type
778
- rendered_content = error_card().render(task, stack_trace=message)
789
+ rendered_content = _render_error_card(message)
779
790
 
780
791
  # todo : should we save native type for error card or error type ?
781
792
  if type is not None and re.match(CARD_ID_PATTERN, type) is not None:
@@ -542,11 +542,24 @@ class ErrorCard(MetaflowCard):
542
542
 
543
543
  type = "error"
544
544
 
545
+ RELOAD_POLICY = MetaflowCard.RELOAD_POLICY_ONCHANGE
546
+
545
547
  def __init__(self, options={}, components=[], graph=None):
546
548
  self._only_repr = True
547
549
  self._graph = None if graph is None else transform_flow_graph(graph)
548
550
  self._components = components
549
551
 
552
+ def reload_content_token(self, task, data):
553
+ """
554
+ The reload token will change when the component array has changed in the Metaflow card.
555
+ The change in the component array is signified by the change in the component_update_ts.
556
+ """
557
+ if task.finished:
558
+ return "final"
559
+ # `component_update_ts` will never be None. It is set to a default value when the `ComponentStore` is instantiated
560
+ # And it is updated when components added / removed / changed from the `ComponentStore`.
561
+ return "runtime-%s" % (str(data["component_update_ts"]))
562
+
550
563
  def render(self, task, stack_trace=None):
551
564
  RENDER_TEMPLATE = read_file(RENDER_TEMPLATE_PATH)
552
565
  JS_DATA = read_file(JS_PATH)
@@ -146,7 +146,7 @@ class Stub(with_metaclass(StubMetaClass, object)):
146
146
  return object.__getattribute__(self, name)
147
147
 
148
148
  def __getattr__(self, name):
149
- if name in DELETED_ATTRS:
149
+ if name in DELETED_ATTRS or self.___is_returned_exception___:
150
150
  raise AttributeError()
151
151
  return fwd_request(self, OP_GETATTR, name)
152
152
 
@@ -166,6 +166,8 @@ class Stub(with_metaclass(StubMetaClass, object)):
166
166
  ):
167
167
  object.__setattr__(self, name, value)
168
168
  else:
169
+ if self.___is_returned_exception___:
170
+ raise AttributeError()
169
171
  fwd_request(self, OP_SETATTR, name, value)
170
172
 
171
173
  def __dir__(self):
@@ -123,7 +123,7 @@ if __name__ == "__main__":
123
123
  [
124
124
  f"""set -e;
125
125
  export PATH=$PATH:$(pwd)/micromamba;
126
- micromamba run --prefix {prefix} pip --disable-pip-version-check install --root-user-action=ignore --no-compile {pypi_pkgs_dir}/*.whl"""
126
+ micromamba run --prefix {prefix} python -m pip --disable-pip-version-check install --root-user-action=ignore --no-compile {pypi_pkgs_dir}/*.whl --no-user"""
127
127
  ]
128
128
  )
129
129