diff --git a/.pylintrc b/.pylintrc
index 9ce72fd9..b19c2614 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -83,6 +83,7 @@ limit-inference-results=100
# usually to register additional checkers.
load-plugins=pylint.extensions.docparams,
definition_order,
+ import_order,
# Pickle collected data for later comparisons.
persistent=yes
diff --git a/pylint_plugins/definition_order.py b/pylint_plugins/definition_order.py
index 2c56183d..e86685e5 100644
--- a/pylint_plugins/definition_order.py
+++ b/pylint_plugins/definition_order.py
@@ -25,19 +25,19 @@ from pylint.lint import PyLinter
from typing import Any
-class MethodTypeOrder(StrEnum):
+class MethodType(StrEnum):
"""
method type enumeration
Attributes:
- Class(MethodTypeOrder): (class attribute) class method
- Delete(MethodTypeOrder): (class attribute) destructor-like methods
- Init(MethodTypeOrder): (class attribute) initialization method
- Magic(MethodTypeOrder): (class attribute) other magical methods
- New(MethodTypeOrder): (class attribute) constructor method
- Normal(MethodTypeOrder): (class attribute) usual method
- Property(MethodTypeOrder): (class attribute) property method
- Static(MethodTypeOrder): (class attribute) static method
+ Class(MethodType): (class attribute) class method
+ Delete(MethodType): (class attribute) destructor-like methods
+ Init(MethodType): (class attribute) initialization method
+ Magic(MethodType): (class attribute) other magical methods
+ New(MethodType): (class attribute) constructor method
+ Normal(MethodType): (class attribute) usual method
+ Property(MethodType): (class attribute) property method
+ Static(MethodType): (class attribute) static method
"""
Class = "classmethod"
@@ -59,20 +59,20 @@ class DefinitionOrder(BaseRawFileChecker):
"""
DECORATED_METHODS_ORDER = {
- "cached_property": MethodTypeOrder.Property,
- "classmethod": MethodTypeOrder.Class,
- "property": MethodTypeOrder.Property,
- "staticmethod": MethodTypeOrder.Static,
+ "cached_property": MethodType.Property,
+ "classmethod": MethodType.Class,
+ "property": MethodType.Property,
+ "staticmethod": MethodType.Static,
}
- name = "method-ordering"
msgs = {
"W6001": (
"Invalid method order %s, expected %s",
"methods-out-of-order",
"Methods are defined out of recommended order.",
- )
+ ),
}
+ name = "method-ordering"
options = (
(
"method-type-order",
@@ -114,7 +114,7 @@ class DefinitionOrder(BaseRawFileChecker):
return list(filter(is_defined_function, source))
@staticmethod
- def resolve_type(function: nodes.FunctionDef) -> MethodTypeOrder:
+ def resolve_type(function: nodes.FunctionDef) -> MethodType:
"""
resolve type of the function
@@ -122,15 +122,15 @@ class DefinitionOrder(BaseRawFileChecker):
function(nodes.FunctionDef): function definition
Returns:
- MethodTypeOrder: resolved function type
+ MethodType: resolved function type
"""
# init methods
if function.name in ("__init__", "__post_init__"):
- return MethodTypeOrder.Init
+ return MethodType.Init
if function.name in ("__new__",):
- return MethodTypeOrder.New
+ return MethodType.New
if function.name in ("__del__",):
- return MethodTypeOrder.Delete
+ return MethodType.Delete
# decorated methods
decorators = []
@@ -142,10 +142,10 @@ class DefinitionOrder(BaseRawFileChecker):
# magic methods
if function.name.startswith("__") and function.name.endswith("__"):
- return MethodTypeOrder.Magic
+ return MethodType.Magic
# normal method
- return MethodTypeOrder.Normal
+ return MethodType.Normal
def check_class(self, clazz: nodes.ClassDef) -> None:
"""
@@ -184,7 +184,7 @@ class DefinitionOrder(BaseRawFileChecker):
try:
function_type_index = self.linter.config.method_type_order.index(function_type)
except ValueError:
- function_type_index = 10 # not in the list
+ function_type_index = len(self.linter.config.method_type_order) # not in the list
return function_type_index, function.name
diff --git a/pylint_plugins/import_order.py b/pylint_plugins/import_order.py
new file mode 100644
index 00000000..06bfd622
--- /dev/null
+++ b/pylint_plugins/import_order.py
@@ -0,0 +1,196 @@
+#
+# Copyright (c) 2021-2023 ahriman team.
+#
+# This file is part of ahriman
+# (see https://github.com/arcan1s/ahriman).
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+from astroid import nodes
+from collections.abc import Iterable
+from enum import StrEnum
+from pylint.checkers import BaseRawFileChecker
+from pylint.lint import PyLinter
+from typing import Any
+
+
+class ImportType(StrEnum):
+ """
+ import type enumeration
+
+ Attributes:
+ Package(MethodTypeOrder): (class attribute) package import
+ PackageFrom(MethodTypeOrder): (class attribute) package import, from clause
+ System(ImportType): (class attribute) system installed packages
+ SystemFrom(MethodTypeOrder): (class attribute) system installed packages, from clause
+ """
+
+ Package = "package"
+ PackageFrom = "package-from"
+ System = "system"
+ SystemFrom = "system-from"
+
+
+class ImportOrder(BaseRawFileChecker):
+ """
+ check if imports are defined in recommended order
+ """
+
+ msgs = {
+ "W6002": (
+ "Invalid import order %s, expected before %s",
+ "imports-out-of-order",
+ "Imports are defined out of recommended order.",
+ ),
+ "W6003": (
+ "Import contains more than one package: %s",
+ "multiple-package-imports",
+ "Multiple package imports are not allowed.",
+ ),
+ "W6004": (
+ "Invalid from import order %s, expected %s",
+ "from-imports-out-of-order",
+ "From imports are defined out of recommended order.",
+ ),
+ }
+ name = "import-ordering"
+ options = (
+ (
+ "import-type-order",
+ {
+ "default": [
+ "system",
+ "system-from",
+ "package",
+ "package-from",
+ ],
+ "type": "csv",
+ "metavar": "",
+ "help": "Import types order to check.",
+ },
+ ),
+ (
+ "root-module",
+ {
+ "default": "ahriman",
+ "type": "string",
+ "help": "Root module name",
+ }
+ )
+ )
+
+ @staticmethod
+ def imports(source: Iterable[Any], start_lineno: int = 0) -> list[nodes.Import | nodes.ImportFrom]:
+ """
+ extract import nodes from list of raw nodes
+
+ Args:
+ source(Iterable[Any]): all available nodes
+ start_lineno(int, optional): minimal allowed line number (Default value = 0)
+
+ Returns:
+ list[nodes.Import | nodes.ImportFrom]: list of import nodes
+ """
+
+ def is_defined_import(imports: Any) -> bool:
+ return isinstance(imports, (nodes.Import, nodes.ImportFrom)) \
+ and imports.lineno is not None \
+ and imports.lineno >= start_lineno
+
+ return list(filter(is_defined_import, source))
+
+ def check_from_imports(self, imports: nodes.ImportFrom) -> None:
+ """
+ check import from statement
+
+ Args:
+ imports(nodes.ImportFrom): import from node
+ """
+ imported = [names for names, _ in imports.names]
+ for real, expected in zip(imported, sorted(imported)):
+ if real == expected:
+ continue
+ self.add_message("from-imports-out-of-order", line=imports.lineno, args=(real, expected))
+ break
+
+ def check_imports(self, imports: list[nodes.Import | nodes.ImportFrom], root_package: str) -> None:
+ """
+ check imports
+
+ Args:
+ imports(list[nodes.Import | nodes.ImportFrom]): list of imports in their defined order
+ root_package(str): root package name
+ """
+ last_statement: tuple[int, str] | None = None
+
+ for statement in imports:
+ # define types and perform specific checks
+ if isinstance(statement, nodes.ImportFrom):
+ import_name = statement.modname
+ root, *_ = import_name.split(".", maxsplit=1)
+ import_type = ImportType.PackageFrom if root_package == root else ImportType.SystemFrom
+ # check from import itself
+ self.check_from_imports(statement)
+ else:
+ import_name = next(name for name, _ in statement.names)
+ root, *_ = import_name.split(".", maxsplit=1)[0]
+ import_type = ImportType.Package if root_package == root else ImportType.System
+ # check import itself
+ self.check_package_imports(statement)
+
+ # extract index
+ try:
+ import_type_index = self.linter.config.import_type_order.index(import_type)
+ except ValueError:
+ import_type_index = len(self.linter.config.import_type_order)
+
+ # check ordering if possible
+ if last_statement is not None:
+ _, last_statement_name = last_statement
+ if last_statement > (import_type_index, import_name):
+ self.add_message("imports-out-of-order", line=statement.lineno,
+ args=(import_name, last_statement_name))
+
+ # update the last value
+ last_statement = import_type_index, import_name
+
+ def check_package_imports(self, imports: nodes.Import) -> None:
+ """
+ check package import
+
+ Args:
+ imports(nodes.Import): package import node
+ """
+ if len(imports.names) != 1:
+ self.add_message("multiple-package-imports", line=imports.lineno, args=(imports.names,))
+
+ def process_module(self, node: nodes.Module) -> None:
+ """
+ process module
+
+ Args:
+ node(nodes.Module): module node to check
+ """
+ root_module, *_ = node.qname().split(".")
+ self.check_imports(self.imports(node.values()), root_module)
+
+
+def register(linter: PyLinter) -> None:
+ """
+ register custom checker
+
+ Args:
+ linter(PyLinter): linter in which checker should be registered
+ """
+ linter.register_checker(ImportOrder(linter))
diff --git a/src/ahriman/application/handlers/__init__.py b/src/ahriman/application/handlers/__init__.py
index b207689f..0c731648 100644
--- a/src/ahriman/application/handlers/__init__.py
+++ b/src/ahriman/application/handlers/__init__.py
@@ -17,14 +17,13 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
-from ahriman.application.handlers.handler import Handler
-
from ahriman.application.handlers.add import Add
from ahriman.application.handlers.backup import Backup
from ahriman.application.handlers.change import Change
from ahriman.application.handlers.clean import Clean
from ahriman.application.handlers.daemon import Daemon
from ahriman.application.handlers.dump import Dump
+from ahriman.application.handlers.handler import Handler
from ahriman.application.handlers.help import Help
from ahriman.application.handlers.key_import import KeyImport
from ahriman.application.handlers.patch import Patch
diff --git a/src/ahriman/application/handlers/add.py b/src/ahriman/application/handlers/add.py
index 002353e1..0c687028 100644
--- a/src/ahriman/application/handlers/add.py
+++ b/src/ahriman/application/handlers/add.py
@@ -20,7 +20,7 @@
import argparse
from ahriman.application.application import Application
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.models.packagers import Packagers
from ahriman.models.pkgbuild_patch import PkgbuildPatch
diff --git a/src/ahriman/application/handlers/backup.py b/src/ahriman/application/handlers/backup.py
index 7c3b9f4a..b0e4a1d9 100644
--- a/src/ahriman/application/handlers/backup.py
+++ b/src/ahriman/application/handlers/backup.py
@@ -23,7 +23,7 @@ import pwd
from pathlib import Path
from tarfile import TarFile
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.core.database import SQLite
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/change.py b/src/ahriman/application/handlers/change.py
index efa6cefc..cac737ea 100644
--- a/src/ahriman/application/handlers/change.py
+++ b/src/ahriman/application/handlers/change.py
@@ -20,7 +20,7 @@
import argparse
from ahriman.application.application import Application
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.core.formatters import ChangesPrinter
from ahriman.models.action import Action
diff --git a/src/ahriman/application/handlers/clean.py b/src/ahriman/application/handlers/clean.py
index 75c52509..49b7a56c 100644
--- a/src/ahriman/application/handlers/clean.py
+++ b/src/ahriman/application/handlers/clean.py
@@ -20,7 +20,7 @@
import argparse
from ahriman.application.application import Application
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/daemon.py b/src/ahriman/application/handlers/daemon.py
index f16c3d68..4979ab4c 100644
--- a/src/ahriman/application/handlers/daemon.py
+++ b/src/ahriman/application/handlers/daemon.py
@@ -21,7 +21,7 @@ import argparse
from ahriman.application.application import Application
from ahriman.application.application.updates_iterator import FixedUpdatesIterator, UpdatesIterator
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.application.handlers.update import Update
from ahriman.core.configuration import Configuration
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/dump.py b/src/ahriman/application/handlers/dump.py
index 1c2ce799..1226d6fc 100644
--- a/src/ahriman/application/handlers/dump.py
+++ b/src/ahriman/application/handlers/dump.py
@@ -19,7 +19,7 @@
#
import argparse
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.core.formatters import ConfigurationPathsPrinter, ConfigurationPrinter, StringPrinter
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/help.py b/src/ahriman/application/handlers/help.py
index 839b9137..793564ae 100644
--- a/src/ahriman/application/handlers/help.py
+++ b/src/ahriman/application/handlers/help.py
@@ -19,7 +19,7 @@
#
import argparse
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/key_import.py b/src/ahriman/application/handlers/key_import.py
index c8746e6d..16ae8001 100644
--- a/src/ahriman/application/handlers/key_import.py
+++ b/src/ahriman/application/handlers/key_import.py
@@ -20,7 +20,7 @@
import argparse
from ahriman.application.application import Application
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/patch.py b/src/ahriman/application/handlers/patch.py
index 6400c2f4..220a97e4 100644
--- a/src/ahriman/application/handlers/patch.py
+++ b/src/ahriman/application/handlers/patch.py
@@ -23,7 +23,7 @@ import sys
from pathlib import Path
from ahriman.application.application import Application
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.build_tools.sources import Sources
from ahriman.core.configuration import Configuration
from ahriman.core.formatters import PatchPrinter
diff --git a/src/ahriman/application/handlers/rebuild.py b/src/ahriman/application/handlers/rebuild.py
index f0df1465..5313c5b0 100644
--- a/src/ahriman/application/handlers/rebuild.py
+++ b/src/ahriman/application/handlers/rebuild.py
@@ -20,7 +20,7 @@
import argparse
from ahriman.application.application import Application
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.models.build_status import BuildStatusEnum
from ahriman.models.package import Package
diff --git a/src/ahriman/application/handlers/remove.py b/src/ahriman/application/handlers/remove.py
index 263cb53d..033f34ca 100644
--- a/src/ahriman/application/handlers/remove.py
+++ b/src/ahriman/application/handlers/remove.py
@@ -20,7 +20,7 @@
import argparse
from ahriman.application.application import Application
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/remove_unknown.py b/src/ahriman/application/handlers/remove_unknown.py
index cf5e9747..d062416e 100644
--- a/src/ahriman/application/handlers/remove_unknown.py
+++ b/src/ahriman/application/handlers/remove_unknown.py
@@ -20,7 +20,7 @@
import argparse
from ahriman.application.application import Application
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.core.formatters import StringPrinter
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/repositories.py b/src/ahriman/application/handlers/repositories.py
index 2460ec94..049d777e 100644
--- a/src/ahriman/application/handlers/repositories.py
+++ b/src/ahriman/application/handlers/repositories.py
@@ -19,7 +19,7 @@
#
import argparse
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.core.formatters import RepositoryPrinter
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/restore.py b/src/ahriman/application/handlers/restore.py
index 6bd33391..6f07cd71 100644
--- a/src/ahriman/application/handlers/restore.py
+++ b/src/ahriman/application/handlers/restore.py
@@ -21,7 +21,7 @@ import argparse
from tarfile import TarFile
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/run.py b/src/ahriman/application/handlers/run.py
index 49d90424..13108318 100644
--- a/src/ahriman/application/handlers/run.py
+++ b/src/ahriman/application/handlers/run.py
@@ -20,7 +20,7 @@
import argparse
import shlex
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/search.py b/src/ahriman/application/handlers/search.py
index 4eab6823..c3fab7a2 100644
--- a/src/ahriman/application/handlers/search.py
+++ b/src/ahriman/application/handlers/search.py
@@ -19,10 +19,10 @@
#
import argparse
-from dataclasses import fields
from collections.abc import Callable, Iterable
+from dataclasses import fields
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.alpm.remote import AUR, Official
from ahriman.core.configuration import Configuration
from ahriman.core.exceptions import OptionError
diff --git a/src/ahriman/application/handlers/service_updates.py b/src/ahriman/application/handlers/service_updates.py
index 8956ec14..1d608462 100644
--- a/src/ahriman/application/handlers/service_updates.py
+++ b/src/ahriman/application/handlers/service_updates.py
@@ -20,7 +20,7 @@
import argparse
from ahriman import __version__
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.core.formatters import UpdatePrinter
from ahriman.models.package import Package
diff --git a/src/ahriman/application/handlers/setup.py b/src/ahriman/application/handlers/setup.py
index 469505d4..2d61982c 100644
--- a/src/ahriman/application/handlers/setup.py
+++ b/src/ahriman/application/handlers/setup.py
@@ -24,7 +24,7 @@ from pwd import getpwuid
from urllib.parse import quote_plus as urlencode
from ahriman.application.application import Application
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.core.exceptions import MissingArchitectureError
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/shell.py b/src/ahriman/application/handlers/shell.py
index c52b2f87..c7ae94c6 100644
--- a/src/ahriman/application/handlers/shell.py
+++ b/src/ahriman/application/handlers/shell.py
@@ -23,7 +23,7 @@ import sys
from pathlib import Path
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.core.formatters import StringPrinter
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/sign.py b/src/ahriman/application/handlers/sign.py
index ae603515..50af427b 100644
--- a/src/ahriman/application/handlers/sign.py
+++ b/src/ahriman/application/handlers/sign.py
@@ -20,7 +20,7 @@
import argparse
from ahriman.application.application import Application
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/status.py b/src/ahriman/application/handlers/status.py
index b0e5c180..caa1c79d 100644
--- a/src/ahriman/application/handlers/status.py
+++ b/src/ahriman/application/handlers/status.py
@@ -22,7 +22,7 @@ import argparse
from collections.abc import Callable
from ahriman.application.application import Application
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.core.formatters import PackagePrinter, StatusPrinter
from ahriman.models.build_status import BuildStatus
diff --git a/src/ahriman/application/handlers/status_update.py b/src/ahriman/application/handlers/status_update.py
index c52f9236..3b1637b0 100644
--- a/src/ahriman/application/handlers/status_update.py
+++ b/src/ahriman/application/handlers/status_update.py
@@ -20,7 +20,7 @@
import argparse
from ahriman.application.application import Application
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.models.action import Action
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/structure.py b/src/ahriman/application/handlers/structure.py
index 42a6ca00..efb2d11e 100644
--- a/src/ahriman/application/handlers/structure.py
+++ b/src/ahriman/application/handlers/structure.py
@@ -20,7 +20,7 @@
import argparse
from ahriman.application.application import Application
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.core.formatters import StringPrinter, TreePrinter
from ahriman.core.tree import Tree
diff --git a/src/ahriman/application/handlers/tree_migrate.py b/src/ahriman/application/handlers/tree_migrate.py
index 57e944aa..e29598fd 100644
--- a/src/ahriman/application/handlers/tree_migrate.py
+++ b/src/ahriman/application/handlers/tree_migrate.py
@@ -19,7 +19,7 @@
#
import argparse
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.models.repository_id import RepositoryId
from ahriman.models.repository_paths import RepositoryPaths
diff --git a/src/ahriman/application/handlers/triggers.py b/src/ahriman/application/handlers/triggers.py
index 60afff44..f3739d90 100644
--- a/src/ahriman/application/handlers/triggers.py
+++ b/src/ahriman/application/handlers/triggers.py
@@ -20,7 +20,7 @@
import argparse
from ahriman.application.application import Application
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.models.repository_id import RepositoryId
from ahriman.models.result import Result
diff --git a/src/ahriman/application/handlers/unsafe_commands.py b/src/ahriman/application/handlers/unsafe_commands.py
index f463ead5..80cffa02 100644
--- a/src/ahriman/application/handlers/unsafe_commands.py
+++ b/src/ahriman/application/handlers/unsafe_commands.py
@@ -19,7 +19,7 @@
#
import argparse
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.core.formatters import StringPrinter
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/update.py b/src/ahriman/application/handlers/update.py
index 63c83398..359394b1 100644
--- a/src/ahriman/application/handlers/update.py
+++ b/src/ahriman/application/handlers/update.py
@@ -22,7 +22,7 @@ import argparse
from collections.abc import Callable
from ahriman.application.application import Application
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.models.packagers import Packagers
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/users.py b/src/ahriman/application/handlers/users.py
index 875ec110..244d0fc2 100644
--- a/src/ahriman/application/handlers/users.py
+++ b/src/ahriman/application/handlers/users.py
@@ -20,7 +20,7 @@
import argparse
import getpass
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.core.database import SQLite
from ahriman.core.exceptions import PasswordError
diff --git a/src/ahriman/application/handlers/validate.py b/src/ahriman/application/handlers/validate.py
index e83818ed..63d9e51d 100644
--- a/src/ahriman/application/handlers/validate.py
+++ b/src/ahriman/application/handlers/validate.py
@@ -22,7 +22,7 @@ import copy
from typing import Any
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.core.configuration.schema import CONFIGURATION_SCHEMA, ConfigurationSchema
from ahriman.core.configuration.validator import Validator
diff --git a/src/ahriman/application/handlers/versions.py b/src/ahriman/application/handlers/versions.py
index 33ee46ab..a187734e 100644
--- a/src/ahriman/application/handlers/versions.py
+++ b/src/ahriman/application/handlers/versions.py
@@ -25,7 +25,7 @@ from collections.abc import Generator
from importlib import metadata
from ahriman import __version__
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.core.formatters import VersionPrinter
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/application/handlers/web.py b/src/ahriman/application/handlers/web.py
index 34b25aee..5a8b71a6 100644
--- a/src/ahriman/application/handlers/web.py
+++ b/src/ahriman/application/handlers/web.py
@@ -21,7 +21,7 @@ import argparse
from collections.abc import Generator
-from ahriman.application.handlers import Handler
+from ahriman.application.handlers.handler import Handler
from ahriman.core.configuration import Configuration
from ahriman.core.spawn import Spawn
from ahriman.core.triggers import TriggerLoader
diff --git a/src/ahriman/core/alpm/remote/__init__.py b/src/ahriman/core/alpm/remote/__init__.py
index edfa49d0..55172566 100644
--- a/src/ahriman/core/alpm/remote/__init__.py
+++ b/src/ahriman/core/alpm/remote/__init__.py
@@ -17,8 +17,7 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
-from ahriman.core.alpm.remote.remote import Remote
-
from ahriman.core.alpm.remote.aur import AUR
from ahriman.core.alpm.remote.official import Official
from ahriman.core.alpm.remote.official_syncdb import OfficialSyncdb
+from ahriman.core.alpm.remote.remote import Remote
diff --git a/src/ahriman/core/alpm/remote/aur.py b/src/ahriman/core/alpm/remote/aur.py
index 8aeeb159..7672a0d1 100644
--- a/src/ahriman/core/alpm/remote/aur.py
+++ b/src/ahriman/core/alpm/remote/aur.py
@@ -20,7 +20,7 @@
from typing import Any
from ahriman.core.alpm.pacman import Pacman
-from ahriman.core.alpm.remote import Remote
+from ahriman.core.alpm.remote.remote import Remote
from ahriman.core.exceptions import PackageInfoError, UnknownPackageError
from ahriman.models.aur_package import AURPackage
diff --git a/src/ahriman/core/alpm/remote/official.py b/src/ahriman/core/alpm/remote/official.py
index c281691b..b48ca5b8 100644
--- a/src/ahriman/core/alpm/remote/official.py
+++ b/src/ahriman/core/alpm/remote/official.py
@@ -20,7 +20,7 @@
from typing import Any
from ahriman.core.alpm.pacman import Pacman
-from ahriman.core.alpm.remote import Remote
+from ahriman.core.alpm.remote.remote import Remote
from ahriman.core.exceptions import PackageInfoError, UnknownPackageError
from ahriman.models.aur_package import AURPackage
diff --git a/src/ahriman/core/alpm/remote/official_syncdb.py b/src/ahriman/core/alpm/remote/official_syncdb.py
index 4ddf0a6c..b1aaf150 100644
--- a/src/ahriman/core/alpm/remote/official_syncdb.py
+++ b/src/ahriman/core/alpm/remote/official_syncdb.py
@@ -18,7 +18,7 @@
# along with this program. If not, see .
#
from ahriman.core.alpm.pacman import Pacman
-from ahriman.core.alpm.remote import Official
+from ahriman.core.alpm.remote.official import Official
from ahriman.core.exceptions import UnknownPackageError
from ahriman.models.aur_package import AURPackage
diff --git a/src/ahriman/core/database/operations/__init__.py b/src/ahriman/core/database/operations/__init__.py
index b988de0a..579465fd 100644
--- a/src/ahriman/core/database/operations/__init__.py
+++ b/src/ahriman/core/database/operations/__init__.py
@@ -17,8 +17,6 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
-from ahriman.core.database.operations.operations import Operations
-
from ahriman.core.database.operations.auth_operations import AuthOperations
from ahriman.core.database.operations.build_operations import BuildOperations
from ahriman.core.database.operations.changes_operations import ChangesOperations
diff --git a/src/ahriman/core/database/operations/auth_operations.py b/src/ahriman/core/database/operations/auth_operations.py
index 9badb27b..432d03fb 100644
--- a/src/ahriman/core/database/operations/auth_operations.py
+++ b/src/ahriman/core/database/operations/auth_operations.py
@@ -19,7 +19,7 @@
#
from sqlite3 import Connection
-from ahriman.core.database.operations import Operations
+from ahriman.core.database.operations.operations import Operations
from ahriman.models.user import User
from ahriman.models.user_access import UserAccess
diff --git a/src/ahriman/core/database/operations/build_operations.py b/src/ahriman/core/database/operations/build_operations.py
index 2a2beff2..9d87debd 100644
--- a/src/ahriman/core/database/operations/build_operations.py
+++ b/src/ahriman/core/database/operations/build_operations.py
@@ -19,7 +19,7 @@
#
from sqlite3 import Connection
-from ahriman.core.database.operations import Operations
+from ahriman.core.database.operations.operations import Operations
from ahriman.models.package import Package
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/core/database/operations/changes_operations.py b/src/ahriman/core/database/operations/changes_operations.py
index 6552f359..d5e4dac8 100644
--- a/src/ahriman/core/database/operations/changes_operations.py
+++ b/src/ahriman/core/database/operations/changes_operations.py
@@ -19,7 +19,7 @@
#
from sqlite3 import Connection
-from ahriman.core.database.operations import Operations
+from ahriman.core.database.operations.operations import Operations
from ahriman.models.changes import Changes
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/core/database/operations/logs_operations.py b/src/ahriman/core/database/operations/logs_operations.py
index 4a7f4ca3..862c5d6f 100644
--- a/src/ahriman/core/database/operations/logs_operations.py
+++ b/src/ahriman/core/database/operations/logs_operations.py
@@ -19,7 +19,7 @@
#
from sqlite3 import Connection
-from ahriman.core.database.operations import Operations
+from ahriman.core.database.operations.operations import Operations
from ahriman.models.log_record_id import LogRecordId
from ahriman.models.repository_id import RepositoryId
diff --git a/src/ahriman/core/database/operations/package_operations.py b/src/ahriman/core/database/operations/package_operations.py
index a1a0cf64..812d0009 100644
--- a/src/ahriman/core/database/operations/package_operations.py
+++ b/src/ahriman/core/database/operations/package_operations.py
@@ -20,7 +20,7 @@
from collections.abc import Generator, Iterable
from sqlite3 import Connection
-from ahriman.core.database.operations import Operations
+from ahriman.core.database.operations.operations import Operations
from ahriman.models.build_status import BuildStatus
from ahriman.models.package import Package
from ahriman.models.package_description import PackageDescription
diff --git a/src/ahriman/core/database/operations/patch_operations.py b/src/ahriman/core/database/operations/patch_operations.py
index eaee368c..e657a346 100644
--- a/src/ahriman/core/database/operations/patch_operations.py
+++ b/src/ahriman/core/database/operations/patch_operations.py
@@ -20,7 +20,7 @@
from collections import defaultdict
from sqlite3 import Connection
-from ahriman.core.database.operations import Operations
+from ahriman.core.database.operations.operations import Operations
from ahriman.models.pkgbuild_patch import PkgbuildPatch
diff --git a/src/ahriman/core/formatters/__init__.py b/src/ahriman/core/formatters/__init__.py
index a988babb..dfcee20a 100644
--- a/src/ahriman/core/formatters/__init__.py
+++ b/src/ahriman/core/formatters/__init__.py
@@ -17,8 +17,6 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
-from ahriman.core.formatters.printer import Printer
-
from ahriman.core.formatters.aur_printer import AurPrinter
from ahriman.core.formatters.build_printer import BuildPrinter
from ahriman.core.formatters.changes_printer import ChangesPrinter
@@ -26,6 +24,7 @@ from ahriman.core.formatters.configuration_paths_printer import ConfigurationPat
from ahriman.core.formatters.configuration_printer import ConfigurationPrinter
from ahriman.core.formatters.package_printer import PackagePrinter
from ahriman.core.formatters.patch_printer import PatchPrinter
+from ahriman.core.formatters.printer import Printer
from ahriman.core.formatters.repository_printer import RepositoryPrinter
from ahriman.core.formatters.status_printer import StatusPrinter
from ahriman.core.formatters.string_printer import StringPrinter
diff --git a/src/ahriman/core/formatters/changes_printer.py b/src/ahriman/core/formatters/changes_printer.py
index ad596d4a..a0532582 100644
--- a/src/ahriman/core/formatters/changes_printer.py
+++ b/src/ahriman/core/formatters/changes_printer.py
@@ -17,7 +17,7 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
-from ahriman.core.formatters import Printer
+from ahriman.core.formatters.printer import Printer
from ahriman.models.changes import Changes
from ahriman.models.property import Property
diff --git a/src/ahriman/core/formatters/string_printer.py b/src/ahriman/core/formatters/string_printer.py
index b548b447..7e498534 100644
--- a/src/ahriman/core/formatters/string_printer.py
+++ b/src/ahriman/core/formatters/string_printer.py
@@ -17,7 +17,7 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
-from ahriman.core.formatters import Printer
+from ahriman.core.formatters.printer import Printer
class StringPrinter(Printer):
diff --git a/src/ahriman/core/log/journal_handler.py b/src/ahriman/core/log/journal_handler.py
index 442b484c..792c7d6a 100644
--- a/src/ahriman/core/log/journal_handler.py
+++ b/src/ahriman/core/log/journal_handler.py
@@ -17,7 +17,7 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
-from logging import NullHandler
+from logging import NullHandler # pylint: disable=imports-out-of-order
from typing import Any
diff --git a/src/ahriman/core/report/report_trigger.py b/src/ahriman/core/report/report_trigger.py
index c9e52966..2be51a16 100644
--- a/src/ahriman/core/report/report_trigger.py
+++ b/src/ahriman/core/report/report_trigger.py
@@ -18,8 +18,8 @@
# along with this program. If not, see .
#
from ahriman.core.configuration import Configuration
-from ahriman.core.triggers import Trigger
from ahriman.core.report.report import Report
+from ahriman.core.triggers import Trigger
from ahriman.models.package import Package
from ahriman.models.repository_id import RepositoryId
from ahriman.models.result import Result
diff --git a/src/ahriman/models/result.py b/src/ahriman/models/result.py
index b4867b0b..38c9a407 100644
--- a/src/ahriman/models/result.py
+++ b/src/ahriman/models/result.py
@@ -19,7 +19,7 @@
#
from __future__ import annotations
-from collections.abc import Iterable, Callable
+from collections.abc import Callable, Iterable
from typing import Any, Self
from ahriman.models.package import Package
diff --git a/src/ahriman/models/user.py b/src/ahriman/models/user.py
index 0fff8954..399c670d 100644
--- a/src/ahriman/models/user.py
+++ b/src/ahriman/models/user.py
@@ -17,9 +17,9 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
-from secrets import token_urlsafe as generate_password
from dataclasses import dataclass, replace
from passlib.hash import sha512_crypt
+from secrets import token_urlsafe as generate_password
from typing import Self
from ahriman.models.user_access import UserAccess
diff --git a/src/ahriman/web/schemas/__init__.py b/src/ahriman/web/schemas/__init__.py
index 1fc34d94..3b3e4bd6 100644
--- a/src/ahriman/web/schemas/__init__.py
+++ b/src/ahriman/web/schemas/__init__.py
@@ -35,7 +35,7 @@ from ahriman.web.schemas.package_names_schema import PackageNamesSchema
from ahriman.web.schemas.package_patch_schema import PackagePatchSchema
from ahriman.web.schemas.package_properties_schema import PackagePropertiesSchema
from ahriman.web.schemas.package_schema import PackageSchema
-from ahriman.web.schemas.package_status_schema import PackageStatusSimplifiedSchema, PackageStatusSchema
+from ahriman.web.schemas.package_status_schema import PackageStatusSchema, PackageStatusSimplifiedSchema
from ahriman.web.schemas.pagination_schema import PaginationSchema
from ahriman.web.schemas.patch_name_schema import PatchNameSchema
from ahriman.web.schemas.patch_schema import PatchSchema
diff --git a/src/ahriman/web/schemas/package_status_schema.py b/src/ahriman/web/schemas/package_status_schema.py
index 54702610..b5a97490 100644
--- a/src/ahriman/web/schemas/package_status_schema.py
+++ b/src/ahriman/web/schemas/package_status_schema.py
@@ -25,22 +25,6 @@ from ahriman.web.schemas.repository_id_schema import RepositoryIdSchema
from ahriman.web.schemas.status_schema import StatusSchema
-class PackageStatusSimplifiedSchema(Schema):
- """
- special request package status schema
- """
-
- package = fields.Nested(PackageSchema(), metadata={
- "description": "Package description",
- })
- status = fields.Enum(BuildStatusEnum, by_value=True, required=True, metadata={
- "description": "Current status",
- })
- repository = fields.Nested(RepositoryIdSchema(), required=True, metadata={
- "description": "Repository identifier",
- })
-
-
class PackageStatusSchema(Schema):
"""
response package status schema
@@ -55,3 +39,19 @@ class PackageStatusSchema(Schema):
repository = fields.Nested(RepositoryIdSchema(), required=True, metadata={
"description": "Repository identifier",
})
+
+
+class PackageStatusSimplifiedSchema(Schema):
+ """
+ special request package status schema
+ """
+
+ package = fields.Nested(PackageSchema(), metadata={
+ "description": "Package description",
+ })
+ status = fields.Enum(BuildStatusEnum, by_value=True, required=True, metadata={
+ "description": "Current status",
+ })
+ repository = fields.Nested(RepositoryIdSchema(), required=True, metadata={
+ "description": "Repository identifier",
+ })
diff --git a/src/ahriman/web/views/base.py b/src/ahriman/web/views/base.py
index 3374640b..061c9370 100644
--- a/src/ahriman/web/views/base.py
+++ b/src/ahriman/web/views/base.py
@@ -17,8 +17,8 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
-from aiohttp_cors import CorsViewMixin # type: ignore[import-untyped]
from aiohttp.web import HTTPBadRequest, HTTPNotFound, Request, StreamResponse, View
+from aiohttp_cors import CorsViewMixin # type: ignore[import-untyped]
from collections.abc import Awaitable, Callable
from typing import TypeVar
diff --git a/src/ahriman/web/views/v1/distributed/workers.py b/src/ahriman/web/views/v1/distributed/workers.py
index 314e106a..bb0bbd23 100644
--- a/src/ahriman/web/views/v1/distributed/workers.py
+++ b/src/ahriman/web/views/v1/distributed/workers.py
@@ -19,8 +19,8 @@
#
import aiohttp_apispec # type: ignore[import-untyped]
-from collections.abc import Callable
from aiohttp.web import HTTPBadRequest, HTTPNoContent, Response, json_response
+from collections.abc import Callable
from ahriman.models.user_access import UserAccess
from ahriman.models.worker import Worker
diff --git a/src/ahriman/web/views/v1/service/update.py b/src/ahriman/web/views/v1/service/update.py
index 0c2411ca..a18997e2 100644
--- a/src/ahriman/web/views/v1/service/update.py
+++ b/src/ahriman/web/views/v1/service/update.py
@@ -22,7 +22,7 @@ import aiohttp_apispec # type: ignore[import-untyped]
from aiohttp.web import HTTPBadRequest, Response, json_response
from ahriman.models.user_access import UserAccess
-from ahriman.web.schemas import AuthSchema, ErrorSchema, ProcessIdSchema, UpdateFlagsSchema, RepositoryIdSchema
+from ahriman.web.schemas import AuthSchema, ErrorSchema, ProcessIdSchema, RepositoryIdSchema, UpdateFlagsSchema
from ahriman.web.views.base import BaseView
diff --git a/src/ahriman/web/views/v1/status/packages.py b/src/ahriman/web/views/v1/status/packages.py
index 0e598ac0..e39cf9ff 100644
--- a/src/ahriman/web/views/v1/status/packages.py
+++ b/src/ahriman/web/views/v1/status/packages.py
@@ -20,8 +20,8 @@
import aiohttp_apispec # type: ignore[import-untyped]
import itertools
-from collections.abc import Callable
from aiohttp.web import HTTPNoContent, Response, json_response
+from collections.abc import Callable
from ahriman.models.build_status import BuildStatus
from ahriman.models.package import Package
diff --git a/src/ahriman/web/views/v1/status/status.py b/src/ahriman/web/views/v1/status/status.py
index 057b5f07..7fd518d9 100644
--- a/src/ahriman/web/views/v1/status/status.py
+++ b/src/ahriman/web/views/v1/status/status.py
@@ -26,7 +26,7 @@ from ahriman.models.build_status import BuildStatusEnum
from ahriman.models.counters import Counters
from ahriman.models.internal_status import InternalStatus
from ahriman.models.user_access import UserAccess
-from ahriman.web.schemas import AuthSchema, ErrorSchema, InternalStatusSchema, StatusSchema, RepositoryIdSchema
+from ahriman.web.schemas import AuthSchema, ErrorSchema, InternalStatusSchema, RepositoryIdSchema, StatusSchema
from ahriman.web.views.base import BaseView
from ahriman.web.views.status_view_guard import StatusViewGuard
diff --git a/tests/ahriman/core/database/migrations/test_m001_package_source.py b/tests/ahriman/core/database/migrations/test_m001_package_source.py
index 67d79e85..4977d8ce 100644
--- a/tests/ahriman/core/database/migrations/test_m001_package_source.py
+++ b/tests/ahriman/core/database/migrations/test_m001_package_source.py
@@ -1,7 +1,7 @@
import pytest
-from sqlite3 import Connection
from pytest_mock import MockerFixture
+from sqlite3 import Connection
from unittest.mock import call as MockCall
from ahriman.core.configuration import Configuration
diff --git a/tests/ahriman/core/formatters/conftest.py b/tests/ahriman/core/formatters/conftest.py
index 89d057f4..90402d76 100644
--- a/tests/ahriman/core/formatters/conftest.py
+++ b/tests/ahriman/core/formatters/conftest.py
@@ -2,7 +2,7 @@ import pytest
from pathlib import Path
-from ahriman.core.formatters import AurPrinter, ChangesPrinter, ConfigurationPrinter, ConfigurationPathsPrinter, \
+from ahriman.core.formatters import AurPrinter, ChangesPrinter, ConfigurationPathsPrinter, ConfigurationPrinter, \
PackagePrinter, PatchPrinter, RepositoryPrinter, StatusPrinter, StringPrinter, TreePrinter, UpdatePrinter, \
UserPrinter, ValidationPrinter, VersionPrinter
from ahriman.models.aur_package import AURPackage
diff --git a/tests/ahriman/models/test_package_source.py b/tests/ahriman/models/test_package_source.py
index 27c18b53..5ab67312 100644
--- a/tests/ahriman/models/test_package_source.py
+++ b/tests/ahriman/models/test_package_source.py
@@ -1,6 +1,6 @@
from collections.abc import Callable
-from pytest_mock import MockerFixture
from pathlib import Path
+from pytest_mock import MockerFixture
from ahriman.models.package_description import PackageDescription
from ahriman.models.package_source import PackageSource
diff --git a/tests/ahriman/web/conftest.py b/tests/ahriman/web/conftest.py
index 8078ce80..379ebae9 100644
--- a/tests/ahriman/web/conftest.py
+++ b/tests/ahriman/web/conftest.py
@@ -1,16 +1,15 @@
import pytest
-from asyncio import BaseEventLoop
-from aiohttp.web import Application, Resource, UrlMappingMatchInfo
from aiohttp.test_utils import TestClient
+from aiohttp.web import Application, Resource, UrlMappingMatchInfo
+from asyncio import BaseEventLoop
from collections.abc import Awaitable, Callable
from marshmallow import Schema
from pytest_mock import MockerFixture
from typing import Any
from unittest.mock import MagicMock, Mock
-import ahriman.core.auth.helpers
-
+from ahriman.core.auth import helpers
from ahriman.core.auth.oauth import OAuth
from ahriman.core.configuration import Configuration
from ahriman.core.database import SQLite
@@ -130,7 +129,7 @@ def application(configuration: Configuration, spawner: Spawn, database: SQLite,
configuration.set_option("web", "port", "8080")
mocker.patch("ahriman.core.database.SQLite.load", return_value=database)
mocker.patch("aiohttp_apispec.setup_aiohttp_apispec")
- mocker.patch.object(ahriman.core.auth.helpers, "_has_aiohttp_security", False)
+ mocker.patch.object(helpers, "_has_aiohttp_security", False)
_, repository_id = configuration.check_loaded()
return setup_server(configuration, spawner, [repository_id])
@@ -156,7 +155,7 @@ def application_with_auth(configuration: Configuration, user: User, spawner: Spa
configuration.set_option("web", "port", "8080")
mocker.patch("ahriman.core.database.SQLite.load", return_value=database)
mocker.patch("aiohttp_apispec.setup_aiohttp_apispec")
- mocker.patch.object(ahriman.core.auth.helpers, "_has_aiohttp_security", True)
+ mocker.patch.object(helpers, "_has_aiohttp_security", True)
_, repository_id = configuration.check_loaded()
application = setup_server(configuration, spawner, [repository_id])
@@ -185,7 +184,7 @@ def application_with_debug(configuration: Configuration, spawner: Spawn, databas
configuration.set_option("web", "port", "8080")
mocker.patch("ahriman.core.database.SQLite.load", return_value=database)
mocker.patch("aiohttp_apispec.setup_aiohttp_apispec")
- mocker.patch.object(ahriman.core.auth.helpers, "_has_aiohttp_security", False)
+ mocker.patch.object(helpers, "_has_aiohttp_security", False)
_, repository_id = configuration.check_loaded()
return setup_server(configuration, spawner, [repository_id])
diff --git a/tests/ahriman/web/views/test_view_base.py b/tests/ahriman/web/views/test_view_base.py
index acf691c6..cb74933a 100644
--- a/tests/ahriman/web/views/test_view_base.py
+++ b/tests/ahriman/web/views/test_view_base.py
@@ -1,8 +1,8 @@
import pytest
-from multidict import MultiDict
from aiohttp.test_utils import TestClient
from aiohttp.web import HTTPBadRequest, HTTPNotFound
+from multidict import MultiDict
from pytest_mock import MockerFixture
from unittest.mock import AsyncMock