ob-metaflow-extensions 1.4.32__tar.gz → 1.4.39__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.

Potentially problematic release.


This version of ob-metaflow-extensions might be problematic. Click here for more details.

Files changed (141) hide show
  1. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/PKG-INFO +1 -1
  2. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/aws/assume_role_decorator.py +43 -3
  3. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/snowflake/snowflake.py +37 -7
  4. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/snowpark/snowpark.py +18 -8
  5. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/snowpark/snowpark_cli.py +6 -0
  6. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/snowpark/snowpark_client.py +39 -15
  7. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/snowpark/snowpark_decorator.py +5 -2
  8. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/snowpark/snowpark_job.py +2 -2
  9. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/ob_metaflow_extensions.egg-info/PKG-INFO +1 -1
  10. ob_metaflow_extensions-1.4.39/ob_metaflow_extensions.egg-info/requires.txt +3 -0
  11. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/setup.py +2 -2
  12. ob_metaflow_extensions-1.4.32/ob_metaflow_extensions.egg-info/requires.txt +0 -3
  13. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/MANIFEST.in +0 -0
  14. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/README.md +0 -0
  15. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/__init__.py +0 -0
  16. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/config/__init__.py +0 -0
  17. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/__init__.py +0 -0
  18. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/__init__.py +0 -0
  19. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/app_cli.py +0 -0
  20. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/app_deploy_decorator.py +0 -0
  21. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/app_utils.py +0 -0
  22. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/consts.py +0 -0
  23. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/__init__.py +0 -0
  24. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/_state_machine.py +0 -0
  25. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/_vendor/__init__.py +0 -0
  26. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/_vendor/spinner/__init__.py +0 -0
  27. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/_vendor/spinner/spinners.py +0 -0
  28. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/app_cli.py +0 -0
  29. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/app_config.py +0 -0
  30. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/artifacts.py +0 -0
  31. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/capsule.py +0 -0
  32. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/click_importer.py +0 -0
  33. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/code_package/__init__.py +0 -0
  34. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/code_package/code_packager.py +0 -0
  35. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/code_package/examples.py +0 -0
  36. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/config/__init__.py +0 -0
  37. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/config/cli_generator.py +0 -0
  38. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/config/config_utils.py +0 -0
  39. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/config/schema_export.py +0 -0
  40. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/config/typed_configs.py +0 -0
  41. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/config/typed_init_generator.py +0 -0
  42. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/config/unified_config.py +0 -0
  43. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/config_schema.yaml +0 -0
  44. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/dependencies.py +0 -0
  45. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/deployer.py +0 -0
  46. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/experimental/__init__.py +0 -0
  47. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/perimeters.py +0 -0
  48. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/secrets.py +0 -0
  49. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/utils.py +0 -0
  50. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/core/validations.py +0 -0
  51. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/deploy_decorator.py +0 -0
  52. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/apps/supervisord_utils.py +0 -0
  53. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/auth_server.py +0 -0
  54. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/aws/__init__.py +0 -0
  55. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/aws/assume_role.py +0 -0
  56. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/card_utilities/__init__.py +0 -0
  57. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/card_utilities/async_cards.py +0 -0
  58. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/card_utilities/extra_components.py +0 -0
  59. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/card_utilities/injector.py +0 -0
  60. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/checkpoint_datastores/__init__.py +0 -0
  61. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/checkpoint_datastores/coreweave.py +0 -0
  62. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/checkpoint_datastores/external_chckpt.py +0 -0
  63. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/checkpoint_datastores/nebius.py +0 -0
  64. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/fast_bakery/__init__.py +0 -0
  65. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/fast_bakery/baker.py +0 -0
  66. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/fast_bakery/docker_environment.py +0 -0
  67. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/fast_bakery/fast_bakery.py +0 -0
  68. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/fast_bakery/fast_bakery_cli.py +0 -0
  69. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/fast_bakery/fast_bakery_decorator.py +0 -0
  70. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/kubernetes/__init__.py +0 -0
  71. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/kubernetes/kubernetes_client.py +0 -0
  72. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/kubernetes/pod_killer.py +0 -0
  73. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nim/card.py +0 -0
  74. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nim/nim_decorator.py +0 -0
  75. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nim/nim_manager.py +0 -0
  76. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nim/utils.py +0 -0
  77. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nvcf/__init__.py +0 -0
  78. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nvcf/constants.py +0 -0
  79. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nvcf/exceptions.py +0 -0
  80. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nvcf/heartbeat_store.py +0 -0
  81. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nvcf/nvcf.py +0 -0
  82. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nvcf/nvcf_cli.py +0 -0
  83. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nvcf/nvcf_decorator.py +0 -0
  84. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nvcf/utils.py +0 -0
  85. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nvct/__init__.py +0 -0
  86. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nvct/exceptions.py +0 -0
  87. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nvct/nvct.py +0 -0
  88. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nvct/nvct_cli.py +0 -0
  89. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nvct/nvct_decorator.py +0 -0
  90. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nvct/nvct_runner.py +0 -0
  91. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/nvct/utils.py +0 -0
  92. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/ollama/__init__.py +0 -0
  93. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/ollama/constants.py +0 -0
  94. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/ollama/exceptions.py +0 -0
  95. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/ollama/ollama.py +0 -0
  96. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/ollama/status_card.py +0 -0
  97. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/optuna/__init__.py +0 -0
  98. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/perimeters.py +0 -0
  99. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/profilers/deco_injector.py +0 -0
  100. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/profilers/gpu_profile_decorator.py +0 -0
  101. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/profilers/simple_card_decorator.py +0 -0
  102. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/s3_proxy/__init__.py +0 -0
  103. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/s3_proxy/binary_caller.py +0 -0
  104. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/s3_proxy/constants.py +0 -0
  105. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/s3_proxy/exceptions.py +0 -0
  106. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/s3_proxy/proxy_bootstrap.py +0 -0
  107. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/s3_proxy/s3_proxy_api.py +0 -0
  108. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/s3_proxy/s3_proxy_decorator.py +0 -0
  109. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/s3_proxy/s3_proxy_manager.py +0 -0
  110. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/secrets/__init__.py +0 -0
  111. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/secrets/secrets.py +0 -0
  112. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/snowflake/__init__.py +0 -0
  113. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/snowpark/__init__.py +0 -0
  114. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/snowpark/snowpark_exceptions.py +0 -0
  115. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/snowpark/snowpark_service_spec.py +0 -0
  116. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/tensorboard/__init__.py +0 -0
  117. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/torchtune/__init__.py +0 -0
  118. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/vllm/__init__.py +0 -0
  119. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/vllm/constants.py +0 -0
  120. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/vllm/exceptions.py +0 -0
  121. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/vllm/status_card.py +0 -0
  122. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/plugins/vllm/vllm_manager.py +0 -0
  123. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/profilers/__init__.py +0 -0
  124. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/profilers/gpu.py +0 -0
  125. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/remote_config.py +0 -0
  126. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/toplevel/__init__.py +0 -0
  127. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/toplevel/global_aliases_for_metaflow_package.py +0 -0
  128. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/toplevel/ob_internal.py +0 -0
  129. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/toplevel/plugins/azure/__init__.py +0 -0
  130. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/toplevel/plugins/gcp/__init__.py +0 -0
  131. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/toplevel/plugins/kubernetes/__init__.py +0 -0
  132. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/toplevel/plugins/ollama/__init__.py +0 -0
  133. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/toplevel/plugins/optuna/__init__.py +0 -0
  134. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/toplevel/plugins/snowflake/__init__.py +0 -0
  135. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/toplevel/plugins/torchtune/__init__.py +0 -0
  136. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/toplevel/plugins/vllm/__init__.py +0 -0
  137. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/metaflow_extensions/outerbounds/toplevel/s3_proxy.py +0 -0
  138. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/ob_metaflow_extensions.egg-info/SOURCES.txt +0 -0
  139. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/ob_metaflow_extensions.egg-info/dependency_links.txt +0 -0
  140. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/ob_metaflow_extensions.egg-info/top_level.txt +0 -0
  141. {ob_metaflow_extensions-1.4.32 → ob_metaflow_extensions-1.4.39}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ob_metaflow_extensions
