api: add StrEnum types for method parameters

parent e28c926f
......@@ -24,12 +24,13 @@ pip3 install altrepo
```python
import asyncio
from altrepo import ALTRepo
from altrepo.api.types import Branch
async def main():
client = ALTRepo()
await client.init()
result = await client.api.package.package_info("vim", branch="sisyphus")
result = await client.api.package.package_info("firefox", branch=Branch.sisyphus)
pkg = result.packages[0]
print(f"{pkg.name} {pkg.version}-{pkg.release}")
......@@ -45,15 +46,17 @@ asyncio.run(main())
Получение подробной информации о пакете и поиск по имени:
```python
from altrepo.api.types import Branch
# Информация о конкретном пакете
result = await client.api.package.package_info("firefox", branch="sisyphus")
result = await client.api.package.package_info("firefox", branch=Branch.sisyphus)
pkg = result.packages[0]
print(f"{pkg.name} {pkg.version}-{pkg.release} ({pkg.summary})")
# Поиск пакетов по подстроке в имени
result = await client.api.package.package_search("python3-module", branch="sisyphus")
for pkg in result.packages[:10]:
print(f" {pkg.name}: {pkg.summary}")
found = await client.api.site.find_packages("python3-module-alt", branch=Branch.sisyphus)
for pkg in found.packages[:10]:
print(f" {pkg.name}")
```
### Задачи и мейнтейнеры
......@@ -61,18 +64,20 @@ for pkg in result.packages[:10]:
Поиск задач по мейнтейнеру или по имени пакета:
```python
from altrepo.api.types import Branch
# Задачи мейнтейнера
result = await client.api.task.find_tasks(
input=["fiersik"], branch="sisyphus", by_package=False
result = await client.api.task.progress.find_tasks(
input=["fiersik"], branch=Branch.sisyphus, by_package=False
)
for task in result.tasks[:5]:
print(f" #{task.task_id} [{task.state}] {task.owner}")
print(f" #{task.task_id} [{task.task_state}] {task.task_owner}")
# Баги мейнтейнера из Bugzilla
bugs = await client.api.bug.bugzilla_by_maintainer("fiersik")
if bugs:
for bug in bugs.bugs[:5]:
print(f" #{bug.bug_id} {bug.status}: {bug.summary}")
print(f" #{bug.id} {bug.status}: {bug.summary}")
```
### Отслеживание устаревших пакетов
......@@ -85,8 +90,7 @@ watch = await client.parser.packages.watch_by_maintainer("fiersik", "by-acl")
for pkg in watch[:5]:
print(f" {pkg.pkg_name}: {pkg.old_version} -> {pkg.new_version}")
# Полный список устаревших пакетов по всему репозиторию
# Каждая запись содержит имя мейнтейнера (или группы с префиксом @)
# Полный список устаревших пакетов
total = await client.parser.packages.watch_total()
print(f"Всего устаревших пакетов: {len(total)}")
```
......@@ -160,7 +164,6 @@ for pkg in ftbfs[:5]:
from altrepo import ALTRepo, ALTRepoConfig
config = ALTRepoConfig(
api_base_url="https://rdb.altlinux.org/api",
appstream_dir="/tmp/appstream",
appstream_branches=["sisyphus", "p11", "p10"],
)
......
......@@ -2,10 +2,11 @@ import aiohttp
from urllib.parse import urlencode
from warnings import deprecated
from typing import List, Literal
from typing import List
from . import models
from . import errors
from . import types
class BaseAPI:
......@@ -103,7 +104,7 @@ class TaskProcessInfo:
self,
input: list[str],
owner: str | None = None,
branch: str | None = None,
branch: types.Branch | str | None = None,
state: list[str] | None = None,
tasks_limit: int = 100,
by_package: bool = False,
......@@ -138,7 +139,7 @@ class TaskProcessInfo:
async def find_tasks_lookup(
self,
input: list[str],
branch: str | None = None,
branch: types.Branch | str | None = None,
tasks_limit: int = 10,
) -> models.FindTasksModel:
params = {
......@@ -154,7 +155,7 @@ class TaskProcessInfo:
return models.FindTasksModel(**data)
async def last_tasks(
self, branch: str | None = None, tasks_limit: int = 10
self, branch: types.Branch | str | None = None, tasks_limit: int = 10
) -> models.TasksListModel:
params = {
k: v
......@@ -218,7 +219,7 @@ class TaskInfo:
async def needs_approval(
self,
acl_group: Literal["maint", "tester"],
acl_group: types.ApprovalGroup,
branches: list[str] | None = None,
before: str | None = None,
) -> models.NeedsApprovalModel:
......@@ -244,7 +245,7 @@ class TaskInfo:
async def task_history(
self,
branch: str,
branch: types.Branch | str,
start_task: int = 0,
end_task: int = 0,
start_date: str | None = None,
......@@ -298,7 +299,7 @@ class TaskInfo:
self,
task_id: int,
depth: int = 1,
dptype: Literal["both", "source", "binary"] = "both",
dptype: types.DependencyType = "both",
archs: list[str] | None = None,
leaf: str | None = None,
finite_package: bool = False,
......@@ -339,7 +340,7 @@ class PackageInfo:
release: str | None = None,
arch: str | None = None,
source: bool | None = None,
branch: str | None = None,
branch: types.Branch | str | None = None,
disttag: str | None = None,
sha1: str | None = None,
packager: str | None = None,
......@@ -367,7 +368,7 @@ class PackageInfo:
return models.PackageInfoModel(**data)
async def packages_by_file_names(
self, files: List[str], branch: str, arch: str | None = None
self, files: List[str], branch: types.Branch | str, arch: str | None = None
) -> models.PackageByFileNameModel:
payload = models.PackagesByFileNamesJsonModel(
files=files, branch=branch, arch=arch
......@@ -380,7 +381,7 @@ class PackageInfo:
async def build_dependency_set(
self,
branch: str,
branch: types.Branch | str,
packages: list[str],
arch: str = "x86_64",
) -> models.BuildDependencySetModel:
......@@ -405,7 +406,7 @@ class PackageInfo:
return models.PackageFindPackagesetModel(**data)
async def maintainer_score(
self, branch: str, name: str
self, branch: types.Branch | str, name: str
) -> models.MaintainerScoreModel:
data = await self.client.get(
"/package/maintainer_score", {"branch": branch, "name": name}
......@@ -415,7 +416,7 @@ class PackageInfo:
async def misconflict(
self,
packages: list[str],
branch: str,
branch: types.Branch | str,
archs: list[str] | None = None,
) -> models.PackageMisconflictPackagesModel:
params = {
......@@ -431,7 +432,7 @@ class PackageInfo:
return models.PackageMisconflictPackagesModel(**data)
async def package_by_file_md5(
self, branch: str, md5: str, arch: str = "x86_64"
self, branch: types.Branch | str, md5: str, arch: str = "x86_64"
) -> models.PackageByFileNameModel:
data = await self.client.get(
"/package/package_by_file_md5", {"branch": branch, "md5": md5, "arch": arch}
......@@ -439,7 +440,7 @@ class PackageInfo:
return models.PackageByFileNameModel(**data)
async def package_by_file_name(
self, file: str, branch: str, arch: str = "x86_64"
self, file: str, branch: types.Branch | str, arch: str = "x86_64"
) -> models.PackageByFileNameModel:
data = await self.client.get(
"/package/package_by_file_name",
......@@ -453,12 +454,12 @@ class PackageInfo:
async def repocop(
self,
branch: str,
branch: types.Branch | str,
package_name: str,
package_version: str | None = None,
package_release: str | None = None,
bin_package_arch: str | None = None,
package_type: Literal["source", "binary"] = "source",
package_type: types.PackageType = "source",
) -> models.RepocopJsonGetListModel:
params = {
k: v
......@@ -483,7 +484,7 @@ class PackageInfo:
return models.PackageSpecfileModel(**data)
async def specfile_by_name(
self, branch: str, name: str
self, branch: types.Branch | str, name: str
) -> models.PackageSpecfileModel:
data = await self.client.get(
"/package/specfile_by_name", {"branch": branch, "name": name}
......@@ -491,7 +492,7 @@ class PackageInfo:
return models.PackageSpecfileModel(**data)
async def unpackaged_dirs(
self, branch: str, packager: str, archs: list[str] | None = None
self, branch: types.Branch | str, packager: str, archs: list[str] | None = None
) -> models.UnpackagedDirsModel:
params = {
k: v
......@@ -508,9 +509,9 @@ class PackageInfo:
async def what_depends_src(
self,
packages: list[str],
branch: str,
branch: types.Branch | str,
depth: int = 1,
dptype: Literal["both", "source", "binary"] = "both",
dptype: types.DependencyType = "both",
archs: list[str] | None = None,
leaf: str | None = None,
finite_package: bool = False,
......@@ -549,7 +550,7 @@ class PackagesetInfo:
return models.PackageSetActivePackageSetsModel(**data)
async def repository_statistics(
self, branch: str | None = None
self, branch: types.Branch | str | None = None
) -> models.RepositoryStatisticsModel:
if branch:
data = await self.client.get(
......@@ -560,21 +561,21 @@ class PackagesetInfo:
return models.RepositoryStatisticsModel(**data)
async def compare_packagesets(
self, pkgset1: str, pkgset2: str
self, pkgset1: types.Branch | str, pkgset2: types.Branch | str
) -> models.PackagesetCompareModel:
data = await self.client.get(
"/packageset/compare_packagesets", {"pkgset1": pkgset1, "pkgset2": pkgset2}
)
return models.PackagesetCompareModel(**data)
async def maintainer_scores(self, branch: str) -> models.MaintainerScoresBatchModel:
async def maintainer_scores(self, branch: types.Branch | str) -> models.MaintainerScoresBatchModel:
data = await self.client.get(
"/packageset/maintainer_scores", {"branch": branch}
)
return models.MaintainerScoresBatchModel(**data)
async def packages_by_component(
self, branch: str, arch: str, component: str
self, branch: types.Branch | str, arch: str, component: str
) -> models.PackagesByUuidModel:
data = await self.client.get(
"/packageset/packages_by_component",
......@@ -595,8 +596,8 @@ class PackagesetInfo:
async def repository_packages(
self,
branch: str,
package_type: Literal["all", "source", "binary"] = "all",
branch: types.Branch | str,
package_type: types.PackageTypeAll = "all",
archs: list[str] | None = None,
include_done_tasks: bool = False,
) -> models.PackagesetPackagesModel:
......@@ -618,7 +619,7 @@ class AclInfo:
def __init__(self, client: BaseAPI):
self.client = client
async def groups(self, branch: str, name: str | None = None):
async def groups(self, branch: types.Branch | str, name: str | None = None) -> models.AclGroupsModel:
data = {"branch": branch}
if name:
data["name"] = name
......@@ -627,7 +628,7 @@ class AclInfo:
return models.AclGroupsModel(**data)
async def by_packages(
self, branch: str, packages_names: list[str]
self, branch: types.Branch | str, packages_names: list[str]
) -> models.AclByPackagesModel:
params = {
"branch": branch,
......@@ -656,7 +657,7 @@ class BugInfo:
self.client = client
async def bugzilla_by_maintainer(
self, maintainer_nickname: str, by_acl: str | None = None
self, maintainer_nickname: str, by_acl: types.Acl | None = None
) -> models.BugzillaInfoModel | None:
try:
data = await self.client.get(
......@@ -673,7 +674,7 @@ class BugInfo:
async def bugzilla_by_package(
self,
package_name: str,
package_type: Literal["source", "binary"] = "source",
package_type: types.PackageType = "source",
) -> models.BugzillaInfoModel:
data = await self.client.get(
"/bug/bugzilla_by_package",
......@@ -682,7 +683,7 @@ class BugInfo:
return models.BugzillaInfoModel(**data)
async def bugzilla_by_image_edition(
self, branch: str, edition: str
self, branch: types.Branch | str, edition: str
) -> models.BugzillaInfoModel:
data = await self.client.get(
"/bug/bugzilla_by_image_edition", {"branch": branch, "edition": edition}
......@@ -695,7 +696,7 @@ class FileInfo:
self.client = client
async def packages_by_file(
self, branch: str, file_name: str
self, branch: types.Branch | str, file_name: str
) -> models.FilePackagesByFileModel:
data = await self.client.get(
"/file/packages_by_file", {"branch": branch, "file_name": file_name}
......@@ -703,7 +704,7 @@ class FileInfo:
return models.FilePackagesByFileModel(**data)
async def search(
self, branch: str, file_name: str, limit: int | None = None
self, branch: types.Branch | str, file_name: str, limit: int | None = None
) -> models.FilesModel:
data = await self.client.get(
"/file/search",
......@@ -716,7 +717,7 @@ class FileInfo:
return models.FilesModel(**data)
async def fast_lookup(
self, branch: str, file_name: str, limit: int = 10
self, branch: types.Branch | str, file_name: str, limit: int = 10
) -> models.FastFileSearchModel:
data = await self.client.get(
"/file/fast_lookup",
......@@ -729,11 +730,11 @@ class SiteInfo:
def __init__(self, client: BaseAPI):
self.client = client
async def all_maintainers(self, branch: str) -> models.AllMaintainersModel:
async def all_maintainers(self, branch: types.Branch | str) -> models.AllMaintainersModel:
return await self.all_maintainers_with_nicknames(branch)
async def all_maintainers_with_nicknames(
self, branch: str
self, branch: types.Branch | str
) -> models.AllMaintainersModel:
data = await self.client.get(
"/site/all_maintainers_with_nicknames", {"branch": branch}
......@@ -741,7 +742,7 @@ class SiteInfo:
return models.AllMaintainersModel(**data)
async def find_source_package(
self, branch: str, name: str
self, branch: types.Branch | str, name: str
) -> models.FindSourcePackageInBranch:
data = await self.client.get(
"/site/find_source_package", {"branch": branch, "name": name}
......@@ -749,7 +750,7 @@ class SiteInfo:
return models.FindSourcePackageInBranch(**data)
async def maintainer_info(
self, branch: str, maintainer_nickname: str
self, branch: types.Branch | str, maintainer_nickname: str
) -> models.MaintainerInfoModel:
data = await self.client.get(
"/site/maintainer_info",
......@@ -759,10 +760,10 @@ class SiteInfo:
async def package_info(
self,
branch: str,
branch: types.Branch | str,
pkghash: int,
changelog_last: int = 3,
package_type: Literal["source", "binary"] = "source",
package_type: types.PackageType = "source",
) -> models.SitePackageInfoModel:
data = await self.client.get(
f"/site/package_info/{pkghash}",
......@@ -775,7 +776,7 @@ class SiteInfo:
return models.SitePackageInfoModel(**data)
async def pkghash_by_binary_name(
self, branch: str, name: str, arch: str
self, branch: types.Branch | str, name: str, arch: str
) -> models.SitePackagesetPackageHashModel:
data = await self.client.get(
"/site/pkghash_by_binary_name",
......@@ -784,7 +785,7 @@ class SiteInfo:
return models.SitePackagesetPackageHashModel(**data)
async def pkghash_by_name(
self, branch: str, name: str
self, branch: types.Branch | str, name: str
) -> models.SitePackagesetPackageHashModel:
data = await self.client.get(
"/site/pkghash_by_name", {"branch": branch, "name": name}
......@@ -803,12 +804,12 @@ class SiteInfo:
return None
return models.SiteWatchByMaintainerModel(**data)
async def all_pkgset_archs(self, branch: str) -> models.SiteAllArchsModel:
async def all_pkgset_archs(self, branch: types.Branch | str) -> models.SiteAllArchsModel:
data = await self.client.get("/site/all_pkgset_archs", {"branch": branch})
return models.SiteAllArchsModel(**data)
async def all_pkgset_archs_with_src_count(
self, branch: str
self, branch: types.Branch | str
) -> models.SiteAllArchsModel:
data = await self.client.get(
"/site/all_pkgset_archs_with_src_count", {"branch": branch}
......@@ -829,9 +830,9 @@ class SiteInfo:
async def beehive_errors_by_maintainer(
self,
branch: str,
branch: types.Branch | str,
maintainer_nickname: str,
by_acl: str = "none",
by_acl: types.Acl = "none",
) -> models.SiteBeehiveByMaintainerModel:
data = await self.client.get(
"/site/beehive_errors_by_maintainer",
......@@ -844,7 +845,7 @@ class SiteInfo:
return models.SiteBeehiveByMaintainerModel(**data)
async def binary_package_archs_and_versions(
self, branch: str, name: str
self, branch: types.Branch | str, name: str
) -> models.SitePackagesBinaryListModel:
data = await self.client.get(
"/site/binary_package_archs_and_versions", {"branch": branch, "name": name}
......@@ -859,9 +860,9 @@ class SiteInfo:
async def deleted_package_info(
self,
branch: str,
branch: types.Branch | str,
name: str,
package_type: Literal["source", "binary"] = "source",
package_type: types.PackageType = "source",
arch: str | None = None,
) -> models.SiteDeletedPackageModel:
params = {
......@@ -878,7 +879,7 @@ class SiteInfo:
return models.SiteDeletedPackageModel(**data)
async def fast_packages_search_lookup(
self, name: list[str], branch: str | None = None
self, name: list[str], branch: types.Branch | str | None = None
) -> models.SiteFastPackagesSearchModel:
params = {
k: v
......@@ -894,7 +895,7 @@ class SiteInfo:
async def find_packages(
self,
name: list[str],
branch: str | None = None,
branch: types.Branch | str | None = None,
arch: list[str] | None = None,
) -> models.SiteFingPackagesModel:
params = {
......@@ -911,7 +912,7 @@ class SiteInfo:
async def last_packages(
self,
branch: str,
branch: types.Branch | str,
tasks_limit: int = 10,
task_owner: str | None = None,
) -> models.SiteLastPackagesModel:
......@@ -929,7 +930,7 @@ class SiteInfo:
async def last_packages_by_branch(
self,
branch: str,
branch: types.Branch | str,
packages_limit: int = 10,
packager: str | None = None,
) -> models.SiteLastBranchPackagesModel:
......@@ -947,7 +948,7 @@ class SiteInfo:
async def last_packages_by_tasks(
self,
branch: str,
branch: types.Branch | str,
tasks_limit: int = 10,
task_owner: str | None = None,
) -> models.SiteLastPackagesModel:
......@@ -964,7 +965,7 @@ class SiteInfo:
return models.SiteLastPackagesModel(**data)
async def last_packages_with_cve_fixed(
self, branch: str
self, branch: types.Branch | str
) -> models.SiteLastPackagesWithCVEFixesModel:
data = await self.client.get(
"/site/last_packages_with_cve_fixed", {"branch": branch}
......@@ -981,9 +982,9 @@ class SiteInfo:
async def maintainer_packages(
self,
branch: str,
branch: types.Branch | str,
maintainer_nickname: str,
by_acl: str = "none",
by_acl: types.Acl = "none",
) -> models.MaintainerPackagesModel:
data = await self.client.get(
"/site/maintainer_packages",
......@@ -1004,7 +1005,7 @@ class SiteInfo:
return models.SiteChangelogModel(**data)
async def package_downloads(
self, pkghash: int, branch: str
self, pkghash: int, branch: types.Branch | str
) -> models.SitePackagesDownloadsModel:
data = await self.client.get(
f"/site/package_downloads/{pkghash}", {"branch": branch}
......@@ -1012,7 +1013,7 @@ class SiteInfo:
return models.SitePackagesDownloadsModel(**data)
async def package_downloads_bin(
self, pkghash: int, branch: str, arch: str
self, pkghash: int, branch: types.Branch | str, arch: str
) -> models.SitePackagesDownloadsModel:
data = await self.client.get(
f"/site/package_downloads_bin/{pkghash}", {"branch": branch, "arch": arch}
......@@ -1020,7 +1021,7 @@ class SiteInfo:
return models.SitePackagesDownloadsModel(**data)
async def package_downloads_src(
self, pkghash: int, branch: str
self, pkghash: int, branch: types.Branch | str
) -> models.SitePackagesDownloadsModel:
data = await self.client.get(
f"/site/package_downloads_src/{pkghash}", {"branch": branch}
......@@ -1038,7 +1039,7 @@ class SiteInfo:
return models.BinPackageLogElementModel(**data)
async def package_misconflict(
self, pkghash: int, branch: str
self, pkghash: int, branch: types.Branch | str
) -> models.PackageMisconflictBySrcModel:
data = await self.client.get(
f"/site/package_misconflict/{pkghash}", {"branch": branch}
......@@ -1046,7 +1047,7 @@ class SiteInfo:
return models.PackageMisconflictBySrcModel(**data)
async def package_name_from_repology(
self, branch: str, name: str
self, branch: types.Branch | str, name: str
) -> models.PackageNameFromRepologyModel:
data = await self.client.get(
"/site/package_name_from_repology", {"branch": branch, "name": name}
......@@ -1071,7 +1072,7 @@ class SiteInfo:
async def package_versions(
self,
name: str,
package_type: Literal["source", "binary"] = "source",
package_type: types.PackageType = "source",
arch: str | None = None,
) -> models.SiteSourcePackagesVersionsModel:
params = {
......@@ -1087,7 +1088,7 @@ class SiteInfo:
return models.SiteSourcePackagesVersionsModel(**data)
async def package_versions_from_images(
self, name: str, branch: str, edition: str, type: str
self, name: str, branch: types.Branch | str, edition: str, type: str
) -> models.SiteImagePackageVersionsModel:
data = await self.client.get(
"/site/package_versions_from_images",
......@@ -1096,7 +1097,7 @@ class SiteInfo:
return models.SiteImagePackageVersionsModel(**data)
async def package_versions_from_tasks(
self, name: str, branch: str | None = None
self, name: str, branch: types.Branch | str | None = None
) -> models.SItePackagesVersionsFromTasksModel:
params = {
k: v
......@@ -1116,7 +1117,7 @@ class SiteInfo:
return models.SitePackagesetsByHashModel(**data)
async def pkghash_by_nvr(
self, name: str, branch: str, version: str, release: str
self, name: str, branch: types.Branch | str, version: str, release: str
) -> models.SitePackagesetPackageHashByNameVersionRelease:
data = await self.client.get(
"/site/pkghash_by_nvr",
......@@ -1126,8 +1127,8 @@ class SiteInfo:
async def pkgset_categories_count(
self,
branch: str,
package_type: Literal["all", "source", "binary"] = "source",
branch: types.Branch | str,
package_type: types.PackageTypeAll = "source",
) -> models.SitePackagesetCategoriesModel:
data = await self.client.get(
"/site/pkgset_categories_count",
......@@ -1141,9 +1142,9 @@ class SiteInfo:
async def repocop_by_maintainer(
self,
branch: str,
branch: types.Branch | str,
maintainer_nickname: str,
by_acl: str = "none",
by_acl: types.Acl = "none",
) -> models.RepocopByMaintainerModel:
data = await self.client.get(
"/site/repocop_by_maintainer",
......@@ -1157,8 +1158,8 @@ class SiteInfo:
async def repository_packages(
self,
branch: str,
package_type: Literal["all", "source", "binary"] = "source",
branch: types.Branch | str,
package_type: types.PackageTypeAll = "source",
group: str | None = None,
buildtime: int = 0,
) -> models.SitePackagesModel:
......@@ -1182,7 +1183,7 @@ class SiteInfo:
return models.SiteSourcePackagesVersionsModel(**data)
async def tasks_by_maintainer(
self, branch: str, maintainer_nickname: str
self, branch: types.Branch | str, maintainer_nickname: str
) -> models.SiteTaskByNameModel:
data = await self.client.get(
"/site/tasks_by_maintainer",
......@@ -1216,7 +1217,7 @@ class AuthInfo:
self,
nickname: str,
password: str,
auth_provider: Literal["ldap", "keycloak"] = "ldap",
auth_provider: types.AuthProvider = "ldap",
) -> models.AuthResponseModel:
data = await self.client.post(
"/auth/login",
......@@ -1245,10 +1246,10 @@ class DependenciesInfo:
async def backport_helper(
self,
from_branch: str,
into_branch: str,
from_branch: types.Branch | str,
into_branch: types.Branch | str,
packages_names: list[str],
dp_type: Literal["both", "source", "binary"] = "both",
dp_type: types.DependencyType = "both",
archs: list[str] | None = None,
) -> models.BackportHelperModel:
params = {
......@@ -1274,7 +1275,7 @@ class DependenciesInfo:
return models.DependenciesPackageDependenciesModel(**data)
async def fast_lookup(
self, branch: str, dp_name: str, limit: int = 10
self, branch: types.Branch | str, dp_name: str, limit: int = 10
) -> models.FastDependencySearchModel:
data = await self.client.get(
"/dependencies/fast_lookup",
......@@ -1284,9 +1285,9 @@ class DependenciesInfo:
async def packages_by_dependency(
self,
branch: str,
branch: types.Branch | str,
dp_name: str,
dp_type: Literal["all", "provide", "require", "conflict", "obsolete"] = "all",
dp_type: types.DependencyKind = "all",
last_state: bool = False,
) -> models.DependenciesPackagesModel:
data = await self.client.get(
......@@ -1301,7 +1302,7 @@ class DependenciesInfo:
return models.DependenciesPackagesModel(**data)
async def source_package_dependencies(
self, pkghash: int, branch: str, depth: int = 1
self, pkghash: int, branch: types.Branch | str, depth: int = 1
) -> models.DependenciesPackageBuildDependenciesModel:
data = await self.client.get(
f"/dependencies/source_package_dependencies/{pkghash}",
......@@ -1312,8 +1313,8 @@ class DependenciesInfo:
async def what_depends_src(
self,
name: str,
branch: str,
dp_type: Literal["both", "source", "binary"] = "both",
branch: types.Branch | str,
dp_type: types.DependencyType = "both",
) -> models.DependsPackageBuildDependencyModel:
data = await self.client.get(
"/dependencies/what_depends_src",
......@@ -1332,7 +1333,7 @@ class ErrataExportOvalInfo:
async def info(
self,
branch: str,
branch: types.Branch | str,
package_name: str | None = None,
one_file: bool = False,
) -> bytes:
......@@ -1361,7 +1362,7 @@ class ErrataInfo:
async def advisory(
self,
branch: str | None = None,
branch: types.Branch | str | None = None,
input: str | None = None,
page: int | None = None,
limit: int | None = None,
......@@ -1396,12 +1397,12 @@ class ErrataInfo:
async def find_erratas(
self,
input: list[str] | None = None,
branch: str | None = None,
type: Literal["packages", "repository", "bug", "vuln", "exclusion"]
branch: types.Branch | str | None = None,
type: types.ErrataType
| None = None,
page: int | None = None,
limit: int | None = None,
state: Literal["all", "active", "discarded"] = "all",
state: types.ErrataState = "all",
) -> models.ErrataLastChangedModel:
params = {
k: v
......@@ -1421,10 +1422,10 @@ class ErrataInfo:
async def find_image_erratas(
self,
uuid: str,
branch: str,
branch: types.Branch | str,
component: str | None = None,
input: list[str] | None = None,
type: Literal["packages", "repository", "bug", "vuln", "exclusion"]
type: types.ErrataType
| None = None,
page: int | None = None,
limit: int | None = None,
......@@ -1463,7 +1464,7 @@ class ErrataInfo:
async def search(
self,
branch: str | None = None,
branch: types.Branch | str | None = None,
name: str | None = None,
vuln_id: str | None = None,
errata_id: str | None = None,
......@@ -1495,7 +1496,7 @@ class ExportBeehiveInfo:
self.client = client
async def ftbfs(
self, branch: str, arch: str | None = None
self, branch: types.Branch | str, arch: str | None = None
) -> models.ExportBeehiveFTBFSListModel:
params = {
k: v
......@@ -1536,7 +1537,7 @@ class ExportInfo:
self.translation = ExportTranslationInfo(self.client)
async def branch_binary_packages(
self, branch: str, arch: str | None = None
self, branch: types.Branch | str, arch: str | None = None
) -> models.PackagesetPackagesExportModel:
params = {
k: v
......@@ -1554,11 +1555,11 @@ class ExportInfo:
data = await self.client.get("/export/branch_tree")
return models.BranchTreeModel(**data)
async def repology(self, branch: str) -> models.RepologyExportModel:
async def repology(self, branch: types.Branch | str) -> models.RepologyExportModel:
data = await self.client.get(f"/export/repology/{branch}")
return models.RepologyExportModel(**data)
async def sitemap_packages(self, branch: str) -> models.SitemapPackagesExportModel:
async def sitemap_packages(self, branch: types.Branch | str) -> models.SitemapPackagesExportModel:
data = await self.client.get(f"/export/sitemap_packages/{branch}")
return models.SitemapPackagesExportModel(**data)
......@@ -1603,7 +1604,7 @@ class ImageInfo:
async def active_images(
self,
branch: str | None = None,
branch: types.Branch | str | None = None,
edition: str | None = None,
version: str | None = None,
release: str | None = None,
......@@ -1628,10 +1629,10 @@ class ImageInfo:
async def find_images_by_package_name(
self,
pkg_name: str,
branch: str | None = None,
branch: types.Branch | str | None = None,
edition: str | None = None,
pkg_type: Literal["source", "binary"] = "source",
img_show: Literal["active", "all"] = "all",
pkg_type: types.PackageType = "source",
img_show: types.ImageShow = "all",
) -> models.FindImagesByPackageModel:
params = {
k: v
......@@ -1663,7 +1664,7 @@ class ImageInfo:
async def image_info(
self,
branch: str | None = None,
branch: types.Branch | str | None = None,
edition: str | None = None,
version: str | None = None,
release: str | None = None,
......@@ -1720,7 +1721,7 @@ class ImageInfo:
await self.client.post("/image/image_status", json=payload)
async def image_tag_status_get(
self, branch: str | None = None, edition: str | None = None
self, branch: types.Branch | str | None = None, edition: str | None = None
) -> models.ImageTagStatusGetModel:
params = {
k: v
......@@ -1742,7 +1743,7 @@ class ImageInfo:
async def last_packages_by_image(
self,
branch: str,
branch: types.Branch | str,
uuid: str,
packages_limit: int | None = None,
component: str | None = None,
......@@ -1762,7 +1763,7 @@ class ImageInfo:
async def last_packages_image_with_cve_fixed(
self,
branch: str,
branch: types.Branch | str,
uuid: str,
packages_limit: int | None = None,
component: str | None = None,
......
from enum import StrEnum
class Acl(StrEnum):
none = "none"
by_nick = "by_nick"
by_nick_leader = "by_nick_leader"
by_nick_or_group = "by_nick_or_group"
by_nick_leader_and_group = "by_nick_leader_and_group"
class PackageType(StrEnum):
source = "source"
binary = "binary"
class PackageTypeAll(StrEnum):
all = "all"
source = "source"
binary = "binary"
class DependencyType(StrEnum):
both = "both"
source = "source"
binary = "binary"
class DependencyKind(StrEnum):
all = "all"
provide = "provide"
require = "require"
conflict = "conflict"
obsolete = "obsolete"
class ErrataState(StrEnum):
all = "all"
active = "active"
discarded = "discarded"
class ErrataType(StrEnum):
packages = "packages"
repository = "repository"
bug = "bug"
vuln = "vuln"
exclusion = "exclusion"
class ApprovalGroup(StrEnum):
maint = "maint"
tester = "tester"
class AuthProvider(StrEnum):
ldap = "ldap"
keycloak = "keycloak"
class ImageShow(StrEnum):
active = "active"
all = "all"
class Branch(StrEnum):
sisyphus = "sisyphus"
sisyphus_e2k = "sisyphus_e2k"
sisyphus_riscv64 = "sisyphus_riscv64"
sisyphus_loongarch64 = "sisyphus_loongarch64"
p11 = "p11"
p10 = "p10"
p10_e2k = "p10_e2k"
p9 = "p9"
c10f2 = "c10f2"
c9f2 = "c9f2"
......@@ -2,13 +2,14 @@
import asyncio
from altrepo import ALTRepo
from altrepo.api.types import Branch
async def main():
client = ALTRepo()
await client.init()
acl = await client.api.acl.by_packages("sisyphus", ["firefox", "openssh"])
acl = await client.api.acl.by_packages(Branch.sisyphus, ["firefox", "openssh"])
print("ACL пакетов:")
for pkg in acl.packages:
print(f" {pkg.name}: {', '.join(pkg.members) or '(группа)'}")
......
......@@ -2,21 +2,20 @@
import asyncio
from altrepo import ALTRepo
from altrepo.api.types import Branch
async def main():
client = ALTRepo()
await client.init()
# Информация о пакете
result = await client.api.package.package_info("firefox", branch="sisyphus")
result = await client.api.package.package_info("firefox", branch=Branch.sisyphus)
pkg = result.packages[0]
print(f"{pkg.name} {pkg.version}-{pkg.release} (arch={pkg.arch})")
print(f" Мейнтейнер: {pkg.packager}")
print(f" SHA1: {pkg.sha1}")
# Поиск пакетов в ветке
found = await client.api.site.find_packages("python3-module-alt", branch="sisyphus")
found = await client.api.site.find_packages("python3-module-alt", branch=Branch.sisyphus)
for p in found.packages[:5]:
print(f" {p.name}")
......
......@@ -2,20 +2,19 @@
import asyncio
from altrepo import ALTRepo
from altrepo.api.types import Branch
async def main():
client = ALTRepo()
await client.init()
# Поиск задач мейнтейнера
result = await client.api.task.progress.find_tasks(
input=["fiersik"], branch="sisyphus", by_package=False
input=["fiersik"], branch=Branch.sisyphus, by_package=False
)
for task in result.tasks[:5]:
print(f"#{task.task_id} [{task.task_state}] {task.task_owner}")
# Информация о конкретной задаче
if result.tasks:
info = await client.api.task.task_info(result.tasks[0].task_id)
print(f"\nЗадача #{info.id}: {info.state} ({info.branch})")
......
......@@ -2,13 +2,14 @@
import asyncio
from altrepo import ALTRepo
from altrepo.api.types import Branch
async def main():
client = ALTRepo()
await client.init()
branch = "sisyphus"
branch = Branch.sisyphus
await client.appstream.data.load_by_branch(branch, "latest")
for name in ["firefox", "telegram-desktop", "gimp", "vlc"]:
......
......@@ -2,6 +2,7 @@
import asyncio
from altrepo import ALTRepo
from altrepo.api.types import Branch
async def main():
......@@ -9,7 +10,7 @@ async def main():
await client.init()
result = await client.api.dependencies.backport_helper(
"sisyphus", "p11", ["ocaml"]
Branch.sisyphus, Branch.p11, ["ocaml"]
)
print(f"Бэкпорт ocaml из sisyphus в p11 ({result.count} пакетов):")
for level in result.dependencies:
......
......@@ -2,6 +2,7 @@
import asyncio
from altrepo import ALTRepo
from altrepo.api.types import Branch
async def main():
......@@ -11,7 +12,7 @@ async def main():
pkgsets = await client.api.packageset.active_packagesets()
print(f"Активные ветки: {', '.join(pkgsets.packagesets)}")
diff = await client.api.packageset.compare_packagesets("sisyphus", "p11")
diff = await client.api.packageset.compare_packagesets(Branch.sisyphus, Branch.p11)
print(f"\nsisyphus vs p11 ({len(diff.packages)} записей):")
for p in diff.packages[:10]:
p1, p2 = p.package1, p.package2
......
......@@ -2,6 +2,7 @@
import asyncio
from altrepo import ALTRepo
from altrepo.api.types import Branch
async def main():
......@@ -11,7 +12,7 @@ async def main():
branches = await client.api.errata.errata_branches()
print(f"Ветки с эрратами: {', '.join(branches.branches)}")
adv = await client.api.errata.advisory(branch="p11", limit=10)
adv = await client.api.errata.advisory(branch=Branch.p11, limit=10)
if adv.erratas:
print(f"\nПоследние advisory для p11:")
for e in adv.erratas:
......
......@@ -2,6 +2,7 @@
import asyncio
from altrepo import ALTRepo
from altrepo.api.types import Branch
async def main():
......@@ -13,7 +14,7 @@ async def main():
for img in images.images[:5]:
print(f" {img.name} ({img.branch}, {img.date})")
active = await client.api.image.active_images(branch="p11")
active = await client.api.image.active_images(branch=Branch.p11)
if active.images:
print(f"\nАктивные образы p11:")
for img in active.images:
......
......@@ -2,6 +2,7 @@
import asyncio
from altrepo import ALTRepo
from altrepo.api.types import Branch, Acl
async def main():
......@@ -9,7 +10,7 @@ async def main():
await client.init()
nickname = "fiersik"
branch = "sisyphus"
branch = Branch.sisyphus
info = await client.api.site.maintainer_info(branch, nickname)
mi = info.information
......@@ -20,7 +21,7 @@ async def main():
for pkg in pkgs.packages[:5]:
print(f" {pkg.name} {pkg.version}-{pkg.release}")
bugs = await client.api.bug.bugzilla_by_maintainer(nickname)
bugs = await client.api.bug.bugzilla_by_maintainer(nickname, by_acl=Acl.by_nick)
if bugs and bugs.bugs:
print(f"\nБаги ({len(bugs.bugs)}):")
for bug in bugs.bugs[:5]:
......
......@@ -2,13 +2,14 @@
import asyncio
from altrepo import ALTRepo
from altrepo.api.types import Branch
async def main():
client = ALTRepo()
await client.init()
branch = "sisyphus"
branch = Branch.sisyphus
name = "firefox"
found = await client.api.site.find_packages(name, branch=branch)
......
......@@ -2,13 +2,14 @@
import asyncio
from altrepo import ALTRepo
from altrepo.api.types import Branch
async def main():
client = ALTRepo()
await client.init()
branch = "sisyphus"
branch = Branch.sisyphus
files = await client.api.file.search(branch, "nginx.conf")
print(f"Файлы nginx.conf ({len(files.files)}):")
......
......@@ -2,6 +2,7 @@
import asyncio
from altrepo import ALTRepo
from altrepo.api.types import Branch
async def main():
......@@ -13,7 +14,7 @@ async def main():
for pkg in fixes.packages[:5]:
print(f" {pkg.name} {pkg.version}-{pkg.release} ({pkg.branch})")
erratas = await client.api.errata.search(branch="p11", name="openssh")
erratas = await client.api.errata.search(branch=Branch.p11, name="openssh")
if erratas.erratas:
print(f"\nЭрраты openssh в p11:")
for e in erratas.erratas[:5]:
......
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