fix descriptions

This commit is contained in:
Evgenii Alekseev 2022-04-06 01:48:03 +03:00
parent 8f18ead4cc
commit 4990ce4198
20 changed files with 55 additions and 38 deletions

View File

@ -67,7 +67,8 @@ class Packages(Properties):
:param without_dependencies: if set, dependency check will be disabled :param without_dependencies: if set, dependency check will be disabled
""" """
package = Package.load(source, PackageSource.AUR, self.repository.pacman, self.repository.aur_url) package = Package.load(source, PackageSource.AUR, self.repository.pacman, self.repository.aur_url)
self.repository.database.build_queue_insert(package)
self.database.build_queue_insert(package)
with tmpdir() as local_path: with tmpdir() as local_path:
Sources.load(local_path, package.git_url, self.database.patches_get(package.base)) Sources.load(local_path, package.git_url, self.database.patches_get(package.base))
@ -93,7 +94,8 @@ class Packages(Properties):
cache_dir = self.repository.paths.cache_for(package.base) cache_dir = self.repository.paths.cache_for(package.base)
shutil.copytree(Path(source), cache_dir) # copy package to store in caches shutil.copytree(Path(source), cache_dir) # copy package to store in caches
Sources.init(cache_dir) # we need to run init command in directory where we do have permissions Sources.init(cache_dir) # we need to run init command in directory where we do have permissions
self.repository.database.build_queue_insert(package)
self.database.build_queue_insert(package)
self._process_dependencies(cache_dir, known_packages, without_dependencies) self._process_dependencies(cache_dir, known_packages, without_dependencies)

View File

