mirror of
				https://github.com/arcan1s/ahriman.git
				synced 2025-11-03 23:33:41 +00:00 
			
		
		
		
	type: use ClassVar decorator for class attributes
This commit is contained in:
		@ -80,7 +80,7 @@ Again, the most checks can be performed by `tox` command, though some additional
 | 
				
			|||||||
                >>> clazz = Clazz()
 | 
					                >>> clazz = Clazz()
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
        CLAZZ_ATTRIBUTE = 42
 | 
					        CLAZZ_ATTRIBUTE: ClassVar[int] = 42
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
        def __init__(self, *args: Any, **kwargs: Any) -> None:
 | 
					        def __init__(self, *args: Any, **kwargs: Any) -> None:
 | 
				
			||||||
            """
 | 
					            """
 | 
				
			||||||
@ -96,6 +96,7 @@ Again, the most checks can be performed by `tox` command, though some additional
 | 
				
			|||||||
* Type annotations are the must, even for local functions. For the function argument `self` (for instance methods) and `cls` (for class methods) should not be annotated.
 | 
					* Type annotations are the must, even for local functions. For the function argument `self` (for instance methods) and `cls` (for class methods) should not be annotated.
 | 
				
			||||||
* For collection types built-in classes must be used if possible (e.g. `dict` instead of `typing.Dict`, `tuple` instead of `typing.Tuple`). In case if built-in type is not available, but `collections.abc` provides interface, it must be used (e.g. `collections.abc.Awaitable` instead of `typing.Awaitable`, `collections.abc.Iterable` instead of `typing.Iterable`). For union classes, the bar operator (`|`) must be used (e.g. `float | int` instead of `typing.Union[float, int]`), which also includes `typing.Optional` (e.g. `str | None` instead of `Optional[str]`).
 | 
					* For collection types built-in classes must be used if possible (e.g. `dict` instead of `typing.Dict`, `tuple` instead of `typing.Tuple`). In case if built-in type is not available, but `collections.abc` provides interface, it must be used (e.g. `collections.abc.Awaitable` instead of `typing.Awaitable`, `collections.abc.Iterable` instead of `typing.Iterable`). For union classes, the bar operator (`|`) must be used (e.g. `float | int` instead of `typing.Union[float, int]`), which also includes `typing.Optional` (e.g. `str | None` instead of `Optional[str]`).
 | 
				
			||||||
