ob-metaflow-extensions 1.1.175rc2__py2.py3-none-any.whl → 1.1.175rc3__py2.py3-none-any.whl

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 (19) hide show
  1. metaflow_extensions/outerbounds/plugins/__init__.py +1 -1
  2. metaflow_extensions/outerbounds/plugins/apps/app_deploy_decorator.py +112 -0
  3. metaflow_extensions/outerbounds/plugins/apps/core/__init__.py +9 -0
  4. metaflow_extensions/outerbounds/plugins/apps/core/app_config.py +6 -6
  5. metaflow_extensions/outerbounds/plugins/apps/core/capsule.py +22 -6
  6. metaflow_extensions/outerbounds/plugins/apps/core/config/__init__.py +1 -0
  7. metaflow_extensions/outerbounds/plugins/apps/core/config/config_utils.py +110 -50
  8. metaflow_extensions/outerbounds/plugins/apps/core/config/typed_configs.py +104 -0
  9. metaflow_extensions/outerbounds/plugins/apps/core/config/typed_init_generator.py +317 -0
  10. metaflow_extensions/outerbounds/plugins/apps/core/config/unified_config.py +173 -49
  11. metaflow_extensions/outerbounds/plugins/apps/core/config_schema.yaml +4 -4
  12. metaflow_extensions/outerbounds/plugins/apps/core/deployer.py +132 -0
  13. metaflow_extensions/outerbounds/plugins/apps/core/perimeters.py +44 -2
  14. metaflow_extensions/outerbounds/toplevel/global_aliases_for_metaflow_package.py +1 -0
  15. metaflow_extensions/outerbounds/toplevel/ob_internal.py +1 -0
  16. {ob_metaflow_extensions-1.1.175rc2.dist-info → ob_metaflow_extensions-1.1.175rc3.dist-info}/METADATA +1 -1
  17. {ob_metaflow_extensions-1.1.175rc2.dist-info → ob_metaflow_extensions-1.1.175rc3.dist-info}/RECORD +19 -16
  18. {ob_metaflow_extensions-1.1.175rc2.dist-info → ob_metaflow_extensions-1.1.175rc3.dist-info}/WHEEL +0 -0
  19. {ob_metaflow_extensions-1.1.175rc2.dist-info → ob_metaflow_extensions-1.1.175rc3.dist-info}/top_level.txt +0 -0
@@ -94,24 +94,24 @@ properties:
94
94
  required: []
95
95
  properties:
96
96
  cpu:
97
- description: CPU resource request and limit.
97
+ description: CPU resource request and limit. (validation applied)
98
98
  type: string
99
99
  default: '1'
100
100
  example: 500m
101
101
  mutation_behavior: union
102
102
  memory:
103
- description: Memory resource request and limit.
103
+ description: Memory resource request and limit. (validation applied)
104
104
  type: string
105
105
  default: 4Gi
106
106
  example: 512Mi
107
107
  mutation_behavior: union
108
108
  gpu:
109
- description: GPU resource request and limit.
109
+ description: GPU resource request and limit. (validation applied)
110
110
  type: string
111
111
  example: '1'
112
112
  mutation_behavior: union
113
113
  disk:
114
- description: Storage resource request and limit.
114
+ description: Storage resource request and limit. (validation applied)
115
115
  type: string
116
116
  default: 20Gi
117
117
  example: 1Gi
