metaflow 2.12.25__tar.gz → 2.12.27__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 (360) hide show
  1. {metaflow-2.12.25/metaflow.egg-info → metaflow-2.12.27}/PKG-INFO +3 -3
  2. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/cli.py +4 -4
  3. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/client/core.py +83 -44
  4. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/metadata/metadata.py +6 -0
  5. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/argo/argo_client.py +25 -9
  6. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/argo/argo_workflows.py +4 -2
  7. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/argo/argo_workflows_cli.py +5 -17
  8. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/batch/batch_decorator.py +4 -0
  9. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/step_functions/step_functions_cli.py +2 -2
  10. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/azure/azure_tail.py +1 -1
  11. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_decorator.py +1 -0
  12. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/gcp/gs_tail.py +10 -6
  13. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/kubernetes/kubernetes.py +12 -1
  14. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/kubernetes/kubernetes_decorator.py +48 -11
  15. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/parallel_decorator.py +5 -4
  16. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/pypi/conda_environment.py +12 -4
  17. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/resources_decorator.py +2 -2
  18. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/tag_cli.py +1 -4
  19. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/runner/metaflow_runner.py +6 -16
  20. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/runner/nbdeploy.py +4 -6
  21. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/runner/nbrun.py +4 -6
  22. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/runner/utils.py +0 -5
  23. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/task.py +27 -18
  24. metaflow-2.12.27/metaflow/version.py +1 -0
  25. {metaflow-2.12.25 → metaflow-2.12.27/metaflow.egg-info}/PKG-INFO +3 -3
  26. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow.egg-info/requires.txt +1 -1
  27. {metaflow-2.12.25 → metaflow-2.12.27}/setup.py +1 -1
  28. metaflow-2.12.25/metaflow/version.py +0 -1
  29. {metaflow-2.12.25 → metaflow-2.12.27}/LICENSE +0 -0
  30. {metaflow-2.12.25 → metaflow-2.12.27}/MANIFEST.in +0 -0
  31. {metaflow-2.12.25 → metaflow-2.12.27}/README.md +0 -0
  32. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/R.py +0 -0
  33. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/__init__.py +0 -0
  34. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/__init__.py +0 -0
  35. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/click/__init__.py +0 -0
  36. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/click/_bashcomplete.py +0 -0
  37. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/click/_compat.py +0 -0
  38. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/click/_termui_impl.py +0 -0
  39. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/click/_textwrap.py +0 -0
  40. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/click/_unicodefun.py +0 -0
  41. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/click/_winconsole.py +0 -0
  42. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/click/core.py +0 -0
  43. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/click/decorators.py +0 -0
  44. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/click/exceptions.py +0 -0
  45. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/click/formatting.py +0 -0
  46. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/click/globals.py +0 -0
  47. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/click/parser.py +0 -0
  48. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/click/termui.py +0 -0
  49. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/click/testing.py +0 -0
  50. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/click/types.py +0 -0
  51. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/click/utils.py +0 -0
  52. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/importlib_metadata/__init__.py +0 -0
  53. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/importlib_metadata/_adapters.py +0 -0
  54. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/importlib_metadata/_collections.py +0 -0
  55. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/importlib_metadata/_compat.py +0 -0
  56. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/importlib_metadata/_functools.py +0 -0
  57. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/importlib_metadata/_itertools.py +0 -0
  58. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/importlib_metadata/_meta.py +0 -0
  59. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/importlib_metadata/_text.py +0 -0
  60. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/importlib_metadata/py.typed +0 -0
  61. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/packaging/__init__.py +0 -0
  62. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/packaging/_elffile.py +0 -0
  63. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/packaging/_manylinux.py +0 -0
  64. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/packaging/_musllinux.py +0 -0
  65. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/packaging/_parser.py +0 -0
  66. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/packaging/_structures.py +0 -0
  67. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/packaging/_tokenizer.py +0 -0
  68. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/packaging/markers.py +0 -0
  69. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/packaging/py.typed +0 -0
  70. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/packaging/requirements.py +0 -0
  71. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/packaging/specifiers.py +0 -0
  72. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/packaging/tags.py +0 -0
  73. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/packaging/utils.py +0 -0
  74. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/packaging/version.py +0 -0
  75. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/typeguard/__init__.py +0 -0
  76. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/typeguard/_checkers.py +0 -0
  77. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/typeguard/_config.py +0 -0
  78. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/typeguard/_decorators.py +0 -0
  79. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/typeguard/_exceptions.py +0 -0
  80. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/typeguard/_functions.py +0 -0
  81. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/typeguard/_importhook.py +0 -0
  82. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/typeguard/_memo.py +0 -0
  83. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/typeguard/_pytest_plugin.py +0 -0
  84. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/typeguard/_suppression.py +0 -0
  85. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/typeguard/_transformer.py +0 -0
  86. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/typeguard/_union_transformer.py +0 -0
  87. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/typeguard/_utils.py +0 -0
  88. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/typeguard/py.typed +0 -0
  89. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/typing_extensions.py +0 -0
  90. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/v3_5/__init__.py +0 -0
  91. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/v3_5/importlib_metadata/__init__.py +0 -0
  92. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/v3_5/importlib_metadata/_compat.py +0 -0
  93. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/v3_5/zipp.py +0 -0
  94. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/v3_6/__init__.py +0 -0
  95. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/v3_6/importlib_metadata/__init__.py +0 -0
  96. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/v3_6/importlib_metadata/_adapters.py +0 -0
  97. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/v3_6/importlib_metadata/_collections.py +0 -0
  98. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/v3_6/importlib_metadata/_compat.py +0 -0
  99. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/v3_6/importlib_metadata/_functools.py +0 -0
  100. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/v3_6/importlib_metadata/_itertools.py +0 -0
  101. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/v3_6/importlib_metadata/_meta.py +0 -0
  102. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/v3_6/importlib_metadata/_text.py +0 -0
  103. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/v3_6/importlib_metadata/py.typed +0 -0
  104. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/v3_6/typing_extensions.py +0 -0
  105. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/v3_6/zipp.py +0 -0
  106. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/_vendor/zipp.py +0 -0
  107. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/cards.py +0 -0
  108. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/cli_args.py +0 -0
  109. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/client/__init__.py +0 -0
  110. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/client/filecache.py +0 -0
  111. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/clone_util.py +0 -0
  112. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/cmd/__init__.py +0 -0
  113. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/cmd/configure_cmd.py +0 -0
  114. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/cmd/develop/__init__.py +0 -0
  115. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/cmd/develop/stub_generator.py +0 -0
  116. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/cmd/develop/stubs.py +0 -0
  117. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/cmd/main_cli.py +0 -0
  118. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/cmd/tutorials_cmd.py +0 -0
  119. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/cmd/util.py +0 -0
  120. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/cmd_with_io.py +0 -0
  121. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/datastore/__init__.py +0 -0
  122. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/datastore/content_addressed_store.py +0 -0
  123. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/datastore/datastore_set.py +0 -0
  124. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/datastore/datastore_storage.py +0 -0
  125. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/datastore/exceptions.py +0 -0
  126. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/datastore/flow_datastore.py +0 -0
  127. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/datastore/inputs.py +0 -0
  128. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/datastore/task_datastore.py +0 -0
  129. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/debug.py +0 -0
  130. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/decorators.py +0 -0
  131. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/event_logger.py +0 -0
  132. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/events.py +0 -0
  133. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/exception.py +0 -0
  134. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/extension_support/__init__.py +0 -0
  135. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/extension_support/_empty_file.py +0 -0
  136. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/extension_support/cmd.py +0 -0
  137. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/extension_support/integrations.py +0 -0
  138. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/extension_support/plugins.py +0 -0
  139. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/flowspec.py +0 -0
  140. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/graph.py +0 -0
  141. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/includefile.py +0 -0
  142. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/info_file.py +0 -0
  143. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/integrations.py +0 -0
  144. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/lint.py +0 -0
  145. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/metadata/__init__.py +0 -0
  146. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/metadata/heartbeat.py +0 -0
  147. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/metadata/util.py +0 -0
  148. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/metaflow_config.py +0 -0
  149. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/metaflow_config_funcs.py +0 -0
  150. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/metaflow_current.py +0 -0
  151. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/metaflow_environment.py +0 -0
  152. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/metaflow_profile.py +0 -0
  153. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/metaflow_version.py +0 -0
  154. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/mflog/__init__.py +0 -0
  155. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/mflog/mflog.py +0 -0
  156. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/mflog/save_logs.py +0 -0
  157. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/mflog/save_logs_periodically.py +0 -0
  158. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/mflog/tee.py +0 -0
  159. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/monitor.py +0 -0
  160. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/multicore_utils.py +0 -0
  161. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/package.py +0 -0
  162. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/parameters.py +0 -0
  163. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/__init__.py +0 -0
  164. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/airflow/__init__.py +0 -0
  165. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/airflow/airflow.py +0 -0
  166. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/airflow/airflow_cli.py +0 -0
  167. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/airflow/airflow_decorator.py +0 -0
  168. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/airflow/airflow_utils.py +0 -0
  169. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/airflow/dag.py +0 -0
  170. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/airflow/exception.py +0 -0
  171. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/airflow/plumbing/__init__.py +0 -0
  172. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/airflow/plumbing/set_parameters.py +0 -0
  173. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/airflow/sensors/__init__.py +0 -0
  174. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/airflow/sensors/base_sensor.py +0 -0
  175. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/airflow/sensors/external_task_sensor.py +0 -0
  176. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/airflow/sensors/s3_sensor.py +0 -0
  177. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/argo/__init__.py +0 -0
  178. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/argo/argo_events.py +0 -0
  179. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/argo/argo_workflows_decorator.py +0 -0
  180. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/argo/argo_workflows_deployer.py +0 -0
  181. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/argo/capture_error.py +0 -0
  182. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/argo/generate_input_paths.py +0 -0
  183. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/argo/jobset_input_paths.py +0 -0
  184. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/__init__.py +0 -0
  185. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/aws_client.py +0 -0
  186. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/aws_utils.py +0 -0
  187. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/batch/__init__.py +0 -0
  188. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/batch/batch.py +0 -0
  189. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/batch/batch_cli.py +0 -0
  190. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/batch/batch_client.py +0 -0
  191. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/secrets_manager/__init__.py +0 -0
  192. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/secrets_manager/aws_secrets_manager_secrets_provider.py +0 -0
  193. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/step_functions/__init__.py +0 -0
  194. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/step_functions/dynamo_db_client.py +0 -0
  195. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/step_functions/event_bridge_client.py +0 -0
  196. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/step_functions/production_token.py +0 -0
  197. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/step_functions/schedule_decorator.py +0 -0
  198. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/step_functions/set_batch_environment.py +0 -0
  199. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/step_functions/step_functions.py +0 -0
  200. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/step_functions/step_functions_client.py +0 -0
  201. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/step_functions/step_functions_decorator.py +0 -0
  202. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/aws/step_functions/step_functions_deployer.py +0 -0
  203. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/azure/__init__.py +0 -0
  204. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/azure/azure_credential.py +0 -0
  205. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/azure/azure_exceptions.py +0 -0
  206. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/azure/azure_secret_manager_secrets_provider.py +0 -0
  207. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/azure/azure_utils.py +0 -0
  208. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/azure/blob_service_client_factory.py +0 -0
  209. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/azure/includefile_support.py +0 -0
  210. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/__init__.py +0 -0
  211. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_cli.py +0 -0
  212. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_client.py +0 -0
  213. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_creator.py +0 -0
  214. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_datastore.py +0 -0
  215. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_modules/__init__.py +0 -0
  216. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_modules/base.html +0 -0
  217. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_modules/basic.py +0 -0
  218. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_modules/bundle.css +0 -0
  219. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_modules/card.py +0 -0
  220. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_modules/chevron/__init__.py +0 -0
  221. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_modules/chevron/main.py +0 -0
  222. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_modules/chevron/metadata.py +0 -0
  223. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_modules/chevron/renderer.py +0 -0
  224. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_modules/chevron/tokenizer.py +0 -0
  225. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_modules/components.py +0 -0
  226. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_modules/convert_to_native_type.py +0 -0
  227. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_modules/main.js +0 -0
  228. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_modules/renderer_tools.py +0 -0
  229. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_modules/test_cards.py +0 -0
  230. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_resolver.py +0 -0
  231. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_server.py +0 -0
  232. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/card_viewer/viewer.html +0 -0
  233. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/component_serializer.py +0 -0
  234. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/cards/exception.py +0 -0
  235. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/catch_decorator.py +0 -0
  236. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/datastores/__init__.py +0 -0
  237. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/datastores/azure_storage.py +0 -0
  238. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/datastores/gs_storage.py +0 -0
  239. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/datastores/local_storage.py +0 -0
  240. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/datastores/s3_storage.py +0 -0
  241. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/datatools/__init__.py +0 -0
  242. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/datatools/local.py +0 -0
  243. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/datatools/s3/__init__.py +0 -0
  244. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/datatools/s3/s3.py +0 -0
  245. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/datatools/s3/s3op.py +0 -0
  246. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/datatools/s3/s3tail.py +0 -0
  247. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/datatools/s3/s3util.py +0 -0
  248. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/debug_logger.py +0 -0
  249. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/debug_monitor.py +0 -0
  250. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/__init__.py +0 -0
  251. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/client.py +0 -0
  252. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/client_modules.py +0 -0
  253. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/communication/__init__.py +0 -0
  254. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/communication/bytestream.py +0 -0
  255. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/communication/channel.py +0 -0
  256. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/communication/socket_bytestream.py +0 -0
  257. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/communication/utils.py +0 -0
  258. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/configurations/emulate_test_lib/__init__.py +0 -0
  259. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/configurations/emulate_test_lib/overrides.py +0 -0
  260. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/configurations/emulate_test_lib/server_mappings.py +0 -0
  261. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/configurations/test_lib_impl/__init__.py +0 -0
  262. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/configurations/test_lib_impl/test_lib.py +0 -0
  263. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/consts.py +0 -0
  264. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/data_transferer.py +0 -0
  265. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/exception_transferer.py +0 -0
  266. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/override_decorators.py +0 -0
  267. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/server.py +0 -0
  268. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/stub.py +0 -0
  269. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/env_escape/utils.py +0 -0
  270. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/environment_decorator.py +0 -0
  271. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/events_decorator.py +0 -0
  272. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/frameworks/__init__.py +0 -0
  273. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/frameworks/pytorch.py +0 -0
  274. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/gcp/__init__.py +0 -0
  275. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/gcp/gcp_secret_manager_secrets_provider.py +0 -0
  276. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/gcp/gs_exceptions.py +0 -0
  277. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/gcp/gs_storage_client_factory.py +0 -0
  278. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/gcp/gs_utils.py +0 -0
  279. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/gcp/includefile_support.py +0 -0
  280. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/kubernetes/__init__.py +0 -0
  281. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/kubernetes/kube_utils.py +0 -0
  282. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/kubernetes/kubernetes_cli.py +0 -0
  283. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/kubernetes/kubernetes_client.py +0 -0
  284. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/kubernetes/kubernetes_job.py +0 -0
  285. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/kubernetes/kubernetes_jobsets.py +0 -0
  286. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/logs_cli.py +0 -0
  287. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/metadata/__init__.py +0 -0
  288. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/metadata/local.py +0 -0
  289. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/metadata/service.py +0 -0
  290. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/package_cli.py +0 -0
  291. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/project_decorator.py +0 -0
  292. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/pypi/__init__.py +0 -0
  293. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/pypi/bootstrap.py +0 -0
  294. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/pypi/conda_decorator.py +0 -0
  295. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/pypi/micromamba.py +0 -0
  296. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/pypi/pip.py +0 -0
  297. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/pypi/pypi_decorator.py +0 -0
  298. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/pypi/pypi_environment.py +0 -0
  299. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/pypi/utils.py +0 -0
  300. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/retry_decorator.py +0 -0
  301. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/secrets/__init__.py +0 -0
  302. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/secrets/inline_secrets_provider.py +0 -0
  303. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/secrets/secrets_decorator.py +0 -0
  304. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/storage_executor.py +0 -0
  305. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/test_unbounded_foreach_decorator.py +0 -0
  306. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/plugins/timeout_decorator.py +0 -0
  307. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/procpoll.py +0 -0
  308. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/py.typed +0 -0
  309. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/pylint_wrapper.py +0 -0
  310. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/runner/__init__.py +0 -0
  311. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/runner/click_api.py +0 -0
  312. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/runner/deployer.py +0 -0
  313. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/runner/subprocess_manager.py +0 -0
  314. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/runtime.py +0 -0
  315. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/sidecar/__init__.py +0 -0
  316. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/sidecar/sidecar.py +0 -0
  317. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/sidecar/sidecar_messages.py +0 -0
  318. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/sidecar/sidecar_subprocess.py +0 -0
  319. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/sidecar/sidecar_worker.py +0 -0
  320. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/system/__init__.py +0 -0
  321. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/system/system_logger.py +0 -0
  322. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/system/system_monitor.py +0 -0
  323. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/system/system_utils.py +0 -0
  324. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tagging_util.py +0 -0
  325. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tracing/__init__.py +0 -0
  326. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tracing/propagator.py +0 -0
  327. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tracing/span_exporter.py +0 -0
  328. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tracing/tracing_modules.py +0 -0
  329. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tuple_util.py +0 -0
  330. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/00-helloworld/README.md +0 -0
  331. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/00-helloworld/helloworld.py +0 -0
  332. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/01-playlist/README.md +0 -0
  333. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/01-playlist/movies.csv +0 -0
  334. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/01-playlist/playlist.ipynb +0 -0
  335. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/01-playlist/playlist.py +0 -0
  336. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/02-statistics/README.md +0 -0
  337. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/02-statistics/movies.csv +0 -0
  338. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/02-statistics/stats.ipynb +0 -0
  339. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/02-statistics/stats.py +0 -0
  340. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/03-playlist-redux/README.md +0 -0
  341. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/03-playlist-redux/playlist.py +0 -0
  342. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/04-playlist-plus/README.md +0 -0
  343. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/04-playlist-plus/playlist.py +0 -0
  344. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/05-hello-cloud/README.md +0 -0
  345. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/05-hello-cloud/hello-cloud.ipynb +0 -0
  346. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/05-hello-cloud/hello-cloud.py +0 -0
  347. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/06-statistics-redux/README.md +0 -0
  348. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/06-statistics-redux/stats.ipynb +0 -0
  349. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/07-worldview/README.md +0 -0
  350. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/07-worldview/worldview.ipynb +0 -0
  351. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/08-autopilot/README.md +0 -0
  352. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/tutorials/08-autopilot/autopilot.ipynb +0 -0
  353. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/unbounded_foreach.py +0 -0
  354. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/util.py +0 -0
  355. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow/vendor.py +0 -0
  356. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow.egg-info/SOURCES.txt +0 -0
  357. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow.egg-info/dependency_links.txt +0 -0
  358. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow.egg-info/entry_points.txt +0 -0
  359. {metaflow-2.12.25 → metaflow-2.12.27}/metaflow.egg-info/top_level.txt +0 -0
  360. {metaflow-2.12.25 → metaflow-2.12.27}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: metaflow