3
- Version: 1.4.32
3
+ Version: 1.4.39
4
4
  Summary: Outerbounds Platform Extensions for Metaflow
5
5
  Author: Outerbounds, Inc.
6
6
  License: Commercial
@@ -25,10 +25,29 @@ class assume_role(FlowMutator):
25
25
  def end(self):
26
26
  from metaflow import get_aws_client
27
27
  client = get_aws_client("dynamodb") # Automatically uses the role in the flow decorator
28
+
29
+ You can also filter which steps should use the role:
30
+ @assume_role(role_arn="arn:aws:iam::123456789012:role/my-iam-role", steps=["start", "process"])
31
+ class MyFlow(FlowSpec):
32
+ @step
33
+ def start(self):
34
+ # user code in this step will use the assumed role
35
+ pass
36
+
37
+ @step
38
+ def process(self):
39
+ # user code in this step will use the assumed role
40
+ pass
41
+
42
+ @step
43
+ def end(self):
44
+ # user code in this step will NOT use the assumed role
45
+ pass
28
46
  """
29
47
 
30
48
  def init(self, *args, **kwargs):
31
49
  self.role_arn = kwargs.get("role_arn", None)
50
+ self.steps = kwargs.get("steps", None)
32
51
 
33
52
  if self.role_arn is None:
34
53
  raise ValueError(
@@ -40,6 +59,13 @@ class assume_role(FlowMutator):
40
59
  "`role_arn` must be a valid AWS IAM role ARN starting with 'arn:aws:iam::'"
41
60
  )
42
61
 
62
+ # Validate steps parameter
63
+ if self.steps is not None:
64
+ if not isinstance(self.steps, (list, tuple)):
65
+ raise ValueError("`steps` must be a list or tuple of step names")
66
+ if not all(isinstance(s, str) for s in self.steps):
67
+ raise ValueError("All step names in `steps` must be strings")
68
+
43
69
  def pre_mutate(self, mutable_flow: MutableFlow) -> None:
44
70
  """
