Compare commits

..

1 Commits

Author SHA1 Message Date
13dfbc55f6 add simplified readme for the rtd 2022-04-18 03:04:16 +03:00
26 changed files with 221 additions and 243 deletions

View File

@ -1,20 +0,0 @@
version: 2
formats: all
build:
os: ubuntu-20.04
tools:
python: "3.9"
sphinx:
builder: html
configuration: docs/source/conf.py
python:
install:
- method: pip
path: .
extra_requirements:
- docs
system_packages: true

View File

@ -4,7 +4,6 @@
[![setup status](https://github.com/arcan1s/ahriman/actions/workflows/run-setup.yml/badge.svg)](https://github.com/arcan1s/ahriman/actions/workflows/run-setup.yml)
[![docker image](https://github.com/arcan1s/ahriman/actions/workflows/docker-image.yml/badge.svg)](https://github.com/arcan1s/ahriman/actions/workflows/docker-image.yml)
[![CodeFactor](https://www.codefactor.io/repository/github/arcan1s/ahriman/badge)](https://www.codefactor.io/repository/github/arcan1s/ahriman)
[![Documentation Status](https://readthedocs.org/projects/ahriman/badge/?version=latest)](https://ahriman.readthedocs.io/?badge=latest)
Wrapper for managing custom repository inspired by [repo-scripts](https://github.com/arcan1s/repo-scripts).

34
README.rst Normal file
View File

@ -0,0 +1,34 @@
ArcH Linux ReposItory MANager
=============================
Wrapper for managing custom repository inspired by `repo-scripts <https://github.com/arcan1s/repo-scripts>`_.
Features
--------
* Install-configure-forget manager for own repository.
* Multi-architecture support.
* VCS packages support.
* Sign support with gpg (repository, package, per package settings).
* Synchronization to remote services (rsync, s3 and github) and report generation (email, html, telegram).
* Dependency manager.
* Ability to patch AUR packages and even create package from local PKGBUILDs.
* Repository status interface with optional authorization and control options:
.. image:: web.png
:target: web.png
:alt: web interface
Installation and run
--------------------
For installation details please refer to the `documentation <docs/setup.md>`_. For command help, ``--help`` subcommand must be used. Subcommands have own help message as well. The package also provides a `man page <docs/ahriman.1>`_.
Configuration
-------------
Every available option is described in the `documentation <docs/configuration.md>`_.
`FAQ <docs/faq.md>`_
------------------------

View File

@ -13,28 +13,28 @@ ahriman.application.application.application module
:show-inheritance:
:private-members:
ahriman.application.application.application\_packages module
------------------------------------------------------------
ahriman.application.application.packages module
-----------------------------------------------
.. automodule:: ahriman.application.application.application_packages
.. automodule:: ahriman.application.application.packages
:members:
:no-undoc-members:
:show-inheritance:
:private-members:
ahriman.application.application.application\_properties module
--------------------------------------------------------------
ahriman.application.application.properties module
-------------------------------------------------
.. automodule:: ahriman.application.application.application_properties
.. automodule:: ahriman.application.application.properties
:members:
:no-undoc-members:
:show-inheritance:
:private-members:
ahriman.application.application.application\_repository module
--------------------------------------------------------------
ahriman.application.application.repository module
-------------------------------------------------
.. automodule:: ahriman.application.application.application_repository
.. automodule:: ahriman.application.application.repository
:members:
:no-undoc-members:
:show-inheritance:

View File

@ -193,10 +193,10 @@ ahriman.application.handlers.update module
:show-inheritance:
:private-members:
ahriman.application.handlers.users module
-----------------------------------------
ahriman.application.handlers.user module
----------------------------------------
.. automodule:: ahriman.application.handlers.users
.. automodule:: ahriman.application.handlers.user
:members:
:no-undoc-members:
:show-inheritance:

View File

@ -22,19 +22,19 @@ ahriman.core.repository.executor module
:show-inheritance:
:private-members:
ahriman.core.repository.repository module
ahriman.core.repository.properties module
-----------------------------------------
.. automodule:: ahriman.core.repository.repository
.. automodule:: ahriman.core.repository.properties
:members:
:no-undoc-members:
:show-inheritance:
:private-members:
ahriman.core.repository.repository\_properties module
-----------------------------------------------------
ahriman.core.repository.repository module
-----------------------------------------
.. automodule:: ahriman.core.repository.repository_properties
.. automodule:: ahriman.core.repository.repository
:members:
:no-undoc-members:
:show-inheritance:

View File

@ -10,29 +10,19 @@
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
import os
from pathlib import Path
# import os
# import sys
# sys.path.insert(0, os.path.abspath("."))
basedir = Path(__file__).resolve().parent.parent.parent
metadata_path = basedir / "src/ahriman/version.py"
metadata = {}
with metadata_path.open() as metadata_file:
exec(metadata_file.read(), metadata) # pylint: disable=exec-used
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
# -- Project information -----------------------------------------------------
project = "ahriman"
copyright = "2021-2022, ahriman team"
copyright = "2022, ahriman team"
author = "ahriman team"
# The full version, including alpha/beta/rc tags
release = metadata["__version__"]
release = "2021-2022"
# -- General configuration ---------------------------------------------------
@ -66,7 +56,7 @@ exclude_patterns = []
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = "default" if on_rtd else "alabaster"
html_theme = "alabaster"
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,

View File

@ -1,3 +1,8 @@
.. ahriman documentation master file, created by
sphinx-quickstart on Sun Apr 17 18:05:36 2022.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to ahriman's documentation!
===================================
@ -5,19 +10,7 @@ Welcome to ahriman's documentation!
:maxdepth: 2
:caption: Contents:
Wrapper for managing custom repository inspired by `repo-scripts <https://github.com/arcan1s/repo-scripts>`_.
Features
--------
* Install-configure-forget manager for own repository.
* Multi-architecture support.
* VCS packages support.
* Sign support with gpg (repository, package, per package settings).
* Synchronization to remote services (rsync, s3 and github) and report generation (email, html, telegram).
* Dependency manager.
* Ability to patch AUR packages and even create package from local PKGBUILDs.
* Repository status interface with optional authorization and control options.
Indices and tables
==================

View File

@ -31,6 +31,7 @@ setup(
install_requires=[
"inflection",
"passlib",
"pyalpm",
"requests",
"srcinfo",
],
@ -98,12 +99,6 @@ setup(
"pydeps",
"sphinxcontrib-napoleon",
],
# FIXME technically this dependency is required, but in some cases we do not have access to
# the libalpm which is required in order to install the package. Thus in case if we do not
# really need to run the application we can move it to "optional" dependencies
"pacman": [
"pyalpm",
],
"s3": [
"boto3",
],

View File

@ -661,7 +661,7 @@ def _set_user_add_parser(root: SubParserAction) -> argparse.ArgumentParser:
parser.add_argument("-r", "--role", help="user access level",
type=UserAccess, choices=UserAccess, default=UserAccess.Read)
parser.add_argument("-s", "--secure", help="set file permissions to user-only", action="store_true")
parser.set_defaults(handler=handlers.Users, action=Action.Update, architecture=[""], lock=None, no_report=True,
parser.set_defaults(handler=handlers.User, action=Action.Update, architecture=[""], lock=None, no_report=True,
quiet=True, unsafe=True)
return parser
@ -682,7 +682,7 @@ def _set_user_list_parser(root: SubParserAction) -> argparse.ArgumentParser:
parser.add_argument("username", help="filter users by username", nargs="?")
parser.add_argument("-e", "--exit-code", help="return non-zero exit status if result is empty", action="store_true")
parser.add_argument("-r", "--role", help="filter users by role", type=UserAccess, choices=UserAccess)
parser.set_defaults(handler=handlers.Users, action=Action.List, architecture=[""], lock=None, no_report=True, # nosec
parser.set_defaults(handler=handlers.User, action=Action.List, architecture=[""], lock=None, no_report=True, # nosec
password="", quiet=True, unsafe=True)
return parser
@ -702,7 +702,7 @@ def _set_user_remove_parser(root: SubParserAction) -> argparse.ArgumentParser:
formatter_class=_formatter)
parser.add_argument("username", help="username for web service")
parser.add_argument("-s", "--secure", help="set file permissions to user-only", action="store_true")
parser.set_defaults(handler=handlers.Users, action=Action.Remove, architecture=[""], lock=None, no_report=True, # nosec
parser.set_defaults(handler=handlers.User, action=Action.Remove, architecture=[""], lock=None, no_report=True, # nosec
password="", quiet=True, unsafe=True)
return parser

View File

@ -19,12 +19,12 @@
#
from typing import Set
from ahriman.application.application.application_packages import ApplicationPackages
from ahriman.application.application.application_repository import ApplicationRepository
from ahriman.application.application.packages import Packages
from ahriman.application.application.repository import Repository
from ahriman.models.result import Result
class Application(ApplicationPackages, ApplicationRepository):
class Application(Packages, Repository):
"""
base application class
"""

View File

@ -23,7 +23,7 @@ import shutil
from pathlib import Path
from typing import Any, Iterable, Set
from ahriman.application.application.application_properties import ApplicationProperties
from ahriman.application.application.properties import Properties
from ahriman.core.build_tools.sources import Sources
from ahriman.core.util import package_like, tmpdir
from ahriman.models.package import Package
@ -31,7 +31,7 @@ from ahriman.models.package_source import PackageSource
from ahriman.models.result import Result
class ApplicationPackages(ApplicationProperties):
class Packages(Properties):
"""
package control class
"""

View File

@ -24,7 +24,7 @@ from ahriman.core.database.sqlite import SQLite
from ahriman.core.repository import Repository
class ApplicationProperties:
class Properties:
"""
application base properties class

View File

@ -22,7 +22,7 @@ import shutil
from pathlib import Path
from typing import Callable, Iterable, List
from ahriman.application.application.application_properties import ApplicationProperties
from ahriman.application.application.properties import Properties
from ahriman.core.build_tools.sources import Sources
from ahriman.core.formatters.update_printer import UpdatePrinter
from ahriman.core.tree import Tree
@ -30,7 +30,7 @@ from ahriman.models.package import Package
from ahriman.models.result import Result
class ApplicationRepository(ApplicationProperties):
class Repository(Properties):
"""
repository control class
"""

View File

@ -39,5 +39,5 @@ from ahriman.application.handlers.status_update import StatusUpdate
from ahriman.application.handlers.sync import Sync
from ahriman.application.handlers.unsafe_commands import UnsafeCommands
from ahriman.application.handlers.update import Update
from ahriman.application.handlers.users import Users
from ahriman.application.handlers.user import User
from ahriman.application.handlers.web import Web

View File

@ -28,10 +28,10 @@ from ahriman.core.configuration import Configuration
from ahriman.core.database.sqlite import SQLite
from ahriman.core.formatters.user_printer import UserPrinter
from ahriman.models.action import Action
from ahriman.models.user import User
from ahriman.models.user import User as MUser
class Users(Handler):
class User(Handler):
"""
user management handler
"""
@ -54,30 +54,30 @@ class Users(Handler):
database = SQLite.load(configuration)
if args.action == Action.Update:
salt = Users.get_salt(configuration)
user = Users.user_create(args)
salt = User.get_salt(configuration)
user = User.user_create(args)
auth_configuration = Users.configuration_get(configuration.include)
auth_configuration = User.configuration_get(configuration.include)
Users.configuration_create(auth_configuration, user, salt, args.as_service, args.secure)
User.configuration_create(auth_configuration, user, salt, args.as_service, args.secure)
database.user_update(user.hash_password(salt))
elif args.action == Action.List:
users = database.user_list(args.username, args.role)
Users.check_if_empty(args.exit_code, not users)
User.check_if_empty(args.exit_code, not users)
for user in users:
UserPrinter(user).print(verbose=True)
elif args.action == Action.Remove:
database.user_remove(args.username)
@staticmethod
def configuration_create(configuration: Configuration, user: User, salt: str,
def configuration_create(configuration: Configuration, user: MUser, salt: str,
as_service_user: bool, secure: bool) -> None:
"""
enable configuration if it has been disabled
Args:
configuration(Configuration): configuration instance
user(User): user descriptor
user(MUser): user descriptor
salt(str): password hash salt
as_service_user(bool): add user as service user, also set password and user to configuration
secure(bool): if true then set file permissions to 0o600
@ -86,7 +86,7 @@ class Users(Handler):
if as_service_user:
configuration.set_option("web", "username", user.username)
configuration.set_option("web", "password", user.password)
Users.configuration_write(configuration, secure)
User.configuration_write(configuration, secure)
@staticmethod
def configuration_get(include_path: Path) -> Configuration:
@ -136,10 +136,10 @@ class Users(Handler):
"""
if salt := configuration.get("auth", "salt", fallback=None):
return salt
return User.generate_password(salt_length)
return MUser.generate_password(salt_length)
@staticmethod
def user_create(args: argparse.Namespace) -> User:
def user_create(args: argparse.Namespace) -> MUser:
"""
create user descriptor from arguments
@ -147,9 +147,9 @@ class Users(Handler):
args(argparse.Namespace): command line args
Returns:
User: built user descriptor
MUser: built user descriptor
"""
user = User(args.username, args.password, args.role)
user = MUser(args.username, args.password, args.role)
if user.password is None:
user.password = getpass.getpass()
return user

View File

@ -22,10 +22,10 @@ import shutil
from pathlib import Path
from typing import List
from ahriman.core.repository.repository_properties import RepositoryProperties
from ahriman.core.repository.properties import Properties
class Cleaner(RepositoryProperties):
class Cleaner(Properties):
"""
trait to clean common repository objects
"""

View File

@ -29,7 +29,7 @@ from ahriman.core.status.client import Client
from ahriman.core.util import check_user
class RepositoryProperties:
class Properties:
"""
repository internal objects holder

View File

@ -2,15 +2,15 @@ import pytest
from pytest_mock import MockerFixture
from ahriman.application.application.application_packages import ApplicationPackages
from ahriman.application.application.application_properties import ApplicationProperties
from ahriman.application.application.application_repository import ApplicationRepository
from ahriman.application.application.packages import Packages
from ahriman.application.application.properties import Properties
from ahriman.application.application.repository import Repository
from ahriman.core.configuration import Configuration
from ahriman.core.database.sqlite import SQLite
@pytest.fixture
def application_packages(configuration: Configuration, database: SQLite, mocker: MockerFixture) -> ApplicationPackages:
def application_packages(configuration: Configuration, database: SQLite, mocker: MockerFixture) -> Packages:
"""
fixture for application with package functions
@ -20,16 +20,15 @@ def application_packages(configuration: Configuration, database: SQLite, mocker:
mocker(MockerFixture): mocker object
Returns:
ApplicationPackages: application test instance
Packages: application test instance
"""
mocker.patch("ahriman.models.repository_paths.RepositoryPaths.tree_create")
mocker.patch("ahriman.core.database.sqlite.SQLite.load", return_value=database)
return ApplicationPackages("x86_64", configuration, no_report=True, unsafe=False)
return Packages("x86_64", configuration, no_report=True, unsafe=False)
@pytest.fixture
def application_properties(configuration: Configuration, database: SQLite,
mocker: MockerFixture) -> ApplicationProperties:
def application_properties(configuration: Configuration, database: SQLite, mocker: MockerFixture) -> Properties:
"""
fixture for application with properties only
@ -39,16 +38,15 @@ def application_properties(configuration: Configuration, database: SQLite,
mocker(MockerFixture): mocker object
Returns:
ApplicationProperties: application test instance
Properties: application test instance
"""
mocker.patch("ahriman.models.repository_paths.RepositoryPaths.tree_create")
mocker.patch("ahriman.core.database.sqlite.SQLite.load", return_value=database)
return ApplicationProperties("x86_64", configuration, no_report=True, unsafe=False)
return Properties("x86_64", configuration, no_report=True, unsafe=False)
@pytest.fixture
def application_repository(configuration: Configuration, database: SQLite,
mocker: MockerFixture) -> ApplicationRepository:
def application_repository(configuration: Configuration, database: SQLite, mocker: MockerFixture) -> Repository:
"""
fixture for application with repository functions
@ -58,8 +56,8 @@ def application_repository(configuration: Configuration, database: SQLite,
mocker(MockerFixture): mocker object
Returns:
ApplicationRepository: application test instance
Repository: application test instance
"""
mocker.patch("ahriman.models.repository_paths.RepositoryPaths.tree_create")
mocker.patch("ahriman.core.database.sqlite.SQLite.load", return_value=database)
return ApplicationRepository("x86_64", configuration, no_report=True, unsafe=False)
return Repository("x86_64", configuration, no_report=True, unsafe=False)

View File

@ -4,14 +4,14 @@ from pathlib import Path
from pytest_mock import MockerFixture
from unittest.mock import MagicMock
from ahriman.application.application.application_packages import ApplicationPackages
from ahriman.application.application.packages import Packages
from ahriman.models.package import Package
from ahriman.models.package_description import PackageDescription
from ahriman.models.package_source import PackageSource
from ahriman.models.result import Result
def test_finalize(application_packages: ApplicationPackages) -> None:
def test_finalize(application_packages: Packages) -> None:
"""
must raise NotImplemented for missing finalize method
"""
@ -19,7 +19,7 @@ def test_finalize(application_packages: ApplicationPackages) -> None:
application_packages._finalize([])
def test_known_packages(application_packages: ApplicationPackages) -> None:
def test_known_packages(application_packages: Packages) -> None:
"""
must raise NotImplemented for missing known_packages method
"""
@ -27,10 +27,7 @@ def test_known_packages(application_packages: ApplicationPackages) -> None:
application_packages._known_packages()
def test_add_archive(
application_packages: ApplicationPackages,
package_ahriman: Package,
mocker: MockerFixture) -> None:
def test_add_archive(application_packages: Packages, package_ahriman: Package, mocker: MockerFixture) -> None:
"""
must add package from archive
"""
@ -40,14 +37,13 @@ def test_add_archive(
Path(package_ahriman.base), application_packages.repository.paths.packages / package_ahriman.base)
def test_add_aur(application_packages: ApplicationPackages, package_ahriman: Package, mocker: MockerFixture) -> None:
def test_add_aur(application_packages: Packages, package_ahriman: Package, mocker: MockerFixture) -> None:
"""
must add package from AUR
"""
mocker.patch("ahriman.models.package.Package.load", return_value=package_ahriman)
load_mock = mocker.patch("ahriman.core.build_tools.sources.Sources.load")
dependencies_mock = mocker.patch(
"ahriman.application.application.application_packages.ApplicationPackages._process_dependencies")
dependencies_mock = mocker.patch("ahriman.application.application.packages.Packages._process_dependencies")
build_queue_mock = mocker.patch("ahriman.core.database.sqlite.SQLite.build_queue_insert")
application_packages._add_aur(package_ahriman.base, set(), False)
@ -59,10 +55,7 @@ def test_add_aur(application_packages: ApplicationPackages, package_ahriman: Pac
build_queue_mock.assert_called_once_with(package_ahriman)
def test_add_directory(
application_packages: ApplicationPackages,
package_ahriman: Package,
mocker: MockerFixture) -> None:
def test_add_directory(application_packages: Packages, package_ahriman: Package, mocker: MockerFixture) -> None:
"""
must add packages from directory
"""
@ -76,15 +69,14 @@ def test_add_directory(
copy_mock.assert_called_once_with(filename, application_packages.repository.paths.packages / filename.name)
def test_add_local(application_packages: ApplicationPackages, package_ahriman: Package, mocker: MockerFixture) -> None:
def test_add_local(application_packages: Packages, package_ahriman: Package, mocker: MockerFixture) -> None:
"""
must add package from local sources
"""
mocker.patch("ahriman.models.package.Package.load", return_value=package_ahriman)
init_mock = mocker.patch("ahriman.core.build_tools.sources.Sources.init")
copytree_mock = mocker.patch("shutil.copytree")
dependencies_mock = mocker.patch(
"ahriman.application.application.application_packages.ApplicationPackages._process_dependencies")
dependencies_mock = mocker.patch("ahriman.application.application.packages.Packages._process_dependencies")
build_queue_mock = mocker.patch("ahriman.core.database.sqlite.SQLite.build_queue_insert")
application_packages._add_local(package_ahriman.base, set(), False)
@ -95,7 +87,7 @@ def test_add_local(application_packages: ApplicationPackages, package_ahriman: P
build_queue_mock.assert_called_once_with(package_ahriman)
def test_add_remote(application_packages: ApplicationPackages, package_description_ahriman: PackageDescription,
def test_add_remote(application_packages: Packages, package_description_ahriman: PackageDescription,
mocker: MockerFixture) -> None:
"""
must add package from remote source
@ -112,120 +104,109 @@ def test_add_remote(application_packages: ApplicationPackages, package_descripti
response_mock.raise_for_status.assert_called_once_with()
def test_process_dependencies(application_packages: ApplicationPackages, mocker: MockerFixture) -> None:
def test_process_dependencies(application_packages: Packages, mocker: MockerFixture) -> None:
"""
must process dependencies addition
"""
missing = {"python"}
path = Path("local")
dependencies_mock = mocker.patch("ahriman.models.package.Package.dependencies", return_value=missing)
add_mock = mocker.patch("ahriman.application.application.application_packages.ApplicationPackages.add")
add_mock = mocker.patch("ahriman.application.application.packages.Packages.add")
application_packages._process_dependencies(path, set(), False)
dependencies_mock.assert_called_once_with(path)
add_mock.assert_called_once_with(missing, PackageSource.AUR, False)
def test_process_dependencies_missing(application_packages: ApplicationPackages, mocker: MockerFixture) -> None:
def test_process_dependencies_missing(application_packages: Packages, mocker: MockerFixture) -> None:
"""
must process dependencies addition only for missing packages
"""
path = Path("local")
dependencies_mock = mocker.patch("ahriman.models.package.Package.dependencies",
return_value={"python", "python-aiohttp"})
add_mock = mocker.patch("ahriman.application.application.application_packages.ApplicationPackages.add")
add_mock = mocker.patch("ahriman.application.application.packages.Packages.add")
application_packages._process_dependencies(path, {"python"}, False)
dependencies_mock.assert_called_once_with(path)
add_mock.assert_called_once_with({"python-aiohttp"}, PackageSource.AUR, False)
def test_process_dependencies_skip(application_packages: ApplicationPackages, mocker: MockerFixture) -> None:
def test_process_dependencies_skip(application_packages: Packages, mocker: MockerFixture) -> None:
"""
must skip dependencies processing
"""
dependencies_mock = mocker.patch("ahriman.models.package.Package.dependencies")
add_mock = mocker.patch("ahriman.application.application.application_packages.ApplicationPackages.add")
add_mock = mocker.patch("ahriman.application.application.packages.Packages.add")
application_packages._process_dependencies(Path("local"), set(), True)
dependencies_mock.assert_not_called()
add_mock.assert_not_called()
def test_add_add_archive(application_packages: ApplicationPackages, package_ahriman: Package,
mocker: MockerFixture) -> None:
def test_add_add_archive(application_packages: Packages, package_ahriman: Package, mocker: MockerFixture) -> None:
"""
must add package from archive via add function
"""
mocker.patch("ahriman.application.application.application_packages.ApplicationPackages._known_packages",
return_value=set())
add_mock = mocker.patch("ahriman.application.application.application_packages.ApplicationPackages._add_archive")
mocker.patch("ahriman.application.application.packages.Packages._known_packages", return_value=set())
add_mock = mocker.patch("ahriman.application.application.packages.Packages._add_archive")
application_packages.add([package_ahriman.base], PackageSource.Archive, False)
add_mock.assert_called_once_with(package_ahriman.base, set(), False)
def test_add_add_aur(
application_packages: ApplicationPackages,
package_ahriman: Package,
mocker: MockerFixture) -> None:
def test_add_add_aur(application_packages: Packages, package_ahriman: Package, mocker: MockerFixture) -> None:
"""
must add package from AUR via add function
"""
mocker.patch("ahriman.application.application.application_packages.ApplicationPackages._known_packages",
return_value=set())
add_mock = mocker.patch("ahriman.application.application.application_packages.ApplicationPackages._add_aur")
mocker.patch("ahriman.application.application.packages.Packages._known_packages", return_value=set())
add_mock = mocker.patch("ahriman.application.application.packages.Packages._add_aur")
application_packages.add([package_ahriman.base], PackageSource.AUR, True)
add_mock.assert_called_once_with(package_ahriman.base, set(), True)
def test_add_add_directory(application_packages: ApplicationPackages, package_ahriman: Package,
mocker: MockerFixture) -> None:
def test_add_add_directory(application_packages: Packages, package_ahriman: Package, mocker: MockerFixture) -> None:
"""
must add packages from directory via add function
"""
mocker.patch("ahriman.application.application.application_packages.ApplicationPackages._known_packages",
return_value=set())
add_mock = mocker.patch("ahriman.application.application.application_packages.ApplicationPackages._add_directory")
mocker.patch("ahriman.application.application.packages.Packages._known_packages", return_value=set())
add_mock = mocker.patch("ahriman.application.application.packages.Packages._add_directory")
application_packages.add([package_ahriman.base], PackageSource.Directory, False)
add_mock.assert_called_once_with(package_ahriman.base, set(), False)
def test_add_add_local(application_packages: ApplicationPackages, package_ahriman: Package,
mocker: MockerFixture) -> None:
def test_add_add_local(application_packages: Packages, package_ahriman: Package, mocker: MockerFixture) -> None:
"""
must add package from local sources via add function
"""
mocker.patch("ahriman.application.application.application_packages.ApplicationPackages._known_packages",
return_value=set())
add_mock = mocker.patch("ahriman.application.application.application_packages.ApplicationPackages._add_local")
mocker.patch("ahriman.application.application.packages.Packages._known_packages", return_value=set())
add_mock = mocker.patch("ahriman.application.application.packages.Packages._add_local")
application_packages.add([package_ahriman.base], PackageSource.Local, False)
add_mock.assert_called_once_with(package_ahriman.base, set(), False)
def test_add_add_remote(application_packages: ApplicationPackages, package_description_ahriman: PackageDescription,
def test_add_add_remote(application_packages: Packages, package_description_ahriman: PackageDescription,
mocker: MockerFixture) -> None:
"""
must add package from remote source via add function
"""
mocker.patch("ahriman.application.application.application_packages.ApplicationPackages._known_packages",
return_value=set())
add_mock = mocker.patch("ahriman.application.application.application_packages.ApplicationPackages._add_remote")
mocker.patch("ahriman.application.application.packages.Packages._known_packages", return_value=set())
add_mock = mocker.patch("ahriman.application.application.packages.Packages._add_remote")
url = f"https://host/{package_description_ahriman.filename}"
application_packages.add([url], PackageSource.Remote, False)
add_mock.assert_called_once_with(url, set(), False)
def test_remove(application_packages: ApplicationPackages, mocker: MockerFixture) -> None:
def test_remove(application_packages: Packages, mocker: MockerFixture) -> None:
"""
must remove package
"""
executor_mock = mocker.patch("ahriman.core.repository.executor.Executor.process_remove")
finalize_mock = mocker.patch("ahriman.application.application.application_packages.ApplicationPackages._finalize")
finalize_mock = mocker.patch("ahriman.application.application.packages.Packages._finalize")
application_packages.remove([])
executor_mock.assert_called_once_with([])

View File

@ -1,7 +1,7 @@
from ahriman.application.application.application_properties import ApplicationProperties
from ahriman.application.application.properties import Properties
def test_create_tree(application_properties: ApplicationProperties) -> None:
def test_create_tree(application_properties: Properties) -> None:
"""
must have repository attribute
"""

View File

@ -3,13 +3,13 @@ import pytest
from pytest_mock import MockerFixture
from unittest import mock
from ahriman.application.application.application_repository import ApplicationRepository
from ahriman.application.application.repository import Repository
from ahriman.core.tree import Leaf, Tree
from ahriman.models.package import Package
from ahriman.models.result import Result
def test_finalize(application_repository: ApplicationRepository) -> None:
def test_finalize(application_repository: Repository) -> None:
"""
must raise NotImplemented for missing finalize method
"""
@ -17,7 +17,7 @@ def test_finalize(application_repository: ApplicationRepository) -> None:
application_repository._finalize([])
def test_clean_cache(application_repository: ApplicationRepository, mocker: MockerFixture) -> None:
def test_clean_cache(application_repository: Repository, mocker: MockerFixture) -> None:
"""
must clean cache directory
"""
@ -26,7 +26,7 @@ def test_clean_cache(application_repository: ApplicationRepository, mocker: Mock
clear_mock.assert_called_once_with()
def test_clean_chroot(application_repository: ApplicationRepository, mocker: MockerFixture) -> None:
def test_clean_chroot(application_repository: Repository, mocker: MockerFixture) -> None:
"""
must clean chroot directory
"""
@ -35,7 +35,7 @@ def test_clean_chroot(application_repository: ApplicationRepository, mocker: Moc
clear_mock.assert_called_once_with()
def test_clean_manual(application_repository: ApplicationRepository, mocker: MockerFixture) -> None:
def test_clean_manual(application_repository: Repository, mocker: MockerFixture) -> None:
"""
must clean manual directory
"""
@ -44,7 +44,7 @@ def test_clean_manual(application_repository: ApplicationRepository, mocker: Moc
clear_mock.assert_called_once_with()
def test_clean_packages(application_repository: ApplicationRepository, mocker: MockerFixture) -> None:
def test_clean_packages(application_repository: Repository, mocker: MockerFixture) -> None:
"""
must clean packages directory
"""
@ -53,7 +53,7 @@ def test_clean_packages(application_repository: ApplicationRepository, mocker: M
clear_mock.assert_called_once_with()
def test_report(application_repository: ApplicationRepository, mocker: MockerFixture) -> None:
def test_report(application_repository: Repository, mocker: MockerFixture) -> None:
"""
must generate report
"""
@ -62,7 +62,7 @@ def test_report(application_repository: ApplicationRepository, mocker: MockerFix
executor_mock.assert_called_once_with(["a"], [])
def test_sign(application_repository: ApplicationRepository, package_ahriman: Package, package_python_schedule: Package,
def test_sign(application_repository: Repository, package_ahriman: Package, package_python_schedule: Package,
mocker: MockerFixture) -> None:
"""
must sign world
@ -70,10 +70,9 @@ def test_sign(application_repository: ApplicationRepository, package_ahriman: Pa
mocker.patch("ahriman.core.repository.repository.Repository.packages",
return_value=[package_ahriman, package_python_schedule])
copy_mock = mocker.patch("shutil.copy")
update_mock = mocker.patch("ahriman.application.application.application_repository.ApplicationRepository.update")
update_mock = mocker.patch("ahriman.application.application.repository.Repository.update")
sign_repository_mock = mocker.patch("ahriman.core.sign.gpg.GPG.process_sign_repository")
finalize_mock = mocker.patch(
"ahriman.application.application.application_repository.ApplicationRepository._finalize")
finalize_mock = mocker.patch("ahriman.application.application.repository.Repository._finalize")
application_repository.sign([])
copy_mock.assert_has_calls([
@ -85,31 +84,29 @@ def test_sign(application_repository: ApplicationRepository, package_ahriman: Pa
finalize_mock.assert_called_once_with(Result())
def test_sign_skip(application_repository: ApplicationRepository, package_ahriman: Package,
mocker: MockerFixture) -> None:
def test_sign_skip(application_repository: Repository, package_ahriman: Package, mocker: MockerFixture) -> None:
"""
must skip sign packages with empty filename
"""
package_ahriman.packages[package_ahriman.base].filename = None
mocker.patch("ahriman.core.repository.repository.Repository.packages", return_value=[package_ahriman])
mocker.patch("ahriman.application.application.application_repository.ApplicationRepository.update")
mocker.patch("ahriman.application.application.application_repository.ApplicationRepository._finalize")
mocker.patch("ahriman.application.application.repository.Repository.update")
mocker.patch("ahriman.application.application.repository.Repository._finalize")
application_repository.sign([])
def test_sign_specific(application_repository: ApplicationRepository, package_ahriman: Package,
package_python_schedule: Package, mocker: MockerFixture) -> None:
def test_sign_specific(application_repository: Repository, package_ahriman: Package, package_python_schedule: Package,
mocker: MockerFixture) -> None:
"""
must sign only specified packages
"""
mocker.patch("ahriman.core.repository.repository.Repository.packages",
return_value=[package_ahriman, package_python_schedule])
copy_mock = mocker.patch("shutil.copy")
update_mock = mocker.patch("ahriman.application.application.application_repository.ApplicationRepository.update")
update_mock = mocker.patch("ahriman.application.application.repository.Repository.update")
sign_repository_mock = mocker.patch("ahriman.core.sign.gpg.GPG.process_sign_repository")
finalize_mock = mocker.patch(
"ahriman.application.application.application_repository.ApplicationRepository._finalize")
finalize_mock = mocker.patch("ahriman.application.application.repository.Repository._finalize")
filename = package_ahriman.packages[package_ahriman.base].filepath
application_repository.sign([package_ahriman.base])
@ -121,7 +118,7 @@ def test_sign_specific(application_repository: ApplicationRepository, package_ah
finalize_mock.assert_called_once_with(Result())
def test_sync(application_repository: ApplicationRepository, mocker: MockerFixture) -> None:
def test_sync(application_repository: Repository, mocker: MockerFixture) -> None:
"""
must sync to remote
"""
@ -130,8 +127,7 @@ def test_sync(application_repository: ApplicationRepository, mocker: MockerFixtu
executor_mock.assert_called_once_with(["a"], [])
def test_unknown_no_aur(application_repository: ApplicationRepository, package_ahriman: Package,
mocker: MockerFixture) -> None:
def test_unknown_no_aur(application_repository: Repository, package_ahriman: Package, mocker: MockerFixture) -> None:
"""
must return empty list in case if there is locally stored PKGBUILD
"""
@ -144,7 +140,7 @@ def test_unknown_no_aur(application_repository: ApplicationRepository, package_a
assert not application_repository.unknown()
def test_unknown_no_aur_no_local(application_repository: ApplicationRepository, package_ahriman: Package,
def test_unknown_no_aur_no_local(application_repository: Repository, package_ahriman: Package,
mocker: MockerFixture) -> None:
"""
must return list of packages missing in aur and in local storage
@ -157,8 +153,7 @@ def test_unknown_no_aur_no_local(application_repository: ApplicationRepository,
assert packages == list(package_ahriman.packages.keys())
def test_unknown_no_local(application_repository: ApplicationRepository, package_ahriman: Package,
mocker: MockerFixture) -> None:
def test_unknown_no_local(application_repository: Repository, package_ahriman: Package, mocker: MockerFixture) -> None:
"""
must return empty list in case if there is package in AUR
"""
@ -169,7 +164,7 @@ def test_unknown_no_local(application_repository: ApplicationRepository, package
assert not application_repository.unknown()
def test_update(application_repository: ApplicationRepository, package_ahriman: Package, result: Result,
def test_update(application_repository: Repository, package_ahriman: Package, result: Result,
mocker: MockerFixture) -> None:
"""
must process package updates
@ -182,8 +177,7 @@ def test_update(application_repository: ApplicationRepository, package_ahriman:
mocker.patch("ahriman.models.package.Package.load", return_value=package_ahriman)
build_mock = mocker.patch("ahriman.core.repository.executor.Executor.process_build", return_value=result)
update_mock = mocker.patch("ahriman.core.repository.executor.Executor.process_update", return_value=result)
finalize_mock = mocker.patch(
"ahriman.application.application.application_repository.ApplicationRepository._finalize")
finalize_mock = mocker.patch("ahriman.application.application.repository.Repository._finalize")
application_repository.update([package_ahriman])
build_mock.assert_called_once_with([package_ahriman])
@ -191,8 +185,7 @@ def test_update(application_repository: ApplicationRepository, package_ahriman:
finalize_mock.assert_has_calls([mock.call(result), mock.call(result)])
def test_update_empty(application_repository: ApplicationRepository, package_ahriman: Package,
mocker: MockerFixture) -> None:
def test_update_empty(application_repository: Repository, package_ahriman: Package, mocker: MockerFixture) -> None:
"""
must skip updating repository if no packages supplied
"""
@ -209,8 +202,7 @@ def test_update_empty(application_repository: ApplicationRepository, package_ahr
update_mock.assert_not_called()
def test_updates_all(application_repository: ApplicationRepository, package_ahriman: Package,
mocker: MockerFixture) -> None:
def test_updates_all(application_repository: Repository, package_ahriman: Package, mocker: MockerFixture) -> None:
"""
must get updates for all
"""
@ -226,7 +218,7 @@ def test_updates_all(application_repository: ApplicationRepository, package_ahri
updates_manual_mock.assert_called_once_with()
def test_updates_disabled(application_repository: ApplicationRepository, mocker: MockerFixture) -> None:
def test_updates_disabled(application_repository: Repository, mocker: MockerFixture) -> None:
"""
must get updates without anything
"""
@ -241,7 +233,7 @@ def test_updates_disabled(application_repository: ApplicationRepository, mocker:
updates_manual_mock.assert_not_called()
def test_updates_no_aur(application_repository: ApplicationRepository, mocker: MockerFixture) -> None:
def test_updates_no_aur(application_repository: Repository, mocker: MockerFixture) -> None:
"""
must get updates without aur
"""
@ -256,7 +248,7 @@ def test_updates_no_aur(application_repository: ApplicationRepository, mocker: M
updates_manual_mock.assert_called_once_with()
def test_updates_no_local(application_repository: ApplicationRepository, mocker: MockerFixture) -> None:
def test_updates_no_local(application_repository: Repository, mocker: MockerFixture) -> None:
"""
must get updates without local packages
"""
@ -271,7 +263,7 @@ def test_updates_no_local(application_repository: ApplicationRepository, mocker:
updates_manual_mock.assert_called_once_with()
def test_updates_no_manual(application_repository: ApplicationRepository, mocker: MockerFixture) -> None:
def test_updates_no_manual(application_repository: Repository, mocker: MockerFixture) -> None:
"""
must get updates without manual
"""
@ -286,7 +278,7 @@ def test_updates_no_manual(application_repository: ApplicationRepository, mocker
updates_manual_mock.assert_not_called()
def test_updates_no_vcs(application_repository: ApplicationRepository, mocker: MockerFixture) -> None:
def test_updates_no_vcs(application_repository: Repository, mocker: MockerFixture) -> None:
"""
must get updates without VCS
"""
@ -301,7 +293,7 @@ def test_updates_no_vcs(application_repository: ApplicationRepository, mocker: M
updates_manual_mock.assert_called_once_with()
def test_updates_with_filter(application_repository: ApplicationRepository, mocker: MockerFixture) -> None:
def test_updates_with_filter(application_repository: Repository, mocker: MockerFixture) -> None:
"""
must get updates with filter
"""

View File

@ -4,12 +4,12 @@ import pytest
from pathlib import Path
from pytest_mock import MockerFixture
from ahriman.application.handlers import Users
from ahriman.application.handlers import User
from ahriman.core.configuration import Configuration
from ahriman.core.database.sqlite import SQLite
from ahriman.core.exceptions import InitializeException
from ahriman.models.action import Action
from ahriman.models.user import User
from ahriman.models.user import User as MUser
from ahriman.models.user_access import UserAccess
@ -38,16 +38,16 @@ def test_run(args: argparse.Namespace, configuration: Configuration, database: S
must run command
"""
args = _default_args(args)
user = User(args.username, args.password, args.role)
user = MUser(args.username, args.password, args.role)
mocker.patch("ahriman.core.database.sqlite.SQLite.load", return_value=database)
mocker.patch("ahriman.models.user.User.hash_password", return_value=user)
get_auth_configuration_mock = mocker.patch("ahriman.application.handlers.Users.configuration_get")
create_configuration_mock = mocker.patch("ahriman.application.handlers.Users.configuration_create")
create_user_mock = mocker.patch("ahriman.application.handlers.Users.user_create", return_value=user)
get_salt_mock = mocker.patch("ahriman.application.handlers.Users.get_salt", return_value="salt")
get_auth_configuration_mock = mocker.patch("ahriman.application.handlers.User.configuration_get")
create_configuration_mock = mocker.patch("ahriman.application.handlers.User.configuration_create")
create_user_mock = mocker.patch("ahriman.application.handlers.User.user_create", return_value=user)
get_salt_mock = mocker.patch("ahriman.application.handlers.User.get_salt", return_value="salt")
update_mock = mocker.patch("ahriman.core.database.sqlite.SQLite.user_update")
Users.run(args, "x86_64", configuration, True, False)
User.run(args, "x86_64", configuration, True, False)
get_auth_configuration_mock.assert_called_once_with(configuration.include)
create_configuration_mock.assert_called_once_with(pytest.helpers.anyvar(int), pytest.helpers.anyvar(int),
pytest.helpers.anyvar(int), args.as_service, args.secure)
@ -67,7 +67,7 @@ def test_run_list(args: argparse.Namespace, configuration: Configuration, databa
check_mock = mocker.patch("ahriman.application.handlers.handler.Handler.check_if_empty")
list_mock = mocker.patch("ahriman.core.database.sqlite.SQLite.user_list", return_value=[user])
Users.run(args, "x86_64", configuration, True, False)
User.run(args, "x86_64", configuration, True, False)
list_mock.assert_called_once_with("user", args.role)
check_mock.assert_called_once_with(False, False)
@ -84,7 +84,7 @@ def test_run_empty_exception(args: argparse.Namespace, configuration: Configurat
mocker.patch("ahriman.core.database.sqlite.SQLite.user_list", return_value=[])
check_mock = mocker.patch("ahriman.application.handlers.handler.Handler.check_if_empty")
Users.run(args, "x86_64", configuration, True, False)
User.run(args, "x86_64", configuration, True, False)
check_mock.assert_called_once_with(True, True)
@ -98,36 +98,36 @@ def test_run_remove(args: argparse.Namespace, configuration: Configuration, data
mocker.patch("ahriman.core.database.sqlite.SQLite.load", return_value=database)
remove_mock = mocker.patch("ahriman.core.database.sqlite.SQLite.user_remove")
Users.run(args, "x86_64", configuration, True, False)
User.run(args, "x86_64", configuration, True, False)
remove_mock.assert_called_once_with(args.username)
def test_configuration_create(configuration: Configuration, user: User, mocker: MockerFixture) -> None:
def test_configuration_create(configuration: Configuration, user: MUser, mocker: MockerFixture) -> None:
"""
must correctly create configuration file
"""
mocker.patch("pathlib.Path.open")
set_mock = mocker.patch("ahriman.core.configuration.Configuration.set_option")
write_mock = mocker.patch("ahriman.application.handlers.Users.configuration_write")
write_mock = mocker.patch("ahriman.application.handlers.User.configuration_write")
Users.configuration_create(configuration, user, "salt", False, False)
User.configuration_create(configuration, user, "salt", False, False)
set_mock.assert_called_once_with("auth", "salt", pytest.helpers.anyvar(int))
write_mock.assert_called_once_with(configuration, False)
def test_configuration_create_with_plain_password(
configuration: Configuration,
user: User,
user: MUser,
mocker: MockerFixture) -> None:
"""
must set plain text password and user for the service
"""
mocker.patch("pathlib.Path.open")
Users.configuration_create(configuration, user, "salt", True, False)
User.configuration_create(configuration, user, "salt", True, False)
generated = User.from_option(user.username, user.password).hash_password("salt")
service = User.from_option(configuration.get("web", "username"), configuration.get("web", "password"))
generated = MUser.from_option(user.username, user.password).hash_password("salt")
service = MUser.from_option(configuration.get("web", "username"), configuration.get("web", "password"))
assert generated.username == service.username
assert generated.check_credentials(service.password, configuration.get("auth", "salt"))
@ -140,7 +140,7 @@ def test_configuration_get(mocker: MockerFixture) -> None:
mocker.patch("pathlib.Path.is_file", return_value=True)
read_mock = mocker.patch("ahriman.core.configuration.Configuration.read")
assert Users.configuration_get(Path("path"))
assert User.configuration_get(Path("path"))
read_mock.assert_called_once_with(Path("path") / "auth.ini")
@ -152,7 +152,7 @@ def test_configuration_write(configuration: Configuration, mocker: MockerFixture
write_mock = mocker.patch("ahriman.core.configuration.Configuration.write")
chmod_mock = mocker.patch("pathlib.Path.chmod")
Users.configuration_write(configuration, secure=True)
User.configuration_write(configuration, secure=True)
write_mock.assert_called_once_with(pytest.helpers.anyvar(int))
chmod_mock.assert_called_once_with(0o600)
@ -165,7 +165,7 @@ def test_configuration_write_insecure(configuration: Configuration, mocker: Mock
mocker.patch("ahriman.core.configuration.Configuration.write")
chmod_mock = mocker.patch("pathlib.Path.chmod")
Users.configuration_write(configuration, secure=False)
User.configuration_write(configuration, secure=False)
chmod_mock.assert_not_called()
@ -177,14 +177,14 @@ def test_configuration_write_not_loaded(configuration: Configuration, mocker: Mo
mocker.patch("pathlib.Path.open")
with pytest.raises(InitializeException):
Users.configuration_write(configuration, secure=True)
User.configuration_write(configuration, secure=True)
def test_get_salt_read(configuration: Configuration) -> None:
"""
must read salt from configuration
"""
assert Users.get_salt(configuration) == "salt"
assert User.get_salt(configuration) == "salt"
def test_get_salt_generate(configuration: Configuration) -> None:
@ -193,17 +193,17 @@ def test_get_salt_generate(configuration: Configuration) -> None:
"""
configuration.remove_option("auth", "salt")
salt = Users.get_salt(configuration, 16)
salt = User.get_salt(configuration, 16)
assert salt
assert len(salt) == 16
def test_user_create(args: argparse.Namespace, user: User) -> None:
def test_user_create(args: argparse.Namespace, user: MUser) -> None:
"""
must create user
"""
args = _default_args(args)
generated = Users.user_create(args)
generated = User.user_create(args)
assert generated.username == user.username
assert generated.access == user.access
@ -216,7 +216,7 @@ def test_user_create_getpass(args: argparse.Namespace, mocker: MockerFixture) ->
args.password = None
getpass_mock = mocker.patch("getpass.getpass", return_value="password")
generated = Users.user_create(args)
generated = User.user_create(args)
getpass_mock.assert_called_once_with()
assert generated.password == "password"
@ -226,4 +226,4 @@ def test_disallow_auto_architecture_run() -> None:
"""
must not allow multi architecture run
"""
assert not Users.ALLOW_AUTO_ARCHITECTURE_RUN
assert not User.ALLOW_AUTO_ARCHITECTURE_RUN

View File

@ -7,6 +7,7 @@ from ahriman.core.database.sqlite import SQLite
from ahriman.core.repository import Repository
from ahriman.core.repository.cleaner import Cleaner
from ahriman.core.repository.executor import Executor
from ahriman.core.repository.properties import Properties
from ahriman.core.repository.update_handler import UpdateHandler
@ -65,6 +66,21 @@ def repository(configuration: Configuration, database: SQLite, mocker: MockerFix
return Repository("x86_64", configuration, database, no_report=True, unsafe=False)
@pytest.fixture
def properties(configuration: Configuration, database: SQLite) -> Properties:
"""
fixture for properties
Args:
configuration(Configuration): configuration fixture
database(SQLite): database fixture
Returns:
Properties: properties test instance
"""
return Properties("x86_64", configuration, database, no_report=True, unsafe=False)
@pytest.fixture
def update_handler(configuration: Configuration, database: SQLite, mocker: MockerFixture) -> UpdateHandler:
"""

View File

@ -3,7 +3,7 @@ from pytest_mock import MockerFixture
from ahriman.core.configuration import Configuration
from ahriman.core.database.sqlite import SQLite
from ahriman.core.exceptions import UnsafeRun
from ahriman.core.repository.repository_properties import RepositoryProperties
from ahriman.core.repository.properties import Properties
from ahriman.core.status.web_client import WebClient
@ -11,9 +11,9 @@ def test_create_tree_on_load(configuration: Configuration, database: SQLite, moc
"""
must create tree on load
"""
mocker.patch("ahriman.core.repository.repository_properties.check_user")
mocker.patch("ahriman.core.repository.properties.check_user")
tree_create_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.tree_create")
RepositoryProperties("x86_64", configuration, database, True, False)
Properties("x86_64", configuration, database, True, False)
tree_create_mock.assert_called_once_with()
@ -22,9 +22,9 @@ def test_create_tree_on_load_unsafe(configuration: Configuration, database: SQLi
"""
must not create tree on load in case if user differs from the root owner
"""
mocker.patch("ahriman.core.repository.repository_properties.check_user", side_effect=UnsafeRun(0, 1))
mocker.patch("ahriman.core.repository.properties.check_user", side_effect=UnsafeRun(0, 1))
tree_create_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.tree_create")
RepositoryProperties("x86_64", configuration, database, True, False)
Properties("x86_64", configuration, database, True, False)
tree_create_mock.assert_not_called()
@ -35,7 +35,7 @@ def test_create_dummy_report_client(configuration: Configuration, database: SQLi
"""
mocker.patch("ahriman.models.repository_paths.RepositoryPaths.tree_create")
load_mock = mocker.patch("ahriman.core.status.client.Client.load")
properties = RepositoryProperties("x86_64", configuration, database, True, False)
properties = Properties("x86_64", configuration, database, True, False)
load_mock.assert_not_called()
assert not isinstance(properties.reporter, WebClient)
@ -47,6 +47,6 @@ def test_create_full_report_client(configuration: Configuration, database: SQLit
"""
mocker.patch("ahriman.models.repository_paths.RepositoryPaths.tree_create")
load_mock = mocker.patch("ahriman.core.status.client.Client.load")
RepositoryProperties("x86_64", configuration, database, False, False)
Properties("x86_64", configuration, database, False, False)
load_mock.assert_called_once_with(configuration)

View File

@ -1,6 +1,6 @@
[tox]
envlist = check, tests
dependencies = -e .[pacman,s3,web]
dependencies = -e .[s3,web]
project_name = ahriman
[pytest]
@ -10,7 +10,7 @@ spec_test_format = {result} {docstring_summary}
[testenv]
deps =
{[tox]dependencies}
-e .[s3,web]
[testenv:check]
deps =