feat: Indicate dependency source

Dependencies might reside in the AUR or official repositories.
Add "AUR" as superscript letters to indicate if a package/provider
is present in the AUR.

Signed-off-by: moson <moson@archlinux.org>
This commit is contained in:
moson 2023-09-03 14:17:11 +02:00
parent 1433553c05
commit 0a7b02956f
No known key found for this signature in database
GPG key ID: 4A4760AB4EE15296
5 changed files with 72 additions and 7 deletions

View file

@ -57,14 +57,17 @@ class PackageDependency(Base):
params=("NULL"), params=("NULL"),
) )
def is_package(self) -> bool: def is_aur_package(self) -> bool:
pkg = db.query(_Package).filter(_Package.Name == self.DepName).exists() pkg = db.query(_Package).filter(_Package.Name == self.DepName).exists()
return db.query(pkg).scalar()
def is_package(self) -> bool:
official = ( official = (
db.query(_OfficialProvider) db.query(_OfficialProvider)
.filter(_OfficialProvider.Name == self.DepName) .filter(_OfficialProvider.Name == self.DepName)
.exists() .exists()
) )
return db.query(pkg).scalar() or db.query(official).scalar() return self.is_aur_package() or db.query(official).scalar()
def provides(self) -> list[PackageRelation]: def provides(self) -> list[PackageRelation]:
from aurweb.models.relation_type import PROVIDES_ID from aurweb.models.relation_type import PROVIDES_ID

View file

@ -83,9 +83,11 @@ def package_link(package: Union[Package, OfficialProvider]) -> str:
@register_filter("provides_markup") @register_filter("provides_markup")
def provides_markup(provides: Providers) -> str: def provides_markup(provides: Providers) -> str:
return ", ".join( links = []
[f'<a href="{package_link(pkg)}">{pkg.Name}</a>' for pkg in provides] for pkg in provides:
) aur = "ᴬᵁᴿ" if not pkg.is_official else ""
links.append(f'<a href="{package_link(pkg)}">{pkg.Name}</a>{aur}')
return ", ".join(links)
def get_pkg_or_base( def get_pkg_or_base(

View file

@ -14,12 +14,15 @@
<a href="{{ dep.DepName | pkgname_link }}"> <a href="{{ dep.DepName | pkgname_link }}">
{% endif %} {% endif %}
{{ dep.DepName }} {{ dep.DepName }}
{% if broken %} {%- if broken %}
{% if not provides %} {% if not provides %}
</span> </span>
{% endif %} {% endif %}
{% else %} {% else -%}
</a> </a>
{%- if dep.is_aur_package() -%}
ᴬᵁᴿ
{% endif %}
{% endif %} {% endif %}
{% if provides %} {% if provides %}

View file

@ -4,6 +4,7 @@ from sqlalchemy.exc import IntegrityError
from aurweb import db from aurweb import db
from aurweb.models.account_type import USER_ID from aurweb.models.account_type import USER_ID
from aurweb.models.dependency_type import DEPENDS_ID from aurweb.models.dependency_type import DEPENDS_ID
from aurweb.models.official_provider import OfficialProvider
from aurweb.models.package import Package from aurweb.models.package import Package
from aurweb.models.package_base import PackageBase from aurweb.models.package_base import PackageBase
from aurweb.models.package_dependency import PackageDependency from aurweb.models.package_dependency import PackageDependency
@ -58,6 +59,22 @@ def test_package_dependencies(user: User, package: Package):
db.create(Package, PackageBase=base, Name=pkgdep.DepName) db.create(Package, PackageBase=base, Name=pkgdep.DepName)
assert pkgdep.is_package() assert pkgdep.is_package()
assert pkgdep.is_aur_package()
# Test with OfficialProvider
with db.begin():
pkgdep = db.create(
PackageDependency,
Package=package,
DepTypeID=DEPENDS_ID,
DepName="test-repo-pkg",
)
db.create(
OfficialProvider, Name=pkgdep.DepName, Repo="extra", Provides=pkgdep.DepName
)
assert pkgdep.is_package()
assert not pkgdep.is_aur_package()
def test_package_dependencies_null_package_raises(): def test_package_dependencies_null_package_raises():

View file

@ -10,8 +10,10 @@ from aurweb.models.package import Package
from aurweb.models.package_base import PackageBase from aurweb.models.package_base import PackageBase
from aurweb.models.package_dependency import PackageDependency from aurweb.models.package_dependency import PackageDependency
from aurweb.models.package_notification import PackageNotification from aurweb.models.package_notification import PackageNotification
from aurweb.models.package_relation import PackageRelation
from aurweb.models.package_source import PackageSource from aurweb.models.package_source import PackageSource
from aurweb.models.package_vote import PackageVote from aurweb.models.package_vote import PackageVote
from aurweb.models.relation_type import PROVIDES_ID
from aurweb.models.user import User from aurweb.models.user import User
from aurweb.packages import util from aurweb.packages import util
@ -155,3 +157,41 @@ def test_pkg_required(package: Package):
# We should have 1 record # We should have 1 record
assert qry.count() == 1 assert qry.count() == 1
def test_provides_markup(package: Package):
# Create dependency and provider for AUR pkg
with db.begin():
dep = db.create(
PackageDependency,
Package=package,
DepName="test",
DepTypeID=DEPENDS_ID,
)
rel_pkg = db.create(Package, PackageBase=package.PackageBase, Name=dep.DepName)
db.create(
PackageRelation,
Package=rel_pkg,
RelName=dep.DepName,
RelTypeID=PROVIDES_ID,
)
# AUR provider links should end with ᴬᵁᴿ
link = util.provides_markup(dep.provides())
assert link.endswith("</a>ᴬᵁᴿ")
assert OFFICIAL_BASE not in link
# Remove AUR provider and add official one
with db.begin():
db.delete(rel_pkg)
db.create(
OfficialProvider,
Name="official-pkg",
Repo="extra",
Provides=dep.DepName,
)
# Repo provider links should not have any suffix
link = util.provides_markup(dep.provides())
assert link.endswith("</a>")
assert OFFICIAL_BASE in link