@ -20,9 +20,9 @@
from sqlite3 import Connection from sqlite3 import Connection
from ahriman.core.configuration import Configuration from ahriman.core.configuration import Configuration
from ahriman.core.database.data.package_statuses import migrate_package_statuses
from ahriman.core.database.data.patches import migrate_patches from ahriman.core.database.data.patches import migrate_patches
from ahriman.core.database.data.users import migrate_users_data from ahriman.core.database.data.users import migrate_users_data
from ahriman.core.database.data.package_statuses import migrate_package_statuses
from ahriman.models.migration_result import MigrationResult from ahriman.models.migration_result import MigrationResult
from ahriman.models.repository_paths import RepositoryPaths from ahriman.models.repository_paths import RepositoryPaths
@ -37,7 +37,7 @@ def migrate_data(result: MigrationResult, connection: Connection,
:param paths: repository paths instance :param paths: repository paths instance
""" """
# initial data migration # initial data migration
if result.old_version == 0: if result.old_version <= 0:
migrate_package_statuses(connection, paths) migrate_package_statuses(connection, paths)
migrate_users_data(connection, configuration)
migrate_patches(connection, paths) migrate_patches(connection, paths)
migrate_users_data(connection, configuration)

View File

@ -17,8 +17,6 @@
# 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 __future__ import annotations
from sqlite3 import Connection from sqlite3 import Connection
from typing import List, Optional from typing import List, Optional
@ -75,7 +73,7 @@ class AuthOperations(Operations):
def user_update(self, user: User) -> None: def user_update(self, user: User) -> None:
""" """
get user by username update user by username
:param user: user descriptor :param user: user descriptor
""" """
def run(connection: Connection) -> None: def run(connection: Connection) -> None:

View File

@ -22,6 +22,7 @@ from __future__ import annotations
import json import json
import sqlite3 import sqlite3
from pathlib import Path
from sqlite3 import Connection from sqlite3 import Connection
from typing import Type from typing import Type
@ -46,10 +47,20 @@ class SQLite(AuthOperations, BuildOperations, PackageOperations, PatchOperations
:param configuration: configuration instance :param configuration: configuration instance
:return: fully initialized instance of the database :return: fully initialized instance of the database
""" """
database = cls(configuration.getpath("settings", "database")) path = cls.database_path(configuration)
database = cls(path)
database.init(configuration) database.init(configuration)
return database return database
@staticmethod
def database_path(configuration: Configuration) -> Path:
"""
read database from configuration
:param configuration: configuration instance
:return: database path according to the configuration
"""
return configuration.getpath("settings", "database")
def init(self, configuration: Configuration) -> None: def init(self, configuration: Configuration) -> None:
""" """
perform database migrations perform database migrations

View File

@ -35,6 +35,7 @@ class PackageSource(Enum):
:cvar Directory: source is a directory which contains packages :cvar Directory: source is a directory which contains packages
:cvar Local: source is locally stored PKGBUILD :cvar Local: source is locally stored PKGBUILD
:cvar Remote: source is remote (http, ftp etc) link :cvar Remote: source is remote (http, ftp etc) link
:cvar Repository: source is official repository
""" """
Auto = "auto" Auto = "auto"
@ -43,6 +44,7 @@ class PackageSource(Enum):
Directory = "directory" Directory = "directory"
Local = "local" Local = "local"
Remote = "remote" Remote = "remote"
Repository = "repository"
def resolve(self, source: str) -> PackageSource: def resolve(self, source: str) -> PackageSource:
""" """

View File

@ -21,7 +21,7 @@ def test_finalize(application_packages: Packages) -> None:
def test_known_packages(application_packages: Packages) -> None: def test_known_packages(application_packages: Packages) -> None:
""" """
must raise NotImplemented for missing finalize method must raise NotImplemented for missing known_packages method
""" """
with pytest.raises(NotImplementedError): with pytest.raises(NotImplementedError):
application_packages._known_packages() application_packages._known_packages()
@ -42,17 +42,17 @@ def test_add_aur(application_packages: Packages, package_ahriman: Package, mocke
must add package from AUR must add package from AUR
""" """
mocker.patch("ahriman.models.package.Package.load", return_value=package_ahriman) mocker.patch("ahriman.models.package.Package.load", return_value=package_ahriman)
insert_mock = mocker.patch("ahriman.core.database.sqlite.SQLite.build_queue_insert")
load_mock = mocker.patch("ahriman.core.build_tools.sources.Sources.load") load_mock = mocker.patch("ahriman.core.build_tools.sources.Sources.load")
dependencies_mock = mocker.patch("ahriman.application.application.packages.Packages._process_dependencies") dependencies_mock = mocker.patch("ahriman.application.application.packages.Packages._process_dependencies")
build_queue_mock = mocker.patch("ahriman.core.database.sqlite.SQLite.build_queue_insert")
application_packages._add_aur(package_ahriman.base, set(), False) application_packages._add_aur(package_ahriman.base, set(), False)
insert_mock.assert_called_once_with(package_ahriman)
load_mock.assert_called_once_with( load_mock.assert_called_once_with(
pytest.helpers.anyvar(int), pytest.helpers.anyvar(int),
package_ahriman.git_url, package_ahriman.git_url,
pytest.helpers.anyvar(int)) pytest.helpers.anyvar(int))
dependencies_mock.assert_called_once_with(pytest.helpers.anyvar(int), set(), False) dependencies_mock.assert_called_once_with(pytest.helpers.anyvar(int), set(), False)
build_queue_mock.assert_called_once_with(package_ahriman)
def test_add_directory(application_packages: Packages, package_ahriman: Package, mocker: MockerFixture) -> None: def test_add_directory(application_packages: Packages, package_ahriman: Package, mocker: MockerFixture) -> None:
@ -75,16 +75,16 @@ def test_add_local(application_packages: Packages, package_ahriman: Package, moc
""" """
mocker.patch("ahriman.models.package.Package.load", return_value=package_ahriman) mocker.patch("ahriman.models.package.Package.load", return_value=package_ahriman)
init_mock = mocker.patch("ahriman.core.build_tools.sources.Sources.init") init_mock = mocker.patch("ahriman.core.build_tools.sources.Sources.init")
insert_mock = mocker.patch("ahriman.core.database.sqlite.SQLite.build_queue_insert")
copytree_mock = mocker.patch("shutil.copytree") copytree_mock = mocker.patch("shutil.copytree")
dependencies_mock = mocker.patch("ahriman.application.application.packages.Packages._process_dependencies") dependencies_mock = mocker.patch("ahriman.application.application.packages.Packages._process_dependencies")
build_queue_mock = mocker.patch("ahriman.core.database.sqlite.SQLite.build_queue_insert")
application_packages._add_local(package_ahriman.base, set(), False) application_packages._add_local(package_ahriman.base, set(), False)
copytree_mock.assert_called_once_with( copytree_mock.assert_called_once_with(
Path(package_ahriman.base), application_packages.repository.paths.cache_for(package_ahriman.base)) Path(package_ahriman.base), application_packages.repository.paths.cache_for(package_ahriman.base))
init_mock.assert_called_once_with(application_packages.repository.paths.cache_for(package_ahriman.base)) init_mock.assert_called_once_with(application_packages.repository.paths.cache_for(package_ahriman.base))
insert_mock.assert_called_once_with(package_ahriman)
dependencies_mock.assert_called_once_with(pytest.helpers.anyvar(int), set(), False) dependencies_mock.assert_called_once_with(pytest.helpers.anyvar(int), set(), False)
build_queue_mock.assert_called_once_with(package_ahriman)
def test_add_remote(application_packages: Packages, package_description_ahriman: PackageDescription, def test_add_remote(application_packages: Packages, package_description_ahriman: PackageDescription,

View File

@ -41,7 +41,7 @@ def test_run(args: argparse.Namespace, configuration: Configuration, aur_package
def test_run_empty_exception(args: argparse.Namespace, configuration: Configuration, mocker: MockerFixture) -> None: def test_run_empty_exception(args: argparse.Namespace, configuration: Configuration, mocker: MockerFixture) -> None:
""" """
must run command must raise ExitCode exception on empty result list
""" """
args = _default_args(args) args = _default_args(args)
args.exit_code = True args.exit_code = True

View File

@ -62,7 +62,7 @@ def test_run_empty_exception(args: argparse.Namespace, configuration: Configurat
def test_run_verbose(args: argparse.Namespace, configuration: Configuration, package_ahriman: Package, def test_run_verbose(args: argparse.Namespace, configuration: Configuration, package_ahriman: Package,
mocker: MockerFixture) -> None: mocker: MockerFixture) -> None:
""" """
must run command must run command with detailed info
""" """
args = _default_args(args) args = _default_args(args)
args.info = True args.info = True

View File

@ -59,7 +59,7 @@ def test_check_unsafe() -> None:
def test_check_unsafe_safe() -> None: def test_check_unsafe_safe() -> None:
""" """
must check if command is unsafe must check if command is safe
""" """
UnsafeCommands.check_unsafe("package-status", ["repo-clean"], _parser()) UnsafeCommands.check_unsafe("package-status", ["repo-clean"], _parser())

View File

@ -34,7 +34,7 @@ def test_run(args: argparse.Namespace, configuration: Configuration, mocker: Moc
def test_disallow_auto_architecture_run() -> None: def test_disallow_auto_architecture_run() -> None:
""" """
must not allow multi architecture run must not allow auto architecture run
""" """
assert not Web.ALLOW_AUTO_ARCHITECTURE_RUN assert not Web.ALLOW_AUTO_ARCHITECTURE_RUN

View File

@ -264,9 +264,7 @@ def repository_paths(configuration: Configuration) -> RepositoryPaths:
:param configuration: configuration fixture :param configuration: configuration fixture
:return: repository paths test instance :return: repository paths test instance
""" """
return RepositoryPaths( return configuration.repository_paths
architecture="x86_64",
root=configuration.getpath("repository", "root"))
@pytest.fixture @pytest.fixture

View File

@ -13,10 +13,12 @@ def test_migrate_data_initial(connection: Connection, configuration: Configurati
must perform initial migration must perform initial migration
""" """
packages = mocker.patch("ahriman.core.database.data.migrate_package_statuses") packages = mocker.patch("ahriman.core.database.data.migrate_package_statuses")
patches = mocker.patch("ahriman.core.database.data.migrate_patches")
users = mocker.patch("ahriman.core.database.data.migrate_users_data") users = mocker.patch("ahriman.core.database.data.migrate_users_data")
migrate_data(MigrationResult(old_version=0, new_version=900), connection, configuration, repository_paths) migrate_data(MigrationResult(old_version=0, new_version=900), connection, configuration, repository_paths)
packages.assert_called_once_with(connection, repository_paths) packages.assert_called_once_with(connection, repository_paths)
patches.assert_called_once_with(connection, repository_paths)
users.assert_called_once_with(connection, configuration) users.assert_called_once_with(connection, configuration)

View File

@ -21,7 +21,7 @@ def test_sign_ascii(package_ahriman: Package) -> None:
def test_sign_utf8(package_ahriman: Package) -> None: def test_sign_utf8(package_ahriman: Package) -> None:
""" """
must correctly generate sign in ascii must correctly generate sign in utf8
""" """
with pytest.raises(UnicodeEncodeError): with pytest.raises(UnicodeEncodeError):
BuildPrinter(package_ahriman, is_success=True, use_utf=True).title().encode("ascii") BuildPrinter(package_ahriman, is_success=True, use_utf=True).title().encode("ascii")
@ -31,6 +31,6 @@ def test_sign_utf8(package_ahriman: Package) -> None:
def test_title(package_ahriman: Package) -> None: def test_title(package_ahriman: Package) -> None:
""" """
must return non empty title must return non-empty title
""" """
assert BuildPrinter(package_ahriman, is_success=True, use_utf=False).title() is not None assert BuildPrinter(package_ahriman, is_success=True, use_utf=False).title() is not None

View File

@ -115,7 +115,7 @@ def test_generate_with_built_and_full_path(
result: Result, result: Result,
mocker: MockerFixture) -> None: mocker: MockerFixture) -> None:
""" """
must generate report with built packages must generate report with built packages and full packages lists
""" """
send_mock = mocker.patch("ahriman.core.report.email.Email._send") send_mock = mocker.patch("ahriman.core.report.email.Email._send")

View File

@ -64,6 +64,8 @@ def test_process_remove_base(executor: Executor, package_ahriman: Package, mocke
mocker.patch("ahriman.core.repository.executor.Executor.packages", return_value=[package_ahriman]) mocker.patch("ahriman.core.repository.executor.Executor.packages", return_value=[package_ahriman])
tree_clear_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.tree_clear") tree_clear_mock = mocker.patch("ahriman.models.repository_paths.RepositoryPaths.tree_clear")
repo_remove_mock = mocker.patch("ahriman.core.alpm.repo.Repo.remove") repo_remove_mock = mocker.patch("ahriman.core.alpm.repo.Repo.remove")
build_queue_mock = mocker.patch("ahriman.core.database.sqlite.SQLite.build_queue_clear")
patches_mock = mocker.patch("ahriman.core.database.sqlite.SQLite.patches_remove")
status_client_mock = mocker.patch("ahriman.core.status.client.Client.remove") status_client_mock = mocker.patch("ahriman.core.status.client.Client.remove")
executor.process_remove([package_ahriman.base]) executor.process_remove([package_ahriman.base])
@ -72,6 +74,8 @@ def test_process_remove_base(executor: Executor, package_ahriman: Package, mocke
package_ahriman.base, package_ahriman.packages[package_ahriman.base].filepath) package_ahriman.base, package_ahriman.packages[package_ahriman.base].filepath)
# must update status and remove package files # must update status and remove package files
tree_clear_mock.assert_called_once_with(package_ahriman.base) tree_clear_mock.assert_called_once_with(package_ahriman.base)
build_queue_mock.assert_called_once_with(package_ahriman.base)
patches_mock.assert_called_once_with(package_ahriman.base)
status_client_mock.assert_called_once_with(package_ahriman.base) status_client_mock.assert_called_once_with(package_ahriman.base)

View File

@ -26,7 +26,7 @@ def test_load_full_client(configuration: Configuration) -> None:
def test_load_full_client_from_address(configuration: Configuration) -> None: def test_load_full_client_from_address(configuration: Configuration) -> None:
""" """
must load full client if settings set must load full client by using address
""" """
configuration.set_option("web", "address", "http://localhost:8080") configuration.set_option("web", "address", "http://localhost:8080")
assert isinstance(Client.load(configuration), WebClient) assert isinstance(Client.load(configuration), WebClient)

View File

@ -23,7 +23,7 @@ def test_ahriman_url(web_client: WebClient) -> None:
def test_status_url(web_client: WebClient) -> None: def test_status_url(web_client: WebClient) -> None:
""" """
must generate service status url correctly must generate package status url correctly
""" """
assert web_client._status_url.startswith(web_client.address) assert web_client._status_url.startswith(web_client.address)
assert web_client._status_url.endswith("/status-api/v1/status") assert web_client._status_url.endswith("/status-api/v1/status")
@ -67,7 +67,7 @@ def test_login_failed(web_client: WebClient, user: User, mocker: MockerFixture)
def test_login_failed_http_error(web_client: WebClient, user: User, mocker: MockerFixture) -> None: def test_login_failed_http_error(web_client: WebClient, user: User, mocker: MockerFixture) -> None:
""" """
must suppress any exception happened during login must suppress HTTP exception happened during login
""" """
web_client.user = user web_client.user = user
mocker.patch("requests.Session.post", side_effect=requests.exceptions.HTTPError()) mocker.patch("requests.Session.post", side_effect=requests.exceptions.HTTPError())
@ -112,7 +112,7 @@ def test_add_failed(web_client: WebClient, package_ahriman: Package, mocker: Moc
def test_add_failed_http_error(web_client: WebClient, package_ahriman: Package, mocker: MockerFixture) -> None: def test_add_failed_http_error(web_client: WebClient, package_ahriman: Package, mocker: MockerFixture) -> None:
""" """
must suppress any exception happened during addition must suppress HTTP exception happened during addition
""" """
mocker.patch("requests.Session.post", side_effect=requests.exceptions.HTTPError()) mocker.patch("requests.Session.post", side_effect=requests.exceptions.HTTPError())
web_client.add(package_ahriman, BuildStatusEnum.Unknown) web_client.add(package_ahriman, BuildStatusEnum.Unknown)
@ -145,7 +145,7 @@ def test_get_failed(web_client: WebClient, mocker: MockerFixture) -> None:
def test_get_failed_http_error(web_client: WebClient, mocker: MockerFixture) -> None: def test_get_failed_http_error(web_client: WebClient, mocker: MockerFixture) -> None:
""" """
must suppress any exception happened during status getting must suppress HTTP exception happened during status getting
""" """
mocker.patch("requests.Session.get", side_effect=requests.exceptions.HTTPError()) mocker.patch("requests.Session.get", side_effect=requests.exceptions.HTTPError())
assert web_client.get(None) == [] assert web_client.get(None) == []
@ -193,7 +193,7 @@ def test_get_internal_failed(web_client: WebClient, mocker: MockerFixture) -> No
def test_get_internal_failed_http_error(web_client: WebClient, mocker: MockerFixture) -> None: def test_get_internal_failed_http_error(web_client: WebClient, mocker: MockerFixture) -> None:
""" """
must suppress any exception happened during web service status getting must suppress HTTP exception happened during web service status getting
""" """
mocker.patch("requests.Session.get", side_effect=requests.exceptions.HTTPError()) mocker.patch("requests.Session.get", side_effect=requests.exceptions.HTTPError())
assert web_client.get_internal() == InternalStatus() assert web_client.get_internal() == InternalStatus()
@ -224,7 +224,7 @@ def test_get_self_failed(web_client: WebClient, mocker: MockerFixture) -> None:
def test_get_self_failed_http_error(web_client: WebClient, mocker: MockerFixture) -> None: def test_get_self_failed_http_error(web_client: WebClient, mocker: MockerFixture) -> None:
""" """
must suppress any exception happened during service status getting must suppress HTTP exception happened during service status getting
""" """
mocker.patch("requests.Session.get", side_effect=requests.exceptions.HTTPError()) mocker.patch("requests.Session.get", side_effect=requests.exceptions.HTTPError())
assert web_client.get_self().status == BuildStatusEnum.Unknown assert web_client.get_self().status == BuildStatusEnum.Unknown
@ -250,7 +250,7 @@ def test_remove_failed(web_client: WebClient, package_ahriman: Package, mocker:
def test_remove_failed_http_error(web_client: WebClient, package_ahriman: Package, mocker: MockerFixture) -> None: def test_remove_failed_http_error(web_client: WebClient, package_ahriman: Package, mocker: MockerFixture) -> None:
""" """
must suppress any exception happened during removal must suppress HTTP exception happened during removal
""" """
mocker.patch("requests.Session.delete", side_effect=requests.exceptions.HTTPError()) mocker.patch("requests.Session.delete", side_effect=requests.exceptions.HTTPError())
web_client.remove(package_ahriman.base) web_client.remove(package_ahriman.base)
@ -277,7 +277,7 @@ def test_update_failed(web_client: WebClient, package_ahriman: Package, mocker:
def test_update_failed_http_error(web_client: WebClient, package_ahriman: Package, mocker: MockerFixture) -> None: def test_update_failed_http_error(web_client: WebClient, package_ahriman: Package, mocker: MockerFixture) -> None:
""" """
must suppress any exception happened during update must suppress HTTP exception happened during update
""" """
mocker.patch("requests.Session.post", side_effect=requests.exceptions.HTTPError()) mocker.patch("requests.Session.post", side_effect=requests.exceptions.HTTPError())
web_client.update(package_ahriman.base, BuildStatusEnum.Unknown) web_client.update(package_ahriman.base, BuildStatusEnum.Unknown)
@ -304,7 +304,7 @@ def test_update_self_failed(web_client: WebClient, mocker: MockerFixture) -> Non
def test_update_self_failed_http_error(web_client: WebClient, mocker: MockerFixture) -> None: def test_update_self_failed_http_error(web_client: WebClient, mocker: MockerFixture) -> None:
""" """
must suppress any exception happened during service update must suppress HTTP exception happened during service update
""" """
mocker.patch("requests.Session.post", side_effect=requests.exceptions.HTTPError()) mocker.patch("requests.Session.post", side_effect=requests.exceptions.HTTPError())
web_client.update_self(BuildStatusEnum.Unknown) web_client.update_self(BuildStatusEnum.Unknown)

View File

@ -231,7 +231,7 @@ def test_gettype_from_section_with_architecture(configuration: Configuration) ->
def test_gettype_from_section_no_section(configuration: Configuration) -> None: def test_gettype_from_section_no_section(configuration: Configuration) -> None:
""" """
must extract type from section name with architecture must raise NoSectionError during type extraction from section name with architecture
""" """
# technically rsync:x86_64 is valid section # technically rsync:x86_64 is valid section
# but in current configuration it must be considered as missing section # but in current configuration it must be considered as missing section

View File

@ -19,7 +19,7 @@ def test_build_status_enum_badges_color() -> None:
def test_build_status_enum_bootstrap_color() -> None: def test_build_status_enum_bootstrap_color() -> None:
""" """
status color must be one of shields.io supported status color must be one of bootstrap supported
""" """
SUPPORTED_COLORS = [ SUPPORTED_COLORS = [
"primary", "secondary", "success", "danger", "warning", "info", "light", "dark" "primary", "secondary", "success", "danger", "warning", "info", "light", "dark"

View File

@ -281,7 +281,7 @@ def test_actual_version_srcinfo_failed(package_tpacpi_bat_git: Package, reposito
def test_actual_version_vcs_failed(package_tpacpi_bat_git: Package, repository_paths: RepositoryPaths, def test_actual_version_vcs_failed(package_tpacpi_bat_git: Package, repository_paths: RepositoryPaths,
mocker: MockerFixture) -> None: mocker: MockerFixture) -> None:
""" """
must return same version in case if exception occurred must return same version in case if there are errors during parse
""" """
mocker.patch("pathlib.Path.read_text", return_value="") mocker.patch("pathlib.Path.read_text", return_value="")
mocker.patch("ahriman.models.package.parse_srcinfo", return_value=({"packages": {}}, ["an error"])) mocker.patch("ahriman.models.package.parse_srcinfo", return_value=({"packages": {}}, ["an error"]))
@ -292,7 +292,7 @@ def test_actual_version_vcs_failed(package_tpacpi_bat_git: Package, repository_p
def test_full_depends(package_ahriman: Package, package_python_schedule: Package, pyalpm_package_ahriman: MagicMock, def test_full_depends(package_ahriman: Package, package_python_schedule: Package, pyalpm_package_ahriman: MagicMock,
pyalpm_handle: MagicMock, mocker: MockerFixture) -> None: pyalpm_handle: MagicMock) -> None:
""" """
must extract all dependencies from the package must extract all dependencies from the package
""" """