Compare commits

..

4 Commits

Author SHA1 Message Date
28afcde3fa docs: mock cryptography import due to build errors 2023-09-05 18:37:46 +03:00
62ae3ada4a feat: show help message if no command specified 2023-09-05 18:26:22 +03:00
6fcb5449c3 feat: add ability to skip migrations
This feature can be used in order to handle conflicting migrations
2023-09-02 14:30:50 +03:00
74209acc21 ci: publish docker image to ghcr 2023-08-28 03:21:25 +03:00
14 changed files with 111 additions and 68 deletions

View File

@ -1,42 +0,0 @@
name: docker image
on:
push:
branches: [ master ]
tags:
- '*'
- '!*rc*'
jobs:
docker-image:
runs-on: ubuntu-latest
steps:
- name: extract docker metadata
id: meta
uses: docker/metadata-action@v3
with:
images: |
arcan1s/ahriman
tags: |
type=ref,event=tag
type=edge
- name: setup QEMU
uses: docker/setup-qemu-action@v1
- name: setup docker buildx
uses: docker/setup-buildx-action@v1
- name: login to docker hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: build an image and push
uses: docker/build-push-action@v2
with:
push: true
tags: ${{ steps.meta.outputs.tags }}

51
.github/workflows/docker.yml vendored Normal file
View File

@ -0,0 +1,51 @@
name: Docker image
on:
push:
branches: [ master ]
tags:
- '*'
- '!*rc*'
jobs:
docker-image:
runs-on: ubuntu-latest
permissions:
packages: write
steps:
- uses: docker/setup-qemu-action@v2
- uses: docker/setup-buildx-action@v2
- name: Login to docker hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to github container registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract docker metadata
id: meta
uses: docker/metadata-action@v3
with:
images: |
arcan1s/ahriman
ghcr.io/arcan1s/ahriman
tags: |
type=semver,pattern={{raw}}
type=edge
- name: Build an image and push
uses: docker/build-push-action@v4
with:
push: true
tags: ${{ steps.meta.outputs.tags }}

View File

@ -1,4 +1,4 @@
name: release
name: Release
on:
push:
@ -11,25 +11,25 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: extract version
- name: Extract version
id: version
run: echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/}
- name: create changelog
- name: Create changelog
id: changelog
uses: jaywcjlove/changelog-generator@main
with:
token: ${{ secrets.GITHUB_TOKEN }}
filter: 'Release \d+\.\d+\.\d+'
- name: create archive
- name: Create archive
run: make archive
env:
VERSION: ${{ steps.version.outputs.VERSION }}
- name: release
- name: Publish release
uses: softprops/action-gh-release@v1
with:
body: |

View File

@ -1,4 +1,4 @@
name: setup
name: Setup
on:
push:
@ -18,9 +18,9 @@ jobs:
options: --privileged -w /build
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: setup the minimal service in arch linux container
- name: Setup the minimal service in arch linux container
run: .github/workflows/setup.sh minimal
run-setup:
@ -34,7 +34,7 @@ jobs:
options: --privileged -w /build
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: setup the service in arch linux container
- name: Setup the service in arch linux container
run: .github/workflows/setup.sh

View File

@ -1,4 +1,4 @@
name: tests
name: Tests
on:
push:
@ -18,7 +18,7 @@ jobs:
options: -w /build
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: run check and tests in arch linux container
- name: Run check and tests in arch linux container
run: .github/workflows/tests.sh

View File

