Compare commits

..

8 Commits

356 changed files with 494 additions and 723 deletions

View File

@ -7,7 +7,6 @@ on:
tags: tags:
- '*' - '*'
- '!*rc*' - '!*rc*'
workflow_dispatch:
permissions: permissions:
contents: read contents: read

View File

@ -220,7 +220,6 @@ Again, the most checks can be performed by `tox` command, though some additional
* It is allowed to change web API to add new fields or remove optional ones. However, in case of model changes, new API version must be introduced. * It is allowed to change web API to add new fields or remove optional ones. However, in case of model changes, new API version must be introduced.
* On the other hand, it is allowed to change method signatures, however, it is recommended to add new parameters as optional if possible. Deprecated API can be dropped during major release. * On the other hand, it is allowed to change method signatures, however, it is recommended to add new parameters as optional if possible. Deprecated API can be dropped during major release.
* Enumerations (`Enum` classes) are allowed and recommended. However, it is recommended to use `StrEnum` class if there are from/to string conversions and `IntEnum` otherwise. * Enumerations (`Enum` classes) are allowed and recommended. However, it is recommended to use `StrEnum` class if there are from/to string conversions and `IntEnum` otherwise.
* `Generator` return type is not allowed. Generator functions must return generic `Iterator` object. Documentation should be described as `Yields`, however, because of pylint checks. Unfortunately, `Iterable` return type is not available for generators also, because of specific `contextlib.contextmanager` case.
### Other checks ### Other checks

View File

@ -1,29 +0,0 @@
ahriman.core.archive package
============================
Submodules
----------
ahriman.core.archive.archive\_tree module
-----------------------------------------
.. automodule:: ahriman.core.archive.archive_tree
:members:
:no-undoc-members:
:show-inheritance:
ahriman.core.archive.archive\_trigger module
--------------------------------------------
.. automodule:: ahriman.core.archive.archive_trigger
:members:
:no-undoc-members:
:show-inheritance:
Module contents
---------------
.. automodule:: ahriman.core.archive
:members:
:no-undoc-members:
:show-inheritance:

View File

