aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author苏向夜 <fu050409@163.com>2024-03-29 18:33:45 +0800
committer苏向夜 <fu050409@163.com>2024-03-29 18:33:45 +0800
commitfa93c59702c16940506d4a713fe9f92888945d36 (patch)
tree9524dc9567f3260f4170df4e606a926cd8574317
parentf27022b427bf1b9fc705dccf19a90c948e406484 (diff)
downloadipm-fa93c59702c16940506d4a713fe9f92888945d36.tar.gz
ipm-fa93c59702c16940506d4a713fe9f92888945d36.zip
refactor(requirement): refactor requirements codes outside
-rw-r--r--src/ipm/models/requirement.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/ipm/models/requirement.py b/src/ipm/models/requirement.py
new file mode 100644
index 0000000..223ac18
--- /dev/null
+++ b/src/ipm/models/requirement.py
@@ -0,0 +1,79 @@
+from typing import Optional, Union
+from ipm.const import INDEX
+from ipm.exceptions import ProjectError
+from ipm.models.index import Yggdrasil
+from ipm.typing import Dict, List
+
+
+class Requirement:
+ name: str
+ version: str
+ path: Optional[str]
+ yggdrasil: Yggdrasil
+ url: Optional[str]
+ hash: Optional[str]
+
+ def __init__(
+ self,
+ name: str,
+ version: str,
+ url: Optional[str] = None,
+ path: Optional[str] = None,
+ yggdrasil: Optional[Yggdrasil] = None,
+ hash: Optional[str] = None,
+ ) -> None:
+ from ipm.models.lock import PackageLock
+
+ global_lock = PackageLock()
+ 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.url = url or yggdrasil.get_url(name, version)
+ self.yggdrasil = yggdrasil
+ self.hash = hash
+
+ def is_local(self) -> bool:
+ return bool(self.path)
+
+
+class Requirements(List[Requirement]):
+ def __init__(
+ self,
+ requirements: Dict[str, Union[Dict, str]],
+ yggdrasils: Optional[Dict[str, Optional[Yggdrasil]]] = None,
+ ) -> None:
+ from ipm.models.lock import PackageLock
+
+ global_lock = PackageLock()
+ url = path = yggdrasil = version = None
+ for name, requirement in requirements.items():
+ if isinstance(requirement, str):
+ self.append(Requirement(name=name, version=requirement))
+ else:
+ for key, value in requirement.items():
+ if key == "index":
+ yggdrasil = global_lock.get_yggdrasil_by_index(value)
+ elif key == "url":
+ url = 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,
+ url=url,
+ yggdrasil=yggdrasil,
+ )
+ )