mirror of
https://github.com/arcan1s/ahriman.git
synced 2025-04-24 15:27:17 +00:00
112 lines
4.1 KiB
Python
112 lines
4.1 KiB
Python
#
|
|
# Copyright (c) 2021-2022 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 __future__ import annotations
|
|
|
|
import datetime
|
|
import inflection
|
|
|
|
from dataclasses import dataclass, field, fields
|
|
from typing import Any, Callable, Dict, List, Optional, Type
|
|
|
|
from ahriman.core.util import filter_json
|
|
|
|
|
|
@dataclass
|
|
class AURPackage:
|
|
"""
|
|
AUR package descriptor
|
|
:ivar id: package ID
|
|
:ivar name: package name
|
|
:ivar package_base_id: package base ID
|
|
:ivar version: package base version
|
|
:ivar description: package base description
|
|
:ivar url: package upstream URL
|
|
:ivar num_votes: number of votes for the package
|
|
:ivar polularity: package popularity
|
|
:ivar out_of_date: package out of date timestamp if any
|
|
:ivar maintainer: package maintainer
|
|
:ivar first_submitted: timestamp of the first package submission
|
|
:ivar last_modified: timestamp of the last package submission
|
|
:ivar url_path: AUR package path
|
|
:ivar depends: list of package dependencies
|
|
:ivar make_depends: list of package make dependencies
|
|
:ivar opt_depends: list of package optional dependencies
|
|
:ivar conflicts: conflicts list for the package
|
|
:ivar provides: list of packages which this package provides
|
|
:ivar license: list of package licenses
|
|
:ivar keywords: list of package keywords
|
|
"""
|
|
|
|
id: int
|
|
name: str
|
|
package_base_id: int
|
|
package_base: str
|
|
version: str
|
|
description: str
|
|
num_votes: int
|
|
popularity: float
|
|
first_submitted: datetime.datetime
|
|
last_modified: datetime.datetime
|
|
url_path: str
|
|
url: Optional[str] = None
|
|
out_of_date: Optional[datetime.datetime] = None
|
|
maintainer: Optional[str] = None
|
|
depends: List[str] = field(default_factory=list)
|
|
make_depends: List[str] = field(default_factory=list)
|
|
opt_depends: List[str] = field(default_factory=list)
|
|
conflicts: List[str] = field(default_factory=list)
|
|
provides: List[str] = field(default_factory=list)
|
|
license: List[str] = field(default_factory=list)
|
|
keywords: List[str] = field(default_factory=list)
|
|
|
|
@classmethod
|
|
def from_json(cls: Type[AURPackage], dump: Dict[str, Any]) -> AURPackage:
|
|
"""
|
|
construct package descriptor from RPC properties
|
|
:param dump: json dump body
|
|
:return: AUR package descriptor
|
|
"""
|
|
# filter to only known fields
|
|
known_fields = [pair.name for pair in fields(cls)]
|
|
properties = cls.convert(dump)
|
|
return cls(**filter_json(properties, known_fields))
|
|
|
|
@staticmethod
|
|
def convert(descriptor: Dict[str, Any]) -> Dict[str, Any]:
|
|
"""
|
|
covert AUR RPC key names to package keys
|
|
:param descriptor: RPC package descriptor
|
|
:return: package descriptor with names converted to snake case
|
|
"""
|
|
identity_mapper: Callable[[Any], Any] = lambda value: value
|
|
value_mapper: Dict[str, Callable[[Any], Any]] = {
|
|
"out_of_date": lambda value: datetime.datetime.utcfromtimestamp(value) if value is not None else None,
|
|
"first_submitted": datetime.datetime.utcfromtimestamp,
|
|
"last_modified": datetime.datetime.utcfromtimestamp,
|
|
}
|
|
|
|
result: Dict[str, Any] = {}
|
|
for api_key, api_value in descriptor.items():
|
|
property_key = inflection.underscore(api_key)
|
|
mapper = value_mapper.get(property_key, identity_mapper)
|
|
result[property_key] = mapper(api_value)
|
|
|
|
return result
|