45
71
  This method is called by Metaflow to apply the decorator to the flow.
@@ -49,6 +75,18 @@ class assume_role(FlowMutator):
49
75
  # Import environment decorator at runtime to avoid circular imports
50
76
  from metaflow import environment
51
77
 
78
+ # Validate that all specified steps exist in the flow
79
+ if self.steps is not None:
80
+ flow_step_names = {step_name for step_name, _ in mutable_flow.steps}
81
+ specified_steps = set(self.steps)
82
+ missing_steps = specified_steps - flow_step_names
83
+
84
+ if missing_steps:
85
+ raise ValueError(
86
+ f"Step(s) {sorted(missing_steps)} specified in `steps` parameter "
87
+ f"do not exist in the flow. Available steps: {sorted(flow_step_names)}"
88
+ )
89
+
52
90
  def _swap_environment_variables(step: MutableStep, role_arn: str) -> None:
53
91
  _step_has_env_set = True
54
92
  _env_kwargs = {OBP_ASSUME_ROLE_ARN_ENV_VAR: role_arn}
@@ -73,6 +111,8 @@ class assume_role(FlowMutator):
73
111
  def _setup_role_assumption(step: MutableStep) -> None:
74
112
  _swap_environment_variables(step, self.role_arn)
75
113
 
76
- # Apply the role assumption setup to all steps in the flow
77
- for _, step in mutable_flow.steps:
78
- _setup_role_assumption(step)
114
+ # Apply the role assumption setup to all steps in the flow (or filtered steps)
115
+ for step_name, step in mutable_flow.steps:
116
+ # If steps filter is specified, only apply to those steps
117
+ if self.steps is None or step_name in self.steps:
118
+ _setup_role_assumption(step)
@@ -83,22 +83,32 @@ def get_snowflake_token(user: str = "", role: str = "", integration: str = "") -
83
83
  return response.json()["token"]
84
84
 
