diff --git a/client/starwhale/base/bundle.py b/client/starwhale/base/bundle.py index f2240dd8b2..3b8cca39a7 100644 --- a/client/starwhale/base/bundle.py +++ b/client/starwhale/base/bundle.py @@ -32,7 +32,14 @@ from starwhale.utils.config import SWCliConfigMixed from starwhale.base.models.base import ListFilter from starwhale.base.uri.project import Project +from starwhale.base.models.model import LocalModelInfoBase from starwhale.base.uri.resource import Resource +from starwhale.base.models.dataset import LocalDatasetInfoBase +from starwhale.base.models.runtime import LocalRuntimeVersion + +_LOCAL_INFO_TYPE = t.Union[ + LocalModelInfoBase, LocalRuntimeVersion, LocalDatasetInfoBase +] class BaseBundle(metaclass=ABCMeta): @@ -278,3 +285,23 @@ def _do_remove(self, force: bool = False) -> t.Tuple[bool, str]: False, ) return _ok and _ok2, _reason + _reason2 + + @classmethod + def group_and_filter_local_info( + cls, + rows: t.List[_LOCAL_INFO_TYPE], + ) -> t.List[_LOCAL_INFO_TYPE]: + rs: t.Dict[str, _LOCAL_INFO_TYPE] = {} + for row in rows: + if not isinstance( + row, (LocalModelInfoBase, LocalRuntimeVersion, LocalDatasetInfoBase) + ): + raise TypeError(f"invalid type {type(row)}") + + if row.name not in rs: + rs[row.name] = row + else: + if row.created_at > rs[row.name].created_at: + rs[row.name] = row + + return list(rs.values()) diff --git a/client/starwhale/base/models/runtime.py b/client/starwhale/base/models/runtime.py index ab722bd30c..93de06ba7d 100644 --- a/client/starwhale/base/models/runtime.py +++ b/client/starwhale/base/models/runtime.py @@ -3,8 +3,8 @@ import typing as t from typing import Union -from starwhale import Resource from starwhale.base.models.base import SwBaseModel +from starwhale.base.uri.resource import Resource from starwhale.base.client.models.models import RuntimeVo diff --git a/client/starwhale/core/dataset/model.py b/client/starwhale/core/dataset/model.py index 69e9aaed55..744fdd7764 100644 --- a/client/starwhale/core/dataset/model.py +++ b/client/starwhale/core/dataset/model.py @@ -370,7 +370,7 @@ def list( ) ) - return rs, {} + return cls.group_and_filter_local_info(rs), {} # type: ignore def build_from_csv_files(self, paths: t.List[PathLike], **kwargs: t.Any) -> None: from starwhale.api._impl.dataset.model import Dataset as SDKDataset diff --git a/client/starwhale/core/model/model.py b/client/starwhale/core/model/model.py index 8b36da44fa..8dede6be91 100644 --- a/client/starwhale/core/model/model.py +++ b/client/starwhale/core/model/model.py @@ -612,7 +612,7 @@ def list( created_at=_info[CREATED_AT_KEY], ) ) - return rs, {} + return cls.group_and_filter_local_info(rs), {} # type: ignore def buildImpl(self, workdir: Path, **kw: t.Any) -> None: # type: ignore[override] model_config: ModelConfig = kw["model_config"] diff --git a/client/starwhale/core/runtime/model.py b/client/starwhale/core/runtime/model.py index 6f2bdcef59..b9c1621e2e 100644 --- a/client/starwhale/core/runtime/model.py +++ b/client/starwhale/core/runtime/model.py @@ -1509,7 +1509,7 @@ def list( ) ) - return ret, {} + return cls.group_and_filter_local_info(ret), {} # type: ignore @classmethod def quickstart_from_uri( diff --git a/client/tests/core/test_runtime.py b/client/tests/core/test_runtime.py index 213f88fe84..6c1d15cd91 100644 --- a/client/tests/core/test_runtime.py +++ b/client/tests/core/test_runtime.py @@ -1144,7 +1144,7 @@ def test_build_from_runtime_yaml_in_venv_mode( ) rts, _ = StandaloneRuntime.list(Project("")) - assert len(rts) == 2 + assert len(rts) == 1 rtv = runtime_term_view(f"{name}/version/{build_version[:8]}") ok, _ = rtv.remove()