From c8cf4e20e5dc80edc7d381fe66b2bd3b211f0c21 Mon Sep 17 00:00:00 2001 From: George Muraru Date: Tue, 11 Feb 2020 19:43:49 +0200 Subject: [PATCH 1/3] Add function for custom format + tests --- friendlylog/colored_logger.py | 12 ++++++++++++ friendlylog/simple_logger.py | 13 +++++++++++++ tests/test_colored_logger.py | 19 ++++++++++++++++++- tests/test_simple_logger.py | 20 +++++++++++++++++++- 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/friendlylog/colored_logger.py b/friendlylog/colored_logger.py index d28ef7f..e1e3586 100644 --- a/friendlylog/colored_logger.py +++ b/friendlylog/colored_logger.py @@ -50,6 +50,18 @@ def format(self, record): return super(_ColoredFormatter, self).format(record) +def set_fmt(fmt_string): + assert isinstance(fmt_string, str), "fmt_string must be string" + + global inner_formatter + + formatter = _ColoredFormatter( + fmt=fmt_string + ) + inner_stream_handler.setFormatter(formatter) + inner_formatter = formatter + + _logger = logging.getLogger("friendlylog.ColoredLogger" + "-" + __name__) do_not_propagate(_logger) diff --git a/friendlylog/simple_logger.py b/friendlylog/simple_logger.py index 44d3dd6..cbb853c 100644 --- a/friendlylog/simple_logger.py +++ b/friendlylog/simple_logger.py @@ -32,6 +32,18 @@ def format(self, record): return super(_SimpleFormatter, self).format(record) +def set_fmt(fmt_string): + assert isinstance(fmt_string, str), "fmt_string must be string" + + global inner_formatter + + formatter = _SimpleFormatter( + fmt=fmt_string + ) + inner_stream_handler.setFormatter(formatter) + inner_formatter = formatter + + _logger = logging.getLogger("friendlyLog.SimpleLogger" + "-" + __name__) do_not_propagate(_logger) @@ -45,6 +57,7 @@ def format(self, record): _logger.setLevel(logging.DEBUG) + # Export functions and objects. inner_logger = _logger # Don't use this except if you know what you are doing. inner_stream_handler = _stream_handler # Same thing for this object. diff --git a/tests/test_colored_logger.py b/tests/test_colored_logger.py index 0d4bf02..13293bc 100644 --- a/tests/test_colored_logger.py +++ b/tests/test_colored_logger.py @@ -13,6 +13,8 @@ class TestColoredLogger(unittest.TestCase): def setUp(self): + self.saved_inner_formatter = logger.inner_formatter + # Remove handler that outputs to STDERR. logger.inner_logger.removeHandler(logger.inner_stream_handler) @@ -23,11 +25,12 @@ def setUp(self): self.log_capture = io.StringIO() handler = logging.StreamHandler(self.log_capture) handler.setFormatter(logger.inner_formatter) + logger.inner_stream_handler = handler logger.inner_logger.addHandler(handler) logger.setLevel(logging.DEBUG) def tearDown(self): - pass + logger.inner_formatter = self.saved_inner_formatter def last_line(self): log = self.log_capture.getvalue().splitlines() @@ -210,6 +213,20 @@ def test_non_str_logging(self): logger.critical({}) logger.warning(set([-1, 4])) + def test_set_custom_fmt(self): + dbg_lvls = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] + fmt_string = "[%(funcName)s] %(message)s" + logger.set_fmt(fmt_string) + + for level in dbg_lvls: + getattr(logger, level.lower())("Hello") + + last_n = self.last_n_lines(len(dbg_lvls)) + for level, log in zip(dbg_lvls, last_n): + self.assertRegex( + log, + r"\[test_set_custom_fmt\] .*{0}: Hello.*".format(level)) + if __name__ == '__main__': unittest.main() diff --git a/tests/test_simple_logger.py b/tests/test_simple_logger.py index 158fc27..525f6e6 100644 --- a/tests/test_simple_logger.py +++ b/tests/test_simple_logger.py @@ -6,6 +6,7 @@ import unittest from friendlylog import simple_logger as logger + from threading import Thread @@ -13,6 +14,8 @@ class TestSimpleLogger(unittest.TestCase): def setUp(self): + self.saved_inner_formatter = logger.inner_formatter + # Remove handler that outputs to STDERR. logger.inner_logger.removeHandler(logger.inner_stream_handler) @@ -24,10 +27,11 @@ def setUp(self): handler = logging.StreamHandler(self.log_capture) handler.setFormatter(logger.inner_formatter) logger.inner_logger.addHandler(handler) + logger.inner_stream_handler = handler logger.setLevel(logging.DEBUG) def tearDown(self): - pass + logger.inner_formatter = self.saved_inner_formatter def last_line(self): log = self.log_capture.getvalue().splitlines() @@ -204,6 +208,20 @@ def test_non_str_logging(self): logger.critical({}) logger.warning(set([-1, 4, 10, -100])) + def test_set_custom_fmt(self): + dbg_lvls = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"] + fmt_string = "[%(funcName)s] %(message)s" + logger.set_fmt(fmt_string) + + for level in dbg_lvls: + getattr(logger, level.lower())("Hello") + + last_n = self.last_n_lines(len(dbg_lvls)) + for level, log in zip(dbg_lvls, last_n): + self.assertEqual( + "[test_set_custom_fmt] {0}: Hello".format(level), + log) + if __name__ == '__main__': unittest.main() From 3d07cc745ca48b2b714e27b468af5738cda6ca3c Mon Sep 17 00:00:00 2001 From: George Muraru Date: Wed, 12 Feb 2020 09:48:21 +0200 Subject: [PATCH 2/3] Add unittest2 for py2 --- friendlylog/simple_logger.py | 1 - tests/test_colored_logger.py | 5 +++++ tests/test_simple_logger.py | 7 +++++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/friendlylog/simple_logger.py b/friendlylog/simple_logger.py index cbb853c..7118784 100644 --- a/friendlylog/simple_logger.py +++ b/friendlylog/simple_logger.py @@ -57,7 +57,6 @@ def set_fmt(fmt_string): _logger.setLevel(logging.DEBUG) - # Export functions and objects. inner_logger = _logger # Don't use this except if you know what you are doing. inner_stream_handler = _stream_handler # Same thing for this object. diff --git a/tests/test_colored_logger.py b/tests/test_colored_logger.py index 13293bc..34900dd 100644 --- a/tests/test_colored_logger.py +++ b/tests/test_colored_logger.py @@ -8,6 +8,11 @@ from friendlylog import colored_logger as logger from threading import Thread +if six.PY2: + import unittest2 as unittest +else: + import unittest + # Tests cannot be executed in parallel due to the hack in the setUp method. class TestColoredLogger(unittest.TestCase): diff --git a/tests/test_simple_logger.py b/tests/test_simple_logger.py index 525f6e6..b16dd7f 100644 --- a/tests/test_simple_logger.py +++ b/tests/test_simple_logger.py @@ -3,12 +3,15 @@ import random import six import string -import unittest from friendlylog import simple_logger as logger - from threading import Thread +if six.PY2: + import unittest2 as unittest +else: + import unittest + # Tests cannot be executed in parallel due to the hack in the setUp method. class TestSimpleLogger(unittest.TestCase): From 322705330589c7099b933339ec047cc9c46db648 Mon Sep 17 00:00:00 2001 From: George Muraru Date: Wed, 12 Feb 2020 10:07:04 +0200 Subject: [PATCH 3/3] Add extra requirements --- requirements.txt | 1 + setup.py | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/requirements.txt b/requirements.txt index c66deba..36482a2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,4 @@ codecov coverage pytest pytest-cov +unittest2; python_version <= "2.7" diff --git a/setup.py b/setup.py index c737022..1cb6e05 100644 --- a/setup.py +++ b/setup.py @@ -24,6 +24,11 @@ 'colored>=1.4.0', 'six>=1.12.0', ], + extras_require={ + ':python_version == "2.7"': [ + 'unittest2', + ], + }, classifiers=[ "Programming Language :: Python :: 3", "Programming Language :: Python :: 2",