ob-metaflow-extensions 1.4.35__py2.py3-none-any.whl → 1.4.39__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.
- metaflow_extensions/outerbounds/plugins/aws/assume_role_decorator.py +43 -3
- metaflow_extensions/outerbounds/plugins/snowflake/snowflake.py +37 -7
- metaflow_extensions/outerbounds/plugins/snowpark/snowpark.py +18 -8
- metaflow_extensions/outerbounds/plugins/snowpark/snowpark_cli.py +6 -0
- metaflow_extensions/outerbounds/plugins/snowpark/snowpark_client.py +39 -15
- metaflow_extensions/outerbounds/plugins/snowpark/snowpark_decorator.py +5 -2
- metaflow_extensions/outerbounds/plugins/snowpark/snowpark_job.py +2 -2
- {ob_metaflow_extensions-1.4.35.dist-info → ob_metaflow_extensions-1.4.39.dist-info}/METADATA +2 -2
- {ob_metaflow_extensions-1.4.35.dist-info → ob_metaflow_extensions-1.4.39.dist-info}/RECORD +11 -11
- {ob_metaflow_extensions-1.4.35.dist-info → ob_metaflow_extensions-1.4.39.dist-info}/WHEEL +0 -0
- {ob_metaflow_extensions-1.4.35.dist-info → ob_metaflow_extensions-1.4.39.dist-info}/top_level.txt +0 -0
|
@@ -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
|
|
78
|
-
|
|
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
|
|
86
|
+
def get_oauth_connection_params(
|
|
87
|
+
user: str = "", role: str = "", integration: str = "", **kwargs
|
|
88
|
+
) -> Dict:
|
|
87
89
|
"""
|
|
88
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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(**
|
|
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
|
-
|
|
61
|
-
user
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
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
|
|
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
|
{ob_metaflow_extensions-1.4.35.dist-info → ob_metaflow_extensions-1.4.39.dist-info}/METADATA
RENAMED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ob-metaflow-extensions
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.39
|
|
4
4
|
Summary: Outerbounds Platform Extensions for Metaflow
|
|
5
5
|
Author: Outerbounds, Inc.
|
|
6
6
|
License: Commercial
|
|
7
7
|
Description-Content-Type: text/markdown
|
|
8
8
|
Requires-Dist: boto3
|
|
9
9
|
Requires-Dist: kubernetes
|
|
10
|
-
Requires-Dist: ob-metaflow (==2.19.
|
|
10
|
+
Requires-Dist: ob-metaflow (==2.19.15.1)
|
|
11
11
|
|
|
12
12
|
# Outerbounds platform package
|
|
13
13
|
|
|
@@ -41,7 +41,7 @@ metaflow_extensions/outerbounds/plugins/apps/core/config/unified_config.py,sha25
|
|
|
41
41
|
metaflow_extensions/outerbounds/plugins/apps/core/experimental/__init__.py,sha256=_OT0RsbQdYerT-fjG_vcu85ava6sHbCsGBpLcGcrlX8,3043
|
|
42
42
|
metaflow_extensions/outerbounds/plugins/aws/__init__.py,sha256=VBGdjNKeFLXGZuqh4jVk8cFtO1AWof73a6k_cnbAOYA,145
|
|
43
43
|
metaflow_extensions/outerbounds/plugins/aws/assume_role.py,sha256=mBewNlnSYsR2rFXFkX-DUH6ku01h2yOcMcLHoCL7eyI,161
|
|
44
|
-
metaflow_extensions/outerbounds/plugins/aws/assume_role_decorator.py,sha256=
|
|
44
|
+
metaflow_extensions/outerbounds/plugins/aws/assume_role_decorator.py,sha256=cZg2zUcyvehpjE-a12HTP6vpwPG2MAJuK5KSywBk8xs,4638
|
|
45
45
|
metaflow_extensions/outerbounds/plugins/card_utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
46
46
|
metaflow_extensions/outerbounds/plugins/card_utilities/async_cards.py,sha256=6rQhtZXK5DenXPfCRS1ul0jvLJYd48jrJAlnodID21w,4347
|
|
47
47
|
metaflow_extensions/outerbounds/plugins/card_utilities/extra_components.py,sha256=D8rgCaSc7PuLD0MHJjqsjN0g0PQMN1H-ySOJqi5uIOE,19111
|
|
@@ -98,14 +98,14 @@ metaflow_extensions/outerbounds/plugins/s3_proxy/s3_proxy_manager.py,sha256=Grl7
|
|
|
98
98
|
metaflow_extensions/outerbounds/plugins/secrets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
99
99
|
metaflow_extensions/outerbounds/plugins/secrets/secrets.py,sha256=3s98hO_twKkM22tKyDdcUjGQNfYpSXW_jLKISV9ju_U,8433
|
|
100
100
|
metaflow_extensions/outerbounds/plugins/snowflake/__init__.py,sha256=RG4ixt3jwqcK1_tt0QxLcUbNmf7wWAMnZhBx-ZMGgLk,114
|
|
101
|
-
metaflow_extensions/outerbounds/plugins/snowflake/snowflake.py,sha256=
|
|
101
|
+
metaflow_extensions/outerbounds/plugins/snowflake/snowflake.py,sha256=_ULhLrKZ4rOVcJFb_EmMGi7GFDN6Vtawz8o86mLBMq8,14756
|
|
102
102
|
metaflow_extensions/outerbounds/plugins/snowpark/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
103
|
-
metaflow_extensions/outerbounds/plugins/snowpark/snowpark.py,sha256=
|
|
104
|
-
metaflow_extensions/outerbounds/plugins/snowpark/snowpark_cli.py,sha256=
|
|
105
|
-
metaflow_extensions/outerbounds/plugins/snowpark/snowpark_client.py,sha256=
|
|
106
|
-
metaflow_extensions/outerbounds/plugins/snowpark/snowpark_decorator.py,sha256=
|
|
103
|
+
metaflow_extensions/outerbounds/plugins/snowpark/snowpark.py,sha256=tVpSOizbVjoXp-iMWuzJgE41hUstMrPC8O_eCKY9Mg4,11083
|
|
104
|
+
metaflow_extensions/outerbounds/plugins/snowpark/snowpark_cli.py,sha256=aesXYZGoEF8UtAIvCDJNLTSc9pM62KuOqd9Za95HjZ4,8997
|
|
105
|
+
metaflow_extensions/outerbounds/plugins/snowpark/snowpark_client.py,sha256=6U1sdXx0pdhNdkGba8DaE7GabQTc5fyJI3LpPsPQt0s,5463
|
|
106
|
+
metaflow_extensions/outerbounds/plugins/snowpark/snowpark_decorator.py,sha256=EN-XQafl14uQ3oVGgrkNII5PCYq2lWOt3t2d-JGPeBk,10430
|
|
107
107
|
metaflow_extensions/outerbounds/plugins/snowpark/snowpark_exceptions.py,sha256=FTfYlJu-sn9DkPOs2R1V1ChWb1vZthOgeq0BZdT1ucY,296
|
|
108
|
-
metaflow_extensions/outerbounds/plugins/snowpark/snowpark_job.py,sha256=
|
|
108
|
+
metaflow_extensions/outerbounds/plugins/snowpark/snowpark_job.py,sha256=KcbAYZdInAlS10IAZWdqtWAJXY4I6N2ebCTXzAmT72o,7070
|
|
109
109
|
metaflow_extensions/outerbounds/plugins/snowpark/snowpark_service_spec.py,sha256=AI_kcm1hZV3JRxJkookcH6twiGnAYjk9Dx-MeoYz60Y,8511
|
|
110
110
|
metaflow_extensions/outerbounds/plugins/tensorboard/__init__.py,sha256=9lUM4Cqi5RjrHBRfG6AQMRz8-R96eZC8Ih0KD2lv22Y,1858
|
|
111
111
|
metaflow_extensions/outerbounds/plugins/torchtune/__init__.py,sha256=Psj2ybj_E1qp5KK2inon9e4ZecaRxnPtW3ngcirbO2g,6094
|
|
@@ -128,7 +128,7 @@ metaflow_extensions/outerbounds/toplevel/plugins/optuna/__init__.py,sha256=6D1wL
|
|
|
128
128
|
metaflow_extensions/outerbounds/toplevel/plugins/snowflake/__init__.py,sha256=LptpH-ziXHrednMYUjIaosS1SXD3sOtF_9_eRqd8SJw,50
|
|
129
129
|
metaflow_extensions/outerbounds/toplevel/plugins/torchtune/__init__.py,sha256=uTVkdSk3xZ7hEKYfdlyVteWj5KeDwaM1hU9WT-_YKfI,50
|
|
130
130
|
metaflow_extensions/outerbounds/toplevel/plugins/vllm/__init__.py,sha256=ekcgD3KVydf-a0xMI60P4uy6ePkSEoFHiGnDq1JM940,45
|
|
131
|
-
ob_metaflow_extensions-1.4.
|
|
132
|
-
ob_metaflow_extensions-1.4.
|
|
133
|
-
ob_metaflow_extensions-1.4.
|
|
134
|
-
ob_metaflow_extensions-1.4.
|
|
131
|
+
ob_metaflow_extensions-1.4.39.dist-info/METADATA,sha256=Zfm2ymOc5lvyeuNPZUNpmCHylRjYHRKGQVhyL_YduBw,520
|
|
132
|
+
ob_metaflow_extensions-1.4.39.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
|
|
133
|
+
ob_metaflow_extensions-1.4.39.dist-info/top_level.txt,sha256=NwG0ukwjygtanDETyp_BUdtYtqIA_lOjzFFh1TsnxvI,20
|
|
134
|
+
ob_metaflow_extensions-1.4.39.dist-info/RECORD,,
|
|
File without changes
|
{ob_metaflow_extensions-1.4.35.dist-info → ob_metaflow_extensions-1.4.39.dist-info}/top_level.txt
RENAMED
|
File without changes
|