metaflow 2.12.32__tar.gz → 2.12.34__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 (364) hide show
  1. {metaflow-2.12.32/metaflow.egg-info → metaflow-2.12.34}/PKG-INFO +2 -2
  2. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/flowspec.py +1 -0
  3. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/multicore_utils.py +31 -14
  4. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/argo/argo_workflows_deployer_objects.py +4 -8
  5. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/step_functions/step_functions_deployer_objects.py +4 -8
  6. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/datatools/s3/s3.py +12 -4
  7. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/events_decorator.py +1 -1
  8. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/runner/deployer_impl.py +4 -8
  9. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/runner/metaflow_runner.py +33 -29
  10. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/runner/subprocess_manager.py +58 -9
  11. metaflow-2.12.34/metaflow/runner/utils.py +302 -0
  12. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/util.py +5 -0
  13. metaflow-2.12.34/metaflow/version.py +1 -0
  14. {metaflow-2.12.32 → metaflow-2.12.34/metaflow.egg-info}/PKG-INFO +2 -2
  15. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow.egg-info/requires.txt +1 -1
  16. metaflow-2.12.32/metaflow/runner/utils.py +0 -160
  17. metaflow-2.12.32/metaflow/version.py +0 -1
  18. {metaflow-2.12.32 → metaflow-2.12.34}/LICENSE +0 -0
  19. {metaflow-2.12.32 → metaflow-2.12.34}/MANIFEST.in +0 -0
  20. {metaflow-2.12.32 → metaflow-2.12.34}/README.md +0 -0
  21. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/R.py +0 -0
  22. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/__init__.py +0 -0
  23. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/__init__.py +0 -0
  24. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/click/__init__.py +0 -0
  25. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  26. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/click/_compat.py +0 -0
  27. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/click/_termui_impl.py +0 -0
  28. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/click/_textwrap.py +0 -0
  29. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/click/_unicodefun.py +0 -0
  30. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/click/_winconsole.py +0 -0
  31. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/click/core.py +0 -0
  32. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/click/decorators.py +0 -0
  33. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/click/exceptions.py +0 -0
  34. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/click/formatting.py +0 -0
  35. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/click/globals.py +0 -0
  36. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/click/parser.py +0 -0
  37. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/click/termui.py +0 -0
  38. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/click/testing.py +0 -0
  39. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/click/types.py +0 -0
  40. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/click/utils.py +0 -0
  41. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
  42. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
  43. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
  44. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
  45. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
  46. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
  47. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
  48. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
  49. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
  50. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/packaging/__init__.py +0 -0
  51. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/packaging/_elffile.py +0 -0
  52. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  53. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  54. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/packaging/_parser.py +0 -0
  55. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/packaging/_structures.py +0 -0
  56. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  57. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/packaging/markers.py +0 -0
  58. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/packaging/py.typed +0 -0
  59. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/packaging/requirements.py +0 -0
  60. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/packaging/specifiers.py +0 -0
  61. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/packaging/tags.py +0 -0
  62. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/packaging/utils.py +0 -0
  63. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/packaging/version.py +0 -0
  64. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/typeguard/__init__.py +0 -0
  65. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/typeguard/_checkers.py +0 -0
  66. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/typeguard/_config.py +0 -0
  67. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/typeguard/_decorators.py +0 -0
  68. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
  69. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/typeguard/_functions.py +0 -0
  70. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/typeguard/_importhook.py +0 -0
  71. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/typeguard/_memo.py +0 -0
  72. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
  73. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/typeguard/_suppression.py +0 -0
  74. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/typeguard/_transformer.py +0 -0
  75. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
  76. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/typeguard/_utils.py +0 -0
  77. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/typeguard/py.typed +0 -0
  78. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/typing_extensions.py +0 -0
  79. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/v3_5/__init__.py +0 -0
  80. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
  81. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
  82. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/v3_5/zipp.py +0 -0
  83. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/v3_6/__init__.py +0 -0
  84. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  85. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  86. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  87. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  88. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  89. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  90. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  91. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  92. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  93. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  94. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/v3_6/zipp.py +0 -0
  95. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/_vendor/zipp.py +0 -0
  96. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/cards.py +0 -0
  97. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/cli.py +0 -0
  98. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/cli_args.py +0 -0
  99. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/client/__init__.py +0 -0
  100. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/client/core.py +0 -0
  101. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/client/filecache.py +0 -0
  102. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/clone_util.py +0 -0
  103. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/cmd/__init__.py +0 -0
  104. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/cmd/configure_cmd.py +0 -0
  105. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/cmd/develop/__init__.py +0 -0
  106. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/cmd/develop/stub_generator.py +0 -0
  107. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/cmd/develop/stubs.py +0 -0
  108. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/cmd/main_cli.py +0 -0
  109. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/cmd/tutorials_cmd.py +0 -0
  110. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/cmd/util.py +0 -0
  111. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/cmd_with_io.py +0 -0
  112. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/datastore/__init__.py +0 -0
  113. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/datastore/content_addressed_store.py +0 -0
  114. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/datastore/datastore_set.py +0 -0
  115. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/datastore/datastore_storage.py +0 -0
  116. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/datastore/exceptions.py +0 -0
  117. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/datastore/flow_datastore.py +0 -0
  118. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/datastore/inputs.py +0 -0
  119. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/datastore/task_datastore.py +0 -0
  120. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/debug.py +0 -0
  121. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/decorators.py +0 -0
  122. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/event_logger.py +0 -0
  123. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/events.py +0 -0
  124. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/exception.py +0 -0
  125. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/extension_support/__init__.py +0 -0
  126. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/extension_support/_empty_file.py +0 -0
  127. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/extension_support/cmd.py +0 -0
  128. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/extension_support/integrations.py +0 -0
  129. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/extension_support/plugins.py +0 -0
  130. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/graph.py +0 -0
  131. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/includefile.py +0 -0
  132. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/info_file.py +0 -0
  133. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/integrations.py +0 -0
  134. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/lint.py +0 -0
  135. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/metadata_provider/__init__.py +0 -0
  136. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/metadata_provider/heartbeat.py +0 -0
  137. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/metadata_provider/metadata.py +0 -0
  138. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/metadata_provider/util.py +0 -0
  139. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/metaflow_config.py +0 -0
  140. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/metaflow_config_funcs.py +0 -0
  141. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/metaflow_current.py +0 -0
  142. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/metaflow_environment.py +0 -0
  143. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/metaflow_profile.py +0 -0
  144. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/metaflow_version.py +0 -0
  145. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/mflog/__init__.py +0 -0
  146. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/mflog/mflog.py +0 -0
  147. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/mflog/save_logs.py +0 -0
  148. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/mflog/save_logs_periodically.py +0 -0
  149. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/mflog/tee.py +0 -0
  150. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/monitor.py +0 -0
  151. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/package.py +0 -0
  152. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/parameters.py +0 -0
  153. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/__init__.py +0 -0
  154. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/airflow/__init__.py +0 -0
  155. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/airflow/airflow.py +0 -0
  156. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  157. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  158. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  159. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/airflow/dag.py +0 -0
  160. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/airflow/exception.py +0 -0
  161. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  162. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  163. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  164. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
  165. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
  166. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
  167. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/argo/__init__.py +0 -0
  168. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/argo/argo_client.py +0 -0
  169. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/argo/argo_events.py +0 -0
  170. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/argo/argo_workflows.py +0 -0
  171. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/argo/argo_workflows_cli.py +0 -0
  172. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  173. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
  174. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/argo/capture_error.py +0 -0
  175. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/argo/generate_input_paths.py +0 -0
  176. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
  177. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/__init__.py +0 -0
  178. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/aws_client.py +0 -0
  179. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/aws_utils.py +0 -0
  180. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/batch/__init__.py +0 -0
  181. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/batch/batch.py +0 -0
  182. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  183. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  184. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/batch/batch_decorator.py +0 -0
  185. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  186. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  187. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  188. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  189. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  190. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  191. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  192. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  193. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
  194. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/step_functions/step_functions_cli.py +0 -0
  195. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  196. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  197. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
  198. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/azure/__init__.py +0 -0
  199. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/azure/azure_credential.py +0 -0
  200. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  201. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
  202. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/azure/azure_tail.py +0 -0
  203. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/azure/azure_utils.py +0 -0
  204. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  205. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/azure/includefile_support.py +0 -0
  206. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/__init__.py +0 -0
  207. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_cli.py +0 -0
  208. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_client.py +0 -0
  209. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_creator.py +0 -0
  210. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_datastore.py +0 -0
  211. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_decorator.py +0 -0
  212. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  213. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_modules/base.html +0 -0
  214. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_modules/basic.py +0 -0
  215. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
  216. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_modules/card.py +0 -0
  217. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  218. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  219. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  220. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  221. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  222. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_modules/components.py +0 -0
  223. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  224. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_modules/main.js +0 -0
  225. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  226. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  227. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_resolver.py +0 -0
  228. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_server.py +0 -0
  229. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
  230. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/component_serializer.py +0 -0
  231. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/cards/exception.py +0 -0
  232. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/catch_decorator.py +0 -0
  233. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/datastores/__init__.py +0 -0
  234. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/datastores/azure_storage.py +0 -0
  235. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/datastores/gs_storage.py +0 -0
  236. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/datastores/local_storage.py +0 -0
  237. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/datastores/s3_storage.py +0 -0
  238. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/datatools/__init__.py +0 -0
  239. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/datatools/local.py +0 -0
  240. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  241. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/datatools/s3/s3op.py +0 -0
  242. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  243. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  244. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/debug_logger.py +0 -0
  245. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/debug_monitor.py +0 -0
  246. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/__init__.py +0 -0
  247. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/client.py +0 -0
  248. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/client_modules.py +0 -0
  249. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  250. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  251. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  252. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  253. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  254. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  255. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  256. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  257. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  258. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  259. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/consts.py +0 -0
  260. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  261. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  262. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  263. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/server.py +0 -0
  264. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/stub.py +0 -0
  265. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/env_escape/utils.py +0 -0
  266. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/environment_decorator.py +0 -0
  267. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/frameworks/__init__.py +0 -0
  268. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/frameworks/pytorch.py +0 -0
  269. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/gcp/__init__.py +0 -0
  270. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
  271. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  272. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  273. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/gcp/gs_tail.py +0 -0
  274. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/gcp/gs_utils.py +0 -0
  275. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/gcp/includefile_support.py +0 -0
  276. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/kubernetes/__init__.py +0 -0
  277. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
  278. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/kubernetes/kubernetes.py +0 -0
  279. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/kubernetes/kubernetes_cli.py +0 -0
  280. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
  281. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/kubernetes/kubernetes_decorator.py +0 -0
  282. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/kubernetes/kubernetes_job.py +0 -0
  283. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +0 -0
  284. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/logs_cli.py +0 -0
  285. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/metadata_providers/__init__.py +0 -0
  286. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/metadata_providers/local.py +0 -0
  287. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/metadata_providers/service.py +0 -0
  288. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/package_cli.py +0 -0
  289. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/parallel_decorator.py +0 -0
  290. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/project_decorator.py +0 -0
  291. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/pypi/__init__.py +0 -0
  292. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/pypi/bootstrap.py +0 -0
  293. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/pypi/conda_decorator.py +0 -0
  294. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/pypi/conda_environment.py +0 -0
  295. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/pypi/micromamba.py +0 -0
  296. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/pypi/pip.py +0 -0
  297. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
  298. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  299. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/pypi/utils.py +0 -0
  300. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/resources_decorator.py +0 -0
  301. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/retry_decorator.py +0 -0
  302. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/secrets/__init__.py +0 -0
  303. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  304. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  305. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/storage_executor.py +0 -0
  306. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/tag_cli.py +0 -0
  307. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  308. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/plugins/timeout_decorator.py +0 -0
  309. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/procpoll.py +0 -0
  310. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/py.typed +0 -0
  311. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/pylint_wrapper.py +0 -0
  312. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/runner/__init__.py +0 -0
  313. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/runner/click_api.py +0 -0
  314. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/runner/deployer.py +0 -0
  315. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/runner/nbdeploy.py +0 -0
  316. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/runner/nbrun.py +0 -0
  317. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/runtime.py +0 -0
  318. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/sidecar/__init__.py +0 -0
  319. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/sidecar/sidecar.py +0 -0
  320. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/sidecar/sidecar_messages.py +0 -0
  321. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  322. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/sidecar/sidecar_worker.py +0 -0
  323. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/system/__init__.py +0 -0
  324. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/system/system_logger.py +0 -0
  325. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/system/system_monitor.py +0 -0
  326. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/system/system_utils.py +0 -0
  327. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tagging_util.py +0 -0
  328. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/task.py +0 -0
  329. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tracing/__init__.py +0 -0
  330. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tracing/propagator.py +0 -0
  331. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tracing/span_exporter.py +0 -0
  332. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tracing/tracing_modules.py +0 -0
  333. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tuple_util.py +0 -0
  334. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/00-helloworld/README.md +0 -0
  335. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  336. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/01-playlist/README.md +0 -0
  337. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  338. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  339. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  340. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/02-statistics/README.md +0 -0
  341. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  342. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  343. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/02-statistics/stats.py +0 -0
  344. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  345. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  346. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  347. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  348. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  349. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  350. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  351. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  352. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  353. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/07-worldview/README.md +0 -0
  354. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  355. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/08-autopilot/README.md +0 -0
  356. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  357. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/unbounded_foreach.py +0 -0
  358. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow/vendor.py +0 -0
  359. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow.egg-info/SOURCES.txt +0 -0
  360. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow.egg-info/dependency_links.txt +0 -0
  361. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow.egg-info/entry_points.txt +0 -0
  362. {metaflow-2.12.32 → metaflow-2.12.34}/metaflow.egg-info/top_level.txt +0 -0
  363. {metaflow-2.12.32 → metaflow-2.12.34}/setup.cfg +0 -0
  364. {metaflow-2.12.32 → metaflow-2.12.34}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: metaflow