@ -1,8 +1,8 @@
# ArcH linux ReposItory MANager
[![tests status](https://github.com/arcan1s/ahriman/actions/workflows/run-tests.yml/badge.svg)](https://github.com/arcan1s/ahriman/actions/workflows/run-tests.yml)
[![setup status](https://github.com/arcan1s/ahriman/actions/workflows/run-setup.yml/badge.svg)](https://github.com/arcan1s/ahriman/actions/workflows/run-setup.yml)
[![Docker Image Version (latest semver)](https://img.shields.io/docker/v/arcan1s/ahriman?label=docker%20image)](https://hub.docker.com/r/arcan1s/ahriman)
[![tests status](https://github.com/arcan1s/ahriman/actions/workflows/tests.yml/badge.svg)](https://github.com/arcan1s/ahriman/actions/workflows/run-tests.yml)
[![setup status](https://github.com/arcan1s/ahriman/actions/workflows/setup.yml/badge.svg)](https://github.com/arcan1s/ahriman/actions/workflows/run-setup.yml)
[![Docker Image Version (latest semver)](https://img.shields.io/docker/v/arcan1s/ahriman?label=Docker%20image)](https://hub.docker.com/r/arcan1s/ahriman)
[![CodeFactor](https://www.codefactor.io/repository/github/arcan1s/ahriman/badge)](https://www.codefactor.io/repository/github/arcan1s/ahriman)
[![Documentation Status](https://readthedocs.org/projects/ahriman/badge/?version=latest)](https://ahriman.readthedocs.io/?badge=latest)

View File

@ -85,7 +85,7 @@ autoclass_content = "both"
autodoc_member_order = "groupwise"
autodoc_mock_imports = ["pyalpm"]
autodoc_mock_imports = ["cryptography", "pyalpm"]
autodoc_default_options = {
"no-undoc-members": True,

View File

@ -34,8 +34,9 @@ It will check current settings on common errors and compare configuration with k
Base configuration settings.
* ``include`` - path to directory with configuration files overrides, string, required.
* ``apply_migrations`` - perform migrations on application start, boolean, optional, default ``yes``. Useful if you are using git version. Note, however, that this option must be changed only if you know what to do and going to handle migrations automatically.
* ``database`` - path to SQLite database, string, required.
* ``include`` - path to directory with configuration files overrides, string, required.
* ``logging`` - path to logging configuration, string, required. Check ``logging.ini`` for reference.
* ``suppress_http_log_errors`` - suppress http log errors, boolean, optional, default ``no``. If set to ``yes``, any http log errors (e.g. if web server is not available, but http logging is enabled) will be suppressed.

View File

@ -1,6 +1,7 @@
[settings]
include = ahriman.ini.d
logging = ahriman.ini.d/logging.ini
apply_migrations = yes
database = /var/lib/ahriman/ahriman.db
suppress_http_log_errors = yes

View File

@ -90,7 +90,7 @@ def _parser() -> argparse.ArgumentParser:
type=int, default=-1)
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")
_set_aur_search_parser(subparsers)
_set_help_parser(subparsers)
@ -1016,5 +1016,8 @@ def run() -> int:
args_parser = _parser()
args = args_parser.parse_args()
if args.command is None: # in case of empty command we would like to print help message
args_parser.exit(status=2, message=args_parser.format_help())
handler: handlers.Handler = args.handler
return handler.execute(args)

View File

@ -30,17 +30,21 @@ CONFIGURATION_SCHEMA: ConfigurationSchema = {
"settings": {
"type": "dict",
"schema": {
"include": {
"type": "path",
"coerce": "absolute_path",
"required": True,
"path_exists": True,
"apply_migrations": {
"type": "boolean",
"coerce": "boolean",
},
"database": {
"type": "path",
"coerce": "absolute_path",
"required": True,
},
"include": {
"type": "path",
"coerce": "absolute_path",
"required": True,
"path_exists": True,
},
"logging": {
"type": "path",
"coerce": "absolute_path",

View File

@ -87,5 +87,6 @@ class SQLite(AuthOperations, BuildOperations, LogsOperations, PackageOperations,
paths = configuration.repository_paths
self.with_connection(lambda connection: Migrations.migrate(connection, configuration))
if configuration.getboolean("settings", "apply_migrations", fallback=True):
self.with_connection(lambda connection: Migrations.migrate(connection, configuration))
paths.chown(self.path)

View File

@ -1,4 +1,5 @@
import argparse
import pytest
from pathlib import Path
from pytest_mock import MockerFixture
@ -841,8 +842,20 @@ def test_run(args: argparse.Namespace, mocker: MockerFixture) -> None:
application must be run
"""
args.architecture = "x86_64"
args.command = ""
args.handler = Handler
mocker.patch("argparse.ArgumentParser.parse_args", return_value=args)
assert ahriman.run() == 1
def test_run_without_command(args: argparse.Namespace, mocker: MockerFixture) -> None:
"""
must show help message if run without commands
"""
args.command = None
mocker.patch("argparse.ArgumentParser.parse_args", return_value=args)
with pytest.raises(SystemExit):
ahriman.run()

View File

@ -22,3 +22,14 @@ def test_init(database: SQLite, configuration: Configuration, mocker: MockerFixt
migrate_schema_mock = mocker.patch("ahriman.core.database.migrations.Migrations.migrate")
database.init(configuration)
migrate_schema_mock.assert_called_once_with(pytest.helpers.anyvar(int), configuration)
def test_init_skip_migration(database: SQLite, configuration: Configuration, mocker: MockerFixture) -> None:
"""
must skip migrations if option is set
"""
configuration.set_option("settings", "apply_migrations", "no")
migrate_schema_mock = mocker.patch("ahriman.core.database.migrations.Migrations.migrate")
database.init(configuration)
migrate_schema_mock.assert_not_called()