@@ -0,0 +1,132 @@
1
+ from .config import TypedCoreConfig
2
+
3
+ from ._state_machine import DEPLOYMENT_READY_CONDITIONS
4
+ from .app_config import AppConfig, AppConfigError
5
+ from .capsule import CapsuleDeployer, list_and_filter_capsules
6
+ from functools import partial
7
+ import sys
8
+ from typing import Type
9
+
10
+
11
+ class AppDeployer(TypedCoreConfig):
12
+ """ """
13
+
14
+ __init__ = TypedCoreConfig.__init__
15
+
16
+ _app_config: AppConfig
17
+
18
+ _state = {}
19
+
20
+ @property
21
+ def app_config(self) -> AppConfig:
22
+ if not hasattr(self, "_app_config"):
23
+ self._app_config = AppConfig(self._config)
24
+ return self._app_config
25
+
26
+ # Things that need to be set before deploy
27
+ @classmethod
28
+ def _set_state(
29
+ cls,
30
+ perimeter: str,
31
+ api_url: str,
32
+ code_package_url: str = None,
33
+ code_package_key: str = None,
34
+ name: str = None,
35
+ image: str = None,
36
+ ):
37
+ cls._state["perimeter"] = perimeter
38
+ cls._state["api_url"] = api_url
39
+ cls._state["code_package_url"] = code_package_url
40
+ cls._state["code_package_key"] = code_package_key
41
+ cls._state["name"] = name
42
+ cls._state["image"] = image
43
+
44
+ def deploy(
45
+ self,
46
+ readiness_condition=DEPLOYMENT_READY_CONDITIONS.ATLEAST_ONE_RUNNING,
47
+ max_wait_time=600,
48
+ readiness_wait_time=10,
49
+ logger_fn=partial(print, file=sys.stderr),
50
+ status_file=None,
51
+ no_loader=False,
52
+ **kwargs,
53
+ ):
54
+ # Name setting from top level if none is set in the code
55
+ if self.app_config._core_config.name is None:
56
+ self.app_config._core_config.name = self._state["name"]
57
+
58
+ self.app_config.commit()
59
+
60
+ # Set any state that might have been passed down from the top level
61
+ for k, v in self._state.items():
62
+ if self.app_config.get_state(k) is None:
63
+ self.app_config.set_state(k, v)
64
+
65
+ capsule = CapsuleDeployer(
66
+ self.app_config,
67
+ self._state["api_url"],
68
+ create_timeout=max_wait_time,
69
+ debug_dir=None,
70
+ success_terminal_state_condition=readiness_condition,
71
+ readiness_wait_time=readiness_wait_time,
72
+ logger_fn=logger_fn,
73
+ )
74
+
75
+ currently_present_capsules = list_and_filter_capsules(
76
+ capsule.capsule_api,
77
+ None,
78
+ None,
79
+ capsule.name,
80
+ None,
81
+ None,
82
+ None,
83
+ )
84
+
85
+ force_upgrade = self.app_config.get_state("force_upgrade", False)
86
+
87
+ if len(currently_present_capsules) > 0:
88
+ # Only update the capsule if there is no upgrade in progress
89
+ # Only update a "already updating" capsule if the `--force-upgrade` flag is provided.
90
+ _curr_cap = currently_present_capsules[0]
91
+ this_capsule_is_being_updated = _curr_cap.get("status", {}).get(
92
+ "updateInProgress", False
93
+ )
94
+
95
+ if this_capsule_is_being_updated and not force_upgrade:
96
+ _upgrader = _curr_cap.get("metadata", {}).get("lastModifiedBy", None)
97
+ message = f"{capsule.capsule_type} is currently being upgraded"
98
+ if _upgrader:
99
+ message = (
100
+ f"{capsule.capsule_type} is currently being upgraded. Upgrade was launched by {_upgrader}. "
101
+ "If you wish to force upgrade, you can do so by providing the `--force-upgrade` flag."
102
+ )
103
+ raise AppConfigError(message)
104
+
105
+ logger_fn(
106
+ f"🚀 {'' if not force_upgrade else 'Force'} Upgrading {capsule.capsule_type.lower()} `{capsule.name}`....",
107
+ )
108
+ else:
109
+ logger_fn(
110
+ f"🚀 Deploying {capsule.capsule_type.lower()} `{capsule.name}`....",
111
+ )
112
+
113
+ capsule.create()
114
+ final_status = capsule.wait_for_terminal_state()
115
+ return final_status
116
+
117
+
118
+ class apps:
119
+
120
+ _name_prefix = None
121
+
122
+ @classmethod
123
+ def set_name_prefix(cls, name_prefix: str):
124
+ cls._name_prefix = name_prefix
125
+
126
+ @property
127
+ def name_prefix(self) -> str:
128
+ return self._name_prefix
129
+
130
+ @property
131
+ def Deployer(self) -> Type[AppDeployer]:
132
+ return AppDeployer
@@ -41,5 +41,47 @@ class PerimeterExtractor:
41
41
 
42
42
  @classmethod
43
43
  def during_metaflow_execution(cls) -> str:
44
- # TODO: implement this
45
- return ""
44
+ from metaflow.metaflow_config_funcs import init_config
45
+
46
+ clean_url = (
47
+ lambda url: f"https://{url}".rstrip("/")
48
+ if not url.startswith("https://")
49
+ else url
50
+ )
51
+
52
+ config = init_config()
53
+ api_server, perimeter, integrations_url = None, None, None
54
+ perimeter = config.get(
55
+ "OBP_PERIMETER", os.environ.get("OBP_PERIMETER", perimeter)
56
+ )
57
+ if perimeter is None:
58
+ raise RuntimeError(
59
+ "Perimeter not found in metaflow config or environment variables"
60
+ )
61
+
62
+ api_server = config.get(
63
+ "OBP_API_SERVER", os.environ.get("OBP_API_SERVER", api_server)
64
+ )
65
+
66
+ if api_server is not None and not api_server.startswith("https://"):
67
+ api_server = clean_url(api_server)
68
+
69
+ if api_server is not None:
70
+ return perimeter, api_server
71
+
72
+ integrations_url = config.get(
73
+ "OBP_INTEGRATIONS_URL", os.environ.get("OBP_INTEGRATIONS_URL", None)
74
+ )
75
+
76
+ if integrations_url is not None and not integrations_url.startswith("https://"):
77
+ integrations_url = clean_url(integrations_url)
78
+
79
+ if integrations_url is not None:
80
+ api_server = integrations_url.rstrip("/integrations")
81
+
82
+ if api_server is None:
83
+ raise RuntimeError(
84
+ "API server not found in metaflow config or environment variables"
85
+ )
86
+
87
+ return perimeter, api_server
@@ -76,3 +76,4 @@ from ..plugins.snowflake import Snowflake
76
76
  from ..plugins.checkpoint_datastores import nebius_checkpoints, coreweave_checkpoints
77
77
  from ..plugins.aws import assume_role
78
78
  from . import ob_internal
79
+ from .ob_internal import AppDeployer
@@ -1,3 +1,4 @@
1
1
  from ..plugins.kubernetes.pod_killer import PodKiller
2
2
  from ..plugins.fast_bakery.baker import bake_image
3
3
  from ..plugins.apps import core as app_core
4
+ from ..plugins.apps.core import AppDeployer
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ob-metaflow-extensions
3
- Version: 1.1.175rc2
3
+ Version: 1.1.175rc3
4
4
  Summary: Outerbounds Platform Extensions for Metaflow
5
5
  Author: Outerbounds, Inc.
6
6
  License: Commercial
@@ -1,26 +1,27 @@
1
1
  metaflow_extensions/outerbounds/__init__.py,sha256=Gb8u06s9ClQsA_vzxmkCzuMnigPy7kKcDnLfb7eB-64,514
2
2
  metaflow_extensions/outerbounds/remote_config.py,sha256=pEFJuKDYs98eoB_-ryPjVi9b_c4gpHMdBHE14ltoxIU,4672
3
3
  metaflow_extensions/outerbounds/config/__init__.py,sha256=JsQGRuGFz28fQWjUvxUgR8EKBLGRdLUIk_buPLJplJY,1225
4
- metaflow_extensions/outerbounds/plugins/__init__.py,sha256=rWDE4k-KbsFsCoqct1Rw7w3bSV0jLunx6LMBKD2SYEA,13747
4
+ metaflow_extensions/outerbounds/plugins/__init__.py,sha256=8DmLGwlr6UZWe39rbJdhO5ANemDp2ZwxY6MlqVPCppc,13740
5
5
  metaflow_extensions/outerbounds/plugins/auth_server.py,sha256=_Q9_2EL0Xy77bCRphkwT1aSu8gQXRDOH-Z-RxTUO8N4,2202
6
6
  metaflow_extensions/outerbounds/plugins/perimeters.py,sha256=QXh3SFP7GQbS-RAIxUOPbhPzQ7KDFVxZkTdKqFKgXjI,2697
7
7
  metaflow_extensions/outerbounds/plugins/apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  metaflow_extensions/outerbounds/plugins/apps/app_cli.py,sha256=aVgKe2CBcOgXQL2TYgO-sdIFlTntvbjHZFphR1w1CAM,64
