mirror of
https://github.com/Stone-Red-Code/dvc.git
synced 2026-11-02 07:18:25 +01:00
Add separate stream handler for error logging (#1292)
* Add separate stream handler for error logging * test stdout and stderr * review refactor, newline after test * mock instead of unittest.mock * use filter instead of lambda * add result checks * remove Logger pseudo-integration test, add direct test * tests, refactor, StringIO intercepts stdout and stderr messages * Check exact error message Co-Authored-By: pared <[email protected]> * Check exact non-error message Co-Authored-By: pared <[email protected]>
This commit is contained in:
committed by
Ruslan Kuprieiev
parent
bdf4095297
commit
4aab443675
+15
-4
@@ -54,11 +54,22 @@ class Logger(object):
|
||||
|
||||
@staticmethod
|
||||
def init():
|
||||
sh = logging.StreamHandler(sys.stdout)
|
||||
sh.setFormatter(logging.Formatter(Logger.FMT))
|
||||
sh.setLevel(logging.DEBUG)
|
||||
|
||||
Logger.logger().addHandler(sh)
|
||||
class LogLevelFilter(logging.Filter):
|
||||
def filter(self, record):
|
||||
return record.levelno <= logging.WARNING
|
||||
|
||||
sh_out = logging.StreamHandler(sys.stdout)
|
||||
sh_out.setFormatter(logging.Formatter(Logger.FMT))
|
||||
sh_out.setLevel(logging.DEBUG)
|
||||
sh_out.addFilter(LogLevelFilter())
|
||||
|
||||
sh_err = logging.StreamHandler(sys.stderr)
|
||||
sh_err.setFormatter(logging.Formatter(Logger.FMT))
|
||||
sh_err.setLevel(logging.ERROR)
|
||||
|
||||
Logger.logger().addHandler(sh_out)
|
||||
Logger.logger().addHandler(sh_err)
|
||||
Logger.set_level()
|
||||
|
||||
@staticmethod
|
||||
|
||||
@@ -1,13 +1,26 @@
|
||||
from mock import patch
|
||||
|
||||
try:
|
||||
from StringIO import StringIO
|
||||
except ImportError:
|
||||
from io import StringIO
|
||||
|
||||
import colorama
|
||||
import logging
|
||||
|
||||
from dvc.command.base import CmdBase
|
||||
from dvc.config import Config
|
||||
from dvc.logger import Logger
|
||||
from dvc.main import main
|
||||
|
||||
from tests.basic_env import TestDvc
|
||||
|
||||
|
||||
class StringContaining(str):
|
||||
def __eq__(self, other):
|
||||
return self in other
|
||||
|
||||
|
||||
class TestLogger(TestDvc):
|
||||
def test_config(self):
|
||||
Logger('debug')
|
||||
@@ -34,6 +47,28 @@ class TestLogger(TestDvc):
|
||||
# This is not a tty, so it should not colorize anything
|
||||
self.assertEqual(msg, name)
|
||||
|
||||
@patch('sys.stderr', new_callable=StringIO)
|
||||
@patch('sys.stdout', new_callable=StringIO)
|
||||
def test_stderr(self, mock_stdout, mock_stderr):
|
||||
error_message = 'error msg'
|
||||
Logger.init()
|
||||
Logger.error(error_message)
|
||||
self.assertEqual('', mock_stdout.getvalue())
|
||||
self.assertEqual('Error: {}\n\nHaving any troubles? '
|
||||
'Hit us up at dvc.org/support, we '
|
||||
'are always happy to help!\n'.format(error_message),
|
||||
mock_stderr.getvalue())
|
||||
|
||||
@patch('sys.stderr', new_callable=StringIO)
|
||||
@patch('sys.stdout', new_callable=StringIO)
|
||||
def test_stdout(self, mock_stdout, mock_stderr):
|
||||
non_error_message = 'non-error message'
|
||||
Logger.init()
|
||||
Logger.info(non_error_message)
|
||||
self.assertEqual('', mock_stderr.getvalue())
|
||||
self.assertEqual('{}\n'.format(non_error_message),
|
||||
mock_stdout.getvalue())
|
||||
|
||||
|
||||
class TestLoggerCLI(TestDvc):
|
||||
def test(self):
|
||||
|
||||
Reference in New Issue
Block a user