From dbbee3f20975456d8d87deaa97ec64473b6d3150 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Fri, 8 Mar 2024 13:41:52 +0800 Subject: feat(models): add apis for require and unrequire method --- src/ipm/models/ipk.py | 46 +++++++++++++++++++++++++++++++++------------- src/ipm/models/lock.py | 25 +++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/ipm/models/ipk.py b/src/ipm/models/ipk.py index 91c0c62..fb73d83 100644 --- a/src/ipm/models/ipk.py +++ b/src/ipm/models/ipk.py @@ -5,7 +5,7 @@ from tomlkit.toml_document import TOMLDocument from ipm.const import INDEX from ipm.models.index import Yggdrasil from ipm.typing import List, Dict, Literal, StrPath -from ipm.exceptions import TomlLoadFailed +from ipm.exceptions import ProjectError, TomlLoadFailed import tomlkit import abc @@ -54,9 +54,7 @@ class Requirement: return bool(self.path) -class Requirements: - requirements: List[Requirement] - +class Requirements(List[Requirement]): def __init__( self, dependencies: Dict[str, Union[Dict, str]], @@ -65,7 +63,7 @@ class Requirements: path = yggdrasil = version = None for name, dependency in dependencies.items(): if isinstance(dependency, str): - self.requirements.append(Requirement(name=name, version=dependency)) + self.append(Requirement(name=name, version=dependency)) else: for key, value in dependency.items(): if key == "index": @@ -80,7 +78,7 @@ class Requirements: version = value else: raise ValueError(f"未知的依赖项键值: '{key}'") - self.requirements.append( + self.append( Requirement( name=name, version=version or "*", @@ -137,9 +135,31 @@ class InfiniProject(InfiniPackage): def dump(self) -> None: return tomlkit.dump(self._data, self._toml_path.open("w", encoding="utf-8")) - def require(self, name: str) -> None: - version = "*" - self._data["requirements"][name] = version # type: ignore + def require( + self, + name: str, + *, + version: Optional[str] = None, + path: Optional[str] = None, + yggdrasil: Optional[str] = None, + index: Optional[str] = None, + ) -> None: + if version and not any([path, yggdrasil, index]): + self._data["requirements"][name] = version # type: ignore + return + requirement = tomlkit.inline_table() + requirement.add("version", version) if version else None + requirement.add("path", path) if path else None + requirement.add("yggdrasil", yggdrasil) if yggdrasil else None + requirement.add("index", index) if index else None + if not requirement: + raise ValueError("") + self._data["requirements"].update({name: requirement}) # type: ignore + + def unrequire(self, name: str) -> None: + if name not in self._data.get("requirements", {}): + raise ProjectError(f"规则包 [bold green]{name}[/] 不在规则包依赖中.") + self._data["requirements"].remove(name) # type: ignore @property def plain_dict(self) -> TOMLDocument: @@ -167,15 +187,15 @@ class InfiniProject(InfiniPackage): @property def dependencies(self) -> Dict[str, Any]: - return self._data["dependenciess"] # type: ignore + return self._data["dependencies"] # type: ignore @property def requirements(self) -> Requirements: - return Requirements(self._data["requirement"], yggdrasils=self.yggdrasils) # type: ignore + return Requirements(self._data.get("requirements") or {}, yggdrasils=self.yggdrasils) # type: ignore @property - def yggdrasils(self) -> Optional[List[Yggdrasil]]: - return [Yggdrasil(index) for _, index in self._data.get("yggdrasil", {}).items()] or None # type: ignore + def yggdrasils(self) -> List[Yggdrasil]: + return [Yggdrasil(index) for _, index in self._data.get("yggdrasils", {}).items()] or [] # type: ignore class InfiniFrozenPackage(InfiniPackage): diff --git a/src/ipm/models/lock.py b/src/ipm/models/lock.py index 25ac6b2..6ba7aa0 100644 --- a/src/ipm/models/lock.py +++ b/src/ipm/models/lock.py @@ -262,4 +262,29 @@ class ProjectLock(IPMLock): metadata.add("description", project.description) metadata.add("license", project.license) + for requirement in project.requirements: + packages = tomlkit.aot() + if requirement.is_local(): + packages.append( + tomlkit.item( + { + "name": requirement.name, + "version": requirement.version, + "path": requirement.path, + } + ) + ) + else: + packages.append( + tomlkit.item( + { + "name": requirement.name, + "version": requirement.version, + "yggdrasil": requirement.yggdrasil.index, + } + ) + ) + + lock._data.add("metadata", metadata) + return lock -- cgit v1.2.3-70-g09d2