repology: new module
This commit is contained in:
parent
b369683914
commit
d56c2396c0
94
modules/repology.py
Normal file
94
modules/repology.py
Normal file
@ -0,0 +1,94 @@
|
||||
# coding=utf-8
|
||||
|
||||
"""Repology.org module: the packaging hub"""
|
||||
|
||||
import datetime
|
||||
import re
|
||||
|
||||
from nemubot import context
|
||||
from nemubot.exception import IMException
|
||||
from nemubot.hooks import hook
|
||||
from nemubot.tools import web
|
||||
from nemubot.tools.xmlparser.node import ModuleState
|
||||
|
||||
nemubotversion = 4.0
|
||||
|
||||
from nemubot.module.more import Response
|
||||
|
||||
URL_REPOAPI = "https://repology.org/api/v1/project/%s"
|
||||
|
||||
def get_json_project(project):
|
||||
prj = web.getJSON(URL_REPOAPI % (project))
|
||||
|
||||
return prj
|
||||
|
||||
|
||||
@hook.command("repology",
|
||||
help="Display version information about a package",
|
||||
help_usage={
|
||||
"PACKAGE_NAME": "Retrieve informations about PACKAGE_NAME",
|
||||
},
|
||||
keywords={
|
||||
"distro=DISTRO": "filter by disto",
|
||||
"status=STATUS[,STATUS...]": "filter by status",
|
||||
})
|
||||
def cmd_repology(msg):
|
||||
if len(msg.args) == 0:
|
||||
raise IMException("Please provide at least a package name")
|
||||
|
||||
res = Response(channel=msg.channel, nomore="No more information on package")
|
||||
|
||||
for project in msg.args:
|
||||
prj = get_json_project(project)
|
||||
if len(prj) == 0:
|
||||
raise IMException("Unable to find package " + project)
|
||||
|
||||
pkg_versions = {}
|
||||
pkg_maintainers = {}
|
||||
pkg_licenses = {}
|
||||
summary = None
|
||||
|
||||
for repo in prj:
|
||||
# Apply filters
|
||||
if "distro" in msg.kwargs and repo["repo"].find(msg.kwargs["distro"]) < 0:
|
||||
continue
|
||||
if "status" in msg.kwargs and repo["status"] not in msg.kwargs["status"].split(","):
|
||||
continue
|
||||
|
||||
name = repo["visiblename"] if "visiblename" in repo else repo["name"]
|
||||
status = repo["status"] if "status" in repo else "unknown"
|
||||
if name not in pkg_versions:
|
||||
pkg_versions[name] = {}
|
||||
if status not in pkg_versions[name]:
|
||||
pkg_versions[name][status] = []
|
||||
if repo["version"] not in pkg_versions[name][status]:
|
||||
pkg_versions[name][status].append(repo["version"])
|
||||
|
||||
if "maintainers" in repo:
|
||||
if name not in pkg_maintainers:
|
||||
pkg_maintainers[name] = []
|
||||
for maintainer in repo["maintainers"]:
|
||||
if maintainer not in pkg_maintainers[name]:
|
||||
pkg_maintainers[name].append(maintainer)
|
||||
|
||||
if "licenses" in repo:
|
||||
if name not in pkg_licenses:
|
||||
pkg_licenses[name] = []
|
||||
for lic in repo["licenses"]:
|
||||
if lic not in pkg_licenses[name]:
|
||||
pkg_licenses[name].append(lic)
|
||||
|
||||
if "summary" in repo and summary is None:
|
||||
summary = repo["summary"]
|
||||
|
||||
for pkgname in sorted(pkg_versions.keys()):
|
||||
m = "Package " + pkgname + " (" + summary + ")"
|
||||
if pkgname in pkg_licenses:
|
||||
m += " under " + ", ".join(pkg_licenses[pkgname])
|
||||
m += ": " + " - ".join([status + ": " + ", ".join(pkg_versions[pkgname][status]) for status in ["newest", "devel", "unique", "outdated", "legacy", "rolling", "noscheme", "untrusted", "ignored"] if status in pkg_versions[pkgname]])
|
||||
if "distro" in msg.kwargs and pkgname in pkg_maintainers:
|
||||
m += " - Maintained by " + ", ".join(pkg_maintainers[pkgname])
|
||||
|
||||
res.append_message(m)
|
||||
|
||||
return res
|
Loading…
x
Reference in New Issue
Block a user