9
+ metaflow_extensions/outerbounds/plugins/apps/app_deploy_decorator.py,sha256=aN2B7nf0IwnOg_9kpqVSkGyZPhr4D9YI1WuCSlNP92s,3498
9
10
  metaflow_extensions/outerbounds/plugins/apps/app_utils.py,sha256=sw9whU17lAzlD2K2kEDNjlk1Ib-2xE2UNhJkmzD8Qv8,8543
10
11
  metaflow_extensions/outerbounds/plugins/apps/consts.py,sha256=iHsyqbUg9k-rgswCs1Jxf5QZIxR1V-peCDRjgr9kdBM,177
11
12
  metaflow_extensions/outerbounds/plugins/apps/deploy_decorator.py,sha256=VkmiMdNYHhNdt-Qm9AVv7aE2LWFsIFEc16YcOYjwF6Q,8568
12
13
  metaflow_extensions/outerbounds/plugins/apps/supervisord_utils.py,sha256=GQoN2gyPClcpR9cLldJmbCfqXnoAHxp8xUnY7vzaYtY,9026
13
- metaflow_extensions/outerbounds/plugins/apps/core/__init__.py,sha256=sF7oUom2kksRR8dtbBqXa8wrJrSIpBdZ9SEaR9mHz2U,22
14
+ metaflow_extensions/outerbounds/plugins/apps/core/__init__.py,sha256=c6uCgKlgEkTmM9BVdAO-m3vZvUpK2KW_AZZ2236now4,237
14
15
  metaflow_extensions/outerbounds/plugins/apps/core/_state_machine.py,sha256=8RvEqRI9WaUiFu2LBKIqWRbbe9bSM2EptTR56wPit-0,18434
15
16
  metaflow_extensions/outerbounds/plugins/apps/core/app_cli.py,sha256=HR4nQXyxHSe6NbUF0mutsOQR_rIT-_U6C-mdSQ1_8Os,42326
16
- metaflow_extensions/outerbounds/plugins/apps/core/app_config.py,sha256=2-kxDzQEO5yNeWM4JBl5uK1pwltS2UDifZHDs3zlRZE,4187
17
+ metaflow_extensions/outerbounds/plugins/apps/core/app_config.py,sha256=PHt-HdNfTHIuhY-eB5vkRMp1RKQNWJ4DKdgZWyYgUuc,4167
17
18
  metaflow_extensions/outerbounds/plugins/apps/core/artifacts.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- metaflow_extensions/outerbounds/plugins/apps/core/capsule.py,sha256=GGT_Sr9dx6R5lc8_9ATMmLU_A4ARRol6ZTzS9lc2URY,33468
19
+ metaflow_extensions/outerbounds/plugins/apps/core/capsule.py,sha256=kOyHX8mzt44N4x4MKXCcBTZxS9ZcmRcUgbVuTgAMPpA,33879
19
20
  metaflow_extensions/outerbounds/plugins/apps/core/click_importer.py,sha256=kgoPQmK_-8PSSTc3QMSaynCLQ5VWTkKFOC69FPURyXA,998
20
- metaflow_extensions/outerbounds/plugins/apps/core/config_schema.yaml,sha256=Q4BAS4SQzFuclcaZ1-GaT_dMJFWuAf3JFZcfG2yWRQE,8058
21
+ metaflow_extensions/outerbounds/plugins/apps/core/config_schema.yaml,sha256=iTThO2vNQrFWe9nYfjiOcMf6FOQ6vU_1ZhXhUAr0L24,8142
21
22
  metaflow_extensions/outerbounds/plugins/apps/core/dependencies.py,sha256=HDPj7rDARcsKeex5GwH0IP8rOXMH6YdOufgXDknP1S8,4006
22
- metaflow_extensions/outerbounds/plugins/apps/core/deployer.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- metaflow_extensions/outerbounds/plugins/apps/core/perimeters.py,sha256=1J1_-5legFPskv3HTRwQMpzTytE3TO8KRT2IvVOrWcQ,1584
23
+ metaflow_extensions/outerbounds/plugins/apps/core/deployer.py,sha256=oARCVpHSNb7MnCKnIvzNB6fGDfF7BvAB19hDobETuZc,4234
24
+ metaflow_extensions/outerbounds/plugins/apps/core/perimeters.py,sha256=jeFGAUnFQkBFiOMp_Ls7Ofb80Qogh509suam5sMucYU,3030
24
25
  metaflow_extensions/outerbounds/plugins/apps/core/secrets.py,sha256=aWzcAayQEJghQgFP_qp9w6jyvan_hoL4_ceqZ0ZjLd4,6126