3
- Version: 2.12.32
3
+ Version: 2.12.34
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.32; extra == "stubs"
29
+ Requires-Dist: metaflow-stubs==2.12.34; 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
 
@@ -38,6 +38,7 @@ INTERNAL_ARTIFACTS_SET = set(
38
38
  "_unbounded_foreach",
39
39
  "_control_mapper_tasks",
40
40
  "_control_task_is_mapper_zero",
41
+ "_parallel_ubf_iter",
41
42
  ]
42
43
  )
43
44
 
@@ -6,7 +6,18 @@ from tempfile import NamedTemporaryFile
6
6
  import time
7
7
  import metaflow.tracing as tracing
8
8
 
9
- from typing import Any, Callable, Iterable, Iterator, List, Optional
9
+ from typing import (
10
+ Any,
11
+ Callable,
12
+ Iterable,
13
+ Iterator,
14
+ List,
15
+ Optional,
16
+ NoReturn,
17
+ Tuple,
18
+ TypeVar,
19
+ Union,
20
+ )
10
21
 
11
22
  try:
12
23
  # Python 2
@@ -30,7 +41,13 @@ class MulticoreException(Exception):
30
41
  pass
31
42
 
32
43
 
33
- def _spawn(func, arg, dir):
44
+ _A = TypeVar("_A")
45
+ _R = TypeVar("_R")
46
+
47
+
48
+ def _spawn(
49
+ func: Callable[[_A], _R], arg: _A, dir: Optional[str]
50
+ ) -> Union[Tuple[int, str], NoReturn]:
34
51
  with NamedTemporaryFile(prefix="parallel_map_", dir=dir, delete=False) as tmpfile:
35
52
  output_file = tmpfile.name
36
53
 
@@ -63,11 +80,11 @@ def _spawn(func, arg, dir):
63
80
 
64
81
 
65
82
  def parallel_imap_unordered(
66
- func: Callable[[Any], Any],
67
- iterable: Iterable[Any],
83
+ func: Callable[[_A], _R],
84
+ iterable: Iterable[_A],
68
85
  max_parallel: Optional[int] = None,
69
86
  dir: Optional[str] = None,
70
- ) -> Iterator[Any]:
87
+ ) -> Iterator[_R]:
71
88
  """
72
89
  Parallelizes execution of a function using multiprocessing. The result
73
90
  order is not guaranteed.
@@ -79,9 +96,9 @@ def parallel_imap_unordered(
79
96
  iterable : Iterable[Any]
80
97
  Iterable over arguments to pass to fun
81
98
  max_parallel int, optional, default None
82
- Maximum parallelism. If not specified, uses the number of CPUs
99
+ Maximum parallelism. If not specified, it uses the number of CPUs
83
100
  dir : str, optional, default None
84
- If specified, directory where temporary files are created
101
+ If specified, it's the directory where temporary files are created
85
102
 
86
103
  Yields
87
104
  ------
@@ -121,14 +138,14 @@ def parallel_imap_unordered(
121
138
 
122
139
 
123
140
  def parallel_map(
124
- func: Callable[[Any], Any],
125
- iterable: Iterable[Any],
141
+ func: Callable[[_A], _R],
142
+ iterable: Iterable[_A],
126
143
  max_parallel: Optional[int] = None,
127
144
  dir: Optional[str] = None,
128
- ) -> List[Any]:
145
+ ) -> List[_R]:
129
146
  """
