diff --git a/.bandit.toml b/.bandit.toml
new file mode 100644
index 00000000..b97116fd
--- /dev/null
+++ b/.bandit.toml
@@ -0,0 +1,5 @@
+[tool.bandit]
+skips = [
+ "B404",
+ "B603",
+]
diff --git a/.bandit.yml b/.bandit.yml
deleted file mode 100644
index 66e995d0..00000000
--- a/.bandit.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-skips:
- - B404
- - B603
diff --git a/.github/scripts/setup.sh b/.github/scripts/setup.sh
index 48dd2118..0b95bc0c 100755
--- a/.github/scripts/setup.sh
+++ b/.github/scripts/setup.sh
@@ -12,7 +12,7 @@ pacman -Syyu --noconfirm
# main dependencies
pacman -S --noconfirm devtools git npm pyalpm python-bcrypt python-filelock python-inflection python-pyelftools python-requests python-systemd sudo
# make dependencies
-pacman -S --noconfirm --asdeps base-devel python-build python-flit python-installer python-tox python-wheel
+pacman -S --noconfirm --asdeps base-devel python-build python-hatchling python-installer python-tox python-wheel
# optional dependencies
if [[ -z $MINIMAL_INSTALL ]]; then
# web server
@@ -26,10 +26,10 @@ cp "docker/systemd-nspawn.sh" "/usr/local/bin/systemd-nspawn"
# create fresh tarball
tox -e archive
# run makepkg
-PKGVER=$(python -c "from src.ahriman import __version__; print(__version__)")
-mv "dist/ahriman-$PKGVER.tar.gz" package/archlinux
-chmod +777 package/archlinux # because fuck you that's why
-cd package/archlinux
+PKGVER=$(PYTHONPATH=ahriman-core/src python -c "from ahriman import __version__; print(__version__)")
+mv "dist/ahriman-$PKGVER.tar.gz" archlinux
+chmod +777 archlinux # because fuck you that's why
+cd archlinux
sudo -u nobody -- makepkg -cf --skipchecksums --noconfirm
sudo -u nobody -- makepkg --packagelist | grep "ahriman-core-$PKGVER" | pacman -U --noconfirm --nodeps -
if [[ -z $MINIMAL_INSTALL ]]; then
diff --git a/.gitignore b/.gitignore
index 5a856dcf..b9016c14 100644
--- a/.gitignore
+++ b/.gitignore
@@ -103,5 +103,8 @@ docs/html/
# Frontend
node_modules/
package-lock.json
-package/share/ahriman/templates/static/index.js
-package/share/ahriman/templates/static/index.css
+ahriman-web/package/share/ahriman/templates/static/index.js
+ahriman-web/package/share/ahriman/templates/static/index.css
+
+# local configs
+/*.ini
diff --git a/.pytest.ini b/.pytest.ini
deleted file mode 100644
index 85345048..00000000
--- a/.pytest.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[pytest]
-addopts = --cov=ahriman --cov-report=term-missing:skip-covered --no-cov-on-fail --cov-fail-under=100 --spec
-asyncio_default_fixture_loop_scope = function
-asyncio_mode = auto
-spec_test_format = {result} {docstring_summary}
diff --git a/.pytest.toml b/.pytest.toml
new file mode 100644
index 00000000..2fa361e1
--- /dev/null
+++ b/.pytest.toml
@@ -0,0 +1,8 @@
+[pytest]
+addopts = [
+ "--spec",
+]
+asyncio_default_fixture_loop_scope = "function"
+asyncio_mode = "auto"
+"resource-path.directory-name-test-resources" = "../../tests/testresources"
+spec_test_format = "{result} {docstring_summary}"
diff --git a/package/lib/systemd/system/ahriman-daemon@.service b/ahriman-core/package/lib/systemd/system/ahriman-daemon@.service
similarity index 100%
rename from package/lib/systemd/system/ahriman-daemon@.service
rename to ahriman-core/package/lib/systemd/system/ahriman-daemon@.service
diff --git a/package/lib/systemd/system/ahriman@.service b/ahriman-core/package/lib/systemd/system/ahriman@.service
similarity index 100%
rename from package/lib/systemd/system/ahriman@.service
rename to ahriman-core/package/lib/systemd/system/ahriman@.service
diff --git a/package/lib/systemd/system/ahriman@.timer b/ahriman-core/package/lib/systemd/system/ahriman@.timer
similarity index 100%
rename from package/lib/systemd/system/ahriman@.timer
rename to ahriman-core/package/lib/systemd/system/ahriman@.timer
diff --git a/package/share/ahriman/settings/ahriman.ini b/ahriman-core/package/share/ahriman/settings/ahriman.ini
similarity index 100%
rename from package/share/ahriman/settings/ahriman.ini
rename to ahriman-core/package/share/ahriman/settings/ahriman.ini
diff --git a/package/share/ahriman/settings/ahriman.ini.d/00-housekeeping.ini b/ahriman-core/package/share/ahriman/settings/ahriman.ini.d/00-housekeeping.ini
similarity index 100%
rename from package/share/ahriman/settings/ahriman.ini.d/00-housekeeping.ini
rename to ahriman-core/package/share/ahriman/settings/ahriman.ini.d/00-housekeeping.ini
diff --git a/package/share/ahriman/settings/ahriman.ini.d/logging.ini b/ahriman-core/package/share/ahriman/settings/ahriman.ini.d/logging.ini
similarity index 100%
rename from package/share/ahriman/settings/ahriman.ini.d/logging.ini
rename to ahriman-core/package/share/ahriman/settings/ahriman.ini.d/logging.ini
diff --git a/package/share/ahriman/templates/email-index.jinja2 b/ahriman-core/package/share/ahriman/templates/email-index.jinja2
similarity index 100%
rename from package/share/ahriman/templates/email-index.jinja2
rename to ahriman-core/package/share/ahriman/templates/email-index.jinja2
diff --git a/package/share/ahriman/templates/repo-index.jinja2 b/ahriman-core/package/share/ahriman/templates/repo-index.jinja2
similarity index 100%
rename from package/share/ahriman/templates/repo-index.jinja2
rename to ahriman-core/package/share/ahriman/templates/repo-index.jinja2
diff --git a/package/share/ahriman/templates/rss.jinja2 b/ahriman-core/package/share/ahriman/templates/rss.jinja2
similarity index 100%
rename from package/share/ahriman/templates/rss.jinja2
rename to ahriman-core/package/share/ahriman/templates/rss.jinja2
diff --git a/package/share/ahriman/templates/shell b/ahriman-core/package/share/ahriman/templates/shell
similarity index 100%
rename from package/share/ahriman/templates/shell
rename to ahriman-core/package/share/ahriman/templates/shell
diff --git a/package/share/ahriman/templates/telegram-index.jinja2 b/ahriman-core/package/share/ahriman/templates/telegram-index.jinja2
similarity index 100%
rename from package/share/ahriman/templates/telegram-index.jinja2
rename to ahriman-core/package/share/ahriman/templates/telegram-index.jinja2
diff --git a/package/share/ahriman/templates/utils/bootstrap-scripts.jinja2 b/ahriman-core/package/share/ahriman/templates/utils/bootstrap-scripts.jinja2
similarity index 100%
rename from package/share/ahriman/templates/utils/bootstrap-scripts.jinja2
rename to ahriman-core/package/share/ahriman/templates/utils/bootstrap-scripts.jinja2
diff --git a/package/share/ahriman/templates/utils/style.jinja2 b/ahriman-core/package/share/ahriman/templates/utils/style.jinja2
similarity index 100%
rename from package/share/ahriman/templates/utils/style.jinja2
rename to ahriman-core/package/share/ahriman/templates/utils/style.jinja2
diff --git a/package/share/bash-completion/completions/_ahriman b/ahriman-core/package/share/bash-completion/completions/_ahriman
similarity index 100%
rename from package/share/bash-completion/completions/_ahriman
rename to ahriman-core/package/share/bash-completion/completions/_ahriman
diff --git a/package/share/man/man1/ahriman.1 b/ahriman-core/package/share/man/man1/ahriman.1
similarity index 100%
rename from package/share/man/man1/ahriman.1
rename to ahriman-core/package/share/man/man1/ahriman.1
diff --git a/package/share/zsh/site-functions/_ahriman b/ahriman-core/package/share/zsh/site-functions/_ahriman
similarity index 100%
rename from package/share/zsh/site-functions/_ahriman
rename to ahriman-core/package/share/zsh/site-functions/_ahriman
diff --git a/ahriman-core/pyproject.toml b/ahriman-core/pyproject.toml
new file mode 100644
index 00000000..27fb8f38
--- /dev/null
+++ b/ahriman-core/pyproject.toml
@@ -0,0 +1,64 @@
+[build-system]
+requires = [
+ "hatchling",
+]
+build-backend = "hatchling.build"
+
+[project]
+name = "ahriman-core"
+dependencies = [
+ "bcrypt",
+ "filelock",
+ "inflection",
+ "pyelftools",
+ "requests",
+]
+description = "ArcH linux ReposItory MANager, core package"
+dynamic = [
+ "version",
+]
+requires-python = ">=3.13"
+
+[project.optional-dependencies]
+journald = [
+ "systemd-python",
+]
+# 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",
+]
+reports = [
+ "Jinja2",
+]
+s3 = [
+ "boto3",
+]
+shell = [
+ "IPython",
+]
+stats = [
+ "matplotlib",
+]
+unixsocket = [
+ "requests-unixsocket2", # required by unix socket support
+]
+validator = [
+ "cerberus",
+]
+
+[project.scripts]
+ahriman = "ahriman.application.ahriman:run"
+
+[tool.hatch.build.targets.wheel]
+packages = [
+ "src/ahriman",
+]
+
+[tool.hatch.build.targets.wheel.shared-data]
+"package/lib" = "lib"
+"package/share" = "share"
+
+[tool.hatch.version]
+path = "src/ahriman/__init__.py"
diff --git a/src/ahriman/__init__.py b/ahriman-core/src/ahriman/__init__.py
similarity index 100%
rename from src/ahriman/__init__.py
rename to ahriman-core/src/ahriman/__init__.py
diff --git a/src/ahriman/application/__init__.py b/ahriman-core/src/ahriman/application/__init__.py
similarity index 100%
rename from src/ahriman/application/__init__.py
rename to ahriman-core/src/ahriman/application/__init__.py
diff --git a/src/ahriman/application/ahriman.py b/ahriman-core/src/ahriman/application/ahriman.py
similarity index 100%
rename from src/ahriman/application/ahriman.py
rename to ahriman-core/src/ahriman/application/ahriman.py
diff --git a/src/ahriman/application/application/__init__.py b/ahriman-core/src/ahriman/application/application/__init__.py
similarity index 100%
rename from src/ahriman/application/application/__init__.py
rename to ahriman-core/src/ahriman/application/application/__init__.py
diff --git a/src/ahriman/application/application/application.py b/ahriman-core/src/ahriman/application/application/application.py
similarity index 100%
rename from src/ahriman/application/application/application.py
rename to ahriman-core/src/ahriman/application/application/application.py
diff --git a/src/ahriman/application/application/application_packages.py b/ahriman-core/src/ahriman/application/application/application_packages.py
similarity index 100%
rename from src/ahriman/application/application/application_packages.py
rename to ahriman-core/src/ahriman/application/application/application_packages.py
diff --git a/src/ahriman/application/application/application_properties.py b/ahriman-core/src/ahriman/application/application/application_properties.py
similarity index 100%
rename from src/ahriman/application/application/application_properties.py
rename to ahriman-core/src/ahriman/application/application/application_properties.py
diff --git a/src/ahriman/application/application/application_repository.py b/ahriman-core/src/ahriman/application/application/application_repository.py
similarity index 100%
rename from src/ahriman/application/application/application_repository.py
rename to ahriman-core/src/ahriman/application/application/application_repository.py
diff --git a/src/ahriman/application/application/updates_iterator.py b/ahriman-core/src/ahriman/application/application/updates_iterator.py
similarity index 100%
rename from src/ahriman/application/application/updates_iterator.py
rename to ahriman-core/src/ahriman/application/application/updates_iterator.py
diff --git a/src/ahriman/application/application/workers/__init__.py b/ahriman-core/src/ahriman/application/application/workers/__init__.py
similarity index 100%
rename from src/ahriman/application/application/workers/__init__.py
rename to ahriman-core/src/ahriman/application/application/workers/__init__.py
diff --git a/src/ahriman/application/application/workers/local_updater.py b/ahriman-core/src/ahriman/application/application/workers/local_updater.py
similarity index 100%
rename from src/ahriman/application/application/workers/local_updater.py
rename to ahriman-core/src/ahriman/application/application/workers/local_updater.py
diff --git a/src/ahriman/application/application/workers/remote_updater.py b/ahriman-core/src/ahriman/application/application/workers/remote_updater.py
similarity index 100%
rename from src/ahriman/application/application/workers/remote_updater.py
rename to ahriman-core/src/ahriman/application/application/workers/remote_updater.py
diff --git a/src/ahriman/application/application/workers/updater.py b/ahriman-core/src/ahriman/application/application/workers/updater.py
similarity index 100%
rename from src/ahriman/application/application/workers/updater.py
rename to ahriman-core/src/ahriman/application/application/workers/updater.py
diff --git a/src/ahriman/application/handlers/__init__.py b/ahriman-core/src/ahriman/application/handlers/__init__.py
similarity index 100%
rename from src/ahriman/application/handlers/__init__.py
rename to ahriman-core/src/ahriman/application/handlers/__init__.py
diff --git a/src/ahriman/application/handlers/add.py b/ahriman-core/src/ahriman/application/handlers/add.py
similarity index 100%
rename from src/ahriman/application/handlers/add.py
rename to ahriman-core/src/ahriman/application/handlers/add.py
diff --git a/src/ahriman/application/handlers/archives.py b/ahriman-core/src/ahriman/application/handlers/archives.py
similarity index 100%
rename from src/ahriman/application/handlers/archives.py
rename to ahriman-core/src/ahriman/application/handlers/archives.py
diff --git a/src/ahriman/application/handlers/backup.py b/ahriman-core/src/ahriman/application/handlers/backup.py
similarity index 100%
rename from src/ahriman/application/handlers/backup.py
rename to ahriman-core/src/ahriman/application/handlers/backup.py
diff --git a/src/ahriman/application/handlers/change.py b/ahriman-core/src/ahriman/application/handlers/change.py
similarity index 100%
rename from src/ahriman/application/handlers/change.py
rename to ahriman-core/src/ahriman/application/handlers/change.py
diff --git a/src/ahriman/application/handlers/clean.py b/ahriman-core/src/ahriman/application/handlers/clean.py
similarity index 100%
rename from src/ahriman/application/handlers/clean.py
rename to ahriman-core/src/ahriman/application/handlers/clean.py
diff --git a/src/ahriman/application/handlers/copy.py b/ahriman-core/src/ahriman/application/handlers/copy.py
similarity index 100%
rename from src/ahriman/application/handlers/copy.py
rename to ahriman-core/src/ahriman/application/handlers/copy.py
diff --git a/src/ahriman/application/handlers/daemon.py b/ahriman-core/src/ahriman/application/handlers/daemon.py
similarity index 100%
rename from src/ahriman/application/handlers/daemon.py
rename to ahriman-core/src/ahriman/application/handlers/daemon.py
diff --git a/src/ahriman/application/handlers/dump.py b/ahriman-core/src/ahriman/application/handlers/dump.py
similarity index 100%
rename from src/ahriman/application/handlers/dump.py
rename to ahriman-core/src/ahriman/application/handlers/dump.py
diff --git a/src/ahriman/application/handlers/handler.py b/ahriman-core/src/ahriman/application/handlers/handler.py
similarity index 100%
rename from src/ahriman/application/handlers/handler.py
rename to ahriman-core/src/ahriman/application/handlers/handler.py
diff --git a/src/ahriman/application/handlers/help.py b/ahriman-core/src/ahriman/application/handlers/help.py
similarity index 100%
rename from src/ahriman/application/handlers/help.py
rename to ahriman-core/src/ahriman/application/handlers/help.py
diff --git a/src/ahriman/application/handlers/hold.py b/ahriman-core/src/ahriman/application/handlers/hold.py
similarity index 100%
rename from src/ahriman/application/handlers/hold.py
rename to ahriman-core/src/ahriman/application/handlers/hold.py
diff --git a/src/ahriman/application/handlers/key_import.py b/ahriman-core/src/ahriman/application/handlers/key_import.py
similarity index 100%
rename from src/ahriman/application/handlers/key_import.py
rename to ahriman-core/src/ahriman/application/handlers/key_import.py
diff --git a/src/ahriman/application/handlers/patch.py b/ahriman-core/src/ahriman/application/handlers/patch.py
similarity index 100%
rename from src/ahriman/application/handlers/patch.py
rename to ahriman-core/src/ahriman/application/handlers/patch.py
diff --git a/src/ahriman/application/handlers/pkgbuild.py b/ahriman-core/src/ahriman/application/handlers/pkgbuild.py
similarity index 100%
rename from src/ahriman/application/handlers/pkgbuild.py
rename to ahriman-core/src/ahriman/application/handlers/pkgbuild.py
diff --git a/src/ahriman/application/handlers/rebuild.py b/ahriman-core/src/ahriman/application/handlers/rebuild.py
similarity index 100%
rename from src/ahriman/application/handlers/rebuild.py
rename to ahriman-core/src/ahriman/application/handlers/rebuild.py
diff --git a/src/ahriman/application/handlers/reload.py b/ahriman-core/src/ahriman/application/handlers/reload.py
similarity index 100%
rename from src/ahriman/application/handlers/reload.py
rename to ahriman-core/src/ahriman/application/handlers/reload.py
diff --git a/src/ahriman/application/handlers/remove.py b/ahriman-core/src/ahriman/application/handlers/remove.py
similarity index 100%
rename from src/ahriman/application/handlers/remove.py
rename to ahriman-core/src/ahriman/application/handlers/remove.py
diff --git a/src/ahriman/application/handlers/remove_unknown.py b/ahriman-core/src/ahriman/application/handlers/remove_unknown.py
similarity index 100%
rename from src/ahriman/application/handlers/remove_unknown.py
rename to ahriman-core/src/ahriman/application/handlers/remove_unknown.py
diff --git a/src/ahriman/application/handlers/repositories.py b/ahriman-core/src/ahriman/application/handlers/repositories.py
similarity index 100%
rename from src/ahriman/application/handlers/repositories.py
rename to ahriman-core/src/ahriman/application/handlers/repositories.py
diff --git a/src/ahriman/application/handlers/restore.py b/ahriman-core/src/ahriman/application/handlers/restore.py
similarity index 100%
rename from src/ahriman/application/handlers/restore.py
rename to ahriman-core/src/ahriman/application/handlers/restore.py
diff --git a/src/ahriman/application/handlers/rollback.py b/ahriman-core/src/ahriman/application/handlers/rollback.py
similarity index 100%
rename from src/ahriman/application/handlers/rollback.py
rename to ahriman-core/src/ahriman/application/handlers/rollback.py
diff --git a/src/ahriman/application/handlers/run.py b/ahriman-core/src/ahriman/application/handlers/run.py
similarity index 100%
rename from src/ahriman/application/handlers/run.py
rename to ahriman-core/src/ahriman/application/handlers/run.py
diff --git a/src/ahriman/application/handlers/search.py b/ahriman-core/src/ahriman/application/handlers/search.py
similarity index 100%
rename from src/ahriman/application/handlers/search.py
rename to ahriman-core/src/ahriman/application/handlers/search.py
diff --git a/src/ahriman/application/handlers/service_updates.py b/ahriman-core/src/ahriman/application/handlers/service_updates.py
similarity index 100%
rename from src/ahriman/application/handlers/service_updates.py
rename to ahriman-core/src/ahriman/application/handlers/service_updates.py
diff --git a/src/ahriman/application/handlers/setup.py b/ahriman-core/src/ahriman/application/handlers/setup.py
similarity index 100%
rename from src/ahriman/application/handlers/setup.py
rename to ahriman-core/src/ahriman/application/handlers/setup.py
diff --git a/src/ahriman/application/handlers/shell.py b/ahriman-core/src/ahriman/application/handlers/shell.py
similarity index 100%
rename from src/ahriman/application/handlers/shell.py
rename to ahriman-core/src/ahriman/application/handlers/shell.py
diff --git a/src/ahriman/application/handlers/sign.py b/ahriman-core/src/ahriman/application/handlers/sign.py
similarity index 100%
rename from src/ahriman/application/handlers/sign.py
rename to ahriman-core/src/ahriman/application/handlers/sign.py
diff --git a/src/ahriman/application/handlers/statistics.py b/ahriman-core/src/ahriman/application/handlers/statistics.py
similarity index 100%
rename from src/ahriman/application/handlers/statistics.py
rename to ahriman-core/src/ahriman/application/handlers/statistics.py
diff --git a/src/ahriman/application/handlers/status.py b/ahriman-core/src/ahriman/application/handlers/status.py
similarity index 100%
rename from src/ahriman/application/handlers/status.py
rename to ahriman-core/src/ahriman/application/handlers/status.py
diff --git a/src/ahriman/application/handlers/status_update.py b/ahriman-core/src/ahriman/application/handlers/status_update.py
similarity index 100%
rename from src/ahriman/application/handlers/status_update.py
rename to ahriman-core/src/ahriman/application/handlers/status_update.py
diff --git a/src/ahriman/application/handlers/structure.py b/ahriman-core/src/ahriman/application/handlers/structure.py
similarity index 100%
rename from src/ahriman/application/handlers/structure.py
rename to ahriman-core/src/ahriman/application/handlers/structure.py
diff --git a/src/ahriman/application/handlers/tree_migrate.py b/ahriman-core/src/ahriman/application/handlers/tree_migrate.py
similarity index 100%
rename from src/ahriman/application/handlers/tree_migrate.py
rename to ahriman-core/src/ahriman/application/handlers/tree_migrate.py
diff --git a/src/ahriman/application/handlers/triggers.py b/ahriman-core/src/ahriman/application/handlers/triggers.py
similarity index 100%
rename from src/ahriman/application/handlers/triggers.py
rename to ahriman-core/src/ahriman/application/handlers/triggers.py
diff --git a/src/ahriman/application/handlers/unsafe_commands.py b/ahriman-core/src/ahriman/application/handlers/unsafe_commands.py
similarity index 100%
rename from src/ahriman/application/handlers/unsafe_commands.py
rename to ahriman-core/src/ahriman/application/handlers/unsafe_commands.py
diff --git a/src/ahriman/application/handlers/update.py b/ahriman-core/src/ahriman/application/handlers/update.py
similarity index 100%
rename from src/ahriman/application/handlers/update.py
rename to ahriman-core/src/ahriman/application/handlers/update.py
diff --git a/src/ahriman/application/handlers/users.py b/ahriman-core/src/ahriman/application/handlers/users.py
similarity index 100%
rename from src/ahriman/application/handlers/users.py
rename to ahriman-core/src/ahriman/application/handlers/users.py
diff --git a/src/ahriman/application/handlers/validate.py b/ahriman-core/src/ahriman/application/handlers/validate.py
similarity index 100%
rename from src/ahriman/application/handlers/validate.py
rename to ahriman-core/src/ahriman/application/handlers/validate.py
diff --git a/src/ahriman/application/handlers/versions.py b/ahriman-core/src/ahriman/application/handlers/versions.py
similarity index 100%
rename from src/ahriman/application/handlers/versions.py
rename to ahriman-core/src/ahriman/application/handlers/versions.py
diff --git a/src/ahriman/application/help_formatter.py b/ahriman-core/src/ahriman/application/help_formatter.py
similarity index 100%
rename from src/ahriman/application/help_formatter.py
rename to ahriman-core/src/ahriman/application/help_formatter.py
diff --git a/src/ahriman/application/interactive_shell.py b/ahriman-core/src/ahriman/application/interactive_shell.py
similarity index 100%
rename from src/ahriman/application/interactive_shell.py
rename to ahriman-core/src/ahriman/application/interactive_shell.py
diff --git a/src/ahriman/application/lock.py b/ahriman-core/src/ahriman/application/lock.py
similarity index 100%
rename from src/ahriman/application/lock.py
rename to ahriman-core/src/ahriman/application/lock.py
diff --git a/src/ahriman/core/__init__.py b/ahriman-core/src/ahriman/core/__init__.py
similarity index 100%
rename from src/ahriman/core/__init__.py
rename to ahriman-core/src/ahriman/core/__init__.py
diff --git a/src/ahriman/core/alpm/__init__.py b/ahriman-core/src/ahriman/core/alpm/__init__.py
similarity index 100%
rename from src/ahriman/core/alpm/__init__.py
rename to ahriman-core/src/ahriman/core/alpm/__init__.py
diff --git a/src/ahriman/core/alpm/pacman.py b/ahriman-core/src/ahriman/core/alpm/pacman.py
similarity index 100%
rename from src/ahriman/core/alpm/pacman.py
rename to ahriman-core/src/ahriman/core/alpm/pacman.py
diff --git a/src/ahriman/core/alpm/pacman_database.py b/ahriman-core/src/ahriman/core/alpm/pacman_database.py
similarity index 100%
rename from src/ahriman/core/alpm/pacman_database.py
rename to ahriman-core/src/ahriman/core/alpm/pacman_database.py
diff --git a/src/ahriman/core/alpm/pacman_handle.py b/ahriman-core/src/ahriman/core/alpm/pacman_handle.py
similarity index 100%
rename from src/ahriman/core/alpm/pacman_handle.py
rename to ahriman-core/src/ahriman/core/alpm/pacman_handle.py
diff --git a/src/ahriman/core/alpm/pkgbuild_parser.py b/ahriman-core/src/ahriman/core/alpm/pkgbuild_parser.py
similarity index 100%
rename from src/ahriman/core/alpm/pkgbuild_parser.py
rename to ahriman-core/src/ahriman/core/alpm/pkgbuild_parser.py
diff --git a/src/ahriman/core/alpm/remote/__init__.py b/ahriman-core/src/ahriman/core/alpm/remote/__init__.py
similarity index 100%
rename from src/ahriman/core/alpm/remote/__init__.py
rename to ahriman-core/src/ahriman/core/alpm/remote/__init__.py
diff --git a/src/ahriman/core/alpm/remote/aur.py b/ahriman-core/src/ahriman/core/alpm/remote/aur.py
similarity index 100%
rename from src/ahriman/core/alpm/remote/aur.py
rename to ahriman-core/src/ahriman/core/alpm/remote/aur.py
diff --git a/src/ahriman/core/alpm/remote/official.py b/ahriman-core/src/ahriman/core/alpm/remote/official.py
similarity index 100%
rename from src/ahriman/core/alpm/remote/official.py
rename to ahriman-core/src/ahriman/core/alpm/remote/official.py
diff --git a/src/ahriman/core/alpm/remote/official_syncdb.py b/ahriman-core/src/ahriman/core/alpm/remote/official_syncdb.py
similarity index 100%
rename from src/ahriman/core/alpm/remote/official_syncdb.py
rename to ahriman-core/src/ahriman/core/alpm/remote/official_syncdb.py
diff --git a/src/ahriman/core/alpm/remote/remote.py b/ahriman-core/src/ahriman/core/alpm/remote/remote.py
similarity index 100%
rename from src/ahriman/core/alpm/remote/remote.py
rename to ahriman-core/src/ahriman/core/alpm/remote/remote.py
diff --git a/src/ahriman/core/alpm/repo.py b/ahriman-core/src/ahriman/core/alpm/repo.py
similarity index 100%
rename from src/ahriman/core/alpm/repo.py
rename to ahriman-core/src/ahriman/core/alpm/repo.py
diff --git a/src/ahriman/core/build_tools/__init__.py b/ahriman-core/src/ahriman/core/build_tools/__init__.py
similarity index 100%
rename from src/ahriman/core/build_tools/__init__.py
rename to ahriman-core/src/ahriman/core/build_tools/__init__.py
diff --git a/src/ahriman/core/build_tools/package_archive.py b/ahriman-core/src/ahriman/core/build_tools/package_archive.py
similarity index 100%
rename from src/ahriman/core/build_tools/package_archive.py
rename to ahriman-core/src/ahriman/core/build_tools/package_archive.py
diff --git a/src/ahriman/core/build_tools/package_version.py b/ahriman-core/src/ahriman/core/build_tools/package_version.py
similarity index 100%
rename from src/ahriman/core/build_tools/package_version.py
rename to ahriman-core/src/ahriman/core/build_tools/package_version.py
diff --git a/src/ahriman/core/build_tools/sources.py b/ahriman-core/src/ahriman/core/build_tools/sources.py
similarity index 100%
rename from src/ahriman/core/build_tools/sources.py
rename to ahriman-core/src/ahriman/core/build_tools/sources.py
diff --git a/src/ahriman/core/build_tools/task.py b/ahriman-core/src/ahriman/core/build_tools/task.py
similarity index 100%
rename from src/ahriman/core/build_tools/task.py
rename to ahriman-core/src/ahriman/core/build_tools/task.py
diff --git a/src/ahriman/core/configuration/__init__.py b/ahriman-core/src/ahriman/core/configuration/__init__.py
similarity index 100%
rename from src/ahriman/core/configuration/__init__.py
rename to ahriman-core/src/ahriman/core/configuration/__init__.py
diff --git a/src/ahriman/core/configuration/configuration.py b/ahriman-core/src/ahriman/core/configuration/configuration.py
similarity index 100%
rename from src/ahriman/core/configuration/configuration.py
rename to ahriman-core/src/ahriman/core/configuration/configuration.py
diff --git a/src/ahriman/core/configuration/configuration_multi_dict.py b/ahriman-core/src/ahriman/core/configuration/configuration_multi_dict.py
similarity index 100%
rename from src/ahriman/core/configuration/configuration_multi_dict.py
rename to ahriman-core/src/ahriman/core/configuration/configuration_multi_dict.py
diff --git a/src/ahriman/core/configuration/schema.py b/ahriman-core/src/ahriman/core/configuration/schema.py
similarity index 100%
rename from src/ahriman/core/configuration/schema.py
rename to ahriman-core/src/ahriman/core/configuration/schema.py
diff --git a/src/ahriman/core/configuration/shell_interpolator.py b/ahriman-core/src/ahriman/core/configuration/shell_interpolator.py
similarity index 100%
rename from src/ahriman/core/configuration/shell_interpolator.py
rename to ahriman-core/src/ahriman/core/configuration/shell_interpolator.py
diff --git a/src/ahriman/core/configuration/shell_template.py b/ahriman-core/src/ahriman/core/configuration/shell_template.py
similarity index 100%
rename from src/ahriman/core/configuration/shell_template.py
rename to ahriman-core/src/ahriman/core/configuration/shell_template.py
diff --git a/src/ahriman/core/configuration/validator.py b/ahriman-core/src/ahriman/core/configuration/validator.py
similarity index 100%
rename from src/ahriman/core/configuration/validator.py
rename to ahriman-core/src/ahriman/core/configuration/validator.py
diff --git a/src/ahriman/core/database/__init__.py b/ahriman-core/src/ahriman/core/database/__init__.py
similarity index 100%
rename from src/ahriman/core/database/__init__.py
rename to ahriman-core/src/ahriman/core/database/__init__.py
diff --git a/src/ahriman/core/database/migrations/__init__.py b/ahriman-core/src/ahriman/core/database/migrations/__init__.py
similarity index 100%
rename from src/ahriman/core/database/migrations/__init__.py
rename to ahriman-core/src/ahriman/core/database/migrations/__init__.py
diff --git a/src/ahriman/core/database/migrations/m000_initial.py b/ahriman-core/src/ahriman/core/database/migrations/m000_initial.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m000_initial.py
rename to ahriman-core/src/ahriman/core/database/migrations/m000_initial.py
diff --git a/src/ahriman/core/database/migrations/m001_package_source.py b/ahriman-core/src/ahriman/core/database/migrations/m001_package_source.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m001_package_source.py
rename to ahriman-core/src/ahriman/core/database/migrations/m001_package_source.py
diff --git a/src/ahriman/core/database/migrations/m002_user_access.py b/ahriman-core/src/ahriman/core/database/migrations/m002_user_access.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m002_user_access.py
rename to ahriman-core/src/ahriman/core/database/migrations/m002_user_access.py
diff --git a/src/ahriman/core/database/migrations/m003_patch_variables.py b/ahriman-core/src/ahriman/core/database/migrations/m003_patch_variables.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m003_patch_variables.py
rename to ahriman-core/src/ahriman/core/database/migrations/m003_patch_variables.py
diff --git a/src/ahriman/core/database/migrations/m004_logs.py b/ahriman-core/src/ahriman/core/database/migrations/m004_logs.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m004_logs.py
rename to ahriman-core/src/ahriman/core/database/migrations/m004_logs.py
diff --git a/src/ahriman/core/database/migrations/m005_make_opt_depends.py b/ahriman-core/src/ahriman/core/database/migrations/m005_make_opt_depends.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m005_make_opt_depends.py
rename to ahriman-core/src/ahriman/core/database/migrations/m005_make_opt_depends.py
diff --git a/src/ahriman/core/database/migrations/m006_packages_architecture_required.py b/ahriman-core/src/ahriman/core/database/migrations/m006_packages_architecture_required.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m006_packages_architecture_required.py
rename to ahriman-core/src/ahriman/core/database/migrations/m006_packages_architecture_required.py
diff --git a/src/ahriman/core/database/migrations/m007_check_depends.py b/ahriman-core/src/ahriman/core/database/migrations/m007_check_depends.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m007_check_depends.py
rename to ahriman-core/src/ahriman/core/database/migrations/m007_check_depends.py
diff --git a/src/ahriman/core/database/migrations/m008_packagers.py b/ahriman-core/src/ahriman/core/database/migrations/m008_packagers.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m008_packagers.py
rename to ahriman-core/src/ahriman/core/database/migrations/m008_packagers.py
diff --git a/src/ahriman/core/database/migrations/m009_local_source.py b/ahriman-core/src/ahriman/core/database/migrations/m009_local_source.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m009_local_source.py
rename to ahriman-core/src/ahriman/core/database/migrations/m009_local_source.py
diff --git a/src/ahriman/core/database/migrations/m010_version_based_logs_removal.py b/ahriman-core/src/ahriman/core/database/migrations/m010_version_based_logs_removal.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m010_version_based_logs_removal.py
rename to ahriman-core/src/ahriman/core/database/migrations/m010_version_based_logs_removal.py
diff --git a/src/ahriman/core/database/migrations/m011_repository_name.py b/ahriman-core/src/ahriman/core/database/migrations/m011_repository_name.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m011_repository_name.py
rename to ahriman-core/src/ahriman/core/database/migrations/m011_repository_name.py
diff --git a/src/ahriman/core/database/migrations/m012_last_commit_sha.py b/ahriman-core/src/ahriman/core/database/migrations/m012_last_commit_sha.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m012_last_commit_sha.py
rename to ahriman-core/src/ahriman/core/database/migrations/m012_last_commit_sha.py
diff --git a/src/ahriman/core/database/migrations/m013_dependencies.py b/ahriman-core/src/ahriman/core/database/migrations/m013_dependencies.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m013_dependencies.py
rename to ahriman-core/src/ahriman/core/database/migrations/m013_dependencies.py
diff --git a/src/ahriman/core/database/migrations/m014_auditlog.py b/ahriman-core/src/ahriman/core/database/migrations/m014_auditlog.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m014_auditlog.py
rename to ahriman-core/src/ahriman/core/database/migrations/m014_auditlog.py
diff --git a/src/ahriman/core/database/migrations/m015_logs_process_id.py b/ahriman-core/src/ahriman/core/database/migrations/m015_logs_process_id.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m015_logs_process_id.py
rename to ahriman-core/src/ahriman/core/database/migrations/m015_logs_process_id.py
diff --git a/src/ahriman/core/database/migrations/m016_archive.py b/ahriman-core/src/ahriman/core/database/migrations/m016_archive.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m016_archive.py
rename to ahriman-core/src/ahriman/core/database/migrations/m016_archive.py
diff --git a/src/ahriman/core/database/migrations/m017_pkgbuild.py b/ahriman-core/src/ahriman/core/database/migrations/m017_pkgbuild.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m017_pkgbuild.py
rename to ahriman-core/src/ahriman/core/database/migrations/m017_pkgbuild.py
diff --git a/src/ahriman/core/database/migrations/m018_package_hold.py b/ahriman-core/src/ahriman/core/database/migrations/m018_package_hold.py
similarity index 100%
rename from src/ahriman/core/database/migrations/m018_package_hold.py
rename to ahriman-core/src/ahriman/core/database/migrations/m018_package_hold.py
diff --git a/src/ahriman/core/database/operations/__init__.py b/ahriman-core/src/ahriman/core/database/operations/__init__.py
similarity index 100%
rename from src/ahriman/core/database/operations/__init__.py
rename to ahriman-core/src/ahriman/core/database/operations/__init__.py
diff --git a/src/ahriman/core/database/operations/auth_operations.py b/ahriman-core/src/ahriman/core/database/operations/auth_operations.py
similarity index 100%
rename from src/ahriman/core/database/operations/auth_operations.py
rename to ahriman-core/src/ahriman/core/database/operations/auth_operations.py
diff --git a/src/ahriman/core/database/operations/build_operations.py b/ahriman-core/src/ahriman/core/database/operations/build_operations.py
similarity index 100%
rename from src/ahriman/core/database/operations/build_operations.py
rename to ahriman-core/src/ahriman/core/database/operations/build_operations.py
diff --git a/src/ahriman/core/database/operations/changes_operations.py b/ahriman-core/src/ahriman/core/database/operations/changes_operations.py
similarity index 100%
rename from src/ahriman/core/database/operations/changes_operations.py
rename to ahriman-core/src/ahriman/core/database/operations/changes_operations.py
diff --git a/src/ahriman/core/database/operations/dependencies_operations.py b/ahriman-core/src/ahriman/core/database/operations/dependencies_operations.py
similarity index 100%
rename from src/ahriman/core/database/operations/dependencies_operations.py
rename to ahriman-core/src/ahriman/core/database/operations/dependencies_operations.py
diff --git a/src/ahriman/core/database/operations/event_operations.py b/ahriman-core/src/ahriman/core/database/operations/event_operations.py
similarity index 100%
rename from src/ahriman/core/database/operations/event_operations.py
rename to ahriman-core/src/ahriman/core/database/operations/event_operations.py
diff --git a/src/ahriman/core/database/operations/logs_operations.py b/ahriman-core/src/ahriman/core/database/operations/logs_operations.py
similarity index 100%
rename from src/ahriman/core/database/operations/logs_operations.py
rename to ahriman-core/src/ahriman/core/database/operations/logs_operations.py
diff --git a/src/ahriman/core/database/operations/operations.py b/ahriman-core/src/ahriman/core/database/operations/operations.py
similarity index 100%
rename from src/ahriman/core/database/operations/operations.py
rename to ahriman-core/src/ahriman/core/database/operations/operations.py
diff --git a/src/ahriman/core/database/operations/package_operations.py b/ahriman-core/src/ahriman/core/database/operations/package_operations.py
similarity index 100%
rename from src/ahriman/core/database/operations/package_operations.py
rename to ahriman-core/src/ahriman/core/database/operations/package_operations.py
diff --git a/src/ahriman/core/database/operations/patch_operations.py b/ahriman-core/src/ahriman/core/database/operations/patch_operations.py
similarity index 100%
rename from src/ahriman/core/database/operations/patch_operations.py
rename to ahriman-core/src/ahriman/core/database/operations/patch_operations.py
diff --git a/src/ahriman/core/database/sqlite.py b/ahriman-core/src/ahriman/core/database/sqlite.py
similarity index 100%
rename from src/ahriman/core/database/sqlite.py
rename to ahriman-core/src/ahriman/core/database/sqlite.py
diff --git a/src/ahriman/core/exceptions.py b/ahriman-core/src/ahriman/core/exceptions.py
similarity index 100%
rename from src/ahriman/core/exceptions.py
rename to ahriman-core/src/ahriman/core/exceptions.py
diff --git a/src/ahriman/core/formatters/__init__.py b/ahriman-core/src/ahriman/core/formatters/__init__.py
similarity index 100%
rename from src/ahriman/core/formatters/__init__.py
rename to ahriman-core/src/ahriman/core/formatters/__init__.py
diff --git a/src/ahriman/core/formatters/aur_printer.py b/ahriman-core/src/ahriman/core/formatters/aur_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/aur_printer.py
rename to ahriman-core/src/ahriman/core/formatters/aur_printer.py
diff --git a/src/ahriman/core/formatters/build_printer.py b/ahriman-core/src/ahriman/core/formatters/build_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/build_printer.py
rename to ahriman-core/src/ahriman/core/formatters/build_printer.py
diff --git a/src/ahriman/core/formatters/changes_printer.py b/ahriman-core/src/ahriman/core/formatters/changes_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/changes_printer.py
rename to ahriman-core/src/ahriman/core/formatters/changes_printer.py
diff --git a/src/ahriman/core/formatters/configuration_paths_printer.py b/ahriman-core/src/ahriman/core/formatters/configuration_paths_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/configuration_paths_printer.py
rename to ahriman-core/src/ahriman/core/formatters/configuration_paths_printer.py
diff --git a/src/ahriman/core/formatters/configuration_printer.py b/ahriman-core/src/ahriman/core/formatters/configuration_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/configuration_printer.py
rename to ahriman-core/src/ahriman/core/formatters/configuration_printer.py
diff --git a/src/ahriman/core/formatters/event_stats_printer.py b/ahriman-core/src/ahriman/core/formatters/event_stats_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/event_stats_printer.py
rename to ahriman-core/src/ahriman/core/formatters/event_stats_printer.py
diff --git a/src/ahriman/core/formatters/package_printer.py b/ahriman-core/src/ahriman/core/formatters/package_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/package_printer.py
rename to ahriman-core/src/ahriman/core/formatters/package_printer.py
diff --git a/src/ahriman/core/formatters/package_stats_printer.py b/ahriman-core/src/ahriman/core/formatters/package_stats_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/package_stats_printer.py
rename to ahriman-core/src/ahriman/core/formatters/package_stats_printer.py
diff --git a/src/ahriman/core/formatters/patch_printer.py b/ahriman-core/src/ahriman/core/formatters/patch_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/patch_printer.py
rename to ahriman-core/src/ahriman/core/formatters/patch_printer.py
diff --git a/src/ahriman/core/formatters/pkgbuild_printer.py b/ahriman-core/src/ahriman/core/formatters/pkgbuild_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/pkgbuild_printer.py
rename to ahriman-core/src/ahriman/core/formatters/pkgbuild_printer.py
diff --git a/src/ahriman/core/formatters/printer.py b/ahriman-core/src/ahriman/core/formatters/printer.py
similarity index 100%
rename from src/ahriman/core/formatters/printer.py
rename to ahriman-core/src/ahriman/core/formatters/printer.py
diff --git a/src/ahriman/core/formatters/repository_printer.py b/ahriman-core/src/ahriman/core/formatters/repository_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/repository_printer.py
rename to ahriman-core/src/ahriman/core/formatters/repository_printer.py
diff --git a/src/ahriman/core/formatters/repository_stats_printer.py b/ahriman-core/src/ahriman/core/formatters/repository_stats_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/repository_stats_printer.py
rename to ahriman-core/src/ahriman/core/formatters/repository_stats_printer.py
diff --git a/src/ahriman/core/formatters/status_printer.py b/ahriman-core/src/ahriman/core/formatters/status_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/status_printer.py
rename to ahriman-core/src/ahriman/core/formatters/status_printer.py
diff --git a/src/ahriman/core/formatters/string_printer.py b/ahriman-core/src/ahriman/core/formatters/string_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/string_printer.py
rename to ahriman-core/src/ahriman/core/formatters/string_printer.py
diff --git a/src/ahriman/core/formatters/tree_printer.py b/ahriman-core/src/ahriman/core/formatters/tree_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/tree_printer.py
rename to ahriman-core/src/ahriman/core/formatters/tree_printer.py
diff --git a/src/ahriman/core/formatters/update_printer.py b/ahriman-core/src/ahriman/core/formatters/update_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/update_printer.py
rename to ahriman-core/src/ahriman/core/formatters/update_printer.py
diff --git a/src/ahriman/core/formatters/user_printer.py b/ahriman-core/src/ahriman/core/formatters/user_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/user_printer.py
rename to ahriman-core/src/ahriman/core/formatters/user_printer.py
diff --git a/src/ahriman/core/formatters/validation_printer.py b/ahriman-core/src/ahriman/core/formatters/validation_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/validation_printer.py
rename to ahriman-core/src/ahriman/core/formatters/validation_printer.py
diff --git a/src/ahriman/core/formatters/version_printer.py b/ahriman-core/src/ahriman/core/formatters/version_printer.py
similarity index 100%
rename from src/ahriman/core/formatters/version_printer.py
rename to ahriman-core/src/ahriman/core/formatters/version_printer.py
diff --git a/src/ahriman/core/gitremote/__init__.py b/ahriman-core/src/ahriman/core/gitremote/__init__.py
similarity index 100%
rename from src/ahriman/core/gitremote/__init__.py
rename to ahriman-core/src/ahriman/core/gitremote/__init__.py
diff --git a/src/ahriman/core/gitremote/remote_pull.py b/ahriman-core/src/ahriman/core/gitremote/remote_pull.py
similarity index 100%
rename from src/ahriman/core/gitremote/remote_pull.py
rename to ahriman-core/src/ahriman/core/gitremote/remote_pull.py
diff --git a/src/ahriman/core/gitremote/remote_pull_trigger.py b/ahriman-core/src/ahriman/core/gitremote/remote_pull_trigger.py
similarity index 100%
rename from src/ahriman/core/gitremote/remote_pull_trigger.py
rename to ahriman-core/src/ahriman/core/gitremote/remote_pull_trigger.py
diff --git a/src/ahriman/core/gitremote/remote_push.py b/ahriman-core/src/ahriman/core/gitremote/remote_push.py
similarity index 100%
rename from src/ahriman/core/gitremote/remote_push.py
rename to ahriman-core/src/ahriman/core/gitremote/remote_push.py
diff --git a/src/ahriman/core/gitremote/remote_push_trigger.py b/ahriman-core/src/ahriman/core/gitremote/remote_push_trigger.py
similarity index 100%
rename from src/ahriman/core/gitremote/remote_push_trigger.py
rename to ahriman-core/src/ahriman/core/gitremote/remote_push_trigger.py
diff --git a/src/ahriman/core/housekeeping/__init__.py b/ahriman-core/src/ahriman/core/housekeeping/__init__.py
similarity index 100%
rename from src/ahriman/core/housekeeping/__init__.py
rename to ahriman-core/src/ahriman/core/housekeeping/__init__.py
diff --git a/src/ahriman/core/housekeeping/archive_rotation_trigger.py b/ahriman-core/src/ahriman/core/housekeeping/archive_rotation_trigger.py
similarity index 100%
rename from src/ahriman/core/housekeeping/archive_rotation_trigger.py
rename to ahriman-core/src/ahriman/core/housekeeping/archive_rotation_trigger.py
diff --git a/src/ahriman/core/housekeeping/logs_rotation_trigger.py b/ahriman-core/src/ahriman/core/housekeeping/logs_rotation_trigger.py
similarity index 100%
rename from src/ahriman/core/housekeeping/logs_rotation_trigger.py
rename to ahriman-core/src/ahriman/core/housekeeping/logs_rotation_trigger.py
diff --git a/src/ahriman/core/http/__init__.py b/ahriman-core/src/ahriman/core/http/__init__.py
similarity index 100%
rename from src/ahriman/core/http/__init__.py
rename to ahriman-core/src/ahriman/core/http/__init__.py
diff --git a/src/ahriman/core/http/sync_ahriman_client.py b/ahriman-core/src/ahriman/core/http/sync_ahriman_client.py
similarity index 100%
rename from src/ahriman/core/http/sync_ahriman_client.py
rename to ahriman-core/src/ahriman/core/http/sync_ahriman_client.py
diff --git a/src/ahriman/core/http/sync_http_client.py b/ahriman-core/src/ahriman/core/http/sync_http_client.py
similarity index 100%
rename from src/ahriman/core/http/sync_http_client.py
rename to ahriman-core/src/ahriman/core/http/sync_http_client.py
diff --git a/src/ahriman/core/log/__init__.py b/ahriman-core/src/ahriman/core/log/__init__.py
similarity index 100%
rename from src/ahriman/core/log/__init__.py
rename to ahriman-core/src/ahriman/core/log/__init__.py
diff --git a/src/ahriman/core/log/http_log_handler.py b/ahriman-core/src/ahriman/core/log/http_log_handler.py
similarity index 100%
rename from src/ahriman/core/log/http_log_handler.py
rename to ahriman-core/src/ahriman/core/log/http_log_handler.py
diff --git a/src/ahriman/core/log/journal_handler.py b/ahriman-core/src/ahriman/core/log/journal_handler.py
similarity index 100%
rename from src/ahriman/core/log/journal_handler.py
rename to ahriman-core/src/ahriman/core/log/journal_handler.py
diff --git a/src/ahriman/core/log/lazy_logging.py b/ahriman-core/src/ahriman/core/log/lazy_logging.py
similarity index 100%
rename from src/ahriman/core/log/lazy_logging.py
rename to ahriman-core/src/ahriman/core/log/lazy_logging.py
diff --git a/src/ahriman/core/log/log_context.py b/ahriman-core/src/ahriman/core/log/log_context.py
similarity index 100%
rename from src/ahriman/core/log/log_context.py
rename to ahriman-core/src/ahriman/core/log/log_context.py
diff --git a/src/ahriman/core/log/log_loader.py b/ahriman-core/src/ahriman/core/log/log_loader.py
similarity index 100%
rename from src/ahriman/core/log/log_loader.py
rename to ahriman-core/src/ahriman/core/log/log_loader.py
diff --git a/src/ahriman/core/module_loader.py b/ahriman-core/src/ahriman/core/module_loader.py
similarity index 95%
rename from src/ahriman/core/module_loader.py
rename to ahriman-core/src/ahriman/core/module_loader.py
index e45aee62..ed66e71e 100644
--- a/src/ahriman/core/module_loader.py
+++ b/ahriman-core/src/ahriman/core/module_loader.py
@@ -46,9 +46,7 @@ def _modules(module_root: Path, prefix: str) -> Iterator[ModuleInfo]:
"""
prefix = f"{prefix}." if prefix else ""
for module_info in walk_packages([str(module_root)], prefix):
- if module_info.ispkg:
- yield from _modules(module_root / module_info.name, prefix)
- else:
+ if not module_info.ispkg:
yield module_info
diff --git a/src/ahriman/core/report/__init__.py b/ahriman-core/src/ahriman/core/report/__init__.py
similarity index 100%
rename from src/ahriman/core/report/__init__.py
rename to ahriman-core/src/ahriman/core/report/__init__.py
diff --git a/src/ahriman/core/report/console.py b/ahriman-core/src/ahriman/core/report/console.py
similarity index 100%
rename from src/ahriman/core/report/console.py
rename to ahriman-core/src/ahriman/core/report/console.py
diff --git a/src/ahriman/core/report/email.py b/ahriman-core/src/ahriman/core/report/email.py
similarity index 100%
rename from src/ahriman/core/report/email.py
rename to ahriman-core/src/ahriman/core/report/email.py
diff --git a/src/ahriman/core/report/html.py b/ahriman-core/src/ahriman/core/report/html.py
similarity index 100%
rename from src/ahriman/core/report/html.py
rename to ahriman-core/src/ahriman/core/report/html.py
diff --git a/src/ahriman/core/report/jinja_template.py b/ahriman-core/src/ahriman/core/report/jinja_template.py
similarity index 100%
rename from src/ahriman/core/report/jinja_template.py
rename to ahriman-core/src/ahriman/core/report/jinja_template.py
diff --git a/src/ahriman/core/report/remote_call.py b/ahriman-core/src/ahriman/core/report/remote_call.py
similarity index 100%
rename from src/ahriman/core/report/remote_call.py
rename to ahriman-core/src/ahriman/core/report/remote_call.py
diff --git a/src/ahriman/core/report/report.py b/ahriman-core/src/ahriman/core/report/report.py
similarity index 100%
rename from src/ahriman/core/report/report.py
rename to ahriman-core/src/ahriman/core/report/report.py
diff --git a/src/ahriman/core/report/report_trigger.py b/ahriman-core/src/ahriman/core/report/report_trigger.py
similarity index 100%
rename from src/ahriman/core/report/report_trigger.py
rename to ahriman-core/src/ahriman/core/report/report_trigger.py
diff --git a/src/ahriman/core/report/rss.py b/ahriman-core/src/ahriman/core/report/rss.py
similarity index 100%
rename from src/ahriman/core/report/rss.py
rename to ahriman-core/src/ahriman/core/report/rss.py
diff --git a/src/ahriman/core/report/telegram.py b/ahriman-core/src/ahriman/core/report/telegram.py
similarity index 100%
rename from src/ahriman/core/report/telegram.py
rename to ahriman-core/src/ahriman/core/report/telegram.py
diff --git a/src/ahriman/core/repository/__init__.py b/ahriman-core/src/ahriman/core/repository/__init__.py
similarity index 100%
rename from src/ahriman/core/repository/__init__.py
rename to ahriman-core/src/ahriman/core/repository/__init__.py
diff --git a/src/ahriman/core/repository/cleaner.py b/ahriman-core/src/ahriman/core/repository/cleaner.py
similarity index 100%
rename from src/ahriman/core/repository/cleaner.py
rename to ahriman-core/src/ahriman/core/repository/cleaner.py
diff --git a/src/ahriman/core/repository/event_logger.py b/ahriman-core/src/ahriman/core/repository/event_logger.py
similarity index 100%
rename from src/ahriman/core/repository/event_logger.py
rename to ahriman-core/src/ahriman/core/repository/event_logger.py
diff --git a/src/ahriman/core/repository/executor.py b/ahriman-core/src/ahriman/core/repository/executor.py
similarity index 100%
rename from src/ahriman/core/repository/executor.py
rename to ahriman-core/src/ahriman/core/repository/executor.py
diff --git a/src/ahriman/core/repository/explorer.py b/ahriman-core/src/ahriman/core/repository/explorer.py
similarity index 100%
rename from src/ahriman/core/repository/explorer.py
rename to ahriman-core/src/ahriman/core/repository/explorer.py
diff --git a/src/ahriman/core/repository/package_info.py b/ahriman-core/src/ahriman/core/repository/package_info.py
similarity index 100%
rename from src/ahriman/core/repository/package_info.py
rename to ahriman-core/src/ahriman/core/repository/package_info.py
diff --git a/src/ahriman/core/repository/repository.py b/ahriman-core/src/ahriman/core/repository/repository.py
similarity index 100%
rename from src/ahriman/core/repository/repository.py
rename to ahriman-core/src/ahriman/core/repository/repository.py
diff --git a/src/ahriman/core/repository/repository_properties.py b/ahriman-core/src/ahriman/core/repository/repository_properties.py
similarity index 100%
rename from src/ahriman/core/repository/repository_properties.py
rename to ahriman-core/src/ahriman/core/repository/repository_properties.py
diff --git a/src/ahriman/core/repository/update_handler.py b/ahriman-core/src/ahriman/core/repository/update_handler.py
similarity index 100%
rename from src/ahriman/core/repository/update_handler.py
rename to ahriman-core/src/ahriman/core/repository/update_handler.py
diff --git a/src/ahriman/core/sign/__init__.py b/ahriman-core/src/ahriman/core/sign/__init__.py
similarity index 100%
rename from src/ahriman/core/sign/__init__.py
rename to ahriman-core/src/ahriman/core/sign/__init__.py
diff --git a/src/ahriman/core/sign/gpg.py b/ahriman-core/src/ahriman/core/sign/gpg.py
similarity index 100%
rename from src/ahriman/core/sign/gpg.py
rename to ahriman-core/src/ahriman/core/sign/gpg.py
diff --git a/src/ahriman/core/spawn.py b/ahriman-core/src/ahriman/core/spawn.py
similarity index 100%
rename from src/ahriman/core/spawn.py
rename to ahriman-core/src/ahriman/core/spawn.py
diff --git a/src/ahriman/core/status/__init__.py b/ahriman-core/src/ahriman/core/status/__init__.py
similarity index 100%
rename from src/ahriman/core/status/__init__.py
rename to ahriman-core/src/ahriman/core/status/__init__.py
diff --git a/src/ahriman/core/status/client.py b/ahriman-core/src/ahriman/core/status/client.py
similarity index 100%
rename from src/ahriman/core/status/client.py
rename to ahriman-core/src/ahriman/core/status/client.py
diff --git a/src/ahriman/core/status/event_bus.py b/ahriman-core/src/ahriman/core/status/event_bus.py
similarity index 100%
rename from src/ahriman/core/status/event_bus.py
rename to ahriman-core/src/ahriman/core/status/event_bus.py
diff --git a/src/ahriman/core/status/local_client.py b/ahriman-core/src/ahriman/core/status/local_client.py
similarity index 100%
rename from src/ahriman/core/status/local_client.py
rename to ahriman-core/src/ahriman/core/status/local_client.py
diff --git a/src/ahriman/core/status/watcher.py b/ahriman-core/src/ahriman/core/status/watcher.py
similarity index 100%
rename from src/ahriman/core/status/watcher.py
rename to ahriman-core/src/ahriman/core/status/watcher.py
diff --git a/src/ahriman/core/status/web_client.py b/ahriman-core/src/ahriman/core/status/web_client.py
similarity index 100%
rename from src/ahriman/core/status/web_client.py
rename to ahriman-core/src/ahriman/core/status/web_client.py
diff --git a/src/ahriman/core/tree.py b/ahriman-core/src/ahriman/core/tree.py
similarity index 100%
rename from src/ahriman/core/tree.py
rename to ahriman-core/src/ahriman/core/tree.py
diff --git a/src/ahriman/core/triggers/__init__.py b/ahriman-core/src/ahriman/core/triggers/__init__.py
similarity index 100%
rename from src/ahriman/core/triggers/__init__.py
rename to ahriman-core/src/ahriman/core/triggers/__init__.py
diff --git a/src/ahriman/core/triggers/trigger.py b/ahriman-core/src/ahriman/core/triggers/trigger.py
similarity index 100%
rename from src/ahriman/core/triggers/trigger.py
rename to ahriman-core/src/ahriman/core/triggers/trigger.py
diff --git a/src/ahriman/core/triggers/trigger_loader.py b/ahriman-core/src/ahriman/core/triggers/trigger_loader.py
similarity index 100%
rename from src/ahriman/core/triggers/trigger_loader.py
rename to ahriman-core/src/ahriman/core/triggers/trigger_loader.py
diff --git a/src/ahriman/core/types.py b/ahriman-core/src/ahriman/core/types.py
similarity index 100%
rename from src/ahriman/core/types.py
rename to ahriman-core/src/ahriman/core/types.py
diff --git a/src/ahriman/core/upload/__init__.py b/ahriman-core/src/ahriman/core/upload/__init__.py
similarity index 100%
rename from src/ahriman/core/upload/__init__.py
rename to ahriman-core/src/ahriman/core/upload/__init__.py
diff --git a/src/ahriman/core/upload/github.py b/ahriman-core/src/ahriman/core/upload/github.py
similarity index 100%
rename from src/ahriman/core/upload/github.py
rename to ahriman-core/src/ahriman/core/upload/github.py
diff --git a/src/ahriman/core/upload/http_upload.py b/ahriman-core/src/ahriman/core/upload/http_upload.py
similarity index 100%
rename from src/ahriman/core/upload/http_upload.py
rename to ahriman-core/src/ahriman/core/upload/http_upload.py
diff --git a/src/ahriman/core/upload/remote_service.py b/ahriman-core/src/ahriman/core/upload/remote_service.py
similarity index 100%
rename from src/ahriman/core/upload/remote_service.py
rename to ahriman-core/src/ahriman/core/upload/remote_service.py
diff --git a/src/ahriman/core/upload/rsync.py b/ahriman-core/src/ahriman/core/upload/rsync.py
similarity index 100%
rename from src/ahriman/core/upload/rsync.py
rename to ahriman-core/src/ahriman/core/upload/rsync.py
diff --git a/src/ahriman/core/upload/s3.py b/ahriman-core/src/ahriman/core/upload/s3.py
similarity index 100%
rename from src/ahriman/core/upload/s3.py
rename to ahriman-core/src/ahriman/core/upload/s3.py
diff --git a/src/ahriman/core/upload/upload.py b/ahriman-core/src/ahriman/core/upload/upload.py
similarity index 100%
rename from src/ahriman/core/upload/upload.py
rename to ahriman-core/src/ahriman/core/upload/upload.py
diff --git a/src/ahriman/core/upload/upload_trigger.py b/ahriman-core/src/ahriman/core/upload/upload_trigger.py
similarity index 100%
rename from src/ahriman/core/upload/upload_trigger.py
rename to ahriman-core/src/ahriman/core/upload/upload_trigger.py
diff --git a/src/ahriman/core/util.py b/ahriman-core/src/ahriman/core/util.py
similarity index 100%
rename from src/ahriman/core/util.py
rename to ahriman-core/src/ahriman/core/util.py
diff --git a/src/ahriman/core/utils.py b/ahriman-core/src/ahriman/core/utils.py
similarity index 100%
rename from src/ahriman/core/utils.py
rename to ahriman-core/src/ahriman/core/utils.py
diff --git a/src/ahriman/core/support/pkgbuild/__init__.py b/ahriman-core/src/ahriman/models/__init__.py
similarity index 100%
rename from src/ahriman/core/support/pkgbuild/__init__.py
rename to ahriman-core/src/ahriman/models/__init__.py
diff --git a/src/ahriman/models/action.py b/ahriman-core/src/ahriman/models/action.py
similarity index 100%
rename from src/ahriman/models/action.py
rename to ahriman-core/src/ahriman/models/action.py
diff --git a/src/ahriman/models/aur_package.py b/ahriman-core/src/ahriman/models/aur_package.py
similarity index 100%
rename from src/ahriman/models/aur_package.py
rename to ahriman-core/src/ahriman/models/aur_package.py
diff --git a/src/ahriman/models/auth_settings.py b/ahriman-core/src/ahriman/models/auth_settings.py
similarity index 100%
rename from src/ahriman/models/auth_settings.py
rename to ahriman-core/src/ahriman/models/auth_settings.py
diff --git a/src/ahriman/models/build_status.py b/ahriman-core/src/ahriman/models/build_status.py
similarity index 100%
rename from src/ahriman/models/build_status.py
rename to ahriman-core/src/ahriman/models/build_status.py
diff --git a/src/ahriman/models/changes.py b/ahriman-core/src/ahriman/models/changes.py
similarity index 100%
rename from src/ahriman/models/changes.py
rename to ahriman-core/src/ahriman/models/changes.py
diff --git a/src/ahriman/models/context_key.py b/ahriman-core/src/ahriman/models/context_key.py
similarity index 100%
rename from src/ahriman/models/context_key.py
rename to ahriman-core/src/ahriman/models/context_key.py
diff --git a/src/ahriman/models/counters.py b/ahriman-core/src/ahriman/models/counters.py
similarity index 100%
rename from src/ahriman/models/counters.py
rename to ahriman-core/src/ahriman/models/counters.py
diff --git a/src/ahriman/models/dependencies.py b/ahriman-core/src/ahriman/models/dependencies.py
similarity index 100%
rename from src/ahriman/models/dependencies.py
rename to ahriman-core/src/ahriman/models/dependencies.py
diff --git a/src/ahriman/models/event.py b/ahriman-core/src/ahriman/models/event.py
similarity index 100%
rename from src/ahriman/models/event.py
rename to ahriman-core/src/ahriman/models/event.py
diff --git a/src/ahriman/models/filesystem_package.py b/ahriman-core/src/ahriman/models/filesystem_package.py
similarity index 100%
rename from src/ahriman/models/filesystem_package.py
rename to ahriman-core/src/ahriman/models/filesystem_package.py
diff --git a/src/ahriman/models/internal_status.py b/ahriman-core/src/ahriman/models/internal_status.py
similarity index 100%
rename from src/ahriman/models/internal_status.py
rename to ahriman-core/src/ahriman/models/internal_status.py
diff --git a/src/ahriman/models/log_handler.py b/ahriman-core/src/ahriman/models/log_handler.py
similarity index 100%
rename from src/ahriman/models/log_handler.py
rename to ahriman-core/src/ahriman/models/log_handler.py
diff --git a/src/ahriman/models/log_record.py b/ahriman-core/src/ahriman/models/log_record.py
similarity index 100%
rename from src/ahriman/models/log_record.py
rename to ahriman-core/src/ahriman/models/log_record.py
diff --git a/src/ahriman/models/log_record_id.py b/ahriman-core/src/ahriman/models/log_record_id.py
similarity index 100%
rename from src/ahriman/models/log_record_id.py
rename to ahriman-core/src/ahriman/models/log_record_id.py
diff --git a/src/ahriman/models/metrics_timer.py b/ahriman-core/src/ahriman/models/metrics_timer.py
similarity index 100%
rename from src/ahriman/models/metrics_timer.py
rename to ahriman-core/src/ahriman/models/metrics_timer.py
diff --git a/src/ahriman/models/migration.py b/ahriman-core/src/ahriman/models/migration.py
similarity index 100%
rename from src/ahriman/models/migration.py
rename to ahriman-core/src/ahriman/models/migration.py
diff --git a/src/ahriman/models/migration_result.py b/ahriman-core/src/ahriman/models/migration_result.py
similarity index 100%
rename from src/ahriman/models/migration_result.py
rename to ahriman-core/src/ahriman/models/migration_result.py
diff --git a/src/ahriman/models/package.py b/ahriman-core/src/ahriman/models/package.py
similarity index 100%
rename from src/ahriman/models/package.py
rename to ahriman-core/src/ahriman/models/package.py
diff --git a/src/ahriman/models/package_description.py b/ahriman-core/src/ahriman/models/package_description.py
similarity index 100%
rename from src/ahriman/models/package_description.py
rename to ahriman-core/src/ahriman/models/package_description.py
diff --git a/src/ahriman/models/package_source.py b/ahriman-core/src/ahriman/models/package_source.py
similarity index 100%
rename from src/ahriman/models/package_source.py
rename to ahriman-core/src/ahriman/models/package_source.py
diff --git a/src/ahriman/models/packagers.py b/ahriman-core/src/ahriman/models/packagers.py
similarity index 100%
rename from src/ahriman/models/packagers.py
rename to ahriman-core/src/ahriman/models/packagers.py
diff --git a/src/ahriman/models/pacman_synchronization.py b/ahriman-core/src/ahriman/models/pacman_synchronization.py
similarity index 100%
rename from src/ahriman/models/pacman_synchronization.py
rename to ahriman-core/src/ahriman/models/pacman_synchronization.py
diff --git a/src/ahriman/models/pkgbuild.py b/ahriman-core/src/ahriman/models/pkgbuild.py
similarity index 100%
rename from src/ahriman/models/pkgbuild.py
rename to ahriman-core/src/ahriman/models/pkgbuild.py
diff --git a/src/ahriman/models/pkgbuild_patch.py b/ahriman-core/src/ahriman/models/pkgbuild_patch.py
similarity index 100%
rename from src/ahriman/models/pkgbuild_patch.py
rename to ahriman-core/src/ahriman/models/pkgbuild_patch.py
diff --git a/src/ahriman/models/process_status.py b/ahriman-core/src/ahriman/models/process_status.py
similarity index 100%
rename from src/ahriman/models/process_status.py
rename to ahriman-core/src/ahriman/models/process_status.py
diff --git a/src/ahriman/models/property.py b/ahriman-core/src/ahriman/models/property.py
similarity index 100%
rename from src/ahriman/models/property.py
rename to ahriman-core/src/ahriman/models/property.py
diff --git a/src/ahriman/models/remote_source.py b/ahriman-core/src/ahriman/models/remote_source.py
similarity index 100%
rename from src/ahriman/models/remote_source.py
rename to ahriman-core/src/ahriman/models/remote_source.py
diff --git a/src/ahriman/models/report_settings.py b/ahriman-core/src/ahriman/models/report_settings.py
similarity index 100%
rename from src/ahriman/models/report_settings.py
rename to ahriman-core/src/ahriman/models/report_settings.py
diff --git a/src/ahriman/models/repository_id.py b/ahriman-core/src/ahriman/models/repository_id.py
similarity index 100%
rename from src/ahriman/models/repository_id.py
rename to ahriman-core/src/ahriman/models/repository_id.py
diff --git a/src/ahriman/models/repository_paths.py b/ahriman-core/src/ahriman/models/repository_paths.py
similarity index 100%
rename from src/ahriman/models/repository_paths.py
rename to ahriman-core/src/ahriman/models/repository_paths.py
diff --git a/src/ahriman/models/repository_stats.py b/ahriman-core/src/ahriman/models/repository_stats.py
similarity index 100%
rename from src/ahriman/models/repository_stats.py
rename to ahriman-core/src/ahriman/models/repository_stats.py
diff --git a/src/ahriman/models/result.py b/ahriman-core/src/ahriman/models/result.py
similarity index 100%
rename from src/ahriman/models/result.py
rename to ahriman-core/src/ahriman/models/result.py
diff --git a/src/ahriman/models/scan_paths.py b/ahriman-core/src/ahriman/models/scan_paths.py
similarity index 100%
rename from src/ahriman/models/scan_paths.py
rename to ahriman-core/src/ahriman/models/scan_paths.py
diff --git a/src/ahriman/models/series_statistics.py b/ahriman-core/src/ahriman/models/series_statistics.py
similarity index 100%
rename from src/ahriman/models/series_statistics.py
rename to ahriman-core/src/ahriman/models/series_statistics.py
diff --git a/src/ahriman/models/sign_settings.py b/ahriman-core/src/ahriman/models/sign_settings.py
similarity index 100%
rename from src/ahriman/models/sign_settings.py
rename to ahriman-core/src/ahriman/models/sign_settings.py
diff --git a/src/ahriman/models/smtp_ssl_settings.py b/ahriman-core/src/ahriman/models/smtp_ssl_settings.py
similarity index 100%
rename from src/ahriman/models/smtp_ssl_settings.py
rename to ahriman-core/src/ahriman/models/smtp_ssl_settings.py
diff --git a/src/ahriman/models/upload_settings.py b/ahriman-core/src/ahriman/models/upload_settings.py
similarity index 100%
rename from src/ahriman/models/upload_settings.py
rename to ahriman-core/src/ahriman/models/upload_settings.py
diff --git a/src/ahriman/models/user.py b/ahriman-core/src/ahriman/models/user.py
similarity index 100%
rename from src/ahriman/models/user.py
rename to ahriman-core/src/ahriman/models/user.py
diff --git a/src/ahriman/models/user_access.py b/ahriman-core/src/ahriman/models/user_access.py
similarity index 100%
rename from src/ahriman/models/user_access.py
rename to ahriman-core/src/ahriman/models/user_access.py
diff --git a/src/ahriman/models/waiter.py b/ahriman-core/src/ahriman/models/waiter.py
similarity index 100%
rename from src/ahriman/models/waiter.py
rename to ahriman-core/src/ahriman/models/waiter.py
diff --git a/src/ahriman/models/worker.py b/ahriman-core/src/ahriman/models/worker.py
similarity index 100%
rename from src/ahriman/models/worker.py
rename to ahriman-core/src/ahriman/models/worker.py
diff --git a/src/ahriman/py.typed b/ahriman-core/src/ahriman/py.typed
similarity index 100%
rename from src/ahriman/py.typed
rename to ahriman-core/src/ahriman/py.typed
diff --git a/tests/ahriman/application/application/conftest.py b/ahriman-core/tests/ahriman/application/application/conftest.py
similarity index 100%
rename from tests/ahriman/application/application/conftest.py
rename to ahriman-core/tests/ahriman/application/application/conftest.py
diff --git a/tests/ahriman/application/application/test_application.py b/ahriman-core/tests/ahriman/application/application/test_application.py
similarity index 100%
rename from tests/ahriman/application/application/test_application.py
rename to ahriman-core/tests/ahriman/application/application/test_application.py
diff --git a/tests/ahriman/application/application/test_application_packages.py b/ahriman-core/tests/ahriman/application/application/test_application_packages.py
similarity index 100%
rename from tests/ahriman/application/application/test_application_packages.py
rename to ahriman-core/tests/ahriman/application/application/test_application_packages.py
diff --git a/tests/ahriman/application/application/test_application_properties.py b/ahriman-core/tests/ahriman/application/application/test_application_properties.py
similarity index 100%
rename from tests/ahriman/application/application/test_application_properties.py
rename to ahriman-core/tests/ahriman/application/application/test_application_properties.py
diff --git a/tests/ahriman/application/application/test_application_repository.py b/ahriman-core/tests/ahriman/application/application/test_application_repository.py
similarity index 100%
rename from tests/ahriman/application/application/test_application_repository.py
rename to ahriman-core/tests/ahriman/application/application/test_application_repository.py
diff --git a/tests/ahriman/application/application/test_updates_iterator.py b/ahriman-core/tests/ahriman/application/application/test_updates_iterator.py
similarity index 100%
rename from tests/ahriman/application/application/test_updates_iterator.py
rename to ahriman-core/tests/ahriman/application/application/test_updates_iterator.py
diff --git a/tests/ahriman/application/application/workers/conftest.py b/ahriman-core/tests/ahriman/application/application/workers/conftest.py
similarity index 100%
rename from tests/ahriman/application/application/workers/conftest.py
rename to ahriman-core/tests/ahriman/application/application/workers/conftest.py
diff --git a/tests/ahriman/application/application/workers/test_local_updater.py b/ahriman-core/tests/ahriman/application/application/workers/test_local_updater.py
similarity index 100%
rename from tests/ahriman/application/application/workers/test_local_updater.py
rename to ahriman-core/tests/ahriman/application/application/workers/test_local_updater.py
diff --git a/tests/ahriman/application/application/workers/test_remote_updater.py b/ahriman-core/tests/ahriman/application/application/workers/test_remote_updater.py
similarity index 100%
rename from tests/ahriman/application/application/workers/test_remote_updater.py
rename to ahriman-core/tests/ahriman/application/application/workers/test_remote_updater.py
diff --git a/tests/ahriman/application/application/workers/test_updater.py b/ahriman-core/tests/ahriman/application/application/workers/test_updater.py
similarity index 100%
rename from tests/ahriman/application/application/workers/test_updater.py
rename to ahriman-core/tests/ahriman/application/application/workers/test_updater.py
diff --git a/tests/ahriman/application/conftest.py b/ahriman-core/tests/ahriman/application/conftest.py
similarity index 73%
rename from tests/ahriman/application/conftest.py
rename to ahriman-core/tests/ahriman/application/conftest.py
index d76818ad..1eaad8a5 100644
--- a/tests/ahriman/application/conftest.py
+++ b/ahriman-core/tests/ahriman/application/conftest.py
@@ -3,7 +3,6 @@ import pytest
from pytest_mock import MockerFixture
-from ahriman.application.ahriman import _parser
from ahriman.application.application import Application
from ahriman.application.help_formatter import _HelpFormatter
from ahriman.application.lock import Lock
@@ -33,18 +32,6 @@ def application(configuration: Configuration, repository: Repository, database:
return Application(repository_id, configuration, report=False)
-@pytest.fixture
-def args() -> argparse.Namespace:
- """
- fixture for command line arguments
-
- Returns:
- argparse.Namespace: command line arguments test instance
- """
- return argparse.Namespace(architecture=None, lock=None, force=False, unsafe=False, report=False,
- repository=None, repository_id=None, wait_timeout=-1)
-
-
@pytest.fixture
def formatter() -> _HelpFormatter:
"""
@@ -70,14 +57,3 @@ def lock(args: argparse.Namespace, configuration: Configuration) -> Lock:
"""
_, repository_id = configuration.check_loaded()
return Lock(args, repository_id, configuration)
-
-
-@pytest.fixture
-def parser() -> argparse.ArgumentParser:
- """
- fixture for command line arguments parser
-
- Returns:
- argparse.ArgumentParser: command line arguments parser test instance
- """
- return _parser()
diff --git a/tests/ahriman/application/handlers/test_handler.py b/ahriman-core/tests/ahriman/application/handlers/test_handler.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler.py
diff --git a/tests/ahriman/application/handlers/test_handler_add.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_add.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_add.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_add.py
diff --git a/tests/ahriman/application/handlers/test_handler_archives.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_archives.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_archives.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_archives.py
diff --git a/tests/ahriman/application/handlers/test_handler_backup.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_backup.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_backup.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_backup.py
diff --git a/tests/ahriman/application/handlers/test_handler_change.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_change.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_change.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_change.py
diff --git a/tests/ahriman/application/handlers/test_handler_clean.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_clean.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_clean.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_clean.py
diff --git a/tests/ahriman/application/handlers/test_handler_copy.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_copy.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_copy.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_copy.py
diff --git a/tests/ahriman/application/handlers/test_handler_daemon.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_daemon.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_daemon.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_daemon.py
diff --git a/tests/ahriman/application/handlers/test_handler_dump.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_dump.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_dump.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_dump.py
diff --git a/tests/ahriman/application/handlers/test_handler_help.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_help.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_help.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_help.py
diff --git a/tests/ahriman/application/handlers/test_handler_hold.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_hold.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_hold.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_hold.py
diff --git a/tests/ahriman/application/handlers/test_handler_key_import.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_key_import.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_key_import.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_key_import.py
diff --git a/tests/ahriman/application/handlers/test_handler_patch.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_patch.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_patch.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_patch.py
diff --git a/tests/ahriman/application/handlers/test_handler_pkgbuild.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_pkgbuild.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_pkgbuild.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_pkgbuild.py
diff --git a/tests/ahriman/application/handlers/test_handler_rebuild.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_rebuild.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_rebuild.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_rebuild.py
diff --git a/tests/ahriman/application/handlers/test_handler_reload.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_reload.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_reload.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_reload.py
diff --git a/tests/ahriman/application/handlers/test_handler_remove.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_remove.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_remove.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_remove.py
diff --git a/tests/ahriman/application/handlers/test_handler_remove_unknown.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_remove_unknown.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_remove_unknown.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_remove_unknown.py
diff --git a/tests/ahriman/application/handlers/test_handler_repositories.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_repositories.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_repositories.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_repositories.py
diff --git a/tests/ahriman/application/handlers/test_handler_restore.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_restore.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_restore.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_restore.py
diff --git a/tests/ahriman/application/handlers/test_handler_rollback.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_rollback.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_rollback.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_rollback.py
diff --git a/tests/ahriman/application/handlers/test_handler_run.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_run.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_run.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_run.py
diff --git a/tests/ahriman/application/handlers/test_handler_search.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_search.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_search.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_search.py
diff --git a/tests/ahriman/application/handlers/test_handler_service_updates.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_service_updates.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_service_updates.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_service_updates.py
diff --git a/tests/ahriman/application/handlers/test_handler_setup.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_setup.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_setup.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_setup.py
diff --git a/tests/ahriman/application/handlers/test_handler_shell.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_shell.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_shell.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_shell.py
diff --git a/tests/ahriman/application/handlers/test_handler_sign.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_sign.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_sign.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_sign.py
diff --git a/tests/ahriman/application/handlers/test_handler_statistics.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_statistics.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_statistics.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_statistics.py
diff --git a/tests/ahriman/application/handlers/test_handler_status.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_status.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_status.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_status.py
diff --git a/tests/ahriman/application/handlers/test_handler_status_update.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_status_update.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_status_update.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_status_update.py
diff --git a/tests/ahriman/application/handlers/test_handler_structure.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_structure.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_structure.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_structure.py
diff --git a/tests/ahriman/application/handlers/test_handler_tree_migrate.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_tree_migrate.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_tree_migrate.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_tree_migrate.py
diff --git a/tests/ahriman/application/handlers/test_handler_triggers.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_triggers.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_triggers.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_triggers.py
diff --git a/tests/ahriman/application/handlers/test_handler_unsafe_commands.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_unsafe_commands.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_unsafe_commands.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_unsafe_commands.py
diff --git a/tests/ahriman/application/handlers/test_handler_update.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_update.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_update.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_update.py
diff --git a/tests/ahriman/application/handlers/test_handler_users.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_users.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_users.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_users.py
diff --git a/tests/ahriman/application/handlers/test_handler_validate.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_validate.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_validate.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_validate.py
diff --git a/tests/ahriman/application/handlers/test_handler_versions.py b/ahriman-core/tests/ahriman/application/handlers/test_handler_versions.py
similarity index 100%
rename from tests/ahriman/application/handlers/test_handler_versions.py
rename to ahriman-core/tests/ahriman/application/handlers/test_handler_versions.py
diff --git a/tests/ahriman/application/test_ahriman.py b/ahriman-core/tests/ahriman/application/test_ahriman.py
similarity index 100%
rename from tests/ahriman/application/test_ahriman.py
rename to ahriman-core/tests/ahriman/application/test_ahriman.py
diff --git a/tests/ahriman/application/test_help_formatter.py b/ahriman-core/tests/ahriman/application/test_help_formatter.py
similarity index 100%
rename from tests/ahriman/application/test_help_formatter.py
rename to ahriman-core/tests/ahriman/application/test_help_formatter.py
diff --git a/tests/ahriman/application/test_interactive_shell.py b/ahriman-core/tests/ahriman/application/test_interactive_shell.py
similarity index 100%
rename from tests/ahriman/application/test_interactive_shell.py
rename to ahriman-core/tests/ahriman/application/test_interactive_shell.py
diff --git a/tests/ahriman/application/test_lock.py b/ahriman-core/tests/ahriman/application/test_lock.py
similarity index 100%
rename from tests/ahriman/application/test_lock.py
rename to ahriman-core/tests/ahriman/application/test_lock.py
diff --git a/ahriman-core/tests/ahriman/conftest.py b/ahriman-core/tests/ahriman/conftest.py
new file mode 100644
index 00000000..af8fd8b5
--- /dev/null
+++ b/ahriman-core/tests/ahriman/conftest.py
@@ -0,0 +1,162 @@
+import datetime
+import pytest
+
+from unittest.mock import MagicMock, PropertyMock
+
+from ahriman.core.alpm.pacman import Pacman
+from ahriman.core.alpm.remote import AUR
+from ahriman.core.configuration import Configuration
+from ahriman.models.aur_package import AURPackage
+from ahriman.models.package import Package
+from ahriman.models.package_description import PackageDescription
+from ahriman.models.package_source import PackageSource
+from ahriman.models.pacman_synchronization import PacmanSynchronization
+from ahriman.models.remote_source import RemoteSource
+from ahriman.models.scan_paths import ScanPaths
+
+
+@pytest.fixture
+def aur_package_akonadi() -> AURPackage:
+ """
+ fixture for AUR package
+
+ Returns:
+ AURPackage: AUR package test instance
+ """
+ return AURPackage(
+ id=0,
+ name="akonadi",
+ package_base_id=0,
+ package_base="akonadi",
+ version="21.12.3-2",
+ description="PIM layer, which provides an asynchronous API to access all kind of PIM data",
+ num_votes=0,
+ popularity=0.0,
+ first_submitted=datetime.datetime.fromtimestamp(0, datetime.UTC),
+ last_modified=datetime.datetime.fromtimestamp(1646555990.610, datetime.UTC),
+ url_path="",
+ url="https://kontact.kde.org",
+ out_of_date=None,
+ maintainer="felixonmars",
+ repository="extra",
+ depends=[
+ "libakonadi",
+ "mariadb",
+ ],
+ make_depends=[
+ "boost",
+ "doxygen",
+ "extra-cmake-modules",
+ "kaccounts-integration",
+ "kitemmodels",
+ "postgresql",
+ "qt5-tools",
+ ],
+ opt_depends=[
+ "postgresql: PostgreSQL backend",
+ ],
+ conflicts=[],
+ provides=[],
+ license=["LGPL"],
+ keywords=[],
+ groups=[],
+ )
+
+
+@pytest.fixture
+def package_tpacpi_bat_git() -> Package:
+ """
+ git package fixture
+
+ Returns:
+ Package: git package test instance
+ """
+ return Package(
+ base="tpacpi-bat-git",
+ version="3.1.r12.g4959b52-1",
+ remote=RemoteSource(
+ source=PackageSource.AUR,
+ git_url=AUR.remote_git_url("tpacpi-bat-git", "aur"),
+ web_url=AUR.remote_web_url("tpacpi-bat-git"),
+ path=".",
+ branch="master",
+ ),
+ packages={"tpacpi-bat-git": PackageDescription()})
+
+
+@pytest.fixture
+def pacman(configuration: Configuration) -> Pacman:
+ """
+ fixture for pacman wrapper
+
+ Args:
+ configuration(Configuration): configuration fixture
+
+ Returns:
+ Pacman: pacman wrapper test instance
+ """
+ _, repository_id = configuration.check_loaded()
+ return Pacman(repository_id, configuration, refresh_database=PacmanSynchronization.Disabled)
+
+
+@pytest.fixture
+def passwd() -> MagicMock:
+ """
+ get passwd structure for the user
+
+ Returns:
+ MagicMock: passwd structure test instance
+ """
+ passwd = MagicMock()
+ passwd.pw_dir = "home"
+ passwd.pw_name = "ahriman"
+ return passwd
+
+
+@pytest.fixture
+def pyalpm_package_ahriman(aur_package_ahriman: AURPackage) -> MagicMock:
+ """
+ mock object for pyalpm package
+
+ Args:
+ aur_package_ahriman(AURPackage): package fixture
+
+ Returns:
+ MagicMock: pyalpm package mock
+ """
+ mock = MagicMock()
+ db = type(mock).db = MagicMock()
+
+ type(mock).base = PropertyMock(return_value=aur_package_ahriman.package_base)
+ type(mock).builddate = PropertyMock(
+ return_value=aur_package_ahriman.last_modified.replace(tzinfo=datetime.timezone.utc).timestamp())
+ type(mock).conflicts = PropertyMock(return_value=aur_package_ahriman.conflicts)
+ type(db).name = PropertyMock(return_value="aur")
+ type(mock).depends = PropertyMock(return_value=aur_package_ahriman.depends)
+ type(mock).desc = PropertyMock(return_value=aur_package_ahriman.description)
+ type(mock).licenses = PropertyMock(return_value=aur_package_ahriman.license)
+ type(mock).makedepends = PropertyMock(return_value=aur_package_ahriman.make_depends)
+ type(mock).name = PropertyMock(return_value=aur_package_ahriman.name)
+ type(mock).optdepends = PropertyMock(return_value=aur_package_ahriman.opt_depends)
+ type(mock).checkdepends = PropertyMock(return_value=aur_package_ahriman.check_depends)
+ type(mock).packager = PropertyMock(return_value="packager")
+ type(mock).provides = PropertyMock(return_value=aur_package_ahriman.provides)
+ type(mock).version = PropertyMock(return_value=aur_package_ahriman.version)
+ type(mock).url = PropertyMock(return_value=aur_package_ahriman.url)
+ type(mock).groups = PropertyMock(return_value=aur_package_ahriman.groups)
+
+ return mock
+
+
+@pytest.fixture
+def scan_paths(configuration: Configuration) -> ScanPaths:
+ """
+ scan paths fixture
+
+ Args:
+ configuration(Configuration): configuration test instance
+
+ Returns:
+ ScanPaths: scan paths test instance
+ """
+ return ScanPaths(configuration.getlist("build", "scan_paths", fallback=[]))
diff --git a/tests/ahriman/core/alpm/conftest.py b/ahriman-core/tests/ahriman/core/alpm/conftest.py
similarity index 100%
rename from tests/ahriman/core/alpm/conftest.py
rename to ahriman-core/tests/ahriman/core/alpm/conftest.py
diff --git a/tests/ahriman/core/alpm/remote/conftest.py b/ahriman-core/tests/ahriman/core/alpm/remote/conftest.py
similarity index 100%
rename from tests/ahriman/core/alpm/remote/conftest.py
rename to ahriman-core/tests/ahriman/core/alpm/remote/conftest.py
diff --git a/tests/ahriman/core/alpm/remote/test_aur.py b/ahriman-core/tests/ahriman/core/alpm/remote/test_aur.py
similarity index 100%
rename from tests/ahriman/core/alpm/remote/test_aur.py
rename to ahriman-core/tests/ahriman/core/alpm/remote/test_aur.py
diff --git a/tests/ahriman/core/alpm/remote/test_official.py b/ahriman-core/tests/ahriman/core/alpm/remote/test_official.py
similarity index 100%
rename from tests/ahriman/core/alpm/remote/test_official.py
rename to ahriman-core/tests/ahriman/core/alpm/remote/test_official.py
diff --git a/tests/ahriman/core/alpm/remote/test_official_syncdb.py b/ahriman-core/tests/ahriman/core/alpm/remote/test_official_syncdb.py
similarity index 100%
rename from tests/ahriman/core/alpm/remote/test_official_syncdb.py
rename to ahriman-core/tests/ahriman/core/alpm/remote/test_official_syncdb.py
diff --git a/tests/ahriman/core/alpm/remote/test_remote.py b/ahriman-core/tests/ahriman/core/alpm/remote/test_remote.py
similarity index 100%
rename from tests/ahriman/core/alpm/remote/test_remote.py
rename to ahriman-core/tests/ahriman/core/alpm/remote/test_remote.py
diff --git a/tests/ahriman/core/alpm/test_pacman.py b/ahriman-core/tests/ahriman/core/alpm/test_pacman.py
similarity index 100%
rename from tests/ahriman/core/alpm/test_pacman.py
rename to ahriman-core/tests/ahriman/core/alpm/test_pacman.py
diff --git a/tests/ahriman/core/alpm/test_pacman_database.py b/ahriman-core/tests/ahriman/core/alpm/test_pacman_database.py
similarity index 100%
rename from tests/ahriman/core/alpm/test_pacman_database.py
rename to ahriman-core/tests/ahriman/core/alpm/test_pacman_database.py
diff --git a/tests/ahriman/core/alpm/test_pacman_handle.py b/ahriman-core/tests/ahriman/core/alpm/test_pacman_handle.py
similarity index 100%
rename from tests/ahriman/core/alpm/test_pacman_handle.py
rename to ahriman-core/tests/ahriman/core/alpm/test_pacman_handle.py
diff --git a/tests/ahriman/core/alpm/test_pkgbuild_parser.py b/ahriman-core/tests/ahriman/core/alpm/test_pkgbuild_parser.py
similarity index 100%
rename from tests/ahriman/core/alpm/test_pkgbuild_parser.py
rename to ahriman-core/tests/ahriman/core/alpm/test_pkgbuild_parser.py
diff --git a/tests/ahriman/core/alpm/test_repo.py b/ahriman-core/tests/ahriman/core/alpm/test_repo.py
similarity index 100%
rename from tests/ahriman/core/alpm/test_repo.py
rename to ahriman-core/tests/ahriman/core/alpm/test_repo.py
diff --git a/tests/ahriman/core/build_tools/conftest.py b/ahriman-core/tests/ahriman/core/build_tools/conftest.py
similarity index 100%
rename from tests/ahriman/core/build_tools/conftest.py
rename to ahriman-core/tests/ahriman/core/build_tools/conftest.py
diff --git a/tests/ahriman/core/build_tools/test_package_archive.py b/ahriman-core/tests/ahriman/core/build_tools/test_package_archive.py
similarity index 100%
rename from tests/ahriman/core/build_tools/test_package_archive.py
rename to ahriman-core/tests/ahriman/core/build_tools/test_package_archive.py
diff --git a/tests/ahriman/core/build_tools/test_package_version.py b/ahriman-core/tests/ahriman/core/build_tools/test_package_version.py
similarity index 100%
rename from tests/ahriman/core/build_tools/test_package_version.py
rename to ahriman-core/tests/ahriman/core/build_tools/test_package_version.py
diff --git a/tests/ahriman/core/build_tools/test_sources.py b/ahriman-core/tests/ahriman/core/build_tools/test_sources.py
similarity index 100%
rename from tests/ahriman/core/build_tools/test_sources.py
rename to ahriman-core/tests/ahriman/core/build_tools/test_sources.py
diff --git a/tests/ahriman/core/build_tools/test_task.py b/ahriman-core/tests/ahriman/core/build_tools/test_task.py
similarity index 100%
rename from tests/ahriman/core/build_tools/test_task.py
rename to ahriman-core/tests/ahriman/core/build_tools/test_task.py
diff --git a/tests/ahriman/core/configuration/conftest.py b/ahriman-core/tests/ahriman/core/configuration/conftest.py
similarity index 100%
rename from tests/ahriman/core/configuration/conftest.py
rename to ahriman-core/tests/ahriman/core/configuration/conftest.py
diff --git a/tests/ahriman/core/configuration/test_configuration.py b/ahriman-core/tests/ahriman/core/configuration/test_configuration.py
similarity index 100%
rename from tests/ahriman/core/configuration/test_configuration.py
rename to ahriman-core/tests/ahriman/core/configuration/test_configuration.py
diff --git a/tests/ahriman/core/configuration/test_configuration_multi_dict.py b/ahriman-core/tests/ahriman/core/configuration/test_configuration_multi_dict.py
similarity index 100%
rename from tests/ahriman/core/configuration/test_configuration_multi_dict.py
rename to ahriman-core/tests/ahriman/core/configuration/test_configuration_multi_dict.py
diff --git a/tests/ahriman/core/configuration/test_schema.py b/ahriman-core/tests/ahriman/core/configuration/test_schema.py
similarity index 100%
rename from tests/ahriman/core/configuration/test_schema.py
rename to ahriman-core/tests/ahriman/core/configuration/test_schema.py
diff --git a/tests/ahriman/core/configuration/test_shell_interpolator.py b/ahriman-core/tests/ahriman/core/configuration/test_shell_interpolator.py
similarity index 100%
rename from tests/ahriman/core/configuration/test_shell_interpolator.py
rename to ahriman-core/tests/ahriman/core/configuration/test_shell_interpolator.py
diff --git a/tests/ahriman/core/configuration/test_shell_template.py b/ahriman-core/tests/ahriman/core/configuration/test_shell_template.py
similarity index 100%
rename from tests/ahriman/core/configuration/test_shell_template.py
rename to ahriman-core/tests/ahriman/core/configuration/test_shell_template.py
diff --git a/tests/ahriman/core/configuration/test_validator.py b/ahriman-core/tests/ahriman/core/configuration/test_validator.py
similarity index 100%
rename from tests/ahriman/core/configuration/test_validator.py
rename to ahriman-core/tests/ahriman/core/configuration/test_validator.py
diff --git a/tests/ahriman/core/conftest.py b/ahriman-core/tests/ahriman/core/conftest.py
similarity index 87%
rename from tests/ahriman/core/conftest.py
rename to ahriman-core/tests/ahriman/core/conftest.py
index 09a9b85e..e9d6f916 100644
--- a/tests/ahriman/core/conftest.py
+++ b/ahriman-core/tests/ahriman/core/conftest.py
@@ -4,7 +4,6 @@ import pytest
from ahriman.core.alpm.repo import Repo
from ahriman.core.build_tools.task import Task
from ahriman.core.configuration import Configuration
-from ahriman.core.sign.gpg import GPG
from ahriman.core.tree import Leaf
from ahriman.models.package import Package
from ahriman.models.repository_paths import RepositoryPaths
@@ -64,20 +63,6 @@ def repo(configuration: Configuration, repository_paths: RepositoryPaths) -> Rep
return Repo(configuration.get("repository", "name"), repository_paths, [])
-@pytest.fixture
-def gpg(configuration: Configuration) -> GPG:
- """
- fixture for empty GPG
-
- Args:
- configuration(Configuration): configuration fixture
-
- Returns:
- GPG: GPG test instance
- """
- return GPG(configuration)
-
-
@pytest.fixture
def task_ahriman(package_ahriman: Package, configuration: Configuration, repository_paths: RepositoryPaths) -> Task:
"""
diff --git a/tests/ahriman/core/database/conftest.py b/ahriman-core/tests/ahriman/core/database/conftest.py
similarity index 100%
rename from tests/ahriman/core/database/conftest.py
rename to ahriman-core/tests/ahriman/core/database/conftest.py
diff --git a/tests/ahriman/core/database/migrations/conftest.py b/ahriman-core/tests/ahriman/core/database/migrations/conftest.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/conftest.py
rename to ahriman-core/tests/ahriman/core/database/migrations/conftest.py
diff --git a/tests/ahriman/core/database/migrations/test_m000_initial.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m000_initial.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m000_initial.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m000_initial.py
diff --git a/tests/ahriman/core/database/migrations/test_m001_package_source.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m001_package_source.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m001_package_source.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m001_package_source.py
diff --git a/tests/ahriman/core/database/migrations/test_m002_user_access.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m002_user_access.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m002_user_access.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m002_user_access.py
diff --git a/tests/ahriman/core/database/migrations/test_m003_patch_variables.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m003_patch_variables.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m003_patch_variables.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m003_patch_variables.py
diff --git a/tests/ahriman/core/database/migrations/test_m004_logs.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m004_logs.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m004_logs.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m004_logs.py
diff --git a/tests/ahriman/core/database/migrations/test_m005_make_opt_depends.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m005_make_opt_depends.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m005_make_opt_depends.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m005_make_opt_depends.py
diff --git a/tests/ahriman/core/database/migrations/test_m006_packages_architecture_required.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m006_packages_architecture_required.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m006_packages_architecture_required.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m006_packages_architecture_required.py
diff --git a/tests/ahriman/core/database/migrations/test_m007_check_depends.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m007_check_depends.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m007_check_depends.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m007_check_depends.py
diff --git a/tests/ahriman/core/database/migrations/test_m008_packagers.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m008_packagers.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m008_packagers.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m008_packagers.py
diff --git a/tests/ahriman/core/database/migrations/test_m009_local_source.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m009_local_source.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m009_local_source.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m009_local_source.py
diff --git a/tests/ahriman/core/database/migrations/test_m010_version_based_logs_removal.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m010_version_based_logs_removal.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m010_version_based_logs_removal.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m010_version_based_logs_removal.py
diff --git a/tests/ahriman/core/database/migrations/test_m011_repository_name.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m011_repository_name.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m011_repository_name.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m011_repository_name.py
diff --git a/tests/ahriman/core/database/migrations/test_m012_last_commit_sha.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m012_last_commit_sha.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m012_last_commit_sha.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m012_last_commit_sha.py
diff --git a/tests/ahriman/core/database/migrations/test_m013_dependencies.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m013_dependencies.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m013_dependencies.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m013_dependencies.py
diff --git a/tests/ahriman/core/database/migrations/test_m014_auditlog.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m014_auditlog.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m014_auditlog.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m014_auditlog.py
diff --git a/tests/ahriman/core/database/migrations/test_m015_logs_process_id.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m015_logs_process_id.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m015_logs_process_id.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m015_logs_process_id.py
diff --git a/tests/ahriman/core/database/migrations/test_m016_archive.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m016_archive.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m016_archive.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m016_archive.py
diff --git a/tests/ahriman/core/database/migrations/test_m017_pkgbuild.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m017_pkgbuild.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m017_pkgbuild.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m017_pkgbuild.py
diff --git a/tests/ahriman/core/database/migrations/test_m018_package_hold.py b/ahriman-core/tests/ahriman/core/database/migrations/test_m018_package_hold.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_m018_package_hold.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_m018_package_hold.py
diff --git a/tests/ahriman/core/database/migrations/test_migrations_init.py b/ahriman-core/tests/ahriman/core/database/migrations/test_migrations_init.py
similarity index 100%
rename from tests/ahriman/core/database/migrations/test_migrations_init.py
rename to ahriman-core/tests/ahriman/core/database/migrations/test_migrations_init.py
diff --git a/tests/ahriman/core/database/operations/test_auth_operations.py b/ahriman-core/tests/ahriman/core/database/operations/test_auth_operations.py
similarity index 100%
rename from tests/ahriman/core/database/operations/test_auth_operations.py
rename to ahriman-core/tests/ahriman/core/database/operations/test_auth_operations.py
diff --git a/tests/ahriman/core/database/operations/test_build_operations.py b/ahriman-core/tests/ahriman/core/database/operations/test_build_operations.py
similarity index 100%
rename from tests/ahriman/core/database/operations/test_build_operations.py
rename to ahriman-core/tests/ahriman/core/database/operations/test_build_operations.py
diff --git a/tests/ahriman/core/database/operations/test_changes_operations.py b/ahriman-core/tests/ahriman/core/database/operations/test_changes_operations.py
similarity index 100%
rename from tests/ahriman/core/database/operations/test_changes_operations.py
rename to ahriman-core/tests/ahriman/core/database/operations/test_changes_operations.py
diff --git a/tests/ahriman/core/database/operations/test_dependencies_operations.py b/ahriman-core/tests/ahriman/core/database/operations/test_dependencies_operations.py
similarity index 100%
rename from tests/ahriman/core/database/operations/test_dependencies_operations.py
rename to ahriman-core/tests/ahriman/core/database/operations/test_dependencies_operations.py
diff --git a/tests/ahriman/core/database/operations/test_event_operations.py b/ahriman-core/tests/ahriman/core/database/operations/test_event_operations.py
similarity index 100%
rename from tests/ahriman/core/database/operations/test_event_operations.py
rename to ahriman-core/tests/ahriman/core/database/operations/test_event_operations.py
diff --git a/tests/ahriman/core/database/operations/test_logs_operations.py b/ahriman-core/tests/ahriman/core/database/operations/test_logs_operations.py
similarity index 100%
rename from tests/ahriman/core/database/operations/test_logs_operations.py
rename to ahriman-core/tests/ahriman/core/database/operations/test_logs_operations.py
diff --git a/tests/ahriman/core/database/operations/test_operations.py b/ahriman-core/tests/ahriman/core/database/operations/test_operations.py
similarity index 100%
rename from tests/ahriman/core/database/operations/test_operations.py
rename to ahriman-core/tests/ahriman/core/database/operations/test_operations.py
diff --git a/tests/ahriman/core/database/operations/test_package_operations.py b/ahriman-core/tests/ahriman/core/database/operations/test_package_operations.py
similarity index 100%
rename from tests/ahriman/core/database/operations/test_package_operations.py
rename to ahriman-core/tests/ahriman/core/database/operations/test_package_operations.py
diff --git a/tests/ahriman/core/database/operations/test_patch_operations.py b/ahriman-core/tests/ahriman/core/database/operations/test_patch_operations.py
similarity index 100%
rename from tests/ahriman/core/database/operations/test_patch_operations.py
rename to ahriman-core/tests/ahriman/core/database/operations/test_patch_operations.py
diff --git a/tests/ahriman/core/database/test_sqlite.py b/ahriman-core/tests/ahriman/core/database/test_sqlite.py
similarity index 100%
rename from tests/ahriman/core/database/test_sqlite.py
rename to ahriman-core/tests/ahriman/core/database/test_sqlite.py
diff --git a/tests/ahriman/core/formatters/conftest.py b/ahriman-core/tests/ahriman/core/formatters/conftest.py
similarity index 100%
rename from tests/ahriman/core/formatters/conftest.py
rename to ahriman-core/tests/ahriman/core/formatters/conftest.py
diff --git a/tests/ahriman/core/formatters/test_aur_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_aur_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_aur_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_aur_printer.py
diff --git a/tests/ahriman/core/formatters/test_build_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_build_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_build_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_build_printer.py
diff --git a/tests/ahriman/core/formatters/test_changes_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_changes_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_changes_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_changes_printer.py
diff --git a/tests/ahriman/core/formatters/test_configuration_paths_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_configuration_paths_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_configuration_paths_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_configuration_paths_printer.py
diff --git a/tests/ahriman/core/formatters/test_configuration_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_configuration_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_configuration_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_configuration_printer.py
diff --git a/tests/ahriman/core/formatters/test_event_stats_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_event_stats_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_event_stats_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_event_stats_printer.py
diff --git a/tests/ahriman/core/formatters/test_package_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_package_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_package_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_package_printer.py
diff --git a/tests/ahriman/core/formatters/test_package_stats_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_package_stats_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_package_stats_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_package_stats_printer.py
diff --git a/tests/ahriman/core/formatters/test_patch_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_patch_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_patch_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_patch_printer.py
diff --git a/tests/ahriman/core/formatters/test_pkgbuild_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_pkgbuild_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_pkgbuild_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_pkgbuild_printer.py
diff --git a/tests/ahriman/core/formatters/test_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_printer.py
diff --git a/tests/ahriman/core/formatters/test_repository_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_repository_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_repository_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_repository_printer.py
diff --git a/tests/ahriman/core/formatters/test_repository_stats_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_repository_stats_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_repository_stats_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_repository_stats_printer.py
diff --git a/tests/ahriman/core/formatters/test_status_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_status_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_status_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_status_printer.py
diff --git a/tests/ahriman/core/formatters/test_string_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_string_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_string_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_string_printer.py
diff --git a/tests/ahriman/core/formatters/test_tree_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_tree_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_tree_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_tree_printer.py
diff --git a/tests/ahriman/core/formatters/test_update_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_update_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_update_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_update_printer.py
diff --git a/tests/ahriman/core/formatters/test_user_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_user_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_user_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_user_printer.py
diff --git a/tests/ahriman/core/formatters/test_validation_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_validation_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_validation_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_validation_printer.py
diff --git a/tests/ahriman/core/formatters/test_version_printer.py b/ahriman-core/tests/ahriman/core/formatters/test_version_printer.py
similarity index 100%
rename from tests/ahriman/core/formatters/test_version_printer.py
rename to ahriman-core/tests/ahriman/core/formatters/test_version_printer.py
diff --git a/tests/ahriman/core/gitremote/test_remote_pull.py b/ahriman-core/tests/ahriman/core/gitremote/test_remote_pull.py
similarity index 100%
rename from tests/ahriman/core/gitremote/test_remote_pull.py
rename to ahriman-core/tests/ahriman/core/gitremote/test_remote_pull.py
diff --git a/tests/ahriman/core/gitremote/test_remote_pull_trigger.py b/ahriman-core/tests/ahriman/core/gitremote/test_remote_pull_trigger.py
similarity index 100%
rename from tests/ahriman/core/gitremote/test_remote_pull_trigger.py
rename to ahriman-core/tests/ahriman/core/gitremote/test_remote_pull_trigger.py
diff --git a/tests/ahriman/core/gitremote/test_remote_push.py b/ahriman-core/tests/ahriman/core/gitremote/test_remote_push.py
similarity index 100%
rename from tests/ahriman/core/gitremote/test_remote_push.py
rename to ahriman-core/tests/ahriman/core/gitremote/test_remote_push.py
diff --git a/tests/ahriman/core/gitremote/test_remote_push_trigger.py b/ahriman-core/tests/ahriman/core/gitremote/test_remote_push_trigger.py
similarity index 100%
rename from tests/ahriman/core/gitremote/test_remote_push_trigger.py
rename to ahriman-core/tests/ahriman/core/gitremote/test_remote_push_trigger.py
diff --git a/tests/ahriman/core/housekeeping/conftest.py b/ahriman-core/tests/ahriman/core/housekeeping/conftest.py
similarity index 100%
rename from tests/ahriman/core/housekeeping/conftest.py
rename to ahriman-core/tests/ahriman/core/housekeeping/conftest.py
diff --git a/tests/ahriman/core/housekeeping/test_archive_rotation_trigger.py b/ahriman-core/tests/ahriman/core/housekeeping/test_archive_rotation_trigger.py
similarity index 100%
rename from tests/ahriman/core/housekeeping/test_archive_rotation_trigger.py
rename to ahriman-core/tests/ahriman/core/housekeeping/test_archive_rotation_trigger.py
diff --git a/tests/ahriman/core/housekeeping/test_logs_rotation_trigger.py b/ahriman-core/tests/ahriman/core/housekeeping/test_logs_rotation_trigger.py
similarity index 100%
rename from tests/ahriman/core/housekeeping/test_logs_rotation_trigger.py
rename to ahriman-core/tests/ahriman/core/housekeeping/test_logs_rotation_trigger.py
diff --git a/tests/ahriman/core/http/conftest.py b/ahriman-core/tests/ahriman/core/http/conftest.py
similarity index 100%
rename from tests/ahriman/core/http/conftest.py
rename to ahriman-core/tests/ahriman/core/http/conftest.py
diff --git a/tests/ahriman/core/http/test_sync_ahriman_client.py b/ahriman-core/tests/ahriman/core/http/test_sync_ahriman_client.py
similarity index 100%
rename from tests/ahriman/core/http/test_sync_ahriman_client.py
rename to ahriman-core/tests/ahriman/core/http/test_sync_ahriman_client.py
diff --git a/tests/ahriman/core/http/test_sync_http_client.py b/ahriman-core/tests/ahriman/core/http/test_sync_http_client.py
similarity index 100%
rename from tests/ahriman/core/http/test_sync_http_client.py
rename to ahriman-core/tests/ahriman/core/http/test_sync_http_client.py
diff --git a/tests/ahriman/core/log/test_http_log_handler.py b/ahriman-core/tests/ahriman/core/log/test_http_log_handler.py
similarity index 100%
rename from tests/ahriman/core/log/test_http_log_handler.py
rename to ahriman-core/tests/ahriman/core/log/test_http_log_handler.py
diff --git a/tests/ahriman/core/log/test_journal_handler.py b/ahriman-core/tests/ahriman/core/log/test_journal_handler.py
similarity index 100%
rename from tests/ahriman/core/log/test_journal_handler.py
rename to ahriman-core/tests/ahriman/core/log/test_journal_handler.py
diff --git a/tests/ahriman/core/log/test_lazy_logging.py b/ahriman-core/tests/ahriman/core/log/test_lazy_logging.py
similarity index 100%
rename from tests/ahriman/core/log/test_lazy_logging.py
rename to ahriman-core/tests/ahriman/core/log/test_lazy_logging.py
diff --git a/tests/ahriman/core/log/test_log_context.py b/ahriman-core/tests/ahriman/core/log/test_log_context.py
similarity index 100%
rename from tests/ahriman/core/log/test_log_context.py
rename to ahriman-core/tests/ahriman/core/log/test_log_context.py
diff --git a/tests/ahriman/core/log/test_log_loader.py b/ahriman-core/tests/ahriman/core/log/test_log_loader.py
similarity index 100%
rename from tests/ahriman/core/log/test_log_loader.py
rename to ahriman-core/tests/ahriman/core/log/test_log_loader.py
diff --git a/tests/ahriman/core/report/conftest.py b/ahriman-core/tests/ahriman/core/report/conftest.py
similarity index 100%
rename from tests/ahriman/core/report/conftest.py
rename to ahriman-core/tests/ahriman/core/report/conftest.py
diff --git a/tests/ahriman/core/report/test_console.py b/ahriman-core/tests/ahriman/core/report/test_console.py
similarity index 100%
rename from tests/ahriman/core/report/test_console.py
rename to ahriman-core/tests/ahriman/core/report/test_console.py
diff --git a/tests/ahriman/core/report/test_email.py b/ahriman-core/tests/ahriman/core/report/test_email.py
similarity index 100%
rename from tests/ahriman/core/report/test_email.py
rename to ahriman-core/tests/ahriman/core/report/test_email.py
diff --git a/tests/ahriman/core/report/test_html.py b/ahriman-core/tests/ahriman/core/report/test_html.py
similarity index 100%
rename from tests/ahriman/core/report/test_html.py
rename to ahriman-core/tests/ahriman/core/report/test_html.py
diff --git a/tests/ahriman/core/report/test_jinja_template.py b/ahriman-core/tests/ahriman/core/report/test_jinja_template.py
similarity index 100%
rename from tests/ahriman/core/report/test_jinja_template.py
rename to ahriman-core/tests/ahriman/core/report/test_jinja_template.py
diff --git a/tests/ahriman/core/report/test_remote_call.py b/ahriman-core/tests/ahriman/core/report/test_remote_call.py
similarity index 100%
rename from tests/ahriman/core/report/test_remote_call.py
rename to ahriman-core/tests/ahriman/core/report/test_remote_call.py
diff --git a/tests/ahriman/core/report/test_report.py b/ahriman-core/tests/ahriman/core/report/test_report.py
similarity index 100%
rename from tests/ahriman/core/report/test_report.py
rename to ahriman-core/tests/ahriman/core/report/test_report.py
diff --git a/tests/ahriman/core/report/test_report_trigger.py b/ahriman-core/tests/ahriman/core/report/test_report_trigger.py
similarity index 100%
rename from tests/ahriman/core/report/test_report_trigger.py
rename to ahriman-core/tests/ahriman/core/report/test_report_trigger.py
diff --git a/tests/ahriman/core/report/test_rss.py b/ahriman-core/tests/ahriman/core/report/test_rss.py
similarity index 100%
rename from tests/ahriman/core/report/test_rss.py
rename to ahriman-core/tests/ahriman/core/report/test_rss.py
diff --git a/tests/ahriman/core/report/test_telegram.py b/ahriman-core/tests/ahriman/core/report/test_telegram.py
similarity index 100%
rename from tests/ahriman/core/report/test_telegram.py
rename to ahriman-core/tests/ahriman/core/report/test_telegram.py
diff --git a/tests/ahriman/core/repository/conftest.py b/ahriman-core/tests/ahriman/core/repository/conftest.py
similarity index 100%
rename from tests/ahriman/core/repository/conftest.py
rename to ahriman-core/tests/ahriman/core/repository/conftest.py
diff --git a/tests/ahriman/core/repository/test_cleaner.py b/ahriman-core/tests/ahriman/core/repository/test_cleaner.py
similarity index 100%
rename from tests/ahriman/core/repository/test_cleaner.py
rename to ahriman-core/tests/ahriman/core/repository/test_cleaner.py
diff --git a/tests/ahriman/core/repository/test_event_logger.py b/ahriman-core/tests/ahriman/core/repository/test_event_logger.py
similarity index 100%
rename from tests/ahriman/core/repository/test_event_logger.py
rename to ahriman-core/tests/ahriman/core/repository/test_event_logger.py
diff --git a/tests/ahriman/core/repository/test_executor.py b/ahriman-core/tests/ahriman/core/repository/test_executor.py
similarity index 100%
rename from tests/ahriman/core/repository/test_executor.py
rename to ahriman-core/tests/ahriman/core/repository/test_executor.py
diff --git a/tests/ahriman/core/repository/test_explorer.py b/ahriman-core/tests/ahriman/core/repository/test_explorer.py
similarity index 100%
rename from tests/ahriman/core/repository/test_explorer.py
rename to ahriman-core/tests/ahriman/core/repository/test_explorer.py
diff --git a/tests/ahriman/core/repository/test_package_info.py b/ahriman-core/tests/ahriman/core/repository/test_package_info.py
similarity index 100%
rename from tests/ahriman/core/repository/test_package_info.py
rename to ahriman-core/tests/ahriman/core/repository/test_package_info.py
diff --git a/tests/ahriman/core/repository/test_repository.py b/ahriman-core/tests/ahriman/core/repository/test_repository.py
similarity index 100%
rename from tests/ahriman/core/repository/test_repository.py
rename to ahriman-core/tests/ahriman/core/repository/test_repository.py
diff --git a/tests/ahriman/core/repository/test_repository_properties.py b/ahriman-core/tests/ahriman/core/repository/test_repository_properties.py
similarity index 100%
rename from tests/ahriman/core/repository/test_repository_properties.py
rename to ahriman-core/tests/ahriman/core/repository/test_repository_properties.py
diff --git a/tests/ahriman/core/repository/test_update_handler.py b/ahriman-core/tests/ahriman/core/repository/test_update_handler.py
similarity index 100%
rename from tests/ahriman/core/repository/test_update_handler.py
rename to ahriman-core/tests/ahriman/core/repository/test_update_handler.py
diff --git a/tests/ahriman/core/sign/conftest.py b/ahriman-core/tests/ahriman/core/sign/conftest.py
similarity index 100%
rename from tests/ahriman/core/sign/conftest.py
rename to ahriman-core/tests/ahriman/core/sign/conftest.py
diff --git a/tests/ahriman/core/sign/test_gpg.py b/ahriman-core/tests/ahriman/core/sign/test_gpg.py
similarity index 100%
rename from tests/ahriman/core/sign/test_gpg.py
rename to ahriman-core/tests/ahriman/core/sign/test_gpg.py
diff --git a/tests/ahriman/core/status/conftest.py b/ahriman-core/tests/ahriman/core/status/conftest.py
similarity index 100%
rename from tests/ahriman/core/status/conftest.py
rename to ahriman-core/tests/ahriman/core/status/conftest.py
diff --git a/tests/ahriman/core/status/test_client.py b/ahriman-core/tests/ahriman/core/status/test_client.py
similarity index 100%
rename from tests/ahriman/core/status/test_client.py
rename to ahriman-core/tests/ahriman/core/status/test_client.py
diff --git a/tests/ahriman/core/status/test_event_bus.py b/ahriman-core/tests/ahriman/core/status/test_event_bus.py
similarity index 100%
rename from tests/ahriman/core/status/test_event_bus.py
rename to ahriman-core/tests/ahriman/core/status/test_event_bus.py
diff --git a/tests/ahriman/core/status/test_local_client.py b/ahriman-core/tests/ahriman/core/status/test_local_client.py
similarity index 100%
rename from tests/ahriman/core/status/test_local_client.py
rename to ahriman-core/tests/ahriman/core/status/test_local_client.py
diff --git a/tests/ahriman/core/status/test_watcher.py b/ahriman-core/tests/ahriman/core/status/test_watcher.py
similarity index 100%
rename from tests/ahriman/core/status/test_watcher.py
rename to ahriman-core/tests/ahriman/core/status/test_watcher.py
diff --git a/tests/ahriman/core/status/test_web_client.py b/ahriman-core/tests/ahriman/core/status/test_web_client.py
similarity index 100%
rename from tests/ahriman/core/status/test_web_client.py
rename to ahriman-core/tests/ahriman/core/status/test_web_client.py
diff --git a/tests/ahriman/core/test_context_init.py b/ahriman-core/tests/ahriman/core/test_context_init.py
similarity index 100%
rename from tests/ahriman/core/test_context_init.py
rename to ahriman-core/tests/ahriman/core/test_context_init.py
diff --git a/tests/ahriman/core/test_exceptions.py b/ahriman-core/tests/ahriman/core/test_exceptions.py
similarity index 100%
rename from tests/ahriman/core/test_exceptions.py
rename to ahriman-core/tests/ahriman/core/test_exceptions.py
diff --git a/tests/ahriman/core/test_module_loader.py b/ahriman-core/tests/ahriman/core/test_module_loader.py
similarity index 86%
rename from tests/ahriman/core/test_module_loader.py
rename to ahriman-core/tests/ahriman/core/test_module_loader.py
index ba6b1515..72c34929 100644
--- a/tests/ahriman/core/test_module_loader.py
+++ b/ahriman-core/tests/ahriman/core/test_module_loader.py
@@ -10,7 +10,7 @@ def test_modules() -> None:
"""
must load modules
"""
- modules = list(_modules(Path(__file__).parent.parent, "ahriman.web.views"))
+ modules = list(_modules(Path(next(iter(ahriman.web.views.__path__))), "ahriman.web.views"))
assert modules
assert all(not module.ispkg for module in modules)
diff --git a/tests/ahriman/core/test_spawn.py b/ahriman-core/tests/ahriman/core/test_spawn.py
similarity index 100%
rename from tests/ahriman/core/test_spawn.py
rename to ahriman-core/tests/ahriman/core/test_spawn.py
diff --git a/tests/ahriman/core/test_tree.py b/ahriman-core/tests/ahriman/core/test_tree.py
similarity index 100%
rename from tests/ahriman/core/test_tree.py
rename to ahriman-core/tests/ahriman/core/test_tree.py
diff --git a/tests/ahriman/core/test_types.py b/ahriman-core/tests/ahriman/core/test_types.py
similarity index 100%
rename from tests/ahriman/core/test_types.py
rename to ahriman-core/tests/ahriman/core/test_types.py
diff --git a/tests/ahriman/core/test_util.py b/ahriman-core/tests/ahriman/core/test_util.py
similarity index 100%
rename from tests/ahriman/core/test_util.py
rename to ahriman-core/tests/ahriman/core/test_util.py
diff --git a/tests/ahriman/core/test_utils.py b/ahriman-core/tests/ahriman/core/test_utils.py
similarity index 100%
rename from tests/ahriman/core/test_utils.py
rename to ahriman-core/tests/ahriman/core/test_utils.py
diff --git a/tests/ahriman/core/triggers/conftest.py b/ahriman-core/tests/ahriman/core/triggers/conftest.py
similarity index 100%
rename from tests/ahriman/core/triggers/conftest.py
rename to ahriman-core/tests/ahriman/core/triggers/conftest.py
diff --git a/tests/ahriman/core/triggers/test_trigger.py b/ahriman-core/tests/ahriman/core/triggers/test_trigger.py
similarity index 100%
rename from tests/ahriman/core/triggers/test_trigger.py
rename to ahriman-core/tests/ahriman/core/triggers/test_trigger.py
diff --git a/tests/ahriman/core/triggers/test_trigger_loader.py b/ahriman-core/tests/ahriman/core/triggers/test_trigger_loader.py
similarity index 95%
rename from tests/ahriman/core/triggers/test_trigger_loader.py
rename to ahriman-core/tests/ahriman/core/triggers/test_trigger_loader.py
index 6c2d5ba3..0398ac43 100644
--- a/tests/ahriman/core/triggers/test_trigger_loader.py
+++ b/ahriman-core/tests/ahriman/core/triggers/test_trigger_loader.py
@@ -92,7 +92,7 @@ def test_load_trigger_class_path(trigger_loader: TriggerLoader, resource_path_ro
"""
must load trigger class from path
"""
- path = resource_path_root.parent.parent / "src" / "ahriman" / "core" / "report" / "__init__.py"
+ path = resource_path_root.parent.parent / "ahriman-core" / "src" / "ahriman" / "core" / "report" / "__init__.py"
assert trigger_loader.load_trigger_class(f"{path}.ReportTrigger") == ReportTrigger
@@ -100,7 +100,7 @@ def test_load_trigger_class_path_suffix(trigger_loader: TriggerLoader, resource_
"""
must load trigger class from path without py suffix
"""
- path = resource_path_root.parent.parent / "src" / "ahriman" / "core" / "report" / "__init__"
+ path = resource_path_root.parent.parent / "ahriman-core" / "src" / "ahriman" / "core" / "report" / "__init__"
assert trigger_loader.load_trigger_class(f"{path}.ReportTrigger") == ReportTrigger
@@ -108,7 +108,7 @@ def test_load_trigger_class_path_directory(trigger_loader: TriggerLoader, resour
"""
must raise InvalidExtension if provided import path is directory
"""
- path = resource_path_root.parent.parent / "src" / "ahriman" / "core" / "report"
+ path = resource_path_root.parent.parent / "ahriman-core" / "src" / "ahriman" / "core" / "report"
with pytest.raises(ExtensionError):
trigger_loader.load_trigger_class(f"{path}.ReportTrigger")
diff --git a/tests/ahriman/core/upload/conftest.py b/ahriman-core/tests/ahriman/core/upload/conftest.py
similarity index 100%
rename from tests/ahriman/core/upload/conftest.py
rename to ahriman-core/tests/ahriman/core/upload/conftest.py
diff --git a/tests/ahriman/core/upload/test_github.py b/ahriman-core/tests/ahriman/core/upload/test_github.py
similarity index 100%
rename from tests/ahriman/core/upload/test_github.py
rename to ahriman-core/tests/ahriman/core/upload/test_github.py
diff --git a/tests/ahriman/core/upload/test_http_upload.py b/ahriman-core/tests/ahriman/core/upload/test_http_upload.py
similarity index 100%
rename from tests/ahriman/core/upload/test_http_upload.py
rename to ahriman-core/tests/ahriman/core/upload/test_http_upload.py
diff --git a/tests/ahriman/core/upload/test_remote_service.py b/ahriman-core/tests/ahriman/core/upload/test_remote_service.py
similarity index 100%
rename from tests/ahriman/core/upload/test_remote_service.py
rename to ahriman-core/tests/ahriman/core/upload/test_remote_service.py
diff --git a/tests/ahriman/core/upload/test_rsync.py b/ahriman-core/tests/ahriman/core/upload/test_rsync.py
similarity index 100%
rename from tests/ahriman/core/upload/test_rsync.py
rename to ahriman-core/tests/ahriman/core/upload/test_rsync.py
diff --git a/tests/ahriman/core/upload/test_s3.py b/ahriman-core/tests/ahriman/core/upload/test_s3.py
similarity index 100%
rename from tests/ahriman/core/upload/test_s3.py
rename to ahriman-core/tests/ahriman/core/upload/test_s3.py
diff --git a/tests/ahriman/core/upload/test_upload.py b/ahriman-core/tests/ahriman/core/upload/test_upload.py
similarity index 100%
rename from tests/ahriman/core/upload/test_upload.py
rename to ahriman-core/tests/ahriman/core/upload/test_upload.py
diff --git a/tests/ahriman/core/upload/test_upload_trigger.py b/ahriman-core/tests/ahriman/core/upload/test_upload_trigger.py
similarity index 100%
rename from tests/ahriman/core/upload/test_upload_trigger.py
rename to ahriman-core/tests/ahriman/core/upload/test_upload_trigger.py
diff --git a/tests/ahriman/models/conftest.py b/ahriman-core/tests/ahriman/models/conftest.py
similarity index 100%
rename from tests/ahriman/models/conftest.py
rename to ahriman-core/tests/ahriman/models/conftest.py
diff --git a/tests/ahriman/models/test_action.py b/ahriman-core/tests/ahriman/models/test_action.py
similarity index 100%
rename from tests/ahriman/models/test_action.py
rename to ahriman-core/tests/ahriman/models/test_action.py
diff --git a/tests/ahriman/models/test_aur_package.py b/ahriman-core/tests/ahriman/models/test_aur_package.py
similarity index 100%
rename from tests/ahriman/models/test_aur_package.py
rename to ahriman-core/tests/ahriman/models/test_aur_package.py
diff --git a/tests/ahriman/models/test_auth_settings.py b/ahriman-core/tests/ahriman/models/test_auth_settings.py
similarity index 100%
rename from tests/ahriman/models/test_auth_settings.py
rename to ahriman-core/tests/ahriman/models/test_auth_settings.py
diff --git a/tests/ahriman/models/test_build_status.py b/ahriman-core/tests/ahriman/models/test_build_status.py
similarity index 100%
rename from tests/ahriman/models/test_build_status.py
rename to ahriman-core/tests/ahriman/models/test_build_status.py
diff --git a/tests/ahriman/models/test_changes.py b/ahriman-core/tests/ahriman/models/test_changes.py
similarity index 100%
rename from tests/ahriman/models/test_changes.py
rename to ahriman-core/tests/ahriman/models/test_changes.py
diff --git a/tests/ahriman/models/test_context_key.py b/ahriman-core/tests/ahriman/models/test_context_key.py
similarity index 100%
rename from tests/ahriman/models/test_context_key.py
rename to ahriman-core/tests/ahriman/models/test_context_key.py
diff --git a/tests/ahriman/models/test_counters.py b/ahriman-core/tests/ahriman/models/test_counters.py
similarity index 100%
rename from tests/ahriman/models/test_counters.py
rename to ahriman-core/tests/ahriman/models/test_counters.py
diff --git a/tests/ahriman/models/test_dependencies.py b/ahriman-core/tests/ahriman/models/test_dependencies.py
similarity index 100%
rename from tests/ahriman/models/test_dependencies.py
rename to ahriman-core/tests/ahriman/models/test_dependencies.py
diff --git a/tests/ahriman/models/test_event.py b/ahriman-core/tests/ahriman/models/test_event.py
similarity index 100%
rename from tests/ahriman/models/test_event.py
rename to ahriman-core/tests/ahriman/models/test_event.py
diff --git a/tests/ahriman/models/test_filesystem_package.py b/ahriman-core/tests/ahriman/models/test_filesystem_package.py
similarity index 100%
rename from tests/ahriman/models/test_filesystem_package.py
rename to ahriman-core/tests/ahriman/models/test_filesystem_package.py
diff --git a/tests/ahriman/models/test_internal_status.py b/ahriman-core/tests/ahriman/models/test_internal_status.py
similarity index 100%
rename from tests/ahriman/models/test_internal_status.py
rename to ahriman-core/tests/ahriman/models/test_internal_status.py
diff --git a/tests/ahriman/models/test_log_handler.py b/ahriman-core/tests/ahriman/models/test_log_handler.py
similarity index 100%
rename from tests/ahriman/models/test_log_handler.py
rename to ahriman-core/tests/ahriman/models/test_log_handler.py
diff --git a/tests/ahriman/models/test_log_record.py b/ahriman-core/tests/ahriman/models/test_log_record.py
similarity index 100%
rename from tests/ahriman/models/test_log_record.py
rename to ahriman-core/tests/ahriman/models/test_log_record.py
diff --git a/tests/ahriman/models/test_log_record_id.py b/ahriman-core/tests/ahriman/models/test_log_record_id.py
similarity index 100%
rename from tests/ahriman/models/test_log_record_id.py
rename to ahriman-core/tests/ahriman/models/test_log_record_id.py
diff --git a/tests/ahriman/models/test_metrics_timer.py b/ahriman-core/tests/ahriman/models/test_metrics_timer.py
similarity index 100%
rename from tests/ahriman/models/test_metrics_timer.py
rename to ahriman-core/tests/ahriman/models/test_metrics_timer.py
diff --git a/tests/ahriman/models/test_migration.py b/ahriman-core/tests/ahriman/models/test_migration.py
similarity index 100%
rename from tests/ahriman/models/test_migration.py
rename to ahriman-core/tests/ahriman/models/test_migration.py
diff --git a/tests/ahriman/models/test_migration_result.py b/ahriman-core/tests/ahriman/models/test_migration_result.py
similarity index 100%
rename from tests/ahriman/models/test_migration_result.py
rename to ahriman-core/tests/ahriman/models/test_migration_result.py
diff --git a/tests/ahriman/models/test_package.py b/ahriman-core/tests/ahriman/models/test_package.py
similarity index 100%
rename from tests/ahriman/models/test_package.py
rename to ahriman-core/tests/ahriman/models/test_package.py
diff --git a/tests/ahriman/models/test_package_description.py b/ahriman-core/tests/ahriman/models/test_package_description.py
similarity index 100%
rename from tests/ahriman/models/test_package_description.py
rename to ahriman-core/tests/ahriman/models/test_package_description.py
diff --git a/tests/ahriman/models/test_package_source.py b/ahriman-core/tests/ahriman/models/test_package_source.py
similarity index 100%
rename from tests/ahriman/models/test_package_source.py
rename to ahriman-core/tests/ahriman/models/test_package_source.py
diff --git a/tests/ahriman/models/test_packagers.py b/ahriman-core/tests/ahriman/models/test_packagers.py
similarity index 100%
rename from tests/ahriman/models/test_packagers.py
rename to ahriman-core/tests/ahriman/models/test_packagers.py
diff --git a/tests/ahriman/models/test_pacman_synchronization.py b/ahriman-core/tests/ahriman/models/test_pacman_synchronization.py
similarity index 100%
rename from tests/ahriman/models/test_pacman_synchronization.py
rename to ahriman-core/tests/ahriman/models/test_pacman_synchronization.py
diff --git a/tests/ahriman/models/test_pkgbuild.py b/ahriman-core/tests/ahriman/models/test_pkgbuild.py
similarity index 100%
rename from tests/ahriman/models/test_pkgbuild.py
rename to ahriman-core/tests/ahriman/models/test_pkgbuild.py
diff --git a/tests/ahriman/models/test_pkgbuild_patch.py b/ahriman-core/tests/ahriman/models/test_pkgbuild_patch.py
similarity index 100%
rename from tests/ahriman/models/test_pkgbuild_patch.py
rename to ahriman-core/tests/ahriman/models/test_pkgbuild_patch.py
diff --git a/tests/ahriman/models/test_process_status.py b/ahriman-core/tests/ahriman/models/test_process_status.py
similarity index 100%
rename from tests/ahriman/models/test_process_status.py
rename to ahriman-core/tests/ahriman/models/test_process_status.py
diff --git a/tests/ahriman/models/test_property.py b/ahriman-core/tests/ahriman/models/test_property.py
similarity index 100%
rename from tests/ahriman/models/test_property.py
rename to ahriman-core/tests/ahriman/models/test_property.py
diff --git a/tests/ahriman/models/test_remote_source.py b/ahriman-core/tests/ahriman/models/test_remote_source.py
similarity index 100%
rename from tests/ahriman/models/test_remote_source.py
rename to ahriman-core/tests/ahriman/models/test_remote_source.py
diff --git a/tests/ahriman/models/test_report_settings.py b/ahriman-core/tests/ahriman/models/test_report_settings.py
similarity index 100%
rename from tests/ahriman/models/test_report_settings.py
rename to ahriman-core/tests/ahriman/models/test_report_settings.py
diff --git a/tests/ahriman/models/test_repository_id.py b/ahriman-core/tests/ahriman/models/test_repository_id.py
similarity index 100%
rename from tests/ahriman/models/test_repository_id.py
rename to ahriman-core/tests/ahriman/models/test_repository_id.py
diff --git a/tests/ahriman/models/test_repository_paths.py b/ahriman-core/tests/ahriman/models/test_repository_paths.py
similarity index 100%
rename from tests/ahriman/models/test_repository_paths.py
rename to ahriman-core/tests/ahriman/models/test_repository_paths.py
diff --git a/tests/ahriman/models/test_repository_stats.py b/ahriman-core/tests/ahriman/models/test_repository_stats.py
similarity index 100%
rename from tests/ahriman/models/test_repository_stats.py
rename to ahriman-core/tests/ahriman/models/test_repository_stats.py
diff --git a/tests/ahriman/models/test_result.py b/ahriman-core/tests/ahriman/models/test_result.py
similarity index 100%
rename from tests/ahriman/models/test_result.py
rename to ahriman-core/tests/ahriman/models/test_result.py
diff --git a/tests/ahriman/models/test_scan_paths.py b/ahriman-core/tests/ahriman/models/test_scan_paths.py
similarity index 100%
rename from tests/ahriman/models/test_scan_paths.py
rename to ahriman-core/tests/ahriman/models/test_scan_paths.py
diff --git a/tests/ahriman/models/test_series_statistics.py b/ahriman-core/tests/ahriman/models/test_series_statistics.py
similarity index 100%
rename from tests/ahriman/models/test_series_statistics.py
rename to ahriman-core/tests/ahriman/models/test_series_statistics.py
diff --git a/tests/ahriman/models/test_sign_settings.py b/ahriman-core/tests/ahriman/models/test_sign_settings.py
similarity index 100%
rename from tests/ahriman/models/test_sign_settings.py
rename to ahriman-core/tests/ahriman/models/test_sign_settings.py
diff --git a/tests/ahriman/models/test_smtp_ssl_settings.py b/ahriman-core/tests/ahriman/models/test_smtp_ssl_settings.py
similarity index 100%
rename from tests/ahriman/models/test_smtp_ssl_settings.py
rename to ahriman-core/tests/ahriman/models/test_smtp_ssl_settings.py
diff --git a/tests/ahriman/models/test_upload_settings.py b/ahriman-core/tests/ahriman/models/test_upload_settings.py
similarity index 100%
rename from tests/ahriman/models/test_upload_settings.py
rename to ahriman-core/tests/ahriman/models/test_upload_settings.py
diff --git a/tests/ahriman/models/test_user.py b/ahriman-core/tests/ahriman/models/test_user.py
similarity index 100%
rename from tests/ahriman/models/test_user.py
rename to ahriman-core/tests/ahriman/models/test_user.py
diff --git a/tests/ahriman/models/test_user_access.py b/ahriman-core/tests/ahriman/models/test_user_access.py
similarity index 100%
rename from tests/ahriman/models/test_user_access.py
rename to ahriman-core/tests/ahriman/models/test_user_access.py
diff --git a/tests/ahriman/models/test_waiter.py b/ahriman-core/tests/ahriman/models/test_waiter.py
similarity index 100%
rename from tests/ahriman/models/test_waiter.py
rename to ahriman-core/tests/ahriman/models/test_waiter.py
diff --git a/tests/ahriman/models/test_worker.py b/ahriman-core/tests/ahriman/models/test_worker.py
similarity index 100%
rename from tests/ahriman/models/test_worker.py
rename to ahriman-core/tests/ahriman/models/test_worker.py
diff --git a/package/share/ahriman/settings/ahriman.ini.d/00-triggers.ini b/ahriman-triggers/package/share/ahriman/settings/ahriman.ini.d/00-triggers.ini
similarity index 100%
rename from package/share/ahriman/settings/ahriman.ini.d/00-triggers.ini
rename to ahriman-triggers/package/share/ahriman/settings/ahriman.ini.d/00-triggers.ini
diff --git a/ahriman-triggers/pyproject.toml b/ahriman-triggers/pyproject.toml
new file mode 100644
index 00000000..30d1efdf
--- /dev/null
+++ b/ahriman-triggers/pyproject.toml
@@ -0,0 +1,27 @@
+[build-system]
+requires = [
+ "hatchling",
+]
+build-backend = "hatchling.build"
+
+[project]
+name = "ahriman-triggers"
+dependencies = [
+ "ahriman-core",
+]
+description = "ArcH linux ReposItory MANager, additional extensions"
+dynamic = [
+ "version",
+]
+requires-python = ">=3.13"
+
+[tool.hatch.build.targets.wheel]
+packages = [
+ "src/ahriman",
+]
+
+[tool.hatch.build.targets.wheel.shared-data]
+"package/share" = "share"
+
+[tool.hatch.version]
+path = "../ahriman-core/src/ahriman/__init__.py"
diff --git a/src/ahriman/models/__init__.py b/ahriman-triggers/src/ahriman/application/handlers/triggers_support/__init__.py
similarity index 100%
rename from src/ahriman/models/__init__.py
rename to ahriman-triggers/src/ahriman/application/handlers/triggers_support/__init__.py
diff --git a/src/ahriman/application/handlers/triggers_support.py b/ahriman-triggers/src/ahriman/application/handlers/triggers_support/triggers_support.py
similarity index 100%
rename from src/ahriman/application/handlers/triggers_support.py
rename to ahriman-triggers/src/ahriman/application/handlers/triggers_support/triggers_support.py
diff --git a/src/ahriman/core/archive/__init__.py b/ahriman-triggers/src/ahriman/core/archive/__init__.py
similarity index 100%
rename from src/ahriman/core/archive/__init__.py
rename to ahriman-triggers/src/ahriman/core/archive/__init__.py
diff --git a/src/ahriman/core/archive/archive_tree.py b/ahriman-triggers/src/ahriman/core/archive/archive_tree.py
similarity index 100%
rename from src/ahriman/core/archive/archive_tree.py
rename to ahriman-triggers/src/ahriman/core/archive/archive_tree.py
diff --git a/src/ahriman/core/archive/archive_trigger.py b/ahriman-triggers/src/ahriman/core/archive/archive_trigger.py
similarity index 100%
rename from src/ahriman/core/archive/archive_trigger.py
rename to ahriman-triggers/src/ahriman/core/archive/archive_trigger.py
diff --git a/src/ahriman/core/distributed/__init__.py b/ahriman-triggers/src/ahriman/core/distributed/__init__.py
similarity index 100%
rename from src/ahriman/core/distributed/__init__.py
rename to ahriman-triggers/src/ahriman/core/distributed/__init__.py
diff --git a/src/ahriman/core/distributed/distributed_system.py b/ahriman-triggers/src/ahriman/core/distributed/distributed_system.py
similarity index 100%
rename from src/ahriman/core/distributed/distributed_system.py
rename to ahriman-triggers/src/ahriman/core/distributed/distributed_system.py
diff --git a/src/ahriman/core/distributed/worker_loader_trigger.py b/ahriman-triggers/src/ahriman/core/distributed/worker_loader_trigger.py
similarity index 100%
rename from src/ahriman/core/distributed/worker_loader_trigger.py
rename to ahriman-triggers/src/ahriman/core/distributed/worker_loader_trigger.py
diff --git a/src/ahriman/core/distributed/worker_trigger.py b/ahriman-triggers/src/ahriman/core/distributed/worker_trigger.py
similarity index 100%
rename from src/ahriman/core/distributed/worker_trigger.py
rename to ahriman-triggers/src/ahriman/core/distributed/worker_trigger.py
diff --git a/src/ahriman/core/distributed/workers_cache.py b/ahriman-triggers/src/ahriman/core/distributed/workers_cache.py
similarity index 100%
rename from src/ahriman/core/distributed/workers_cache.py
rename to ahriman-triggers/src/ahriman/core/distributed/workers_cache.py
diff --git a/src/ahriman/core/support/__init__.py b/ahriman-triggers/src/ahriman/core/support/__init__.py
similarity index 100%
rename from src/ahriman/core/support/__init__.py
rename to ahriman-triggers/src/ahriman/core/support/__init__.py
diff --git a/src/ahriman/core/support/keyring_trigger.py b/ahriman-triggers/src/ahriman/core/support/keyring_trigger.py
similarity index 100%
rename from src/ahriman/core/support/keyring_trigger.py
rename to ahriman-triggers/src/ahriman/core/support/keyring_trigger.py
diff --git a/src/ahriman/core/support/mirrorlist_trigger.py b/ahriman-triggers/src/ahriman/core/support/mirrorlist_trigger.py
similarity index 100%
rename from src/ahriman/core/support/mirrorlist_trigger.py
rename to ahriman-triggers/src/ahriman/core/support/mirrorlist_trigger.py
diff --git a/src/ahriman/core/support/package_creator.py b/ahriman-triggers/src/ahriman/core/support/package_creator.py
similarity index 100%
rename from src/ahriman/core/support/package_creator.py
rename to ahriman-triggers/src/ahriman/core/support/package_creator.py
diff --git a/src/ahriman/web/__init__.py b/ahriman-triggers/src/ahriman/core/support/pkgbuild/__init__.py
similarity index 100%
rename from src/ahriman/web/__init__.py
rename to ahriman-triggers/src/ahriman/core/support/pkgbuild/__init__.py
diff --git a/src/ahriman/core/support/pkgbuild/keyring_generator.py b/ahriman-triggers/src/ahriman/core/support/pkgbuild/keyring_generator.py
similarity index 100%
rename from src/ahriman/core/support/pkgbuild/keyring_generator.py
rename to ahriman-triggers/src/ahriman/core/support/pkgbuild/keyring_generator.py
diff --git a/src/ahriman/core/support/pkgbuild/mirrorlist_generator.py b/ahriman-triggers/src/ahriman/core/support/pkgbuild/mirrorlist_generator.py
similarity index 100%
rename from src/ahriman/core/support/pkgbuild/mirrorlist_generator.py
rename to ahriman-triggers/src/ahriman/core/support/pkgbuild/mirrorlist_generator.py
diff --git a/src/ahriman/core/support/pkgbuild/pkgbuild_generator.py b/ahriman-triggers/src/ahriman/core/support/pkgbuild/pkgbuild_generator.py
similarity index 100%
rename from src/ahriman/core/support/pkgbuild/pkgbuild_generator.py
rename to ahriman-triggers/src/ahriman/core/support/pkgbuild/pkgbuild_generator.py
diff --git a/tests/ahriman/application/handlers/test_handler_triggers_support.py b/ahriman-triggers/tests/ahriman/application/handlers/triggers_support/test_handler_triggers_support.py
similarity index 68%
rename from tests/ahriman/application/handlers/test_handler_triggers_support.py
rename to ahriman-triggers/tests/ahriman/application/handlers/triggers_support/test_handler_triggers_support.py
index 074bf472..11b95415 100644
--- a/tests/ahriman/application/handlers/test_handler_triggers_support.py
+++ b/ahriman-triggers/tests/ahriman/application/handlers/triggers_support/test_handler_triggers_support.py
@@ -1,5 +1,5 @@
from ahriman.application.handlers.triggers import Triggers
-from ahriman.application.handlers.triggers_support import TriggersSupport
+from ahriman.application.handlers.triggers_support.triggers_support import TriggersSupport
def test_arguments() -> None:
diff --git a/tests/ahriman/core/archive/conftest.py b/ahriman-triggers/tests/ahriman/core/archive/conftest.py
similarity index 100%
rename from tests/ahriman/core/archive/conftest.py
rename to ahriman-triggers/tests/ahriman/core/archive/conftest.py
diff --git a/tests/ahriman/core/archive/test_archive_tree.py b/ahriman-triggers/tests/ahriman/core/archive/test_archive_tree.py
similarity index 100%
rename from tests/ahriman/core/archive/test_archive_tree.py
rename to ahriman-triggers/tests/ahriman/core/archive/test_archive_tree.py
diff --git a/tests/ahriman/core/archive/test_archive_trigger.py b/ahriman-triggers/tests/ahriman/core/archive/test_archive_trigger.py
similarity index 100%
rename from tests/ahriman/core/archive/test_archive_trigger.py
rename to ahriman-triggers/tests/ahriman/core/archive/test_archive_trigger.py
diff --git a/tests/ahriman/core/distributed/conftest.py b/ahriman-triggers/tests/ahriman/core/distributed/conftest.py
similarity index 100%
rename from tests/ahriman/core/distributed/conftest.py
rename to ahriman-triggers/tests/ahriman/core/distributed/conftest.py
diff --git a/tests/ahriman/core/distributed/test_distributed_system.py b/ahriman-triggers/tests/ahriman/core/distributed/test_distributed_system.py
similarity index 100%
rename from tests/ahriman/core/distributed/test_distributed_system.py
rename to ahriman-triggers/tests/ahriman/core/distributed/test_distributed_system.py
diff --git a/tests/ahriman/core/distributed/test_worker_loader_trigger.py b/ahriman-triggers/tests/ahriman/core/distributed/test_worker_loader_trigger.py
similarity index 100%
rename from tests/ahriman/core/distributed/test_worker_loader_trigger.py
rename to ahriman-triggers/tests/ahriman/core/distributed/test_worker_loader_trigger.py
diff --git a/tests/ahriman/core/distributed/test_worker_trigger.py b/ahriman-triggers/tests/ahriman/core/distributed/test_worker_trigger.py
similarity index 100%
rename from tests/ahriman/core/distributed/test_worker_trigger.py
rename to ahriman-triggers/tests/ahriman/core/distributed/test_worker_trigger.py
diff --git a/tests/ahriman/core/distributed/test_workers_cache.py b/ahriman-triggers/tests/ahriman/core/distributed/test_workers_cache.py
similarity index 100%
rename from tests/ahriman/core/distributed/test_workers_cache.py
rename to ahriman-triggers/tests/ahriman/core/distributed/test_workers_cache.py
diff --git a/tests/ahriman/core/support/conftest.py b/ahriman-triggers/tests/ahriman/core/support/conftest.py
similarity index 100%
rename from tests/ahriman/core/support/conftest.py
rename to ahriman-triggers/tests/ahriman/core/support/conftest.py
diff --git a/tests/ahriman/core/support/pkgbuild/conftest.py b/ahriman-triggers/tests/ahriman/core/support/pkgbuild/conftest.py
similarity index 100%
rename from tests/ahriman/core/support/pkgbuild/conftest.py
rename to ahriman-triggers/tests/ahriman/core/support/pkgbuild/conftest.py
diff --git a/tests/ahriman/core/support/pkgbuild/test_keyring_generator.py b/ahriman-triggers/tests/ahriman/core/support/pkgbuild/test_keyring_generator.py
similarity index 100%
rename from tests/ahriman/core/support/pkgbuild/test_keyring_generator.py
rename to ahriman-triggers/tests/ahriman/core/support/pkgbuild/test_keyring_generator.py
diff --git a/tests/ahriman/core/support/pkgbuild/test_mirrorlist_generator.py b/ahriman-triggers/tests/ahriman/core/support/pkgbuild/test_mirrorlist_generator.py
similarity index 100%
rename from tests/ahriman/core/support/pkgbuild/test_mirrorlist_generator.py
rename to ahriman-triggers/tests/ahriman/core/support/pkgbuild/test_mirrorlist_generator.py
diff --git a/tests/ahriman/core/support/pkgbuild/test_pkgbuild_generator.py b/ahriman-triggers/tests/ahriman/core/support/pkgbuild/test_pkgbuild_generator.py
similarity index 100%
rename from tests/ahriman/core/support/pkgbuild/test_pkgbuild_generator.py
rename to ahriman-triggers/tests/ahriman/core/support/pkgbuild/test_pkgbuild_generator.py
diff --git a/tests/ahriman/core/support/test_keyring_trigger.py b/ahriman-triggers/tests/ahriman/core/support/test_keyring_trigger.py
similarity index 100%
rename from tests/ahriman/core/support/test_keyring_trigger.py
rename to ahriman-triggers/tests/ahriman/core/support/test_keyring_trigger.py
diff --git a/tests/ahriman/core/support/test_mirrorlist_trigger.py b/ahriman-triggers/tests/ahriman/core/support/test_mirrorlist_trigger.py
similarity index 100%
rename from tests/ahriman/core/support/test_mirrorlist_trigger.py
rename to ahriman-triggers/tests/ahriman/core/support/test_mirrorlist_trigger.py
diff --git a/tests/ahriman/core/support/test_package_creator.py b/ahriman-triggers/tests/ahriman/core/support/test_package_creator.py
similarity index 100%
rename from tests/ahriman/core/support/test_package_creator.py
rename to ahriman-triggers/tests/ahriman/core/support/test_package_creator.py
diff --git a/package/lib/systemd/system/ahriman-web.service b/ahriman-web/package/lib/systemd/system/ahriman-web.service
similarity index 100%
rename from package/lib/systemd/system/ahriman-web.service
rename to ahriman-web/package/lib/systemd/system/ahriman-web.service
diff --git a/package/lib/systemd/system/ahriman-web@.service b/ahriman-web/package/lib/systemd/system/ahriman-web@.service
similarity index 100%
rename from package/lib/systemd/system/ahriman-web@.service
rename to ahriman-web/package/lib/systemd/system/ahriman-web@.service
diff --git a/package/share/ahriman/settings/ahriman.ini.d/00-web.ini b/ahriman-web/package/share/ahriman/settings/ahriman.ini.d/00-web.ini
similarity index 100%
rename from package/share/ahriman/settings/ahriman.ini.d/00-web.ini
rename to ahriman-web/package/share/ahriman/settings/ahriman.ini.d/00-web.ini
diff --git a/package/share/ahriman/templates/api.jinja2 b/ahriman-web/package/share/ahriman/templates/api.jinja2
similarity index 100%
rename from package/share/ahriman/templates/api.jinja2
rename to ahriman-web/package/share/ahriman/templates/api.jinja2
diff --git a/package/share/ahriman/templates/build-status-classic.jinja2 b/ahriman-web/package/share/ahriman/templates/build-status-classic.jinja2
similarity index 100%
rename from package/share/ahriman/templates/build-status-classic.jinja2
rename to ahriman-web/package/share/ahriman/templates/build-status-classic.jinja2
diff --git a/package/share/ahriman/templates/build-status.jinja2 b/ahriman-web/package/share/ahriman/templates/build-status.jinja2
similarity index 100%
rename from package/share/ahriman/templates/build-status.jinja2
rename to ahriman-web/package/share/ahriman/templates/build-status.jinja2
diff --git a/package/share/ahriman/templates/build-status/alerts.jinja2 b/ahriman-web/package/share/ahriman/templates/build-status/alerts.jinja2
similarity index 100%
rename from package/share/ahriman/templates/build-status/alerts.jinja2
rename to ahriman-web/package/share/ahriman/templates/build-status/alerts.jinja2
diff --git a/package/share/ahriman/templates/build-status/dashboard.jinja2 b/ahriman-web/package/share/ahriman/templates/build-status/dashboard.jinja2
similarity index 100%
rename from package/share/ahriman/templates/build-status/dashboard.jinja2
rename to ahriman-web/package/share/ahriman/templates/build-status/dashboard.jinja2
diff --git a/package/share/ahriman/templates/build-status/key-import-modal.jinja2 b/ahriman-web/package/share/ahriman/templates/build-status/key-import-modal.jinja2
similarity index 100%
rename from package/share/ahriman/templates/build-status/key-import-modal.jinja2
rename to ahriman-web/package/share/ahriman/templates/build-status/key-import-modal.jinja2
diff --git a/package/share/ahriman/templates/build-status/login-modal.jinja2 b/ahriman-web/package/share/ahriman/templates/build-status/login-modal.jinja2
similarity index 100%
rename from package/share/ahriman/templates/build-status/login-modal.jinja2
rename to ahriman-web/package/share/ahriman/templates/build-status/login-modal.jinja2
diff --git a/package/share/ahriman/templates/build-status/package-add-modal.jinja2 b/ahriman-web/package/share/ahriman/templates/build-status/package-add-modal.jinja2
similarity index 100%
rename from package/share/ahriman/templates/build-status/package-add-modal.jinja2
rename to ahriman-web/package/share/ahriman/templates/build-status/package-add-modal.jinja2
diff --git a/package/share/ahriman/templates/build-status/package-info-modal.jinja2 b/ahriman-web/package/share/ahriman/templates/build-status/package-info-modal.jinja2
similarity index 100%
rename from package/share/ahriman/templates/build-status/package-info-modal.jinja2
rename to ahriman-web/package/share/ahriman/templates/build-status/package-info-modal.jinja2
diff --git a/package/share/ahriman/templates/build-status/package-rebuild-modal.jinja2 b/ahriman-web/package/share/ahriman/templates/build-status/package-rebuild-modal.jinja2
similarity index 100%
rename from package/share/ahriman/templates/build-status/package-rebuild-modal.jinja2
rename to ahriman-web/package/share/ahriman/templates/build-status/package-rebuild-modal.jinja2
diff --git a/package/share/ahriman/templates/build-status/table.jinja2 b/ahriman-web/package/share/ahriman/templates/build-status/table.jinja2
similarity index 100%
rename from package/share/ahriman/templates/build-status/table.jinja2
rename to ahriman-web/package/share/ahriman/templates/build-status/table.jinja2
diff --git a/package/share/ahriman/templates/error.jinja2 b/ahriman-web/package/share/ahriman/templates/error.jinja2
similarity index 100%
rename from package/share/ahriman/templates/error.jinja2
rename to ahriman-web/package/share/ahriman/templates/error.jinja2
diff --git a/package/share/ahriman/templates/static/favicon.ico b/ahriman-web/package/share/ahriman/templates/static/favicon.ico
similarity index 100%
rename from package/share/ahriman/templates/static/favicon.ico
rename to ahriman-web/package/share/ahriman/templates/static/favicon.ico
diff --git a/package/share/ahriman/templates/static/logo.svg b/ahriman-web/package/share/ahriman/templates/static/logo.svg
similarity index 100%
rename from package/share/ahriman/templates/static/logo.svg
rename to ahriman-web/package/share/ahriman/templates/static/logo.svg
diff --git a/ahriman-web/pyproject.toml b/ahriman-web/pyproject.toml
new file mode 100644
index 00000000..6a251a67
--- /dev/null
+++ b/ahriman-web/pyproject.toml
@@ -0,0 +1,50 @@
+[build-system]
+requires = [
+ "hatchling",
+]
+build-backend = "hatchling.build"
+
+[project]
+name = "ahriman-web"
+dependencies = [
+ "ahriman-core",
+ "aiohttp",
+ "aiohttp_cors",
+ "aiohttp_jinja2",
+ "aiohttp_sse",
+]
+description = "ArcH linux ReposItory MANager, web server"
+dynamic = [
+ "version",
+]
+requires-python = ">=3.13"
+
+[project.optional-dependencies]
+auth = [
+ "aiohttp_session",
+ "aiohttp_security",
+ "cryptography",
+]
+docs = [
+ "aiohttp-apispec",
+ "setuptools", # required by aiohttp-apispec
+]
+metrics = [
+ "aiohttp-openmetrics",
+]
+oauth2 = [
+ "ahriman-web[auth]",
+ "aioauth-client",
+]
+
+[tool.hatch.build.targets.wheel]
+packages = [
+ "src/ahriman",
+]
+
+[tool.hatch.build.targets.wheel.shared-data]
+"package/lib" = "lib"
+"package/share" = "share"
+
+[tool.hatch.version]
+path = "../ahriman-core/src/ahriman/__init__.py"
diff --git a/src/ahriman/web/views/__init__.py b/ahriman-web/src/ahriman/application/handlers/web/__init__.py
similarity index 100%
rename from src/ahriman/web/views/__init__.py
rename to ahriman-web/src/ahriman/application/handlers/web/__init__.py
diff --git a/src/ahriman/application/handlers/web.py b/ahriman-web/src/ahriman/application/handlers/web/web.py
similarity index 100%
rename from src/ahriman/application/handlers/web.py
rename to ahriman-web/src/ahriman/application/handlers/web/web.py
diff --git a/src/ahriman/core/auth/__init__.py b/ahriman-web/src/ahriman/core/auth/__init__.py
similarity index 100%
rename from src/ahriman/core/auth/__init__.py
rename to ahriman-web/src/ahriman/core/auth/__init__.py
diff --git a/src/ahriman/core/auth/auth.py b/ahriman-web/src/ahriman/core/auth/auth.py
similarity index 100%
rename from src/ahriman/core/auth/auth.py
rename to ahriman-web/src/ahriman/core/auth/auth.py
diff --git a/src/ahriman/core/auth/helpers.py b/ahriman-web/src/ahriman/core/auth/helpers.py
similarity index 100%
rename from src/ahriman/core/auth/helpers.py
rename to ahriman-web/src/ahriman/core/auth/helpers.py
diff --git a/src/ahriman/core/auth/mapping.py b/ahriman-web/src/ahriman/core/auth/mapping.py
similarity index 100%
rename from src/ahriman/core/auth/mapping.py
rename to ahriman-web/src/ahriman/core/auth/mapping.py
diff --git a/src/ahriman/core/auth/oauth.py b/ahriman-web/src/ahriman/core/auth/oauth.py
similarity index 100%
rename from src/ahriman/core/auth/oauth.py
rename to ahriman-web/src/ahriman/core/auth/oauth.py
diff --git a/src/ahriman/core/auth/pam.py b/ahriman-web/src/ahriman/core/auth/pam.py
similarity index 100%
rename from src/ahriman/core/auth/pam.py
rename to ahriman-web/src/ahriman/core/auth/pam.py
diff --git a/src/ahriman/web/views/api/__init__.py b/ahriman-web/src/ahriman/web/__init__.py
similarity index 100%
rename from src/ahriman/web/views/api/__init__.py
rename to ahriman-web/src/ahriman/web/__init__.py
diff --git a/src/ahriman/web/apispec/__init__.py b/ahriman-web/src/ahriman/web/apispec/__init__.py
similarity index 100%
rename from src/ahriman/web/apispec/__init__.py
rename to ahriman-web/src/ahriman/web/apispec/__init__.py
diff --git a/src/ahriman/web/apispec/decorators.py b/ahriman-web/src/ahriman/web/apispec/decorators.py
similarity index 100%
rename from src/ahriman/web/apispec/decorators.py
rename to ahriman-web/src/ahriman/web/apispec/decorators.py
diff --git a/src/ahriman/web/apispec/info.py b/ahriman-web/src/ahriman/web/apispec/info.py
similarity index 100%
rename from src/ahriman/web/apispec/info.py
rename to ahriman-web/src/ahriman/web/apispec/info.py
diff --git a/src/ahriman/web/cors.py b/ahriman-web/src/ahriman/web/cors.py
similarity index 100%
rename from src/ahriman/web/cors.py
rename to ahriman-web/src/ahriman/web/cors.py
diff --git a/src/ahriman/web/keys.py b/ahriman-web/src/ahriman/web/keys.py
similarity index 100%
rename from src/ahriman/web/keys.py
rename to ahriman-web/src/ahriman/web/keys.py
diff --git a/src/ahriman/web/middlewares/__init__.py b/ahriman-web/src/ahriman/web/middlewares/__init__.py
similarity index 100%
rename from src/ahriman/web/middlewares/__init__.py
rename to ahriman-web/src/ahriman/web/middlewares/__init__.py
diff --git a/src/ahriman/web/middlewares/auth_handler.py b/ahriman-web/src/ahriman/web/middlewares/auth_handler.py
similarity index 100%
rename from src/ahriman/web/middlewares/auth_handler.py
rename to ahriman-web/src/ahriman/web/middlewares/auth_handler.py
diff --git a/src/ahriman/web/middlewares/etag_handler.py b/ahriman-web/src/ahriman/web/middlewares/etag_handler.py
similarity index 100%
rename from src/ahriman/web/middlewares/etag_handler.py
rename to ahriman-web/src/ahriman/web/middlewares/etag_handler.py
diff --git a/src/ahriman/web/middlewares/exception_handler.py b/ahriman-web/src/ahriman/web/middlewares/exception_handler.py
similarity index 100%
rename from src/ahriman/web/middlewares/exception_handler.py
rename to ahriman-web/src/ahriman/web/middlewares/exception_handler.py
diff --git a/src/ahriman/web/middlewares/metrics_handler.py b/ahriman-web/src/ahriman/web/middlewares/metrics_handler.py
similarity index 100%
rename from src/ahriman/web/middlewares/metrics_handler.py
rename to ahriman-web/src/ahriman/web/middlewares/metrics_handler.py
diff --git a/src/ahriman/web/middlewares/request_id_handler.py b/ahriman-web/src/ahriman/web/middlewares/request_id_handler.py
similarity index 100%
rename from src/ahriman/web/middlewares/request_id_handler.py
rename to ahriman-web/src/ahriman/web/middlewares/request_id_handler.py
diff --git a/src/ahriman/web/routes.py b/ahriman-web/src/ahriman/web/routes.py
similarity index 100%
rename from src/ahriman/web/routes.py
rename to ahriman-web/src/ahriman/web/routes.py
diff --git a/src/ahriman/web/schemas/__init__.py b/ahriman-web/src/ahriman/web/schemas/__init__.py
similarity index 100%
rename from src/ahriman/web/schemas/__init__.py
rename to ahriman-web/src/ahriman/web/schemas/__init__.py
diff --git a/src/ahriman/web/schemas/any_schema.py b/ahriman-web/src/ahriman/web/schemas/any_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/any_schema.py
rename to ahriman-web/src/ahriman/web/schemas/any_schema.py
diff --git a/src/ahriman/web/schemas/aur_package_schema.py b/ahriman-web/src/ahriman/web/schemas/aur_package_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/aur_package_schema.py
rename to ahriman-web/src/ahriman/web/schemas/aur_package_schema.py
diff --git a/src/ahriman/web/schemas/auth_info_schema.py b/ahriman-web/src/ahriman/web/schemas/auth_info_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/auth_info_schema.py
rename to ahriman-web/src/ahriman/web/schemas/auth_info_schema.py
diff --git a/src/ahriman/web/schemas/auth_schema.py b/ahriman-web/src/ahriman/web/schemas/auth_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/auth_schema.py
rename to ahriman-web/src/ahriman/web/schemas/auth_schema.py
diff --git a/src/ahriman/web/schemas/auto_refresh_interval_schema.py b/ahriman-web/src/ahriman/web/schemas/auto_refresh_interval_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/auto_refresh_interval_schema.py
rename to ahriman-web/src/ahriman/web/schemas/auto_refresh_interval_schema.py
diff --git a/src/ahriman/web/schemas/build_options_schema.py b/ahriman-web/src/ahriman/web/schemas/build_options_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/build_options_schema.py
rename to ahriman-web/src/ahriman/web/schemas/build_options_schema.py
diff --git a/src/ahriman/web/schemas/changes_schema.py b/ahriman-web/src/ahriman/web/schemas/changes_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/changes_schema.py
rename to ahriman-web/src/ahriman/web/schemas/changes_schema.py
diff --git a/src/ahriman/web/schemas/configuration_schema.py b/ahriman-web/src/ahriman/web/schemas/configuration_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/configuration_schema.py
rename to ahriman-web/src/ahriman/web/schemas/configuration_schema.py
diff --git a/src/ahriman/web/schemas/counters_schema.py b/ahriman-web/src/ahriman/web/schemas/counters_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/counters_schema.py
rename to ahriman-web/src/ahriman/web/schemas/counters_schema.py
diff --git a/src/ahriman/web/schemas/dependencies_schema.py b/ahriman-web/src/ahriman/web/schemas/dependencies_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/dependencies_schema.py
rename to ahriman-web/src/ahriman/web/schemas/dependencies_schema.py
diff --git a/src/ahriman/web/schemas/error_schema.py b/ahriman-web/src/ahriman/web/schemas/error_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/error_schema.py
rename to ahriman-web/src/ahriman/web/schemas/error_schema.py
diff --git a/src/ahriman/web/schemas/event_bus_filter_schema.py b/ahriman-web/src/ahriman/web/schemas/event_bus_filter_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/event_bus_filter_schema.py
rename to ahriman-web/src/ahriman/web/schemas/event_bus_filter_schema.py
diff --git a/src/ahriman/web/schemas/event_schema.py b/ahriman-web/src/ahriman/web/schemas/event_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/event_schema.py
rename to ahriman-web/src/ahriman/web/schemas/event_schema.py
diff --git a/src/ahriman/web/schemas/event_search_schema.py b/ahriman-web/src/ahriman/web/schemas/event_search_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/event_search_schema.py
rename to ahriman-web/src/ahriman/web/schemas/event_search_schema.py
diff --git a/src/ahriman/web/schemas/file_schema.py b/ahriman-web/src/ahriman/web/schemas/file_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/file_schema.py
rename to ahriman-web/src/ahriman/web/schemas/file_schema.py
diff --git a/src/ahriman/web/schemas/hold_schema.py b/ahriman-web/src/ahriman/web/schemas/hold_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/hold_schema.py
rename to ahriman-web/src/ahriman/web/schemas/hold_schema.py
diff --git a/src/ahriman/web/schemas/info_schema.py b/ahriman-web/src/ahriman/web/schemas/info_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/info_schema.py
rename to ahriman-web/src/ahriman/web/schemas/info_schema.py
diff --git a/src/ahriman/web/schemas/info_v2_schema.py b/ahriman-web/src/ahriman/web/schemas/info_v2_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/info_v2_schema.py
rename to ahriman-web/src/ahriman/web/schemas/info_v2_schema.py
diff --git a/src/ahriman/web/schemas/internal_status_schema.py b/ahriman-web/src/ahriman/web/schemas/internal_status_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/internal_status_schema.py
rename to ahriman-web/src/ahriman/web/schemas/internal_status_schema.py
diff --git a/src/ahriman/web/schemas/log_schema.py b/ahriman-web/src/ahriman/web/schemas/log_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/log_schema.py
rename to ahriman-web/src/ahriman/web/schemas/log_schema.py
diff --git a/src/ahriman/web/schemas/login_schema.py b/ahriman-web/src/ahriman/web/schemas/login_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/login_schema.py
rename to ahriman-web/src/ahriman/web/schemas/login_schema.py
diff --git a/src/ahriman/web/schemas/logs_rotate_schema.py b/ahriman-web/src/ahriman/web/schemas/logs_rotate_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/logs_rotate_schema.py
rename to ahriman-web/src/ahriman/web/schemas/logs_rotate_schema.py
diff --git a/src/ahriman/web/schemas/logs_schema.py b/ahriman-web/src/ahriman/web/schemas/logs_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/logs_schema.py
rename to ahriman-web/src/ahriman/web/schemas/logs_schema.py
diff --git a/src/ahriman/web/schemas/logs_search_schema.py b/ahriman-web/src/ahriman/web/schemas/logs_search_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/logs_search_schema.py
rename to ahriman-web/src/ahriman/web/schemas/logs_search_schema.py
diff --git a/src/ahriman/web/schemas/oauth2_schema.py b/ahriman-web/src/ahriman/web/schemas/oauth2_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/oauth2_schema.py
rename to ahriman-web/src/ahriman/web/schemas/oauth2_schema.py
diff --git a/src/ahriman/web/schemas/package_name_schema.py b/ahriman-web/src/ahriman/web/schemas/package_name_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/package_name_schema.py
rename to ahriman-web/src/ahriman/web/schemas/package_name_schema.py
diff --git a/src/ahriman/web/schemas/package_names_schema.py b/ahriman-web/src/ahriman/web/schemas/package_names_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/package_names_schema.py
rename to ahriman-web/src/ahriman/web/schemas/package_names_schema.py
diff --git a/src/ahriman/web/schemas/package_patch_schema.py b/ahriman-web/src/ahriman/web/schemas/package_patch_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/package_patch_schema.py
rename to ahriman-web/src/ahriman/web/schemas/package_patch_schema.py
diff --git a/src/ahriman/web/schemas/package_properties_schema.py b/ahriman-web/src/ahriman/web/schemas/package_properties_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/package_properties_schema.py
rename to ahriman-web/src/ahriman/web/schemas/package_properties_schema.py
diff --git a/src/ahriman/web/schemas/package_schema.py b/ahriman-web/src/ahriman/web/schemas/package_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/package_schema.py
rename to ahriman-web/src/ahriman/web/schemas/package_schema.py
diff --git a/src/ahriman/web/schemas/package_status_schema.py b/ahriman-web/src/ahriman/web/schemas/package_status_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/package_status_schema.py
rename to ahriman-web/src/ahriman/web/schemas/package_status_schema.py
diff --git a/src/ahriman/web/schemas/package_version_schema.py b/ahriman-web/src/ahriman/web/schemas/package_version_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/package_version_schema.py
rename to ahriman-web/src/ahriman/web/schemas/package_version_schema.py
diff --git a/src/ahriman/web/schemas/packager_schema.py b/ahriman-web/src/ahriman/web/schemas/packager_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/packager_schema.py
rename to ahriman-web/src/ahriman/web/schemas/packager_schema.py
diff --git a/src/ahriman/web/schemas/pagination_schema.py b/ahriman-web/src/ahriman/web/schemas/pagination_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/pagination_schema.py
rename to ahriman-web/src/ahriman/web/schemas/pagination_schema.py
diff --git a/src/ahriman/web/schemas/patch_name_schema.py b/ahriman-web/src/ahriman/web/schemas/patch_name_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/patch_name_schema.py
rename to ahriman-web/src/ahriman/web/schemas/patch_name_schema.py
diff --git a/src/ahriman/web/schemas/patch_schema.py b/ahriman-web/src/ahriman/web/schemas/patch_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/patch_schema.py
rename to ahriman-web/src/ahriman/web/schemas/patch_schema.py
diff --git a/src/ahriman/web/schemas/pgp_key_id_schema.py b/ahriman-web/src/ahriman/web/schemas/pgp_key_id_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/pgp_key_id_schema.py
rename to ahriman-web/src/ahriman/web/schemas/pgp_key_id_schema.py
diff --git a/src/ahriman/web/schemas/pgp_key_schema.py b/ahriman-web/src/ahriman/web/schemas/pgp_key_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/pgp_key_schema.py
rename to ahriman-web/src/ahriman/web/schemas/pgp_key_schema.py
diff --git a/src/ahriman/web/schemas/process_id_schema.py b/ahriman-web/src/ahriman/web/schemas/process_id_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/process_id_schema.py
rename to ahriman-web/src/ahriman/web/schemas/process_id_schema.py
diff --git a/src/ahriman/web/schemas/process_schema.py b/ahriman-web/src/ahriman/web/schemas/process_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/process_schema.py
rename to ahriman-web/src/ahriman/web/schemas/process_schema.py
diff --git a/src/ahriman/web/schemas/remote_schema.py b/ahriman-web/src/ahriman/web/schemas/remote_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/remote_schema.py
rename to ahriman-web/src/ahriman/web/schemas/remote_schema.py
diff --git a/src/ahriman/web/schemas/repository_id_schema.py b/ahriman-web/src/ahriman/web/schemas/repository_id_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/repository_id_schema.py
rename to ahriman-web/src/ahriman/web/schemas/repository_id_schema.py
diff --git a/src/ahriman/web/schemas/repository_stats_schema.py b/ahriman-web/src/ahriman/web/schemas/repository_stats_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/repository_stats_schema.py
rename to ahriman-web/src/ahriman/web/schemas/repository_stats_schema.py
diff --git a/src/ahriman/web/schemas/rollback_schema.py b/ahriman-web/src/ahriman/web/schemas/rollback_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/rollback_schema.py
rename to ahriman-web/src/ahriman/web/schemas/rollback_schema.py
diff --git a/src/ahriman/web/schemas/search_schema.py b/ahriman-web/src/ahriman/web/schemas/search_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/search_schema.py
rename to ahriman-web/src/ahriman/web/schemas/search_schema.py
diff --git a/src/ahriman/web/schemas/sse_schema.py b/ahriman-web/src/ahriman/web/schemas/sse_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/sse_schema.py
rename to ahriman-web/src/ahriman/web/schemas/sse_schema.py
diff --git a/src/ahriman/web/schemas/status_schema.py b/ahriman-web/src/ahriman/web/schemas/status_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/status_schema.py
rename to ahriman-web/src/ahriman/web/schemas/status_schema.py
diff --git a/src/ahriman/web/schemas/update_flags_schema.py b/ahriman-web/src/ahriman/web/schemas/update_flags_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/update_flags_schema.py
rename to ahriman-web/src/ahriman/web/schemas/update_flags_schema.py
diff --git a/src/ahriman/web/schemas/worker_schema.py b/ahriman-web/src/ahriman/web/schemas/worker_schema.py
similarity index 100%
rename from src/ahriman/web/schemas/worker_schema.py
rename to ahriman-web/src/ahriman/web/schemas/worker_schema.py
diff --git a/src/ahriman/web/server_info.py b/ahriman-web/src/ahriman/web/server_info.py
similarity index 100%
rename from src/ahriman/web/server_info.py
rename to ahriman-web/src/ahriman/web/server_info.py
diff --git a/src/ahriman/web/views/v1/__init__.py b/ahriman-web/src/ahriman/web/views/__init__.py
similarity index 100%
rename from src/ahriman/web/views/v1/__init__.py
rename to ahriman-web/src/ahriman/web/views/__init__.py
diff --git a/src/ahriman/web/views/v1/auditlog/__init__.py b/ahriman-web/src/ahriman/web/views/api/__init__.py
similarity index 100%
rename from src/ahriman/web/views/v1/auditlog/__init__.py
rename to ahriman-web/src/ahriman/web/views/api/__init__.py
diff --git a/src/ahriman/web/views/api/docs.py b/ahriman-web/src/ahriman/web/views/api/docs.py
similarity index 100%
rename from src/ahriman/web/views/api/docs.py
rename to ahriman-web/src/ahriman/web/views/api/docs.py
diff --git a/src/ahriman/web/views/api/swagger.py b/ahriman-web/src/ahriman/web/views/api/swagger.py
similarity index 100%
rename from src/ahriman/web/views/api/swagger.py
rename to ahriman-web/src/ahriman/web/views/api/swagger.py
diff --git a/src/ahriman/web/views/base.py b/ahriman-web/src/ahriman/web/views/base.py
similarity index 100%
rename from src/ahriman/web/views/base.py
rename to ahriman-web/src/ahriman/web/views/base.py
diff --git a/src/ahriman/web/views/index.py b/ahriman-web/src/ahriman/web/views/index.py
similarity index 100%
rename from src/ahriman/web/views/index.py
rename to ahriman-web/src/ahriman/web/views/index.py
diff --git a/src/ahriman/web/views/static.py b/ahriman-web/src/ahriman/web/views/static.py
similarity index 100%
rename from src/ahriman/web/views/static.py
rename to ahriman-web/src/ahriman/web/views/static.py
diff --git a/src/ahriman/web/views/status_view_guard.py b/ahriman-web/src/ahriman/web/views/status_view_guard.py
similarity index 100%
rename from src/ahriman/web/views/status_view_guard.py
rename to ahriman-web/src/ahriman/web/views/status_view_guard.py
diff --git a/src/ahriman/web/views/v1/distributed/__init__.py b/ahriman-web/src/ahriman/web/views/v1/__init__.py
similarity index 100%
rename from src/ahriman/web/views/v1/distributed/__init__.py
rename to ahriman-web/src/ahriman/web/views/v1/__init__.py
diff --git a/src/ahriman/web/views/v1/packages/__init__.py b/ahriman-web/src/ahriman/web/views/v1/auditlog/__init__.py
similarity index 100%
rename from src/ahriman/web/views/v1/packages/__init__.py
rename to ahriman-web/src/ahriman/web/views/v1/auditlog/__init__.py
diff --git a/src/ahriman/web/views/v1/auditlog/event_bus.py b/ahriman-web/src/ahriman/web/views/v1/auditlog/event_bus.py
similarity index 100%
rename from src/ahriman/web/views/v1/auditlog/event_bus.py
rename to ahriman-web/src/ahriman/web/views/v1/auditlog/event_bus.py
diff --git a/src/ahriman/web/views/v1/auditlog/events.py b/ahriman-web/src/ahriman/web/views/v1/auditlog/events.py
similarity index 100%
rename from src/ahriman/web/views/v1/auditlog/events.py
rename to ahriman-web/src/ahriman/web/views/v1/auditlog/events.py
diff --git a/src/ahriman/web/views/v1/service/__init__.py b/ahriman-web/src/ahriman/web/views/v1/distributed/__init__.py
similarity index 100%
rename from src/ahriman/web/views/v1/service/__init__.py
rename to ahriman-web/src/ahriman/web/views/v1/distributed/__init__.py
diff --git a/src/ahriman/web/views/v1/distributed/workers.py b/ahriman-web/src/ahriman/web/views/v1/distributed/workers.py
similarity index 100%
rename from src/ahriman/web/views/v1/distributed/workers.py
rename to ahriman-web/src/ahriman/web/views/v1/distributed/workers.py
diff --git a/src/ahriman/web/views/v1/status/__init__.py b/ahriman-web/src/ahriman/web/views/v1/packages/__init__.py
similarity index 100%
rename from src/ahriman/web/views/v1/status/__init__.py
rename to ahriman-web/src/ahriman/web/views/v1/packages/__init__.py
diff --git a/src/ahriman/web/views/v1/packages/archives.py b/ahriman-web/src/ahriman/web/views/v1/packages/archives.py
similarity index 100%
rename from src/ahriman/web/views/v1/packages/archives.py
rename to ahriman-web/src/ahriman/web/views/v1/packages/archives.py
diff --git a/src/ahriman/web/views/v1/packages/changes.py b/ahriman-web/src/ahriman/web/views/v1/packages/changes.py
similarity index 100%
rename from src/ahriman/web/views/v1/packages/changes.py
rename to ahriman-web/src/ahriman/web/views/v1/packages/changes.py
diff --git a/src/ahriman/web/views/v1/packages/dependencies.py b/ahriman-web/src/ahriman/web/views/v1/packages/dependencies.py
similarity index 100%
rename from src/ahriman/web/views/v1/packages/dependencies.py
rename to ahriman-web/src/ahriman/web/views/v1/packages/dependencies.py
diff --git a/src/ahriman/web/views/v1/packages/hold.py b/ahriman-web/src/ahriman/web/views/v1/packages/hold.py
similarity index 100%
rename from src/ahriman/web/views/v1/packages/hold.py
rename to ahriman-web/src/ahriman/web/views/v1/packages/hold.py
diff --git a/src/ahriman/web/views/v1/packages/logs.py b/ahriman-web/src/ahriman/web/views/v1/packages/logs.py
similarity index 100%
rename from src/ahriman/web/views/v1/packages/logs.py
rename to ahriman-web/src/ahriman/web/views/v1/packages/logs.py
diff --git a/src/ahriman/web/views/v1/packages/package.py b/ahriman-web/src/ahriman/web/views/v1/packages/package.py
similarity index 100%
rename from src/ahriman/web/views/v1/packages/package.py
rename to ahriman-web/src/ahriman/web/views/v1/packages/package.py
diff --git a/src/ahriman/web/views/v1/packages/packages.py b/ahriman-web/src/ahriman/web/views/v1/packages/packages.py
similarity index 100%
rename from src/ahriman/web/views/v1/packages/packages.py
rename to ahriman-web/src/ahriman/web/views/v1/packages/packages.py
diff --git a/src/ahriman/web/views/v1/packages/patch.py b/ahriman-web/src/ahriman/web/views/v1/packages/patch.py
similarity index 100%
rename from src/ahriman/web/views/v1/packages/patch.py
rename to ahriman-web/src/ahriman/web/views/v1/packages/patch.py
diff --git a/src/ahriman/web/views/v1/packages/patches.py b/ahriman-web/src/ahriman/web/views/v1/packages/patches.py
similarity index 100%
rename from src/ahriman/web/views/v1/packages/patches.py
rename to ahriman-web/src/ahriman/web/views/v1/packages/patches.py
diff --git a/src/ahriman/web/views/v1/user/__init__.py b/ahriman-web/src/ahriman/web/views/v1/service/__init__.py
similarity index 100%
rename from src/ahriman/web/views/v1/user/__init__.py
rename to ahriman-web/src/ahriman/web/views/v1/service/__init__.py
diff --git a/src/ahriman/web/views/v1/service/add.py b/ahriman-web/src/ahriman/web/views/v1/service/add.py
similarity index 100%
rename from src/ahriman/web/views/v1/service/add.py
rename to ahriman-web/src/ahriman/web/views/v1/service/add.py
diff --git a/src/ahriman/web/views/v1/service/config.py b/ahriman-web/src/ahriman/web/views/v1/service/config.py
similarity index 100%
rename from src/ahriman/web/views/v1/service/config.py
rename to ahriman-web/src/ahriman/web/views/v1/service/config.py
diff --git a/src/ahriman/web/views/v1/service/logs.py b/ahriman-web/src/ahriman/web/views/v1/service/logs.py
similarity index 100%
rename from src/ahriman/web/views/v1/service/logs.py
rename to ahriman-web/src/ahriman/web/views/v1/service/logs.py
diff --git a/src/ahriman/web/views/v1/service/pgp.py b/ahriman-web/src/ahriman/web/views/v1/service/pgp.py
similarity index 100%
rename from src/ahriman/web/views/v1/service/pgp.py
rename to ahriman-web/src/ahriman/web/views/v1/service/pgp.py
diff --git a/src/ahriman/web/views/v1/service/process.py b/ahriman-web/src/ahriman/web/views/v1/service/process.py
similarity index 100%
rename from src/ahriman/web/views/v1/service/process.py
rename to ahriman-web/src/ahriman/web/views/v1/service/process.py
diff --git a/src/ahriman/web/views/v1/service/rebuild.py b/ahriman-web/src/ahriman/web/views/v1/service/rebuild.py
similarity index 100%
rename from src/ahriman/web/views/v1/service/rebuild.py
rename to ahriman-web/src/ahriman/web/views/v1/service/rebuild.py
diff --git a/src/ahriman/web/views/v1/service/remove.py b/ahriman-web/src/ahriman/web/views/v1/service/remove.py
similarity index 100%
rename from src/ahriman/web/views/v1/service/remove.py
rename to ahriman-web/src/ahriman/web/views/v1/service/remove.py
diff --git a/src/ahriman/web/views/v1/service/request.py b/ahriman-web/src/ahriman/web/views/v1/service/request.py
similarity index 100%
rename from src/ahriman/web/views/v1/service/request.py
rename to ahriman-web/src/ahriman/web/views/v1/service/request.py
diff --git a/src/ahriman/web/views/v1/service/rollback.py b/ahriman-web/src/ahriman/web/views/v1/service/rollback.py
similarity index 100%
rename from src/ahriman/web/views/v1/service/rollback.py
rename to ahriman-web/src/ahriman/web/views/v1/service/rollback.py
diff --git a/src/ahriman/web/views/v1/service/search.py b/ahriman-web/src/ahriman/web/views/v1/service/search.py
similarity index 100%
rename from src/ahriman/web/views/v1/service/search.py
rename to ahriman-web/src/ahriman/web/views/v1/service/search.py
diff --git a/src/ahriman/web/views/v1/service/update.py b/ahriman-web/src/ahriman/web/views/v1/service/update.py
similarity index 100%
rename from src/ahriman/web/views/v1/service/update.py
rename to ahriman-web/src/ahriman/web/views/v1/service/update.py
diff --git a/src/ahriman/web/views/v1/service/upload.py b/ahriman-web/src/ahriman/web/views/v1/service/upload.py
similarity index 100%
rename from src/ahriman/web/views/v1/service/upload.py
rename to ahriman-web/src/ahriman/web/views/v1/service/upload.py
diff --git a/src/ahriman/web/views/v2/__init__.py b/ahriman-web/src/ahriman/web/views/v1/status/__init__.py
similarity index 100%
rename from src/ahriman/web/views/v2/__init__.py
rename to ahriman-web/src/ahriman/web/views/v1/status/__init__.py
diff --git a/src/ahriman/web/views/v1/status/info.py b/ahriman-web/src/ahriman/web/views/v1/status/info.py
similarity index 100%
rename from src/ahriman/web/views/v1/status/info.py
rename to ahriman-web/src/ahriman/web/views/v1/status/info.py
diff --git a/src/ahriman/web/views/v1/status/metrics.py b/ahriman-web/src/ahriman/web/views/v1/status/metrics.py
similarity index 100%
rename from src/ahriman/web/views/v1/status/metrics.py
rename to ahriman-web/src/ahriman/web/views/v1/status/metrics.py
diff --git a/src/ahriman/web/views/v1/status/repositories.py b/ahriman-web/src/ahriman/web/views/v1/status/repositories.py
similarity index 100%
rename from src/ahriman/web/views/v1/status/repositories.py
rename to ahriman-web/src/ahriman/web/views/v1/status/repositories.py
diff --git a/src/ahriman/web/views/v1/status/status.py b/ahriman-web/src/ahriman/web/views/v1/status/status.py
similarity index 100%
rename from src/ahriman/web/views/v1/status/status.py
rename to ahriman-web/src/ahriman/web/views/v1/status/status.py
diff --git a/src/ahriman/web/views/v2/packages/__init__.py b/ahriman-web/src/ahriman/web/views/v1/user/__init__.py
similarity index 100%
rename from src/ahriman/web/views/v2/packages/__init__.py
rename to ahriman-web/src/ahriman/web/views/v1/user/__init__.py
diff --git a/src/ahriman/web/views/v1/user/login.py b/ahriman-web/src/ahriman/web/views/v1/user/login.py
similarity index 100%
rename from src/ahriman/web/views/v1/user/login.py
rename to ahriman-web/src/ahriman/web/views/v1/user/login.py
diff --git a/src/ahriman/web/views/v1/user/logout.py b/ahriman-web/src/ahriman/web/views/v1/user/logout.py
similarity index 100%
rename from src/ahriman/web/views/v1/user/logout.py
rename to ahriman-web/src/ahriman/web/views/v1/user/logout.py
diff --git a/src/ahriman/web/views/v2/status/__init__.py b/ahriman-web/src/ahriman/web/views/v2/__init__.py
similarity index 100%
rename from src/ahriman/web/views/v2/status/__init__.py
rename to ahriman-web/src/ahriman/web/views/v2/__init__.py
diff --git a/ahriman-web/src/ahriman/web/views/v2/packages/__init__.py b/ahriman-web/src/ahriman/web/views/v2/packages/__init__.py
new file mode 100644
index 00000000..cddc28d6
--- /dev/null
+++ b/ahriman-web/src/ahriman/web/views/v2/packages/__init__.py
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2021-2026 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 .
+#
diff --git a/src/ahriman/web/views/v2/packages/logs.py b/ahriman-web/src/ahriman/web/views/v2/packages/logs.py
similarity index 100%
rename from src/ahriman/web/views/v2/packages/logs.py
rename to ahriman-web/src/ahriman/web/views/v2/packages/logs.py
diff --git a/ahriman-web/src/ahriman/web/views/v2/status/__init__.py b/ahriman-web/src/ahriman/web/views/v2/status/__init__.py
new file mode 100644
index 00000000..cddc28d6
--- /dev/null
+++ b/ahriman-web/src/ahriman/web/views/v2/status/__init__.py
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2021-2026 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 .
+#
diff --git a/src/ahriman/web/views/v2/status/info.py b/ahriman-web/src/ahriman/web/views/v2/status/info.py
similarity index 100%
rename from src/ahriman/web/views/v2/status/info.py
rename to ahriman-web/src/ahriman/web/views/v2/status/info.py
diff --git a/src/ahriman/web/web.py b/ahriman-web/src/ahriman/web/web.py
similarity index 100%
rename from src/ahriman/web/web.py
rename to ahriman-web/src/ahriman/web/web.py
diff --git a/tests/ahriman/application/handlers/test_handler_web.py b/ahriman-web/tests/ahriman/application/handlers/web/test_handler_web.py
similarity index 96%
rename from tests/ahriman/application/handlers/test_handler_web.py
rename to ahriman-web/tests/ahriman/application/handlers/web/test_handler_web.py
index a16a1f15..19b0fc79 100644
--- a/tests/ahriman/application/handlers/test_handler_web.py
+++ b/ahriman-web/tests/ahriman/application/handlers/web/test_handler_web.py
@@ -3,7 +3,7 @@ import pytest
from pytest_mock import MockerFixture
-from ahriman.application.handlers.web import Web
+from ahriman.application.handlers.web.web import Web
from ahriman.core.configuration import Configuration
from ahriman.core.repository import Repository
from ahriman.models.log_handler import LogHandler
@@ -36,8 +36,8 @@ def test_run(args: argparse.Namespace, configuration: Configuration, repository:
"""
args = _default_args(args)
mocker.patch("ahriman.core.repository.Repository.load", return_value=repository)
- setup_mock = mocker.patch("ahriman.application.handlers.web.setup_server")
- run_mock = mocker.patch("ahriman.application.handlers.web.run_server")
+ setup_mock = mocker.patch("ahriman.application.handlers.web.web.setup_server")
+ run_mock = mocker.patch("ahriman.application.handlers.web.web.run_server")
start_mock = mocker.patch("ahriman.core.spawn.Spawn.start")
trigger_mock = mocker.patch("ahriman.core.triggers.TriggerLoader.load")
stop_mock = mocker.patch("ahriman.core.spawn.Spawn.stop")
diff --git a/ahriman-web/tests/ahriman/conftest.py b/ahriman-web/tests/ahriman/conftest.py
new file mode 100644
index 00000000..3bed9720
--- /dev/null
+++ b/ahriman-web/tests/ahriman/conftest.py
@@ -0,0 +1,18 @@
+import pytest
+
+from ahriman.core.auth import Auth
+from ahriman.core.configuration import Configuration
+
+
+@pytest.fixture
+def auth(configuration: Configuration) -> Auth:
+ """
+ auth provider fixture
+
+ Args:
+ configuration(Configuration): configuration fixture
+
+ Returns:
+ Auth: auth service instance
+ """
+ return Auth(configuration)
diff --git a/tests/ahriman/core/auth/conftest.py b/ahriman-web/tests/ahriman/core/auth/conftest.py
similarity index 100%
rename from tests/ahriman/core/auth/conftest.py
rename to ahriman-web/tests/ahriman/core/auth/conftest.py
diff --git a/tests/ahriman/core/auth/test_auth.py b/ahriman-web/tests/ahriman/core/auth/test_auth.py
similarity index 100%
rename from tests/ahriman/core/auth/test_auth.py
rename to ahriman-web/tests/ahriman/core/auth/test_auth.py
diff --git a/tests/ahriman/core/auth/test_helpers.py b/ahriman-web/tests/ahriman/core/auth/test_helpers.py
similarity index 100%
rename from tests/ahriman/core/auth/test_helpers.py
rename to ahriman-web/tests/ahriman/core/auth/test_helpers.py
diff --git a/tests/ahriman/core/auth/test_mapping.py b/ahriman-web/tests/ahriman/core/auth/test_mapping.py
similarity index 100%
rename from tests/ahriman/core/auth/test_mapping.py
rename to ahriman-web/tests/ahriman/core/auth/test_mapping.py
diff --git a/tests/ahriman/core/auth/test_oauth.py b/ahriman-web/tests/ahriman/core/auth/test_oauth.py
similarity index 100%
rename from tests/ahriman/core/auth/test_oauth.py
rename to ahriman-web/tests/ahriman/core/auth/test_oauth.py
diff --git a/tests/ahriman/core/auth/test_pam.py b/ahriman-web/tests/ahriman/core/auth/test_pam.py
similarity index 100%
rename from tests/ahriman/core/auth/test_pam.py
rename to ahriman-web/tests/ahriman/core/auth/test_pam.py
diff --git a/tests/ahriman/web/apispec/test_apispec.py b/ahriman-web/tests/ahriman/web/apispec/test_apispec.py
similarity index 100%
rename from tests/ahriman/web/apispec/test_apispec.py
rename to ahriman-web/tests/ahriman/web/apispec/test_apispec.py
diff --git a/tests/ahriman/web/apispec/test_decorators.py b/ahriman-web/tests/ahriman/web/apispec/test_decorators.py
similarity index 100%
rename from tests/ahriman/web/apispec/test_decorators.py
rename to ahriman-web/tests/ahriman/web/apispec/test_decorators.py
diff --git a/tests/ahriman/web/apispec/test_info.py b/ahriman-web/tests/ahriman/web/apispec/test_info.py
similarity index 100%
rename from tests/ahriman/web/apispec/test_info.py
rename to ahriman-web/tests/ahriman/web/apispec/test_info.py
diff --git a/tests/ahriman/web/conftest.py b/ahriman-web/tests/ahriman/web/conftest.py
similarity index 100%
rename from tests/ahriman/web/conftest.py
rename to ahriman-web/tests/ahriman/web/conftest.py
diff --git a/tests/ahriman/web/middlewares/conftest.py b/ahriman-web/tests/ahriman/web/middlewares/conftest.py
similarity index 100%
rename from tests/ahriman/web/middlewares/conftest.py
rename to ahriman-web/tests/ahriman/web/middlewares/conftest.py
diff --git a/tests/ahriman/web/middlewares/test_auth_handler.py b/ahriman-web/tests/ahriman/web/middlewares/test_auth_handler.py
similarity index 100%
rename from tests/ahriman/web/middlewares/test_auth_handler.py
rename to ahriman-web/tests/ahriman/web/middlewares/test_auth_handler.py
diff --git a/tests/ahriman/web/middlewares/test_etag_handler.py b/ahriman-web/tests/ahriman/web/middlewares/test_etag_handler.py
similarity index 100%
rename from tests/ahriman/web/middlewares/test_etag_handler.py
rename to ahriman-web/tests/ahriman/web/middlewares/test_etag_handler.py
diff --git a/tests/ahriman/web/middlewares/test_exception_handler.py b/ahriman-web/tests/ahriman/web/middlewares/test_exception_handler.py
similarity index 100%
rename from tests/ahriman/web/middlewares/test_exception_handler.py
rename to ahriman-web/tests/ahriman/web/middlewares/test_exception_handler.py
diff --git a/tests/ahriman/web/middlewares/test_metrics_handler.py b/ahriman-web/tests/ahriman/web/middlewares/test_metrics_handler.py
similarity index 100%
rename from tests/ahriman/web/middlewares/test_metrics_handler.py
rename to ahriman-web/tests/ahriman/web/middlewares/test_metrics_handler.py
diff --git a/tests/ahriman/web/middlewares/test_request_id_handler.py b/ahriman-web/tests/ahriman/web/middlewares/test_request_id_handler.py
similarity index 100%
rename from tests/ahriman/web/middlewares/test_request_id_handler.py
rename to ahriman-web/tests/ahriman/web/middlewares/test_request_id_handler.py
diff --git a/tests/ahriman/web/schemas/test_any_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_any_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_any_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_any_schema.py
diff --git a/tests/ahriman/web/schemas/test_aur_package_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_aur_package_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_aur_package_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_aur_package_schema.py
diff --git a/tests/ahriman/web/schemas/test_auth_info_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_auth_info_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_auth_info_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_auth_info_schema.py
diff --git a/tests/ahriman/web/schemas/test_auth_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_auth_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_auth_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_auth_schema.py
diff --git a/tests/ahriman/web/schemas/test_auto_refresh_interval_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_auto_refresh_interval_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_auto_refresh_interval_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_auto_refresh_interval_schema.py
diff --git a/tests/ahriman/web/schemas/test_build_options_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_build_options_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_build_options_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_build_options_schema.py
diff --git a/tests/ahriman/web/schemas/test_changes_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_changes_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_changes_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_changes_schema.py
diff --git a/tests/ahriman/web/schemas/test_configuration_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_configuration_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_configuration_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_configuration_schema.py
diff --git a/tests/ahriman/web/schemas/test_counters_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_counters_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_counters_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_counters_schema.py
diff --git a/tests/ahriman/web/schemas/test_dependencies_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_dependencies_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_dependencies_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_dependencies_schema.py
diff --git a/tests/ahriman/web/schemas/test_error_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_error_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_error_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_error_schema.py
diff --git a/tests/ahriman/web/schemas/test_event_bus_filter_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_event_bus_filter_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_event_bus_filter_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_event_bus_filter_schema.py
diff --git a/tests/ahriman/web/schemas/test_event_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_event_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_event_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_event_schema.py
diff --git a/tests/ahriman/web/schemas/test_event_search_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_event_search_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_event_search_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_event_search_schema.py
diff --git a/tests/ahriman/web/schemas/test_file_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_file_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_file_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_file_schema.py
diff --git a/tests/ahriman/web/schemas/test_hold_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_hold_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_hold_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_hold_schema.py
diff --git a/tests/ahriman/web/schemas/test_info_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_info_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_info_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_info_schema.py
diff --git a/tests/ahriman/web/schemas/test_info_v2_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_info_v2_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_info_v2_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_info_v2_schema.py
diff --git a/tests/ahriman/web/schemas/test_internal_status_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_internal_status_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_internal_status_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_internal_status_schema.py
diff --git a/tests/ahriman/web/schemas/test_log_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_log_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_log_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_log_schema.py
diff --git a/tests/ahriman/web/schemas/test_login_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_login_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_login_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_login_schema.py
diff --git a/tests/ahriman/web/schemas/test_logs_rotate_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_logs_rotate_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_logs_rotate_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_logs_rotate_schema.py
diff --git a/tests/ahriman/web/schemas/test_logs_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_logs_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_logs_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_logs_schema.py
diff --git a/tests/ahriman/web/schemas/test_logs_search_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_logs_search_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_logs_search_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_logs_search_schema.py
diff --git a/tests/ahriman/web/schemas/test_oauth2_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_oauth2_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_oauth2_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_oauth2_schema.py
diff --git a/tests/ahriman/web/schemas/test_package_name_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_package_name_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_package_name_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_package_name_schema.py
diff --git a/tests/ahriman/web/schemas/test_package_names_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_package_names_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_package_names_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_package_names_schema.py
diff --git a/tests/ahriman/web/schemas/test_package_patch_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_package_patch_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_package_patch_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_package_patch_schema.py
diff --git a/tests/ahriman/web/schemas/test_package_properties_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_package_properties_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_package_properties_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_package_properties_schema.py
diff --git a/tests/ahriman/web/schemas/test_package_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_package_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_package_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_package_schema.py
diff --git a/tests/ahriman/web/schemas/test_package_status_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_package_status_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_package_status_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_package_status_schema.py
diff --git a/tests/ahriman/web/schemas/test_package_version_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_package_version_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_package_version_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_package_version_schema.py
diff --git a/tests/ahriman/web/schemas/test_packager_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_packager_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_packager_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_packager_schema.py
diff --git a/tests/ahriman/web/schemas/test_pagination_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_pagination_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_pagination_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_pagination_schema.py
diff --git a/tests/ahriman/web/schemas/test_patch_name_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_patch_name_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_patch_name_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_patch_name_schema.py
diff --git a/tests/ahriman/web/schemas/test_patch_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_patch_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_patch_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_patch_schema.py
diff --git a/tests/ahriman/web/schemas/test_pgp_key_id_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_pgp_key_id_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_pgp_key_id_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_pgp_key_id_schema.py
diff --git a/tests/ahriman/web/schemas/test_pgp_key_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_pgp_key_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_pgp_key_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_pgp_key_schema.py
diff --git a/tests/ahriman/web/schemas/test_process_id_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_process_id_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_process_id_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_process_id_schema.py
diff --git a/tests/ahriman/web/schemas/test_process_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_process_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_process_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_process_schema.py
diff --git a/tests/ahriman/web/schemas/test_remote_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_remote_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_remote_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_remote_schema.py
diff --git a/tests/ahriman/web/schemas/test_repository_id_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_repository_id_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_repository_id_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_repository_id_schema.py
diff --git a/tests/ahriman/web/schemas/test_repository_stats_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_repository_stats_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_repository_stats_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_repository_stats_schema.py
diff --git a/tests/ahriman/web/schemas/test_rollback_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_rollback_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_rollback_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_rollback_schema.py
diff --git a/tests/ahriman/web/schemas/test_search_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_search_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_search_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_search_schema.py
diff --git a/tests/ahriman/web/schemas/test_sse_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_sse_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_sse_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_sse_schema.py
diff --git a/tests/ahriman/web/schemas/test_status_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_status_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_status_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_status_schema.py
diff --git a/tests/ahriman/web/schemas/test_update_flags_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_update_flags_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_update_flags_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_update_flags_schema.py
diff --git a/tests/ahriman/web/schemas/test_worker_schema.py b/ahriman-web/tests/ahriman/web/schemas/test_worker_schema.py
similarity index 100%
rename from tests/ahriman/web/schemas/test_worker_schema.py
rename to ahriman-web/tests/ahriman/web/schemas/test_worker_schema.py
diff --git a/tests/ahriman/web/test_cors.py b/ahriman-web/tests/ahriman/web/test_cors.py
similarity index 100%
rename from tests/ahriman/web/test_cors.py
rename to ahriman-web/tests/ahriman/web/test_cors.py
diff --git a/tests/ahriman/web/test_keys.py b/ahriman-web/tests/ahriman/web/test_keys.py
similarity index 100%
rename from tests/ahriman/web/test_keys.py
rename to ahriman-web/tests/ahriman/web/test_keys.py
diff --git a/tests/ahriman/web/test_routes.py b/ahriman-web/tests/ahriman/web/test_routes.py
similarity index 92%
rename from tests/ahriman/web/test_routes.py
rename to ahriman-web/tests/ahriman/web/test_routes.py
index 4a07a569..1b945927 100644
--- a/tests/ahriman/web/test_routes.py
+++ b/ahriman-web/tests/ahriman/web/test_routes.py
@@ -10,7 +10,7 @@ def test_dynamic_routes(resource_path_root: Path, configuration: Configuration)
"""
must return all available routes
"""
- views_root = resource_path_root / ".." / ".." / "src" / "ahriman" / "web" / "views"
+ views_root = resource_path_root.parent.parent / "ahriman-web" / "src" / "ahriman" / "web" / "views"
expected_views = [
file
for file in walk(views_root)
diff --git a/tests/ahriman/web/test_server_info.py b/ahriman-web/tests/ahriman/web/test_server_info.py
similarity index 100%
rename from tests/ahriman/web/test_server_info.py
rename to ahriman-web/tests/ahriman/web/test_server_info.py
diff --git a/tests/ahriman/web/test_web.py b/ahriman-web/tests/ahriman/web/test_web.py
similarity index 100%
rename from tests/ahriman/web/test_web.py
rename to ahriman-web/tests/ahriman/web/test_web.py
diff --git a/tests/ahriman/web/views/api/test_view_api_docs.py b/ahriman-web/tests/ahriman/web/views/api/test_view_api_docs.py
similarity index 100%
rename from tests/ahriman/web/views/api/test_view_api_docs.py
rename to ahriman-web/tests/ahriman/web/views/api/test_view_api_docs.py
diff --git a/tests/ahriman/web/views/api/test_view_api_swagger.py b/ahriman-web/tests/ahriman/web/views/api/test_view_api_swagger.py
similarity index 100%
rename from tests/ahriman/web/views/api/test_view_api_swagger.py
rename to ahriman-web/tests/ahriman/web/views/api/test_view_api_swagger.py
diff --git a/tests/ahriman/web/views/conftest.py b/ahriman-web/tests/ahriman/web/views/conftest.py
similarity index 100%
rename from tests/ahriman/web/views/conftest.py
rename to ahriman-web/tests/ahriman/web/views/conftest.py
diff --git a/tests/ahriman/web/views/test_status_view_guard.py b/ahriman-web/tests/ahriman/web/views/test_status_view_guard.py
similarity index 100%
rename from tests/ahriman/web/views/test_status_view_guard.py
rename to ahriman-web/tests/ahriman/web/views/test_status_view_guard.py
diff --git a/tests/ahriman/web/views/test_view_base.py b/ahriman-web/tests/ahriman/web/views/test_view_base.py
similarity index 100%
rename from tests/ahriman/web/views/test_view_base.py
rename to ahriman-web/tests/ahriman/web/views/test_view_base.py
diff --git a/tests/ahriman/web/views/test_view_index.py b/ahriman-web/tests/ahriman/web/views/test_view_index.py
similarity index 100%
rename from tests/ahriman/web/views/test_view_index.py
rename to ahriman-web/tests/ahriman/web/views/test_view_index.py
diff --git a/tests/ahriman/web/views/test_view_static.py b/ahriman-web/tests/ahriman/web/views/test_view_static.py
similarity index 100%
rename from tests/ahriman/web/views/test_view_static.py
rename to ahriman-web/tests/ahriman/web/views/test_view_static.py
diff --git a/tests/ahriman/web/views/v1/auditlog/test_view_v1_auditlog_event_bus.py b/ahriman-web/tests/ahriman/web/views/v1/auditlog/test_view_v1_auditlog_event_bus.py
similarity index 100%
rename from tests/ahriman/web/views/v1/auditlog/test_view_v1_auditlog_event_bus.py
rename to ahriman-web/tests/ahriman/web/views/v1/auditlog/test_view_v1_auditlog_event_bus.py
diff --git a/tests/ahriman/web/views/v1/auditlog/test_view_v1_auditlog_events.py b/ahriman-web/tests/ahriman/web/views/v1/auditlog/test_view_v1_auditlog_events.py
similarity index 100%
rename from tests/ahriman/web/views/v1/auditlog/test_view_v1_auditlog_events.py
rename to ahriman-web/tests/ahriman/web/views/v1/auditlog/test_view_v1_auditlog_events.py
diff --git a/tests/ahriman/web/views/v1/distributed/test_view_v1_distributed_workers.py b/ahriman-web/tests/ahriman/web/views/v1/distributed/test_view_v1_distributed_workers.py
similarity index 100%
rename from tests/ahriman/web/views/v1/distributed/test_view_v1_distributed_workers.py
rename to ahriman-web/tests/ahriman/web/views/v1/distributed/test_view_v1_distributed_workers.py
diff --git a/tests/ahriman/web/views/v1/packages/test_view_v1_packages_archives.py b/ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_archives.py
similarity index 100%
rename from tests/ahriman/web/views/v1/packages/test_view_v1_packages_archives.py
rename to ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_archives.py
diff --git a/tests/ahriman/web/views/v1/packages/test_view_v1_packages_changes.py b/ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_changes.py
similarity index 100%
rename from tests/ahriman/web/views/v1/packages/test_view_v1_packages_changes.py
rename to ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_changes.py
diff --git a/tests/ahriman/web/views/v1/packages/test_view_v1_packages_dependencies.py b/ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_dependencies.py
similarity index 100%
rename from tests/ahriman/web/views/v1/packages/test_view_v1_packages_dependencies.py
rename to ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_dependencies.py
diff --git a/tests/ahriman/web/views/v1/packages/test_view_v1_packages_hold.py b/ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_hold.py
similarity index 100%
rename from tests/ahriman/web/views/v1/packages/test_view_v1_packages_hold.py
rename to ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_hold.py
diff --git a/tests/ahriman/web/views/v1/packages/test_view_v1_packages_logs.py b/ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_logs.py
similarity index 100%
rename from tests/ahriman/web/views/v1/packages/test_view_v1_packages_logs.py
rename to ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_logs.py
diff --git a/tests/ahriman/web/views/v1/packages/test_view_v1_packages_package.py b/ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_package.py
similarity index 100%
rename from tests/ahriman/web/views/v1/packages/test_view_v1_packages_package.py
rename to ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_package.py
diff --git a/tests/ahriman/web/views/v1/packages/test_view_v1_packages_packages.py b/ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_packages.py
similarity index 100%
rename from tests/ahriman/web/views/v1/packages/test_view_v1_packages_packages.py
rename to ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_packages.py
diff --git a/tests/ahriman/web/views/v1/packages/test_view_v1_packages_patch.py b/ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_patch.py
similarity index 100%
rename from tests/ahriman/web/views/v1/packages/test_view_v1_packages_patch.py
rename to ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_patch.py
diff --git a/tests/ahriman/web/views/v1/packages/test_view_v1_packages_patches.py b/ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_patches.py
similarity index 100%
rename from tests/ahriman/web/views/v1/packages/test_view_v1_packages_patches.py
rename to ahriman-web/tests/ahriman/web/views/v1/packages/test_view_v1_packages_patches.py
diff --git a/tests/ahriman/web/views/v1/service/test_view_v1_service_add.py b/ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_add.py
similarity index 100%
rename from tests/ahriman/web/views/v1/service/test_view_v1_service_add.py
rename to ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_add.py
diff --git a/tests/ahriman/web/views/v1/service/test_view_v1_service_config.py b/ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_config.py
similarity index 100%
rename from tests/ahriman/web/views/v1/service/test_view_v1_service_config.py
rename to ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_config.py
diff --git a/tests/ahriman/web/views/v1/service/test_view_v1_service_logs.py b/ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_logs.py
similarity index 100%
rename from tests/ahriman/web/views/v1/service/test_view_v1_service_logs.py
rename to ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_logs.py
diff --git a/tests/ahriman/web/views/v1/service/test_view_v1_service_pgp.py b/ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_pgp.py
similarity index 100%
rename from tests/ahriman/web/views/v1/service/test_view_v1_service_pgp.py
rename to ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_pgp.py
diff --git a/tests/ahriman/web/views/v1/service/test_view_v1_service_process.py b/ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_process.py
similarity index 100%
rename from tests/ahriman/web/views/v1/service/test_view_v1_service_process.py
rename to ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_process.py
diff --git a/tests/ahriman/web/views/v1/service/test_view_v1_service_rebuild.py b/ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_rebuild.py
similarity index 100%
rename from tests/ahriman/web/views/v1/service/test_view_v1_service_rebuild.py
rename to ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_rebuild.py
diff --git a/tests/ahriman/web/views/v1/service/test_view_v1_service_remove.py b/ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_remove.py
similarity index 100%
rename from tests/ahriman/web/views/v1/service/test_view_v1_service_remove.py
rename to ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_remove.py
diff --git a/tests/ahriman/web/views/v1/service/test_view_v1_service_request.py b/ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_request.py
similarity index 100%
rename from tests/ahriman/web/views/v1/service/test_view_v1_service_request.py
rename to ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_request.py
diff --git a/tests/ahriman/web/views/v1/service/test_view_v1_service_rollback.py b/ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_rollback.py
similarity index 100%
rename from tests/ahriman/web/views/v1/service/test_view_v1_service_rollback.py
rename to ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_rollback.py
diff --git a/tests/ahriman/web/views/v1/service/test_view_v1_service_search.py b/ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_search.py
similarity index 100%
rename from tests/ahriman/web/views/v1/service/test_view_v1_service_search.py
rename to ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_search.py
diff --git a/tests/ahriman/web/views/v1/service/test_view_v1_service_update.py b/ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_update.py
similarity index 100%
rename from tests/ahriman/web/views/v1/service/test_view_v1_service_update.py
rename to ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_update.py
diff --git a/tests/ahriman/web/views/v1/service/test_view_v1_service_upload.py b/ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_upload.py
similarity index 100%
rename from tests/ahriman/web/views/v1/service/test_view_v1_service_upload.py
rename to ahriman-web/tests/ahriman/web/views/v1/service/test_view_v1_service_upload.py
diff --git a/tests/ahriman/web/views/v1/status/test_view_v1_status_info.py b/ahriman-web/tests/ahriman/web/views/v1/status/test_view_v1_status_info.py
similarity index 100%
rename from tests/ahriman/web/views/v1/status/test_view_v1_status_info.py
rename to ahriman-web/tests/ahriman/web/views/v1/status/test_view_v1_status_info.py
diff --git a/tests/ahriman/web/views/v1/status/test_view_v1_status_metrics.py b/ahriman-web/tests/ahriman/web/views/v1/status/test_view_v1_status_metrics.py
similarity index 100%
rename from tests/ahriman/web/views/v1/status/test_view_v1_status_metrics.py
rename to ahriman-web/tests/ahriman/web/views/v1/status/test_view_v1_status_metrics.py
diff --git a/tests/ahriman/web/views/v1/status/test_view_v1_status_repositories.py b/ahriman-web/tests/ahriman/web/views/v1/status/test_view_v1_status_repositories.py
similarity index 100%
rename from tests/ahriman/web/views/v1/status/test_view_v1_status_repositories.py
rename to ahriman-web/tests/ahriman/web/views/v1/status/test_view_v1_status_repositories.py
diff --git a/tests/ahriman/web/views/v1/status/test_view_v1_status_status.py b/ahriman-web/tests/ahriman/web/views/v1/status/test_view_v1_status_status.py
similarity index 100%
rename from tests/ahriman/web/views/v1/status/test_view_v1_status_status.py
rename to ahriman-web/tests/ahriman/web/views/v1/status/test_view_v1_status_status.py
diff --git a/tests/ahriman/web/views/v1/user/test_view_v1_user_login.py b/ahriman-web/tests/ahriman/web/views/v1/user/test_view_v1_user_login.py
similarity index 100%
rename from tests/ahriman/web/views/v1/user/test_view_v1_user_login.py
rename to ahriman-web/tests/ahriman/web/views/v1/user/test_view_v1_user_login.py
diff --git a/tests/ahriman/web/views/v1/user/test_view_v1_user_logout.py b/ahriman-web/tests/ahriman/web/views/v1/user/test_view_v1_user_logout.py
similarity index 100%
rename from tests/ahriman/web/views/v1/user/test_view_v1_user_logout.py
rename to ahriman-web/tests/ahriman/web/views/v1/user/test_view_v1_user_logout.py
diff --git a/tests/ahriman/web/views/v2/packages/test_view_v2_packages_logs.py b/ahriman-web/tests/ahriman/web/views/v2/packages/test_view_v2_packages_logs.py
similarity index 100%
rename from tests/ahriman/web/views/v2/packages/test_view_v2_packages_logs.py
rename to ahriman-web/tests/ahriman/web/views/v2/packages/test_view_v2_packages_logs.py
diff --git a/tests/ahriman/web/views/v2/status/test_view_v2_status_info.py b/ahriman-web/tests/ahriman/web/views/v2/status/test_view_v2_status_info.py
similarity index 100%
rename from tests/ahriman/web/views/v2/status/test_view_v2_status_info.py
rename to ahriman-web/tests/ahriman/web/views/v2/status/test_view_v2_status_info.py
diff --git a/package/archlinux/PKGBUILD b/archlinux/PKGBUILD
similarity index 86%
rename from package/archlinux/PKGBUILD
rename to archlinux/PKGBUILD
index 322ec56e..e02656f2 100644
--- a/package/archlinux/PKGBUILD
+++ b/archlinux/PKGBUILD
@@ -9,7 +9,7 @@ arch=('any')
url="https://ahriman.readthedocs.io/"
license=('GPL-3.0-or-later')
depends=('devtools>=1:1.0.0' 'git' 'pyalpm' 'python-bcrypt' 'python-filelock' 'python-inflection' 'python-pyelftools' 'python-requests')
-makedepends=('npm' 'python-build' 'python-flit' 'python-installer' 'python-wheel')
+makedepends=('npm' 'python-build' 'python-hatchling' 'python-installer' 'python-wheel')
source=("https://github.com/arcan1s/ahriman/releases/download/$pkgver/$pkgbase-$pkgver.tar.gz"
"$pkgbase.sysusers"
"$pkgbase.tmpfiles")
@@ -20,7 +20,9 @@ build() {
npm --prefix "frontend" install --cache "$srcdir/npm-cache"
npm --prefix "frontend" run build
- python -m build --wheel --no-isolation
+ python -m build --wheel --no-isolation "ahriman-core"
+ python -m build --wheel --no-isolation "ahriman-triggers"
+ python -m build --wheel --no-isolation "ahriman-web"
}
package_ahriman() {
@@ -48,8 +50,7 @@ package_ahriman-core() {
cd "$pkgbase-$pkgver"
- python -m installer --destdir="$pkgdir" "dist/$pkgbase-$pkgver-py3-none-any.whl"
- python subpackages.py "$pkgdir" "$pkgname"
+ python -m installer --destdir="$pkgdir" "$pkgname/dist/ahriman_core-$pkgver-py3-none-any.whl"
# keep usr/share configs as reference and copy them to /etc
install -Dm644 "$pkgdir/usr/share/$pkgbase/settings/ahriman.ini" "$pkgdir/etc/ahriman.ini"
@@ -68,8 +69,7 @@ package_ahriman-triggers() {
cd "$pkgbase-$pkgver"
- python -m installer --destdir="$pkgdir" "dist/$pkgbase-$pkgver-py3-none-any.whl"
- python subpackages.py "$pkgdir" "$pkgname"
+ python -m installer --destdir="$pkgdir" "$pkgname/dist/ahriman_triggers-$pkgver-py3-none-any.whl"
install -Dm644 "$pkgdir/usr/share/$pkgbase/settings/ahriman.ini.d/00-triggers.ini" "$pkgdir/etc/ahriman.ini.d/00-triggers.ini"
}
@@ -88,8 +88,7 @@ package_ahriman-web() {
cd "$pkgbase-$pkgver"
- python -m installer --destdir="$pkgdir" "dist/$pkgbase-$pkgver-py3-none-any.whl"
- python subpackages.py "$pkgdir" "$pkgname"
+ python -m installer --destdir="$pkgdir" "$pkgname/dist/ahriman_web-$pkgver-py3-none-any.whl"
install -Dm644 "$pkgdir/usr/share/$pkgbase/settings/ahriman.ini.d/00-web.ini" "$pkgdir/etc/ahriman.ini.d/00-web.ini"
}
diff --git a/package/archlinux/ahriman.install b/archlinux/ahriman.install
similarity index 100%
rename from package/archlinux/ahriman.install
rename to archlinux/ahriman.install
diff --git a/package/archlinux/ahriman.sysusers b/archlinux/ahriman.sysusers
similarity index 100%
rename from package/archlinux/ahriman.sysusers
rename to archlinux/ahriman.sysusers
diff --git a/package/archlinux/ahriman.tmpfiles b/archlinux/ahriman.tmpfiles
similarity index 100%
rename from package/archlinux/ahriman.tmpfiles
rename to archlinux/ahriman.tmpfiles
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 0bac9e1a..fd34a43d 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -35,7 +35,7 @@ RUN pacman -S --noconfirm --asdeps \
RUN pacman -S --noconfirm --asdeps \
base-devel \
python-build \
- python-flit \
+ python-hatchling \
python-installer \
python-setuptools \
python-tox \
@@ -68,8 +68,8 @@ COPY --chown=build . "/home/build/ahriman"
## create package archive and install it
RUN cd "/home/build/ahriman" && \
tox -e archive && \
- cp ./dist/*.tar.gz "package/archlinux" && \
- cd "package/archlinux" && \
+ cp ./dist/*.tar.gz "archlinux" && \
+ cd "archlinux" && \
runuser -u build -- makepkg --noconfirm --skipchecksums && \
cd / && rm -r "/home/build/ahriman"
diff --git a/docs/ahriman.application.handlers.rst b/docs/ahriman.application.handlers.rst
index a45f0fb9..e4fea4e3 100644
--- a/docs/ahriman.application.handlers.rst
+++ b/docs/ahriman.application.handlers.rst
@@ -1,6 +1,15 @@
ahriman.application.handlers package
====================================
+Subpackages
+-----------
+
+.. toctree::
+ :maxdepth: 4
+
+ ahriman.application.handlers.triggers_support
+ ahriman.application.handlers.web
+
Submodules
----------
@@ -268,14 +277,6 @@ ahriman.application.handlers.triggers module
:no-undoc-members:
:show-inheritance:
-ahriman.application.handlers.triggers\_support module
------------------------------------------------------
-
-.. automodule:: ahriman.application.handlers.triggers_support
- :members:
- :no-undoc-members:
- :show-inheritance:
-
ahriman.application.handlers.unsafe\_commands module
----------------------------------------------------
@@ -316,14 +317,6 @@ ahriman.application.handlers.versions module
:no-undoc-members:
:show-inheritance:
-ahriman.application.handlers.web module
----------------------------------------
-
-.. automodule:: ahriman.application.handlers.web
- :members:
- :no-undoc-members:
- :show-inheritance:
-
Module contents
---------------
diff --git a/docs/ahriman.application.handlers.triggers_support.rst b/docs/ahriman.application.handlers.triggers_support.rst
new file mode 100644
index 00000000..78a0a795
--- /dev/null
+++ b/docs/ahriman.application.handlers.triggers_support.rst
@@ -0,0 +1,21 @@
+ahriman.application.handlers.triggers\_support package
+======================================================
+
+Submodules
+----------
+
+ahriman.application.handlers.triggers\_support.triggers\_support module
+-----------------------------------------------------------------------
+
+.. automodule:: ahriman.application.handlers.triggers_support.triggers_support
+ :members:
+ :no-undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: ahriman.application.handlers.triggers_support
+ :members:
+ :no-undoc-members:
+ :show-inheritance:
diff --git a/docs/ahriman.application.handlers.web.rst b/docs/ahriman.application.handlers.web.rst
new file mode 100644
index 00000000..d4d39e19
--- /dev/null
+++ b/docs/ahriman.application.handlers.web.rst
@@ -0,0 +1,21 @@
+ahriman.application.handlers.web package
+========================================
+
+Submodules
+----------
+
+ahriman.application.handlers.web.web module
+-------------------------------------------
+
+.. automodule:: ahriman.application.handlers.web.web
+ :members:
+ :no-undoc-members:
+ :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: ahriman.application.handlers.web
+ :members:
+ :no-undoc-members:
+ :show-inheritance:
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 0dc651b3..b29eda63 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,19 +1,19 @@
# This file was autogenerated by uv via the following command:
-# uv pip compile --group pyproject.toml:docs --extra s3 --extra validator --extra web --output-file docs/requirements.txt pyproject.toml
+# uv pip compile --group pyproject.toml:docs --no-emit-package ahriman-core --no-emit-package ahriman-triggers --no-emit-package ahriman-web --output-file docs/requirements.txt pyproject.toml
aiohappyeyeballs==2.6.1
# via aiohttp
aiohttp==3.11.18
# via
- # ahriman (pyproject.toml)
+ # ahriman-web
# aiohttp-cors
# aiohttp-jinja2
# aiohttp-sse
aiohttp-cors==0.8.1
- # via ahriman (pyproject.toml)
+ # via ahriman-web
aiohttp-jinja2==1.6
- # via ahriman (pyproject.toml)
+ # via ahriman-web
aiohttp-sse==2.2.0
- # via ahriman (pyproject.toml)
+ # via ahriman-web
aiosignal==1.3.2
# via aiohttp
alabaster==1.0.0
@@ -25,15 +25,15 @@ attrs==25.3.0
babel==2.17.0
# via sphinx
bcrypt==4.3.0
- # via ahriman (pyproject.toml)
-boto3==1.38.11
- # via ahriman (pyproject.toml)
-botocore==1.38.11
+ # via ahriman-core
+boto3==1.43.47
+ # via ahriman-core
+botocore==1.43.47
# via
# boto3
# s3transfer
-cerberus==1.3.7
- # via ahriman (pyproject.toml)
+cerberus==1.3.8
+ # via ahriman-core
certifi==2025.4.26
# via requests
charset-normalizer==3.4.2
@@ -44,7 +44,7 @@ docutils==0.21.2
# sphinx-argparse
# sphinx-rtd-theme
filelock==3.24.0
- # via ahriman (pyproject.toml)
+ # via ahriman-core
frozenlist==1.6.0
# via
# aiohttp
@@ -56,12 +56,12 @@ idna==3.10
imagesize==1.4.1
# via sphinx
inflection==0.5.1
- # via ahriman (pyproject.toml)
+ # via ahriman-core
jinja2==3.1.6
# via
# aiohttp-jinja2
# sphinx
-jmespath==1.0.1
+jmespath==1.1.0
# via
# boto3
# botocore
@@ -80,18 +80,18 @@ propcache==0.3.1
pydeps==3.0.1
# via ahriman (pyproject.toml:docs)
pyelftools==0.32
- # via ahriman (pyproject.toml)
+ # via ahriman-core
pygments==2.19.1
# via sphinx
python-dateutil==2.9.0.post0
# via botocore
requests==2.32.3
# via
- # ahriman (pyproject.toml)
+ # ahriman-core
# sphinx
roman-numerals-py==3.1.0
# via sphinx
-s3transfer==0.12.0
+s3transfer==0.19.1
# via boto3
shtab==1.7.2
# via ahriman (pyproject.toml:docs)
@@ -131,3 +131,8 @@ urllib3==2.4.0
# requests
yarl==1.20.0
# via aiohttp
+
+# The following packages were excluded from the output:
+# ahriman-core
+# ahriman-triggers
+# ahriman-web
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts
index 949e6db4..d13d6b97 100644
--- a/frontend/vite.config.ts
+++ b/frontend/vite.config.ts
@@ -19,7 +19,7 @@ export default defineConfig({
build: {
chunkSizeWarningLimit: 10000,
emptyOutDir: false,
- outDir: path.resolve(__dirname, "../package/share/ahriman/templates"),
+ outDir: path.resolve(__dirname, "../ahriman-web/package/share/ahriman/templates"),
rolldownOptions: {
output: {
assetFileNames: "static/[name].[ext]",
diff --git a/pyproject.toml b/pyproject.toml
index 607a56be..1b9e2110 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,91 +1,31 @@
[build-system]
-requires = ["flit_core"]
-build-backend = "flit_core.buildapi"
+requires = [
+ "hatchling",
+]
+build-backend = "hatchling.build"
[project]
name = "ahriman"
-
+authors = [
+ { name = "ahriman team" },
+]
+dependencies = [
+ "ahriman-core",
+ "ahriman-triggers",
+ "ahriman-web",
+]
description = "ArcH linux ReposItory MANager"
+dynamic = [
+ "version",
+]
+license = { file = "COPYING" }
readme = "README.md"
-
requires-python = ">=3.13"
-license = {file = "COPYING"}
-authors = [
- {name = "ahriman team"},
-]
-
-dependencies = [
- "bcrypt",
- "filelock",
- "inflection",
- "pyelftools",
- "requests",
-]
-
-dynamic = ["version"]
-
-[project.optional-dependencies]
-journald = [
- "systemd-python",
-]
-# 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",
-]
-reports = [
- "Jinja2",
-]
-s3 = [
- "boto3",
-]
-shell = [
- "IPython"
-]
-stats = [
- "matplotlib",
-]
-unixsocket = [
- "requests-unixsocket2", # required by unix socket support
-]
-validator = [
- "cerberus",
-]
-web = [
- "aiohttp",
- "aiohttp_cors",
- "aiohttp_jinja2",
- "aiohttp_sse",
-]
-web-auth = [
- "ahriman[web]",
- "aiohttp_session",
- "aiohttp_security",
- "cryptography",
-]
-web-docs = [
- "ahriman[web]",
- "aiohttp-apispec",
- "setuptools", # required by aiohttp-apispec
-]
-web-metrics = [
- "ahriman[web]",
- "aiohttp-openmetrics",
-]
-web-oauth2 = [
- "ahriman[web-auth]",
- "aioauth-client",
-]
-
-[project.scripts]
-ahriman = "ahriman.application.ahriman:run"
-
[project.urls]
+Changelog = "https://github.com/arcan1s/ahriman/releases"
Documentation = "https://ahriman.readthedocs.io/"
Repository = "https://github.com/arcan1s/ahriman"
-Changelog = "https://github.com/arcan1s/ahriman/releases"
[dependency-groups]
check = [
@@ -95,38 +35,66 @@ check = [
"pylint",
]
docs = [
- "Sphinx",
- "argparse-manpage",
- "pydeps",
- "shtab",
- "sphinx-argparse",
- "sphinx-rtd-theme>=1.1.1", # https://stackoverflow.com/a/74355734
+ "ahriman-core[s3,validator]",
+ "Sphinx",
+ "argparse-manpage",
+ "pydeps",
+ "shtab",
+ "sphinx-argparse",
+ "sphinx-rtd-theme>=1.1.1", # https://stackoverflow.com/a/74355734
]
tests = [
+ "coverage",
"pytest",
"pytest-aiohttp",
- "pytest-cov",
"pytest-helpers-namespace",
"pytest-mock",
"pytest-resource-path",
"pytest-spec",
]
-[tool.flit.sdist]
-include = [
- "AUTHORS",
- "CONTRIBUTING.md",
- "SECURITY.md",
- "package",
- "frontend",
- "subpackages.py",
- "web.png",
-]
+[tool.hatch.build.targets.sdist]
exclude = [
- "package/archlinux",
- "frontend/node_modules",
- "frontend/package-lock.json",
+ "/.github",
+ "/archlinux",
+ "/docker",
+ "/docs",
+ "/recipes",
+ "/tools",
+ "tests",
+ "/.bandit.toml",
+ "/.dockerignore",
+ "/.pylint.toml",
+ "/.pytest.toml",
+ "/.readthedocs.yml",
+ "/conftest.py",
+ "/github-logo.png",
+ "/tox.toml",
+ "/toxfile.py",
+ "/web.png",
]
-[tool.flit.external-data]
-directory = "package"
+[tool.hatch.build.targets.wheel]
+bypass-selection = true
+
+[tool.hatch.envs.default]
+workspace.members = [
+ { path = "ahriman-core" },
+ { path = "ahriman-triggers" },
+ { path = "ahriman-web" },
+]
+
+[tool.hatch.version]
+path = "ahriman-core/src/ahriman/__init__.py"
+
+[tool.uv.sources]
+ahriman-core = { workspace = true }
+ahriman-triggers = { workspace = true }
+ahriman-web = { workspace = true }
+
+[tool.uv.workspace]
+members = [
+ "ahriman-core",
+ "ahriman-triggers",
+ "ahriman-web",
+]
diff --git a/subpackages.py b/subpackages.py
deleted file mode 100644
index 2001d000..00000000
--- a/subpackages.py
+++ /dev/null
@@ -1,136 +0,0 @@
-#
-# Copyright (c) 2021-2025 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 .
-#
-import argparse
-import shutil
-import site
-import sys
-
-from pathlib import Path
-
-
-prefix = Path(sys.prefix).relative_to("/")
-site_packages = Path(site.getsitepackages()[0]).relative_to("/")
-SUBPACKAGES = {
- "ahriman-core": [
- prefix / "bin",
- prefix / "lib" / "systemd",
- prefix / "share",
- site_packages,
- ],
- "ahriman-triggers": [
- prefix / "share" / "ahriman" / "settings" / "ahriman.ini.d" / "00-triggers.ini",
- site_packages / "ahriman" / "application" / "handlers" / "triggers_support.py",
- site_packages / "ahriman" / "core" / "archive",
- site_packages / "ahriman" / "core" / "distributed",
- site_packages / "ahriman" / "core" / "support",
- ],
- "ahriman-web": [
- prefix / "lib" / "systemd" / "system" / "ahriman-web.service",
- prefix / "lib" / "systemd" / "system" / "ahriman-web@.service",
- prefix / "share" / "ahriman" / "settings" / "ahriman.ini.d" / "00-web.ini",
- prefix / "share" / "ahriman" / "templates" / "api.jinja2",
- prefix / "share" / "ahriman" / "templates" / "build-status",
- prefix / "share" / "ahriman" / "templates" / "build-status-classic.jinja2",
- prefix / "share" / "ahriman" / "templates" / "build-status.jinja2",
- prefix / "share" / "ahriman" / "templates" / "error.jinja2",
- prefix / "share" / "ahriman" / "templates" / "static",
- site_packages / "ahriman" / "application" / "handlers" / "web.py",
- site_packages / "ahriman" / "core" / "auth",
- site_packages / "ahriman" / "web",
- ],
-}
-
-
-def subpackages(root: Path) -> dict[str, list[Path]]:
- """
- extend list of subpackages
-
- Args:
- root(Path): root directory
-
- Returns:
- dict[str, list[Path]]: extended list of files which belong to a specific package
- """
- for paths in SUBPACKAGES.values():
- new_paths = []
- for path in paths:
- full_path = root / path
-
- match path.suffix:
- case ".py":
- pycache_path = full_path.parent / "__pycache__"
- new_paths.extend(
- new_path.relative_to(root) for new_path in pycache_path.glob(f"{full_path.stem}.*.pyc")
- )
-
- paths.extend(new_paths)
-
- return SUBPACKAGES
-
-
-def process(root: Path, include: list[Path], exclude: list[Path]) -> None:
- """
- remove files based on patterns
-
- Args:
- root(Path): root directory
- include(list[Path]): list of files to include to the subpackage
- exclude(list[Path]): list of files to exclude from the subpackage
- """
- for subdirectory, _, files in root.walk(top_down=False):
- for file in files:
- full_path = subdirectory / file
- relative_path = full_path.relative_to(root)
-
- if not any(relative_path.is_relative_to(path) for path in include):
- full_path.unlink()
- elif any(relative_path.is_relative_to(path) for path in exclude):
- full_path.unlink()
-
- content = list(subdirectory.iterdir())
- if not content:
- shutil.rmtree(subdirectory)
-
-
-def run() -> None:
- """
- run application
- """
- parser = argparse.ArgumentParser(description="Split package into subpackages")
- parser.add_argument("root", help="package root", type=Path)
- parser.add_argument("subpackage", help="subpackage name", choices=SUBPACKAGES.keys())
-
- args = parser.parse_args()
-
- full_subpackages = subpackages(args.root)
- include = full_subpackages[args.subpackage]
- exclude = [
- path
- for subpackage, portion in full_subpackages.items()
- if subpackage != args.subpackage
- for path in portion
- if not any(include_path.is_relative_to(path) for include_path in include)
- ]
-
- process(args.root, include, exclude)
-
-
-if __name__ == "__main__":
- run()
diff --git a/tests/ahriman/test_tests.py b/tests/ahriman/test_tests.py
deleted file mode 100644
index b48d28fc..00000000
--- a/tests/ahriman/test_tests.py
+++ /dev/null
@@ -1,29 +0,0 @@
-from pathlib import Path
-
-from ahriman.core.utils import walk
-
-
-def test_test_coverage() -> None:
- """
- must have test files for each source file
- """
- root = Path()
- for source_file in filter(lambda fn: fn.suffix == ".py" and fn.name != "__init__.py", walk(root / "src")):
- # some workaround for well known files
- if source_file.parts[2:4] == ("application", "handlers") and source_file.name != "handler.py":
- filename = f"test_handler_{source_file.name}"
- elif source_file.parts[2:4] == ("web", "views"):
- if (api := source_file.parts[4]) == "api":
- filename = f"test_view_{api}_{source_file.name}"
- elif (version := source_file.parts[4]) in ("v1", "v2"):
- api = source_file.parts[5]
- filename = f"test_view_{version}_{api}_{source_file.name}"
- elif source_file.name.endswith("_guard.py"):
- filename = f"test_{source_file.name}"
- else:
- filename = f"test_view_{source_file.name}"
- else:
- filename = f"test_{source_file.name}"
-
- test_file = Path("tests", *source_file.parts[1:-1], filename)
- assert test_file.is_file(), test_file
diff --git a/tests/test_tests.py b/tests/test_tests.py
new file mode 100644
index 00000000..9703b648
--- /dev/null
+++ b/tests/test_tests.py
@@ -0,0 +1,51 @@
+from pathlib import Path
+
+from ahriman.core.utils import walk
+
+
+def _test_path(source_root: Path, source_file: Path) -> Path:
+ """
+ generate expected test path for source file
+
+ Args:
+ source_root(Path): package source root
+ source_file(Path): source file
+
+ Returns:
+ Path: expected test file path
+ """
+ relative_path = source_file.relative_to(source_root)
+
+ match relative_path.parts:
+ # some workaround for well known files
+ case ("ahriman", "application", "handlers", *_, source_name) if source_name != "handler.py":
+ return relative_path.parent / f"test_handler_{source_name}"
+ case ("ahriman", "web", "views", "api", source_name):
+ return relative_path.parent / f"test_view_api_{source_name}"
+ case ("ahriman", "web", "views", version, api, source_name) if version in ("v1", "v2"):
+ return relative_path.parent / f"test_view_{version}_{api}_{source_name}"
+ case ("ahriman", "web", "views", *_, source_name):
+ if source_name.endswith("_guard.py"):
+ return relative_path.parent / f"test_{source_name}"
+ else:
+ return relative_path.parent / f"test_view_{source_name}"
+ case _:
+ return relative_path.parent / f"test_{source_file.name}"
+
+
+def test_test_coverage() -> None:
+ """
+ must have test files for each source file
+ """
+ package_roots = [
+ Path("ahriman-core"),
+ Path("ahriman-triggers"),
+ Path("ahriman-web"),
+ ]
+
+ for package_root in package_roots:
+ source_root = package_root / "src"
+
+ for source_file in filter(lambda fn: fn.suffix == ".py" and fn.name != "__init__.py", walk(source_root)):
+ test_file = package_root / "tests" / _test_path(source_root, source_file)
+ assert test_file.is_file(), test_file
diff --git a/tests/testresources/core/logging.ini b/tests/testresources/core/logging.ini
index e5d0f33e..8d9a14e6 120000
--- a/tests/testresources/core/logging.ini
+++ b/tests/testresources/core/logging.ini
@@ -1 +1 @@
-../../../package/share/ahriman/settings/ahriman.ini.d/logging.ini
\ No newline at end of file
+../../../ahriman-core/package/share/ahriman/settings/ahriman.ini.d/logging.ini
\ No newline at end of file
diff --git a/tests/testresources/web/templates b/tests/testresources/web/templates
deleted file mode 120000
index ef7687d2..00000000
--- a/tests/testresources/web/templates
+++ /dev/null
@@ -1 +0,0 @@
-../../../package/share/ahriman/templates
\ No newline at end of file
diff --git a/tests/testresources/web/templates/api.jinja2 b/tests/testresources/web/templates/api.jinja2
new file mode 120000
index 00000000..f915f6b0
--- /dev/null
+++ b/tests/testresources/web/templates/api.jinja2
@@ -0,0 +1 @@
+../../../../ahriman-web/package/share/ahriman/templates/api.jinja2
\ No newline at end of file
diff --git a/tests/testresources/web/templates/build-status b/tests/testresources/web/templates/build-status
new file mode 120000
index 00000000..ecb61719
--- /dev/null
+++ b/tests/testresources/web/templates/build-status
@@ -0,0 +1 @@
+../../../../ahriman-web/package/share/ahriman/templates/build-status
\ No newline at end of file
diff --git a/tests/testresources/web/templates/build-status-classic.jinja2 b/tests/testresources/web/templates/build-status-classic.jinja2
new file mode 120000
index 00000000..c66acf87
--- /dev/null
+++ b/tests/testresources/web/templates/build-status-classic.jinja2
@@ -0,0 +1 @@
+../../../../ahriman-web/package/share/ahriman/templates/build-status-classic.jinja2
\ No newline at end of file
diff --git a/tests/testresources/web/templates/build-status.jinja2 b/tests/testresources/web/templates/build-status.jinja2
new file mode 120000
index 00000000..0a29b124
--- /dev/null
+++ b/tests/testresources/web/templates/build-status.jinja2
@@ -0,0 +1 @@
+../../../../ahriman-web/package/share/ahriman/templates/build-status.jinja2
\ No newline at end of file
diff --git a/tests/testresources/web/templates/email-index.jinja2 b/tests/testresources/web/templates/email-index.jinja2
new file mode 120000
index 00000000..b404cb32
--- /dev/null
+++ b/tests/testresources/web/templates/email-index.jinja2
@@ -0,0 +1 @@
+../../../../ahriman-core/package/share/ahriman/templates/email-index.jinja2
\ No newline at end of file
diff --git a/tests/testresources/web/templates/error.jinja2 b/tests/testresources/web/templates/error.jinja2
new file mode 120000
index 00000000..900a7429
--- /dev/null
+++ b/tests/testresources/web/templates/error.jinja2
@@ -0,0 +1 @@
+../../../../ahriman-web/package/share/ahriman/templates/error.jinja2
\ No newline at end of file
diff --git a/tests/testresources/web/templates/repo-index.jinja2 b/tests/testresources/web/templates/repo-index.jinja2
new file mode 120000
index 00000000..4af4cd06
--- /dev/null
+++ b/tests/testresources/web/templates/repo-index.jinja2
@@ -0,0 +1 @@
+../../../../ahriman-core/package/share/ahriman/templates/repo-index.jinja2
\ No newline at end of file
diff --git a/tests/testresources/web/templates/rss.jinja2 b/tests/testresources/web/templates/rss.jinja2
new file mode 120000
index 00000000..b0f4db41
--- /dev/null
+++ b/tests/testresources/web/templates/rss.jinja2
@@ -0,0 +1 @@
+../../../../ahriman-core/package/share/ahriman/templates/rss.jinja2
\ No newline at end of file
diff --git a/tests/testresources/web/templates/shell b/tests/testresources/web/templates/shell
new file mode 120000
index 00000000..85a9c395
--- /dev/null
+++ b/tests/testresources/web/templates/shell
@@ -0,0 +1 @@
+../../../../ahriman-core/package/share/ahriman/templates/shell
\ No newline at end of file
diff --git a/tests/testresources/web/templates/static b/tests/testresources/web/templates/static
new file mode 120000
index 00000000..c83a24a4
--- /dev/null
+++ b/tests/testresources/web/templates/static
@@ -0,0 +1 @@
+../../../../ahriman-web/package/share/ahriman/templates/static
\ No newline at end of file
diff --git a/tests/testresources/web/templates/telegram-index.jinja2 b/tests/testresources/web/templates/telegram-index.jinja2
new file mode 120000
index 00000000..923ea672
--- /dev/null
+++ b/tests/testresources/web/templates/telegram-index.jinja2
@@ -0,0 +1 @@
+../../../../ahriman-core/package/share/ahriman/templates/telegram-index.jinja2
\ No newline at end of file
diff --git a/tests/testresources/web/templates/utils b/tests/testresources/web/templates/utils
new file mode 120000
index 00000000..ebf14071
--- /dev/null
+++ b/tests/testresources/web/templates/utils
@@ -0,0 +1 @@
+../../../../ahriman-core/package/share/ahriman/templates/utils
\ No newline at end of file
diff --git a/tests/ahriman/conftest.py b/tools/pytest_plugins/ahriman_fixtures/__init__.py
similarity index 75%
rename from tests/ahriman/conftest.py
rename to tools/pytest_plugins/ahriman_fixtures/__init__.py
index 99d27d83..80d202f7 100644
--- a/tests/ahriman/conftest.py
+++ b/tools/pytest_plugins/ahriman_fixtures/__init__.py
@@ -1,3 +1,23 @@
+#
+# Copyright (c) 2021-2025 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 .
+#
+import argparse
import datetime
import pytest
@@ -6,17 +26,17 @@ from pathlib import Path
from pytest_mock import MockerFixture
from sqlite3 import Cursor
from typing import Any, TypeVar
-from unittest.mock import MagicMock, PropertyMock
+from unittest.mock import MagicMock
-from ahriman.core.alpm.pacman import Pacman
+from ahriman.application.ahriman import _parser
from ahriman.core.alpm.remote import AUR
-from ahriman.core.auth import Auth
from ahriman.core.configuration import Configuration
from ahriman.core.database import SQLite
from ahriman.core.database.migrations import Migrations
from ahriman.core.log.log_loader import LogLoader
from ahriman.core.repository import Repository
from ahriman.core.repository.package_info import PackageInfo
+from ahriman.core.sign.gpg import GPG
from ahriman.core.spawn import Spawn
from ahriman.core.status import Client
from ahriman.core.status.event_bus import EventBus
@@ -27,12 +47,10 @@ from ahriman.models.migration import Migration
from ahriman.models.package import Package
from ahriman.models.package_description import PackageDescription
from ahriman.models.package_source import PackageSource
-from ahriman.models.pacman_synchronization import PacmanSynchronization
from ahriman.models.remote_source import RemoteSource
from ahriman.models.repository_id import RepositoryId
from ahriman.models.repository_paths import RepositoryPaths
from ahriman.models.result import Result
-from ahriman.models.scan_paths import ScanPaths
from ahriman.models.user import User
from ahriman.models.user_access import UserAccess
@@ -42,7 +60,6 @@ T = TypeVar("T")
# helpers
# https://stackoverflow.com/a/21611963
-@pytest.helpers.register
def anyvar(cls: type[T], strict: bool = False) -> T:
"""
any value helper for mocker calls check
@@ -74,7 +91,6 @@ def anyvar(cls: type[T], strict: bool = False) -> T:
return AnyVar()
-@pytest.helpers.register
def get_package_status(package: Package) -> dict[str, Any]:
"""
helper to extract package status from package
@@ -88,7 +104,6 @@ def get_package_status(package: Package) -> dict[str, Any]:
return {"status": BuildStatusEnum.Unknown.value, "package": package.view()}
-@pytest.helpers.register
def get_package_status_extended(package: Package) -> dict[str, Any]:
"""
helper to extract package status from package
@@ -102,7 +117,6 @@ def get_package_status_extended(package: Package) -> dict[str, Any]:
return {"status": BuildStatus().view(), "package": package.view()}
-@pytest.helpers.register
def import_error(package: str, components: list[str], mocker: MockerFixture) -> MagicMock:
"""
mock import error
@@ -118,6 +132,7 @@ def import_error(package: str, components: list[str], mocker: MockerFixture) ->
import builtins
_import = builtins.__import__
+ # pylint: disable=redefined-builtin
def test_import(name: str, globals: Any, locals: Any, from_list: list[str], level: Any):
if name == package and (not components or any(component in from_list for component in components)):
raise ImportError
@@ -126,6 +141,15 @@ def import_error(package: str, components: list[str], mocker: MockerFixture) ->
return mocker.patch.object(builtins, "__import__", test_import)
+@pytest.hookimpl(trylast=True)
+def pytest_configure() -> None:
+ """
+ register helpers after pytest-helpers-namespace has initialized
+ """
+ for helper in (anyvar, get_package_status, get_package_status_extended, import_error):
+ pytest.helpers.register(helper)
+
+
# generic fixtures
@pytest.fixture(autouse=True)
def _register_log_context() -> None:
@@ -135,6 +159,18 @@ def _register_log_context() -> None:
LogLoader.register_context()
+@pytest.fixture
+def args() -> argparse.Namespace:
+ """
+ fixture for command line arguments
+
+ Returns:
+ argparse.Namespace: command line arguments test instance
+ """
+ return argparse.Namespace(architecture=None, lock=None, force=False, unsafe=False, report=False,
+ repository=None, repository_id=None, wait_timeout=-1)
+
+
@pytest.fixture
def aur_package_ahriman() -> AURPackage:
"""
@@ -203,68 +239,6 @@ def aur_package_ahriman() -> AURPackage:
)
-@pytest.fixture
-def aur_package_akonadi() -> AURPackage:
- """
- fixture for AUR package
-
- Returns:
- AURPackage: AUR package test instance
- """
- return AURPackage(
- id=0,
- name="akonadi",
- package_base_id=0,
- package_base="akonadi",
- version="21.12.3-2",
- description="PIM layer, which provides an asynchronous API to access all kind of PIM data",
- num_votes=0,
- popularity=0.0,
- first_submitted=datetime.datetime.fromtimestamp(0, datetime.UTC),
- last_modified=datetime.datetime.fromtimestamp(1646555990.610, datetime.UTC),
- url_path="",
- url="https://kontact.kde.org",
- out_of_date=None,
- maintainer="felixonmars",
- repository="extra",
- depends=[
- "libakonadi",
- "mariadb",
- ],
- make_depends=[
- "boost",
- "doxygen",
- "extra-cmake-modules",
- "kaccounts-integration",
- "kitemmodels",
- "postgresql",
- "qt5-tools",
- ],
- opt_depends=[
- "postgresql: PostgreSQL backend",
- ],
- conflicts=[],
- provides=[],
- license=["LGPL"],
- keywords=[],
- groups=[],
- )
-
-
-@pytest.fixture
-def auth(configuration: Configuration) -> Auth:
- """
- auth provider fixture
-
- Args:
- configuration(Configuration): configuration fixture
-
- Returns:
- Auth: auth service instance
- """
- return Auth(configuration)
-
-
@pytest.fixture
def configuration(repository_id: RepositoryId, tmp_path: Path, resource_path_root: Path) -> Configuration:
"""
@@ -308,6 +282,20 @@ def database(configuration: Configuration, mocker: MockerFixture) -> SQLite:
return SQLite.load(configuration)
+@pytest.fixture
+def gpg(configuration: Configuration) -> GPG:
+ """
+ fixture for empty GPG
+
+ Args:
+ configuration(Configuration): configuration fixture
+
+ Returns:
+ GPG: GPG test instance
+ """
+ return GPG(configuration)
+
+
@pytest.fixture
def local_client(database: SQLite, configuration: Configuration) -> Client:
"""
@@ -376,27 +364,6 @@ def package_python_schedule(
packages=packages)
-@pytest.fixture
-def package_tpacpi_bat_git() -> Package:
- """
- git package fixture
-
- Returns:
- Package: git package test instance
- """
- return Package(
- base="tpacpi-bat-git",
- version="3.1.r12.g4959b52-1",
- remote=RemoteSource(
- source=PackageSource.AUR,
- git_url=AUR.remote_git_url("tpacpi-bat-git", "aur"),
- web_url=AUR.remote_web_url("tpacpi-bat-git"),
- path=".",
- branch="master",
- ),
- packages={"tpacpi-bat-git": PackageDescription()})
-
-
@pytest.fixture
def package_description_ahriman() -> PackageDescription:
"""
@@ -499,67 +466,14 @@ def package_description_python2_schedule() -> PackageDescription:
@pytest.fixture
-def pacman(configuration: Configuration) -> Pacman:
+def parser() -> argparse.ArgumentParser:
"""
- fixture for pacman wrapper
-
- Args:
- configuration(Configuration): configuration fixture
+ fixture for command line arguments parser
Returns:
- Pacman: pacman wrapper test instance
+ argparse.ArgumentParser: command line arguments parser instance
"""
- _, repository_id = configuration.check_loaded()
- return Pacman(repository_id, configuration, refresh_database=PacmanSynchronization.Disabled)
-
-
-@pytest.fixture
-def passwd() -> MagicMock:
- """
- get passwd structure for the user
-
- Returns:
- MagicMock: passwd structure test instance
- """
- passwd = MagicMock()
- passwd.pw_dir = "home"
- passwd.pw_name = "ahriman"
- return passwd
-
-
-@pytest.fixture
-def pyalpm_package_ahriman(aur_package_ahriman: AURPackage) -> MagicMock:
- """
- mock object for pyalpm package
-
- Args:
- aur_package_ahriman(AURPackage): package fixture
-
- Returns:
- MagicMock: pyalpm package mock
- """
- mock = MagicMock()
- db = type(mock).db = MagicMock()
-
- type(mock).base = PropertyMock(return_value=aur_package_ahriman.package_base)
- type(mock).builddate = PropertyMock(
- return_value=aur_package_ahriman.last_modified.replace(tzinfo=datetime.timezone.utc).timestamp())
- type(mock).conflicts = PropertyMock(return_value=aur_package_ahriman.conflicts)
- type(db).name = PropertyMock(return_value="aur")
- type(mock).depends = PropertyMock(return_value=aur_package_ahriman.depends)
- type(mock).desc = PropertyMock(return_value=aur_package_ahriman.description)
- type(mock).licenses = PropertyMock(return_value=aur_package_ahriman.license)
- type(mock).makedepends = PropertyMock(return_value=aur_package_ahriman.make_depends)
- type(mock).name = PropertyMock(return_value=aur_package_ahriman.name)
- type(mock).optdepends = PropertyMock(return_value=aur_package_ahriman.opt_depends)
- type(mock).checkdepends = PropertyMock(return_value=aur_package_ahriman.check_depends)
- type(mock).packager = PropertyMock(return_value="packager")
- type(mock).provides = PropertyMock(return_value=aur_package_ahriman.provides)
- type(mock).version = PropertyMock(return_value=aur_package_ahriman.version)
- type(mock).url = PropertyMock(return_value=aur_package_ahriman.url)
- type(mock).groups = PropertyMock(return_value=aur_package_ahriman.groups)
-
- return mock
+ return _parser()
@pytest.fixture
@@ -638,20 +552,6 @@ def result(package_ahriman: Package) -> Result:
return result
-@pytest.fixture
-def scan_paths(configuration: Configuration) -> ScanPaths:
- """
- scan paths fixture
-
- Args:
- configuration(Configuration): configuration test instance
-
- Returns:
- ScanPaths: scan paths test instance
- """
- return ScanPaths(configuration.getlist("build", "scan_paths", fallback=[]))
-
-
@pytest.fixture
def spawner(configuration: Configuration) -> Spawn:
"""
diff --git a/tools/pytest_plugins/pyproject.toml b/tools/pytest_plugins/pyproject.toml
new file mode 100644
index 00000000..ebc676ae
--- /dev/null
+++ b/tools/pytest_plugins/pyproject.toml
@@ -0,0 +1,18 @@
+[build-system]
+requires = [
+ "hatchling",
+]
+build-backend = "hatchling.build"
+
+[project]
+name = "ahriman-pytest-plugins"
+classifiers = [
+ "Framework :: Pytest",
+]
+version = "1"
+
+[project.entry-points.pytest11]
+ahriman-fixtures = "ahriman_fixtures"
+
+[tool.hatch.build.targets.wheel]
+packages = ["ahriman_fixtures"]
diff --git a/tox.toml b/tox.toml
index 6dc19500..35cc9ff2 100644
--- a/tox.toml
+++ b/tox.toml
@@ -15,26 +15,36 @@ npm_install = [
"npm",
{ replace = "ref", of = ["flags", "npm"], extend = true },
"install",
- "--cache", "{envtmpdir}/npm-cache",
+ "--cache",
+ "{envtmpdir}/npm-cache",
],
]
[flags]
autopep8 = [
- "--max-line-length", "120",
+ "--max-line-length",
+ "120",
"-aa",
]
bandit = [
- "--configfile", ".bandit.yml",
+ "--configfile",
+ ".bandit.toml",
]
manpage = [
- "--author", "{[project]name} team",
- "--author-email", "",
- "--description", "ArcH linux ReposItory MANager",
- "--manual-title", "ArcH linux ReposItory MANager",
- "--project-name", "{[project]name}",
- "--version", "{env:VERSION}",
- "--url", "https://github.com/arcan1s/ahriman",
+ "--author",
+ "{[project]name} team",
+ "--author-email",
+ "",
+ "--description",
+ "ArcH linux ReposItory MANager",
+ "--manual-title",
+ "ArcH linux ReposItory MANager",
+ "--project-name",
+ "{[project]name}",
+ "--version",
+ "{env:VERSION}",
+ "--url",
+ "https://github.com/arcan1s/ahriman",
]
mypy = [
"--implicit-reexport",
@@ -43,49 +53,44 @@ mypy = [
"--allow-subclassing-any",
]
npm = [
- "--prefix", "frontend",
+ "--prefix",
+ "frontend",
]
pydeps = [
"--no-config",
"--cluster",
]
pylint = [
- "--rcfile", ".pylint.toml",
+ "--rcfile",
+ ".pylint.toml",
]
shtab = [
- "--prefix", "{[project]name}",
- "--prog", "{[project]name}",
+ "--prefix",
+ "{[project]name}",
+ "--prog",
+ "{[project]name}",
"ahriman.application.ahriman._parser",
]
[project]
extras = [
- "journald",
- "pacman",
- "reports",
- "s3",
- "shell",
- "stats",
- "unixsocket",
- "validator",
- "web",
- "web-auth",
- "web-docs",
- "web-oauth2",
- "web-metrics",
+ "./ahriman-core[journald,pacman,reports,s3,shell,stats,unixsocket,validator]",
+ "./ahriman-triggers",
+ "./ahriman-web[auth,docs,metrics,oauth2]",
]
name = "ahriman"
[env.archive]
description = "Create source files tarball"
-deps = [
- "build",
-]
+skip_install = true
+system_site_packages = true
commands = [
[
"{envpython}",
- "-m", "build",
+ "-m",
+ "build",
"--sdist",
+ "--no-isolation",
],
]
@@ -97,47 +102,59 @@ allowlist_externals = [
dependency_groups = [
"check",
]
-extras = [
+deps = [
{ replace = "ref", of = ["project", "extras"], extend = true },
]
pip_pre = true
set_env.CFLAGS = "-Wno-unterminated-string-initialization"
-set_env.MYPYPATH = "src"
+set_env.MYPYPATH = "ahriman-core/src:ahriman-triggers/src:ahriman-web/src"
commands = [
[
"autopep8",
{ replace = "ref", of = ["flags", "autopep8"], extend = true },
"--exit-code",
"--in-place",
- "--jobs", "0",
+ "--jobs",
+ "0",
"--recursive",
- "src/{[project]name}",
- "tests/{[project]name}",
+ "ahriman-core/src/{[project]name}",
+ "ahriman-triggers/src/{[project]name}",
+ "ahriman-web/src/{[project]name}",
+ "tests",
+ "ahriman-core/tests",
+ "ahriman-triggers/tests",
+ "ahriman-web/tests",
],
[
"pylint",
{ replace = "ref", of = ["flags", "pylint"], extend = true },
- "src/{[project]name}",
+ "{[project]name}",
],
[
"bandit",
{ replace = "ref", of = ["flags", "bandit"], extend = true },
"--recursive",
- "src/{[project]name}",
+ "ahriman-core/src/{[project]name}",
+ "ahriman-triggers/src/{[project]name}",
+ "ahriman-web/src/{[project]name}",
],
[
"bandit",
{ replace = "ref", of = ["flags", "bandit"], extend = true },
- "--skip", "B101,B105,B106",
+ "--skip",
+ "B101,B105,B106",
"--recursive",
- "src/{[project]name}",
+ "ahriman-core/tests/{[project]name}",
+ "ahriman-triggers/tests/{[project]name}",
+ "ahriman-web/tests/{[project]name}",
],
[
"mypy",
{ replace = "ref", of = ["flags", "mypy"], extend = true },
"--install-types",
"--non-interactive",
- "--package", "{[project]name}",
+ "--package",
+ "{[project]name}",
],
{ replace = "ref", of = ["commands", "npm_install"], extend = true },
[
@@ -157,60 +174,71 @@ depends = [
"version",
]
deps = [
+ { replace = "ref", of = ["project", "extras"], extend = true },
"uv",
]
-dynamic_version = "{[project]name}.__version__"
-extras = [
- { replace = "ref", of = ["project", "extras"], extend = true },
-]
+dynamic_version = "{[project]name}"
pip_pre = true
-set_env.PYTHONPATH = "src"
set_env.SPHINX_APIDOC_OPTIONS = "members,no-undoc-members,show-inheritance"
commands = [
[
"shtab",
{ replace = "ref", of = ["flags", "shtab"], extend = true },
- "--shell", "bash",
- "--output", "package/share/bash-completion/completions/_ahriman",
+ "--shell",
+ "bash",
+ "--output",
+ "ahriman-core/package/share/bash-completion/completions/_ahriman",
],
[
"shtab",
{ replace = "ref", of = ["flags", "shtab"], extend = true },
- "--shell", "zsh",
- "--output", "package/share/zsh/site-functions/_ahriman",
+ "--shell",
+ "zsh",
+ "--output",
+ "ahriman-core/package/share/zsh/site-functions/_ahriman",
],
[
"argparse-manpage",
{ replace = "ref", of = ["flags", "manpage"], extend = true },
- "--module", "ahriman.application.ahriman",
- "--function", "_parser",
- "--output", "package/share/man/man1/ahriman.1",
+ "--module",
+ "ahriman.application.ahriman",
+ "--function",
+ "_parser",
+ "--output",
+ "ahriman-core/package/share/man/man1/ahriman.1",
],
[
"pydeps",
{ replace = "ref", of = ["flags", "pydeps"], extend = true },
- "--dot-output", "{tox_root}/docs/_static/architecture.dot",
+ "--dot-output",
+ "{tox_root}/docs/_static/architecture.dot",
"--no-output",
"--show-dot",
- "src/ahriman",
+ "{envsitepackagesdir}/{[project]name}",
],
[
"sphinx-apidoc",
"--force",
"--no-toc",
- "--output-dir", "docs",
- "src",
+ "--output-dir",
+ "docs",
+ "{envsitepackagesdir}/{[project]name}",
],
# compile list of dependencies for rtd.io
[
"uv",
"pip",
"compile",
- "--group", "pyproject.toml:docs",
- "--extra", "s3",
- "--extra", "validator",
- "--extra", "web",
- "--output-file", "docs/requirements.txt",
+ "--group",
+ "pyproject.toml:docs",
+ "--no-emit-package",
+ "ahriman-core",
+ "--no-emit-package",
+ "ahriman-triggers",
+ "--no-emit-package",
+ "ahriman-web",
+ "--output-file",
+ "docs/requirements.txt",
"--quiet",
"pyproject.toml",
],
@@ -236,7 +264,7 @@ description = "Generate html documentation"
dependency_groups = [
"docs",
]
-extras = [
+deps = [
{ replace = "ref", of = ["project", "extras"], extend = true },
]
pip_pre = true
@@ -244,9 +272,11 @@ recreate = true
commands = [
[
"sphinx-build",
- "--builder", "html",
+ "--builder",
+ "html",
"--fail-on-warning",
- "--jobs", "auto",
+ "--jobs",
+ "1",
"--write-all",
"docs",
"{envtmpdir}/html",
@@ -268,18 +298,19 @@ commands = [
[
"git",
"add",
+ "archlinux/PKGBUILD",
"docs/_static/architecture.dot",
"frontend/package.json",
- "package/archlinux/PKGBUILD",
- "package/share/man/man1/ahriman.1",
- "package/share/bash-completion/completions/_ahriman",
- "package/share/zsh/site-functions/_ahriman",
- "src/ahriman/__init__.py",
+ "ahriman-core/package/share/man/man1/ahriman.1",
+ "ahriman-core/package/share/bash-completion/completions/_ahriman",
+ "ahriman-core/package/share/zsh/site-functions/_ahriman",
+ "ahriman-core/src/ahriman/__init__.py",
],
[
"git",
"commit",
- "--message", "Release {posargs}",
+ "--message",
+ "Release {posargs}",
],
[
"git",
@@ -302,16 +333,33 @@ description = "Run tests"
dependency_groups = [
"tests",
]
-extras = [
+deps = [
{ replace = "ref", of = ["project", "extras"], extend = true },
+ "./tools/pytest_plugins",
]
pip_pre = true
set_env.CFLAGS = "-Wno-unterminated-string-initialization"
commands = [
[
+ "coverage",
+ "run",
+ "--source",
+ "ahriman",
+ "-m",
"pytest",
+ "tests/test_tests.py",
+ "ahriman-core/tests",
+ "ahriman-triggers/tests",
+ "ahriman-web/tests",
{ replace = "posargs", extend = true },
],
+ [
+ "coverage",
+ "report",
+ "--show-missing",
+ "--skip-covered",
+ "--fail-under=100",
+ ],
]
[env.version]
@@ -323,17 +371,19 @@ allowlist_externals = [
deps = [
"packaging",
]
+skip_install = true
commands = [
# check if version is set and validate it
[
"{envpython}",
- "-c", "from packaging.version import Version; Version('{posargs}')",
+ "-c",
+ "from packaging.version import Version; Version('{posargs}')",
],
[
"sed",
"--in-place",
"s/^__version__ = .*/__version__ = \"{posargs}\"/",
- "src/ahriman/__init__.py",
+ "ahriman-core/src/ahriman/__init__.py",
],
[
"npm",
@@ -345,6 +395,6 @@ commands = [
"sed",
"--in-place",
"s/pkgver=.*/pkgver={posargs}/",
- "package/archlinux/PKGBUILD",
+ "archlinux/PKGBUILD",
],
]
diff --git a/toxfile.py b/toxfile.py
index 437d61a1..a8ddda09 100644
--- a/toxfile.py
+++ b/toxfile.py
@@ -17,8 +17,7 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
-import importlib
-import sys
+from importlib.metadata import Distribution, PackageNotFoundError
from tox.config.sets import EnvConfigSet
from tox.plugin import impl
@@ -26,32 +25,34 @@ from tox.session.state import State
from tox.tox_env.api import ToxEnv
-def _extract_version(env_conf: EnvConfigSet, python_path: str | None = None) -> dict[str, str]:
+def _extract_version(tox_env: ToxEnv) -> dict[str, str]:
"""
extract version dynamically and set VERSION environment variable
Args:
- env_conf(EnvConfigSet): the core configuration object
- python_path(str | None): python path variable if available
+ tox_env(ToxEnv): tox environment containing the installed package
Returns:
dict[str, str]: environment variables which must be inserted
+
+ Raises:
+ PackageNotFoundError: no installed distribution has been found
"""
- import_path = env_conf["dynamic_version"]
- if not import_path:
+ distribution = tox_env.conf["dynamic_version"]
+ if not distribution:
return {}
- if python_path is not None:
- sys.path.append(python_path)
+ installed = next(
+ (
+ package for package in Distribution.discover(path=[str(tox_env.env_site_package_dir())])
+ if package.name == distribution
+ ),
+ None,
+ )
+ if installed is None:
+ raise PackageNotFoundError(distribution)
- module_name, variable_name = import_path.rsplit(".", maxsplit=1)
- module = importlib.import_module(module_name)
- version = getattr(module, variable_name)
-
- # reset import paths
- sys.path.pop()
-
- return {"VERSION": version}
+ return {"VERSION": installed.version}
@impl
@@ -70,7 +71,7 @@ def tox_add_env_config(env_conf: EnvConfigSet, state: State) -> None:
keys=["dynamic_version"],
of_type=str,
default="",
- desc="import path for the version variable",
+ desc="distribution name used to populate the VERSION environment variable",
)
@@ -82,8 +83,4 @@ def tox_before_run_commands(tox_env: ToxEnv) -> None:
Args:
tox_env(ToxEnv): the tox environment being executed
"""
- env_conf = tox_env.conf
- set_env = env_conf["set_env"]
-
- python_path = set_env.load("PYTHONPATH") if "PYTHONPATH" in set_env else None
- set_env.update(_extract_version(env_conf, python_path))
+ tox_env.conf["set_env"].update(_extract_version(tox_env))