Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/cruiz/commands/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,18 @@

from attr.converters import to_bool

from cruiz.exceptions import RecipeInspectionError
from cruiz.recipe.logs.command import CommandListWidgetItem, RecipeCommandHistoryWidget
from cruiz.settings.managers.namedlocalcache import NamedLocalCacheSettingsReader

import cruizlib.workers.api as workers_api
from cruizlib.constants import DEFAULT_CACHE_NAME
from cruizlib.exceptions import RecipeInspectionError
from cruizlib.interop.commandparameters import CommandParameters
from cruizlib.workers.metarequestconaninvocation import MetaRequestConanInvocation
from cruizlib.workers.utils.text2html import text_to_html

from .conanenv import get_conan_env
from .conaninvocation import ConanInvocation
from .metarequestconaninvocation import MetaRequestConanInvocation

if typing.TYPE_CHECKING:
from cruizlib.interop.packagebinaryparameters import PackageBinaryParameters
Expand Down
2 changes: 1 addition & 1 deletion src/cruiz/load_recipe/loadrecipewizard.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@
import cruiz.globals
from cruiz.commands.context import managed_conan_context
from cruiz.commands.logdetails import LogDetails
from cruiz.exceptions import RecipeAlreadyOpenError, RecipeDoesNotExistError
from cruiz.pyside6.load_recipe_wizard import Ui_LoadRecipeWizard
from cruiz.settings.managers.recipe import RecipeSettings, RecipeSettingsReader

from cruizlib.constants import DEFAULT_CACHE_NAME
from cruizlib.exceptions import RecipeAlreadyOpenError, RecipeDoesNotExistError

if typing.TYPE_CHECKING:
from cruiz.recipe.recipe import Recipe
Expand Down
12 changes: 6 additions & 6 deletions src/cruiz/mainwindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,6 @@
from PySide6 import QtCore, QtGui, QtWidgets

import cruiz.globals
from cruiz.exceptions import (
InconsistentSettingsError,
RecipeAlreadyOpenError,
RecipeDoesNotExistError,
RecipeInspectionError,
)
from cruiz.load_recipe.loadrecipewizard import LoadRecipeWizard
from cruiz.manage_local_cache import ManageLocalCachesDialog
from cruiz.recipe.recipewidget import RecipeWidget
Expand Down Expand Up @@ -52,6 +46,12 @@
import cruizlib.globals
import cruizlib.runcommands
from cruizlib.environ import EnvironSaver
from cruizlib.exceptions import (
InconsistentSettingsError,
RecipeAlreadyOpenError,
RecipeDoesNotExistError,
RecipeInspectionError,
)


import psutil
Expand Down
2 changes: 1 addition & 1 deletion src/cruiz/recipe/recipewidget.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import cruiz.revealonfilesystem
from cruiz.commands.context import ConanContext
from cruiz.commands.logdetails import LogDetails
from cruiz.exceptions import RecipeInspectionError
from cruiz.manage_local_cache import ManageLocalCachesDialog
from cruiz.model.graphaslistmodel import DependenciesListModel, DependenciesTreeModel
from cruiz.pyside6.recipe_window import Ui_RecipeWindow
Expand All @@ -34,6 +33,7 @@

import cruizlib.globals
import cruizlib.workers.api as workers_api
from cruizlib.exceptions import RecipeInspectionError
from cruizlib.interop.commandparameters import CommandParameters
from cruizlib.interop.dependencygraph import dependencygraph_from_node_dependees
from cruizlib.workers.utils.text2html import text_to_html
Expand Down
2 changes: 1 addition & 1 deletion src/cruiz/recipe/toolbars/command.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

from PySide6 import QtCore, QtGui, QtWidgets

from cruiz.exceptions import RecipeInspectionError
from cruiz.settings.managers.compilercachepreferences import CompilerCacheSettingsReader
from cruiz.settings.managers.generalpreferences import GeneralSettingsReader
from cruiz.settings.managers.recipe import RecipeSettings, RecipeSettingsReader
Expand All @@ -18,6 +17,7 @@
import cruizlib.workers.api as workers_api
from cruizlib.constants import BuildFeatureConstants, CompilerCacheTypes
from cruizlib.environ import EnvironSaver
from cruizlib.exceptions import RecipeInspectionError
from cruizlib.interop.commandparameters import CommandParameters