3
- Version: 2.12.25
3
+ Version: 2.12.27
4
4
  Summary: Metaflow: More Data Science, Less Engineering
5
5
  Author: Metaflow Developers
6
6
  Author-email: help@metaflow.org
@@ -13,7 +13,6 @@ Classifier: License :: OSI Approved :: Apache Software License
13
13
  Classifier: Operating System :: MacOS :: MacOS X
14
14
  Classifier: Operating System :: POSIX :: Linux
15
15
  Classifier: Programming Language :: Python :: 3
16
- Classifier: Programming Language :: Python :: 3.5
17
16
  Classifier: Programming Language :: Python :: 3.6
18
17
  Classifier: Programming Language :: Python :: 3.7
19
18
  Classifier: Programming Language :: Python :: 3.8
@@ -21,12 +20,13 @@ Classifier: Programming Language :: Python :: 3.9
21
20
  Classifier: Programming Language :: Python :: 3.10
22
21
  Classifier: Programming Language :: Python :: 3.11
23
22
  Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
24
  Description-Content-Type: text/markdown
25
25
  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.25; extra == "stubs"
29
+ Requires-Dist: metaflow-stubs==2.12.27; 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
 
@@ -701,12 +701,12 @@ def resume(
701
701
  runtime.persist_constants()
702
702
 
703
703
  if runner_attribute_file:
704
- with open(runner_attribute_file, "w") as f:
704
+ with open(runner_attribute_file, "w", encoding="utf-8") as f:
705
705
  json.dump(
706
706
  {
707
707
  "run_id": runtime.run_id,
708
708
  "flow_name": obj.flow.name,
709
- "metadata": get_metadata(),
709
+ "metadata": obj.metadata.metadata_str(),
710
710
  },
711
711
  f,
712
712
  )
@@ -779,12 +779,12 @@ def run(
779
779
  runtime.persist_constants()
780
780
 
781
781
  if runner_attribute_file:
782
- with open(runner_attribute_file, "w") as f:
782
+ with open(runner_attribute_file, "w", encoding="utf-8") as f:
783
783
  json.dump(
784
784
  {
785
785
  "run_id": runtime.run_id,
786
786
  "flow_name": obj.flow.name,
787
- "metadata": get_metadata(),
787
+ "metadata": obj.metadata.metadata_str(),
788
788
  },
789
789
  f,
790
790
  )
@@ -16,6 +16,7 @@ from typing import (
16
16
  List,
17
17
  NamedTuple,
18
18
  Optional,
19
+ TYPE_CHECKING,
19
20
  Tuple,
20
21
  )
21
22
 
@@ -37,6 +38,9 @@ from metaflow.util import cached_property, is_stringish, resolve_identity, to_un
37
38
  from ..info_file import INFO_FILE
38
39
  from .filecache import FileCache
39
40
 
41
+ if TYPE_CHECKING:
42
+ from metaflow.metadata import MetadataProvider
43
+
40
44
  try:
41
45
  # python2
42
46
  import cPickle as pickle
@@ -82,28 +86,16 @@ def metadata(ms: str) -> str:
82
86
  get_metadata()).
83
87
  """
84
88
  global current_metadata
85
- infos = ms.split("@", 1)
86
- types = [m.TYPE for m in METADATA_PROVIDERS]
87
- if infos[0] in types:
88
- current_metadata = [m for m in METADATA_PROVIDERS if m.TYPE == infos[0]][0]
89
- if len(infos) > 1:
90
- current_metadata.INFO = infos[1]
91
- else:
92
- # Deduce from ms; if starts with http, use service or else use local
93
- if ms.startswith("http"):
94
- metadata_type = "service"
95
- else:
96
- metadata_type = "local"
97
- res = [m for m in METADATA_PROVIDERS if m.TYPE == metadata_type]
98
- if not res:
99
- print(
100
- "Cannot find a '%s' metadata provider -- "
101
- "try specifying one explicitly using <type>@<info>",
102
- metadata_type,
103
- )
104
- return get_metadata()
105
- current_metadata = res[0]
106
- current_metadata.INFO = ms
89
+ provider, info = _metadata(ms)
90
+ if provider is None:
91
+ print(
92
+ "Cannot find a metadata provider -- "
93
+ "try specifying one explicitly using <type>@<info>",
94
+ )
95
+ return get_metadata()
96
+ current_metadata = provider
97
+ if info:
98
+ current_metadata.INFO = info
107
99
  return get_metadata()
108
100
 
109
101
 
@@ -127,7 +119,7 @@ def get_metadata() -> str:
127
119
  """
128
120
  if current_metadata is False:
129
121
  default_metadata()
130
- return "%s@%s" % (current_metadata.TYPE, current_metadata.INFO)
122
+ return current_metadata.metadata_str()
131
123
 
132
124
 
133
125
  def default_metadata() -> str:
@@ -268,9 +260,16 @@ class MetaflowObject(object):
268
260
  _object: Optional["MetaflowObject"] = None,
269
261
  _parent: Optional["MetaflowObject"] = None,
270
262
  _namespace_check: bool = True,
263
+ _metaflow: Optional["Metaflow"] = None,
271
264
  _current_namespace: Optional[str] = None,
265
+ _current_metadata: Optional[str] = None,
272
266
  ):
