full support of pep517

Since llast upgrade build is broken. Lets fully migrate to
pyproject.toml. Note for maintaners: because data_files option is
deprectated (see https://github.com/pypa/setuptools/discussions/2648)
you will have to install files manually inside your packaging process
This commit is contained in:
Evgenii Alekseev 2023-08-11 03:01:18 +03:00
parent 3a88d00db0
commit 1baf04998d
34 changed files with 147 additions and 266 deletions

View File

@ -12,7 +12,7 @@ pacman --noconfirm -Syu
# main dependencies # main dependencies
pacman --noconfirm -Sy base-devel devtools git pyalpm python-cerberus python-inflection python-passlib python-requests python-srcinfo python-systemd sudo pacman --noconfirm -Sy base-devel devtools git pyalpm python-cerberus python-inflection python-passlib python-requests python-srcinfo python-systemd sudo
# make dependencies # make dependencies
pacman --noconfirm -Sy python-build python-installer python-wheel pacman --noconfirm -Sy python-build python-flit python-installer python-wheel
# optional dependencies # optional dependencies
if [[ -z $MINIMAL_INSTALL ]]; then if [[ -z $MINIMAL_INSTALL ]]; then
# VCS support # VCS support

View File

@ -29,7 +29,7 @@ COPY "docker/install-aur-package.sh" "/usr/local/bin/install-aur-package"
## install package dependencies ## install package dependencies
## darcs is not installed by reasons, because it requires a lot haskell packages which dramatically increase image size ## darcs is not installed by reasons, because it requires a lot haskell packages which dramatically increase image size
RUN pacman -Sy --noconfirm --asdeps devtools git pyalpm python-cerberus python-inflection python-passlib python-requests python-srcinfo && \ RUN pacman -Sy --noconfirm --asdeps devtools git pyalpm python-cerberus python-inflection python-passlib python-requests python-srcinfo && \
pacman -Sy --noconfirm --asdeps python-build python-installer python-wheel && \ pacman -Sy --noconfirm --asdeps python-build python-flit python-installer python-wheel && \
pacman -Sy --noconfirm --asdeps breezy mercurial python-aiohttp python-aiohttp-cors python-boto3 python-cryptography python-jinja python-requests-unixsocket python-systemd rsync subversion && \ pacman -Sy --noconfirm --asdeps breezy mercurial python-aiohttp python-aiohttp-cors python-boto3 python-cryptography python-jinja python-requests-unixsocket python-systemd rsync subversion && \
runuser -u build -- install-aur-package python-aioauth-client python-aiohttp-apispec-git python-aiohttp-jinja2 \ runuser -u build -- install-aur-package python-aioauth-client python-aiohttp-apispec-git python-aiohttp-jinja2 \
python-aiohttp-debugtoolbar python-aiohttp-session python-aiohttp-security python-aiohttp-debugtoolbar python-aiohttp-session python-aiohttp-security
@ -39,7 +39,7 @@ RUN pacman -Sy --noconfirm --asdeps devtools git pyalpm python-cerberus python-i
COPY --chown=build . "/home/build/ahriman" COPY --chown=build . "/home/build/ahriman"
## create package archive and install it ## create package archive and install it
RUN cd "/home/build/ahriman" && \ RUN cd "/home/build/ahriman" && \
make VERSION=$(python -c "from src.ahriman.version import __version__; print(__version__)") archlinux && \ make VERSION=$(python -c "from src.ahriman import __version__; print(__version__)") archlinux && \
cp ./*-src.tar.xz "package/archlinux" && \ cp ./*-src.tar.xz "package/archlinux" && \
cd "package/archlinux" && \ cd "package/archlinux" && \
runuser -u build -- makepkg --noconfirm --install --skipchecksums && \ runuser -u build -- makepkg --noconfirm --install --skipchecksums && \

View File

@ -3,7 +3,7 @@
PROJECT := ahriman PROJECT := ahriman
FILES := AUTHORS CONTRIBUTING.md COPYING Makefile README.md SECURITY.md docs package src setup.py tox.ini web.png FILES := AUTHORS CONTRIBUTING.md COPYING Makefile README.md SECURITY.md docs package pyproject.toml src tox.ini web.png
TARGET_FILES := $(addprefix $(PROJECT)/, $(FILES)) TARGET_FILES := $(addprefix $(PROJECT)/, $(FILES))
IGNORE_FILES := package/archlinux src/.mypy_cache IGNORE_FILES := package/archlinux src/.mypy_cache
@ -38,7 +38,7 @@ html: specification
tox -e docs-html tox -e docs-html
push: specification archlinux push: specification archlinux
git add package/archlinux/PKGBUILD src/ahriman/version.py docs/ahriman-architecture.svg docs/ahriman.1 docs/completions/ git add package/archlinux/PKGBUILD src/ahriman/__init__.py docs/ahriman-architecture.svg package/share/man/man1/ahriman.1 package/share/bash-completion/completions/_ahriman package/share/zsh/site-functions/_ahriman
git commit -m "Release $(VERSION)" git commit -m "Release $(VERSION)"
git tag "$(VERSION)" git tag "$(VERSION)"
git push git push
@ -56,4 +56,4 @@ version:
ifndef VERSION ifndef VERSION
$(error VERSION is required, but not set) $(error VERSION is required, but not set)
endif endif
sed -i 's/^__version__ = .*/__version__ = "$(VERSION)"/' src/ahriman/version.py sed -i 's/^__version__ = .*/__version__ = "$(VERSION)"/' src/ahriman/__init__.py

View File

@ -12,17 +12,6 @@ Subpackages
ahriman.models ahriman.models
ahriman.web ahriman.web
Submodules
----------
ahriman.version module
----------------------
.. automodule:: ahriman.version
:members:
:no-undoc-members:
:show-inheritance:
Module contents Module contents
--------------- ---------------

View File

@ -15,7 +15,7 @@ import sys
from pathlib import Path from pathlib import Path
from ahriman.version import __version__ from ahriman import __version__
basedir = Path(__file__).resolve().parent.parent / "src" basedir = Path(__file__).resolve().parent.parent / "src"

View File

@ -8,7 +8,7 @@ arch=('any')
url="https://github.com/arcan1s/ahriman" url="https://github.com/arcan1s/ahriman"
license=('GPL3') license=('GPL3')
depends=('devtools>=1:1.0.0' 'git' 'pyalpm' 'python-cerberus' 'python-inflection' 'python-passlib' 'python-requests' 'python-srcinfo') depends=('devtools>=1:1.0.0' 'git' 'pyalpm' 'python-cerberus' 'python-inflection' 'python-passlib' 'python-requests' 'python-srcinfo')
makedepends=('python-build' 'python-installer' 'python-wheel') makedepends=('python-build' 'python-flit' 'python-installer' 'python-wheel')
optdepends=('breezy: -bzr packages support' optdepends=('breezy: -bzr packages support'
'darcs: -darcs packages support' 'darcs: -darcs packages support'
'mercurial: -hg packages support' 'mercurial: -hg packages support'
@ -45,8 +45,10 @@ package() {
python -m installer --destdir="$pkgdir" "dist/$pkgname-$pkgver-py3-none-any.whl" python -m installer --destdir="$pkgdir" "dist/$pkgname-$pkgver-py3-none-any.whl"
# python-installer actually thinks that you cannot just copy files to root # thanks too PEP517, which we all wanted, you need to install data files manually nowadays
# thus we need to copy them manually pushd package && find . -type f -exec install -Dm644 "{}" "$pkgdir/usr/{}" \; && popd
# keep usr/share configs as reference and copy them to /etc
install -Dm644 "$pkgdir/usr/share/$pkgname/settings/ahriman.ini" "$pkgdir/etc/ahriman.ini" install -Dm644 "$pkgdir/usr/share/$pkgname/settings/ahriman.ini" "$pkgdir/etc/ahriman.ini"
install -Dm644 "$pkgdir/usr/share/$pkgname/settings/ahriman.ini.d/logging.ini" "$pkgdir/etc/ahriman.ini.d/logging.ini" install -Dm644 "$pkgdir/usr/share/$pkgname/settings/ahriman.ini.d/logging.ini" "$pkgdir/etc/ahriman.ini.d/logging.ini"

View File

@ -1,3 +0,0 @@
#!/bin/sh
exec python -B -m ahriman.application.ahriman "$@"

84
pyproject.toml Normal file
View File

@ -0,0 +1,84 @@
[build-system]
requires = ["flit_core"]
build-backend = "flit_core.buildapi"
[project]
name = "ahriman"
description = "ArcH linux ReposItory MANager"
readme = "README.md"
requires-python = ">=3.11"
license = {file = "COPYING"}
authors = [
{name = "ahriman team"},
]
dependencies = [
"cerberus",
"inflection",
"passlib",
"requests",
"srcinfo",
]
dynamic = ["version"]
[project.urls]
Documentation = "https://ahriman.readthedocs.io/"
Repository = "https://github.com/arcan1s/ahriman"
Changelog = "https://github.com/arcan1s/ahriman/releases"
[project.scripts]
ahriman = "ahriman.application.ahriman:run"
[project.optional-dependencies]
check = [
"autopep8",
"bandit",
"mypy",
"pylint",
]
docs = [
"Sphinx",
"argparse-manpage",
"pydeps",
"shtab",
"sphinx-argparse",
"sphinx-rtd-theme>=1.1.1", # https://stackoverflow.com/a/74355734
]
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",
]
s3 = [
"boto3",
]
tests = [
"pytest",
"pytest-aiohttp",
"pytest-cov",
"pytest-helpers-namespace",
"pytest-mock",
"pytest-resource-path",
"pytest-spec",
]
web = [
"Jinja2",
"aioauth-client",
"aiohttp",
"aiohttp-apispec",
"aiohttp_cors",
"aiohttp_jinja2",
"aiohttp_debugtoolbar",
"aiohttp_session",
"aiohttp_security",
"cryptography",
"requests-unixsocket", # required by unix socket support
]

158
setup.py
View File

@ -1,158 +0,0 @@
from pathlib import Path
from setuptools import find_packages, setup
from typing import Any
metadata_path = Path(__file__).resolve().parent / "src/ahriman/version.py"
metadata: dict[str, Any] = {}
with metadata_path.open() as metadata_file:
exec(metadata_file.read(), metadata) # pylint: disable=exec-used
setup(
name="ahriman",
version=metadata["__version__"],
zip_safe=False,
description="ArcH linux ReposItory MANager",
author="ahriman team",
author_email="",
url="https://github.com/arcan1s/ahriman",
license="GPL3",
packages=find_packages("src"),
package_dir={"": "src"},
package_data={"": ["py.typed"]},
dependency_links=[
],
install_requires=[
"cerberus",
"inflection",
"passlib",
"requests",
"srcinfo",
],
setup_requires=[
],
tests_require=[
"pytest",
"pytest-aiohttp",
"pytest-cov",
"pytest-helpers-namespace",
"pytest-mock",
"pytest-spec",
"pytest-resource-path",
],
include_package_data=True,
scripts=[
"package/bin/ahriman",
],
data_files=[
# configuration
("share/ahriman/settings", [
"package/share/ahriman/settings/ahriman.ini",
]),
("share/ahriman/settings/ahriman.ini.d", [
"package/share/ahriman/settings/ahriman.ini.d/logging.ini",
]),
# systemd files
("lib/systemd/system", [
"package/lib/systemd/system/ahriman@.service",
"package/lib/systemd/system/ahriman@.timer",
"package/lib/systemd/system/ahriman-web@.service",
]),
# templates
("share/ahriman/templates", [
"package/share/ahriman/templates/api.jinja2",
"package/share/ahriman/templates/build-status.jinja2",
"package/share/ahriman/templates/email-index.jinja2",
"package/share/ahriman/templates/error.jinja2",
"package/share/ahriman/templates/repo-index.jinja2",
"package/share/ahriman/templates/shell",
"package/share/ahriman/templates/telegram-index.jinja2",
]),
("share/ahriman/templates/build-status", [
"package/share/ahriman/templates/build-status/alerts.jinja2",
"package/share/ahriman/templates/build-status/key-import-modal.jinja2",
"package/share/ahriman/templates/build-status/login-modal.jinja2",
"package/share/ahriman/templates/build-status/package-add-modal.jinja2",
"package/share/ahriman/templates/build-status/package-info-modal.jinja2",
"package/share/ahriman/templates/build-status/package-rebuild-modal.jinja2",
"package/share/ahriman/templates/build-status/table.jinja2",
]),
("share/ahriman/templates/static", [
"package/share/ahriman/templates/static/favicon.ico",
]),
("share/ahriman/templates/utils", [
"package/share/ahriman/templates/utils/bootstrap-scripts.jinja2",
"package/share/ahriman/templates/utils/style.jinja2",
]),
# man pages
("share/man/man1", [
"docs/ahriman.1",
]),
# shell completions
("share/bash-completion/completions", [
"docs/completions/bash/_ahriman",
]),
("share/zsh/site-functions", [
"docs/completions/zsh/_ahriman",
]),
],
extras_require={
"check": [
"autopep8",
"bandit",
"mypy",
"pylint",
],
"docs": [
"Sphinx",
"argparse-manpage",
"pydeps",
"shtab",
"sphinx-argparse",
"sphinx-rtd-theme>=1.1.1", # https://stackoverflow.com/a/74355734
],
"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",
],
"s3": [
"boto3",
],
"tests": [
"pytest",
"pytest-aiohttp",
"pytest-cov",
"pytest-helpers-namespace",
"pytest-mock",
"pytest-resource-path",
"pytest-spec",
],
"web": [
"Jinja2",
"aioauth-client",
"aiohttp",
"aiohttp-apispec",
"aiohttp_cors",
"aiohttp_jinja2",
"aiohttp_debugtoolbar",
"aiohttp_session",
"aiohttp_security",
"cryptography",
"requests-unixsocket", # required by unix socket support
],
},
)

View File

@ -17,3 +17,4 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
__version__ = "2.10.2"

View File

@ -19,13 +19,12 @@
# #
# pylint: disable=too-many-lines # pylint: disable=too-many-lines
import argparse import argparse
import sys
import tempfile import tempfile
from pathlib import Path from pathlib import Path
from typing import TypeVar from typing import TypeVar
from ahriman import version from ahriman import __version__
from ahriman.application import handlers from ahriman.application import handlers
from ahriman.core.util import enum_values, extract_user from ahriman.core.util import enum_values, extract_user
from ahriman.models.action import Action from ahriman.models.action import Action
@ -85,7 +84,7 @@ def _parser() -> argparse.ArgumentParser:
parser.add_argument("-q", "--quiet", help="force disable any logging", action="store_true") parser.add_argument("-q", "--quiet", help="force disable any logging", action="store_true")
parser.add_argument("--unsafe", help="allow to run ahriman as non-ahriman user. Some actions might be unavailable", parser.add_argument("--unsafe", help="allow to run ahriman as non-ahriman user. Some actions might be unavailable",
action="store_true") action="store_true")
parser.add_argument("-V", "--version", action="version", version=version.__version__) parser.add_argument("-V", "--version", action="version", version=__version__)
subparsers = parser.add_subparsers(title="command", help="command to run", dest="command", required=True) subparsers = parser.add_subparsers(title="command", help="command to run", dest="command", required=True)
@ -1000,18 +999,15 @@ def _set_web_parser(root: SubParserAction) -> argparse.ArgumentParser:
return parser return parser
def run() -> None: def run() -> int:
""" """
run application instance run application instance
Returns:
int: application status code
""" """
if __name__ == "__main__": args_parser = _parser()
args_parser = _parser() args = args_parser.parse_args()
args = args_parser.parse_args()
handler: handlers.Handler = args.handler handler: handlers.Handler = args.handler
status = handler.execute(args) return handler.execute(args)
sys.exit(status)
run()

View File

@ -19,7 +19,7 @@
# #
import argparse import argparse
from ahriman import version from ahriman import __version__
from ahriman.application.application import Application from ahriman.application.application import Application
from ahriman.application.handlers import Handler from ahriman.application.handlers import Handler
from ahriman.core.configuration import Configuration from ahriman.core.configuration import Configuration
@ -49,7 +49,7 @@ class ServiceUpdates(Handler):
remote = Package.from_aur("ahriman", application.repository.pacman, None) remote = Package.from_aur("ahriman", application.repository.pacman, None)
release = remote.version.rsplit("-", 1)[-1] # we don't store pkgrel locally, so we just append it release = remote.version.rsplit("-", 1)[-1] # we don't store pkgrel locally, so we just append it
local_version = f"{version.__version__}-{release}" local_version = f"{__version__}-{release}"
# technically we would like to compare versions, but it is fine to raise an exception in case if locally # technically we would like to compare versions, but it is fine to raise an exception in case if locally
# installed package is newer than in AUR # installed package is newer than in AUR

View File

@ -24,7 +24,7 @@ import sys
from collections.abc import Generator from collections.abc import Generator
from importlib import metadata from importlib import metadata
from ahriman import version from ahriman import __version__
from ahriman.application.handlers import Handler from ahriman.application.handlers import Handler
from ahriman.core.configuration import Configuration from ahriman.core.configuration import Configuration
from ahriman.core.formatters import VersionPrinter from ahriman.core.formatters import VersionPrinter
@ -52,7 +52,7 @@ class Versions(Handler):
configuration(Configuration): configuration instance configuration(Configuration): configuration instance
report(bool): force enable or disable reporting report(bool): force enable or disable reporting
""" """
VersionPrinter(f"Module version {version.__version__}", VersionPrinter(f"Module version {__version__}",
{"Python": sys.version}).print(verbose=False, separator=" ") {"Python": sys.version}).print(verbose=False, separator=" ")
packages = Versions.package_dependencies("ahriman") packages = Versions.package_dependencies("ahriman")
VersionPrinter("Installed packages", dict(packages)).print(verbose=False, separator=" ") VersionPrinter("Installed packages", dict(packages)).print(verbose=False, separator=" ")

View File

@ -22,7 +22,7 @@ import argparse
from types import TracebackType from types import TracebackType
from typing import Literal, Self from typing import Literal, Self
from ahriman import version from ahriman import __version__
from ahriman.core.configuration import Configuration from ahriman.core.configuration import Configuration
from ahriman.core.exceptions import DuplicateRunError from ahriman.core.exceptions import DuplicateRunError
from ahriman.core.log import LazyLogging from ahriman.core.log import LazyLogging
@ -77,9 +77,9 @@ class Lock(LazyLogging):
check web server version check web server version
""" """
status = self.reporter.get_internal() status = self.reporter.get_internal()
if status.version is not None and status.version != version.__version__: if status.version is not None and status.version != __version__:
self.logger.warning("status watcher version mismatch, our %s, their %s", self.logger.warning("status watcher version mismatch, our %s, their %s",
version.__version__, status.version) __version__, status.version)
def check_user(self) -> None: def check_user(self) -> None:
""" """

View File

@ -17,7 +17,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
from ahriman import version from ahriman import __version__
from ahriman.core.alpm.pacman import Pacman from ahriman.core.alpm.pacman import Pacman
from ahriman.core.log import LazyLogging from ahriman.core.log import LazyLogging
from ahriman.models.aur_package import AURPackage from ahriman.models.aur_package import AURPackage
@ -43,7 +43,7 @@ class Remote(LazyLogging):
directly, whereas ``multisearch`` splits search one by one and finds intersection between search results. directly, whereas ``multisearch`` splits search one by one and finds intersection between search results.
""" """
DEFAULT_USER_AGENT = f"ahriman/{version.__version__}" DEFAULT_USER_AGENT = f"ahriman/{__version__}"
@classmethod @classmethod
def info(cls, package_name: str, *, pacman: Pacman) -> AURPackage: def info(cls, package_name: str, *, pacman: Pacman) -> AURPackage:

View File

@ -24,7 +24,7 @@ import requests
from collections.abc import Generator from collections.abc import Generator
from urllib.parse import quote_plus as urlencode from urllib.parse import quote_plus as urlencode
from ahriman import version from ahriman import __version__
from ahriman.core.configuration import Configuration from ahriman.core.configuration import Configuration
from ahriman.core.log import LazyLogging from ahriman.core.log import LazyLogging
from ahriman.core.status.client import Client from ahriman.core.status.client import Client
@ -141,11 +141,11 @@ class WebClient(Client, LazyLogging):
if use_unix_socket: if use_unix_socket:
import requests_unixsocket # type: ignore[import] import requests_unixsocket # type: ignore[import]
session: requests.Session = requests_unixsocket.Session() session: requests.Session = requests_unixsocket.Session()
session.headers["User-Agent"] = f"ahriman/{version.__version__}" session.headers["User-Agent"] = f"ahriman/{__version__}"
return session return session
session = requests.Session() session = requests.Session()
session.headers["User-Agent"] = f"ahriman/{version.__version__}" session.headers["User-Agent"] = f"ahriman/{__version__}"
self._login(session) self._login(session)
return session return session

View File

@ -17,9 +17,9 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
from secrets import token_urlsafe as generate_password
from dataclasses import dataclass, replace from dataclasses import dataclass, replace
from passlib.hash import sha512_crypt from passlib.hash import sha512_crypt
from passlib.pwd import genword as generate_password
from typing import Self from typing import Self
from ahriman.models.user_access import UserAccess from ahriman.models.user_access import UserAccess
@ -104,8 +104,7 @@ class User:
Returns: Returns:
str: random string which contains letters and numbers str: random string which contains letters and numbers
""" """
password: str = generate_password(length=length) return generate_password(length)[:length]
return password
def check_credentials(self, password: str, salt: str) -> bool: def check_credentials(self, password: str, salt: str) -> bool:
""" """

View File

@ -1,20 +0,0 @@
#
# Copyright (c) 2021-2023 ahriman team.
#
# This file is part of ahriman
# (see https://github.com/arcan1s/ahriman).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
__version__ = "2.10.2"

View File

@ -22,7 +22,7 @@ import aiohttp_apispec # type: ignore[import]
from aiohttp.web import Application from aiohttp.web import Application
from typing import Any from typing import Any
from ahriman import version from ahriman import __version__
from ahriman.core.configuration import Configuration from ahriman.core.configuration import Configuration
@ -59,7 +59,7 @@ def _info() -> dict[str, Any]:
"name": "GPL3", "name": "GPL3",
"url": "https://raw.githubusercontent.com/arcan1s/ahriman/master/COPYING", "url": "https://raw.githubusercontent.com/arcan1s/ahriman/master/COPYING",
}, },
"version": version.__version__, "version": __version__,
} }

