loguru/tests/test_configure.py

219 lines
5.1 KiB
Python

import sys
import pytest
from loguru import logger
def test_handlers(capsys, tmp_path):
file = tmp_path / "test.log"
handlers = [
{"sink": file, "format": "FileSink: {message}"},
{"sink": sys.stdout, "format": "StdoutSink: {message}"},
]
logger.configure(handlers=handlers)
logger.debug("test")
out, err = capsys.readouterr()
assert file.read_text() == "FileSink: test\n"
assert out == "StdoutSink: test\n"
assert err == ""
def test_levels(writer):
levels = [{"name": "my_level", "icon": "X", "no": 12}, {"name": "DEBUG", "icon": "!"}]
logger.add(writer, format="{level.no}|{level.name}|{level.icon}|{message}")
logger.configure(levels=levels)
logger.log("my_level", "test")
logger.debug("no bug")
assert writer.read() == ("12|my_level|X|test\n" "10|DEBUG|!|no bug\n")
def test_extra(writer):
extra = {"a": 1, "b": 9}
logger.add(writer, format="{extra[a]} {extra[b]}")
logger.configure(extra=extra)
logger.debug("")
assert writer.read() == "1 9\n"
def test_patcher(writer):
logger.add(writer, format="{extra[a]} {extra[b]}")
logger.configure(patcher=lambda record: record["extra"].update(a=1, b=2))
logger.debug("")
assert writer.read() == "1 2\n"
def test_activation(writer):
activation = [("tests", False), ("tests.test_configure", True)]
logger.add(writer, format="{message}")
logger.configure(activation=activation)
logger.debug("Logging")
assert writer.read() == "Logging\n"
def test_dict_unpacking(writer):
config = {
"handlers": [{"sink": writer, "format": "{level.no} - {extra[x]} {extra[z]} - {message}"}],
"levels": [{"name": "test", "no": 30}],
"extra": {"x": 1, "y": 2, "z": 3},
}
logger.debug("NOPE")
logger.configure(**config)
logger.log("test", "Yes!")
assert writer.read() == "30 - 1 3 - Yes!\n"
def test_returned_ids(capsys):
ids = logger.configure(
handlers=[
{"sink": sys.stdout, "format": "{message}"},
{"sink": sys.stderr, "format": "{message}"},
]
)
assert len(ids) == 2
logger.debug("Test")
out, err = capsys.readouterr()
assert out == "Test\n"
assert err == "Test\n"
for i in ids:
logger.remove(i)
logger.debug("Nope")
out, err = capsys.readouterr()
assert out == ""
assert err == ""
def test_dont_reset_by_default(writer):
logger.configure(extra={"a": 1}, patcher=lambda r: r["extra"].update(b=2))
logger.level("b", no=30)
logger.add(writer, format="{level} {extra[a]} {extra[b]} {message}")
logger.configure()
logger.log("b", "Test")
assert writer.read() == "b 1 2 Test\n"
def test_reset_previous_handlers(writer):
logger.add(writer, format="{message}")
logger.configure(handlers=[])
logger.debug("Test")
assert writer.read() == ""
def test_reset_previous_extra(writer):
logger.configure(extra={"a": 123})
logger.add(writer, format="{extra[a]}", catch=False)
logger.configure(extra={})
with pytest.raises(KeyError):
logger.debug("Nope")
def test_reset_previous_patcher(writer):
logger.configure(patcher=lambda r: r.update(a=123))
logger.add(writer, format="{extra[a]}", catch=False)
logger.configure(patcher=lambda r: None)
with pytest.raises(KeyError):
logger.debug("Nope")
def test_dont_reset_previous_levels(writer):
logger.level("abc", no=30)
logger.configure(levels=[])
logger.add(writer, format="{level} {message}")
logger.log("abc", "Test")
assert writer.read() == "abc Test\n"
def test_configure_handler_using_new_level(writer):
logger.configure(
levels=[{"name": "CONF_LVL", "no": 33, "icon": "", "color": ""}],
handlers=[
{"sink": writer, "level": "CONF_LVL", "format": "{level.name} {level.no} {message}"}
],
)
logger.log("CONF_LVL", "Custom")
assert writer.read() == "CONF_LVL 33 Custom\n"
def test_configure_filter_using_new_level(writer):
logger.configure(
levels=[{"name": "CONF_LVL_2", "no": 33, "icon": "", "color": ""}],
handlers=[
{"sink": writer, "level": 0, "filter": {"tests": "CONF_LVL_2"}, "format": "{message}"}
],
)
logger.log("CONF_LVL_2", "Custom")
assert writer.read() == "Custom\n"
def test_configure_before_bind(writer):
logger.configure(extra={"a": "default_a", "b": "default_b"})
logger.add(writer, format="{extra[a]} {extra[b]} {message}")
logger.debug("init")
logger_a = logger.bind(a="A")
logger_b = logger.bind(b="B")
logger_a.debug("aaa")
logger_b.debug("bbb")
assert writer.read() == ("default_a default_b init\n" "A default_b aaa\n" "default_a B bbb\n")
def test_configure_after_bind(writer):
logger_a = logger.bind(a="A")
logger_b = logger.bind(b="B")
logger.configure(extra={"a": "default_a", "b": "default_b"})
logger.add(writer, format="{extra[a]} {extra[b]} {message}")
logger.debug("init")
logger_a.debug("aaa")
logger_b.debug("bbb")
assert writer.read() == ("default_a default_b init\n" "A default_b aaa\n" "default_a B bbb\n")