def addStoryLogHandlerToLogger(self, level):
        """Add dedicated log handler to some package loggers (hence all its
        children, too) for routing logs into the GUI widget.
        NOTE: We MUST NOT change log levels of the loggers themselves here!

        :param level: The log level
        :return: None
        """
        packagesToChange = (__name__, "storage", "story", "network",
                            "selenium")
        self.storyLogHandler.setLevel(level)

        for package in packagesToChange:
            tmpLogger = clog.getLogger(
                package)  # Side effect: sets new logger if not exists!
            tmpLogger.removeHandler(
                self.storyLogHandler)  # removing only works by reference!
            tmpLogger.addHandler(self.storyLogHandler)
Esempio n. 2
0
    def test_setReleaseDate_shouldLogOnError(self):
        # Given
        sut = Product()
        givenDatetime = dtt.datetime(2020, 1, 30, 15, 40, 00)
        invalidTimezone = "very/invalid"

        loggerName = "shop.product"
        loggerUnderTest = clog.getLogger(loggerName)
        expectedLogLevel = "ERROR"
        expectedPartOfLogMessage = "Could not set product release date"

        # When
        with self.assertLogs(loggerUnderTest, level=expectedLogLevel) as tlog:
            sut.setReleaseDate(givenDatetime, timezone=invalidTimezone)

        # Then
        self.assertEqual(1, len(tlog.output))  # expect one single log message in array
        self.assertIn(f"{expectedLogLevel}:{loggerName}:{expectedPartOfLogMessage}", tlog.output[0])
# actionBundleDao.py

import pathlib as pl
import typing as tp

import debug.logger as clog
import storage.fileDao as filedao
from config.base import APP_USERDATA_DIR
from story.actionBundle import ActionBundle
from story.actionBundleConverter import DictActionBundleConverter

logger = clog.getLogger(__name__)


class JSONActionBundleDao(filedao.JsonFileDao):
    _DEFAULT_DIR: tp.ClassVar[pl.Path] = APP_USERDATA_DIR / "actionbundles"
    _TABLE_NAME: tp.ClassVar[str] = "ActionBundles"

    def __init__(self, filepath: str = None):
        if not filepath:
            thePath = self._DEFAULT_DIR
        else:
            thePath = pl.Path(filepath)
        super().__init__(path=thePath, table=self._TABLE_NAME)

    def loadAll(self) -> ActionBundle:
        """
        :return: An instance of class ActionBundle if loading succeeds
        :raises:
        """
        dataDict = None