View File

@ -19,7 +19,7 @@
# #
from marshmallow import Schema, fields from marshmallow import Schema, fields
from ahriman import version from ahriman import __version__
from ahriman.web.schemas.counters_schema import CountersSchema from ahriman.web.schemas.counters_schema import CountersSchema
from ahriman.web.schemas.status_schema import StatusSchema from ahriman.web.schemas.status_schema import StatusSchema
@ -45,5 +45,5 @@ class InternalStatusSchema(Schema):
}) })
version = fields.String(required=True, metadata={ version = fields.String(required=True, metadata={
"description": "Repository version", "description": "Repository version",
"example": version.__version__, "example": __version__,
}) })

View File

@ -19,7 +19,7 @@
# #
from marshmallow import Schema, fields from marshmallow import Schema, fields
from ahriman import version from ahriman import __version__
from ahriman.web.schemas.package_properties_schema import PackagePropertiesSchema from ahriman.web.schemas.package_properties_schema import PackagePropertiesSchema
from ahriman.web.schemas.remote_schema import RemoteSchema from ahriman.web.schemas.remote_schema import RemoteSchema
@ -35,7 +35,7 @@ class PackageSchema(Schema):
}) })
version = fields.String(required=True, metadata={ version = fields.String(required=True, metadata={
"description": "Package version", "description": "Package version",
"example": version.__version__, "example": __version__,
}) })
remote = fields.Nested(RemoteSchema(), required=True, metadata={ remote = fields.Nested(RemoteSchema(), required=True, metadata={
"description": "Package remote properties", "description": "Package remote properties",

View File

@ -21,7 +21,7 @@ import aiohttp_apispec # type: ignore[import]
from aiohttp.web import HTTPBadRequest, HTTPNoContent, Response, json_response from aiohttp.web import HTTPBadRequest, HTTPNoContent, Response, json_response
from ahriman import version from ahriman import __version__
from ahriman.models.build_status import BuildStatusEnum from ahriman.models.build_status import BuildStatusEnum
from ahriman.models.counters import Counters from ahriman.models.counters import Counters
from ahriman.models.internal_status import InternalStatus from ahriman.models.internal_status import InternalStatus
@ -68,7 +68,8 @@ class StatusView(BaseView):
architecture=self.service.architecture, architecture=self.service.architecture,
packages=counters, packages=counters,
repository=self.service.repository.name, repository=self.service.repository.name,
version=version.__version__) version=__version__,
)
return json_response(status.view()) return json_response(status.view())

View File

@ -2,7 +2,7 @@ import argparse
from pytest_mock import MockerFixture from pytest_mock import MockerFixture
from ahriman import version from ahriman import __version__
from ahriman.application.handlers import ServiceUpdates from ahriman.application.handlers import ServiceUpdates
from ahriman.core.configuration import Configuration from ahriman.core.configuration import Configuration
from ahriman.core.repository import Repository from ahriman.core.repository import Repository
@ -46,7 +46,7 @@ def test_run_skip(args: argparse.Namespace, configuration: Configuration, reposi
""" """
must do not perform any actions if package is up-to-date must do not perform any actions if package is up-to-date
""" """
package_ahriman.version = f"{version.__version__}-1" package_ahriman.version = f"{__version__}-1"
args = _default_args(args) args = _default_args(args)
mocker.patch("ahriman.core.repository.Repository.load", return_value=repository) mocker.patch("ahriman.core.repository.Repository.load", return_value=repository)
mocker.patch("ahriman.models.package.Package.from_aur", return_value=package_ahriman) mocker.patch("ahriman.models.package.Package.from_aur", return_value=package_ahriman)

View File

@ -58,9 +58,11 @@ def test_run_verbose(args: argparse.Namespace, configuration: Configuration, rep
args = _default_args(args) args = _default_args(args)
args.verbose = True args.verbose = True
mocker.patch("ahriman.core.repository.Repository.load", return_value=repository) mocker.patch("ahriman.core.repository.Repository.load", return_value=repository)
read_mock = mocker.patch("pathlib.Path.read_text", return_value="")
print_mock = mocker.patch("ahriman.core.formatters.Printer.print") print_mock = mocker.patch("ahriman.core.formatters.Printer.print")
application_mock = mocker.patch("code.interact") application_mock = mocker.patch("code.interact")
Shell.run(args, "x86_64", configuration, report=False) Shell.run(args, "x86_64", configuration, report=False)
application_mock.assert_called_once_with(local=pytest.helpers.anyvar(int)) application_mock.assert_called_once_with(local=pytest.helpers.anyvar(int))
read_mock.assert_called_once_with(encoding="utf8")
print_mock.assert_called_once_with(verbose=False) print_mock.assert_called_once_with(verbose=False)

View File

@ -3,6 +3,7 @@ import argparse
from pathlib import Path from pathlib import Path
from pytest_mock import MockerFixture from pytest_mock import MockerFixture
from ahriman.application import ahriman
from ahriman.application.handlers import Handler from ahriman.application.handlers import Handler
from ahriman.models.action import Action from ahriman.models.action import Action
from ahriman.models.build_status import BuildStatusEnum from ahriman.models.build_status import BuildStatusEnum
@ -822,10 +823,6 @@ def test_run(args: argparse.Namespace, mocker: MockerFixture) -> None:
args.architecture = "x86_64" args.architecture = "x86_64"
args.handler = Handler args.handler = Handler
from ahriman.application import ahriman
mocker.patch.object(ahriman, "__name__", "__main__")
mocker.patch("argparse.ArgumentParser.parse_args", return_value=args) mocker.patch("argparse.ArgumentParser.parse_args", return_value=args)
exit_mock = mocker.patch("sys.exit")
ahriman.run() assert ahriman.run() == 1
exit_mock.assert_called_once_with(1)

View File

@ -6,7 +6,7 @@ from pathlib import Path
from pytest_mock import MockerFixture from pytest_mock import MockerFixture
from unittest.mock import call as MockCall from unittest.mock import call as MockCall
from ahriman import version from ahriman import __version__
from ahriman.application.lock import Lock from ahriman.application.lock import Lock
from ahriman.core.configuration import Configuration from ahriman.core.configuration import Configuration
from ahriman.core.exceptions import DuplicateRunError, UnsafeRunError from ahriman.core.exceptions import DuplicateRunError, UnsafeRunError
@ -33,7 +33,7 @@ def test_check_version(lock: Lock, mocker: MockerFixture) -> None:
must check version correctly must check version correctly
""" """
mocker.patch("ahriman.core.status.client.Client.get_internal", mocker.patch("ahriman.core.status.client.Client.get_internal",
return_value=InternalStatus(status=BuildStatus(), version=version.__version__)) return_value=InternalStatus(status=BuildStatus(), version=__version__))
logging_mock = mocker.patch("logging.Logger.warning") logging_mock = mocker.patch("logging.Logger.warning")
lock.check_version() lock.check_version()

View File

@ -3,7 +3,7 @@ import pytest
from unittest.mock import MagicMock, PropertyMock from unittest.mock import MagicMock, PropertyMock
from ahriman import version from ahriman import __version__
from ahriman.models.aur_package import AURPackage from ahriman.models.aur_package import AURPackage
from ahriman.models.build_status import BuildStatus, BuildStatusEnum from ahriman.models.build_status import BuildStatus, BuildStatusEnum
from ahriman.models.counters import Counters from ahriman.models.counters import Counters
@ -55,7 +55,7 @@ def internal_status(counters: Counters) -> InternalStatus:
return InternalStatus(status=BuildStatus(), return InternalStatus(status=BuildStatus(),
architecture="x86_64", architecture="x86_64",
packages=counters, packages=counters,
version=version.__version__, version=__version__,
repository="aur-clone") repository="aur-clone")

View File

@ -1,8 +0,0 @@
import ahriman.version as version
def test_version() -> None:
"""
version must not be empty
"""
assert getattr(version, "__version__")

View File

@ -3,7 +3,7 @@ import pytest
from aiohttp.web import Application from aiohttp.web import Application
from pytest_mock import MockerFixture from pytest_mock import MockerFixture
from ahriman import version from ahriman import __version__
from ahriman.web.apispec import _info, _security, _servers, setup_apispec from ahriman.web.apispec import _info, _security, _servers, setup_apispec
@ -13,7 +13,7 @@ def test_info() -> None:
""" """
info = _info() info = _info()
assert info["title"] == "ahriman" assert info["title"] == "ahriman"
assert info["version"] == version.__version__ assert info["version"] == __version__
def test_security() -> None: def test_security() -> None:

View File

@ -3,8 +3,7 @@ import pytest
from aiohttp.test_utils import TestClient from aiohttp.test_utils import TestClient
from pytest_mock import MockerFixture from pytest_mock import MockerFixture
import ahriman.version as version from ahriman import __version__
from ahriman.models.build_status import BuildStatusEnum from ahriman.models.build_status import BuildStatusEnum
from ahriman.models.internal_status import InternalStatus from ahriman.models.internal_status import InternalStatus
from ahriman.models.package import Package from ahriman.models.package import Package
@ -37,7 +36,7 @@ async def test_get(client: TestClient, package_ahriman: Package) -> None:
json = await response.json() json = await response.json()
assert not response_schema.validate(json) assert not response_schema.validate(json)
assert json["version"] == version.__version__ assert json["version"] == __version__
assert json["packages"] assert json["packages"]
assert json["packages"]["total"] == 1 assert json["packages"]["total"] == 1

View File

@ -40,9 +40,9 @@ allowlist_externals =
setenv = setenv =
SPHINX_APIDOC_OPTIONS=members,no-undoc-members,show-inheritance SPHINX_APIDOC_OPTIONS=members,no-undoc-members,show-inheritance
commands = commands =
/bin/bash -c 'shtab --shell bash --prefix ahriman --prog ahriman ahriman.application.ahriman._parser > ../docs/completions/bash/_ahriman' /bin/bash -c 'shtab --shell bash --prefix ahriman --prog ahriman ahriman.application.ahriman._parser > ../package/share/bash-completion/completions/_ahriman'
/bin/bash -c 'shtab --shell zsh --prefix ahriman --prog ahriman ahriman.application.ahriman._parser > ../docs/completions/zsh/_ahriman' /bin/bash -c 'shtab --shell zsh --prefix ahriman --prog ahriman ahriman.application.ahriman._parser > ../package/share/zsh/site-functions/_ahriman'
argparse-manpage --module ahriman.application.ahriman --function _parser --author "ahriman team" --project-name ahriman --author-email "" --url https://github.com/arcan1s/ahriman --output ../docs/ahriman.1 argparse-manpage --module ahriman.application.ahriman --function _parser --author "ahriman team" --project-name ahriman --author-email "" --url https://github.com/arcan1s/ahriman --output ../package/share/man/man1/ahriman.1
pydeps ahriman -o ../docs/ahriman-architecture.svg --no-config --no-show --cluster pydeps ahriman -o ../docs/ahriman-architecture.svg --no-config --no-show --cluster
sphinx-apidoc -o ../docs . sphinx-apidoc -o ../docs .