diff --git a/src/ahriman/core/log/lazy_logging.py b/src/ahriman/core/log/lazy_logging.py index b082b39c..a51541bd 100644 --- a/src/ahriman/core/log/lazy_logging.py +++ b/src/ahriman/core/log/lazy_logging.py @@ -99,3 +99,24 @@ class LazyLogging: yield finally: self._package_logger_reset() + + @contextlib.contextmanager + def suppress_logging(self, log_level: int = logging.WARNING) -> Generator[None, None, None]: + """ + silence log messages in context + + Args: + log_level(int, optional): the highest log level to keep (Default value = logging.WARNING) + + Examples: + This function is designed to be used to suppress all log messages in context, e.g.: + + >>> with self.suppress_logging(): + >>> do_some_noisy_actions() + """ + current_level = self.logger.manager.disable + try: + logging.disable(log_level) + yield + finally: + logging.disable(current_level) diff --git a/src/ahriman/models/package.py b/src/ahriman/models/package.py index b3ced65b..8776a733 100644 --- a/src/ahriman/models/package.py +++ b/src/ahriman/models/package.py @@ -429,13 +429,14 @@ class Package(LazyLogging): task = Task(self, configuration, repository_id.architecture, paths) try: - # create fresh chroot environment, fetch sources and - automagically - update PKGBUILD - task.init(paths.cache_for(self.base), [], None) - task.build(paths.cache_for(self.base), dry_run=True) + with self.suppress_logging(): + # create fresh chroot environment, fetch sources and - automagically - update PKGBUILD + task.init(paths.cache_for(self.base), [], None) + task.build(paths.cache_for(self.base), dry_run=True) - pkgbuild = Pkgbuild.from_file(paths.cache_for(self.base) / "PKGBUILD") + pkgbuild = Pkgbuild.from_file(paths.cache_for(self.base) / "PKGBUILD") - return full_version(pkgbuild.get("epoch"), pkgbuild["pkgver"], pkgbuild["pkgrel"]) + return full_version(pkgbuild.get("epoch"), pkgbuild["pkgver"], pkgbuild["pkgrel"]) except Exception: self.logger.exception("cannot determine version of VCS package") finally: diff --git a/tests/ahriman/core/log/test_lazy_logging.py b/tests/ahriman/core/log/test_lazy_logging.py index acd5521b..a1afaf41 100644 --- a/tests/ahriman/core/log/test_lazy_logging.py +++ b/tests/ahriman/core/log/test_lazy_logging.py @@ -2,6 +2,7 @@ import logging import pytest from pytest_mock import MockerFixture +from unittest.mock import call as MockCall from ahriman.core.alpm.repo import Repo from ahriman.core.build_tools.task import Task @@ -10,6 +11,17 @@ from ahriman.models.log_record_id import LogRecordId from ahriman.models.package import Package +def test_logger(database: SQLite, repo: Repo) -> None: + """ + must set logger attribute + """ + assert database.logger + assert database.logger.name == "sql" + + assert repo.logger + assert repo.logger.name == "ahriman.core.alpm.repo.Repo" + + def test_logger_name(database: SQLite, repo: Repo, task_ahriman: Task) -> None: """ must correctly generate logger name @@ -77,12 +89,11 @@ def test_in_package_context_failed(database: SQLite, package_ahriman: Package, m reset_mock.assert_called_once_with() -def test_logger(database: SQLite, repo: Repo) -> None: +def test_suppress_logging(database: SQLite, mocker: MockerFixture) -> None: """ - must set logger attribute + must temporary disable log messages """ - assert database.logger - assert database.logger.name == "sql" - - assert repo.logger - assert repo.logger.name == "ahriman.core.alpm.repo.Repo" + disable_mock = mocker.patch("ahriman.core.log.lazy_logging.logging.disable") + with database.suppress_logging(): + pass + disable_mock.assert_has_calls([MockCall(logging.WARNING), MockCall(logging.NOTSET)])