273
- self._metaflow = Metaflow()
267
+ # the default namespace is activated lazily at the first
268
+ # get_namespace(). The other option of activating
269
+ # the namespace at the import time is problematic, since there
270
+ # may be other modules that alter environment variables etc.
271
+ # which may affect the namespace setting.
272
+ self._metaflow = Metaflow(_current_metadata) or _metaflow
274
273
  self._parent = _parent
275
274
  self._path_components = None
276
275
  self._attempt = attempt
@@ -390,6 +389,7 @@ class MetaflowObject(object):
390
389
  attempt=self._attempt,
391
390
  _object=obj,
392
391
  _parent=self,
392
+ _metaflow=self._metaflow,
393
393
  _namespace_check=self._namespace_check,
394
394
  _current_namespace=(
395
395
  self._current_namespace if self._namespace_check else None
@@ -505,6 +505,7 @@ class MetaflowObject(object):
505
505
  attempt=self._attempt,
506
506
  _object=obj,
507
507
  _parent=self,
508
+ _metaflow=self._metaflow,
508
509
  _namespace_check=self._namespace_check,
509
510
  _current_namespace=(
510
511
  self._current_namespace if self._namespace_check else None
@@ -552,7 +553,25 @@ class MetaflowObject(object):
552
553
  _current_namespace=ns,
553
554
  )
554
555
 
555
- _UNPICKLE_FUNC = {"2.8.4": _unpickle_284, "2.12.4": _unpickle_2124}
556
+ def _unpickle_21227(self, data):
557
+ if len(data) != 5:
558
+ raise MetaflowInternalError(
559
+ "Unexpected size of array: {}".format(len(data))
560
+ )
561
+ pathspec, attempt, md, ns, namespace_check = data
562
+ self.__init__(
563
+ pathspec=pathspec,
564
+ attempt=attempt,
565
+ _namespace_check=namespace_check,
566
+ _current_metadata=md,
567
+ _current_namespace=ns,
568
+ )
569
+
570
+ _UNPICKLE_FUNC = {
571
+ "2.8.4": _unpickle_284,
572
+ "2.12.4": _unpickle_2124,
573
+ "2.12.27": _unpickle_21227,
574
+ }
556
575
 
557
576
  def __setstate__(self, state):
558
577
  """
@@ -595,10 +614,11 @@ class MetaflowObject(object):
595
614
  # checking for the namespace even after unpickling since we will know which
596
615
  # namespace to check.
597
616
  return {
598
- "version": "2.12.4",
617
+ "version": "2.12.27",
599
618
  "data": [
600
619
  self.pathspec,
601
620
  self._attempt,
621
+ self._metaflow.metadata.metadata_str(),
602
622
  self._current_namespace,
603
623
  self._namespace_check,
604
624
  ],
@@ -670,7 +690,7 @@ class MetaflowObject(object):
670
690
  origin_pathspec = None
671
691
  if self._NAME == "run":
672
692
  latest_step = next(self.steps())
673
- if latest_step:
693
+ if latest_step and latest_step.task:
674
694
  # If we had a step
675
695
  task = latest_step.task
676
696
  origin_run_id = [
@@ -1888,9 +1908,10 @@ class Run(MetaflowObject):
1888
1908
  # TODO: A more optimized way of figuring out if a run has remote steps (and thus a codepackage) available.
1889
1909
  # This might require changes to the metadata-service as well.
1890
1910
  for step in self:
1891
- code = step.task.code
1892
- if code:
1893
- return code
1911
+ if step.task:
1912
+ code = step.task.code
1913
+ if code:
1914
+ return code
1894
1915
 
1895
1916
  @property
1896
1917
  def data(self) -> Optional[MetaflowData]:
@@ -2152,7 +2173,7 @@ class Run(MetaflowObject):
2152
2173
  Trigger, optional
2153
2174
  Container of triggering events
2154
2175
  """
2155
- if "start" in self:
2176
+ if "start" in self and self["start"].task:
2156
2177
  meta = self["start"].task.metadata_dict.get("execution-triggers")
2157
2178
  if meta:
2158
2179
  return Trigger(json.loads(meta))
@@ -2287,17 +2308,16 @@ class Metaflow(object):
2287
2308
  if it has at least one run in the namespace.
2288
2309
  """
2289
2310
 
2290
- def __init__(self):
2291
- # the default namespace is activated lazily at the first object
2292
- # invocation or get_namespace(). The other option of activating
2293
- # the namespace at the import time is problematic, since there
2294
- # may be other modules that alter environment variables etc.
2295
- # which may affect the namescape setting.
2296
- if current_namespace is False:
2297
- default_namespace()
2298
- if current_metadata is False:
2299
- default_metadata()
2300
- self.metadata = current_metadata
2311
+ def __init__(self, _current_metadata: Optional[str] = None):
2312
+ if _current_metadata:
2313
+ provider, info = _metadata(_current_metadata)
2314
+ self.metadata = provider
2315
+ if info:
2316
+ self.metadata.INFO = info
2317
+ else:
2318
+ if current_metadata is False:
2319
+ default_metadata()
2320
+ self.metadata = current_metadata
2301
2321
 
2302
2322
  @property
2303
2323
  def flows(self) -> List[Flow]:
@@ -2334,7 +2354,7 @@ class Metaflow(object):
2334
2354
  all_flows = all_flows if all_flows else []
2335
2355
  for flow in all_flows:
2336
2356
  try:
2337
- v = Flow(_object=flow)
2357
+ v = Flow(_object=flow, _metaflow=self)
2338
2358
  yield v
2339
2359
  except MetaflowNamespaceMismatch:
2340
2360
  continue
@@ -2358,7 +2378,26 @@ class Metaflow(object):
2358
2378
  Flow
2359
2379
  Flow with the given name.
2360
2380
  """
2361
- return Flow(name)
2381
+ return Flow(name, _metaflow=self)
2382
+
2383
+
2384
+ def _metadata(ms: str) -> Tuple[Optional["MetadataProvider"], Optional[str]]:
2385
+ infos = ms.split("@", 1)
2386
+ types = [m.TYPE for m in METADATA_PROVIDERS]
2387
+ if infos[0] in types:
2388
+ provider = [m for m in METADATA_PROVIDERS if m.TYPE == infos[0]][0]
2389
+ if len(infos) > 1:
2390
+ return provider, infos[1]
2391
+ return provider, None
2392
+ # Deduce from ms; if starts with http, use service or else use local
2393
+ if ms.startswith("http"):
2394
+ metadata_type = "service"
2395
+ else:
2396
+ metadata_type = "local"
2397
+ res = [m for m in METADATA_PROVIDERS if m.TYPE == metadata_type]
2398
+ if not res:
2399
+ return None, None
2400
+ return res[0], ms
2362
2401
 
2363
2402
 
2364
2403
  _CLASSES["flow"] = Flow
@@ -76,6 +76,12 @@ class ObjectOrder:
76
76
 
77
77
  @with_metaclass(MetadataProviderMeta)
78
78
  class MetadataProvider(object):
79
+ TYPE = None
80
+
81
+ @classmethod
82
+ def metadata_str(cls):
83
+ return "%s@%s" % (cls.TYPE, cls.INFO)
84
+
79
85
  @classmethod
80
86
  def compute_info(cls, val):
81
87
  """
@@ -10,6 +10,14 @@ class ArgoClientException(MetaflowException):
10
10
  headline = "Argo Client error"
11
11
 
12
12
 
13
+ class ArgoResourceNotFound(MetaflowException):
14
+ headline = "Resource not found"
15
+
16
+
17
+ class ArgoNotPermitted(MetaflowException):
18
+ headline = "Operation not permitted"
19
+
20
+
13
21
  class ArgoClient(object):
14
22
  def __init__(self, namespace=None):
15
23
  self._client = KubernetesClient()
@@ -140,9 +148,7 @@ class ArgoClient(object):
140
148
  if e.status == 404:
141
149
  return None
142
150
  else:
143
- raise ArgoClientException(
144
- json.loads(e.body)["message"] if e.body is not None else e.reason
145
- )
151
+ raise wrap_api_error(e)
146
152
 
147
153
  def delete_workflow_template(self, name):
148
154
  """
@@ -164,9 +170,7 @@ class ArgoClient(object):
164
170
  if e.status == 404:
165
171
  return None
166
172
  else:
167
- raise ArgoClientException(
168
- json.loads(e.body)["message"] if e.body is not None else e.reason
169
- )
173
+ raise wrap_api_error(e)
170
174
 
171
175
  def terminate_workflow(self, name):
172
176
  client = self._client.get()
@@ -428,6 +432,18 @@ class ArgoClient(object):
428
432
  except client.rest.ApiException as e:
429
433
  if e.status == 404:
430
434
  return None
431
- raise ArgoClientException(
432
- json.loads(e.body)["message"] if e.body is not None else e.reason
433
- )
435
+ raise wrap_api_error(e)
436
+
437
+
438
+ def wrap_api_error(error):
439
+ message = (
440
+ json.loads(error.body)["message"] if error.body is not None else error.reason
441
+ )
442
+ # catch all
443
+ ex = ArgoClientException(message)
444
+ if error.status == 404:
445
+ # usually handled outside this function as most cases want to return None instead.
446
+ ex = ArgoResourceNotFound(message)
447
+ if error.status == 403:
448
+ ex = ArgoNotPermitted(message)
449
+ return ex
@@ -2288,7 +2288,9 @@ class ArgoWorkflows(object):
2288
2288
  and k not in set(ARGO_WORKFLOWS_ENV_VARS_TO_SKIP.split(","))
2289
2289
  }
