altrepo.parser: add packages.ftbfs parser

parent c066010e
...@@ -86,6 +86,21 @@ class PackagesetInfo: ...@@ -86,6 +86,21 @@ class PackagesetInfo:
return models.RepositoryStatisticsModel(**data) 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: class BugInfo:
def __init__(self, client: BaseAPI): def __init__(self, client: BaseAPI):
self.client = client self.client = client
...@@ -155,6 +170,7 @@ class ALTRepoAPI: ...@@ -155,6 +170,7 @@ class ALTRepoAPI:
self.api = APIInfo(self._client) self.api = APIInfo(self._client)
self.package = PackageInfo(self._client) self.package = PackageInfo(self._client)
self.packageset = PackagesetInfo(self._client) self.packageset = PackagesetInfo(self._client)
self.acl = AclInfo(self._client)
self.bug = BugInfo(self._client) self.bug = BugInfo(self._client)
self.file = FileInfo(self._client) self.file = FileInfo(self._client)
self.site = SiteInfo(self._client) self.site = SiteInfo(self._client)
......
...@@ -128,4 +128,16 @@ class FilesElementModel(BaseModel): ...@@ -128,4 +128,16 @@ class FilesElementModel(BaseModel):
class FilesModel(BaseModel): class FilesModel(BaseModel):
request_args: Dict[str, Any] request_args: Dict[str, Any]
length: int length: int
files: List[FilesElementModel] files: List[FilesElementModel]
\ No newline at end of file
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 import aiohttp
from typing import List
from . import models from . import models
from .news import urls_parser, packages_parser, bugs_parser from .news import urls_parser, packages_parser, bugs_parser
from .packages import ftbfs_parser
class BaseParser: class BaseParser:
...@@ -35,7 +38,7 @@ class NewsInfo: ...@@ -35,7 +38,7 @@ class NewsInfo:
return None return None
html = await self.client.get(url, "koi8-r") html = await self.client.get(url, "koi8-r")
return await packages_parser(html, url) return await packages_parser(html, url)
async def p11(self) -> models.PackagesModel | None: async def p11(self) -> models.PackagesModel | None:
url = (await self.news_urls()).p11 url = (await self.news_urls()).p11
if not url: if not url:
...@@ -44,7 +47,18 @@ class NewsInfo: ...@@ -44,7 +47,18 @@ class NewsInfo:
return await packages_parser(html, url) 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: class ALTRepoParser:
def __init__(self, session: aiohttp.ClientSession): def __init__(self, session: aiohttp.ClientSession):
self._client = BaseParser(session) self._client = BaseParser(session)
self.news = NewsInfo(self._client) self.news = NewsInfo(self._client)
self.packages = PackagesInfo(self._client)
...@@ -44,3 +44,10 @@ class PackagesModel(BaseModel): ...@@ -44,3 +44,10 @@ class PackagesModel(BaseModel):
added: List[PackageElementModel] | None = None added: List[PackageElementModel] | None = None
removed: List[RemovedPackageElementModel] | None = None removed: List[RemovedPackageElementModel] | None = None
updated: List[PackageElementModel] | 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 import Dispatch, Message
from telegrinder.rules import Command, Argument from telegrinder.rules import Command, Argument
from telegrinder.node import Error
from altrepo import altrepo from altrepo import altrepo
...@@ -19,6 +18,15 @@ async def news_handler(m: Message, news_type: str | None, translate: str | None) ...@@ -19,6 +18,15 @@ async def news_handler(m: Message, news_type: str | None, translate: str | None)
return return
bugs = await format_bugs(bugs_data) bugs = await format_bugs(bugs_data)
await m.answer(bugs) 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: else:
if news_type == "sisyphus": if news_type == "sisyphus":
packages_data = await altrepo.parser.news.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