25
26
  metaflow_extensions/outerbounds/plugins/apps/core/utils.py,sha256=RLO6p25Fzq4olLFtQmfSl9LT0NPDfUosxPrsjO9sczo,7897
26
27
  metaflow_extensions/outerbounds/plugins/apps/core/validations.py,sha256=Inr9AJDe-L3PMMMxcJPH1zulh9_SynqITb2BzGseLh4,471
@@ -30,11 +31,13 @@ metaflow_extensions/outerbounds/plugins/apps/core/_vendor/spinner/spinners.py,sh
30
31
  metaflow_extensions/outerbounds/plugins/apps/core/code_package/__init__.py,sha256=8McF7pgx8ghvjRnazp2Qktlxi9yYwNiwESSQrk-2oW8,68
31
32
  metaflow_extensions/outerbounds/plugins/apps/core/code_package/code_packager.py,sha256=wrGKpsg9pBU2rvhIveJ3kzc5ODUTtzciybcGHyi7pR8,22815
32
33
  metaflow_extensions/outerbounds/plugins/apps/core/code_package/examples.py,sha256=aF8qKIJxCVv_ugcShQjqUsXKKKMsm1oMkQIl8w3QKuw,4016
33
- metaflow_extensions/outerbounds/plugins/apps/core/config/__init__.py,sha256=jxKpipxsbuZ7XJRQT6JoA4s2bKQCOVV36ve29-m4Kko,339
34
+ metaflow_extensions/outerbounds/plugins/apps/core/config/__init__.py,sha256=fSFBjC5ujTpBlNJGyVsaoWl5VZ_8mXbEIPiFvzTrgKA,382
34
35
  metaflow_extensions/outerbounds/plugins/apps/core/config/cli_generator.py,sha256=0R0-wy7RxAMR9doVRvuluRYxAYgyjZXlTIkOeYGyz7M,5350
35
- metaflow_extensions/outerbounds/plugins/apps/core/config/config_utils.py,sha256=mL74QlKOX5flOcyoRk7rsCV_XRnOhZn-5M9iwF5zdho,29585
36
+ metaflow_extensions/outerbounds/plugins/apps/core/config/config_utils.py,sha256=zBZSe-1CsHj5MxrKNuAGLy11yXD4qF_IJJkdORfCW6A,32089
36
37
  metaflow_extensions/outerbounds/plugins/apps/core/config/schema_export.py,sha256=tigPtb0we-urwbmctG1GbaQ9NKRKZn4KBbJKmaEntCg,9501
37
- metaflow_extensions/outerbounds/plugins/apps/core/config/unified_config.py,sha256=GxV50jd0yNRYy5_gZgaPPEzN3uej0qnGA65DVeJwpto,30102
38
+ metaflow_extensions/outerbounds/plugins/apps/core/config/typed_configs.py,sha256=RufXI8BQn6G5kixY6P27VYJ0d36ZG-JNFW15bA1bnk4,3179
39
+ metaflow_extensions/outerbounds/plugins/apps/core/config/typed_init_generator.py,sha256=1iszHsXjxAWeGI4XhwoTT8lVtzQwstF3ZOiVYBykO6w,10256
40
+ metaflow_extensions/outerbounds/plugins/apps/core/config/unified_config.py,sha256=58PsC1ZK3p5wNvavVRzb4Qq764wOUjPuSvXDsrrsSw4,35474
38
41
  metaflow_extensions/outerbounds/plugins/apps/core/experimental/__init__.py,sha256=rd4qGTkHndKYfJmoAKZWiY0KK4j5BK6RBrtle-it1Mg,2746
39
42
  metaflow_extensions/outerbounds/plugins/aws/__init__.py,sha256=VBGdjNKeFLXGZuqh4jVk8cFtO1AWof73a6k_cnbAOYA,145
40
43
  metaflow_extensions/outerbounds/plugins/aws/assume_role.py,sha256=mBewNlnSYsR2rFXFkX-DUH6ku01h2yOcMcLHoCL7eyI,161
@@ -103,8 +106,8 @@ metaflow_extensions/outerbounds/plugins/vllm/vllm_manager.py,sha256=sp_TX2SrImJG
103
106
  metaflow_extensions/outerbounds/profilers/__init__.py,sha256=wa_jhnCBr82TBxoS0e8b6_6sLyZX0fdHicuGJZNTqKw,29
104
107
  metaflow_extensions/outerbounds/profilers/gpu.py,sha256=3Er8uKQzfm_082uadg4yn_D4Y-iSCgzUfFmguYxZsz4,27485
105
108
  metaflow_extensions/outerbounds/toplevel/__init__.py,sha256=qWUJSv_r5hXJ7jV_On4nEasKIfUCm6_UjkjXWA_A1Ts,90
106
- metaflow_extensions/outerbounds/toplevel/global_aliases_for_metaflow_package.py,sha256=_fKWv_-O1k5Nk5A1q05Ioh-PSsFXGL-jiAt7zfl8pIE,2999
107
- metaflow_extensions/outerbounds/toplevel/ob_internal.py,sha256=g0LGhp3947dr30-BcvwAad2XA0vCIeQBupnOx0aQAfI,149
109
+ metaflow_extensions/outerbounds/toplevel/global_aliases_for_metaflow_package.py,sha256=xVCIvKeEzMwu2vfsWYqnq4aetMGmPBjpzOXrZfBr5iI,3036
110
+ metaflow_extensions/outerbounds/toplevel/ob_internal.py,sha256=DXCaAtLzlE-bFIiVWEv-iV2JKIWsoSGaUeH4jIQZ9gs,193
108
111
  metaflow_extensions/outerbounds/toplevel/plugins/azure/__init__.py,sha256=WUuhz2YQfI4fz7nIcipwwWq781eaoHEk7n4GAn1npDg,63
109
112
  metaflow_extensions/outerbounds/toplevel/plugins/gcp/__init__.py,sha256=BbZiaH3uILlEZ6ntBLKeNyqn3If8nIXZFq_Apd7Dhco,70
110
113
  metaflow_extensions/outerbounds/toplevel/plugins/kubernetes/__init__.py,sha256=5zG8gShSj8m7rgF4xgWBZFuY3GDP5n1T0ktjRpGJLHA,69
@@ -112,7 +115,7 @@ metaflow_extensions/outerbounds/toplevel/plugins/ollama/__init__.py,sha256=GRSz2
112
115
  metaflow_extensions/outerbounds/toplevel/plugins/snowflake/__init__.py,sha256=LptpH-ziXHrednMYUjIaosS1SXD3sOtF_9_eRqd8SJw,50
113
116
  metaflow_extensions/outerbounds/toplevel/plugins/torchtune/__init__.py,sha256=uTVkdSk3xZ7hEKYfdlyVteWj5KeDwaM1hU9WT-_YKfI,50
114
117
  metaflow_extensions/outerbounds/toplevel/plugins/vllm/__init__.py,sha256=ekcgD3KVydf-a0xMI60P4uy6ePkSEoFHiGnDq1JM940,45
115
- ob_metaflow_extensions-1.1.175rc2.dist-info/METADATA,sha256=jLQKqWS2hvtAnW3YX3fR2tlD5EulGLQC_K3d_beecxE,524
116
- ob_metaflow_extensions-1.1.175rc2.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
117
- ob_metaflow_extensions-1.1.175rc2.dist-info/top_level.txt,sha256=NwG0ukwjygtanDETyp_BUdtYtqIA_lOjzFFh1TsnxvI,20
118
- ob_metaflow_extensions-1.1.175rc2.dist-info/RECORD,,
118
+ ob_metaflow_extensions-1.1.175rc3.dist-info/METADATA,sha256=wnDlhzELSLX2xxzL6U87sqIbb1tWYehFruJ783o-8Gg,524
119
+ ob_metaflow_extensions-1.1.175rc3.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
120
+ ob_metaflow_extensions-1.1.175rc3.dist-info/top_level.txt,sha256=NwG0ukwjygtanDETyp_BUdtYtqIA_lOjzFFh1TsnxvI,20
121
+ ob_metaflow_extensions-1.1.175rc3.dist-info/RECORD,,