aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/ipm/models/ipk.py2
-rw-r--r--src/ipm/models/lock.py22
-rw-r--r--src/ipm/models/requirement.py19
3 files changed, 22 insertions, 21 deletions
diff --git a/src/ipm/models/ipk.py b/src/ipm/models/ipk.py
index fc77ac3..9b5b650 100644
--- a/src/ipm/models/ipk.py
+++ b/src/ipm/models/ipk.py
@@ -176,7 +176,7 @@ class InfiniProject(InfiniPackage):
@property
def requirements(self) -> Requirements:
return Requirements(
- self._data.get("requirements") or {},
+ self._data.unwrap().get("requirements", {}),
yggdrasils={
name: global_lock.get_yggdrasil_by_index(url)
for name, url in self.yggdrasils.items()
diff --git a/src/ipm/models/lock.py b/src/ipm/models/lock.py
index 439d978..b599e82 100644
--- a/src/ipm/models/lock.py
+++ b/src/ipm/models/lock.py
@@ -13,7 +13,6 @@ import tomlkit
if TYPE_CHECKING:
from ipm.models import ipk
from ipm.models.index import Yggdrasil
- from ipm.models.ipk import InfiniFrozenPackage
class IPMLock(metaclass=ABCMeta):
@@ -153,26 +152,9 @@ class ProjectLock(IPMLock):
for requirement in requirements:
if requirement.is_local():
- packages.append(
- tomlkit.item(
- {
- "name": requirement.name,
- "version": requirement.version,
- "path": requirement.path,
- }
- )
- )
+ packages.append(tomlkit.item(requirement.as_dict()))
else:
- packages.append(
- tomlkit.item(
- {
- "name": requirement.name,
- "version": requirement.version,
- "yggdrasil": requirement.yggdrasil.index,
- "url": requirement.url,
- }
- )
- )
+ packages.append(tomlkit.item(requirement.as_dict()))
lock._data.add("package", packages)
return lock
diff --git a/src/ipm/models/requirement.py b/src/ipm/models/requirement.py
index 04e33cb..d324be1 100644
--- a/src/ipm/models/requirement.py
+++ b/src/ipm/models/requirement.py
@@ -32,6 +32,10 @@ class Requirement:
self.version = version
self.path = path
self.url = url or yggdrasil.get_url(name, version)
+ if not self.url:
+ raise ProjectError(
+ f"规则包 [bold red]{name}[/] 不存在版本 [bold yellow]{version}[/]"
+ )
self.yggdrasil = yggdrasil
self.hash = hash
@@ -45,6 +49,21 @@ class Requirement:
def is_local(self) -> bool:
return bool(self.path)
+ def as_dict(self) -> dict:
+ if self.is_local():
+ return {
+ "name": self.name,
+ "version": self.version,
+ "path": self.path,
+ }
+ else:
+ return {
+ "name": self.name,
+ "version": self.version,
+ "yggdrasil": self.yggdrasil.index,
+ "url": self.url,
+ }
+
class Requirements(List[Requirement]):
def __init__(