mirror of
https://github.com/arcan1s/ahriman.git
synced 2025-04-24 23:37:18 +00:00
support check dependencies
This commit is contained in:
parent
8f2c33fe5d
commit
1625fddccd
@ -34,7 +34,7 @@ Again, the most checks can be performed by `make check` command, though some add
|
|||||||
do foo. With very very very long
|
do foo. With very very very long
|
||||||
docstring
|
docstring
|
||||||
|
|
||||||
Note:
|
Notes:
|
||||||
Very important note about this function
|
Very important note about this function
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
@ -60,6 +60,14 @@ ahriman.core.database.migrations.m006\_packages\_architecture\_required module
|
|||||||
:no-undoc-members:
|
:no-undoc-members:
|
||||||
:show-inheritance:
|
:show-inheritance:
|
||||||
|
|
||||||
|
ahriman.core.database.migrations.m007\_check\_depends module
|
||||||
|
------------------------------------------------------------
|
||||||
|
|
||||||
|
.. automodule:: ahriman.core.database.migrations.m007_check_depends
|
||||||
|
:members:
|
||||||
|
:no-undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
|
|
||||||
Module contents
|
Module contents
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ class Setup(Handler):
|
|||||||
"""
|
"""
|
||||||
create configuration for devtools based on ``source`` configuration
|
create configuration for devtools based on ``source`` configuration
|
||||||
|
|
||||||
Note:
|
Notes:
|
||||||
devtools does not allow to specify the pacman configuration, thus we still have to use configuration in /usr
|
devtools does not allow to specify the pacman configuration, thus we still have to use configuration in /usr
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
80
src/ahriman/core/database/migrations/m007_check_depends.py
Normal file
80
src/ahriman/core/database/migrations/m007_check_depends.py
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2021-2023 ahriman team.
|
||||||
|
#
|
||||||
|
# This file is part of ahriman
|
||||||
|
# (see https://github.com/arcan1s/ahriman).
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
from sqlite3 import Connection
|
||||||
|
|
||||||
|
from ahriman.core.alpm.pacman import Pacman
|
||||||
|
from ahriman.core.configuration import Configuration
|
||||||
|
from ahriman.core.util import package_like
|
||||||
|
from ahriman.models.package import Package
|
||||||
|
from ahriman.models.pacman_synchronization import PacmanSynchronization
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ["migrate_data", "steps"]
|
||||||
|
|
||||||
|
|
||||||
|
steps = [
|
||||||
|
"""
|
||||||
|
alter table packages add column check_depends json
|
||||||
|
""",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def migrate_data(connection: Connection, configuration: Configuration) -> None:
|
||||||
|
"""
|
||||||
|
perform data migration
|
||||||
|
|
||||||
|
Args:
|
||||||
|
connection(Connection): database connection
|
||||||
|
configuration(Configuration): configuration instance
|
||||||
|
"""
|
||||||
|
migrate_package_check_depends(connection, configuration)
|
||||||
|
|
||||||
|
|
||||||
|
def migrate_package_check_depends(connection: Connection, configuration: Configuration) -> None:
|
||||||
|
"""
|
||||||
|
migrate package check depends fields
|
||||||
|
|
||||||
|
Args:
|
||||||
|
connection(Connection): database connection
|
||||||
|
configuration(Configuration): configuration instance
|
||||||
|
"""
|
||||||
|
if not configuration.repository_paths.repository.is_dir():
|
||||||
|
return
|
||||||
|
|
||||||
|
_, architecture = configuration.check_loaded()
|
||||||
|
pacman = Pacman(architecture, configuration, refresh_database=PacmanSynchronization.Disabled)
|
||||||
|
|
||||||
|
package_list = []
|
||||||
|
for full_path in filter(package_like, configuration.repository_paths.repository.iterdir()):
|
||||||
|
base = Package.from_archive(full_path, pacman, remote=None)
|
||||||
|
for package, description in base.packages.items():
|
||||||
|
package_list.append({
|
||||||
|
"check_depends": description.check_depends,
|
||||||
|
"package": package,
|
||||||
|
})
|
||||||
|
|
||||||
|
connection.executemany(
|
||||||
|
"""
|
||||||
|
update packages set
|
||||||
|
check_depends = :check_depends
|
||||||
|
where package = :package
|
||||||
|
""",
|
||||||
|
package_list
|
||||||
|
)
|
@ -113,17 +113,17 @@ class PackageOperations(Operations):
|
|||||||
(package, package_base, architecture, archive_size,
|
(package, package_base, architecture, archive_size,
|
||||||
build_date, depends, description, filename,
|
build_date, depends, description, filename,
|
||||||
"groups", installed_size, licenses, provides,
|
"groups", installed_size, licenses, provides,
|
||||||
url, make_depends, opt_depends)
|
url, make_depends, opt_depends, check_depends)
|
||||||
values
|
values
|
||||||
(:package, :package_base, :architecture, :archive_size,
|
(:package, :package_base, :architecture, :archive_size,
|
||||||
:build_date, :depends, :description, :filename,
|
:build_date, :depends, :description, :filename,
|
||||||
:groups, :installed_size, :licenses, :provides,
|
:groups, :installed_size, :licenses, :provides,
|
||||||
:url, :make_depends, :opt_depends)
|
:url, :make_depends, :opt_depends, :check_depends)
|
||||||
on conflict (package, architecture) do update set
|
on conflict (package, architecture) do update set
|
||||||
package_base = :package_base, archive_size = :archive_size,
|
package_base = :package_base, archive_size = :archive_size,
|
||||||
build_date = :build_date, depends = :depends, description = :description, filename = :filename,
|
build_date = :build_date, depends = :depends, description = :description, filename = :filename,
|
||||||
"groups" = :groups, installed_size = :installed_size, licenses = :licenses, provides = :provides,
|
"groups" = :groups, installed_size = :installed_size, licenses = :licenses, provides = :provides,
|
||||||
url = :url, make_depends = :make_depends, opt_depends = :opt_depends
|
url = :url, make_depends = :make_depends, opt_depends = :opt_depends, check_depends = :check_depends
|
||||||
""",
|
""",
|
||||||
package_list)
|
package_list)
|
||||||
|
|
||||||
|
@ -220,7 +220,7 @@ class GPG(LazyLogging):
|
|||||||
"""
|
"""
|
||||||
sign repository if required by configuration
|
sign repository if required by configuration
|
||||||
|
|
||||||
Note:
|
Notes:
|
||||||
More likely you just want to pass ``repository_sign_args`` to repo wrapper
|
More likely you just want to pass ``repository_sign_args`` to repo wrapper
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
@ -52,6 +52,7 @@ class AURPackage:
|
|||||||
depends(list[str]): list of package dependencies
|
depends(list[str]): list of package dependencies
|
||||||
make_depends(l[str]): list of package make dependencies
|
make_depends(l[str]): list of package make dependencies
|
||||||
opt_depends(list[str]): list of package optional dependencies
|
opt_depends(list[str]): list of package optional dependencies
|
||||||
|
check_depends(list[str]): list of package test dependencies
|
||||||
conflicts(list[str]): conflicts list for the package
|
conflicts(list[str]): conflicts list for the package
|
||||||
provides(list[str]): list of packages which this package provides
|
provides(list[str]): list of packages which this package provides
|
||||||
license(list[str]): list of package licenses
|
license(list[str]): list of package licenses
|
||||||
@ -94,6 +95,7 @@ class AURPackage:
|
|||||||
depends: list[str] = field(default_factory=list)
|
depends: list[str] = field(default_factory=list)
|
||||||
make_depends: list[str] = field(default_factory=list)
|
make_depends: list[str] = field(default_factory=list)
|
||||||
opt_depends: list[str] = field(default_factory=list)
|
opt_depends: list[str] = field(default_factory=list)
|
||||||
|
check_depends: list[str] = field(default_factory=list)
|
||||||
conflicts: list[str] = field(default_factory=list)
|
conflicts: list[str] = field(default_factory=list)
|
||||||
provides: list[str] = field(default_factory=list)
|
provides: list[str] = field(default_factory=list)
|
||||||
license: list[str] = field(default_factory=list)
|
license: list[str] = field(default_factory=list)
|
||||||
@ -146,6 +148,7 @@ class AURPackage:
|
|||||||
depends=package.depends,
|
depends=package.depends,
|
||||||
make_depends=package.makedepends,
|
make_depends=package.makedepends,
|
||||||
opt_depends=package.optdepends,
|
opt_depends=package.optdepends,
|
||||||
|
check_depends=package.checkdepends,
|
||||||
conflicts=package.conflicts,
|
conflicts=package.conflicts,
|
||||||
provides=package.provides,
|
provides=package.provides,
|
||||||
license=package.licenses,
|
license=package.licenses,
|
||||||
@ -185,6 +188,7 @@ class AURPackage:
|
|||||||
depends=dump["depends"],
|
depends=dump["depends"],
|
||||||
make_depends=dump["makedepends"],
|
make_depends=dump["makedepends"],
|
||||||
opt_depends=dump["optdepends"],
|
opt_depends=dump["optdepends"],
|
||||||
|
check_depends=dump["checkdepends"],
|
||||||
conflicts=dump["conflicts"],
|
conflicts=dump["conflicts"],
|
||||||
provides=dump["provides"],
|
provides=dump["provides"],
|
||||||
license=dump["licenses"],
|
license=dump["licenses"],
|
||||||
|
@ -22,7 +22,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import copy
|
import copy
|
||||||
|
|
||||||
from collections.abc import Generator, Iterable
|
from collections.abc import Callable, Generator, Iterable
|
||||||
from dataclasses import asdict, dataclass
|
from dataclasses import asdict, dataclass
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from pyalpm import vercmp # type: ignore[import]
|
from pyalpm import vercmp # type: ignore[import]
|
||||||
@ -88,7 +88,7 @@ class Package(LazyLogging):
|
|||||||
Returns:
|
Returns:
|
||||||
list[str]: sum of dependencies per each package
|
list[str]: sum of dependencies per each package
|
||||||
"""
|
"""
|
||||||
return sorted(set(sum((package.depends for package in self.packages.values()), start=[])))
|
return self._package_list_property(lambda package: package.depends)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def depends_build(self) -> set[str]:
|
def depends_build(self) -> set[str]:
|
||||||
@ -98,7 +98,17 @@ class Package(LazyLogging):
|
|||||||
Returns:
|
Returns:
|
||||||
set[str]: full dependencies list used by devtools
|
set[str]: full dependencies list used by devtools
|
||||||
"""
|
"""
|
||||||
return (set(self.depends) | set(self.depends_make)).difference(self.packages_full)
|
return (set(self.depends) | set(self.depends_make) | set(self.depends_check)).difference(self.packages_full)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def depends_check(self) -> list[str]:
|
||||||
|
"""
|
||||||
|
get package test dependencies
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
list[str]: sum of test dependencies per each package
|
||||||
|
"""
|
||||||
|
return self._package_list_property(lambda package: package.check_depends)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def depends_make(self) -> list[str]:
|
def depends_make(self) -> list[str]:
|
||||||
@ -108,7 +118,7 @@ class Package(LazyLogging):
|
|||||||
Returns:
|
Returns:
|
||||||
list[str]: sum of make dependencies per each package
|
list[str]: sum of make dependencies per each package
|
||||||
"""
|
"""
|
||||||
return sorted(set(sum((package.make_depends for package in self.packages.values()), start=[])))
|
return self._package_list_property(lambda package: package.make_depends)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def depends_opt(self) -> list[str]:
|
def depends_opt(self) -> list[str]:
|
||||||
@ -118,7 +128,7 @@ class Package(LazyLogging):
|
|||||||
Returns:
|
Returns:
|
||||||
list[str]: sum of optional dependencies per each package
|
list[str]: sum of optional dependencies per each package
|
||||||
"""
|
"""
|
||||||
return sorted(set(sum((package.opt_depends for package in self.packages.values()), start=[])))
|
return self._package_list_property(lambda package: package.opt_depends)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def groups(self) -> list[str]:
|
def groups(self) -> list[str]:
|
||||||
@ -128,7 +138,7 @@ class Package(LazyLogging):
|
|||||||
Returns:
|
Returns:
|
||||||
list[str]: sum of groups per each package
|
list[str]: sum of groups per each package
|
||||||
"""
|
"""
|
||||||
return sorted(set(sum((package.groups for package in self.packages.values()), start=[])))
|
return self._package_list_property(lambda package: package.groups)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_single_package(self) -> bool:
|
def is_single_package(self) -> bool:
|
||||||
@ -163,7 +173,7 @@ class Package(LazyLogging):
|
|||||||
Returns:
|
Returns:
|
||||||
list[str]: sum of licenses per each package
|
list[str]: sum of licenses per each package
|
||||||
"""
|
"""
|
||||||
return sorted(set(sum((package.licenses for package in self.packages.values()), start=[])))
|
return self._package_list_property(lambda package: package.licenses)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def packages_full(self) -> list[str]:
|
def packages_full(self) -> list[str]:
|
||||||
@ -241,6 +251,7 @@ class Package(LazyLogging):
|
|||||||
depends=srcinfo_property_list("depends", srcinfo, properties, architecture=architecture),
|
depends=srcinfo_property_list("depends", srcinfo, properties, architecture=architecture),
|
||||||
make_depends=srcinfo_property_list("makedepends", srcinfo, properties, architecture=architecture),
|
make_depends=srcinfo_property_list("makedepends", srcinfo, properties, architecture=architecture),
|
||||||
opt_depends=srcinfo_property_list("optdepends", srcinfo, properties, architecture=architecture),
|
opt_depends=srcinfo_property_list("optdepends", srcinfo, properties, architecture=architecture),
|
||||||
|
check_depends=srcinfo_property_list("checkdepends", srcinfo, properties, architecture=architecture),
|
||||||
)
|
)
|
||||||
for package, properties in srcinfo["packages"].items()
|
for package, properties in srcinfo["packages"].items()
|
||||||
}
|
}
|
||||||
@ -351,6 +362,26 @@ class Package(LazyLogging):
|
|||||||
raise PackageInfoError(errors)
|
raise PackageInfoError(errors)
|
||||||
return set(srcinfo.get("arch", []))
|
return set(srcinfo.get("arch", []))
|
||||||
|
|
||||||
|
def _package_list_property(self, extractor: Callable[[PackageDescription], list[str]]) -> list[str]:
|
||||||
|
"""
|
||||||
|
extract list property from single packages and combine them into one list
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
Basically this method is generic for type of ``list[T]``, but there is no trait ``Comparable`` in default
|
||||||
|
packages, thus we limit this method only to new types
|
||||||
|
|
||||||
|
Args:
|
||||||
|
extractor(Callable[[PackageDescription], list[str]): package property extractor
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
list[str]: combined list of unique entries in properties list
|
||||||
|
"""
|
||||||
|
def generator() -> Generator[str, None, None]:
|
||||||
|
for package in self.packages.values():
|
||||||
|
yield from extractor(package)
|
||||||
|
|
||||||
|
return sorted(set(generator()))
|
||||||
|
|
||||||
def actual_version(self, paths: RepositoryPaths) -> str:
|
def actual_version(self, paths: RepositoryPaths) -> str:
|
||||||
"""
|
"""
|
||||||
additional method to handle VCS package versions
|
additional method to handle VCS package versions
|
||||||
|
@ -35,6 +35,7 @@ class PackageDescription:
|
|||||||
architecture(str | None): package architecture
|
architecture(str | None): package architecture
|
||||||
archive_size(int | None): package archive size
|
archive_size(int | None): package archive size
|
||||||
build_date(int | None): package build date
|
build_date(int | None): package build date
|
||||||
|
check_depends(list[str]): package dependencies list used for check functions
|
||||||
depends(list[str]): package dependencies list
|
depends(list[str]): package dependencies list
|
||||||
opt_depends(list[str]): optional package dependencies list
|
opt_depends(list[str]): optional package dependencies list
|
||||||
make_depends(list[str]): package dependencies list used for building
|
make_depends(list[str]): package dependencies list used for building
|
||||||
@ -70,6 +71,7 @@ class PackageDescription:
|
|||||||
depends: list[str] = field(default_factory=list)
|
depends: list[str] = field(default_factory=list)
|
||||||
make_depends: list[str] = field(default_factory=list)
|
make_depends: list[str] = field(default_factory=list)
|
||||||
opt_depends: list[str] = field(default_factory=list)
|
opt_depends: list[str] = field(default_factory=list)
|
||||||
|
check_depends: list[str] = field(default_factory=list)
|
||||||
description: str | None = None
|
description: str | None = None
|
||||||
filename: str | None = None
|
filename: str | None = None
|
||||||
groups: list[str] = field(default_factory=list)
|
groups: list[str] = field(default_factory=list)
|
||||||
@ -85,6 +87,7 @@ class PackageDescription:
|
|||||||
self.depends = [trim_package(package) for package in self.depends]
|
self.depends = [trim_package(package) for package in self.depends]
|
||||||
self.opt_depends = [trim_package(package) for package in self.opt_depends]
|
self.opt_depends = [trim_package(package) for package in self.opt_depends]
|
||||||
self.make_depends = [trim_package(package) for package in self.make_depends]
|
self.make_depends = [trim_package(package) for package in self.make_depends]
|
||||||
|
self.check_depends = [trim_package(package) for package in self.check_depends]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def filepath(self) -> Path | None:
|
def filepath(self) -> Path | None:
|
||||||
@ -111,6 +114,7 @@ class PackageDescription:
|
|||||||
depends=package.depends,
|
depends=package.depends,
|
||||||
make_depends=package.make_depends,
|
make_depends=package.make_depends,
|
||||||
opt_depends=package.opt_depends,
|
opt_depends=package.opt_depends,
|
||||||
|
check_depends=package.check_depends,
|
||||||
description=package.description,
|
description=package.description,
|
||||||
licenses=package.license,
|
licenses=package.license,
|
||||||
provides=package.provides,
|
provides=package.provides,
|
||||||
@ -151,6 +155,7 @@ class PackageDescription:
|
|||||||
depends=package.depends,
|
depends=package.depends,
|
||||||
make_depends=package.makedepends,
|
make_depends=package.makedepends,
|
||||||
opt_depends=package.optdepends,
|
opt_depends=package.optdepends,
|
||||||
|
check_depends=package.checkdepends,
|
||||||
description=package.desc,
|
description=package.desc,
|
||||||
filename=path.name,
|
filename=path.name,
|
||||||
groups=package.groups,
|
groups=package.groups,
|
||||||
|
@ -49,6 +49,10 @@ class PackagePropertiesSchema(Schema):
|
|||||||
"description": "Package optional dependencies list",
|
"description": "Package optional dependencies list",
|
||||||
"example": ["python-aiohttp"],
|
"example": ["python-aiohttp"],
|
||||||
})
|
})
|
||||||
|
check_depends = fields.List(fields.String(), metadata={
|
||||||
|
"description": "Package test dependencies list",
|
||||||
|
"example": ["python-pytest"],
|
||||||
|
})
|
||||||
description = fields.String(metadata={
|
description = fields.String(metadata={
|
||||||
"description": "Package description",
|
"description": "Package description",
|
||||||
"example": "ArcH linux ReposItory MANager",
|
"example": "ArcH linux ReposItory MANager",
|
||||||
|
@ -74,7 +74,7 @@ def test_with_dependencies(application: Application, package_ahriman: Package, p
|
|||||||
|
|
||||||
package_mock = mocker.patch("ahriman.models.package.Package.from_aur", side_effect=lambda p, _: packages[p])
|
package_mock = mocker.patch("ahriman.models.package.Package.from_aur", side_effect=lambda p, _: packages[p])
|
||||||
packages_mock = mocker.patch("ahriman.application.application.Application._known_packages",
|
packages_mock = mocker.patch("ahriman.application.application.Application._known_packages",
|
||||||
return_value=["devtools", "python-build"])
|
return_value=["devtools", "python-build", "python-pytest"])
|
||||||
|
|
||||||
result = application.with_dependencies([package_ahriman], process_dependencies=True)
|
result = application.with_dependencies([package_ahriman], process_dependencies=True)
|
||||||
assert {package.base: package for package in result} == packages
|
assert {package.base: package for package in result} == packages
|
||||||
|
@ -146,6 +146,9 @@ def aur_package_ahriman() -> AURPackage:
|
|||||||
"rsync",
|
"rsync",
|
||||||
"subversion",
|
"subversion",
|
||||||
],
|
],
|
||||||
|
check_depends=[
|
||||||
|
"python-pytest",
|
||||||
|
],
|
||||||
conflicts=[],
|
conflicts=[],
|
||||||
provides=[],
|
provides=[],
|
||||||
license=["GPL3"],
|
license=["GPL3"],
|
||||||
@ -335,6 +338,9 @@ def package_description_ahriman() -> PackageDescription:
|
|||||||
"rsync",
|
"rsync",
|
||||||
"subversion",
|
"subversion",
|
||||||
],
|
],
|
||||||
|
check_depends=[
|
||||||
|
"python-pytest",
|
||||||
|
],
|
||||||
description="ArcH linux ReposItory MANager",
|
description="ArcH linux ReposItory MANager",
|
||||||
filename="ahriman-2.6.0-1-any.pkg.tar.zst",
|
filename="ahriman-2.6.0-1-any.pkg.tar.zst",
|
||||||
groups=[],
|
groups=[],
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
import pytest
|
||||||
|
|
||||||
|
from pytest_mock import MockerFixture
|
||||||
|
from sqlite3 import Connection
|
||||||
|
|
||||||
|
from ahriman.core.configuration import Configuration
|
||||||
|
from ahriman.core.database.migrations.m007_check_depends import migrate_data, migrate_package_check_depends, steps
|
||||||
|
from ahriman.models.package import Package
|
||||||
|
|
||||||
|
|
||||||
|
def test_migration_check_depends() -> None:
|
||||||
|
"""
|
||||||
|
migration must not be empty
|
||||||
|
"""
|
||||||
|
assert steps
|
||||||
|
|
||||||
|
|
||||||
|
def test_migrate_data(connection: Connection, configuration: Configuration, mocker: MockerFixture) -> None:
|
||||||
|
"""
|
||||||
|
must perform data migration
|
||||||
|
"""
|
||||||
|
depends_mock = mocker.patch("ahriman.core.database.migrations.m007_check_depends.migrate_package_check_depends")
|
||||||
|
migrate_data(connection, configuration)
|
||||||
|
depends_mock.assert_called_once_with(connection, configuration)
|
||||||
|
|
||||||
|
|
||||||
|
def test_migrate_package_depends(connection: Connection, configuration: Configuration, package_ahriman: Package,
|
||||||
|
mocker: MockerFixture) -> None:
|
||||||
|
"""
|
||||||
|
must update make and opt depends list
|
||||||
|
"""
|
||||||
|
mocker.patch("pathlib.Path.is_dir", return_value=True)
|
||||||
|
mocker.patch("pathlib.Path.iterdir", return_value=[package_ahriman.packages[package_ahriman.base].filepath])
|
||||||
|
package_mock = mocker.patch("ahriman.models.package.Package.from_archive", return_value=package_ahriman)
|
||||||
|
|
||||||
|
migrate_package_check_depends(connection, configuration)
|
||||||
|
package_mock.assert_called_once_with(
|
||||||
|
package_ahriman.packages[package_ahriman.base].filepath, pytest.helpers.anyvar(int), remote=None)
|
||||||
|
connection.executemany.assert_called_once_with(pytest.helpers.anyvar(str, strict=True), [{
|
||||||
|
"check_depends": package_ahriman.packages[package_ahriman.base].check_depends,
|
||||||
|
"package": package_ahriman.base,
|
||||||
|
}])
|
||||||
|
|
||||||
|
|
||||||
|
def test_migrate_package_depends_skip(connection: Connection, configuration: Configuration,
|
||||||
|
mocker: MockerFixture) -> None:
|
||||||
|
"""
|
||||||
|
must skip update make and opt depends list if no repository directory found
|
||||||
|
"""
|
||||||
|
mocker.patch("pathlib.Path.is_dir", return_value=False)
|
||||||
|
migrate_package_check_depends(connection, configuration)
|
||||||
|
connection.executemany.assert_not_called()
|
@ -22,7 +22,7 @@ def test_calculate_hash_small(resource_path_root: Path) -> None:
|
|||||||
must calculate checksum for path which is single chunk
|
must calculate checksum for path which is single chunk
|
||||||
"""
|
"""
|
||||||
path = resource_path_root / "models" / "package_ahriman_srcinfo"
|
path = resource_path_root / "models" / "package_ahriman_srcinfo"
|
||||||
assert HttpUpload.calculate_hash(path) == "79b0f84e0232ed34fd191a85c383ecc5"
|
assert HttpUpload.calculate_hash(path) == "2635e2898452d594025517cfe529b1f2"
|
||||||
|
|
||||||
|
|
||||||
def test_get_body_get_hashes() -> None:
|
def test_get_body_get_hashes() -> None:
|
||||||
|
@ -30,7 +30,7 @@ def test_calculate_etag_small(resource_path_root: Path) -> None:
|
|||||||
must calculate checksum for path which is single chunk
|
must calculate checksum for path which is single chunk
|
||||||
"""
|
"""
|
||||||
path = resource_path_root / "models" / "package_ahriman_srcinfo"
|
path = resource_path_root / "models" / "package_ahriman_srcinfo"
|
||||||
assert S3.calculate_etag(path, _chunk_size) == "79b0f84e0232ed34fd191a85c383ecc5"
|
assert S3.calculate_etag(path, _chunk_size) == "2635e2898452d594025517cfe529b1f2"
|
||||||
|
|
||||||
|
|
||||||
def test_files_remove(s3_remote_objects: list[Any]) -> None:
|
def test_files_remove(s3_remote_objects: list[Any]) -> None:
|
||||||
|
@ -115,6 +115,7 @@ def pyalpm_package_ahriman(aur_package_ahriman: AURPackage) -> MagicMock:
|
|||||||
type(mock).makedepends = PropertyMock(return_value=aur_package_ahriman.make_depends)
|
type(mock).makedepends = PropertyMock(return_value=aur_package_ahriman.make_depends)
|
||||||
type(mock).name = PropertyMock(return_value=aur_package_ahriman.name)
|
type(mock).name = PropertyMock(return_value=aur_package_ahriman.name)
|
||||||
type(mock).optdepends = PropertyMock(return_value=aur_package_ahriman.opt_depends)
|
type(mock).optdepends = PropertyMock(return_value=aur_package_ahriman.opt_depends)
|
||||||
|
type(mock).checkdepends = PropertyMock(return_value=aur_package_ahriman.check_depends)
|
||||||
type(mock).provides = PropertyMock(return_value=aur_package_ahriman.provides)
|
type(mock).provides = PropertyMock(return_value=aur_package_ahriman.provides)
|
||||||
type(mock).version = PropertyMock(return_value=aur_package_ahriman.version)
|
type(mock).version = PropertyMock(return_value=aur_package_ahriman.version)
|
||||||
type(mock).url = PropertyMock(return_value=aur_package_ahriman.url)
|
type(mock).url = PropertyMock(return_value=aur_package_ahriman.url)
|
||||||
@ -139,6 +140,7 @@ def pyalpm_package_description_ahriman(package_description_ahriman: PackageDescr
|
|||||||
type(mock).depends = PropertyMock(return_value=package_description_ahriman.depends)
|
type(mock).depends = PropertyMock(return_value=package_description_ahriman.depends)
|
||||||
type(mock).makedepends = PropertyMock(return_value=package_description_ahriman.make_depends)
|
type(mock).makedepends = PropertyMock(return_value=package_description_ahriman.make_depends)
|
||||||
type(mock).optdepends = PropertyMock(return_value=package_description_ahriman.opt_depends)
|
type(mock).optdepends = PropertyMock(return_value=package_description_ahriman.opt_depends)
|
||||||
|
type(mock).checkdepends = PropertyMock(return_value=package_description_ahriman.check_depends)
|
||||||
type(mock).desc = PropertyMock(return_value=package_description_ahriman.description)
|
type(mock).desc = PropertyMock(return_value=package_description_ahriman.description)
|
||||||
type(mock).groups = PropertyMock(return_value=package_description_ahriman.groups)
|
type(mock).groups = PropertyMock(return_value=package_description_ahriman.groups)
|
||||||
type(mock).isize = PropertyMock(return_value=package_description_ahriman.installed_size)
|
type(mock).isize = PropertyMock(return_value=package_description_ahriman.installed_size)
|
||||||
|
@ -36,6 +36,10 @@ def test_depends_build(package_ahriman: Package, package_python_schedule: Packag
|
|||||||
set(package_ahriman.depends_build).intersection(package.make_depends)
|
set(package_ahriman.depends_build).intersection(package.make_depends)
|
||||||
for package in package_ahriman.packages.values()
|
for package in package_ahriman.packages.values()
|
||||||
)
|
)
|
||||||
|
assert all(
|
||||||
|
set(package_ahriman.depends_build).intersection(package.check_depends)
|
||||||
|
for package in package_ahriman.packages.values()
|
||||||
|
)
|
||||||
|
|
||||||
assert all(
|
assert all(
|
||||||
set(package_python_schedule.depends_build).intersection(package.depends)
|
set(package_python_schedule.depends_build).intersection(package.depends)
|
||||||
@ -53,7 +57,21 @@ def test_depends_build_with_version_and_overlap(mocker: MockerFixture, resource_
|
|||||||
mocker.patch("ahriman.models.package.Package._check_output", return_value=srcinfo)
|
mocker.patch("ahriman.models.package.Package._check_output", return_value=srcinfo)
|
||||||
|
|
||||||
package_gcc10 = Package.from_build(Path("local"), "x86_64")
|
package_gcc10 = Package.from_build(Path("local"), "x86_64")
|
||||||
assert package_gcc10.depends_build == {"glibc", "doxygen", "binutils", "git", "libmpc", "python", "zstd"}
|
assert package_gcc10.depends_build == {
|
||||||
|
"glibc", "zstd", # depends
|
||||||
|
"doxygen", "binutils", "git", "libmpc", "python", # make depends
|
||||||
|
"dejagnu", "inetutils", # check depends
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def test_depends_check(package_ahriman: Package) -> None:
|
||||||
|
"""
|
||||||
|
must return list of test dependencies
|
||||||
|
"""
|
||||||
|
assert all(
|
||||||
|
set(package_ahriman.depends_check).intersection(package.check_depends)
|
||||||
|
for package in package_ahriman.packages.values()
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_depends_make(package_ahriman: Package) -> None:
|
def test_depends_make(package_ahriman: Package) -> None:
|
||||||
@ -183,16 +201,19 @@ def test_from_build_multiple_packages(mocker: MockerFixture, resource_path_root:
|
|||||||
depends=["gcc10-libs=10.3.0-2", "binutils>=2.28", "libmpc", "zstd"],
|
depends=["gcc10-libs=10.3.0-2", "binutils>=2.28", "libmpc", "zstd"],
|
||||||
make_depends=["binutils", "doxygen", "git", "libmpc", "python"],
|
make_depends=["binutils", "doxygen", "git", "libmpc", "python"],
|
||||||
opt_depends=[],
|
opt_depends=[],
|
||||||
|
check_depends=["dejagnu", "inetutils"],
|
||||||
),
|
),
|
||||||
"gcc10-libs": PackageDescription(
|
"gcc10-libs": PackageDescription(
|
||||||
depends=["glibc>=2.27"],
|
depends=["glibc>=2.27"],
|
||||||
make_depends=["binutils", "doxygen", "git", "libmpc", "python"],
|
make_depends=["binutils", "doxygen", "git", "libmpc", "python"],
|
||||||
opt_depends=[],
|
opt_depends=[],
|
||||||
|
check_depends=["dejagnu", "inetutils"],
|
||||||
),
|
),
|
||||||
"gcc10-fortran": PackageDescription(
|
"gcc10-fortran": PackageDescription(
|
||||||
depends=["gcc10=10.3.0-2"],
|
depends=["gcc10=10.3.0-2"],
|
||||||
make_depends=["binutils", "doxygen", "git", "libmpc", "python"],
|
make_depends=["binutils", "doxygen", "git", "libmpc", "python"],
|
||||||
opt_depends=[],
|
opt_depends=[],
|
||||||
|
check_depends=["dejagnu", "inetutils"],
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
"resultcount": 1,
|
"resultcount": 1,
|
||||||
"results": [
|
"results": [
|
||||||
{
|
{
|
||||||
|
"CheckDepends": [
|
||||||
|
"python-pytest"
|
||||||
|
],
|
||||||
"Depends": [
|
"Depends": [
|
||||||
"devtools",
|
"devtools",
|
||||||
"git",
|
"git",
|
||||||
|
@ -5,6 +5,7 @@ pkgbase = ahriman
|
|||||||
url = https://github.com/arcan1s/ahriman
|
url = https://github.com/arcan1s/ahriman
|
||||||
arch = any
|
arch = any
|
||||||
license = GPL3
|
license = GPL3
|
||||||
|
checkdepends = python-pytest
|
||||||
makedepends = python-build
|
makedepends = python-build
|
||||||
makedepends = python-installer
|
makedepends = python-installer
|
||||||
makedepends = python-wheel
|
makedepends = python-wheel
|
||||||
|
Loading…
Reference in New Issue
Block a user