85
85
 
86
- def connect(user: str = "", role: str = "", integration: str = "", **kwargs):
86
+ def get_oauth_connection_params(
87
+ user: str = "", role: str = "", integration: str = "", **kwargs
88
+ ) -> Dict:
87
89
  """
88
- Connect to snowflake using the token minted by Outerbounds
90
+ Get OAuth connection parameters for Snowflake authentication using Outerbounds integration.
91
+
92
+ This is a helper function that returns connection parameters dict that can be used
93
+ with both snowflake-connector-python and snowflake-snowpark-python.
94
+
89
95
  user: str
90
96
  The user name used to authenticate with snowflake
91
97
  role: str
92
- The role to request when connect with snowflake
98
+ The role to request when connecting with snowflake
93
99
  integration: str
94
- The name of the snowflake integration to use. If not set, an existing integration will be used provided that only one exists in the current perimeter. If integration is not set and more than one exists in the current perimeter, then we raise an exception.
100
+ The name of the snowflake integration to use. If not set, an existing integration
101
+ will be used provided that only one exists in the current perimeter.
95
102
  kwargs: dict
96
- Additional arguments to pass to the python snowflake connector
103
+ Additional arguments to include in the connection parameters
104
+
105
+ Returns:
106
+ Dict with connection parameters including OAuth token
97
107
  """
98
108
  # ensure password is not set
99
109
  if "password" in kwargs:
100
110
  raise OuterboundsSnowflakeConnectorException(
101
- "Password should not be set when using Outerbounds snowflake connector."
111
+ "Password should not be set when using Outerbounds OAuth authentication."
102
112
  )
103
113
 
104
114
  provisioner = SnowflakeIntegrationProvisioner(integration)
@@ -137,11 +147,31 @@ def connect(user: str = "", role: str = "", integration: str = "", **kwargs):
137
147
  kwargs["role"] = role
138
148
  kwargs["user"] = user
139
149
 
150
+ return kwargs
151
+
152
+
153
+ def connect(user: str = "", role: str = "", integration: str = "", **kwargs):
154
+ """
155
+ Connect to snowflake using the token minted by Outerbounds
156
+ user: str
157
+ The user name used to authenticate with snowflake
158
+ role: str
159
+ The role to request when connect with snowflake
160
+ integration: str
161
+ The name of the snowflake integration to use. If not set, an existing integration will be used provided that only one exists in the current perimeter. If integration is not set and more than one exists in the current perimeter, then we raise an exception.
162
+ kwargs: dict
163
+ Additional arguments to pass to the python snowflake connector
164
+ """
165
+ # Get OAuth connection params using the helper
166
+ connection_params = get_oauth_connection_params(
167
+ user=user, role=role, integration=integration, **kwargs
168
+ )
169
+
140
170
  # connect to snowflake
141
171
  try:
142
172
  from snowflake.connector import connect
143
173
 
144
- cn = connect(**kwargs)
174
+ cn = connect(**connection_params)
145
175
  return cn
146
176
  except ImportError as ie:
147
177
  raise OuterboundsSnowflakeConnectorException(
@@ -1,9 +1,11 @@
1
1
  import os
2
+ import re
2
3
  import shlex
3
4
  import atexit
4
5
  import json
5
6
  import math
6
7
  import time
8
+ import hashlib
7
9
 
8
10
  from metaflow import util
9
11
 
@@ -57,21 +59,29 @@ class Snowpark(object):
57
59
  atexit.register(lambda: self.job.kill() if hasattr(self, "job") else None)
58
60
 
59
61
  def _job_name(self, user, flow_name, run_id, step_name, task_id, retry_count):
60
- return "{user}-{flow_name}-{run_id}-{step_name}-{task_id}-{retry_count}".format(
61
- user=user,
62
- flow_name=flow_name,
63
- run_id=str(run_id) if run_id is not None else "",
64
- step_name=step_name,
65
- task_id=str(task_id) if task_id is not None else "",
66
- retry_count=str(retry_count) if retry_count is not None else "",
62
+ unique_str = (
63
+ "{user}-{flow_name}-{run_id}-{step_name}-{task_id}-{retry_count}".format(
64
+ user=user,
65
+ flow_name=flow_name,
66
+ run_id=str(run_id) if run_id is not None else "",
67
+ step_name=step_name,
68
+ task_id=str(task_id) if task_id is not None else "",
69
+ retry_count=str(retry_count) if retry_count is not None else "",
70
+ )
67
71
  )
72
+ unique_hash = hashlib.md5(unique_str.encode("utf-8")).hexdigest()[:8]
73
+ raw_prefix = f"{flow_name}-{step_name}"
74
+ safe_prefix = re.sub(r"[^a-z0-9]", "-", raw_prefix.lower())
75
+ safe_prefix = safe_prefix[:54]
76
+ safe_prefix = safe_prefix.lstrip("-")
77
+ return f"{safe_prefix}-{unique_hash}"
68
78
 
69
79
  def _command(self, environment, code_package_url, step_name, step_cmds, task_spec):
70
80
  mflog_expr = export_mflog_env_vars(
71
81
  datastore_type=self.datastore.TYPE,
72
82
  stdout_path=STDOUT_PATH,
73
83
  stderr_path=STDERR_PATH,
74
- **task_spec
84
+ **task_spec,
75
85
  )
76
86
  init_cmds = environment.get_package_commands(
77
87
  code_package_url, self.datastore.TYPE
@@ -66,6 +66,10 @@ def snowpark():
66
66
  "--schema",
67
67
  help="Schema for Snowpark Container Services.",
68
68
  )
69
+ @click.option(
70
+ "--integration",
71
+ help="Outerbounds OAuth integration name for Snowpark Container Services. When set, uses OAuth authentication instead of password.",
72
+ )
69
73
  @click.option(
70
74
  "--image",
71
75
  help="Docker image requirement for Snowpark Container Services. In name:version format.",
@@ -119,6 +123,7 @@ def step(
119
123
  database=None,
120
124
  warehouse=None,
121
125
  schema=None,
126
+ integration=None,
122
127
  image=None,
123
128
  stage=None,
124
129
  compute_pool=None,
@@ -235,6 +240,7 @@ def step(
235
240
  "database": database,
236
241
  "warehouse": warehouse,
237
242
  "schema": schema,
243
+ "integration": integration,
238
244
  },
239
245
  )
240
246
  with ctx.obj.monitor.measure("metaflow.snowpark.launch_job"):
@@ -10,14 +10,15 @@ from metaflow.exception import MetaflowException
10
10
  class SnowparkClient(object):
11
11
  def __init__(
12
12
  self,
13
- account: str,
14
- user: str,
15
- password: str,
16
- role: str,
17
- database: str,
18
- warehouse: str,
19
- schema: str,
13
+ account: str = None,
14
+ user: str = None,
15
+ password: str = None,
16
+ role: str = None,
17
+ database: str = None,
18
+ warehouse: str = None,
19
+ schema: str = None,
20
20
  autocommit: bool = True,
21
+ integration: str = None,
21
22
  ):
22
23
  try:
23
24
  from snowflake.core import Root
@@ -37,15 +38,38 @@ class SnowparkClient(object):
37
38
  % sys.executable
38
39
  )
39
40
 
41
+ if integration:
42
+ # Use OAuth authentication via Outerbounds integration
43
+ from metaflow_extensions.outerbounds.plugins.snowflake.snowflake import (
44
+ get_oauth_connection_params,
45
+ )
46
+
47
+ self.connection_parameters = get_oauth_connection_params(
48
+ user=user or "",
49
+ role=role or "",
50
+ integration=integration,
51
+ schema=schema or "",
52
+ account=account,
53
+ warehouse=warehouse,
54
+ database=database,
55
+ )
56
+ self.connection_parameters["autocommit"] = autocommit
57
+ else:
58
+ # Password-based authentication
59
+ self.connection_parameters = {
60
+ "account": account,
61
+ "user": user,
62
+ "password": password,
63
+ "role": role,
64
+ "warehouse": warehouse,
65
+ "database": database,
66
+ "schema": schema,
67
+ "autocommit": autocommit,
68
+ }
69
+
70
+ # Remove None values from connection parameters
40
71
  self.connection_parameters = {
41
- "account": account,
42
- "user": user,
43
- "password": password,
44
- "role": role,
45
- "warehouse": warehouse,
46
- "database": database,
47
- "schema": schema,
48
- "autocommit": autocommit,
72
+ k: v for k, v in self.connection_parameters.items() if v is not None
49
73
  }
50
74
 
51
75
  try:
@@ -71,6 +71,7 @@ class SnowparkDecorator(StepDecorator):
71
71
  "cpu": None,
72
72
  "gpu": None,
73
73
  "memory": None,
74
+ "integration": None, # Outerbounds OAuth integration name
74
75
  }
75
76
 
76
77
  package_url = None
@@ -80,12 +81,11 @@ class SnowparkDecorator(StepDecorator):
80
81
  def __init__(self, attributes=None, statically_defined=False):
81
82
  super(SnowparkDecorator, self).__init__(attributes, statically_defined)
82
83
 
84
+ # Set defaults from config (user can override via decorator or integration)
83
85
  if not self.attributes["account"]:
84
86
  self.attributes["account"] = SNOWPARK_ACCOUNT
85
87
  if not self.attributes["user"]:
86
88
  self.attributes["user"] = SNOWPARK_USER
87
- if not self.attributes["password"]:
88
- self.attributes["password"] = SNOWPARK_PASSWORD
89
89
  if not self.attributes["role"]:
90
90
  self.attributes["role"] = SNOWPARK_ROLE
91
91
  if not self.attributes["database"]:
@@ -94,6 +94,9 @@ class SnowparkDecorator(StepDecorator):
94
94
  self.attributes["warehouse"] = SNOWPARK_WAREHOUSE
95
95
  if not self.attributes["schema"]:
96
96
  self.attributes["schema"] = SNOWPARK_SCHEMA
97
+ # Only use password from config if not using integration (OAuth)
98
+ if not self.attributes["integration"] and not self.attributes["password"]:
99
+ self.attributes["password"] = SNOWPARK_PASSWORD
97
100
 
98
101
  # If no docker image is explicitly specified, impute a default image.
99
102
  if not self.attributes["image"]:
@@ -12,9 +12,9 @@ from .snowpark_exceptions import SnowparkException
12
12
  mapping = str.maketrans("0123456789", "abcdefghij")
13
13
 
14
14
 
15
- # keep only alpha numeric characters and underscores..
15
+ # keep only alpha numeric characters and dashes..
16
16
  def sanitize_name(job_name: str):
17
- return "".join(char for char in job_name if char.isalnum() or char == "_")
17
+ return "".join(char for char in job_name if char.isalnum() or char == "-")
18
18
 
19
19
 
20
20
  # this is not a decorator since the exception imports need to be inside
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ob-metaflow-extensions
3
- Version: 1.4.32
3
+ Version: 1.4.39
4
4
  Summary: Outerbounds Platform Extensions for Metaflow
5
5
  Author: Outerbounds, Inc.
6
6
  License: Commercial
@@ -0,0 +1,3 @@
1
+ boto3
2
+ kubernetes
3
+ ob-metaflow==2.19.15.1
@@ -2,7 +2,7 @@ from setuptools import setup, find_namespace_packages
2
2
  from pathlib import Path
3
3
 
4
4
 
5
- version = "1.4.32"
5
+ version = "1.4.39"
6
6
  this_directory = Path(__file__).parent
7
7
  long_description = (this_directory / "README.md").read_text()
8
8
 
@@ -19,6 +19,6 @@ setup(
19
19
  install_requires=[
20
20
  "boto3",
21
21
  "kubernetes",
22
- "ob-metaflow == 2.19.8.1",
22
+ "ob-metaflow == 2.19.15.1",
23
23
  ],
24
24
  )
@@ -1,3 +0,0 @@
1
- boto3
2
- kubernetes
3
- ob-metaflow==2.19.8.1