# -*- encoding: utf-8 -*-
# PKGBUILDer v4.3.2
# An AUR helper (and library) in Python 3.
# Copyright © 2011-2023, Chris Warrick.
# See /LICENSE for licensing information.
"""
The Package class, the most important class in PKGBUILDer.
:Copyright: © 2011-2023, Chris Warrick.
:License: BSD (see /LICENSE).
"""
from . import UTC, DS
from .exceptions import SanityError
import datetime
__all__ = ('Package', 'AURPackage', 'ABSPackage')
def mktime(ts):
return datetime.datetime.utcfromtimestamp(ts).replace(tzinfo=UTC)
[docs]class Package(object):
"""The base class for packages."""
is_abs = None
name = ''
version = ''
description = ''
repo = ''
url = ''
licenses = []
human = ''
depends = []
optdepends = []
conflicts = []
provides = []
replaces = []
groups = []
def __init__(self, **kwargs):
"""Initialize the class."""
for k, v in kwargs.items():
setattr(self, k, v)
def __str__(self):
"""Return something nice for people wanting a string."""
return '-'.join((self.name, self.version))
def __repr__(self):
"""Return something nice for people wanting a repr."""
if self.is_abs:
return '<Repository Package {0}-{1}>'.format(self.name, self.version)
elif not self.is_abs:
return '<AUR Package {0}-{1}>'.format(self.name, self.version)
elif self.is_abs is None:
return '<??? Package {0}-{1}>'.format(self.name, self.version)
else:
return SanityError('is_abs is invalid ({0})'.format(self.is_abs),
'Package.__repr__()', is_abs=self.is_abs)
[docs]class AURPackage(Package):
"""An AUR package."""
repo = 'aur'
id = None
packagebase = ''
packagebaseid = None
makedepends = []
checkdepends = []
is_abs = False
is_outdated = None
outdated_since = None
added = None
modified = None
votes = None
urlpath = ''
popularity = None
keywords = []
[docs] @classmethod
def from_aurdict(cls, aurdict):
"""Create an instance of AURPackage from AUR RPC data."""
bindings = {'Description': 'description',
'ID': 'id',
'Maintainer': 'human',
'Name': 'name',
'NumVotes': 'votes',
'URL': 'url',
'Version': 'version',
'PackageBase': 'packagebase',
'PackageBaseID': 'packagebaseid',
'Depends': 'depends',
'MakeDepends': 'makedepends',
'CheckDepends': 'checkdepends',
'OptDepends': 'optdepends',
'Conflicts': 'conflicts',
'Provides': 'provides',
'Replaces': 'replaces',
'Groups': 'groups',
'License': 'licenses',
'URLPath': 'urlpath',
'Popularity': 'popularity',
'Keywords': 'keywords',
}
ignore = ['OutOfDate', 'FirstSubmitted', 'LastModified']
p = cls()
for k, v in aurdict.items():
try:
if v is not None:
setattr(p, bindings[k], v)
except KeyError:
if k not in ignore:
DS.log.warning('AURDict has an unknown %s key: %s',
k, aurdict)
# Manual overrides.
p.is_outdated = aurdict['OutOfDate'] is not None
if p.is_outdated:
p.outdated_since = mktime(aurdict['OutOfDate'])
else:
p.outdated_since = None
p.added = mktime(aurdict['FirstSubmitted'])
p.modified = mktime(aurdict['LastModified'])
return p
class ABSPackage(Package):
"""A repository package (formerly ABS)."""
is_abs = True
# Most of those aren’t necessary, but I am copying them over because I can.
arch = ''
backup = []
base64_sig = None
builddate = None
download_size = None
filename = ''
files = []
has_scriptlet = None
installdate = None
isize = None
md5sum = ''
reason = []
sha256sum = ''
size = None
@classmethod
def from_pyalpm(cls, alpmpkg):
"""Transform a pyalpm.Package into a pkgbuilder.package.ABSPackage."""
copy = ['arch', 'backup', 'base64_sig', 'conflicts',
'depends', 'download_size', 'filename', 'files', 'groups',
'has_scriptlet', 'isize', 'licenses', 'md5sum', 'name',
'optdepends', 'provides', 'reason', 'replaces', 'sha256sum',
'size', 'url', 'version']
p = cls()
for i in copy:
setattr(p, i, getattr(alpmpkg, i))
p.repo = alpmpkg.db.name
p.description = alpmpkg.desc
p.human = alpmpkg.packager
p.builddate = mktime(alpmpkg.builddate)
p.installdate = mktime(alpmpkg.installdate)
return p