zenml-nightly 0.73.0.dev20250205__py3-none-any.whl → 0.74.0.dev20250207__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_server/dashboard/assets/{404-c8OuXDAT.js → 404-0leSZ7Vv.js} +1 -1
- zenml/zen_server/dashboard/assets/@radix-B7OY3d6N.js +85 -0
- zenml/zen_server/dashboard/assets/{@react-router-B3Z5rLr2.js → @react-router-CiF9laDg.js} +1 -1
- zenml/zen_server/dashboard/assets/@reactflow-DgwdIYyq.js +17 -0
- zenml/zen_server/dashboard/assets/@tanstack-W1pLDzVg.js +22 -0
- zenml/zen_server/dashboard/assets/{AlertDialogDropdownItem-8yPFDxEI.js → AlertDialogDropdownItem-BS4AoVte.js} +1 -1
- zenml/zen_server/dashboard/assets/CodeSnippet-CK2z-88v.js +9 -0
- zenml/zen_server/dashboard/assets/{CollapsibleCard-TiI4lId1.js → CollapsibleCard-BAuAdAje.js} +1 -1
- zenml/zen_server/dashboard/assets/{Commands-BcR2Arie.js → Commands-vjMqENS8.js} +1 -1
- zenml/zen_server/dashboard/assets/{ComponentBadge-BqQNUZgb.js → ComponentBadge-CNIM1NH_.js} +1 -1
- zenml/zen_server/dashboard/assets/{CopyButton-DCiXO3JC.js → CopyButton-BQf5nLgq.js} +1 -1
- zenml/zen_server/dashboard/assets/CsvVizualization-D77lRMYi.js +15 -0
- zenml/zen_server/dashboard/assets/{DeleteAlertDialog-DrPjHtXX.js → DeleteAlertDialog-CcDX1Hm_.js} +1 -1
- zenml/zen_server/dashboard/assets/{DialogItem-BYG7d_M2.js → DialogItem-L8-LNKgK.js} +1 -1
- zenml/zen_server/dashboard/assets/{DisplayDate-CDMUcQHS.js → DisplayDate-CZV8x8pB.js} +1 -1
- zenml/zen_server/dashboard/assets/{EmptyState-BzdlCwp3.js → EmptyState-C8-mkRwm.js} +1 -1
- zenml/zen_server/dashboard/assets/{Error-C1zbWr19.js → Error-DPRIglzA.js} +1 -1
- zenml/zen_server/dashboard/assets/{ExecutionStatus-Ct9srgHC.js → ExecutionStatus-DHmX6Vtj.js} +1 -1
- zenml/zen_server/dashboard/assets/{Helpbox-Bm_1Zx9f.js → Helpbox-DWOXAebr.js} +1 -1
- zenml/zen_server/dashboard/assets/{Infobox-OQdkCLSP.js → Infobox-Ls_918eD.js} +1 -1
- zenml/zen_server/dashboard/assets/{InlineAvatar-CQNjKoEQ.js → InlineAvatar-B9O7QxVo.js} +1 -1
- zenml/zen_server/dashboard/assets/{Lock-CYYy18Mm.js → Lock-6WGsAdiw.js} +1 -1
- zenml/zen_server/dashboard/assets/MarkdownVisualization-CPm4B45C.js +14 -0
- zenml/zen_server/dashboard/assets/{NestedCollapsible-DDgd2SGb.js → NestedCollapsible-CyUu7Vrm.js} +1 -1
- zenml/zen_server/dashboard/assets/{NumberBox-Dtp3J6g5.js → NumberBox-CqUodACv.js} +1 -1
- zenml/zen_server/dashboard/assets/{Partials-MD3e95Dk.js → Partials-CP_ZenWO.js} +1 -1
- zenml/zen_server/dashboard/assets/{PasswordChecker-B0nadgh6.js → PasswordChecker-Xh6Egpx9.js} +1 -1
- zenml/zen_server/dashboard/assets/ProBadge-DJCjz8Ox.js +1 -0
- zenml/zen_server/dashboard/assets/{ProCta-W2PEvNow.js → ProCta-BsYjjdUZ.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderIcon-DfDUOeAy.js → ProviderIcon-C_XK4oaW.js} +1 -1
- zenml/zen_server/dashboard/assets/{ProviderRadio-B81Elxrc.js → ProviderRadio-C9z7SJnN.js} +1 -1
- zenml/zen_server/dashboard/assets/{RunSelector-DOXgdry5.js → RunSelector-C-YzhiVb.js} +1 -1
- zenml/zen_server/dashboard/assets/{RunsBody-Bnx2fxub.js → RunsBody-CNd_ej8-.js} +1 -1
- zenml/zen_server/dashboard/assets/{SearchField-Yjv-KRW4.js → SearchField-BYL1oNec.js} +1 -1
- zenml/zen_server/dashboard/assets/{SecretTooltip-EKpMlG2f.js → SecretTooltip-CYL2o5Gs.js} +1 -1
- zenml/zen_server/dashboard/assets/{SetPassword-CDLy57PZ.js → SetPassword-BnaLppIC.js} +1 -1
- zenml/zen_server/dashboard/assets/{StackList-DKQaLDo4.js → StackList-6XLpNMwt.js} +1 -1
- zenml/zen_server/dashboard/assets/{Tabs-B5E-o_h6.js → Tabs-BewshUAE.js} +1 -1
- zenml/zen_server/dashboard/assets/{Tick-DSYBiuXU.js → Tick-DHVI3HP0.js} +1 -1
- zenml/zen_server/dashboard/assets/{UpdatePasswordSchemas-HBNOeyoP.js → UpdatePasswordSchemas-CtzucewX.js} +1 -1
- zenml/zen_server/dashboard/assets/{UsageReason-DXtPS5nE.js → UsageReason-Bwhjhrv_.js} +1 -1
- zenml/zen_server/dashboard/assets/{WizardFooter-_1VSMZ_c.js → WizardFooter-CPk11vwc.js} +1 -1
- zenml/zen_server/dashboard/assets/{all-pipeline-runs-query-D0qDLdKB.js → all-pipeline-runs-query-Dh4L44hJ.js} +1 -1
- zenml/zen_server/dashboard/assets/{check-DloQpStc.js → check-BB0dVtdW.js} +1 -1
- zenml/zen_server/dashboard/assets/{check-circle-jNbX5-sR.js → check-circle-ByvKqRS_.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-down-6JyMkfjR.js → chevron-down-DAWlSNuH.js} +1 -1
- zenml/zen_server/dashboard/assets/{chevron-right-double-D7ojK9Co.js → chevron-right-double-C5DtVuMS.js} +1 -1
- zenml/zen_server/dashboard/assets/clock-BWL9qBKt.js +1 -0
- zenml/zen_server/dashboard/assets/{code-browser-CUFUIHfp.js → code-browser-C6DP7a-M.js} +1 -1
- zenml/zen_server/dashboard/assets/{copy-C8XQA2Ug.js → copy-DmyMnHSy.js} +1 -1
- zenml/zen_server/dashboard/assets/{create-stack-7JzgAYAm.js → create-stack-BdNm_XEl.js} +1 -1
- zenml/zen_server/dashboard/assets/{delete-run-CUdtYFLl.js → delete-run-CUo7vxbD.js} +1 -1
- zenml/zen_server/dashboard/assets/{docker-BdA9vrnW.js → docker-C2dCztnc.js} +1 -1
- zenml/zen_server/dashboard/assets/{dots-horizontal-otGBOSDJ.js → dots-horizontal-C6QCz7jg.js} +1 -1
- zenml/zen_server/dashboard/assets/{form-schemas-B6PCV3Y4.js → form-schemas-B4cZxcUy.js} +1 -1
- zenml/zen_server/dashboard/assets/{gcp-CFtm4BA7.js → gcp-B1H0QrG5.js} +1 -1
- zenml/zen_server/dashboard/assets/{help-Cc9bBIJH.js → help-CgM5zwtY.js} +1 -1
- zenml/zen_server/dashboard/assets/index-4aOgYud0.js +1 -0
- zenml/zen_server/dashboard/assets/{index-CJ5IfeAl.js → index-6CSA2ij5.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-Ceyzb1yI.js → index-BOeKQ3N4.js} +1 -1
- zenml/zen_server/dashboard/assets/{index-D4yoZ_gH.js → index-Cf1Ph5ra.js} +1 -1
- zenml/zen_server/dashboard/assets/index-D25WcEJJ.js +55 -0
- zenml/zen_server/dashboard/assets/index-apknmtn7.css +1 -0
- zenml/zen_server/dashboard/assets/index.esm-C5jC4e7W.js +1 -0
- zenml/zen_server/dashboard/assets/{key-icon-aH-QIa5R.js → key-icon-DuqxBBkq.js} +1 -1
- zenml/zen_server/dashboard/assets/{kubernetes-B2wmAJ1d.js → kubernetes-Bn54mlK-.js} +1 -1
- zenml/zen_server/dashboard/assets/{layout-BtHBmE4w.js → layout-Cj7MRWSi.js} +1 -1
- zenml/zen_server/dashboard/assets/{link-external-b9AXw_sW.js → link-external-CZxZlXqi.js} +1 -1
- zenml/zen_server/dashboard/assets/{login-mutation-BaeJ7MAg.js → login-mutation-EQPLh5Ne.js} +1 -1
- zenml/zen_server/dashboard/assets/{logs-WMSM52RF.js → logs-DYV_bf7Q.js} +1 -1
- zenml/zen_server/dashboard/assets/{not-found-MGptrNBk.js → not-found-DrxGMGNL.js} +1 -1
- zenml/zen_server/dashboard/assets/{package-C6uypY4h.js → package-MUwoWZFx.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-C37IDa-Q.js → page-9AiMoKly.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-yNh6PQKt.js → page-BF9z97Jf.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Aeu3v0MQ.js → page-BK6mVOKJ.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Ox-eC1ik.js → page-BK722dMv.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CbwI6emp.js → page-BNXv13PD.js} +1 -1
- zenml/zen_server/dashboard/assets/page-BmzgDMUV.js +1 -0
- zenml/zen_server/dashboard/assets/{page-Dv5lN2w7.js → page-BrUvz6Ag.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DyAuja95.js → page-Bt_6RgeM.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DKQ3wZgr.js → page-C2IJq-kV.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BhOXn-s9.js → page-C2KxJ-Cc.js} +1 -1
- zenml/zen_server/dashboard/assets/page-C9v0QDj8.js +2 -0
- zenml/zen_server/dashboard/assets/{page-CeNL9JWi.js → page-CHdCb7Xx.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CkPwPmLZ.js → page-CdQ_DdH1.js} +1 -1
- zenml/zen_server/dashboard/assets/page-ChFcVUFX.js +1 -0
- zenml/zen_server/dashboard/assets/{page-BXgXP-Qj.js → page-ChMOMdKd.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BbljjC-k.js → page-ChxtdsVY.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BXrtxEbw.js → page-Cj5NSnW5.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CXPc-HN1.js → page-Cz58X7s5.js} +2 -2
- zenml/zen_server/dashboard/assets/{page-D-KPzeQb.js → page-D-qjN5JP.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-khp8QJ6b.js → page-D1jrbald.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CBiT2Ox9.js → page-DRYjt60M.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BKwwfTNy.js → page-De3oGQ3E.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BaUDR9Ri.js → page-DjO6yHuW.js} +1 -1
- zenml/zen_server/dashboard/assets/page-DzvVg_ZM.js +1 -0
- zenml/zen_server/dashboard/assets/{page-C4JpDeUM.js → page-JZ8WXQfh.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DbW8MfQ4.js → page-VUTBxySs.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CmJU3Gqo.js → page-YhLt4PLe.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-CoFVtzhG.js → page-_ijqeiyw.js} +1 -1
- zenml/zen_server/dashboard/assets/page-ezpoc4vG.js +2 -0
- zenml/zen_server/dashboard/assets/{page-CB2_GdBA.js → page-fVsaiQi7.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-Dvbq1BoF.js → page-q2kbm2x8.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-BUjw8Tp1.js → page-qw7ivMVQ.js} +1 -1
- zenml/zen_server/dashboard/assets/{page-DzrdL2v1.js → page-y8flqx2D.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-K7AY0ju4.js → persist-CDPcIIlF.js} +1 -1
- zenml/zen_server/dashboard/assets/{persist-DBTFy--v.js → persist-Hxrm9o7f.js} +1 -1
- zenml/zen_server/dashboard/assets/{plus-tf1V2hTJ.js → plus-noRapLU5.js} +1 -1
- zenml/zen_server/dashboard/assets/react-error-boundary.esm-DOkSniBS.js +1 -0
- zenml/zen_server/dashboard/assets/{refresh-BjOeWlEq.js → refresh-Jr_advur.js} +1 -1
- zenml/zen_server/dashboard/assets/{rocket-DjT2cDvG.js → rocket-GOlMupOS.js} +1 -1
- zenml/zen_server/dashboard/assets/{service-BvOYLH5b.js → service-Db_ee3ql.js} +1 -1
- zenml/zen_server/dashboard/assets/sharedSchema-BE8kPXOv.js +14 -0
- zenml/zen_server/dashboard/assets/{stack-detail-query-DMJoxwgv.js → stack-detail-query-B2rvP4uR.js} +1 -1
- zenml/zen_server/dashboard/assets/{tick-circle-BEX_Tp4v.js → tick-circle-DKkiYi_R.js} +1 -1
- zenml/zen_server/dashboard/assets/{trash-arLUMWMS.js → trash-Dm8g1gZ8.js} +1 -1
- zenml/zen_server/dashboard/assets/{update-server-settings-mutation-ATZDNNZk.js → update-server-settings-mutation-Bgnr2Ssw.js} +1 -1
- zenml/zen_server/dashboard/assets/{url-BWJXzuI4.js → url-1R6qfphK.js} +1 -1
- zenml/zen_server/dashboard/assets/{zod-BwEbpOxH.js → zod-C2FdaFLe.js} +1 -1
- zenml/zen_server/dashboard/index.html +8 -8
- zenml/zen_stores/migrations/versions/0.74.0_release.py +23 -0
- 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.74.0.dev20250207.dist-info}/METADATA +2 -2
- {zenml_nightly-0.73.0.dev20250205.dist-info → zenml_nightly-0.74.0.dev20250207.dist-info}/RECORD +148 -144
- zenml/zen_server/dashboard/assets/@radix-DeK6qiuw.js +0 -85
- zenml/zen_server/dashboard/assets/@reactflow-6JPoencd.js +0 -17
- zenml/zen_server/dashboard/assets/@tanstack-DT5WLu9C.js +0 -22
- zenml/zen_server/dashboard/assets/CodeSnippet-Qh1ae_DJ.js +0 -9
- zenml/zen_server/dashboard/assets/CsvVizualization-O9cVIaL8.js +0 -15
- zenml/zen_server/dashboard/assets/MarkdownVisualization-ylXaAxev.js +0 -14
- zenml/zen_server/dashboard/assets/ProBadge-D784iVNC.js +0 -1
- zenml/zen_server/dashboard/assets/index-B6U0OkEN.css +0 -1
- zenml/zen_server/dashboard/assets/index-CxO6541P.js +0 -55
- zenml/zen_server/dashboard/assets/index-Uu49AX48.js +0 -1
- zenml/zen_server/dashboard/assets/index.esm-Dy6Z9Ung.js +0 -1
- zenml/zen_server/dashboard/assets/page-BCgEdmhP.js +0 -1
- zenml/zen_server/dashboard/assets/page-DWWhxCoF.js +0 -1
- zenml/zen_server/dashboard/assets/page-I2B4Ocv8.js +0 -1
- zenml/zen_server/dashboard/assets/page-OdjGauvw.js +0 -2
- zenml/zen_server/dashboard/assets/sharedSchema-xJDsJNgJ.js +0 -14
- /zenml/zen_server/dashboard/assets/{@reactflow-C26Olbza.css → @reactflow-Fd0xVSp_.css} +0 -0
- /zenml/zen_server/dashboard/assets/{CodeSnippet-Bbx6fIb6.css → CodeSnippet-CK5CxKct.css} +0 -0
- {zenml_nightly-0.73.0.dev20250205.dist-info → zenml_nightly-0.74.0.dev20250207.dist-info}/LICENSE +0 -0
- {zenml_nightly-0.73.0.dev20250205.dist-info → zenml_nightly-0.74.0.dev20250207.dist-info}/WHEEL +0 -0
- {zenml_nightly-0.73.0.dev20250205.dist-info → zenml_nightly-0.74.0.dev20250207.dist-info}/entry_points.txt +0 -0
zenml/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.74.0.dev20250207
|
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)
|