aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/ipm/models/ipk.py71
1 files changed, 6 insertions, 65 deletions
diff --git a/src/ipm/models/ipk.py b/src/ipm/models/ipk.py
index 25b1bbc..ac3315e 100644
--- a/src/ipm/models/ipk.py
+++ b/src/ipm/models/ipk.py
@@ -3,8 +3,8 @@ from typing import Any, Optional, Union
from tomlkit.toml_document import TOMLDocument
from ipm.const import INDEX
+from ipm.models.requirement import Requirements
from ipm.utils.hash import ifp_hash
-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
@@ -37,75 +37,12 @@ class Authors:
return None if not self.authors else self.authors[0]
-class Requirement:
- name: str
- version: str
- path: Optional[str]
- yggdrasil: Yggdrasil
-
- def __init__(
- self,
- name: str,
- version: str,
- 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
-
- def is_local(self) -> bool:
- return bool(self.path)
-
-
-class Requirements(List[Requirement]):
- def __init__(
- self,
- dependencies: Dict[str, Union[Dict, str]],
- yggdrasils: Optional[Dict[str, Yggdrasil]] = None,
- ) -> None:
- path = yggdrasil = version = None
- for name, dependency in dependencies.items():
- if isinstance(dependency, str):
- self.append(Requirement(name=name, version=dependency))
- else:
- for key, value in dependency.items():
- if key == "index":
- yggdrasil = global_lock.get_yggdrasil_by_index(value)
- elif key == "yggdrasil":
- yggdrasil = (yggdrasils or {}).get(value)
- if not yggdrasil:
- raise ValueError(f"未知的世界树标识符: '{value}'")
- elif key == "path":
- path = value
- elif key == "version":
- version = value
- else:
- raise ValueError(f"未知的依赖项键值: '{key}'")
- self.append(
- Requirement(
- name=name,
- version=version or "*",
- path=path,
- yggdrasil=yggdrasil,
- )
- )
-
-
class InfiniPackage(metaclass=abc.ABCMeta):
@property
def default_name(self) -> str:
return f"{self.name}-{self.version}"
@property
- def hash_name(self) -> str:
- return f"{self.name}-{self.version}.ipk.hash"
-
- @property
@abc.abstractmethod
def name(self) -> str:
raise NotImplementedError
@@ -232,7 +169,11 @@ class InfiniProject(InfiniPackage):
@property
def requirements(self) -> Requirements:
return Requirements(
- self._data.get("requirements") or {}, yggdrasils=self.yggdrasils
+ self._data.get("requirements") or {},
+ yggdrasils={
+ name: global_lock.get_yggdrasil_by_index(url)
+ for name, url in self.yggdrasils.items()
+ },
)
@property