diff options
| author | 2024-03-28 19:30:43 +0800 | |
|---|---|---|
| committer | 2024-03-28 19:30:43 +0800 | |
| commit | cc7779d8821210dcc358992e43a667822afd14db (patch) | |
| tree | d02e9c500937f30157dedd0deda5618803e9e8d3 /src | |
| parent | 7e7dbff71bcf05e757c26d621ef2d58679fbf537 (diff) | |
| download | ipm-cc7779d8821210dcc358992e43a667822afd14db.tar.gz ipm-cc7779d8821210dcc358992e43a667822afd14db.zip | |
feat(ipk): add methods for global package lock
Diffstat (limited to 'src')
| -rw-r--r-- | src/ipm/models/ipk.py | 19 | ||||
| -rw-r--r-- | src/ipm/models/lock.py | 35 |
2 files changed, 46 insertions, 8 deletions
diff --git a/src/ipm/models/ipk.py b/src/ipm/models/ipk.py index 5b327a1..325c7a9 100644 --- a/src/ipm/models/ipk.py +++ b/src/ipm/models/ipk.py @@ -4,12 +4,15 @@ from tomlkit.toml_document import TOMLDocument from ipm.const import INDEX from ipm.models.index import Yggdrasil +from ipm.models.lock import PackageLock from ipm.typing import List, Dict, Literal, StrPath from ipm.exceptions import ProjectError, TomlLoadFailed import tomlkit import abc +global_lock = PackageLock() + class Author: name: str @@ -45,10 +48,13 @@ class Requirement: path: Optional[str] = None, yggdrasil: Optional[Yggdrasil] = None, ) -> None: + yggdrasil = yggdrasil or global_lock.get_yggdrasil_by_index(INDEX) + if not yggdrasil: + raise ProjectError("未能找到任何世界树地址,请先添加一个世界树地址。") self.name = name self.version = version self.path = path - self.yggdrasil = yggdrasil or Yggdrasil(INDEX) + self.yggdrasil = yggdrasil def is_local(self) -> bool: return bool(self.path) @@ -67,7 +73,7 @@ class Requirements(List[Requirement]): else: for key, value in dependency.items(): if key == "index": - yggdrasil = Yggdrasil(key) + yggdrasil = global_lock.get_yggdrasil_by_index(value) elif key == "yggdrasil": yggdrasil = (yggdrasils or {}).get(value) if not yggdrasil: @@ -228,11 +234,10 @@ class InfiniProject(InfiniPackage): ) @property - def yggdrasils(self) -> Dict[str, Yggdrasil]: - return { - name: Yggdrasil(index) - for name, index in self._data.get("yggdrasils", {}).items() - } or {} + def yggdrasils(self) -> Dict[str, str]: + res = {name: index for name, index in self._data.get("yggdrasils", {}).items()} + res.update({"official": INDEX}) + return res @property def topics(self) -> List[str]: diff --git a/src/ipm/models/lock.py b/src/ipm/models/lock.py index 08c02fa..5a41aaf 100644 --- a/src/ipm/models/lock.py +++ b/src/ipm/models/lock.py @@ -1,6 +1,6 @@ from pathlib import Path from abc import ABCMeta -from typing import Optional +from typing import List, Optional from ipm.typing import Dict, StrPath from ipm.const import IPM_PATH, ATTENTIONS from tomlkit import TOMLDocument @@ -10,6 +10,7 @@ import tomlkit if TYPE_CHECKING: from ipm.models import ipk + from ipm.models.index import Yggdrasil class IPMLock(metaclass=ABCMeta): @@ -46,6 +47,38 @@ class PackageLock(IPMLock): def __init__(self, source_path: Optional[StrPath] = None) -> None: super().__init__(source_path=source_path or IPM_PATH) + def update_index(self, index: str, uuid: str, lock_path: str) -> bool: + indexes = self._data.get("index", []) + for i in indexes: + if i["uuid"] == uuid: + i["url"] = index + i["lock"] = lock_path + else: + aot = tomlkit.aot() + aot.append(tomlkit.item({"url": index, "uuid": uuid, "lock": lock_path})) + self._data.append("index", aot) + self._data["index"] = indexes + return True + + def get_all(self) -> List["Yggdrasil"]: + from ipm.models.index import Yggdrasil + + if "index" not in self._data.keys(): + return [] + res = [] + for index in self._data["index"]: # type: ignore + res.append(Yggdrasil(index["url"], index["uuid"])) + return res + + def get_yggdrasil_by_index(self, index: str) -> Optional["Yggdrasil"]: + from ipm.models.index import Yggdrasil + + indexes = self._data.get("index", []) + for i in indexes: + if i["url"] == index: + return Yggdrasil(i["url"], i["uuid"]) + return None + class ProjectLock(IPMLock): """IPM 项目锁""" |
