altrepo.parser: add packages.ftbfs parser

parent c066010e
......@@ -86,6 +86,21 @@ class PackagesetInfo:
return models.RepositoryStatisticsModel(**data)
class AclInfo:
def __init__(self, client: BaseAPI):
self.client = client
async def groups(self, branch: str, name: str | None = None):
data = {"branch": branch}
if name:
data["name"] = name
data = await self.client.get(
"/acl/groups",
data
)
return models.AclGroupsModel(**data)
class BugInfo:
def __init__(self, client: BaseAPI):
self.client = client
......@@ -155,6 +170,7 @@ class ALTRepoAPI:
self.api = APIInfo(self._client)
self.package = PackageInfo(self._client)
self.packageset = PackagesetInfo(self._client)
self.acl = AclInfo(self._client)
self.bug = BugInfo(self._client)
self.file = FileInfo(self._client)
self.site = SiteInfo(self._client)
......
......@@ -128,4 +128,16 @@ class FilesElementModel(BaseModel):
class FilesModel(BaseModel):
request_args: Dict[str, Any]
length: int
files: List[FilesElementModel]
\ No newline at end of file
files: List[FilesElementModel]
class AclGroupsElementModel(BaseModel):
group: str
date: str
maintainers: List[str]
class AclGroupsModel(BaseModel):
request_args: Dict[str, Any]
length: int
groups: List[AclGroupsElementModel]
import aiohttp
from typing import List
from . import models
from .news import urls_parser, packages_parser, bugs_parser
from .packages import ftbfs_parser
class BaseParser:
......@@ -35,7 +38,7 @@ class NewsInfo:
return None
html = await self.client.get(url, "koi8-r")
return await packages_parser(html, url)
async def p11(self) -> models.PackagesModel | None:
url = (await self.news_urls()).p11
if not url:
......@@ -44,7 +47,18 @@ class NewsInfo:
return await packages_parser(html, url)
class PackagesInfo:
def __init__(self, client: BaseParser):
self.client = client
async def ftbfs(self) -> List[models.FTBFSModel]:
url = "https://git.altlinux.org/beehive/stats/Sisyphus-x86_64/ftbfs-joined"
text = await self.client.get(url)
return await ftbfs_parser(text)
class ALTRepoParser:
def __init__(self, session: aiohttp.ClientSession):
self._client = BaseParser(session)
self.news = NewsInfo(self._client)
self.packages = PackagesInfo(self._client)
......@@ -44,3 +44,10 @@ class PackagesModel(BaseModel):
added: List[PackageElementModel] | None = None
removed: List[RemovedPackageElementModel] | None = None
updated: List[PackageElementModel] | None = None
class FTBFSModel(BaseModel):
name: str
version: str
ftbfs_weeks: int
maintainers: List[str]
from .ftbfs import ftbfs_parser
from .. import models
async def ftbfs_parser(text: str):
packages = []
for line in text.strip().splitlines():
parts = line.split('\t')
if len(parts) != 4:
continue
name, version, weeks, maintainers = parts
packages.append(models.FTBFSModel(
name = name,
version = version,
ftbfs_weeks = int(weeks),
maintainers = maintainers.split(','),
))
return packages
from telegrinder import Dispatch, Message
from telegrinder.rules import Command, Argument
from altrepo import altrepo
from database.models import User
dp = Dispatch()
@dp.message(Command("ftbfs", Argument("maintainer", optional=True)))
async def ftbfs_handler(m: Message, user: User | None, maintainer: str | None = None) -> None:
if maintainer:
maintainer = maintainer.lower()
group_data = await altrepo.api.acl.groups("sisyphus")
maintainer_data = await altrepo.api.site.all_maintainers("sisyphus")
if not any(
_m.packager_nickname == maintainer for _m in maintainer_data.maintainers
) and not any(
_g.group == maintainer for _g in group_data.groups
) and not maintainer in ["@nobody"]:
await m.answer(f"Сопровождающий или группа {maintainer} не найдены.")
return
else:
if user:
maintainer = user.maintainer
else:
return
ftbfs_data = await altrepo.parser.packages.ftbfs()
maintainer_ftbfs = [
package for package in ftbfs_data if maintainer in package.maintainers]
if not len(maintainer_ftbfs):
await m.answer("Нет не пересобирающихся пакетов")
return
ftbfs_message = "Ошибки пересборки:\n\n"
for package in maintainer_ftbfs:
ftbfs_message += f"{package.name} | {package.ftbfs_weeks} | {", ".join(package.maintainers)}\n"
await m.answer(ftbfs_message)
from telegrinder import Dispatch, Message
from telegrinder.rules import Command, Argument
from telegrinder.node import Error
from altrepo import altrepo
......@@ -19,6 +18,15 @@ async def news_handler(m: Message, news_type: str | None, translate: str | None)
return
bugs = await format_bugs(bugs_data)
await m.answer(bugs)
elif news_type == "ftbfs":
ftbfs_data = await altrepo.parser.packages.ftbfs()
if not ftbfs_data:
await m.answer("ftbfs нет.")
return
message = ""
for package in ftbfs_data:
message += f"{package.name} | {package.ftbfs_weeks}\n"
await m.answer(message)
else:
if news_type == "sisyphus":
packages_data = await altrepo.parser.news.sisyphus()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment