mirror of
https://github.com/kiviktnm/decman.git
synced 2026-09-19 12:08:28 +00:00
Cache calls to PackageInfo
This commit is contained in:
@@ -54,6 +54,28 @@ class PackageInfo:
|
|||||||
make_dependencies: tuple[str, ...] = dataclasses.field(default_factory=tuple)
|
make_dependencies: tuple[str, ...] = dataclasses.field(default_factory=tuple)
|
||||||
check_dependencies: tuple[str, ...] = dataclasses.field(default_factory=tuple)
|
check_dependencies: tuple[str, ...] = dataclasses.field(default_factory=tuple)
|
||||||
|
|
||||||
|
# Caches (excluded from eq/hash)
|
||||||
|
_native_dependencies: tuple[str, ...] | None = dataclasses.field(
|
||||||
|
default=None, init=False, repr=False, compare=False
|
||||||
|
)
|
||||||
|
_foreign_dependencies: tuple[str, ...] | None = dataclasses.field(
|
||||||
|
default=None, init=False, repr=False, compare=False
|
||||||
|
)
|
||||||
|
|
||||||
|
_native_make_dependencies: tuple[str, ...] | None = dataclasses.field(
|
||||||
|
default=None, init=False, repr=False, compare=False
|
||||||
|
)
|
||||||
|
_foreign_make_dependencies: tuple[str, ...] | None = dataclasses.field(
|
||||||
|
default=None, init=False, repr=False, compare=False
|
||||||
|
)
|
||||||
|
|
||||||
|
_native_check_dependencies: tuple[str, ...] | None = dataclasses.field(
|
||||||
|
default=None, init=False, repr=False, compare=False
|
||||||
|
)
|
||||||
|
_foreign_check_dependencies: tuple[str, ...] | None = dataclasses.field(
|
||||||
|
default=None, init=False, repr=False, compare=False
|
||||||
|
)
|
||||||
|
|
||||||
def __post_init__(self) -> None:
|
def __post_init__(self) -> None:
|
||||||
if self.git_url is None and self.pkgbuild_directory is None:
|
if self.git_url is None and self.pkgbuild_directory is None:
|
||||||
raise ValueError("Both git_url and pkgbuild_directory cannot be None.")
|
raise ValueError("Both git_url and pkgbuild_directory cannot be None.")
|
||||||
@@ -67,77 +89,109 @@ class PackageInfo:
|
|||||||
"""
|
"""
|
||||||
return f"{self.pkgname}-{self.version}"
|
return f"{self.pkgname}-{self.version}"
|
||||||
|
|
||||||
|
# --- public API ---------------------------------------------------------
|
||||||
|
|
||||||
def foreign_dependencies(self, pacman: PacmanInterface) -> list[str]:
|
def foreign_dependencies(self, pacman: PacmanInterface) -> list[str]:
|
||||||
"""
|
"""
|
||||||
Returns a list of foreign dependencies of this package.
|
Returns a list of foreign dependencies of this package.
|
||||||
|
|
||||||
The dependencies are stripped of their version constrainst if there are any.
|
The dependencies are stripped of their version constraints if there are any.
|
||||||
"""
|
"""
|
||||||
result = []
|
self._ensure_dependencies_cached(pacman)
|
||||||
for dependency in self.dependencies:
|
assert self._foreign_dependencies is not None
|
||||||
if not pacman.is_installable(dependency):
|
return list(self._foreign_dependencies)
|
||||||
result.append(strip_dependency(dependency))
|
|
||||||
return result
|
|
||||||
|
|
||||||
def foreign_make_dependencies(self, pacman: PacmanInterface) -> list[str]:
|
def foreign_make_dependencies(self, pacman: PacmanInterface) -> list[str]:
|
||||||
"""
|
"""
|
||||||
Returns a list of foreign make dependencies of this package.
|
Returns a list of foreign make dependencies of this package.
|
||||||
|
|
||||||
The dependencies are stripped of their version constrainst if there are any.
|
The dependencies are stripped of their version constraints if there are any.
|
||||||
"""
|
"""
|
||||||
result = []
|
self._ensure_make_dependencies_cached(pacman)
|
||||||
for dependency in self.make_dependencies:
|
assert self._foreign_make_dependencies is not None
|
||||||
if not pacman.is_installable(dependency):
|
return list(self._foreign_make_dependencies)
|
||||||
result.append(strip_dependency(dependency))
|
|
||||||
return result
|
|
||||||
|
|
||||||
def foreign_check_dependencies(self, pacman: PacmanInterface) -> list[str]:
|
def foreign_check_dependencies(self, pacman: PacmanInterface) -> list[str]:
|
||||||
"""
|
"""
|
||||||
Returns a list of foreign check dependencies of this package.
|
Returns a list of foreign check dependencies of this package.
|
||||||
|
|
||||||
The dependencies are stripped of their version constrainst if there are any.
|
The dependencies are stripped of their version constraints if there are any.
|
||||||
"""
|
"""
|
||||||
result = []
|
self._ensure_check_dependencies_cached(pacman)
|
||||||
for dependency in self.check_dependencies:
|
assert self._foreign_check_dependencies is not None
|
||||||
if not pacman.is_installable(dependency):
|
return list(self._foreign_check_dependencies)
|
||||||
result.append(strip_dependency(dependency))
|
|
||||||
return result
|
|
||||||
|
|
||||||
def native_dependencies(self, pacman: PacmanInterface) -> list[str]:
|
def native_dependencies(self, pacman: PacmanInterface) -> list[str]:
|
||||||
"""
|
"""
|
||||||
Returns a list of native dependencies of this package.
|
Returns a list of native dependencies of this package.
|
||||||
|
|
||||||
The dependencies are stripped of their version constrainst if there are any.
|
The dependencies are stripped of their version constraints if there are any.
|
||||||
"""
|
"""
|
||||||
result = []
|
self._ensure_dependencies_cached(pacman)
|
||||||
for dependency in self.dependencies:
|
assert self._native_dependencies is not None
|
||||||
if pacman.is_installable(dependency):
|
return list(self._native_dependencies)
|
||||||
result.append(strip_dependency(dependency))
|
|
||||||
return result
|
|
||||||
|
|
||||||
def native_make_dependencies(self, pacman: PacmanInterface) -> list[str]:
|
def native_make_dependencies(self, pacman: PacmanInterface) -> list[str]:
|
||||||
"""
|
"""
|
||||||
Returns a list of native make dependencies of this package.
|
Returns a list of native make dependencies of this package.
|
||||||
|
|
||||||
The dependencies are stripped of their version constrainst if there are any.
|
The dependencies are stripped of their version constraints if there are any.
|
||||||
"""
|
"""
|
||||||
result = []
|
self._ensure_make_dependencies_cached(pacman)
|
||||||
for dependency in self.make_dependencies:
|
assert self._native_make_dependencies is not None
|
||||||
if pacman.is_installable(dependency):
|
return list(self._native_make_dependencies)
|
||||||
result.append(strip_dependency(dependency))
|
|
||||||
return result
|
|
||||||
|
|
||||||
def native_check_dependencies(self, pacman: PacmanInterface) -> list[str]:
|
def native_check_dependencies(self, pacman: PacmanInterface) -> list[str]:
|
||||||
"""
|
"""
|
||||||
Returns a list of native check dependencies of this package.
|
Returns a list of native check dependencies of this package.
|
||||||
|
|
||||||
The dependencies are stripped of their version constrainst if there are any.
|
The dependencies are stripped of their version constraints if there are any.
|
||||||
"""
|
"""
|
||||||
result = []
|
self._ensure_check_dependencies_cached(pacman)
|
||||||
for dependency in self.check_dependencies:
|
assert self._native_check_dependencies is not None
|
||||||
|
return list(self._native_check_dependencies)
|
||||||
|
|
||||||
|
# --- internal helpers ---------------------------------------------------
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _classify_dependencies(
|
||||||
|
deps: tuple[str, ...], pacman: PacmanInterface
|
||||||
|
) -> tuple[tuple[str, ...], tuple[str, ...]]:
|
||||||
|
native: list[str] = []
|
||||||
|
foreign: list[str] = []
|
||||||
|
|
||||||
|
for dependency in deps:
|
||||||
|
stripped = strip_dependency(dependency)
|
||||||
if pacman.is_installable(dependency):
|
if pacman.is_installable(dependency):
|
||||||
result.append(strip_dependency(dependency))
|
native.append(stripped)
|
||||||
return result
|
else:
|
||||||
|
foreign.append(stripped)
|
||||||
|
|
||||||
|
return tuple(native), tuple(foreign)
|
||||||
|
|
||||||
|
def _ensure_dependencies_cached(self, pacman: PacmanInterface) -> None:
|
||||||
|
if self._native_dependencies is not None:
|
||||||
|
return
|
||||||
|
|
||||||
|
native, foreign = self._classify_dependencies(self.dependencies, pacman)
|
||||||
|
object.__setattr__(self, "_native_dependencies", native)
|
||||||
|
object.__setattr__(self, "_foreign_dependencies", foreign)
|
||||||
|
|
||||||
|
def _ensure_make_dependencies_cached(self, pacman: PacmanInterface) -> None:
|
||||||
|
if self._native_make_dependencies is not None:
|
||||||
|
return
|
||||||
|
|
||||||
|
native, foreign = self._classify_dependencies(self.make_dependencies, pacman)
|
||||||
|
object.__setattr__(self, "_native_make_dependencies", native)
|
||||||
|
object.__setattr__(self, "_foreign_make_dependencies", foreign)
|
||||||
|
|
||||||
|
def _ensure_check_dependencies_cached(self, pacman: PacmanInterface) -> None:
|
||||||
|
if self._native_check_dependencies is not None:
|
||||||
|
return
|
||||||
|
|
||||||
|
native, foreign = self._classify_dependencies(self.check_dependencies, pacman)
|
||||||
|
object.__setattr__(self, "_native_check_dependencies", native)
|
||||||
|
object.__setattr__(self, "_foreign_check_dependencies", foreign)
|
||||||
|
|
||||||
|
|
||||||
class CustomPackage:
|
class CustomPackage:
|
||||||
|
|||||||
Reference in New Issue
Block a user