IS_CONAN_V1 = cruizlib.globals.CONAN_MAJOR_VERSION == 1
Expand Down
2 changes: 1 addition & 1 deletion src/cruiz/settings/managers/recipe.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

from PySide6 import QtCore

from cruiz.exceptions import InconsistentSettingsError
from cruizlib.exceptions import InconsistentSettingsError

from .basesettings import (
BaseSettings,
Expand Down
17 changes: 17 additions & 0 deletions src/cruiz/exceptions.py → src/cruizlib/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

"""Exception types."""

import typing


class RecipeInspectionError(Exception):
"""An error inspecting the recipe has occurred."""
Expand All @@ -17,3 +19,18 @@ class RecipeAlreadyOpenError(Exception):

class InconsistentSettingsError(Exception):
"""An error indicating some settings have been discovered that are inconsistent."""


class MetaCommandFailureError(Exception):
"""An error coming from a meta command."""

def __init__(
self,
message: str,
exception_type_name: str,
exception_traceback: typing.List[str],
) -> None:
"""Initialise the exception object."""
super().__init__(message, exception_type_name, exception_traceback)
self.exception_type_name = exception_type_name
self.exception_traceback = exception_traceback
18 changes: 17 additions & 1 deletion src/cruizlib/workers/api/v1/meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,14 @@

from attrs.converters import to_bool

from cruizlib.interop.message import End, Failure, Stderr, Success
from cruizlib.interop.message import (
ConanLogMessage,
End,
Failure,
Stderr,
Stdout,
Success,
)
from cruizlib.interop.pod import ConanHook, ConanRemote

from . import worker
Expand Down Expand Up @@ -478,6 +485,15 @@ def invoke(
elif request == "create_default_profile":
_create_default_profile(api)
result = None
elif request == "test_stdout":
reply_queue.put(Stdout("Testing Stdout messaging"))
result = None
elif request == "test_stderr":
reply_queue.put(Stderr("Testing Stderr messaging"))
result = None
elif request == "test_conanlog":
reply_queue.put(ConanLogMessage("Testing ConanLog messaging"))
result = None
else:
raise ValueError(
f"Meta command request not implemented: '{request}' "
Expand Down
17 changes: 15 additions & 2 deletions src/cruizlib/workers/api/v2/meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,14 @@
import typing
import urllib.parse

from cruizlib.interop.message import End, Failure, Success
from cruizlib.interop.message import (
ConanLogMessage,
End,
Failure,
Stderr,
Stdout,
Success,
)
from cruizlib.interop.pod import ConanHook, ConanRemote

from . import worker
Expand Down Expand Up @@ -153,7 +160,7 @@ def _interop_profile_meta(
return details


# pylint: disable=too-many-branches
# pylint: disable=too-many-branches,too-many-statements
def invoke(
request_queue: MultiProcessingStringJoinableQueueType,
reply_queue: MultiProcessingMessageQueueType,
Expand Down Expand Up @@ -196,6 +203,12 @@ def invoke(
result = _interop_get_config_envvars(api)
elif request == "profile_meta":
result = _interop_profile_meta(api, request_params["name"][0])
elif request == "test_stdout":
reply_queue.put(Stdout("Testing Stdout messaging"))
elif request == "test_stderr":
reply_queue.put(Stderr("Testing Stderr messaging"))
elif request == "test_conanlog":
reply_queue.put(ConanLogMessage("Testing ConanLog messaging"))
else:
raise ValueError(
f"Meta command request not implemented: '{request}' "
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

import cruizlib.workers.api as workers_api
from cruizlib.dumpobjecttypes import dump_object_types
from cruizlib.exceptions import MetaCommandFailureError
from cruizlib.interop.commandparameters import CommandParameters
from cruizlib.interop.message import (
ConanLogMessage,
Expand All @@ -30,7 +31,7 @@
)

if typing.TYPE_CHECKING:
from .logdetails import LogDetails
from cruiz.commands.logdetails import LogDetails


logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -100,11 +101,12 @@ def _invoke_conan_process(self, params: CommandParameters) -> None:
def __check_for_conan_leakage(entry: typing.Any = None) -> None:
if "conans" not in sys.modules:
return
if entry:
# remaining code is exceptional and fatal, so coverage is not needed
if entry: # pragma: no cover
logger.critical("Conan has leaked into message queue object dump:")
dump_object_types(entry, loglevel="CRITICAL")
logger.critical("Conan has leaked into cruiz")
sys.exit(1)
logger.critical("Conan has leaked into cruiz") # pragma: no cover
sys.exit(1) # pragma: no cover

def request_data(
self,
Expand Down Expand Up @@ -156,8 +158,15 @@ def request_data(
assert self._reply_queue.empty()
self.active = False
if response is not None:
if isinstance(reply, Success):
return (response.payload, None) # type: ignore
if isinstance(reply, Failure):
return (None, response.exception) # type: ignore
raise RuntimeError("No success message")
if isinstance(response, Success):
return (response.payload, None)
if isinstance(response, Failure):
return (
None,
MetaCommandFailureError(
response.message,
response.exception_type_name,
response.exception_traceback,
),
)
raise RuntimeError("No identified response") # pragma: no cover
20 changes: 20 additions & 0 deletions tests/workers/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import stat
import sys
import typing
from unittest.mock import MagicMock

import cruizlib.workers.api as workers_api
from cruizlib.globals import CONAN_MAJOR_VERSION, CONAN_VERSION_COMPONENTS
Expand All @@ -25,6 +26,7 @@
Stdout,
Success,
)
from cruizlib.workers.metarequestconaninvocation import MetaRequestConanInvocation

# pylint: disable=wrong-import-order
import pytest
Expand Down Expand Up @@ -189,6 +191,24 @@ def meta(
process.close()


@pytest.fixture()
def cruiz_meta(
conan_local_cache: typing.Dict[str, str],
) -> typing.Generator[typing.Tuple[MetaRequestConanInvocation, MagicMock], None, None]:
"""Use cruiz's meta setup and shutdown."""
log_details_mock = MagicMock()
meta_invoc = MetaRequestConanInvocation(
parent=None, # type: ignore[arg-type]
added_environment=conan_local_cache,
removed_environment=[],
log_details=log_details_mock,
)

yield meta_invoc, log_details_mock

meta_invoc.close()


@pytest.fixture()
def reply_queue_fixture() -> SingleprocessReplyQueueFixture:
"""
Expand Down
60 changes: 60 additions & 0 deletions tests/workers/test_meta_cruiz.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
"""Test the cruiz meta worker functionality."""

from __future__ import annotations

import typing

from cruizlib.exceptions import MetaCommandFailureError
from cruizlib.globals import CONAN_MAJOR_VERSION, CONAN_VERSION_COMPONENTS

if typing.TYPE_CHECKING:
from unittest.mock import MagicMock

from cruizlib.workers.metarequestconaninvocation import MetaRequestConanInvocation


def test_meta_get_version(
cruiz_meta: typing.Tuple[MetaRequestConanInvocation, MagicMock],
) -> None:
"""Via the meta worker: Get the version."""
meta_request, _ = cruiz_meta
reply_payload, reply_exception = meta_request.request_data("version")
if CONAN_MAJOR_VERSION == 1:
assert reply_exception is None
assert isinstance(reply_payload, str)
assert reply_payload == ".".join([str(i) for i in CONAN_VERSION_COMPONENTS])
else:
assert reply_payload is None
assert isinstance(reply_exception, MetaCommandFailureError)
assert reply_exception.exception_type_name == "ValueError"
assert str(reply_exception).startswith('("Meta command request not implemented')


def test_meta_stdout(
cruiz_meta: typing.Tuple[MetaRequestConanInvocation, MagicMock],
) -> None:
"""Via the meta worker: Test stdout messages."""
meta_request, log_details_mock = cruiz_meta
reply_payload, _ = meta_request.request_data("test_stdout")
assert reply_payload is None
log_details_mock.stdout.assert_called_once_with("Testing Stdout messaging")


def test_meta_stderr(
cruiz_meta: typing.Tuple[MetaRequestConanInvocation, MagicMock],
) -> None:
"""Via the meta worker: Test stderr messages."""
meta_request, log_details_mock = cruiz_meta
reply_payload, _ = meta_request.request_data("test_stderr")
assert reply_payload is None
log_details_mock.stderr.assert_called_once_with("Testing Stderr messaging")


def test_meta_conanlogmessage(
cruiz_meta: typing.Tuple[MetaRequestConanInvocation, MagicMock],
) -> None:
"""Via the meta worker: Test ConanLog messages."""
meta_request, log_details_mock = cruiz_meta
reply_payload, _ = meta_request.request_data("test_conanlog")
assert reply_payload is None
log_details_mock.conan_log.assert_called_once_with("Testing ConanLog messaging")