130
147
  Parallelizes execution of a function using multiprocessing. The result
131
- order is that of the arguments in `iterable`
148
+ order is that of the arguments in `iterable`.
132
149
 
133
150
  Parameters
134
151
  ----------
@@ -137,9 +154,9 @@ def parallel_map(
137
154
  iterable : Iterable[Any]
138
155
  Iterable over arguments to pass to fun
139
156
  max_parallel int, optional, default None
140
- Maximum parallelism. If not specified, uses the number of CPUs
157
+ Maximum parallelism. If not specified, it uses the number of CPUs
141
158
  dir : str, optional, default None
142
- If specified, directory where temporary files are created
159
+ If specified, it's the directory where temporary files are created
143
160
 
144
161
  Returns
145
162
  -------
@@ -155,4 +172,4 @@ def parallel_map(
155
172
  res = parallel_imap_unordered(
156
173
  wrapper, enumerate(iterable), max_parallel=max_parallel, dir=dir
157
174
  )
158
- return [r for idx, r in sorted(res)]
175
+ return [r for _, r in sorted(res)]
@@ -10,7 +10,7 @@ from metaflow.metaflow_config import KUBERNETES_NAMESPACE
10
10
  from metaflow.plugins.argo.argo_workflows import ArgoWorkflows
11
11
  from metaflow.runner.deployer import Deployer, DeployedFlow, TriggeredRun
12
12
 
13
- from metaflow.runner.utils import get_lower_level_group, handle_timeout
13
+ from metaflow.runner.utils import get_lower_level_group, handle_timeout, temporary_fifo
14
14
 
15
15
 
16
16
  def generate_fake_flow_file_contents(
@@ -341,18 +341,14 @@ class ArgoWorkflowsDeployedFlow(DeployedFlow):
341
341
  Exception
342
342
  If there is an error during the trigger process.
343
343
  """
344
- with tempfile.TemporaryDirectory() as temp_dir:
345
- tfp_runner_attribute = tempfile.NamedTemporaryFile(
346
- dir=temp_dir, delete=False
347
- )
348
-
344
+ with temporary_fifo() as (attribute_file_path, attribute_file_fd):
349
345
  # every subclass needs to have `self.deployer_kwargs`
350
346
  command = get_lower_level_group(
351
347
  self.deployer.api,
352
348
  self.deployer.top_level_kwargs,
353
349
  self.deployer.TYPE,
354
350
  self.deployer.deployer_kwargs,
355
- ).trigger(deployer_attribute_file=tfp_runner_attribute.name, **kwargs)
351
+ ).trigger(deployer_attribute_file=attribute_file_path, **kwargs)
356
352
 
357
353
  pid = self.deployer.spm.run_command(
358
354
  [sys.executable, *command],
@@ -363,7 +359,7 @@ class ArgoWorkflowsDeployedFlow(DeployedFlow):
363
359
 
364
360
  command_obj = self.deployer.spm.get(pid)
365
361
  content = handle_timeout(
366
- tfp_runner_attribute, command_obj, self.deployer.file_read_timeout
362
+ attribute_file_fd, command_obj, self.deployer.file_read_timeout
367
363
  )
368
364
 
369
365
  if command_obj.process.returncode == 0:
@@ -6,7 +6,7 @@ from typing import ClassVar, Optional, List
6
6
  from metaflow.plugins.aws.step_functions.step_functions import StepFunctions
7
7
  from metaflow.runner.deployer import DeployedFlow, TriggeredRun
8
8
 
9
- from metaflow.runner.utils import get_lower_level_group, handle_timeout
9
+ from metaflow.runner.utils import get_lower_level_group, handle_timeout, temporary_fifo
10
10
 
11
11
 
12
12
  class StepFunctionsTriggeredRun(TriggeredRun):
@@ -196,18 +196,14 @@ class StepFunctionsDeployedFlow(DeployedFlow):
196
196
  Exception
197
197
  If there is an error during the trigger process.
198
198
  """
199
- with tempfile.TemporaryDirectory() as temp_dir:
200
- tfp_runner_attribute = tempfile.NamedTemporaryFile(
201
- dir=temp_dir, delete=False
202
- )
203
-
199
+ with temporary_fifo() as (attribute_file_path, attribute_file_fd):
204
200
  # every subclass needs to have `self.deployer_kwargs`
205
201
  command = get_lower_level_group(
206
202
  self.deployer.api,
207
203
  self.deployer.top_level_kwargs,
208
204
  self.deployer.TYPE,
209
205
  self.deployer.deployer_kwargs,
210
- ).trigger(deployer_attribute_file=tfp_runner_attribute.name, **kwargs)
206
+ ).trigger(deployer_attribute_file=attribute_file_path, **kwargs)
211
207
 
212
208
  pid = self.deployer.spm.run_command(
213
209
  [sys.executable, *command],
@@ -218,7 +214,7 @@ class StepFunctionsDeployedFlow(DeployedFlow):
218
214
 
219
215
  command_obj = self.deployer.spm.get(pid)
220
216
  content = handle_timeout(
221
- tfp_runner_attribute, command_obj, self.deployer.file_read_timeout
217
+ attribute_file_fd, command_obj, self.deployer.file_read_timeout
222
218
  )
223
219
 
224
220
  if command_obj.process.returncode == 0:
@@ -600,7 +600,9 @@ class S3(object):
600
600
  # returned are Unicode.
601
601
  key = getattr(key_value, "key", key_value)
602
602
  if self._s3root is None:
603
- parsed = urlparse(to_unicode(key))
603
+ # NOTE: S3 allows fragments as part of object names, e.g. /dataset #1/data.txt
604
+ # Without allow_fragments=False the parsed.path for an object name with fragments is incomplete.
605
+ parsed = urlparse(to_unicode(key), allow_fragments=False)
604
606
  if parsed.scheme == "s3" and parsed.path:
605
607
  return key
606
608
  else:
@@ -765,7 +767,9 @@ class S3(object):
765
767
  """
766
768
 
767
769
  url = self._url(key)
768
- src = urlparse(url)
770
+ # NOTE: S3 allows fragments as part of object names, e.g. /dataset #1/data.txt
771
+ # Without allow_fragments=False the parsed src.path for an object name with fragments is incomplete.
772
+ src = urlparse(url, allow_fragments=False)
769
773
 
770
774
  def _info(s3, tmp):
771
775
  resp = s3.head_object(Bucket=src.netloc, Key=src.path.lstrip('/"'))
@@ -891,7 +895,9 @@ class S3(object):
891
895
  DOWNLOAD_MAX_CHUNK = 2 * 1024 * 1024 * 1024 - 1
892
896
 
893
897
  url, r = self._url_and_range(key)
894
- src = urlparse(url)
898
+ # NOTE: S3 allows fragments as part of object names, e.g. /dataset #1/data.txt
899
+ # Without allow_fragments=False the parsed src.path for an object name with fragments is incomplete.
900
+ src = urlparse(url, allow_fragments=False)
895
901
 
896
902
  def _download(s3, tmp):
897
903
  if r:
@@ -1173,7 +1179,9 @@ class S3(object):
1173
1179
  blob.close = lambda: None
1174
1180
 
1175
1181
  url = self._url(key)
1176
- src = urlparse(url)
1182
+ # NOTE: S3 allows fragments as part of object names, e.g. /dataset #1/data.txt
1183
+ # Without allow_fragments=False the parsed src.path for an object name with fragments is incomplete.
1184
+ src = urlparse(url, allow_fragments=False)
1177
1185
  extra_args = None
1178
1186
  if content_type or metadata or self._encryption:
1179
1187
  extra_args = {}
@@ -170,7 +170,7 @@ class TriggerDecorator(FlowDecorator):
170
170
  # process every event in events
171
171
  for event in self.attributes["events"]:
172
172
  processed_event = self.process_event_name(event)
173
- self.triggers.append("processed event", processed_event)
173
+ self.triggers.append(processed_event)
174
174
  elif callable(self.attributes["events"]) and not isinstance(
175
175
  self.attributes["events"], DeployTimeField
176
176
  ):
@@ -2,12 +2,11 @@ import importlib
2
2
  import json
3
3
  import os
4
4
  import sys
5
- import tempfile
6
5
 
7
6
  from typing import Any, ClassVar, Dict, Optional, TYPE_CHECKING, Type
8
7
 
9
8
  from .subprocess_manager import SubprocessManager
10
- from .utils import get_lower_level_group, handle_timeout
9
+ from .utils import get_lower_level_group, handle_timeout, temporary_fifo
11
10
 
12
11
  if TYPE_CHECKING:
13
12
  import metaflow.runner.deployer
@@ -121,14 +120,11 @@ class DeployerImpl(object):
121
120
  def _create(
122
121
  self, create_class: Type["metaflow.runner.deployer.DeployedFlow"], **kwargs
123
122
  ) -> "metaflow.runner.deployer.DeployedFlow":
124
- with tempfile.TemporaryDirectory() as temp_dir:
125
- tfp_runner_attribute = tempfile.NamedTemporaryFile(
126
- dir=temp_dir, delete=False
127
- )
123
+ with temporary_fifo() as (attribute_file_path, attribute_file_fd):
128
124
  # every subclass needs to have `self.deployer_kwargs`
129
125
  command = get_lower_level_group(
130
126
  self.api, self.top_level_kwargs, self.TYPE, self.deployer_kwargs
131
- ).create(deployer_attribute_file=tfp_runner_attribute.name, **kwargs)
127
+ ).create(deployer_attribute_file=attribute_file_path, **kwargs)
132
128
 
133
129
  pid = self.spm.run_command(
134
130
  [sys.executable, *command],
@@ -139,7 +135,7 @@ class DeployerImpl(object):
139
135
 
140
136
  command_obj = self.spm.get(pid)
141
137
  content = handle_timeout(
142
- tfp_runner_attribute, command_obj, self.file_read_timeout
138
+ attribute_file_fd, command_obj, self.file_read_timeout
143
139
  )
144
140
  content = json.loads(content)
145
141
  self.name = content.get("name")
@@ -2,13 +2,16 @@ import importlib
2
2
  import os
3
3
  import sys
4
4
  import json
5
- import tempfile
6
5
 
7
6
  from typing import Dict, Iterator, Optional, Tuple
8
7
 
9
8
  from metaflow import Run
10
9
 
11
- from .utils import handle_timeout
10
+ from .utils import (
11
+ temporary_fifo,
12
+ handle_timeout,
13
+ async_handle_timeout,
14
+ )
12
15
  from .subprocess_manager import CommandManager, SubprocessManager
13
16
 
14
17
 
@@ -267,9 +270,22 @@ class Runner(object):
267
270
  async def __aenter__(self) -> "Runner":
268
271
  return self
269
272
 
270
- def __get_executing_run(self, tfp_runner_attribute, command_obj):
271
- content = handle_timeout(
272
- tfp_runner_attribute, command_obj, self.file_read_timeout
273
+ def __get_executing_run(self, attribute_file_fd, command_obj):
274
+ content = handle_timeout(attribute_file_fd, command_obj, self.file_read_timeout)
275
+ content = json.loads(content)
276
+ pathspec = "%s/%s" % (content.get("flow_name"), content.get("run_id"))
277
+
278
+ # Set the correct metadata from the runner_attribute file corresponding to this run.
279
+ metadata_for_flow = content.get("metadata")
280
+
281
+ run_object = Run(
282
+ pathspec, _namespace_check=False, _current_metadata=metadata_for_flow
283
+ )
284
+ return ExecutingRun(self, command_obj, run_object)
285
+
286
+ async def __async_get_executing_run(self, attribute_file_fd, command_obj):
287
+ content = await async_handle_timeout(
288
+ attribute_file_fd, command_obj, self.file_read_timeout
273
289
  )
274
290
  content = json.loads(content)
275
291
  pathspec = "%s/%s" % (content.get("flow_name"), content.get("run_id"))
@@ -298,12 +314,9 @@ class Runner(object):
298
314
  ExecutingRun
299
315
  ExecutingRun containing the results of the run.
300
316
  """
301
- with tempfile.TemporaryDirectory() as temp_dir:
302
- tfp_runner_attribute = tempfile.NamedTemporaryFile(
303
- dir=temp_dir, delete=False
304
- )
317
+ with temporary_fifo() as (attribute_file_path, attribute_file_fd):
305
318
  command = self.api(**self.top_level_kwargs).run(
306
- runner_attribute_file=tfp_runner_attribute.name, **kwargs
319
+ runner_attribute_file=attribute_file_path, **kwargs
307
320
  )
308
321
 
309
322
  pid = self.spm.run_command(
@@ -314,7 +327,7 @@ class Runner(object):
314
327
  )
315
328
  command_obj = self.spm.get(pid)
316
329
 
317
- return self.__get_executing_run(tfp_runner_attribute, command_obj)
330
+ return self.__get_executing_run(attribute_file_fd, command_obj)
318
331
 
319
332
  def resume(self, **kwargs):
320
333
  """
@@ -332,12 +345,9 @@ class Runner(object):
332
345
  ExecutingRun
333
346
  ExecutingRun containing the results of the resumed run.
334
347
  """
335
- with tempfile.TemporaryDirectory() as temp_dir:
336
- tfp_runner_attribute = tempfile.NamedTemporaryFile(
337
- dir=temp_dir, delete=False
338
- )
348
+ with temporary_fifo() as (attribute_file_path, attribute_file_fd):
339
349
  command = self.api(**self.top_level_kwargs).resume(
340
- runner_attribute_file=tfp_runner_attribute.name, **kwargs
350
+ runner_attribute_file=attribute_file_path, **kwargs
341
351
  )
342
352
 
343
353
  pid = self.spm.run_command(
@@ -348,7 +358,7 @@ class Runner(object):
348
358
  )
349
359
  command_obj = self.spm.get(pid)
350
360
 
351
- return self.__get_executing_run(tfp_runner_attribute, command_obj)
361
+ return self.__get_executing_run(attribute_file_fd, command_obj)
352
362
 
353
363
  async def async_run(self, **kwargs) -> ExecutingRun:
354
364
  """
@@ -368,12 +378,9 @@ class Runner(object):
368
378
  ExecutingRun
369
379
  ExecutingRun representing the run that was started.
370
380
  """
371
- with tempfile.TemporaryDirectory() as temp_dir:
372
- tfp_runner_attribute = tempfile.NamedTemporaryFile(
373
- dir=temp_dir, delete=False
374
- )
381
+ with temporary_fifo() as (attribute_file_path, attribute_file_fd):
375
382
  command = self.api(**self.top_level_kwargs).run(
376
- runner_attribute_file=tfp_runner_attribute.name, **kwargs
383
+ runner_attribute_file=attribute_file_path, **kwargs
377
384
  )
378
385
 
379
386
  pid = await self.spm.async_run_command(
@@ -383,7 +390,7 @@ class Runner(object):
383
390
  )
384
391
  command_obj = self.spm.get(pid)
385
392
 
386
- return self.__get_executing_run(tfp_runner_attribute, command_obj)
393
+ return await self.__async_get_executing_run(attribute_file_fd, command_obj)
387
394
 
388
395
  async def async_resume(self, **kwargs):
389
396
  """
@@ -403,12 +410,9 @@ class Runner(object):
403
410
  ExecutingRun
404
411
  ExecutingRun representing the resumed run that was started.
405
412
  """
406
- with tempfile.TemporaryDirectory() as temp_dir:
407
- tfp_runner_attribute = tempfile.NamedTemporaryFile(
408
- dir=temp_dir, delete=False
409
- )
413
+ with temporary_fifo() as (attribute_file_path, attribute_file_fd):
410
414
  command = self.api(**self.top_level_kwargs).resume(
411
- runner_attribute_file=tfp_runner_attribute.name, **kwargs
415
+ runner_attribute_file=attribute_file_path, **kwargs
412
416
  )
413
417
 
414
418
  pid = await self.spm.async_run_command(
@@ -418,7 +422,7 @@ class Runner(object):
418
422
  )
419
423
  command_obj = self.spm.get(pid)
420
424
 
421
- return self.__get_executing_run(tfp_runner_attribute, command_obj)
425
+ return await self.__async_get_executing_run(attribute_file_fd, command_obj)
422
426
 
423
427
  def __exit__(self, exc_type, exc_value, traceback):
424
428
  self.spm.cleanup()
@@ -9,26 +9,61 @@ import tempfile
9
9
  import threading
10
10
  from typing import Callable, Dict, Iterator, List, Optional, Tuple
11
11
 
12
+ from .utils import check_process_exited
12
13
 
13
- def kill_process_and_descendants(pid, termination_timeout):
14
+
15
+ def kill_processes_and_descendants(pids: List[str], termination_timeout: float):
14
16
  # TODO: there's a race condition that new descendants might
15
17
  # spawn b/w the invocations of 'pkill' and 'kill'.
16
18
  # Needs to be fixed in future.
17
19
  try:
18
- subprocess.check_call(["pkill", "-TERM", "-P", str(pid)])
19
- subprocess.check_call(["kill", "-TERM", str(pid)])
20
+ subprocess.check_call(["pkill", "-TERM", "-P", *pids])
21
+ subprocess.check_call(["kill", "-TERM", *pids])
20
22
  except subprocess.CalledProcessError:
21
23
  pass
22
24
 
23
25
  time.sleep(termination_timeout)
24
26
 
25
27
  try:
26
- subprocess.check_call(["pkill", "-KILL", "-P", str(pid)])
27
- subprocess.check_call(["kill", "-KILL", str(pid)])
28
+ subprocess.check_call(["pkill", "-KILL", "-P", *pids])
29
+ subprocess.check_call(["kill", "-KILL", *pids])
28
30
  except subprocess.CalledProcessError:
29
31
  pass
30
32
 
31
33
 
34
+ async def async_kill_processes_and_descendants(
35
+ pids: List[str], termination_timeout: float
36
+ ):
37
+ # TODO: there's a race condition that new descendants might
38
+ # spawn b/w the invocations of 'pkill' and 'kill'.
39
+ # Needs to be fixed in future.
40
+ try:
41
+ sub_term = await asyncio.create_subprocess_exec("pkill", "-TERM", "-P", *pids)
42
+ await sub_term.wait()
43
+ except Exception:
44
+ pass
45
+
46
+ try:
47
+ main_term = await asyncio.create_subprocess_exec("kill", "-TERM", *pids)
48
+ await main_term.wait()
49
+ except Exception:
50
+ pass
51
+
52
+ await asyncio.sleep(termination_timeout)
53
+
54
+ try:
55
+ sub_kill = await asyncio.create_subprocess_exec("pkill", "-KILL", "-P", *pids)
56
+ await sub_kill.wait()
57
+ except Exception:
58
+ pass
59
+
60
+ try:
61
+ main_kill = await asyncio.create_subprocess_exec("kill", "-KILL", *pids)
62
+ await main_kill.wait()
63
+ except Exception:
64
+ pass
65
+
66
+
32
67
  class LogReadTimeoutError(Exception):
33
68
  """Exception raised when reading logs times out."""
34
69
 
@@ -46,14 +81,28 @@ class SubprocessManager(object):
46
81
  loop = asyncio.get_running_loop()
47
82
  loop.add_signal_handler(
48
83
  signal.SIGINT,
49
- lambda: self._handle_sigint(signum=signal.SIGINT, frame=None),
84
+ lambda: asyncio.create_task(self._async_handle_sigint()),
50
85
  )
51
86
  except RuntimeError:
52
87
  signal.signal(signal.SIGINT, self._handle_sigint)
53
88
 
89
+ async def _async_handle_sigint(self):
90
+ pids = [
91
+ str(command.process.pid)
92
+ for command in self.commands.values()
93
+ if command.process and not check_process_exited(command)
94
+ ]
95
+ if pids:
96
+ await async_kill_processes_and_descendants(pids, termination_timeout=2)
97
+
54
98
  def _handle_sigint(self, signum, frame):
55
- for each_command in self.commands.values():
56
- each_command.kill(termination_timeout=2)
99
+ pids = [
100
+ str(command.process.pid)
101
+ for command in self.commands.values()
102
+ if command.process and not check_process_exited(command)
103
+ ]
104
+ if pids:
105
+ kill_processes_and_descendants(pids, termination_timeout=2)
57
106
 
58
107
  async def __aenter__(self) -> "SubprocessManager":
59
108
  return self
@@ -472,7 +521,7 @@ class CommandManager(object):
472
521
  """
473
522
 
474
523
  if self.process is not None:
475
- kill_process_and_descendants(self.process.pid, termination_timeout)
524
+ kill_processes_and_descendants([str(self.process.pid)], termination_timeout)
476
525
  else:
477
526
  print("No process to kill.")
478
527