zenml-nightly 0.73.0.dev20250205__py3-none-any.whl → 0.73.0.dev20250206__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.
- zenml/VERSION +1 -1
- zenml/cli/utils.py +42 -53
- zenml/client.py +6 -2
- zenml/models/__init__.py +4 -2
- zenml/models/v2/base/filter.py +34 -11
- zenml/models/v2/base/scoped.py +4 -4
- zenml/models/v2/core/artifact.py +3 -3
- zenml/models/v2/core/artifact_version.py +22 -5
- zenml/models/v2/core/model.py +13 -3
- zenml/models/v2/core/model_version.py +13 -3
- zenml/models/v2/core/pipeline.py +11 -4
- zenml/models/v2/core/pipeline_run.py +20 -7
- zenml/models/v2/core/run_template.py +13 -3
- zenml/models/v2/core/step_run.py +9 -2
- zenml/pipelines/pipeline_definition.py +28 -12
- zenml/zen_stores/schemas/artifact_schemas.py +31 -4
- zenml/zen_stores/schemas/model_schemas.py +31 -6
- zenml/zen_stores/schemas/pipeline_run_schemas.py +1 -1
- zenml/zen_stores/schemas/pipeline_schemas.py +35 -8
- zenml/zen_stores/schemas/run_template_schemas.py +42 -14
- {zenml_nightly-0.73.0.dev20250205.dist-info → zenml_nightly-0.73.0.dev20250206.dist-info}/METADATA +1 -1
- {zenml_nightly-0.73.0.dev20250205.dist-info → zenml_nightly-0.73.0.dev20250206.dist-info}/RECORD +25 -25
- {zenml_nightly-0.73.0.dev20250205.dist-info → zenml_nightly-0.73.0.dev20250206.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.73.0.dev20250205.dist-info → zenml_nightly-0.73.0.dev20250206.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.73.0.dev20250205.dist-info → zenml_nightly-0.73.0.dev20250206.dist-info}/entry_points.txt +0 -0
zenml/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.73.0.
|
1
|
+
0.73.0.dev20250206
|
zenml/cli/utils.py
CHANGED
@@ -18,6 +18,7 @@ import json
|
|
18
18
|
import os
|
19
19
|
import platform
|
20
20
|
import re
|
21
|
+
import shutil
|
21
22
|
import subprocess
|
22
23
|
import sys
|
23
24
|
from typing import (
|
@@ -1048,22 +1049,18 @@ def install_packages(
|
|
1048
1049
|
# just return without doing anything
|
1049
1050
|
return
|
1050
1051
|
|
1051
|
-
|
1052
|
-
|
1053
|
-
command =
|
1054
|
-
[
|
1055
|
-
sys.executable,
|
1056
|
-
"-m",
|
1057
|
-
]
|
1058
|
-
+ pip_command
|
1059
|
-
+ [
|
1060
|
-
"install",
|
1061
|
-
"--upgrade",
|
1062
|
-
]
|
1063
|
-
+ packages
|
1064
|
-
)
|
1052
|
+
if use_uv and not is_installed_in_python_environment("uv"):
|
1053
|
+
# If uv is installed globally, don't run as a python module
|
1054
|
+
command = []
|
1065
1055
|
else:
|
1066
|
-
command = [sys.executable, "-m"]
|
1056
|
+
command = [sys.executable, "-m"]
|
1057
|
+
|
1058
|
+
command += ["uv", "pip", "install"] if use_uv else ["pip", "install"]
|
1059
|
+
|
1060
|
+
if upgrade:
|
1061
|
+
command += ["--upgrade"]
|
1062
|
+
|
1063
|
+
command += packages
|
1067
1064
|
|
1068
1065
|
if not IS_DEBUG_ENV:
|
1069
1066
|
quiet_flag = "-q" if use_uv else "-qqq"
|
@@ -1094,62 +1091,54 @@ def uninstall_package(package: str, use_uv: bool = False) -> None:
|
|
1094
1091
|
package: The package to uninstall.
|
1095
1092
|
use_uv: Whether to use uv for package uninstallation.
|
1096
1093
|
"""
|
1097
|
-
|
1098
|
-
|
1099
|
-
|
1100
|
-
if use_uv:
|
1101
|
-
subprocess.check_call(
|
1102
|
-
[
|
1103
|
-
sys.executable,
|
1104
|
-
"-m",
|
1105
|
-
]
|
1106
|
-
+ pip_command
|
1107
|
-
+ [
|
1108
|
-
"uninstall",
|
1109
|
-
quiet_flag,
|
1110
|
-
package,
|
1111
|
-
]
|
1112
|
-
)
|
1094
|
+
if use_uv and not is_installed_in_python_environment("uv"):
|
1095
|
+
# If uv is installed globally, don't run as a python module
|
1096
|
+
command = []
|
1113
1097
|
else:
|
1114
|
-
|
1115
|
-
[
|
1116
|
-
sys.executable,
|
1117
|
-
"-m",
|
1118
|
-
]
|
1119
|
-
+ pip_command
|
1120
|
-
+ [
|
1121
|
-
"uninstall",
|
1122
|
-
quiet_flag,
|
1123
|
-
"-y",
|
1124
|
-
package,
|
1125
|
-
]
|
1126
|
-
)
|
1098
|
+
command = [sys.executable, "-m"]
|
1127
1099
|
|
1100
|
+
command += (
|
1101
|
+
["uv", "pip", "uninstall", "-q"]
|
1102
|
+
if use_uv
|
1103
|
+
else ["pip", "uninstall", "-y", "-qqq"]
|
1104
|
+
)
|
1105
|
+
command += [package]
|
1128
1106
|
|
1129
|
-
|
1130
|
-
|
1107
|
+
subprocess.check_call(command)
|
1108
|
+
|
1109
|
+
|
1110
|
+
def is_installed_in_python_environment(package: str) -> bool:
|
1111
|
+
"""Check if a package is installed in the current python environment.
|
1112
|
+
|
1113
|
+
Args:
|
1114
|
+
package: The package to check.
|
1131
1115
|
|
1132
1116
|
Returns:
|
1133
|
-
True if
|
1117
|
+
True if the package is installed, False otherwise.
|
1134
1118
|
"""
|
1135
1119
|
try:
|
1136
|
-
pkg_resources.get_distribution(
|
1120
|
+
pkg_resources.get_distribution(package)
|
1137
1121
|
return True
|
1138
1122
|
except pkg_resources.DistributionNotFound:
|
1139
1123
|
return False
|
1140
1124
|
|
1141
1125
|
|
1126
|
+
def is_uv_installed() -> bool:
|
1127
|
+
"""Check if uv is installed.
|
1128
|
+
|
1129
|
+
Returns:
|
1130
|
+
True if uv is installed, False otherwise.
|
1131
|
+
"""
|
1132
|
+
return shutil.which("uv") is not None
|
1133
|
+
|
1134
|
+
|
1142
1135
|
def is_pip_installed() -> bool:
|
1143
1136
|
"""Check if pip is installed in the current environment.
|
1144
1137
|
|
1145
1138
|
Returns:
|
1146
1139
|
True if pip is installed, False otherwise.
|
1147
1140
|
"""
|
1148
|
-
|
1149
|
-
pkg_resources.get_distribution("pip")
|
1150
|
-
return True
|
1151
|
-
except pkg_resources.DistributionNotFound:
|
1152
|
-
return False
|
1141
|
+
return is_installed_in_python_environment("pip")
|
1153
1142
|
|
1154
1143
|
|
1155
1144
|
def pretty_print_secret(
|
zenml/client.py
CHANGED
@@ -3821,7 +3821,7 @@ class Client(metaclass=ClientMetaClass):
|
|
3821
3821
|
templatable: Optional[bool] = None,
|
3822
3822
|
tag: Optional[str] = None,
|
3823
3823
|
user: Optional[Union[UUID, str]] = None,
|
3824
|
-
run_metadata: Optional[Dict[str,
|
3824
|
+
run_metadata: Optional[Dict[str, Any]] = None,
|
3825
3825
|
pipeline: Optional[Union[UUID, str]] = None,
|
3826
3826
|
code_repository: Optional[Union[UUID, str]] = None,
|
3827
3827
|
model: Optional[Union[UUID, str]] = None,
|
@@ -3974,6 +3974,7 @@ class Client(metaclass=ClientMetaClass):
|
|
3974
3974
|
user: Optional[Union[UUID, str]] = None,
|
3975
3975
|
model_version_id: Optional[Union[str, UUID]] = None,
|
3976
3976
|
model: Optional[Union[UUID, str]] = None,
|
3977
|
+
run_metadata: Optional[Dict[str, Any]] = None,
|
3977
3978
|
hydrate: bool = False,
|
3978
3979
|
) -> Page[StepRunResponse]:
|
3979
3980
|
"""List all pipelines.
|
@@ -4000,6 +4001,7 @@ class Client(metaclass=ClientMetaClass):
|
|
4000
4001
|
cache_key: The cache key of the step run to filter by.
|
4001
4002
|
code_hash: The code hash of the step run to filter by.
|
4002
4003
|
status: The name of the run to filter by.
|
4004
|
+
run_metadata: Filter by run metadata.
|
4003
4005
|
hydrate: Flag deciding whether to hydrate the output model(s)
|
4004
4006
|
by including metadata fields in the response.
|
4005
4007
|
|
@@ -4028,6 +4030,7 @@ class Client(metaclass=ClientMetaClass):
|
|
4028
4030
|
user=user,
|
4029
4031
|
model_version_id=model_version_id,
|
4030
4032
|
model=model,
|
4033
|
+
run_metadata=run_metadata,
|
4031
4034
|
)
|
4032
4035
|
step_run_filter_model.set_scope_workspace(self.active_workspace.id)
|
4033
4036
|
return self.zen_store.list_run_steps(
|
@@ -4254,7 +4257,7 @@ class Client(metaclass=ClientMetaClass):
|
|
4254
4257
|
user: Optional[Union[UUID, str]] = None,
|
4255
4258
|
model: Optional[Union[UUID, str]] = None,
|
4256
4259
|
pipeline_run: Optional[Union[UUID, str]] = None,
|
4257
|
-
run_metadata: Optional[Dict[str,
|
4260
|
+
run_metadata: Optional[Dict[str, Any]] = None,
|
4258
4261
|
tag: Optional[str] = None,
|
4259
4262
|
hydrate: bool = False,
|
4260
4263
|
) -> Page[ArtifactVersionResponse]:
|
@@ -4320,6 +4323,7 @@ class Client(metaclass=ClientMetaClass):
|
|
4320
4323
|
user=user,
|
4321
4324
|
model=model,
|
4322
4325
|
pipeline_run=pipeline_run,
|
4326
|
+
run_metadata=run_metadata,
|
4323
4327
|
)
|
4324
4328
|
artifact_version_filter_model.set_scope_workspace(
|
4325
4329
|
self.active_workspace.id
|
zenml/models/__init__.py
CHANGED
@@ -28,6 +28,7 @@ from zenml.models.v2.base.base import (
|
|
28
28
|
BaseDatedResponseBody,
|
29
29
|
)
|
30
30
|
from zenml.models.v2.base.scoped import (
|
31
|
+
TaggableFilter,
|
31
32
|
UserScopedRequest,
|
32
33
|
UserScopedFilter,
|
33
34
|
UserScopedResponse,
|
@@ -39,7 +40,7 @@ from zenml.models.v2.base.scoped import (
|
|
39
40
|
WorkspaceScopedResponseBody,
|
40
41
|
WorkspaceScopedResponseMetadata,
|
41
42
|
WorkspaceScopedResponseResources,
|
42
|
-
|
43
|
+
WorkspaceScopedFilter,
|
43
44
|
)
|
44
45
|
from zenml.models.v2.base.filter import (
|
45
46
|
BaseFilter,
|
@@ -497,12 +498,13 @@ __all__ = [
|
|
497
498
|
"WorkspaceScopedResponseBody",
|
498
499
|
"WorkspaceScopedResponseMetadata",
|
499
500
|
"WorkspaceScopedResponseResources",
|
500
|
-
"
|
501
|
+
"WorkspaceScopedFilter",
|
501
502
|
"BaseFilter",
|
502
503
|
"StrFilter",
|
503
504
|
"BoolFilter",
|
504
505
|
"NumericFilter",
|
505
506
|
"UUIDFilter",
|
507
|
+
"TaggableFilter",
|
506
508
|
"Page",
|
507
509
|
# V2 Core
|
508
510
|
"ActionFilter",
|
zenml/models/v2/base/filter.py
CHANGED
@@ -171,6 +171,8 @@ class BoolFilter(Filter):
|
|
171
171
|
class StrFilter(Filter):
|
172
172
|
"""Filter for all string fields."""
|
173
173
|
|
174
|
+
json_encode_value: bool = False
|
175
|
+
|
174
176
|
ALLOWED_OPS: ClassVar[List[str]] = [
|
175
177
|
GenericFilterOps.EQUALS,
|
176
178
|
GenericFilterOps.NOT_EQUALS,
|
@@ -211,16 +213,6 @@ class StrFilter(Filter):
|
|
211
213
|
Raises:
|
212
214
|
ValueError: the comparison of the column to a numeric value fails.
|
213
215
|
"""
|
214
|
-
if self.operation == GenericFilterOps.CONTAINS:
|
215
|
-
return column.like(f"%{self.value}%")
|
216
|
-
if self.operation == GenericFilterOps.STARTSWITH:
|
217
|
-
return column.startswith(f"{self.value}")
|
218
|
-
if self.operation == GenericFilterOps.ENDSWITH:
|
219
|
-
return column.endswith(f"{self.value}")
|
220
|
-
if self.operation == GenericFilterOps.NOT_EQUALS:
|
221
|
-
return column != self.value
|
222
|
-
if self.operation == GenericFilterOps.ONEOF:
|
223
|
-
return column.in_(self.value)
|
224
216
|
if self.operation in {
|
225
217
|
GenericFilterOps.GT,
|
226
218
|
GenericFilterOps.LT,
|
@@ -254,7 +246,33 @@ class StrFilter(Filter):
|
|
254
246
|
f"value '{self.value}' (must be numeric): {e}"
|
255
247
|
)
|
256
248
|
|
257
|
-
|
249
|
+
if self.operation == GenericFilterOps.ONEOF:
|
250
|
+
assert isinstance(self.value, list)
|
251
|
+
# Convert the list of values to a list of json strings
|
252
|
+
json_list = (
|
253
|
+
[json.dumps(v) for v in self.value]
|
254
|
+
if self.json_encode_value
|
255
|
+
else self.value
|
256
|
+
)
|
257
|
+
return column.in_(json_list)
|
258
|
+
|
259
|
+
# Don't convert the value to a json string if the operation is contains
|
260
|
+
# because the quotes around strings will mess with the comparison
|
261
|
+
if self.operation == GenericFilterOps.CONTAINS:
|
262
|
+
return column.like(f"%{self.value}%")
|
263
|
+
|
264
|
+
json_value = (
|
265
|
+
json.dumps(self.value) if self.json_encode_value else self.value
|
266
|
+
)
|
267
|
+
|
268
|
+
if self.operation == GenericFilterOps.STARTSWITH:
|
269
|
+
return column.startswith(f"{json_value}")
|
270
|
+
if self.operation == GenericFilterOps.ENDSWITH:
|
271
|
+
return column.endswith(f"{json_value}")
|
272
|
+
if self.operation == GenericFilterOps.NOT_EQUALS:
|
273
|
+
return column != json_value
|
274
|
+
|
275
|
+
return column == json_value
|
258
276
|
|
259
277
|
|
260
278
|
class UUIDFilter(StrFilter):
|
@@ -733,6 +751,7 @@ class BaseFilter(BaseModel):
|
|
733
751
|
value: Any,
|
734
752
|
table: Type[SQLModel],
|
735
753
|
column: str,
|
754
|
+
json_encode_value: bool = False,
|
736
755
|
) -> "ColumnElement[bool]":
|
737
756
|
"""Generate custom filter conditions for a column of a table.
|
738
757
|
|
@@ -740,6 +759,7 @@ class BaseFilter(BaseModel):
|
|
740
759
|
value: The filter value.
|
741
760
|
table: The table which contains the column.
|
742
761
|
column: The column name.
|
762
|
+
json_encode_value: Whether to json encode the value.
|
743
763
|
|
744
764
|
Returns:
|
745
765
|
The query conditions.
|
@@ -748,6 +768,9 @@ class BaseFilter(BaseModel):
|
|
748
768
|
filter_ = FilterGenerator(table).define_filter(
|
749
769
|
column=column, value=value, operator=operator
|
750
770
|
)
|
771
|
+
if isinstance(filter_, StrFilter):
|
772
|
+
filter_.json_encode_value = json_encode_value
|
773
|
+
|
751
774
|
return filter_.generate_query_conditions(table=table)
|
752
775
|
|
753
776
|
@property
|
zenml/models/v2/base/scoped.py
CHANGED
@@ -464,19 +464,19 @@ class WorkspaceScopedFilter(UserScopedFilter):
|
|
464
464
|
return super().apply_sorting(query=query, table=table)
|
465
465
|
|
466
466
|
|
467
|
-
class
|
468
|
-
"""Model to enable
|
467
|
+
class TaggableFilter(BaseFilter):
|
468
|
+
"""Model to enable filtering and sorting by tags."""
|
469
469
|
|
470
470
|
tag: Optional[str] = Field(
|
471
471
|
description="Tag to apply to the filter query.", default=None
|
472
472
|
)
|
473
473
|
|
474
474
|
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
475
|
-
*
|
475
|
+
*BaseFilter.FILTER_EXCLUDE_FIELDS,
|
476
476
|
"tag",
|
477
477
|
]
|
478
478
|
CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
|
479
|
-
*
|
479
|
+
*BaseFilter.CUSTOM_SORTING_OPTIONS,
|
480
480
|
"tags",
|
481
481
|
]
|
482
482
|
|
zenml/models/v2/core/artifact.py
CHANGED
@@ -35,7 +35,7 @@ from zenml.models.v2.base.base import (
|
|
35
35
|
BaseResponseMetadata,
|
36
36
|
BaseResponseResources,
|
37
37
|
)
|
38
|
-
from zenml.models.v2.base.scoped import
|
38
|
+
from zenml.models.v2.base.scoped import TaggableFilter
|
39
39
|
from zenml.models.v2.core.tag import TagResponse
|
40
40
|
|
41
41
|
if TYPE_CHECKING:
|
@@ -183,14 +183,14 @@ class ArtifactResponse(
|
|
183
183
|
# ------------------ Filter Model ------------------
|
184
184
|
|
185
185
|
|
186
|
-
class ArtifactFilter(
|
186
|
+
class ArtifactFilter(TaggableFilter):
|
187
187
|
"""Model to enable advanced filtering of artifacts."""
|
188
188
|
|
189
189
|
name: Optional[str] = None
|
190
190
|
has_custom_name: Optional[bool] = None
|
191
191
|
|
192
192
|
CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
|
193
|
-
*
|
193
|
+
*TaggableFilter.CUSTOM_SORTING_OPTIONS,
|
194
194
|
SORT_BY_LATEST_VERSION_KEY,
|
195
195
|
]
|
196
196
|
|
@@ -41,12 +41,13 @@ from zenml.logger import get_logger
|
|
41
41
|
from zenml.metadata.metadata_types import MetadataType
|
42
42
|
from zenml.models.v2.base.filter import FilterGenerator, StrFilter
|
43
43
|
from zenml.models.v2.base.scoped import (
|
44
|
+
TaggableFilter,
|
45
|
+
WorkspaceScopedFilter,
|
44
46
|
WorkspaceScopedRequest,
|
45
47
|
WorkspaceScopedResponse,
|
46
48
|
WorkspaceScopedResponseBody,
|
47
49
|
WorkspaceScopedResponseMetadata,
|
48
50
|
WorkspaceScopedResponseResources,
|
49
|
-
WorkspaceScopedTaggableFilter,
|
50
51
|
)
|
51
52
|
from zenml.models.v2.core.artifact import ArtifactResponse
|
52
53
|
from zenml.models.v2.core.tag import TagResponse
|
@@ -469,11 +470,12 @@ class ArtifactVersionResponse(
|
|
469
470
|
# ------------------ Filter Model ------------------
|
470
471
|
|
471
472
|
|
472
|
-
class ArtifactVersionFilter(
|
473
|
+
class ArtifactVersionFilter(WorkspaceScopedFilter, TaggableFilter):
|
473
474
|
"""Model to enable advanced filtering of artifact versions."""
|
474
475
|
|
475
476
|
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
476
|
-
*
|
477
|
+
*WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
|
478
|
+
*TaggableFilter.FILTER_EXCLUDE_FIELDS,
|
477
479
|
"name",
|
478
480
|
"only_unused",
|
479
481
|
"has_custom_name",
|
@@ -482,6 +484,15 @@ class ArtifactVersionFilter(WorkspaceScopedTaggableFilter):
|
|
482
484
|
"model_version_id",
|
483
485
|
"run_metadata",
|
484
486
|
]
|
487
|
+
CUSTOM_SORTING_OPTIONS = [
|
488
|
+
*WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
|
489
|
+
*TaggableFilter.CUSTOM_SORTING_OPTIONS,
|
490
|
+
]
|
491
|
+
CLI_EXCLUDE_FIELDS = [
|
492
|
+
*WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
|
493
|
+
*TaggableFilter.CLI_EXCLUDE_FIELDS,
|
494
|
+
]
|
495
|
+
|
485
496
|
artifact_id: Optional[Union[UUID, str]] = Field(
|
486
497
|
default=None,
|
487
498
|
description="ID of the artifact to which this version belongs.",
|
@@ -548,7 +559,7 @@ class ArtifactVersionFilter(WorkspaceScopedTaggableFilter):
|
|
548
559
|
description="Name/ID of a pipeline run that is associated with this "
|
549
560
|
"artifact version.",
|
550
561
|
)
|
551
|
-
run_metadata: Optional[Dict[str,
|
562
|
+
run_metadata: Optional[Dict[str, Any]] = Field(
|
552
563
|
default=None,
|
553
564
|
description="The run_metadata to filter the artifact versions by.",
|
554
565
|
)
|
@@ -672,13 +683,19 @@ class ArtifactVersionFilter(WorkspaceScopedTaggableFilter):
|
|
672
683
|
RunMetadataResourceSchema.resource_id
|
673
684
|
== ArtifactVersionSchema.id,
|
674
685
|
RunMetadataResourceSchema.resource_type
|
675
|
-
== MetadataResourceTypes.ARTIFACT_VERSION,
|
686
|
+
== MetadataResourceTypes.ARTIFACT_VERSION.value,
|
676
687
|
RunMetadataResourceSchema.run_metadata_id
|
677
688
|
== RunMetadataSchema.id,
|
689
|
+
self.generate_custom_query_conditions_for_column(
|
690
|
+
value=key,
|
691
|
+
table=RunMetadataSchema,
|
692
|
+
column="key",
|
693
|
+
),
|
678
694
|
self.generate_custom_query_conditions_for_column(
|
679
695
|
value=value,
|
680
696
|
table=RunMetadataSchema,
|
681
697
|
column="value",
|
698
|
+
json_encode_value=True,
|
682
699
|
),
|
683
700
|
)
|
684
701
|
custom_filters.append(additional_filter)
|
zenml/models/v2/core/model.py
CHANGED
@@ -24,12 +24,13 @@ from zenml.constants import (
|
|
24
24
|
TEXT_FIELD_MAX_LENGTH,
|
25
25
|
)
|
26
26
|
from zenml.models.v2.base.scoped import (
|
27
|
+
TaggableFilter,
|
28
|
+
WorkspaceScopedFilter,
|
27
29
|
WorkspaceScopedRequest,
|
28
30
|
WorkspaceScopedResponse,
|
29
31
|
WorkspaceScopedResponseBody,
|
30
32
|
WorkspaceScopedResponseMetadata,
|
31
33
|
WorkspaceScopedResponseResources,
|
32
|
-
WorkspaceScopedTaggableFilter,
|
33
34
|
)
|
34
35
|
from zenml.utils.pagination_utils import depaginate
|
35
36
|
|
@@ -322,7 +323,7 @@ class ModelResponse(
|
|
322
323
|
# ------------------ Filter Model ------------------
|
323
324
|
|
324
325
|
|
325
|
-
class ModelFilter(
|
326
|
+
class ModelFilter(WorkspaceScopedFilter, TaggableFilter):
|
326
327
|
"""Model to enable advanced filtering of all Workspaces."""
|
327
328
|
|
328
329
|
name: Optional[str] = Field(
|
@@ -330,10 +331,19 @@ class ModelFilter(WorkspaceScopedTaggableFilter):
|
|
330
331
|
description="Name of the Model",
|
331
332
|
)
|
332
333
|
|
334
|
+
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
335
|
+
*WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
|
336
|
+
*TaggableFilter.FILTER_EXCLUDE_FIELDS,
|
337
|
+
]
|
333
338
|
CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
|
334
|
-
*
|
339
|
+
*WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
|
340
|
+
*TaggableFilter.CUSTOM_SORTING_OPTIONS,
|
335
341
|
SORT_BY_LATEST_VERSION_KEY,
|
336
342
|
]
|
343
|
+
CLI_EXCLUDE_FIELDS = [
|
344
|
+
*WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
|
345
|
+
*TaggableFilter.CLI_EXCLUDE_FIELDS,
|
346
|
+
]
|
337
347
|
|
338
348
|
def apply_sorting(
|
339
349
|
self,
|
@@ -33,12 +33,13 @@ from zenml.metadata.metadata_types import MetadataType
|
|
33
33
|
from zenml.models.v2.base.filter import AnyQuery
|
34
34
|
from zenml.models.v2.base.page import Page
|
35
35
|
from zenml.models.v2.base.scoped import (
|
36
|
+
TaggableFilter,
|
37
|
+
WorkspaceScopedFilter,
|
36
38
|
WorkspaceScopedRequest,
|
37
39
|
WorkspaceScopedResponse,
|
38
40
|
WorkspaceScopedResponseBody,
|
39
41
|
WorkspaceScopedResponseMetadata,
|
40
42
|
WorkspaceScopedResponseResources,
|
41
|
-
WorkspaceScopedTaggableFilter,
|
42
43
|
)
|
43
44
|
from zenml.models.v2.core.service import ServiceResponse
|
44
45
|
from zenml.models.v2.core.tag import TagResponse
|
@@ -576,13 +577,22 @@ class ModelVersionResponse(
|
|
576
577
|
# ------------------ Filter Model ------------------
|
577
578
|
|
578
579
|
|
579
|
-
class ModelVersionFilter(
|
580
|
+
class ModelVersionFilter(WorkspaceScopedFilter, TaggableFilter):
|
580
581
|
"""Filter model for model versions."""
|
581
582
|
|
582
583
|
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
583
|
-
*
|
584
|
+
*WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
|
585
|
+
*TaggableFilter.FILTER_EXCLUDE_FIELDS,
|
584
586
|
"run_metadata",
|
585
587
|
]
|
588
|
+
CUSTOM_SORTING_OPTIONS = [
|
589
|
+
*WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
|
590
|
+
*TaggableFilter.CUSTOM_SORTING_OPTIONS,
|
591
|
+
]
|
592
|
+
CLI_EXCLUDE_FIELDS = [
|
593
|
+
*WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
|
594
|
+
*TaggableFilter.CLI_EXCLUDE_FIELDS,
|
595
|
+
]
|
586
596
|
|
587
597
|
name: Optional[str] = Field(
|
588
598
|
default=None,
|
zenml/models/v2/core/pipeline.py
CHANGED
@@ -34,12 +34,13 @@ from zenml.constants import (
|
|
34
34
|
from zenml.enums import ExecutionStatus
|
35
35
|
from zenml.models.v2.base.base import BaseUpdate
|
36
36
|
from zenml.models.v2.base.scoped import (
|
37
|
+
TaggableFilter,
|
38
|
+
WorkspaceScopedFilter,
|
37
39
|
WorkspaceScopedRequest,
|
38
40
|
WorkspaceScopedResponse,
|
39
41
|
WorkspaceScopedResponseBody,
|
40
42
|
WorkspaceScopedResponseMetadata,
|
41
43
|
WorkspaceScopedResponseResources,
|
42
|
-
WorkspaceScopedTaggableFilter,
|
43
44
|
)
|
44
45
|
from zenml.models.v2.core.tag import TagResponse
|
45
46
|
|
@@ -256,17 +257,23 @@ class PipelineResponse(
|
|
256
257
|
# ------------------ Filter Model ------------------
|
257
258
|
|
258
259
|
|
259
|
-
class PipelineFilter(
|
260
|
+
class PipelineFilter(WorkspaceScopedFilter, TaggableFilter):
|
260
261
|
"""Pipeline filter model."""
|
261
262
|
|
262
263
|
CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
|
263
|
-
*
|
264
|
+
*WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
|
265
|
+
*TaggableFilter.CUSTOM_SORTING_OPTIONS,
|
264
266
|
SORT_PIPELINES_BY_LATEST_RUN_KEY,
|
265
267
|
]
|
266
268
|
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
267
|
-
*
|
269
|
+
*WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
|
270
|
+
*TaggableFilter.FILTER_EXCLUDE_FIELDS,
|
268
271
|
"latest_run_status",
|
269
272
|
]
|
273
|
+
CLI_EXCLUDE_FIELDS = [
|
274
|
+
*WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
|
275
|
+
*TaggableFilter.CLI_EXCLUDE_FIELDS,
|
276
|
+
]
|
270
277
|
|
271
278
|
name: Optional[str] = Field(
|
272
279
|
default=None,
|
@@ -35,12 +35,13 @@ from zenml.constants import STR_FIELD_MAX_LENGTH
|
|
35
35
|
from zenml.enums import ExecutionStatus
|
36
36
|
from zenml.metadata.metadata_types import MetadataType
|
37
37
|
from zenml.models.v2.base.scoped import (
|
38
|
+
TaggableFilter,
|
39
|
+
WorkspaceScopedFilter,
|
38
40
|
WorkspaceScopedRequest,
|
39
41
|
WorkspaceScopedResponse,
|
40
42
|
WorkspaceScopedResponseBody,
|
41
43
|
WorkspaceScopedResponseMetadata,
|
42
44
|
WorkspaceScopedResponseResources,
|
43
|
-
WorkspaceScopedTaggableFilter,
|
44
45
|
)
|
45
46
|
from zenml.models.v2.core.model_version import ModelVersionResponse
|
46
47
|
from zenml.models.v2.core.tag import TagResponse
|
@@ -589,20 +590,21 @@ class PipelineRunResponse(
|
|
589
590
|
# ------------------ Filter Model ------------------
|
590
591
|
|
591
592
|
|
592
|
-
class PipelineRunFilter(
|
593
|
+
class PipelineRunFilter(WorkspaceScopedFilter, TaggableFilter):
|
593
594
|
"""Model to enable advanced filtering of all Workspaces."""
|
594
595
|
|
595
596
|
CUSTOM_SORTING_OPTIONS: ClassVar[List[str]] = [
|
596
|
-
*
|
597
|
+
*WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
|
598
|
+
*TaggableFilter.CUSTOM_SORTING_OPTIONS,
|
597
599
|
"tag",
|
598
600
|
"stack",
|
599
601
|
"pipeline",
|
600
602
|
"model",
|
601
603
|
"model_version",
|
602
604
|
]
|
603
|
-
|
604
605
|
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
605
|
-
*
|
606
|
+
*WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
|
607
|
+
*TaggableFilter.FILTER_EXCLUDE_FIELDS,
|
606
608
|
"unlisted",
|
607
609
|
"code_repository_id",
|
608
610
|
"build_id",
|
@@ -618,6 +620,11 @@ class PipelineRunFilter(WorkspaceScopedTaggableFilter):
|
|
618
620
|
"templatable",
|
619
621
|
"run_metadata",
|
620
622
|
]
|
623
|
+
CLI_EXCLUDE_FIELDS = [
|
624
|
+
*WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
|
625
|
+
*TaggableFilter.CLI_EXCLUDE_FIELDS,
|
626
|
+
]
|
627
|
+
|
621
628
|
name: Optional[str] = Field(
|
622
629
|
default=None,
|
623
630
|
description="Name of the Pipeline Run",
|
@@ -681,7 +688,7 @@ class PipelineRunFilter(WorkspaceScopedTaggableFilter):
|
|
681
688
|
union_mode="left_to_right",
|
682
689
|
)
|
683
690
|
unlisted: Optional[bool] = None
|
684
|
-
run_metadata: Optional[Dict[str,
|
691
|
+
run_metadata: Optional[Dict[str, Any]] = Field(
|
685
692
|
default=None,
|
686
693
|
description="The run_metadata to filter the pipeline runs by.",
|
687
694
|
)
|
@@ -908,13 +915,19 @@ class PipelineRunFilter(WorkspaceScopedTaggableFilter):
|
|
908
915
|
RunMetadataResourceSchema.resource_id
|
909
916
|
== PipelineRunSchema.id,
|
910
917
|
RunMetadataResourceSchema.resource_type
|
911
|
-
== MetadataResourceTypes.PIPELINE_RUN,
|
918
|
+
== MetadataResourceTypes.PIPELINE_RUN.value,
|
912
919
|
RunMetadataResourceSchema.run_metadata_id
|
913
920
|
== RunMetadataSchema.id,
|
921
|
+
self.generate_custom_query_conditions_for_column(
|
922
|
+
value=key,
|
923
|
+
table=RunMetadataSchema,
|
924
|
+
column="key",
|
925
|
+
),
|
914
926
|
self.generate_custom_query_conditions_for_column(
|
915
927
|
value=value,
|
916
928
|
table=RunMetadataSchema,
|
917
929
|
column="value",
|
930
|
+
json_encode_value=True,
|
918
931
|
),
|
919
932
|
)
|
920
933
|
custom_filters.append(additional_filter)
|
@@ -33,12 +33,13 @@ from zenml.constants import STR_FIELD_MAX_LENGTH, TEXT_FIELD_MAX_LENGTH
|
|
33
33
|
from zenml.enums import ExecutionStatus
|
34
34
|
from zenml.models.v2.base.base import BaseUpdate
|
35
35
|
from zenml.models.v2.base.scoped import (
|
36
|
+
TaggableFilter,
|
37
|
+
WorkspaceScopedFilter,
|
36
38
|
WorkspaceScopedRequest,
|
37
39
|
WorkspaceScopedResponse,
|
38
40
|
WorkspaceScopedResponseBody,
|
39
41
|
WorkspaceScopedResponseMetadata,
|
40
42
|
WorkspaceScopedResponseResources,
|
41
|
-
WorkspaceScopedTaggableFilter,
|
42
43
|
)
|
43
44
|
from zenml.models.v2.core.code_reference import (
|
44
45
|
CodeReferenceResponse,
|
@@ -307,11 +308,12 @@ class RunTemplateResponse(
|
|
307
308
|
# ------------------ Filter Model ------------------
|
308
309
|
|
309
310
|
|
310
|
-
class RunTemplateFilter(
|
311
|
+
class RunTemplateFilter(WorkspaceScopedFilter, TaggableFilter):
|
311
312
|
"""Model for filtering of run templates."""
|
312
313
|
|
313
314
|
FILTER_EXCLUDE_FIELDS: ClassVar[List[str]] = [
|
314
|
-
*
|
315
|
+
*WorkspaceScopedFilter.FILTER_EXCLUDE_FIELDS,
|
316
|
+
*TaggableFilter.FILTER_EXCLUDE_FIELDS,
|
315
317
|
"code_repository_id",
|
316
318
|
"stack_id",
|
317
319
|
"build_id",
|
@@ -320,6 +322,14 @@ class RunTemplateFilter(WorkspaceScopedTaggableFilter):
|
|
320
322
|
"pipeline",
|
321
323
|
"stack",
|
322
324
|
]
|
325
|
+
CUSTOM_SORTING_OPTIONS = [
|
326
|
+
*WorkspaceScopedFilter.CUSTOM_SORTING_OPTIONS,
|
327
|
+
*TaggableFilter.CUSTOM_SORTING_OPTIONS,
|
328
|
+
]
|
329
|
+
CLI_EXCLUDE_FIELDS = [
|
330
|
+
*WorkspaceScopedFilter.CLI_EXCLUDE_FIELDS,
|
331
|
+
*TaggableFilter.CLI_EXCLUDE_FIELDS,
|
332
|
+
]
|
323
333
|
|
324
334
|
name: Optional[str] = Field(
|
325
335
|
default=None,
|
zenml/models/v2/core/step_run.py
CHANGED
@@ -16,6 +16,7 @@
|
|
16
16
|
from datetime import datetime
|
17
17
|
from typing import (
|
18
18
|
TYPE_CHECKING,
|
19
|
+
Any,
|
19
20
|
ClassVar,
|
20
21
|
Dict,
|
21
22
|
List,
|
@@ -574,7 +575,7 @@ class StepRunFilter(WorkspaceScopedFilter):
|
|
574
575
|
default=None,
|
575
576
|
description="Name/ID of the model associated with the step run.",
|
576
577
|
)
|
577
|
-
run_metadata: Optional[Dict[str,
|
578
|
+
run_metadata: Optional[Dict[str, Any]] = Field(
|
578
579
|
default=None,
|
579
580
|
description="The run_metadata to filter the step runs by.",
|
580
581
|
)
|
@@ -619,13 +620,19 @@ class StepRunFilter(WorkspaceScopedFilter):
|
|
619
620
|
additional_filter = and_(
|
620
621
|
RunMetadataResourceSchema.resource_id == StepRunSchema.id,
|
621
622
|
RunMetadataResourceSchema.resource_type
|
622
|
-
== MetadataResourceTypes.STEP_RUN,
|
623
|
+
== MetadataResourceTypes.STEP_RUN.value,
|
623
624
|
RunMetadataResourceSchema.run_metadata_id
|
624
625
|
== RunMetadataSchema.id,
|
626
|
+
self.generate_custom_query_conditions_for_column(
|
627
|
+
value=key,
|
628
|
+
table=RunMetadataSchema,
|
629
|
+
column="key",
|
630
|
+
),
|
625
631
|
self.generate_custom_query_conditions_for_column(
|
626
632
|
value=value,
|
627
633
|
table=RunMetadataSchema,
|
628
634
|
column="value",
|
635
|
+
json_encode_value=True,
|
629
636
|
),
|
630
637
|
)
|
631
638
|
custom_filters.append(additional_filter)
|
@@ -407,17 +407,31 @@ class Pipeline:
|
|
407
407
|
return self
|
408
408
|
|
409
409
|
@property
|
410
|
-
def
|
411
|
-
"""
|
410
|
+
def required_parameters(self) -> List[str]:
|
411
|
+
"""List of required parameters for the pipeline entrypoint.
|
412
412
|
|
413
413
|
Returns:
|
414
|
-
|
414
|
+
List of required parameters for the pipeline entrypoint.
|
415
415
|
"""
|
416
416
|
signature = inspect.signature(self.entrypoint, follow_wrapped=True)
|
417
|
-
return
|
418
|
-
parameter.
|
417
|
+
return [
|
418
|
+
parameter.name
|
419
419
|
for parameter in signature.parameters.values()
|
420
|
-
|
420
|
+
if parameter.default is inspect.Parameter.empty
|
421
|
+
]
|
422
|
+
|
423
|
+
@property
|
424
|
+
def missing_parameters(self) -> List[str]:
|
425
|
+
"""List of missing parameters for the pipeline entrypoint.
|
426
|
+
|
427
|
+
Returns:
|
428
|
+
List of missing parameters for the pipeline entrypoint.
|
429
|
+
"""
|
430
|
+
available_parameters = set(self.configuration.parameters or {})
|
431
|
+
if params_from_file := self._from_config_file.get("parameters", None):
|
432
|
+
available_parameters.update(params_from_file)
|
433
|
+
|
434
|
+
return list(set(self.required_parameters) - available_parameters)
|
421
435
|
|
422
436
|
@property
|
423
437
|
def is_prepared(self) -> bool:
|
@@ -1412,7 +1426,7 @@ To avoid this consider setting pipeline parameters only in one place (config or
|
|
1412
1426
|
except ValidationError as e:
|
1413
1427
|
raise ValueError(
|
1414
1428
|
"Invalid or missing pipeline function entrypoint arguments. "
|
1415
|
-
"Only JSON serializable inputs are allowed as pipeline inputs."
|
1429
|
+
"Only JSON serializable inputs are allowed as pipeline inputs. "
|
1416
1430
|
"Check out the pydantic error above for more details."
|
1417
1431
|
) from e
|
1418
1432
|
|
@@ -1427,15 +1441,17 @@ To avoid this consider setting pipeline parameters only in one place (config or
|
|
1427
1441
|
requires parameters.
|
1428
1442
|
"""
|
1429
1443
|
if not self.is_prepared:
|
1430
|
-
if self.
|
1444
|
+
if missing_parameters := self.missing_parameters:
|
1431
1445
|
raise RuntimeError(
|
1432
1446
|
f"Failed while trying to prepare pipeline {self.name}. "
|
1433
1447
|
"The entrypoint function of the pipeline requires "
|
1434
|
-
"arguments
|
1435
|
-
"
|
1448
|
+
"arguments which have not been configured yet: "
|
1449
|
+
f"{missing_parameters}. Please provide those parameters by "
|
1450
|
+
"calling `pipeline_instance.configure(parameters=...)` or "
|
1451
|
+
"by calling `pipeline_instance.prepare(...)` and try again."
|
1436
1452
|
)
|
1437
|
-
|
1438
|
-
|
1453
|
+
|
1454
|
+
self.prepare()
|
1439
1455
|
|
1440
1456
|
def create_run_template(
|
1441
1457
|
self, name: str, **kwargs: Any
|
@@ -18,7 +18,8 @@ from uuid import UUID
|
|
18
18
|
|
19
19
|
from pydantic import ValidationError
|
20
20
|
from sqlalchemy import TEXT, Column, UniqueConstraint
|
21
|
-
from
|
21
|
+
from sqlalchemy.orm import object_session
|
22
|
+
from sqlmodel import Field, Relationship, desc, select
|
22
23
|
|
23
24
|
from zenml.config.source import Source
|
24
25
|
from zenml.enums import (
|
@@ -90,6 +91,32 @@ class ArtifactSchema(NamedSchema, table=True):
|
|
90
91
|
),
|
91
92
|
)
|
92
93
|
|
94
|
+
@property
|
95
|
+
def latest_version(self) -> Optional["ArtifactVersionSchema"]:
|
96
|
+
"""Fetch the latest version for this artifact.
|
97
|
+
|
98
|
+
Raises:
|
99
|
+
RuntimeError: If no session for the schema exists.
|
100
|
+
|
101
|
+
Returns:
|
102
|
+
The latest version for this artifact.
|
103
|
+
"""
|
104
|
+
if session := object_session(self):
|
105
|
+
return (
|
106
|
+
session.execute(
|
107
|
+
select(ArtifactVersionSchema)
|
108
|
+
.where(ArtifactVersionSchema.artifact_id == self.id)
|
109
|
+
.order_by(desc(ArtifactVersionSchema.created))
|
110
|
+
.limit(1)
|
111
|
+
)
|
112
|
+
.scalars()
|
113
|
+
.one_or_none()
|
114
|
+
)
|
115
|
+
else:
|
116
|
+
raise RuntimeError(
|
117
|
+
"Missing DB session to fetch latest version for artifact."
|
118
|
+
)
|
119
|
+
|
93
120
|
@classmethod
|
94
121
|
def from_request(
|
95
122
|
cls,
|
@@ -127,9 +154,9 @@ class ArtifactSchema(NamedSchema, table=True):
|
|
127
154
|
The created `ArtifactResponse`.
|
128
155
|
"""
|
129
156
|
latest_id, latest_name = None, None
|
130
|
-
if self.
|
131
|
-
|
132
|
-
|
157
|
+
if latest_version := self.latest_version:
|
158
|
+
latest_id = latest_version.id
|
159
|
+
latest_name = latest_version.version
|
133
160
|
|
134
161
|
# Create the body of the model
|
135
162
|
body = ArtifactResponseBody(
|
@@ -24,7 +24,8 @@ from sqlalchemy import (
|
|
24
24
|
Column,
|
25
25
|
UniqueConstraint,
|
26
26
|
)
|
27
|
-
from
|
27
|
+
from sqlalchemy.orm import object_session
|
28
|
+
from sqlmodel import Field, Relationship, desc, select
|
28
29
|
|
29
30
|
from zenml.enums import (
|
30
31
|
ArtifactType,
|
@@ -126,6 +127,32 @@ class ModelSchema(NamedSchema, table=True):
|
|
126
127
|
sa_relationship_kwargs={"cascade": "delete"},
|
127
128
|
)
|
128
129
|
|
130
|
+
@property
|
131
|
+
def latest_version(self) -> Optional["ModelVersionSchema"]:
|
132
|
+
"""Fetch the latest version for this model.
|
133
|
+
|
134
|
+
Raises:
|
135
|
+
RuntimeError: If no session for the schema exists.
|
136
|
+
|
137
|
+
Returns:
|
138
|
+
The latest version for this model.
|
139
|
+
"""
|
140
|
+
if session := object_session(self):
|
141
|
+
return (
|
142
|
+
session.execute(
|
143
|
+
select(ModelVersionSchema)
|
144
|
+
.where(ModelVersionSchema.model_id == self.id)
|
145
|
+
.order_by(desc(ModelVersionSchema.number))
|
146
|
+
.limit(1)
|
147
|
+
)
|
148
|
+
.scalars()
|
149
|
+
.one_or_none()
|
150
|
+
)
|
151
|
+
else:
|
152
|
+
raise RuntimeError(
|
153
|
+
"Missing DB session to fetch latest version for model."
|
154
|
+
)
|
155
|
+
|
129
156
|
@classmethod
|
130
157
|
def from_request(cls, model_request: ModelRequest) -> "ModelSchema":
|
131
158
|
"""Convert an `ModelRequest` to an `ModelSchema`.
|
@@ -169,11 +196,9 @@ class ModelSchema(NamedSchema, table=True):
|
|
169
196
|
"""
|
170
197
|
tags = [tag.to_model() for tag in self.tags]
|
171
198
|
|
172
|
-
if self.
|
173
|
-
|
174
|
-
|
175
|
-
latest_version_name = self.model_versions[latest_version_idx].name
|
176
|
-
latest_version_id = self.model_versions[latest_version_idx].id
|
199
|
+
if latest_version := self.latest_version:
|
200
|
+
latest_version_name = latest_version.name
|
201
|
+
latest_version_id = latest_version.id
|
177
202
|
else:
|
178
203
|
latest_version_name = None
|
179
204
|
latest_version_id = None
|
@@ -208,7 +208,7 @@ class PipelineRunSchema(NamedSchema, RunMetadataInterface, table=True):
|
|
208
208
|
stack: Optional["StackSchema"] = Relationship()
|
209
209
|
build: Optional["PipelineBuildSchema"] = Relationship()
|
210
210
|
schedule: Optional["ScheduleSchema"] = Relationship()
|
211
|
-
pipeline: Optional["PipelineSchema"] = Relationship(
|
211
|
+
pipeline: Optional["PipelineSchema"] = Relationship()
|
212
212
|
trigger_execution: Optional["TriggerExecutionSchema"] = Relationship()
|
213
213
|
|
214
214
|
services: List["ServiceSchema"] = Relationship(
|
@@ -17,7 +17,8 @@ from typing import TYPE_CHECKING, Any, List, Optional
|
|
17
17
|
from uuid import UUID
|
18
18
|
|
19
19
|
from sqlalchemy import TEXT, Column, UniqueConstraint
|
20
|
-
from
|
20
|
+
from sqlalchemy.orm import object_session
|
21
|
+
from sqlmodel import Field, Relationship, desc, select
|
21
22
|
|
22
23
|
from zenml.enums import TaggableResourceTypes
|
23
24
|
from zenml.models import (
|
@@ -85,10 +86,6 @@ class PipelineSchema(NamedSchema, table=True):
|
|
85
86
|
schedules: List["ScheduleSchema"] = Relationship(
|
86
87
|
back_populates="pipeline",
|
87
88
|
)
|
88
|
-
runs: List["PipelineRunSchema"] = Relationship(
|
89
|
-
back_populates="pipeline",
|
90
|
-
sa_relationship_kwargs={"order_by": "PipelineRunSchema.created"},
|
91
|
-
)
|
92
89
|
builds: List["PipelineBuildSchema"] = Relationship(
|
93
90
|
back_populates="pipeline"
|
94
91
|
)
|
@@ -105,6 +102,34 @@ class PipelineSchema(NamedSchema, table=True):
|
|
105
102
|
),
|
106
103
|
)
|
107
104
|
|
105
|
+
@property
|
106
|
+
def latest_run(self) -> Optional["PipelineRunSchema"]:
|
107
|
+
"""Fetch the latest run for this pipeline.
|
108
|
+
|
109
|
+
Raises:
|
110
|
+
RuntimeError: If no session for the schema exists.
|
111
|
+
|
112
|
+
Returns:
|
113
|
+
The latest run for this pipeline.
|
114
|
+
"""
|
115
|
+
from zenml.zen_stores.schemas import PipelineRunSchema
|
116
|
+
|
117
|
+
if session := object_session(self):
|
118
|
+
return (
|
119
|
+
session.execute(
|
120
|
+
select(PipelineRunSchema)
|
121
|
+
.where(PipelineRunSchema.pipeline_id == self.id)
|
122
|
+
.order_by(desc(PipelineRunSchema.created))
|
123
|
+
.limit(1)
|
124
|
+
)
|
125
|
+
.scalars()
|
126
|
+
.one_or_none()
|
127
|
+
)
|
128
|
+
else:
|
129
|
+
raise RuntimeError(
|
130
|
+
"Missing DB session to fetch latest run for pipeline."
|
131
|
+
)
|
132
|
+
|
108
133
|
@classmethod
|
109
134
|
def from_request(
|
110
135
|
cls,
|
@@ -141,10 +166,12 @@ class PipelineSchema(NamedSchema, table=True):
|
|
141
166
|
Returns:
|
142
167
|
The created PipelineResponse.
|
143
168
|
"""
|
169
|
+
latest_run = self.latest_run
|
170
|
+
|
144
171
|
body = PipelineResponseBody(
|
145
172
|
user=self.user.to_model() if self.user else None,
|
146
|
-
latest_run_id=
|
147
|
-
latest_run_status=
|
173
|
+
latest_run_id=latest_run.id if latest_run else None,
|
174
|
+
latest_run_status=latest_run.status if latest_run else None,
|
148
175
|
created=self.created,
|
149
176
|
updated=self.updated,
|
150
177
|
)
|
@@ -158,7 +185,7 @@ class PipelineSchema(NamedSchema, table=True):
|
|
158
185
|
|
159
186
|
resources = None
|
160
187
|
if include_resources:
|
161
|
-
latest_run_user =
|
188
|
+
latest_run_user = latest_run.user if latest_run else None
|
162
189
|
|
163
190
|
resources = PipelineResponseResources(
|
164
191
|
latest_run_user=latest_run_user.to_model()
|
@@ -18,7 +18,8 @@ from uuid import UUID
|
|
18
18
|
|
19
19
|
from sqlalchemy import Column, String, UniqueConstraint
|
20
20
|
from sqlalchemy.dialects.mysql import MEDIUMTEXT
|
21
|
-
from
|
21
|
+
from sqlalchemy.orm import object_session
|
22
|
+
from sqlmodel import Field, Relationship, col, desc, select
|
22
23
|
|
23
24
|
from zenml.constants import MEDIUMTEXT_MAX_LENGTH
|
24
25
|
from zenml.enums import TaggableResourceTypes
|
@@ -99,17 +100,6 @@ class RunTemplateSchema(BaseSchema, table=True):
|
|
99
100
|
}
|
100
101
|
)
|
101
102
|
|
102
|
-
runs: List["PipelineRunSchema"] = Relationship(
|
103
|
-
sa_relationship_kwargs={
|
104
|
-
"primaryjoin": "RunTemplateSchema.id==PipelineDeploymentSchema.template_id",
|
105
|
-
"secondaryjoin": "PipelineDeploymentSchema.id==PipelineRunSchema.deployment_id",
|
106
|
-
"secondary": "pipeline_deployment",
|
107
|
-
"cascade": "delete",
|
108
|
-
"viewonly": True,
|
109
|
-
"order_by": "PipelineRunSchema.created",
|
110
|
-
}
|
111
|
-
)
|
112
|
-
|
113
103
|
tags: List["TagSchema"] = Relationship(
|
114
104
|
sa_relationship_kwargs=dict(
|
115
105
|
primaryjoin=f"and_(foreign(TagResourceSchema.resource_type)=='{TaggableResourceTypes.RUN_TEMPLATE.value}', foreign(TagResourceSchema.resource_id)==RunTemplateSchema.id)",
|
@@ -120,6 +110,42 @@ class RunTemplateSchema(BaseSchema, table=True):
|
|
120
110
|
),
|
121
111
|
)
|
122
112
|
|
113
|
+
@property
|
114
|
+
def latest_run(self) -> Optional["PipelineRunSchema"]:
|
115
|
+
"""Fetch the latest run for this template.
|
116
|
+
|
117
|
+
Raises:
|
118
|
+
RuntimeError: If no session for the schema exists.
|
119
|
+
|
120
|
+
Returns:
|
121
|
+
The latest run for this template.
|
122
|
+
"""
|
123
|
+
from zenml.zen_stores.schemas import (
|
124
|
+
PipelineDeploymentSchema,
|
125
|
+
PipelineRunSchema,
|
126
|
+
)
|
127
|
+
|
128
|
+
if session := object_session(self):
|
129
|
+
return (
|
130
|
+
session.execute(
|
131
|
+
select(PipelineRunSchema)
|
132
|
+
.join(
|
133
|
+
PipelineDeploymentSchema,
|
134
|
+
col(PipelineDeploymentSchema.id)
|
135
|
+
== col(PipelineRunSchema.deployment_id),
|
136
|
+
)
|
137
|
+
.where(PipelineDeploymentSchema.template_id == self.id)
|
138
|
+
.order_by(desc(PipelineRunSchema.created))
|
139
|
+
.limit(1)
|
140
|
+
)
|
141
|
+
.scalars()
|
142
|
+
.one_or_none()
|
143
|
+
)
|
144
|
+
else:
|
145
|
+
raise RuntimeError(
|
146
|
+
"Missing DB session to fetch latest run for template."
|
147
|
+
)
|
148
|
+
|
123
149
|
@classmethod
|
124
150
|
def from_request(
|
125
151
|
cls,
|
@@ -184,13 +210,15 @@ class RunTemplateSchema(BaseSchema, table=True):
|
|
184
210
|
):
|
185
211
|
runnable = True
|
186
212
|
|
213
|
+
latest_run = self.latest_run
|
214
|
+
|
187
215
|
body = RunTemplateResponseBody(
|
188
216
|
user=self.user.to_model() if self.user else None,
|
189
217
|
created=self.created,
|
190
218
|
updated=self.updated,
|
191
219
|
runnable=runnable,
|
192
|
-
latest_run_id=
|
193
|
-
latest_run_status=
|
220
|
+
latest_run_id=latest_run.id if latest_run else None,
|
221
|
+
latest_run_status=latest_run.status if latest_run else None,
|
194
222
|
)
|
195
223
|
|
196
224
|
metadata = None
|
{zenml_nightly-0.73.0.dev20250205.dist-info → zenml_nightly-0.73.0.dev20250206.dist-info}/RECORD
RENAMED
@@ -1,5 +1,5 @@
|
|
1
1
|
zenml/README.md,sha256=827dekbOWAs1BpW7VF1a4d7EbwPbjwccX-2zdXBENZo,1777
|
2
|
-
zenml/VERSION,sha256=
|
2
|
+
zenml/VERSION,sha256=ji5Aj9EhfhLiyX0DtPoxdFiamKZSRAvGE4VKg4u9TaA,19
|
3
3
|
zenml/__init__.py,sha256=SkMObQA41ajqdZqGErN00S1Vf3KAxpLvbZ-OBy5uYoo,2130
|
4
4
|
zenml/actions/__init__.py,sha256=mrt6wPo73iKRxK754_NqsGyJ3buW7RnVeIGXr1xEw8Y,681
|
5
5
|
zenml/actions/base_action.py,sha256=UcaHev6BTuLDwuswnyaPjdA8AgUqB5xPZ-lRtuvf2FU,25553
|
@@ -52,10 +52,10 @@ zenml/cli/stack_components.py,sha256=7RXVCJTX6sU-CiyDeu4kGYPJZ7QRQjDTptsvl__sI_A
|
|
52
52
|
zenml/cli/tag.py,sha256=Co-AL1eNZMf_AsqlcnJpoZ_k7UKa0l5X_g_TLpJdGes,4884
|
53
53
|
zenml/cli/text_utils.py,sha256=bY1GIjoULt1cW2FyrPlMoAXNS2R7cSOjDFEZQqrpVQ8,3553
|
54
54
|
zenml/cli/user_management.py,sha256=fTuRworQahst_j78qPYTtgciUeUOxwo7efiyPwmj2tI,13075
|
55
|
-
zenml/cli/utils.py,sha256=
|
55
|
+
zenml/cli/utils.py,sha256=oQm8clYsuATzEjXJNVMwmdTiygOwxErvUGONPIxb7no,86478
|
56
56
|
zenml/cli/version.py,sha256=nm1iSU_1V6-MUwpMKeXcwFhLYGUMLswvQL67cEuCpxA,3635
|
57
57
|
zenml/cli/workspace.py,sha256=bp02aXou574ToWPD8OAIB_cg3mvpE011H8aMKegT-nU,2970
|
58
|
-
zenml/client.py,sha256=
|
58
|
+
zenml/client.py,sha256=VGpvUNfs6D_7JthAjocEO6pDNfjeNkWwNudWVYrbgqo,283571
|
59
59
|
zenml/client_lazy_loader.py,sha256=MOBgS1ITYqGvPUnWQ6edn9s8Hr_72YfWbwEIfHKUr9g,7104
|
60
60
|
zenml/code_repositories/__init__.py,sha256=W5bDfzAG8OXIKZSV1L-VHuzMcSCYa9qzTdPb3jqfyYw,920
|
61
61
|
zenml/code_repositories/base_code_repository.py,sha256=Id6VjbUu8N3ZpNvBGhOgbahtoMiCAtYXed3G7YQ_iAc,5225
|
@@ -615,20 +615,20 @@ zenml/model_deployers/__init__.py,sha256=oVBLtTfrNenl5OI1iqtQUvJ0vpocRVUN_HIt8qp
|
|
615
615
|
zenml/model_deployers/base_model_deployer.py,sha256=Xg5lxBFYM41vqxQhaB54Dxu_zLCyPDgqwrTyMcAxiS4,24609
|
616
616
|
zenml/model_registries/__init__.py,sha256=wA9Vzo0w_e9zuXOVURB9w8oMLSnTaimXcxg_Nb7O3b0,1238
|
617
617
|
zenml/model_registries/base_model_registry.py,sha256=nK__C6IfoIRxnOHA9qyPErLvIsbakyac4ZltUZ8t3tk,17526
|
618
|
-
zenml/models/__init__.py,sha256=
|
618
|
+
zenml/models/__init__.py,sha256=sLMSaAWnoHYKAE0Tq8vi5o2k0fVeYiM7z72TwQyUZbI,21640
|
619
619
|
zenml/models/v2/__init__.py,sha256=LGMIUJi19sOsvo54roZSQwDp_czNQYtenqd_frTLIhU,613
|
620
620
|
zenml/models/v2/base/__init__.py,sha256=knhroJ2h0uHBCGzAiBBGJEiuhEA3cwI6XYBRIyXdbkQ,613
|
621
621
|
zenml/models/v2/base/base.py,sha256=tXzNTIwGNz7MEgfii3-6ASBNFg4SkR9D9ZM48tlNr84,16242
|
622
622
|
zenml/models/v2/base/base_plugin_flavor.py,sha256=BfPL4gm5i7ad7_vuRmPtC-rE2kl0W_8SmpWme8Akv1c,2608
|
623
|
-
zenml/models/v2/base/filter.py,sha256=
|
623
|
+
zenml/models/v2/base/filter.py,sha256=ScuQusfFOPUU52eAiLDditU7_IFcD6CeFVqrJwP6H20,37783
|
624
624
|
zenml/models/v2/base/page.py,sha256=yBpWB-8iUmyRwXKSJvX3v9SB7WOnyRa25O8SAss24xk,2601
|
625
|
-
zenml/models/v2/base/scoped.py,sha256=
|
625
|
+
zenml/models/v2/base/scoped.py,sha256=FrM-pSE2gKoVffMg-Zoei6lu4C4Rvpp-icIdbk6q9dE,17516
|
626
626
|
zenml/models/v2/core/__init__.py,sha256=LGMIUJi19sOsvo54roZSQwDp_czNQYtenqd_frTLIhU,613
|
627
627
|
zenml/models/v2/core/action.py,sha256=6n6Lep_2-OVUDCWs6eKiUHFKLvcoMjHWP4ZSbua1JRY,7911
|
628
628
|
zenml/models/v2/core/action_flavor.py,sha256=DlGlJTOcgLSDYAsrbAyXOJVdo7X2GYTFQTTEG5BEf-Q,1718
|
629
629
|
zenml/models/v2/core/api_key.py,sha256=Zv2N4NDraZUIrBOW1sSQtVp0Ik6zpdTFymYCOo17c-4,11534
|
630
|
-
zenml/models/v2/core/artifact.py,sha256=
|
631
|
-
zenml/models/v2/core/artifact_version.py,sha256=
|
630
|
+
zenml/models/v2/core/artifact.py,sha256=dmw36qIwtPDptU09nWGlwXhE0v0xXQ_4naIvndKh1ec,7610
|
631
|
+
zenml/models/v2/core/artifact_version.py,sha256=0eJFj9DJ7T6yfNp6W0qqjLwKIzfNOeiENAk9tk51I7o,23731
|
632
632
|
zenml/models/v2/core/artifact_visualization.py,sha256=milAHTpfuYd8Dx_oB4hcPYJL-TMoiU0FwUI0UhB3F-E,3115
|
633
633
|
zenml/models/v2/core/code_reference.py,sha256=9xy3Gzychq16lLUs01va3gGfwdu-AMrFgys_ua89uFY,3557
|
634
634
|
zenml/models/v2/core/code_repository.py,sha256=W4BuE8oterWPmtbCUCtOVsw8RfaOgiZ5aefuQHxL8dk,5580
|
@@ -638,16 +638,16 @@ zenml/models/v2/core/event_source.py,sha256=kOexFvxj3iqsQGiGHPe549v9cSTo2GfsPCK0
|
|
638
638
|
zenml/models/v2/core/event_source_flavor.py,sha256=TgrGkypnJUutMvvHE7Y9MbUiEeNXZxitc3eYlIbbsas,2077
|
639
639
|
zenml/models/v2/core/flavor.py,sha256=tcn2GDbkOyYjXTor_7_kR7FuLwcXjlfzvAV2rU1NVM4,12806
|
640
640
|
zenml/models/v2/core/logs.py,sha256=UhaPOTJD7IFKH8YozsaVgXYNNDHre8amheIm5JMZYQU,5824
|
641
|
-
zenml/models/v2/core/model.py,sha256=
|
642
|
-
zenml/models/v2/core/model_version.py,sha256=
|
641
|
+
zenml/models/v2/core/model.py,sha256=yok73T2D4hzYGP0nhDs5mq-1LKA9iol_k5DQyCVwf1o,11918
|
642
|
+
zenml/models/v2/core/model_version.py,sha256=q3fTYRSLR7i_84VFWqCmcm4FqGhwtlq2Wfhtm6G0u8M,21062
|
643
643
|
zenml/models/v2/core/model_version_artifact.py,sha256=ZyupuEsfPSjgaHDIUOojwJepJt1LTXDoUyE2h9htB_s,9086
|
644
644
|
zenml/models/v2/core/model_version_pipeline_run.py,sha256=JbPZZEQvOK9I32htkWdAONy7gvtoz_Jo45B5gYrh2vs,7036
|
645
|
-
zenml/models/v2/core/pipeline.py,sha256=
|
645
|
+
zenml/models/v2/core/pipeline.py,sha256=cql05iz2jqrlyRfn3jB4iQ_AgpHapD6Sr5Kd_6Q1W30,12044
|
646
646
|
zenml/models/v2/core/pipeline_build.py,sha256=bjSvmNnTF9xAycYfmTHO2wzgR-ZVWyy5V5-9ajZUxag,16399
|
647
647
|
zenml/models/v2/core/pipeline_deployment.py,sha256=6PbpnEUAbTT-_jPmyNtKuTJHFGdGLD2h5Zu_pXIHW1I,12108
|
648
|
-
zenml/models/v2/core/pipeline_run.py,sha256=
|
648
|
+
zenml/models/v2/core/pipeline_run.py,sha256=mmr3EP5jWq7sQ5FnUTD4kXYWY-yF5x6SW9Ei2a78Stc,33195
|
649
649
|
zenml/models/v2/core/run_metadata.py,sha256=YDiPVRzTUMVHqW4T_Ke4GJMdscp0aS_g8I4P8n70szc,2436
|
650
|
-
zenml/models/v2/core/run_template.py,sha256=
|
650
|
+
zenml/models/v2/core/run_template.py,sha256=R2ADxFbBi_zmJE7FA4M0DStIc-mfTiOMuVosniZH9XA,13298
|
651
651
|
zenml/models/v2/core/schedule.py,sha256=JNYTGPXDPMz7A9OjhnHIXyOLQuoFnrzOwChGibz2xQY,10774
|
652
652
|
zenml/models/v2/core/secret.py,sha256=LoY5BMZIrU6KYa39layHt6cbAnmMR7yXizv_1Qqse6Q,11460
|
653
653
|
zenml/models/v2/core/server_settings.py,sha256=al6LAXhoQHsBiTv2qlwFn1AlI2F8miogGB4xjDE6KeA,6267
|
@@ -655,7 +655,7 @@ zenml/models/v2/core/service.py,sha256=lwCDOFk-OXmfhB_bOOJy7rhbkR40tCScQsWnllgL7
|
|
655
655
|
zenml/models/v2/core/service_account.py,sha256=-1c9Et9Ma4_OHOZxIHjVnLJAaLLxhpoLEyGKkwc1Yx8,6619
|
656
656
|
zenml/models/v2/core/service_connector.py,sha256=-Fgi2bilbG99Fo0TWdelpTHMqi8l7E5M5S757b0VjdQ,37411
|
657
657
|
zenml/models/v2/core/stack.py,sha256=K5WVJ3vqjoHUlZ4Ezx-Bff3aSgTiBwpH7eViGVSx4YI,12083
|
658
|
-
zenml/models/v2/core/step_run.py,sha256=
|
658
|
+
zenml/models/v2/core/step_run.py,sha256=3LyE6z3K4cQgNC2B7nkyWHSUlaRNdLv-abAcxpnd1MM,19494
|
659
659
|
zenml/models/v2/core/tag.py,sha256=gQNkxmcksMxx5RJf1U_ug5-VxPhfaS11j--J3dl6muk,3534
|
660
660
|
zenml/models/v2/core/tag_resource.py,sha256=H7CPj9oaUpym8vSkwuYSJ6_rWfHMEKVRedPw2kyxmII,2640
|
661
661
|
zenml/models/v2/core/trigger.py,sha256=CDbKrJnHoYgYzFlS6gYIjrWihMSQkRyUwdUHNSgHSxY,12808
|
@@ -695,7 +695,7 @@ zenml/pipelines/__init__.py,sha256=hpIX7hN8jsQRHT5R-xSXZL88qrHwkmrvGLQeu1rWt4o,8
|
|
695
695
|
zenml/pipelines/build_utils.py,sha256=DkID1YnRYkw569uU-gidpF8WR8E7K55_wn3CzRPQ3Cs,27562
|
696
696
|
zenml/pipelines/pipeline_context.py,sha256=V_p-F9W7cBIlTjS0iv5-uJYMzaOj8bAUkc_uNhQgBms,3579
|
697
697
|
zenml/pipelines/pipeline_decorator.py,sha256=FIbflYOMavbuyGmqsx3F5zZgg0oXMTi1eAcGXciljOs,4293
|
698
|
-
zenml/pipelines/pipeline_definition.py,sha256=
|
698
|
+
zenml/pipelines/pipeline_definition.py,sha256=Pi4OGs7-WXbsm8_zczY5lpQEyLJPqkKZHjXAKfnk3HY,56936
|
699
699
|
zenml/pipelines/run_utils.py,sha256=4KuHIQFtLXTZNQBScTEkIG5pqNtu6xGm6UZT7ptyyKs,11623
|
700
700
|
zenml/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
701
701
|
zenml/plugins/base_plugin_flavor.py,sha256=88IxFW91UB_rQ8xPlfRnIhIJh7A308NEq2epMMdlOng,2530
|
@@ -1234,7 +1234,7 @@ zenml/zen_stores/rest_zen_store.py,sha256=tB890hOnYaixDKWr7xddpNsNI0GxLV7D4PQd-T
|
|
1234
1234
|
zenml/zen_stores/schemas/__init__.py,sha256=vMb0Pyf94aMWZDWpPKuRaxNoMsTp9DZNKSQScm9Vd5I,4339
|
1235
1235
|
zenml/zen_stores/schemas/action_schemas.py,sha256=uAWlV3Uy8LERBlu7PHCsWEEF4ww6olsVetzVBWmdDSc,6298
|
1236
1236
|
zenml/zen_stores/schemas/api_key_schemas.py,sha256=d_ewTrIJpRjLWupOZFpWcPSlRiHxiBsZJc_qSU7tMMk,7262
|
1237
|
-
zenml/zen_stores/schemas/artifact_schemas.py,sha256=
|
1237
|
+
zenml/zen_stores/schemas/artifact_schemas.py,sha256=7xzoiDpMvGu02YV4JGQ7If-5XKpW3-SErs3yOQTK62w,15176
|
1238
1238
|
zenml/zen_stores/schemas/artifact_visualization_schemas.py,sha256=_gMNjOF0oJ0ruW5Ua86hDocvO4MT3ACAIx_BwFBJFWk,3693
|
1239
1239
|
zenml/zen_stores/schemas/base_schemas.py,sha256=-MDYnS4ZLDe6x75nTXuVrOSbcYOuECLNk-yxjfEdJh4,2043
|
1240
1240
|
zenml/zen_stores/schemas/code_repository_schemas.py,sha256=K2EFvu_bkF9-cDAVYpMntNidSu-zb3By7CVq6rLj97c,7489
|
@@ -1244,13 +1244,13 @@ zenml/zen_stores/schemas/device_schemas.py,sha256=voVBknm14NmFpij1EGb_HhVlUng0cg
|
|
1244
1244
|
zenml/zen_stores/schemas/event_source_schemas.py,sha256=qhkyKg3zl7pFaxDYcXsDvJEIQAGWzWDrH1S88-cbxFQ,6391
|
1245
1245
|
zenml/zen_stores/schemas/flavor_schemas.py,sha256=cEKHrQp4fr16SDjOqBubM-jAbq4dK3MVyZSe-70e-ME,5054
|
1246
1246
|
zenml/zen_stores/schemas/logs_schemas.py,sha256=qv6fs3JiVgzlmTXJqb_gG5NsU5q_50e0167JiWIxR14,3588
|
1247
|
-
zenml/zen_stores/schemas/model_schemas.py,sha256
|
1247
|
+
zenml/zen_stores/schemas/model_schemas.py,sha256=95q5OaQ9DFmTno76wLaLmeBj3cePrVju20flWiJHPOk,25460
|
1248
1248
|
zenml/zen_stores/schemas/pipeline_build_schemas.py,sha256=QK3sVPYhumUx_x-H3YZ-RfnsxGhKfkMGdP5FC9WrQgU,5718
|
1249
1249
|
zenml/zen_stores/schemas/pipeline_deployment_schemas.py,sha256=fdsROPBE1QrWKvSkaZYz2Sc1MwXogAembs8TfZML3ks,10201
|
1250
|
-
zenml/zen_stores/schemas/pipeline_run_schemas.py,sha256=
|
1251
|
-
zenml/zen_stores/schemas/pipeline_schemas.py,sha256=
|
1250
|
+
zenml/zen_stores/schemas/pipeline_run_schemas.py,sha256=ylodIinwKGqKCIcZaKJwiA27g0rkNjKY3DLx_E2lylo,18046
|
1251
|
+
zenml/zen_stores/schemas/pipeline_schemas.py,sha256=tUgBics0QOszIN870_-ADcBHINH8v32-CLjPW0vHzMg,7159
|
1252
1252
|
zenml/zen_stores/schemas/run_metadata_schemas.py,sha256=yDDWEl9q4CExCL47uf72fDEodKNqA60PptBPydCJTwk,3619
|
1253
|
-
zenml/zen_stores/schemas/run_template_schemas.py,sha256=
|
1253
|
+
zenml/zen_stores/schemas/run_template_schemas.py,sha256=vnwAHPkjpHyRSSZmKjBemICUOPHSJWuKJmn9JqOstmM,9760
|
1254
1254
|
zenml/zen_stores/schemas/schedule_schema.py,sha256=zLh2LlgRWl-m1ANLpUnwh8LEpKykIR8JpJS7angMGW4,8169
|
1255
1255
|
zenml/zen_stores/schemas/schema_utils.py,sha256=Xahifq2fJ5szXCM00ZZ6461Div9Suatzl6sy9hVhPkk,3612
|
1256
1256
|
zenml/zen_stores/schemas/secret_schemas.py,sha256=H-DGSmVmsH9OPh4BOBC0QXMjV6u-KiKT_KDbfOtkt8M,9889
|
@@ -1276,8 +1276,8 @@ zenml/zen_stores/secrets_stores/sql_secrets_store.py,sha256=nEO0bAPlULBLxLVk-UTR
|
|
1276
1276
|
zenml/zen_stores/sql_zen_store.py,sha256=tKOghX2Wa0f0xSYu_ReqHgCwslvHrBhE3RePJG2tcA0,415921
|
1277
1277
|
zenml/zen_stores/template_utils.py,sha256=EKYBgmDLTS_PSMWaIO5yvHPLiQvMqHcsAe6NUCrv-i4,9068
|
1278
1278
|
zenml/zen_stores/zen_store_interface.py,sha256=vf2gKBWfUUPtcGZC35oQB6pPNVzWVyQC8nWxVLjfrxM,92692
|
1279
|
-
zenml_nightly-0.73.0.
|
1280
|
-
zenml_nightly-0.73.0.
|
1281
|
-
zenml_nightly-0.73.0.
|
1282
|
-
zenml_nightly-0.73.0.
|
1283
|
-
zenml_nightly-0.73.0.
|
1279
|
+
zenml_nightly-0.73.0.dev20250206.dist-info/LICENSE,sha256=wbnfEnXnafPbqwANHkV6LUsPKOtdpsd-SNw37rogLtc,11359
|
1280
|
+
zenml_nightly-0.73.0.dev20250206.dist-info/METADATA,sha256=ENIa7gJ176ZakUYpcBlt4HELhVscA_YSwNd917ZeNdg,21428
|
1281
|
+
zenml_nightly-0.73.0.dev20250206.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
|
1282
|
+
zenml_nightly-0.73.0.dev20250206.dist-info/entry_points.txt,sha256=QK3ETQE0YswAM2mWypNMOv8TLtr7EjnqAFq1br_jEFE,43
|
1283
|
+
zenml_nightly-0.73.0.dev20250206.dist-info/RECORD,,
|
{zenml_nightly-0.73.0.dev20250205.dist-info → zenml_nightly-0.73.0.dev20250206.dist-info}/LICENSE
RENAMED
File without changes
|
{zenml_nightly-0.73.0.dev20250205.dist-info → zenml_nightly-0.73.0.dev20250206.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|