@ -8,7 +8,6 @@ Subpackages
:maxdepth: 4 :maxdepth: 4
ahriman.core.alpm ahriman.core.alpm
ahriman.core.archive
ahriman.core.auth ahriman.core.auth
ahriman.core.build_tools ahriman.core.build_tools
ahriman.core.configuration ahriman.core.configuration

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).
@ -21,7 +21,7 @@ import argparse
import re import re
import sys import sys
from collections.abc import Iterator from collections.abc import Generator
from importlib import metadata from importlib import metadata
from typing import ClassVar from typing import ClassVar
@ -77,7 +77,7 @@ class Versions(Handler):
return parser return parser
@staticmethod @staticmethod
def package_dependencies(root: str) -> Iterator[tuple[str, str]]: def package_dependencies(root: str) -> Generator[tuple[str, str], None, None]:
""" """
extract list of ahriman package dependencies installed into system with their versions extract list of ahriman package dependencies installed into system with their versions
@ -87,7 +87,7 @@ class Versions(Handler):
Yields: Yields:
tuple[str, str]: map of installed dependency to its version tuple[str, str]: map of installed dependency to its version
""" """
def dependencies_by_key(key: str) -> Iterator[str]: def dependencies_by_key(key: str) -> Generator[str, None, None]:
# in importlib it returns requires in the following format # in importlib it returns requires in the following format
# ["pytest (>=3.0.0) ; extra == 'test'", "pytest-cov ; extra == 'test'"] # ["pytest (>=3.0.0) ; extra == 'test'", "pytest-cov ; extra == 'test'"]
try: try:

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).
@ -19,7 +19,7 @@
# #
import argparse import argparse
from collections.abc import Iterator from collections.abc import Generator
from pathlib import Path from pathlib import Path
from ahriman.application.handlers.handler import Handler, SubParserAction from ahriman.application.handlers.handler import Handler, SubParserAction
@ -86,7 +86,7 @@ class Web(Handler):
return parser return parser
@staticmethod @staticmethod
def extract_arguments(args: argparse.Namespace, configuration: Configuration) -> Iterator[str]: def extract_arguments(args: argparse.Namespace, configuration: Configuration) -> Generator[str, None, None]:
""" """
extract list of arguments used for current command, except for command specific ones extract list of arguments used for current command, except for command specific ones

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).
@ -21,7 +21,7 @@ import itertools
import shutil import shutil
import tarfile import tarfile
from collections.abc import Iterable, Iterator from collections.abc import Generator, Iterable
from functools import cached_property from functools import cached_property
from pathlib import Path from pathlib import Path
from pyalpm import DB, Handle, Package, SIG_DATABASE_OPTIONAL, SIG_PACKAGE_OPTIONAL # type: ignore[import-not-found] from pyalpm import DB, Handle, Package, SIG_DATABASE_OPTIONAL, SIG_PACKAGE_OPTIONAL # type: ignore[import-not-found]
@ -188,7 +188,7 @@ class Pacman(LazyLogging):
Returns: Returns:
dict[str, set[str]]: map of package name to its list of files dict[str, set[str]]: map of package name to its list of files
""" """
def extract(tar: tarfile.TarFile, versions: dict[str, str]) -> Iterator[tuple[str, set[str]]]: def extract(tar: tarfile.TarFile, versions: dict[str, str]) -> Generator[tuple[str, set[str]], None, None]:
for package_name, version in versions.items(): for package_name, version in versions.items():
path = Path(f"{package_name}-{version}") / "files" path = Path(f"{package_name}-{version}") / "files"
try: try:
@ -223,7 +223,7 @@ class Pacman(LazyLogging):
return result return result
def package(self, package_name: str) -> Iterator[Package]: def package(self, package_name: str) -> Generator[Package, None, None]:
""" """
retrieve list of the packages from the repository by name retrieve list of the packages from the repository by name
@ -256,7 +256,7 @@ class Pacman(LazyLogging):
return result return result
def provided_by(self, package_name: str) -> Iterator[Package]: def provided_by(self, package_name: str) -> Generator[Package, None, None]:
""" """
search through databases and emit packages which provides the ``package_name`` search through databases and emit packages which provides the ``package_name``

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).
@ -21,7 +21,7 @@ import itertools
import re import re
import shlex import shlex
from collections.abc import Iterator from collections.abc import Generator
from enum import StrEnum from enum import StrEnum
from typing import IO from typing import IO
@ -209,7 +209,7 @@ class PkgbuildParser(shlex.shlex):
Raises: Raises:
PkgbuildParserError: if array is not closed PkgbuildParserError: if array is not closed
""" """
def extract() -> Iterator[str]: def extract() -> Generator[str, None, None]:
while token := self.get_token(): while token := self.get_token():
match token: match token:
case _ if self._is_escaped(): case _ if self._is_escaped():
@ -276,7 +276,7 @@ class PkgbuildParser(shlex.shlex):
return content return content
def _parse_token(self, token: str) -> Iterator[PkgbuildPatch]: def _parse_token(self, token: str) -> Generator[PkgbuildPatch, None, None]:
""" """
parse single token to the PKGBUILD field parse single token to the PKGBUILD field
@ -360,7 +360,7 @@ class PkgbuildParser(shlex.shlex):
raise PkgbuildParserError("reached starting position, no valid symbols found") raise PkgbuildParserError("reached starting position, no valid symbols found")
def parse(self) -> Iterator[PkgbuildPatch]: def parse(self) -> Generator[PkgbuildPatch, None, None]:
""" """
parse source stream and yield parsed entries parse source stream and yield parsed entries

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).
@ -44,7 +44,7 @@ class AUR(Remote):
""" """
generate remote git url from the package base generate remote git url from the package base
Args: Args
package_base(str): package base package_base(str): package base
repository(str): repository name repository(str): repository name
@ -58,7 +58,7 @@ class AUR(Remote):
""" """
generate remote web url from the package base generate remote web url from the package base
Args: Args
package_base(str): package base package_base(str): package base
Returns: Returns:

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).
@ -46,7 +46,7 @@ class Official(Remote):
""" """
generate remote git url from the package base generate remote git url from the package base
Args: Args
package_base(str): package base package_base(str): package base
repository(str): repository name repository(str): repository name
@ -60,7 +60,7 @@ class Official(Remote):
""" """
generate remote web url from the package base generate remote web url from the package base
Args: Args
package_base(str): package base package_base(str): package base
Returns: Returns:

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).
@ -110,7 +110,7 @@ class Remote(SyncHttpClient):
""" """
generate remote git url from the package base generate remote git url from the package base
Args: Args
package_base(str): package base package_base(str): package base
repository(str): repository name repository(str): repository name
@ -127,7 +127,7 @@ class Remote(SyncHttpClient):
""" """
generate remote web url from the package base generate remote web url from the package base
Args: Args
package_base(str): package base package_base(str): package base
Returns: Returns:

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -23,7 +23,7 @@ from pathlib import Path
from ahriman.core.alpm.repo import Repo from ahriman.core.alpm.repo import Repo
from ahriman.core.log import LazyLogging from ahriman.core.log import LazyLogging
from ahriman.core.utils import utcnow, walk from ahriman.core.utils import utcnow
from ahriman.models.package import Package from ahriman.models.package import Package
from ahriman.models.repository_paths import RepositoryPaths from ahriman.models.repository_paths import RepositoryPaths
@ -54,12 +54,11 @@ class ArchiveTree(LazyLogging):
Args: Args:
date(datetime.date | None, optional): date to generate path. If none supplied then today will be used date(datetime.date | None, optional): date to generate path. If none supplied then today will be used
(Default value = None)
Returns: Returns:
Path: path to the repository root Path: path to the repository root
""" """
date = date or utcnow().date() date = date or utcnow().today()
return ( return (
self.paths.archive self.paths.archive
/ "repos" / "repos"
@ -90,42 +89,39 @@ class ArchiveTree(LazyLogging):
has_file = False has_file = False
for file in archive.glob(f"{single.filename}*"): for file in archive.glob(f"{single.filename}*"):
symlink = root / file.name if not (symlink := root / file.name).exists():
try: has_file |= True
symlink.symlink_to(file.relative_to(symlink.parent, walk_up=True)) symlink.symlink_to(file.relative_to(symlink.parent, walk_up=True))
has_file = True
except FileExistsError:
continue # symlink is already created, skip processing
if has_file: if has_file:
repo.add(root / single.filename) repo.add(root / single.filename)
def symlinks_fix(self) -> None: def symlinks_fix(self) -> None:
""" """
remove broken symlinks across repositories for all dates remove broken symlinks across all repositories
""" """
for path in walk(self.paths.archive / "repos"): for root, _, files in self.paths.archive.walk():
root = path.parent
*_, name, architecture = root.parts *_, name, architecture = root.parts
if self.repository_id.name != name or self.repository_id.architecture != architecture: if self.repository_id.name != name or self.repository_id.architecture != architecture:
continue # we only process same name repositories continue # we only process same name repositories
for file in files:
path = root / file
if not path.is_symlink(): if not path.is_symlink():
continue # find symlinks only continue # find symlinks only
if path.exists(): if path.exists():
continue # filter out not broken symlinks continue # filter out not broken symlinks
Repo(self.repository_id.name, self.paths, self.sign_args, root).remove(None, path) repo = Repo(self.repository_id.name, self.paths, self.sign_args, root)
repo.remove(None, path)
def tree_create(self) -> None: def tree_create(self) -> None:
""" """
create repository tree for current repository create repository tree for current repository
""" """
root = self.repository_for() path = self.repository_for()
if root.exists(): if path.exists():
return return
with self.paths.preserve_owner(self.paths.archive): with self.paths.preserve_owner(self.paths.archive):
root.mkdir(0o755, parents=True) path.mkdir(0o755, parents=True)
# init empty repository here
Repo(self.repository_id.name, self.paths, self.sign_args, root).init()

View File

@ -17,6 +17,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
from ahriman.core import context
from ahriman.core.archive.archive_tree import ArchiveTree from ahriman.core.archive.archive_tree import ArchiveTree
from ahriman.core.configuration import Configuration from ahriman.core.configuration import Configuration
from ahriman.core.sign.gpg import GPG from ahriman.core.sign.gpg import GPG
@ -32,7 +33,6 @@ class ArchiveTrigger(Trigger):
Attributes: Attributes:
paths(RepositoryPaths): repository paths instance paths(RepositoryPaths): repository paths instance
tree(ArchiveTree): archive tree wrapper
""" """
def __init__(self, repository_id: RepositoryId, configuration: Configuration) -> None: def __init__(self, repository_id: RepositoryId, configuration: Configuration) -> None:
@ -44,7 +44,9 @@ class ArchiveTrigger(Trigger):
Trigger.__init__(self, repository_id, configuration) Trigger.__init__(self, repository_id, configuration)
self.paths = configuration.repository_paths self.paths = configuration.repository_paths
self.tree = ArchiveTree(self.paths, GPG(configuration).repository_sign_args)
ctx = context.get()
self.tree = ArchiveTree(self.paths, ctx.get(GPG).repository_sign_args)
def on_result(self, result: Result, packages: list[Package]) -> None: def on_result(self, result: Result, packages: list[Package]) -> None:
""" """

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).
@ -19,7 +19,7 @@
# #
import shutil import shutil
from collections.abc import Iterator from collections.abc import Generator
from pathlib import Path from pathlib import Path
from typing import ClassVar from typing import ClassVar
@ -347,7 +347,7 @@ class Sources(LazyLogging):
""" """
gitconfig = gitconfig or {} gitconfig = gitconfig or {}
def configuration_flags() -> Iterator[str]: def configuration_flags() -> Generator[str, None, None]:
for option, value in (self.GITCONFIG | gitconfig).items(): for option, value in (self.GITCONFIG | gitconfig).items():
yield "-c" yield "-c"
yield f"{option}=\"{value}\"" yield f"{option}=\"{value}\""

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).
@ -17,7 +17,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
from collections.abc import Iterator from collections.abc import Generator
from pathlib import Path from pathlib import Path
from ahriman.core.build_tools.sources import Sources from ahriman.core.build_tools.sources import Sources
@ -77,7 +77,7 @@ class Task(LazyLogging):
Returns: Returns:
list[Path]: list of file paths which looks like freshly generated archives list[Path]: list of file paths which looks like freshly generated archives
""" """
def files() -> Iterator[Path]: def files() -> Generator[Path, None, None]:
for filepath in sources_dir.iterdir(): for filepath in sources_dir.iterdir():
if filepath in source_files: if filepath in source_files:
continue # skip files which were already there continue # skip files which were already there

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).
@ -57,7 +57,7 @@ class ConfigurationMultiDict(dict[str, Any]):
OptionError: if the key already exists in the dictionary, but not a single value list or a string OptionError: if the key already exists in the dictionary, but not a single value list or a string
""" """
match self.get(key): match self.get(key):
case [current_value] | (str() as current_value): case [current_value] | str(current_value):
value = f"{current_value} {value}" value = f"{current_value} {value}"
case None: case None:
pass pass

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).
@ -21,7 +21,7 @@ import configparser
import os import os
import sys import sys
from collections.abc import Iterator, Mapping, MutableMapping from collections.abc import Generator, Mapping, MutableMapping
from string import Template from string import Template
from typing import Any, ClassVar from typing import Any, ClassVar
@ -37,7 +37,7 @@ class ShellInterpolator(configparser.Interpolation):
@staticmethod @staticmethod
def _extract_variables(parser: MutableMapping[str, Mapping[str, str]], value: str, def _extract_variables(parser: MutableMapping[str, Mapping[str, str]], value: str,
defaults: Mapping[str, str]) -> Iterator[tuple[str, str]]: defaults: Mapping[str, str]) -> Generator[tuple[str, str], None, None]:
""" """
extract keys and values (if available) from the configuration. In case if a key is not available, it will be extract keys and values (if available) from the configuration. In case if a key is not available, it will be
silently skipped from the result silently skipped from the result
@ -50,7 +50,7 @@ class ShellInterpolator(configparser.Interpolation):
Yields: Yields:
tuple[str, str]: variable name used for substitution and its value tuple[str, str]: variable name used for substitution and its value
""" """
def identifiers() -> Iterator[tuple[str | None, str]]: def identifiers() -> Generator[tuple[str | None, str], None, None]:
# extract all found identifiers and parse them # extract all found identifiers and parse them
for identifier in ShellTemplate(value).get_identifiers(): for identifier in ShellTemplate(value).get_identifiers():
match identifier.rsplit(":", maxsplit=1): match identifier.rsplit(":", maxsplit=1):

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).
@ -20,7 +20,7 @@
import fnmatch import fnmatch
import re import re
from collections.abc import Iterator, Mapping from collections.abc import Generator, Mapping
from string import Template from string import Template
@ -132,7 +132,7 @@ class ShellTemplate(Template):
(self._REPLACE, self._replace, "/"), (self._REPLACE, self._replace, "/"),
) )
def generator(variables: dict[str, str]) -> Iterator[tuple[str, str]]: def generator(variables: dict[str, str]) -> Generator[tuple[str, str], None, None]:
for identifier in self.get_identifiers(): for identifier in self.get_identifiers():
for regex, function, greediness in substitutions: for regex, function, greediness in substitutions:
if m := regex.match(identifier): if m := regex.match(identifier):

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).
@ -109,7 +109,7 @@ class Validator(RootValidator):
Args: Args:
constraint(list[str]): optional list of allowed special words (e.g. ``localhost``) constraint(list[str]): optional list of allowed special words (e.g. ``localhost``)
field(str): field name to be checked field(str): field name to be checked
value(str): value to be checked value(Path): value to be checked
Examples: Examples:
The rule's arguments are validated against this schema: The rule's arguments are validated against this schema:

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2021-2026 ahriman team. # Copyright (c) 2021-2025 ahriman team.
# #
# This file is part of ahriman # This file is part of ahriman
# (see https://github.com/arcan1s/ahriman). # (see https://github.com/arcan1s/ahriman).

Some files were not shown because too many files have changed in this diff Show More