* `classmethod` should (almost) always return `Self`. In case of mypy warning (e.g. if there is a branch in which function doesn't return the instance of `cls`) consider using `staticmethod` instead.
 | 
					* `classmethod` should (almost) always return `Self`. In case of mypy warning (e.g. if there is a branch in which function doesn't return the instance of `cls`) consider using `staticmethod` instead.
 | 
				
			||||||
 | 
					* Class attributes must be decorated as `ClassVar[...]`.
 | 
				
			||||||
* Recommended order of function definitions in class:
 | 
					* Recommended order of function definitions in class:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ```python
 | 
					    ```python
 | 
				
			||||||
 | 
				
			|||||||
@ -22,7 +22,7 @@ import logging
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from collections.abc import Callable, Iterable
 | 
					from collections.abc import Callable, Iterable
 | 
				
			||||||
from multiprocessing import Pool
 | 
					from multiprocessing import Pool
 | 
				
			||||||
from typing import TypeVar
 | 
					from typing import ClassVar, TypeVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.application.lock import Lock
 | 
					from ahriman.application.lock import Lock
 | 
				
			||||||
from ahriman.core.configuration import Configuration
 | 
					from ahriman.core.configuration import Configuration
 | 
				
			||||||
@ -58,8 +58,8 @@ class Handler:
 | 
				
			|||||||
            >>> Add.execute(args)
 | 
					            >>> Add.execute(args)
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ALLOW_MULTI_ARCHITECTURE_RUN = True
 | 
					    ALLOW_MULTI_ARCHITECTURE_RUN: ClassVar[bool] = True
 | 
				
			||||||
    arguments: list[Callable[[SubParserAction], argparse.ArgumentParser]]
 | 
					    arguments: ClassVar[list[Callable[[SubParserAction], argparse.ArgumentParser]]]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def call(cls, args: argparse.Namespace, repository_id: RepositoryId) -> bool:
 | 
					    def call(cls, args: argparse.Namespace, repository_id: RepositoryId) -> bool:
 | 
				
			||||||
 | 
				
			|||||||
@ -21,6 +21,7 @@ import argparse
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from collections.abc import Callable, Iterable
 | 
					from collections.abc import Callable, Iterable
 | 
				
			||||||
from dataclasses import fields
 | 
					from dataclasses import fields
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.application.handlers.handler import Handler, SubParserAction
 | 
					from ahriman.application.handlers.handler import Handler, SubParserAction
 | 
				
			||||||
from ahriman.core.alpm.remote import AUR, Official
 | 
					from ahriman.core.alpm.remote import AUR, Official
 | 
				
			||||||
@ -40,7 +41,7 @@ class Search(Handler):
 | 
				
			|||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ALLOW_MULTI_ARCHITECTURE_RUN = False  # system-wide action
 | 
					    ALLOW_MULTI_ARCHITECTURE_RUN = False  # system-wide action
 | 
				
			||||||
    SORT_FIELDS = {
 | 
					    SORT_FIELDS: ClassVar[set[str]] = {
 | 
				
			||||||
        field.name
 | 
					        field.name
 | 
				
			||||||
        for field in fields(AURPackage)
 | 
					        for field in fields(AURPackage)
 | 
				
			||||||
        if field.default_factory is not list
 | 
					        if field.default_factory is not list
 | 
				
			||||||
 | 
				
			|||||||
@ -21,6 +21,7 @@ import argparse
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from pwd import getpwuid
 | 
					from pwd import getpwuid
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
from urllib.parse import quote_plus as url_encode
 | 
					from urllib.parse import quote_plus as url_encode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.application.application import Application
 | 
					from ahriman.application.application import Application
 | 
				
			||||||
@ -46,9 +47,9 @@ class Setup(Handler):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    ALLOW_MULTI_ARCHITECTURE_RUN = False  # conflicting io
 | 
					    ALLOW_MULTI_ARCHITECTURE_RUN = False  # conflicting io
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ARCHBUILD_COMMAND_PATH = Path("/") / "usr" / "bin" / "archbuild"
 | 
					    ARCHBUILD_COMMAND_PATH: ClassVar[Path] = Path("/") / "usr" / "bin" / "archbuild"
 | 
				
			||||||
    MIRRORLIST_PATH = Path("/") / "etc" / "pacman.d" / "mirrorlist"
 | 
					    MIRRORLIST_PATH: ClassVar[Path] = Path("/") / "etc" / "pacman.d" / "mirrorlist"
 | 
				
			||||||
    SUDOERS_DIR_PATH = Path("/") / "etc" / "sudoers.d"
 | 
					    SUDOERS_DIR_PATH: ClassVar[Path] = Path("/") / "etc" / "sudoers.d"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def run(cls, args: argparse.Namespace, repository_id: RepositoryId, configuration: Configuration, *,
 | 
					    def run(cls, args: argparse.Namespace, repository_id: RepositoryId, configuration: Configuration, *,
 | 
				
			||||||
 | 
				
			|||||||
@ -23,6 +23,7 @@ import sys
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from collections.abc import Generator
 | 
					from collections.abc import Generator
 | 
				
			||||||
from importlib import metadata
 | 
					from importlib import metadata
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman import __version__
 | 
					from ahriman import __version__
 | 
				
			||||||
from ahriman.application.handlers.handler import Handler, SubParserAction
 | 
					from ahriman.application.handlers.handler import Handler, SubParserAction
 | 
				
			||||||
@ -36,11 +37,11 @@ class Versions(Handler):
 | 
				
			|||||||
    version handler
 | 
					    version handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Attributes:
 | 
					    Attributes:
 | 
				
			||||||
        PEP423_PACKAGE_NAME(str): (class attribute) special regex for valid PEP423 package name
 | 
					        PEP423_PACKAGE_NAME(re.Pattern[str]): (class attribute) special regex for valid PEP423 package name
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ALLOW_MULTI_ARCHITECTURE_RUN = False  # system-wide action
 | 
					    ALLOW_MULTI_ARCHITECTURE_RUN = False  # system-wide action
 | 
				
			||||||
    PEP423_PACKAGE_NAME = re.compile(r"^[A-Za-z0-9._-]+")
 | 
					    PEP423_PACKAGE_NAME: ClassVar[re.Pattern[str]] = re.compile(r"^[A-Za-z0-9._-]+")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def run(cls, args: argparse.Namespace, repository_id: RepositoryId, configuration: Configuration, *,
 | 
					    def run(cls, args: argparse.Namespace, repository_id: RepositoryId, configuration: Configuration, *,
 | 
				
			||||||
 | 
				
			|||||||
@ -23,6 +23,7 @@ import shutil
 | 
				
			|||||||
from email.utils import parsedate_to_datetime
 | 
					from email.utils import parsedate_to_datetime
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from pyalpm import DB  # type: ignore[import-not-found]
 | 
					from pyalpm import DB  # type: ignore[import-not-found]
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
from urllib.parse import urlparse
 | 
					from urllib.parse import urlparse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.configuration import Configuration
 | 
					from ahriman.core.configuration import Configuration
 | 
				
			||||||
@ -41,7 +42,7 @@ class PacmanDatabase(SyncHttpClient):
 | 
				
			|||||||
        sync_files_database(bool): sync files database
 | 
					        sync_files_database(bool): sync files database
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    LAST_MODIFIED_HEADER = "Last-Modified"
 | 
					    LAST_MODIFIED_HEADER: ClassVar[str] = "Last-Modified"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, database: DB, configuration: Configuration) -> None:
 | 
					    def __init__(self, database: DB, configuration: Configuration) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 | 
				
			|||||||
@ -34,14 +34,14 @@ class PkgbuildToken(StrEnum):
 | 
				
			|||||||
    well-known tokens dictionary
 | 
					    well-known tokens dictionary
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Attributes:
 | 
					    Attributes:
 | 
				
			||||||
        ArrayEnds(PkgbuildToken): (class attribute) array ends token
 | 
					        ArrayEnds(PkgbuildToken): array ends token
 | 
				
			||||||
        ArrayStarts(PkgbuildToken): (class attribute) array starts token
 | 
					        ArrayStarts(PkgbuildToken): array starts token
 | 
				
			||||||
        Comma(PkgbuildToken): (class attribute) comma token
 | 
					        Comma(PkgbuildToken): comma token
 | 
				
			||||||
        Comment(PkgbuildToken): (class attribute) comment token
 | 
					        Comment(PkgbuildToken): comment token
 | 
				
			||||||
        FunctionDeclaration(PkgbuildToken): (class attribute) function declaration token
 | 
					        FunctionDeclaration(PkgbuildToken): function declaration token
 | 
				
			||||||
        FunctionEnds(PkgbuildToken): (class attribute) function ends token
 | 
					        FunctionEnds(PkgbuildToken): function ends token
 | 
				
			||||||
        FunctionStarts(PkgbuildToken): (class attribute) function starts token
 | 
					        FunctionStarts(PkgbuildToken): function starts token
 | 
				
			||||||
        NewLine(PkgbuildToken): (class attribute) new line token
 | 
					        NewLine(PkgbuildToken): new line token
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ArrayStarts = "("
 | 
					    ArrayStarts = "("
 | 
				
			||||||
 | 
				
			|||||||
@ -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 typing import Any
 | 
					from typing import Any, ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.alpm.pacman import Pacman
 | 
					from ahriman.core.alpm.pacman import Pacman
 | 
				
			||||||
from ahriman.core.alpm.remote.remote import Remote
 | 
					from ahriman.core.alpm.remote.remote import Remote
 | 
				
			||||||
@ -35,9 +35,9 @@ class AUR(Remote):
 | 
				
			|||||||
        DEFAULT_RPC_VERSION(str): (class attribute) default AUR RPC version
 | 
					        DEFAULT_RPC_VERSION(str): (class attribute) default AUR RPC version
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DEFAULT_AUR_URL = "https://aur.archlinux.org"
 | 
					    DEFAULT_AUR_URL: ClassVar[str] = "https://aur.archlinux.org"
 | 
				
			||||||
    DEFAULT_RPC_URL = f"{DEFAULT_AUR_URL}/rpc"
 | 
					    DEFAULT_RPC_URL: ClassVar[str] = f"{DEFAULT_AUR_URL}/rpc"
 | 
				
			||||||
    DEFAULT_RPC_VERSION = "5"
 | 
					    DEFAULT_RPC_VERSION: ClassVar[str] = "5"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def remote_git_url(cls, package_base: str, repository: str) -> str:
 | 
					    def remote_git_url(cls, package_base: str, repository: str) -> str:
 | 
				
			||||||
 | 
				
			|||||||
@ -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 typing import Any
 | 
					from typing import Any, ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.alpm.pacman import Pacman
 | 
					from ahriman.core.alpm.pacman import Pacman
 | 
				
			||||||
from ahriman.core.alpm.remote.remote import Remote
 | 
					from ahriman.core.alpm.remote.remote import Remote
 | 
				
			||||||
@ -36,10 +36,10 @@ class Official(Remote):
 | 
				
			|||||||
        DEFAULT_RPC_URL(str): (class attribute) default archlinux repositories RPC url
 | 
					        DEFAULT_RPC_URL(str): (class attribute) default archlinux repositories RPC url
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DEFAULT_ARCHLINUX_GIT_URL = "https://gitlab.archlinux.org"
 | 
					    DEFAULT_ARCHLINUX_GIT_URL: ClassVar[str] = "https://gitlab.archlinux.org"
 | 
				
			||||||
    DEFAULT_ARCHLINUX_URL = "https://archlinux.org"
 | 
					    DEFAULT_ARCHLINUX_URL: ClassVar[str] = "https://archlinux.org"
 | 
				
			||||||
    DEFAULT_SEARCH_REPOSITORIES = ["Core", "Extra", "Multilib"]
 | 
					    DEFAULT_SEARCH_REPOSITORIES: ClassVar[list[str]] = ["Core", "Extra", "Multilib"]
 | 
				
			||||||
    DEFAULT_RPC_URL = "https://archlinux.org/packages/search/json"
 | 
					    DEFAULT_RPC_URL: ClassVar[str] = "https://archlinux.org/packages/search/json"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def remote_git_url(cls, package_base: str, repository: str) -> str:
 | 
					    def remote_git_url(cls, package_base: str, repository: str) -> str:
 | 
				
			||||||
 | 
				
			|||||||
@ -21,6 +21,7 @@ import shutil
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from collections.abc import Generator
 | 
					from collections.abc import Generator
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.exceptions import CalledProcessError
 | 
					from ahriman.core.exceptions import CalledProcessError
 | 
				
			||||||
from ahriman.core.log import LazyLogging
 | 
					from ahriman.core.log import LazyLogging
 | 
				
			||||||
@ -42,9 +43,9 @@ class Sources(LazyLogging):
 | 
				
			|||||||
        GITCONFIG(dict[str, str]): (class attribute) git config options to suppress annoying hints
 | 
					        GITCONFIG(dict[str, str]): (class attribute) git config options to suppress annoying hints
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DEFAULT_BRANCH = "master"  # default fallback branch
 | 
					    DEFAULT_BRANCH: ClassVar[str] = "master"  # default fallback branch
 | 
				
			||||||
    DEFAULT_COMMIT_AUTHOR = ("ahriman", "ahriman@localhost")
 | 
					    DEFAULT_COMMIT_AUTHOR: ClassVar[tuple[str, str]] = ("ahriman", "ahriman@localhost")
 | 
				
			||||||
    GITCONFIG = {
 | 
					    GITCONFIG: ClassVar[dict[str, str]] = {
 | 
				
			||||||
        "init.defaultBranch": DEFAULT_BRANCH,
 | 
					        "init.defaultBranch": DEFAULT_BRANCH,
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -22,7 +22,7 @@ import shlex
 | 
				
			|||||||
import sys
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from typing import Any, Self
 | 
					from typing import Any, ClassVar, Self
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.configuration.configuration_multi_dict import ConfigurationMultiDict
 | 
					from ahriman.core.configuration.configuration_multi_dict import ConfigurationMultiDict
 | 
				
			||||||
from ahriman.core.configuration.shell_interpolator import ShellInterpolator
 | 
					from ahriman.core.configuration.shell_interpolator import ShellInterpolator
 | 
				
			||||||
@ -65,8 +65,8 @@ class Configuration(configparser.RawConfigParser):
 | 
				
			|||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _LEGACY_ARCHITECTURE_SPECIFIC_SECTIONS = ["web"]
 | 
					    _LEGACY_ARCHITECTURE_SPECIFIC_SECTIONS = ["web"]
 | 
				
			||||||
    ARCHITECTURE_SPECIFIC_SECTIONS = ["alpm", "build", "sign"]
 | 
					    ARCHITECTURE_SPECIFIC_SECTIONS: ClassVar[list[str]] = ["alpm", "build", "sign"]
 | 
				
			||||||
    SYSTEM_CONFIGURATION_PATH = Path(sys.prefix) / "share" / "ahriman" / "settings" / "ahriman.ini"
 | 
					    SYSTEM_CONFIGURATION_PATH: ClassVar[Path] = Path(sys.prefix) / "share" / "ahriman" / "settings" / "ahriman.ini"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, allow_no_value: bool = False, allow_multi_key: bool = True) -> None:
 | 
					    def __init__(self, allow_no_value: bool = False, allow_multi_key: bool = True) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 | 
				
			|||||||
@ -23,6 +23,7 @@ import sys
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from collections.abc import Generator, Mapping, MutableMapping
 | 
					from collections.abc import Generator, Mapping, MutableMapping
 | 
				
			||||||
from string import Template
 | 
					from string import Template
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.configuration.shell_template import ShellTemplate
 | 
					from ahriman.core.configuration.shell_template import ShellTemplate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -32,7 +33,7 @@ class ShellInterpolator(configparser.Interpolation):
 | 
				
			|||||||
    custom string interpolator, because we cannot use defaults argument due to config validation
 | 
					    custom string interpolator, because we cannot use defaults argument due to config validation
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DATA_LINK_ESCAPE = "\x10"
 | 
					    DATA_LINK_ESCAPE: ClassVar[str] = "\x10"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def _extract_variables(parser: MutableMapping[str, Mapping[str, str]], value: str,
 | 
					    def _extract_variables(parser: MutableMapping[str, Mapping[str, str]], value: str,
 | 
				
			||||||
 | 
				
			|||||||
@ -28,9 +28,6 @@ class ShellTemplate(Template):
 | 
				
			|||||||
    """
 | 
					    """
 | 
				
			||||||
    extension to the default :class:`Template` class, which also adds additional tokens to braced regex and enables
 | 
					    extension to the default :class:`Template` class, which also adds additional tokens to braced regex and enables
 | 
				
			||||||
    bash expansion
 | 
					    bash expansion
 | 
				
			||||||
 | 
					 | 
				
			||||||
    Attributes:
 | 
					 | 
				
			||||||
        braceidpattern(str): regular expression to match every character except for closing bracket
 | 
					 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    braceidpattern = r"(?a:[_a-z0-9][^}]*)"
 | 
					    braceidpattern = r"(?a:[_a-z0-9][^}]*)"
 | 
				
			||||||
 | 
				
			|||||||
@ -22,7 +22,6 @@ import contextlib
 | 
				
			|||||||
from functools import cached_property
 | 
					from functools import cached_property
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.configuration import Configuration
 | 
					from ahriman.core.configuration import Configuration
 | 
				
			||||||
from ahriman.core.configuration.schema import ConfigurationSchema
 | 
					 | 
				
			||||||
from ahriman.core.status.web_client import WebClient
 | 
					from ahriman.core.status.web_client import WebClient
 | 
				
			||||||
from ahriman.core.triggers import Trigger
 | 
					from ahriman.core.triggers import Trigger
 | 
				
			||||||
from ahriman.models.repository_id import RepositoryId
 | 
					from ahriman.models.repository_id import RepositoryId
 | 
				
			||||||
@ -34,7 +33,7 @@ class DistributedSystem(Trigger, WebClient):
 | 
				
			|||||||
    simple class to (un)register itself as a distributed worker
 | 
					    simple class to (un)register itself as a distributed worker
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    CONFIGURATION_SCHEMA: ConfigurationSchema = {
 | 
					    CONFIGURATION_SCHEMA = {
 | 
				
			||||||
        "worker": {
 | 
					        "worker": {
 | 
				
			||||||
            "type": "dict",
 | 
					            "type": "dict",
 | 
				
			||||||
            "schema": {
 | 
					            "schema": {
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,8 @@
 | 
				
			|||||||
# 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 typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.formatters.string_printer import StringPrinter
 | 
					from ahriman.core.formatters.string_printer import StringPrinter
 | 
				
			||||||
from ahriman.models.property import Property
 | 
					from ahriman.models.property import Property
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -31,7 +33,7 @@ class ConfigurationPrinter(StringPrinter):
 | 
				
			|||||||
        values(dict[str, str]): configuration values dictionary
 | 
					        values(dict[str, str]): configuration values dictionary
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    HIDE_KEYS = [
 | 
					    HIDE_KEYS: ClassVar[list[str]] = [
 | 
				
			||||||
        "api_key",  # telegram key
 | 
					        "api_key",  # telegram key
 | 
				
			||||||
        "client_secret",  # oauth secret
 | 
					        "client_secret",  # oauth secret
 | 
				
			||||||
        "cookie_secret_key",  # cookie secret key
 | 
					        "cookie_secret_key",  # cookie secret key
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,8 @@
 | 
				
			|||||||
# 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 typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.formatters.string_printer import StringPrinter
 | 
					from ahriman.core.formatters.string_printer import StringPrinter
 | 
				
			||||||
from ahriman.models.property import Property
 | 
					from ahriman.models.property import Property
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -26,10 +28,11 @@ class PackageStatsPrinter(StringPrinter):
 | 
				
			|||||||
    print packages statistics
 | 
					    print packages statistics
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Attributes:
 | 
					    Attributes:
 | 
				
			||||||
 | 
					        MAX_COUNT(int): (class attribute) maximum number of packages to print
 | 
				
			||||||
        events(dict[str, int]): map of package to its event frequency
 | 
					        events(dict[str, int]): map of package to its event frequency
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    MAX_COUNT = 10
 | 
					    MAX_COUNT: ClassVar[int] = 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, events: dict[str, int]) -> None:
 | 
					    def __init__(self, events: dict[str, int]) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 | 
				
			|||||||
@ -21,6 +21,7 @@ import logging
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from logging.config import fileConfig
 | 
					from logging.config import fileConfig
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.configuration import Configuration
 | 
					from ahriman.core.configuration import Configuration
 | 
				
			||||||
from ahriman.core.log.http_log_handler import HttpLogHandler
 | 
					from ahriman.core.log.http_log_handler import HttpLogHandler
 | 
				
			||||||
@ -38,9 +39,9 @@ class LogLoader:
 | 
				
			|||||||
        DEFAULT_SYSLOG_DEVICE(Path): (class attribute) default path to syslog device
 | 
					        DEFAULT_SYSLOG_DEVICE(Path): (class attribute) default path to syslog device
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DEFAULT_LOG_FORMAT = "[%(levelname)s %(asctime)s] [%(filename)s:%(lineno)d %(funcName)s]: %(message)s"
 | 
					    DEFAULT_LOG_FORMAT: ClassVar[str] = "[%(levelname)s %(asctime)s] [%(name)s]: %(message)s"
 | 
				
			||||||
    DEFAULT_LOG_LEVEL = logging.DEBUG
 | 
					    DEFAULT_LOG_LEVEL: ClassVar[int] = logging.DEBUG
 | 
				
			||||||
    DEFAULT_SYSLOG_DEVICE = Path("/") / "dev" / "log"
 | 
					    DEFAULT_SYSLOG_DEVICE: ClassVar[Path] = Path("/") / "dev" / "log"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def handler(selected: LogHandler | None) -> LogHandler:
 | 
					    def handler(selected: LogHandler | None) -> LogHandler:
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,8 @@
 | 
				
			|||||||
# 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 typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.configuration import Configuration
 | 
					from ahriman.core.configuration import Configuration
 | 
				
			||||||
from ahriman.core.http import SyncHttpClient
 | 
					from ahriman.core.http import SyncHttpClient
 | 
				
			||||||
from ahriman.core.report.jinja_template import JinjaTemplate
 | 
					from ahriman.core.report.jinja_template import JinjaTemplate
 | 
				
			||||||
@ -39,8 +41,8 @@ class Telegram(Report, JinjaTemplate, SyncHttpClient):
 | 
				
			|||||||
        template_type(str): template message type to be used in parse mode, one of MarkdownV2, HTML, Markdown
 | 
					        template_type(str): template message type to be used in parse mode, one of MarkdownV2, HTML, Markdown
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    TELEGRAM_API_URL = "https://api.telegram.org"
 | 
					    TELEGRAM_API_URL: ClassVar[str] = "https://api.telegram.org"
 | 
				
			||||||
    TELEGRAM_MAX_CONTENT_LENGTH = 4096
 | 
					    TELEGRAM_MAX_CONTENT_LENGTH: ClassVar[int] = 4096
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, repository_id: RepositoryId, configuration: Configuration, section: str) -> None:
 | 
					    def __init__(self, repository_id: RepositoryId, configuration: Configuration, section: str) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 | 
				
			|||||||
@ -22,6 +22,7 @@ import itertools
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from collections.abc import Callable, Generator
 | 
					from collections.abc import Callable, Generator
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.utils import utcnow
 | 
					from ahriman.core.utils import utcnow
 | 
				
			||||||
from ahriman.models.pkgbuild_patch import PkgbuildPatch
 | 
					from ahriman.models.pkgbuild_patch import PkgbuildPatch
 | 
				
			||||||
@ -35,7 +36,7 @@ class PkgbuildGenerator:
 | 
				
			|||||||
        PKGBUILD_STATIC_PROPERTIES(list[PkgbuildPatch]): (class attribute) list of default pkgbuild static properties
 | 
					        PKGBUILD_STATIC_PROPERTIES(list[PkgbuildPatch]): (class attribute) list of default pkgbuild static properties
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    PKGBUILD_STATIC_PROPERTIES = [
 | 
					    PKGBUILD_STATIC_PROPERTIES: ClassVar[list[PkgbuildPatch]] = [
 | 
				
			||||||
        PkgbuildPatch("pkgrel", "1"),
 | 
					        PkgbuildPatch("pkgrel", "1"),
 | 
				
			||||||
        PkgbuildPatch("arch", ["any"]),
 | 
					        PkgbuildPatch("arch", ["any"]),
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 Callable
 | 
					from collections.abc import Callable
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.configuration import Configuration
 | 
					from ahriman.core.configuration import Configuration
 | 
				
			||||||
from ahriman.core.configuration.schema import ConfigurationSchema
 | 
					from ahriman.core.configuration.schema import ConfigurationSchema
 | 
				
			||||||
@ -56,8 +57,8 @@ class Trigger(LazyLogging):
 | 
				
			|||||||
            >>> loader.on_result(Result(), [])
 | 
					            >>> loader.on_result(Result(), [])
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    CONFIGURATION_SCHEMA: ConfigurationSchema = {}
 | 
					    CONFIGURATION_SCHEMA: ClassVar[ConfigurationSchema] = {}
 | 
				
			||||||
    CONFIGURATION_SCHEMA_FALLBACK: str | None = None
 | 
					    CONFIGURATION_SCHEMA_FALLBACK: ClassVar[str | None] = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, repository_id: RepositoryId, configuration: Configuration) -> None:
 | 
					    def __init__(self, repository_id: RepositoryId, configuration: Configuration) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 | 
				
			|||||||
@ -25,9 +25,9 @@ class Action(StrEnum):
 | 
				
			|||||||
    base action enumeration
 | 
					    base action enumeration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Attributes:
 | 
					    Attributes:
 | 
				
			||||||
        List(Action): (class attribute) list available values
 | 
					        List(Action): list available values
 | 
				
			||||||
        Remove(Action): (class attribute) remove everything from local storage
 | 
					        Remove(Action): remove everything from local storage
 | 
				
			||||||
        Update(Action): (class attribute) update local storage or add to
 | 
					        Update(Action): update local storage or add to
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    List = "list"
 | 
					    List = "list"
 | 
				
			||||||
 | 
				
			|||||||
@ -27,10 +27,10 @@ class AuthSettings(StrEnum):
 | 
				
			|||||||
    web authorization type
 | 
					    web authorization type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Attributes:
 | 
					    Attributes:
 | 
				
			||||||
        Disabled(AuthSettings): (class attribute) authorization is disabled
 | 
					        Disabled(AuthSettings): authorization is disabled
 | 
				
			||||||
        Configuration(AuthSettings): (class attribute) configuration based authorization
 | 
					        Configuration(AuthSettings): configuration based authorization
 | 
				
			||||||
        OAuth(AuthSettings): (class attribute) OAuth based provider
 | 
					        OAuth(AuthSettings): OAuth based provider
 | 
				
			||||||
        PAM(AuthSettings): (class attribute) PAM based provider
 | 
					        PAM(AuthSettings): PAM based provider
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Disabled = "disabled"
 | 
					    Disabled = "disabled"
 | 
				
			||||||
 | 
				
			|||||||
@ -29,11 +29,11 @@ class BuildStatusEnum(StrEnum):
 | 
				
			|||||||
    build status enumeration
 | 
					    build status enumeration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Attributes:
 | 
					    Attributes:
 | 
				
			||||||
        Unknown(BuildStatusEnum): (class attribute) build status is unknown
 | 
					        Unknown(BuildStatusEnum): build status is unknown
 | 
				
			||||||
        Pending(BuildStatusEnum): (class attribute) package is out-of-dated and will be built soon
 | 
					        Pending(BuildStatusEnum): package is out-of-dated and will be built soon
 | 
				
			||||||
        Building(BuildStatusEnum): (class attribute) package is building right now
 | 
					        Building(BuildStatusEnum): package is building right now
 | 
				
			||||||
        Failed(BuildStatusEnum): (class attribute) package build failed
 | 
					        Failed(BuildStatusEnum): package build failed
 | 
				
			||||||
        Success(BuildStatusEnum): (class attribute) package has been built without errors
 | 
					        Success(BuildStatusEnum): package has been built without errors
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Unknown = "unknown"
 | 
					    Unknown = "unknown"
 | 
				
			||||||
 | 
				
			|||||||
@ -28,10 +28,10 @@ class EventType(StrEnum):
 | 
				
			|||||||
    predefined event types
 | 
					    predefined event types
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Attributes:
 | 
					    Attributes:
 | 
				
			||||||
        PackageOutdated(EventType): (class attribute) package has been marked as out-of-date
 | 
					        PackageOutdated(EventType): package has been marked as out-of-date
 | 
				
			||||||
        PackageRemoved(EventType): (class attribute) package has been removed
 | 
					        PackageRemoved(EventType): package has been removed
 | 
				
			||||||
        PackageUpdateFailed(EventType): (class attribute) package update has been failed
 | 
					        PackageUpdateFailed(EventType): package update has been failed
 | 
				
			||||||
        PackageUpdated(EventType): (class attribute) package has been updated
 | 
					        PackageUpdated(EventType): package has been updated
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    PackageOutdated = "package-outdated"
 | 
					    PackageOutdated = "package-outdated"
 | 
				
			||||||
 | 
				
			|||||||
@ -25,9 +25,9 @@ class LogHandler(StrEnum):
 | 
				
			|||||||
    log handler as described by default configuration
 | 
					    log handler as described by default configuration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Attributes:
 | 
					    Attributes:
 | 
				
			||||||
        Console(LogHandler): (class attribute) write logs to console
 | 
					        Console(LogHandler): write logs to console
 | 
				
			||||||
        Syslog(LogHandler): (class attribute) write logs to syslog device /dev/null
 | 
					        Syslog(LogHandler): write logs to syslog device /dev/null
 | 
				
			||||||
        Journald(LogHandler): (class attribute) write logs to journald directly
 | 
					        Journald(LogHandler): write logs to journald directly
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Console = "console"
 | 
					    Console = "console"
 | 
				
			||||||
 | 
				
			|||||||
@ -32,13 +32,13 @@ class PackageSource(StrEnum):
 | 
				
			|||||||
    package source for addition enumeration
 | 
					    package source for addition enumeration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Attributes:
 | 
					    Attributes:
 | 
				
			||||||
        Auto(PackageSource): (class attribute) automatically determine type of the source
 | 
					        Auto(PackageSource): automatically determine type of the source
 | 
				
			||||||
        Archive(PackageSource): (class attribute) source is a package archive
 | 
					        Archive(PackageSource): source is a package archive
 | 
				
			||||||
        AUR(PackageSource): (class attribute) source is an AUR package for which it should search
 | 
					        AUR(PackageSource): source is an AUR package for which it should search
 | 
				
			||||||
        Directory(PackageSource): (class attribute) source is a directory which contains packages
 | 
					        Directory(PackageSource): source is a directory which contains packages
 | 
				
			||||||
        Local(PackageSource): (class attribute) source is locally stored PKGBUILD
 | 
					        Local(PackageSource): source is locally stored PKGBUILD
 | 
				
			||||||
        Remote(PackageSource): (class attribute) source is remote (http, ftp etc...) link
 | 
					        Remote(PackageSource): source is remote (http, ftp etc...) link
 | 
				
			||||||
        Repository(PackageSource): (class attribute) source is official repository
 | 
					        Repository(PackageSource): source is official repository
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Examples:
 | 
					    Examples:
 | 
				
			||||||
        In case if source is unknown the :func:`resolve()` and the source
 | 
					        In case if source is unknown the :func:`resolve()` and the source
 | 
				
			||||||
 | 
				
			|||||||
@ -25,9 +25,9 @@ class PacmanSynchronization(IntEnum):
 | 
				
			|||||||
    pacman database synchronization flag
 | 
					    pacman database synchronization flag
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Attributes:
 | 
					    Attributes:
 | 
				
			||||||
        Disabled(PacmanSynchronization): (class attribute) do not synchronize local database
 | 
					        Disabled(PacmanSynchronization): do not synchronize local database
 | 
				
			||||||
        Enabled(PacmanSynchronization): (class attribute) synchronize local database (same as pacman -Sy)
 | 
					        Enabled(PacmanSynchronization): synchronize local database (same as pacman -Sy)
 | 
				
			||||||
        Force(PacmanSynchronization): (class attribute) force synchronize local database (same as pacman -Syy)
 | 
					        Force(PacmanSynchronization): force synchronize local database (same as pacman -Syy)
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Disabled = 0
 | 
					    Disabled = 0
 | 
				
			||||||
 | 
				
			|||||||
@ -21,7 +21,7 @@ from collections.abc import Iterator, Mapping
 | 
				
			|||||||
from dataclasses import dataclass
 | 
					from dataclasses import dataclass
 | 
				
			||||||
from io import StringIO
 | 
					from io import StringIO
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from typing import Any, IO, Self
 | 
					from typing import Any, ClassVar, IO, Self
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.alpm.pkgbuild_parser import PkgbuildParser, PkgbuildToken
 | 
					from ahriman.core.alpm.pkgbuild_parser import PkgbuildParser, PkgbuildToken
 | 
				
			||||||
from ahriman.core.exceptions import EncodeError
 | 
					from ahriman.core.exceptions import EncodeError
 | 
				
			||||||
@ -40,7 +40,7 @@ class Pkgbuild(Mapping[str, Any]):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    fields: dict[str, PkgbuildPatch]
 | 
					    fields: dict[str, PkgbuildPatch]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DEFAULT_ENCODINGS = ["utf8", "latin-1"]
 | 
					    DEFAULT_ENCODINGS: ClassVar[list[str]] = ["utf8", "latin-1"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def variables(self) -> dict[str, str]:
 | 
					    def variables(self) -> dict[str, str]:
 | 
				
			||||||
 | 
				
			|||||||
@ -27,13 +27,13 @@ class ReportSettings(StrEnum):
 | 
				
			|||||||
    report targets enumeration
 | 
					    report targets enumeration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Attributes:
 | 
					    Attributes:
 | 
				
			||||||
        Disabled(ReportSettings): (class attribute) option which generates no report for testing purpose
 | 
					        Disabled(ReportSettings): option which generates no report for testing purpose
 | 
				
			||||||
        HTML(ReportSettings): (class attribute) html report generation
 | 
					        HTML(ReportSettings): html report generation
 | 
				
			||||||
        Email(ReportSettings): (class attribute) email report generation
 | 
					        Email(ReportSettings): email report generation
 | 
				
			||||||
        Console(ReportSettings): (class attribute) print result to console
 | 
					        Console(ReportSettings): print result to console
 | 
				
			||||||
        Telegram(ReportSettings): (class attribute) markdown report to telegram channel
 | 
					        Telegram(ReportSettings): markdown report to telegram channel
 | 
				
			||||||
        RSS(ReportSettings): (class attribute) RSS report generation
 | 
					        RSS(ReportSettings): RSS report generation
 | 
				
			||||||
        RemoteCall(ReportSettings): (class attribute) remote ahriman server call
 | 
					        RemoteCall(ReportSettings): remote ahriman server call
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Disabled = "disabled"  # for testing purpose
 | 
					    Disabled = "disabled"  # for testing purpose
 | 
				
			||||||
 | 
				
			|||||||
@ -20,7 +20,7 @@
 | 
				
			|||||||
from __future__ import annotations
 | 
					from __future__ import annotations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections.abc import Callable, Iterable
 | 
					from collections.abc import Callable, Iterable
 | 
				
			||||||
from typing import Any, Self
 | 
					from typing import Any, ClassVar, Self
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.package import Package
 | 
					from ahriman.models.package import Package
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -33,7 +33,7 @@ class Result:
 | 
				
			|||||||
        STATUS_PRIORITIES(list[str]): (class attribute) list of statues according to their priorities
 | 
					        STATUS_PRIORITIES(list[str]): (class attribute) list of statues according to their priorities
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    STATUS_PRIORITIES = [
 | 
					    STATUS_PRIORITIES: ClassVar[list[str]] = [
 | 
				
			||||||
        "failed",
 | 
					        "failed",
 | 
				
			||||||
        "removed",
 | 
					        "removed",
 | 
				
			||||||
        "updated",
 | 
					        "updated",
 | 
				
			||||||
 | 
				
			|||||||
@ -27,9 +27,9 @@ class SignSettings(StrEnum):
 | 
				
			|||||||
    sign targets enumeration
 | 
					    sign targets enumeration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Attributes:
 | 
					    Attributes:
 | 
				
			||||||
        Disabled(SignSettings): (class attribute) option which generates no report for testing purpose
 | 
					        Disabled(SignSettings): option which generates no report for testing purpose
 | 
				
			||||||
        Packages(SignSettings): (class attribute) sign each package
 | 
					        Packages(SignSettings): sign each package
 | 
				
			||||||
        Repository(SignSettings): (class attribute) sign repository database file
 | 
					        Repository(SignSettings): sign repository database file
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Disabled = "disabled"
 | 
					    Disabled = "disabled"
 | 
				
			||||||
 | 
				
			|||||||
@ -27,9 +27,9 @@ class SmtpSSLSettings(StrEnum):
 | 
				
			|||||||
    SMTP SSL mode enumeration
 | 
					    SMTP SSL mode enumeration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Attributes:
 | 
					    Attributes:
 | 
				
			||||||
        Disabled(SmtpSSLSettings): (class attribute) no SSL enabled
 | 
					        Disabled(SmtpSSLSettings): no SSL enabled
 | 
				
			||||||
        SSL(SmtpSSLSettings): (class attribute) use SMTP_SSL instead of normal SMTP client
 | 
					        SSL(SmtpSSLSettings): use SMTP_SSL instead of normal SMTP client
 | 
				
			||||||
        STARTTLS(SmtpSSLSettings): (class attribute) use STARTTLS in normal SMTP client
 | 
					        STARTTLS(SmtpSSLSettings): use STARTTLS in normal SMTP client
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Disabled = "disabled"
 | 
					    Disabled = "disabled"
 | 
				
			||||||
 | 
				
			|||||||
@ -27,11 +27,11 @@ class UploadSettings(StrEnum):
 | 
				
			|||||||
    remote synchronization targets enumeration
 | 
					    remote synchronization targets enumeration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Attributes:
 | 
					    Attributes:
 | 
				
			||||||
        Disabled(UploadSettings): (class attribute) no sync will be performed, required for testing purpose
 | 
					        Disabled(UploadSettings): no sync will be performed, required for testing purpose
 | 
				
			||||||
        Rsync(UploadSettings): (class attribute) sync via rsync
 | 
					        Rsync(UploadSettings): sync via rsync
 | 
				
			||||||
        S3(UploadSettings): (class attribute) sync to Amazon S3
 | 
					        S3(UploadSettings): sync to Amazon S3
 | 
				
			||||||
        GitHub(UploadSettings): (class attribute) sync to GitHub releases page
 | 
					        GitHub(UploadSettings): sync to GitHub releases page
 | 
				
			||||||
        RemoteService(UploadSettings): (class attribute) sync to another ahriman instance
 | 
					        RemoteService(UploadSettings): sync to another ahriman instance
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Disabled = "disabled"  # for testing purpose
 | 
					    Disabled = "disabled"  # for testing purpose
 | 
				
			||||||
 | 
				
			|||||||
@ -21,7 +21,7 @@ import bcrypt
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from dataclasses import dataclass, replace
 | 
					from dataclasses import dataclass, replace
 | 
				
			||||||
from secrets import token_urlsafe as generate_password
 | 
					from secrets import token_urlsafe as generate_password
 | 
				
			||||||
from typing import Self
 | 
					from typing import ClassVar, Self
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -69,7 +69,7 @@ class User:
 | 
				
			|||||||
    packager_id: str | None = None
 | 
					    packager_id: str | None = None
 | 
				
			||||||
    key: str | None = None
 | 
					    key: str | None = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SUPPORTED_ALGOS = {"$2$", "$2a$", "$2x$", "$2y$", "$2b$"}
 | 
					    SUPPORTED_ALGOS: ClassVar[set[str]] = {"$2$", "$2a$", "$2x$", "$2y$", "$2b$"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __post_init__(self) -> None:
 | 
					    def __post_init__(self) -> None:
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
 | 
				
			|||||||
@ -27,11 +27,11 @@ class UserAccess(StrEnum):
 | 
				
			|||||||
    web user access enumeration
 | 
					    web user access enumeration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Attributes:
 | 
					    Attributes:
 | 
				
			||||||
        Unauthorized(UserAccess): (class attribute) user can access specific resources which are marked as available
 | 
					        Unauthorized(UserAccess): user can access specific resources which are marked as available
 | 
				
			||||||
            without authorization (e.g. login, logout, static)
 | 
					            without authorization (e.g. login, logout, static)
 | 
				
			||||||
        Read(UserAccess): (class attribute) user can read the page
 | 
					        Read(UserAccess): user can read the page
 | 
				
			||||||
        Reporter(UserAccess): (class attribute) user can read everything and is able to perform some modifications
 | 
					        Reporter(UserAccess): user can read everything and is able to perform some modifications
 | 
				
			||||||
        Full(UserAccess): (class attribute) user has full access
 | 
					        Full(UserAccess): user has full access
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Unauthorized = "unauthorized"
 | 
					    Unauthorized = "unauthorized"
 | 
				
			||||||
 | 
				
			|||||||
@ -19,7 +19,7 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
import aiohttp_jinja2
 | 
					import aiohttp_jinja2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from typing import Any
 | 
					from typing import Any, ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.configuration import Configuration
 | 
					from ahriman.core.configuration import Configuration
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
@ -35,7 +35,7 @@ class DocsView(BaseView):
 | 
				
			|||||||
        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
					        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Unauthorized
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Unauthorized
 | 
				
			||||||
    ROUTES = ["/api-docs"]
 | 
					    ROUTES = ["/api-docs"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
 | 
				
			|||||||
@ -19,6 +19,7 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
from aiohttp.web import Response, json_response
 | 
					from aiohttp.web import Response, json_response
 | 
				
			||||||
from collections.abc import Callable
 | 
					from collections.abc import Callable
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.configuration import Configuration
 | 
					from ahriman.core.configuration import Configuration
 | 
				
			||||||
from ahriman.core.utils import partition
 | 
					from ahriman.core.utils import partition
 | 
				
			||||||
@ -35,7 +36,7 @@ class SwaggerView(BaseView):
 | 
				
			|||||||
        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
					        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Unauthorized
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Unauthorized
 | 
				
			||||||
    ROUTES = ["/api-docs/swagger.json"]
 | 
					    ROUTES = ["/api-docs/swagger.json"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
 | 
				
			|||||||
@ -20,7 +20,7 @@
 | 
				
			|||||||
from aiohttp.web import HTTPBadRequest, HTTPNotFound, Request, StreamResponse, View
 | 
					from aiohttp.web import HTTPBadRequest, HTTPNotFound, Request, StreamResponse, View
 | 
				
			||||||
from aiohttp_cors import CorsViewMixin  # type: ignore[import-untyped]
 | 
					from aiohttp_cors import CorsViewMixin  # type: ignore[import-untyped]
 | 
				
			||||||
from collections.abc import Awaitable, Callable
 | 
					from collections.abc import Awaitable, Callable
 | 
				
			||||||
from typing import TypeVar
 | 
					from typing import ClassVar, TypeVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.auth import Auth
 | 
					from ahriman.core.auth import Auth
 | 
				
			||||||
from ahriman.core.configuration import Configuration
 | 
					from ahriman.core.configuration import Configuration
 | 
				
			||||||
@ -46,8 +46,8 @@ class BaseView(View, CorsViewMixin):
 | 
				
			|||||||
        ROUTES(list[str]): (class attribute) list of supported routes
 | 
					        ROUTES(list[str]): (class attribute) list of supported routes
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    OPTIONS_PERMISSION = UserAccess.Unauthorized
 | 
					    OPTIONS_PERMISSION: ClassVar[UserAccess] = UserAccess.Unauthorized
 | 
				
			||||||
    ROUTES: list[str] = []
 | 
					    ROUTES: ClassVar[list[str]] = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def configuration(self) -> Configuration:
 | 
					    def configuration(self) -> Configuration:
 | 
				
			||||||
 | 
				
			|||||||
@ -19,7 +19,7 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
import aiohttp_jinja2
 | 
					import aiohttp_jinja2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from typing import Any
 | 
					from typing import Any, ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.auth.helpers import authorized_userid
 | 
					from ahriman.core.auth.helpers import authorized_userid
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
@ -48,7 +48,7 @@ class IndexView(BaseView):
 | 
				
			|||||||
        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
					        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Unauthorized
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Unauthorized
 | 
				
			||||||
    ROUTES = ["/", "/index.html"]
 | 
					    ROUTES = ["/", "/index.html"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @aiohttp_jinja2.template("build-status.jinja2")
 | 
					    @aiohttp_jinja2.template("build-status.jinja2")
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPFound, HTTPNotFound
 | 
					from aiohttp.web import HTTPFound, HTTPNotFound
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
from ahriman.web.views.base import BaseView
 | 
					from ahriman.web.views.base import BaseView
 | 
				
			||||||
@ -31,7 +32,7 @@ class StaticView(BaseView):
 | 
				
			|||||||
        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
					        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Unauthorized
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Unauthorized
 | 
				
			||||||
    ROUTES = ["/favicon.ico"]
 | 
					    ROUTES = ["/favicon.ico"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async def get(self) -> None:
 | 
					    async def get(self) -> None:
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,8 @@
 | 
				
			|||||||
# 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 typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.configuration import Configuration
 | 
					from ahriman.core.configuration import Configuration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -25,7 +27,7 @@ class StatusViewGuard:
 | 
				
			|||||||
    helper for check if status routes are enabled
 | 
					    helper for check if status routes are enabled
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ROUTES: list[str]
 | 
					    ROUTES: ClassVar[list[str]]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def routes(cls, configuration: Configuration) -> list[str]:
 | 
					    def routes(cls, configuration: Configuration) -> list[str]:
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPBadRequest, HTTPNoContent, Response, json_response
 | 
					from aiohttp.web import HTTPBadRequest, HTTPNoContent, Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.event import Event
 | 
					from ahriman.models.event import Event
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
@ -35,7 +36,7 @@ class EventsView(BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GET_PERMISSION = POST_PERMISSION = UserAccess.Full
 | 
					    GET_PERMISSION = POST_PERMISSION = UserAccess.Full  # type: ClassVar[UserAccess]
 | 
				
			||||||
    ROUTES = ["/api/v1/events"]
 | 
					    ROUTES = ["/api/v1/events"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -19,6 +19,7 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
from aiohttp.web import HTTPBadRequest, HTTPNoContent, Response, json_response
 | 
					from aiohttp.web import HTTPBadRequest, HTTPNoContent, Response, json_response
 | 
				
			||||||
from collections.abc import Callable
 | 
					from collections.abc import Callable
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
from ahriman.models.worker import Worker
 | 
					from ahriman.models.worker import Worker
 | 
				
			||||||
@ -37,7 +38,7 @@ class WorkersView(BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DELETE_PERMISSION = GET_PERMISSION = POST_PERMISSION = UserAccess.Full
 | 
					    DELETE_PERMISSION = GET_PERMISSION = POST_PERMISSION = UserAccess.Full  # type: ClassVar[UserAccess]
 | 
				
			||||||
    ROUTES = ["/api/v1/distributed"]
 | 
					    ROUTES = ["/api/v1/distributed"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPBadRequest, HTTPNoContent, Response, json_response
 | 
					from aiohttp.web import HTTPBadRequest, HTTPNoContent, Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.changes import Changes
 | 
					from ahriman.models.changes import Changes
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
@ -36,8 +37,8 @@ class ChangesView(StatusViewGuard, BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Reporter
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Reporter
 | 
				
			||||||
    POST_PERMISSION = UserAccess.Full
 | 
					    POST_PERMISSION: ClassVar[UserAccess] = UserAccess.Full
 | 
				
			||||||
    ROUTES = ["/api/v1/packages/{package}/changes"]
 | 
					    ROUTES = ["/api/v1/packages/{package}/changes"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPBadRequest, HTTPNoContent, Response, json_response
 | 
					from aiohttp.web import HTTPBadRequest, HTTPNoContent, Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.dependencies import Dependencies
 | 
					from ahriman.models.dependencies import Dependencies
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
@ -36,8 +37,8 @@ class DependenciesView(StatusViewGuard, BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Reporter
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Reporter
 | 
				
			||||||
    POST_PERMISSION = UserAccess.Full
 | 
					    POST_PERMISSION: ClassVar[UserAccess] = UserAccess.Full
 | 
				
			||||||
    ROUTES = ["/api/v1/packages/{package}/dependencies"]
 | 
					    ROUTES = ["/api/v1/packages/{package}/dependencies"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPBadRequest, HTTPNoContent, HTTPNotFound, Response, json_response
 | 
					from aiohttp.web import HTTPBadRequest, HTTPNoContent, HTTPNotFound, Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.exceptions import UnknownPackageError
 | 
					from ahriman.core.exceptions import UnknownPackageError
 | 
				
			||||||
from ahriman.core.utils import pretty_datetime
 | 
					from ahriman.core.utils import pretty_datetime
 | 
				
			||||||
@ -39,8 +40,8 @@ class LogsView(StatusViewGuard, BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DELETE_PERMISSION = POST_PERMISSION = UserAccess.Full
 | 
					    DELETE_PERMISSION = POST_PERMISSION = UserAccess.Full  # type: ClassVar[UserAccess]
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Reporter
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Reporter
 | 
				
			||||||
    ROUTES = ["/api/v1/packages/{package}/logs"]
 | 
					    ROUTES = ["/api/v1/packages/{package}/logs"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPBadRequest, HTTPNoContent, HTTPNotFound, Response, json_response
 | 
					from aiohttp.web import HTTPBadRequest, HTTPNoContent, HTTPNotFound, Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.exceptions import UnknownPackageError
 | 
					from ahriman.core.exceptions import UnknownPackageError
 | 
				
			||||||
from ahriman.models.build_status import BuildStatusEnum
 | 
					from ahriman.models.build_status import BuildStatusEnum
 | 
				
			||||||
@ -40,8 +41,8 @@ class PackageView(StatusViewGuard, BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DELETE_PERMISSION = POST_PERMISSION = UserAccess.Full
 | 
					    DELETE_PERMISSION = POST_PERMISSION = UserAccess.Full  # type: ClassVar[UserAccess]
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Read
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Read
 | 
				
			||||||
    ROUTES = ["/api/v1/packages/{package}"]
 | 
					    ROUTES = ["/api/v1/packages/{package}"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -21,6 +21,7 @@ import itertools
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from aiohttp.web import HTTPNoContent, Response, json_response
 | 
					from aiohttp.web import HTTPNoContent, Response, json_response
 | 
				
			||||||
from collections.abc import Callable
 | 
					from collections.abc import Callable
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.build_status import BuildStatus
 | 
					from ahriman.models.build_status import BuildStatus
 | 
				
			||||||
from ahriman.models.package import Package
 | 
					from ahriman.models.package import Package
 | 
				
			||||||
@ -40,8 +41,8 @@ class PackagesView(StatusViewGuard, BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Read
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Read
 | 
				
			||||||
    POST_PERMISSION = UserAccess.Full
 | 
					    POST_PERMISSION: ClassVar[UserAccess] = UserAccess.Full
 | 
				
			||||||
    ROUTES = ["/api/v1/packages"]
 | 
					    ROUTES = ["/api/v1/packages"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPNoContent, HTTPNotFound, Response, json_response
 | 
					from aiohttp.web import HTTPNoContent, HTTPNotFound, Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
from ahriman.web.apispec.decorators import apidocs
 | 
					from ahriman.web.apispec.decorators import apidocs
 | 
				
			||||||
@ -35,8 +36,8 @@ class PatchView(StatusViewGuard, BaseView):
 | 
				
			|||||||
        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
					        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DELETE_PERMISSION = UserAccess.Full
 | 
					    DELETE_PERMISSION: ClassVar[UserAccess] = UserAccess.Full
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Reporter
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Reporter
 | 
				
			||||||
    ROUTES = ["/api/v1/packages/{package}/patches/{patch}"]
 | 
					    ROUTES = ["/api/v1/packages/{package}/patches/{patch}"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPBadRequest, HTTPNoContent, Response, json_response
 | 
					from aiohttp.web import HTTPBadRequest, HTTPNoContent, Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.pkgbuild_patch import PkgbuildPatch
 | 
					from ahriman.models.pkgbuild_patch import PkgbuildPatch
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
@ -36,8 +37,8 @@ class PatchesView(StatusViewGuard, BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Reporter
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Reporter
 | 
				
			||||||
    POST_PERMISSION = UserAccess.Full
 | 
					    POST_PERMISSION: ClassVar[UserAccess] = UserAccess.Full
 | 
				
			||||||
    ROUTES = ["/api/v1/packages/{package}/patches"]
 | 
					    ROUTES = ["/api/v1/packages/{package}/patches"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPBadRequest, Response, json_response
 | 
					from aiohttp.web import HTTPBadRequest, Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.pkgbuild_patch import PkgbuildPatch
 | 
					from ahriman.models.pkgbuild_patch import PkgbuildPatch
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
@ -34,7 +35,7 @@ class AddView(BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    POST_PERMISSION = UserAccess.Full
 | 
					    POST_PERMISSION: ClassVar[UserAccess] = UserAccess.Full
 | 
				
			||||||
    ROUTES = ["/api/v1/service/add"]
 | 
					    ROUTES = ["/api/v1/service/add"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPBadRequest, HTTPNoContent
 | 
					from aiohttp.web import HTTPBadRequest, HTTPNoContent
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
from ahriman.web.apispec.decorators import apidocs
 | 
					from ahriman.web.apispec.decorators import apidocs
 | 
				
			||||||
@ -33,7 +34,7 @@ class LogsView(BaseView):
 | 
				
			|||||||
        DELETE_PERMISSION(UserAccess): (class attribute) delete permissions of self
 | 
					        DELETE_PERMISSION(UserAccess): (class attribute) delete permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DELETE_PERMISSION = UserAccess.Full
 | 
					    DELETE_PERMISSION: ClassVar[UserAccess] = UserAccess.Full
 | 
				
			||||||
    ROUTES = ["/api/v1/service/logs"]
 | 
					    ROUTES = ["/api/v1/service/logs"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPBadRequest, HTTPNotFound, Response, json_response
 | 
					from aiohttp.web import HTTPBadRequest, HTTPNotFound, Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
from ahriman.web.apispec.decorators import apidocs
 | 
					from ahriman.web.apispec.decorators import apidocs
 | 
				
			||||||
@ -34,8 +35,8 @@ class PGPView(BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Reporter
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Reporter
 | 
				
			||||||
    POST_PERMISSION = UserAccess.Full
 | 
					    POST_PERMISSION: ClassVar[UserAccess] = UserAccess.Full
 | 
				
			||||||
    ROUTES = ["/api/v1/service/pgp"]
 | 
					    ROUTES = ["/api/v1/service/pgp"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPNotFound, Response, json_response
 | 
					from aiohttp.web import HTTPNotFound, Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
from ahriman.web.apispec.decorators import apidocs
 | 
					from ahriman.web.apispec.decorators import apidocs
 | 
				
			||||||
@ -33,7 +34,7 @@ class ProcessView(BaseView):
 | 
				
			|||||||
        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
					        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Reporter
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Reporter
 | 
				
			||||||
    ROUTES = ["/api/v1/service/process/{process_id}"]
 | 
					    ROUTES = ["/api/v1/service/process/{process_id}"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPBadRequest, Response, json_response
 | 
					from aiohttp.web import HTTPBadRequest, Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
from ahriman.web.apispec.decorators import apidocs
 | 
					from ahriman.web.apispec.decorators import apidocs
 | 
				
			||||||
@ -33,7 +34,7 @@ class RebuildView(BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    POST_PERMISSION = UserAccess.Full
 | 
					    POST_PERMISSION: ClassVar[UserAccess] = UserAccess.Full
 | 
				
			||||||
    ROUTES = ["/api/v1/service/rebuild"]
 | 
					    ROUTES = ["/api/v1/service/rebuild"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPBadRequest, Response, json_response
 | 
					from aiohttp.web import HTTPBadRequest, Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
from ahriman.web.apispec.decorators import apidocs
 | 
					from ahriman.web.apispec.decorators import apidocs
 | 
				
			||||||
@ -33,7 +34,7 @@ class RemoveView(BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    POST_PERMISSION = UserAccess.Full
 | 
					    POST_PERMISSION: ClassVar[UserAccess] = UserAccess.Full
 | 
				
			||||||
    ROUTES = ["/api/v1/service/remove"]
 | 
					    ROUTES = ["/api/v1/service/remove"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPBadRequest, Response, json_response
 | 
					from aiohttp.web import HTTPBadRequest, Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.pkgbuild_patch import PkgbuildPatch
 | 
					from ahriman.models.pkgbuild_patch import PkgbuildPatch
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
@ -34,7 +35,7 @@ class RequestView(BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    POST_PERMISSION = UserAccess.Reporter
 | 
					    POST_PERMISSION: ClassVar[UserAccess] = UserAccess.Reporter
 | 
				
			||||||
    ROUTES = ["/api/v1/service/request"]
 | 
					    ROUTES = ["/api/v1/service/request"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -19,6 +19,7 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
from aiohttp.web import HTTPBadRequest, HTTPNotFound, Response, json_response
 | 
					from aiohttp.web import HTTPBadRequest, HTTPNotFound, Response, json_response
 | 
				
			||||||
from collections.abc import Callable
 | 
					from collections.abc import Callable
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.alpm.remote import AUR
 | 
					from ahriman.core.alpm.remote import AUR
 | 
				
			||||||
from ahriman.models.aur_package import AURPackage
 | 
					from ahriman.models.aur_package import AURPackage
 | 
				
			||||||
@ -36,7 +37,7 @@ class SearchView(BaseView):
 | 
				
			|||||||
        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
					        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Reporter
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Reporter
 | 
				
			||||||
    ROUTES = ["/api/v1/service/search"]
 | 
					    ROUTES = ["/api/v1/service/search"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPBadRequest, Response, json_response
 | 
					from aiohttp.web import HTTPBadRequest, Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
from ahriman.web.apispec.decorators import apidocs
 | 
					from ahriman.web.apispec.decorators import apidocs
 | 
				
			||||||
@ -33,7 +34,7 @@ class UpdateView(BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    POST_PERMISSION = UserAccess.Full
 | 
					    POST_PERMISSION: ClassVar[UserAccess] = UserAccess.Full
 | 
				
			||||||
    ROUTES = ["/api/v1/service/update"]
 | 
					    ROUTES = ["/api/v1/service/update"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -23,6 +23,7 @@ from aiohttp import BodyPartReader
 | 
				
			|||||||
from aiohttp.web import HTTPBadRequest, HTTPCreated
 | 
					from aiohttp.web import HTTPBadRequest, HTTPCreated
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from tempfile import NamedTemporaryFile
 | 
					from tempfile import NamedTemporaryFile
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.configuration import Configuration
 | 
					from ahriman.core.configuration import Configuration
 | 
				
			||||||
from ahriman.models.repository_paths import RepositoryPaths
 | 
					from ahriman.models.repository_paths import RepositoryPaths
 | 
				
			||||||
@ -40,7 +41,7 @@ class UploadView(BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    POST_PERMISSION = UserAccess.Full
 | 
					    POST_PERMISSION: ClassVar[UserAccess] = UserAccess.Full
 | 
				
			||||||
    ROUTES = ["/api/v1/service/upload"]
 | 
					    ROUTES = ["/api/v1/service/upload"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import Response, json_response
 | 
					from aiohttp.web import Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman import __version__
 | 
					from ahriman import __version__
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
@ -34,7 +35,7 @@ class InfoView(BaseView):
 | 
				
			|||||||
        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
					        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Unauthorized
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Unauthorized
 | 
				
			||||||
    ROUTES = ["/api/v1/info"]
 | 
					    ROUTES = ["/api/v1/info"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import Response, json_response
 | 
					from aiohttp.web import Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
from ahriman.web.apispec.decorators import apidocs
 | 
					from ahriman.web.apispec.decorators import apidocs
 | 
				
			||||||
@ -33,7 +34,7 @@ class RepositoriesView(BaseView):
 | 
				
			|||||||
        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
					        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Read
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Read
 | 
				
			||||||
    ROUTES = ["/api/v1/repositories"]
 | 
					    ROUTES = ["/api/v1/repositories"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPBadRequest, HTTPNoContent, Response, json_response
 | 
					from aiohttp.web import HTTPBadRequest, HTTPNoContent, Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman import __version__
 | 
					from ahriman import __version__
 | 
				
			||||||
from ahriman.models.build_status import BuildStatusEnum
 | 
					from ahriman.models.build_status import BuildStatusEnum
 | 
				
			||||||
@ -40,8 +41,8 @@ class StatusView(StatusViewGuard, BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Read
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Read
 | 
				
			||||||
    POST_PERMISSION = UserAccess.Full
 | 
					    POST_PERMISSION: ClassVar[UserAccess] = UserAccess.Full
 | 
				
			||||||
    ROUTES = ["/api/v1/status"]
 | 
					    ROUTES = ["/api/v1/status"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPBadRequest, HTTPFound, HTTPMethodNotAllowed, HTTPUnauthorized
 | 
					from aiohttp.web import HTTPBadRequest, HTTPFound, HTTPMethodNotAllowed, HTTPUnauthorized
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.auth.helpers import remember
 | 
					from ahriman.core.auth.helpers import remember
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
@ -35,7 +36,7 @@ class LoginView(BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GET_PERMISSION = POST_PERMISSION = UserAccess.Unauthorized
 | 
					    GET_PERMISSION = POST_PERMISSION = UserAccess.Unauthorized  # type: ClassVar[UserAccess]
 | 
				
			||||||
    ROUTES = ["/api/v1/login"]
 | 
					    ROUTES = ["/api/v1/login"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import HTTPFound, HTTPUnauthorized
 | 
					from aiohttp.web import HTTPFound, HTTPUnauthorized
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.core.auth.helpers import check_authorized, forget
 | 
					from ahriman.core.auth.helpers import check_authorized, forget
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
@ -33,7 +34,7 @@ class LogoutView(BaseView):
 | 
				
			|||||||
        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
					        POST_PERMISSION(UserAccess): (class attribute) post permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    POST_PERMISSION = UserAccess.Unauthorized
 | 
					    POST_PERMISSION: ClassVar[UserAccess] = UserAccess.Unauthorized
 | 
				
			||||||
    ROUTES = ["/api/v1/logout"]
 | 
					    ROUTES = ["/api/v1/logout"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
# 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 aiohttp.web import Response, json_response
 | 
					from aiohttp.web import Response, json_response
 | 
				
			||||||
 | 
					from typing import ClassVar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ahriman.models.user_access import UserAccess
 | 
					from ahriman.models.user_access import UserAccess
 | 
				
			||||||
from ahriman.web.apispec.decorators import apidocs
 | 
					from ahriman.web.apispec.decorators import apidocs
 | 
				
			||||||
@ -34,7 +35,7 @@ class LogsView(StatusViewGuard, BaseView):
 | 
				
			|||||||
        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
					        GET_PERMISSION(UserAccess): (class attribute) get permissions of self
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GET_PERMISSION = UserAccess.Reporter
 | 
					    GET_PERMISSION: ClassVar[UserAccess] = UserAccess.Reporter
 | 
				
			||||||
    ROUTES = ["/api/v2/packages/{package}/logs"]
 | 
					    ROUTES = ["/api/v2/packages/{package}/logs"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @apidocs(
 | 
					    @apidocs(
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user