2290
2290
  return [
2291
- Template("error-msg-capture-hook").container(
2291
+ Template("error-msg-capture-hook")
2292
+ .service_account_name(resources["service_account"])
2293
+ .container(
2292
2294
  to_camelcase(
2293
2295
  kubernetes_sdk.V1Container(
2294
2296
  name="main",
@@ -2431,7 +2433,7 @@ class ArgoWorkflows(object):
2431
2433
  Use Slack's Block Kit to add general information about the environment and
2432
2434
  execution metadata, including a link to the UI and an optional message.
2433
2435
  """
2434
- ui_link = "%s%s/argo-{{workflow.name}}" % (UI_URL, self.flow.name)
2436
+ ui_link = "%s/%s/argo-{{workflow.name}}" % (UI_URL.rstrip("/"), self.flow.name)
2435
2437
  # fmt: off
2436
2438
  if getattr(current, "project_name", None):
2437
2439
  # Add @project metadata when available.
@@ -226,12 +226,12 @@ def create(
226
226
  validate_tags(tags)
227
227
 
228
228
  if deployer_attribute_file:
229
- with open(deployer_attribute_file, "w") as f:
229
+ with open(deployer_attribute_file, "w", encoding="utf-8") as f:
230
230
  json.dump(
231
231
  {
232
232
  "name": obj.workflow_name,
233
233
  "flow_name": obj.flow.name,
234
- "metadata": get_metadata(),
234
+ "metadata": obj.metadata.metadata_str(),
235
235
  },
236
236
  f,
237
237
  )
@@ -657,7 +657,7 @@ def trigger(obj, run_id_file=None, deployer_attribute_file=None, **kwargs):
657
657
  json.dump(
658
658
  {
659
659
  "name": obj.workflow_name,
660
- "metadata": get_metadata(),
660
+ "metadata": obj.metadata.metadata_str(),
661
661
  "pathspec": "/".join((obj.flow.name, run_id)),
662
662
  },
663
663
  f,
@@ -1016,13 +1016,7 @@ def validate_run_id(
1016
1016
 
1017
1017
  if project_name is not None:
1018
1018
  # Verify we are operating on the correct project.
1019
- # Perform match with separators to avoid substrings matching
1020
- # e.g. 'test_proj' and 'test_project' should count as a mismatch.
1021
- project_part = "%s." % sanitize_for_argo(project_name)
1022
- if (
1023
- current.get("project_name") != project_name
1024
- and project_part not in workflow_name
1025
- ):
1019
+ if current.get("project_name") != project_name:
1026
1020
  raise RunIdMismatch(
1027
1021
  "The workflow belongs to the project *%s*. "
1028
1022
  "Please use the project decorator or --name to target the correct project"
@@ -1030,13 +1024,7 @@ def validate_run_id(
1030
1024
  )
1031
1025
 
1032
1026
  # Verify we are operating on the correct branch.
1033
- # Perform match with separators to avoid substrings matching.
1034
- # e.g. 'user.tes' and 'user.test' should count as a mismatch.
1035
- branch_part = ".%s." % sanitize_for_argo(branch_name)
1036
- if (
1037
- current.get("branch_name") != branch_name
1038
- and branch_part not in workflow_name
1039
- ):
1027
+ if current.get("branch_name") != branch_name:
1040
1028
  raise RunIdMismatch(
1041
1029
  "The workflow belongs to the branch *%s*. "
1042
1030
  "Please use --branch, --production or --name to target the correct branch"
@@ -134,6 +134,10 @@ class BatchDecorator(StepDecorator):
134
134
  package_sha = None
135
135
  run_time_limit = None
136
136
 
137
+ # Conda environment support
138
+ supports_conda_environment = True
139
+ target_platform = "linux-64"
140
+
137
141
  def __init__(self, attributes=None, statically_defined=False):
138
142
  super(BatchDecorator, self).__init__(attributes, statically_defined)
139
143
 
@@ -162,7 +162,7 @@ def create(
162
162
  {
163
163
  "name": obj.state_machine_name,
164
164
  "flow_name": obj.flow.name,
165
- "metadata": get_metadata(),
165
+ "metadata": obj.metadata.metadata_str(),
166
166
  },
167
167
  f,
168
168
  )
@@ -502,7 +502,7 @@ def trigger(obj, run_id_file=None, deployer_attribute_file=None, **kwargs):
502
502
  json.dump(
503
503
  {
504
504
  "name": obj.state_machine_name,
505
- "metadata": get_metadata(),
505
+ "metadata": obj.metadata.metadata_str(),
506
506
  "pathspec": "/".join((obj.flow.name, run_id)),
507
507
  },
508
508
  f,
@@ -70,7 +70,7 @@ class AzureTail(object):
70
70
  if data is None:
71
71
  return None
72
72
  if data:
73
- buf = BytesIO(data)
73
+ buf = BytesIO(self._tail + data)
74
74
  self._pos += len(data)
75
75
  self._tail = b""
76
76
  return buf
@@ -117,6 +117,7 @@ class CardDecorator(StepDecorator):
117
117
  # `'%s-%s'%(evt_name,step_name)` ensures that we capture this once per @card per @step.
118
118
  # Since there can be many steps checking if event is registered for `evt_name` will only make it check it once for all steps.
119
119
  # Hence, we have `_is_event_registered('%s-%s'%(evt_name,step_name))`
120
+ self._is_runtime_card = False
120
121
  evt = "%s-%s" % (evt_name, step_name)
121
122
  if not self._is_event_registered(evt):
122
123
  # We set the total count of decorators so that we can use it for
@@ -11,15 +11,15 @@ from metaflow.plugins.gcp.gs_utils import parse_gs_full_path
11
11
  class GSTail(object):
12
12
  def __init__(self, blob_full_uri):
13
13
  """Location should be something like gs://<bucket_name>/blob"""
14
- bucket_name, blob_name = parse_gs_full_path(blob_full_uri)
15
- if not blob_name:
14
+ self.bucket_name, self.blob_name = parse_gs_full_path(blob_full_uri)
15
+ if not self.blob_name:
16
16
  raise MetaflowException(
17
17
  msg="Failed to parse blob_full_uri into gs://<bucket_name>/<blob_name> (got %s)"
18
18
  % blob_full_uri
19
19
  )
20
20
  client = get_gs_storage_client()
21
- bucket = client.bucket(bucket_name)
22
- self._blob_client = bucket.blob(blob_name)
21
+ self.bucket = client.bucket(self.bucket_name)
22
+ self._blob_client = self.bucket.blob(self.blob_name)
23
23
  self._pos = 0
24
24
  self._tail = b""
25
25
 
@@ -46,7 +46,11 @@ class GSTail(object):
46
46
  def _make_range_request(self):
47
47
  try:
48
48
  # Yes we read to the end... memory blow up is possible. We can improve by specifying length param
49
- return self._blob_client.download_as_bytes(start=self._pos)
49
+ # NOTE: We must re-instantiate the whole client here due to a behavior with the GS library,
50
+ # otherwise download_as_bytes will simply return the same content for consecutive requests with the same attributes,
51
+ # even if the blob has grown in size.
52
+ blob_client = self.bucket.blob(self.blob_name)
53
+ return blob_client.download_as_bytes(start=self._pos)
50
54
  except NotFound:
51
55
  return None
52
56
  except ClientError as e:
@@ -63,7 +67,7 @@ class GSTail(object):
63
67
  if data is None:
64
68
  return None
65
69
  if data:
66
- buf = BytesIO(data)
70
+ buf = BytesIO(self._tail + data)
67
71
  self._pos += len(data)
68
72
  self._tail = b""
69
73
  return buf
@@ -710,12 +710,23 @@ class Kubernetes(object):
710
710
  wait_for_launch(self._job)
711
711
 
712
712
  # 2) Tail logs until the job has finished
713
+ self._output_final_logs = False
714
+
715
+ def _has_updates():
716
+ if self._job.is_running:
717
+ return True
718
+ # Make sure to output final tail for a job that has finished.
719
+ if not self._output_final_logs:
720
+ self._output_final_logs = True
721
+ return True
722
+ return False
723
+
713
724
  tail_logs(
714
725
  prefix=prefix(),
715
726
  stdout_tail=stdout_tail,
716
727
  stderr_tail=stderr_tail,
717
728
  echo=echo,
718
- has_log_updates=lambda: self._job.is_running,
729
+ has_log_updates=_has_updates,
719
730
  )
720
731
  # 3) Fetch remaining logs
721
732
  #
@@ -2,6 +2,7 @@ import json
2
2
  import os
3
3
  import platform
4
4
  import sys
5
+ import time
5
6
 
6
7
  from metaflow import current
7
8
  from metaflow.decorators import StepDecorator
@@ -104,6 +105,9 @@ class KubernetesDecorator(StepDecorator):
104
105
  compute_pool : str, optional, default None
105
106
  Compute pool to be used for for this step.
106
107
  If not specified, any accessible compute pool within the perimeter is used.
108
+ hostname_resolution_timeout: int, default 10 * 60
109
+ Timeout in seconds for the workers tasks in the gang scheduled cluster to resolve the hostname of control task.
110
+ Only applicable when @parallel is used.
107
111
  """
108
112
 
109
113
  name = "kubernetes"
@@ -130,11 +134,16 @@ class KubernetesDecorator(StepDecorator):
130
134
  "port": None,
131
135
  "compute_pool": None,
132
136
  "executable": None,
137
+ "hostname_resolution_timeout": 10 * 60,
133
138
  }
134
139
  package_url = None
135
140
  package_sha = None
136
141
  run_time_limit = None
137
142
 
143
+ # Conda environment support
144
+ supports_conda_environment = True
145
+ target_platform = "linux-64"
146
+
138
147
  def __init__(self, attributes=None, statically_defined=False):
139
148
  super(KubernetesDecorator, self).__init__(attributes, statically_defined)
140
149
 
@@ -386,7 +395,7 @@ class KubernetesDecorator(StepDecorator):
386
395
  cli_args.command_args.append(self.package_url)
387
396
 
388
397
  # skip certain keys as CLI arguments
389
- _skip_keys = ["compute_pool"]
398
+ _skip_keys = ["compute_pool", "hostname_resolution_timeout"]
390
399
  # --namespace is used to specify Metaflow namespace (a different
391
400
  # concept from k8s namespace).
392
401
  for k, v in self.attributes.items():
@@ -478,7 +487,9 @@ class KubernetesDecorator(StepDecorator):
478
487
  num_parallel = flow._parallel_ubf_iter.num_parallel
479
488
 
480
489
  if num_parallel and num_parallel > 1:
481
- _setup_multinode_environment()
490
+ _setup_multinode_environment(
491
+ ubf_context, self.attributes["hostname_resolution_timeout"]
492
+ )
482
493
  # current.parallel.node_index will be correctly available over here.
483
494
  meta.update({"parallel-node-index": current.parallel.node_index})
484
495
  if ubf_context == UBF_CONTROL:
@@ -542,18 +553,44 @@ class KubernetesDecorator(StepDecorator):
542
553
 
543
554
 
544
555
  # TODO: Unify this method with the multi-node setup in @batch
545
- def _setup_multinode_environment():
546
- # TODO [FIXME SOON]
547
- # Even if Kubernetes may deploy control pods before worker pods, there is always a
548
- # possibility that the worker pods may start before the control. In the case that this happens,
549
- # the worker pods will not be able to resolve the control pod's IP address and this will cause
550
- # the worker pods to fail. This function should account for this in the near future.
556
+ def _setup_multinode_environment(ubf_context, hostname_resolution_timeout):
551
557
  import socket
552
558
 
559
+ def _wait_for_hostname_resolution(max_wait_timeout=10 * 60):
560
+ """
561
+ keep trying to resolve the hostname of the control task until the hostname is resolved
562
+ or the max_wait_timeout is reached. This is a workaround for the issue where the control
563
+ task is not scheduled before the worker task and the worker task fails because it cannot
564
+ resolve the hostname of the control task.
565
+ """
566
+ start_time = time.time()
567
+ while True:
568
+ try:
569
+ return socket.gethostbyname(os.environ["MF_MASTER_ADDR"])
570
+ except socket.gaierror:
571
+ if time.time() - start_time > max_wait_timeout:
572
+ raise MetaflowException(
573
+ "Failed to get host by name for MF_MASTER_ADDR after waiting for {} seconds.".format(
574
+ max_wait_timeout
575
+ )
576
+ )
577
+ time.sleep(1)
578
+
553
579
  try:
554
- os.environ["MF_PARALLEL_MAIN_IP"] = socket.gethostbyname(
555
- os.environ["MF_MASTER_ADDR"]
556
- )
580
+ # Even if Kubernetes may deploy control pods before worker pods, there is always a
581
+ # possibility that the worker pods may start before the control. In the case that this happens,
582
+ # the worker pods will not be able to resolve the control pod's IP address and this will cause
583
+ # the worker pods to fail. So if the worker pods are requesting a hostname resolution, we will
584
+ # make it wait for the name to be resolved within a reasonable timeout period.
585
+ if ubf_context != UBF_CONTROL:
586
+ os.environ["MF_PARALLEL_MAIN_IP"] = _wait_for_hostname_resolution(
587
+ hostname_resolution_timeout
588
+ )
589
+ else:
590
+ os.environ["MF_PARALLEL_MAIN_IP"] = socket.gethostbyname(
591
+ os.environ["MF_MASTER_ADDR"]
592
+ )
593
+
557
594
  os.environ["MF_PARALLEL_NUM_NODES"] = os.environ["MF_WORLD_SIZE"]
558
595
  os.environ["MF_PARALLEL_NODE_INDEX"] = (
559
596
  str(0)