Skip to content

Commit 538a373

Browse files
authored
Merge pull request #26 from blueyed/loglevel-opt
Add -l/--loglevel option
2 parents 79a4df5 + ff59d7c commit 538a373

File tree

4 files changed

+87
-8
lines changed

4 files changed

+87
-8
lines changed

.circleci/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ common: &common
1313
- v1-deps-{{ .Environment.CIRCLE_JOB }}-{{ checksum "setup.py" }}
1414
- v1-deps-
1515
- run: pip install --user tox
16-
- run: ~/.local/bin/tox
16+
- run: PYTEST_ADDOPTS=-vv ~/.local/bin/tox
1717
- run:
1818
name: upload coverage results for non-checkqa builds
1919
command: |

covimerage/cli.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import logging
12
import os
23

34
import click
@@ -9,12 +10,22 @@
910
from .utils import build_vim_profile_args, join_argv
1011

1112

13+
def default_loglevel():
14+
return logging.getLevelName(LOGGER.level).lower()
15+
16+
1217
@click.group(context_settings={'help_option_names': ['-h', '--help']})
1318
@click.version_option(__version__, '-V', '--version', prog_name='covimerage')
1419
@click.option('-v', '--verbose', count=True, help='Increase verbosity.')
1520
@click.option('-q', '--quiet', count=True, help='Decrease verbosity.')
16-
def main(verbose, quiet):
17-
if verbose - quiet:
21+
@click.option('-l', '--loglevel', show_default=True,
22+
help=('Set logging level explicitly (overrides -v/-q). '
23+
'[default: %s]' % (default_loglevel(),)),
24+
type=click.Choice(('error', 'warning', 'info', 'debug')))
25+
def main(verbose, quiet, loglevel):
26+
if loglevel:
27+
LOGGER.setLevel(loglevel.upper())
28+
elif verbose - quiet:
1829
LOGGER.setLevel(max(10, LOGGER.level - (verbose - quiet) * 10))
1930

2031

tests/test_logging.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
from imp import reload
2+
import logging
3+
14
import pytest
25

36

@@ -17,3 +20,67 @@ def test_logging_error_causes_exception(capfd):
1720
"Message: 'Wrong:'",
1821
"Arguments: ('no %s',)"]
1922
assert 'TypeError: not all arguments converted during string formatting' in lines # noqa: E501
23+
24+
25+
def test_loglevel(mocker, runner, devnull):
26+
from covimerage import cli
27+
28+
logger = cli.LOGGER
29+
30+
m = mocker.patch.object(logger, 'setLevel')
31+
32+
for level in ['error', 'warning', 'info', 'debug']:
33+
result = runner.invoke(cli.main, [
34+
'--loglevel', level,
35+
'report', '--nonexistingoption'])
36+
assert result.output.splitlines() == [
37+
'Error: no such option: --nonexistingoption']
38+
assert result.exit_code == 2
39+
40+
level_name = level.upper()
41+
assert m.call_args_list[-1] == mocker.call(level_name)
42+
43+
# -v should not override -l.
44+
m.reset_mock()
45+
result = runner.invoke(cli.main, [
46+
'-l', 'warning', '-vvv',
47+
'report', '--nonexistingoption'])
48+
assert result.output.splitlines() == [
49+
'Error: no such option: --nonexistingoption']
50+
assert result.exit_code == 2
51+
assert m.call_args_list == [mocker.call('WARNING')]
52+
53+
# -q should not override -l.
54+
m.reset_mock()
55+
result = runner.invoke(cli.main, [
56+
'-l', 'warning', '-qqq',
57+
'report', '--nonexistingoption'])
58+
assert result.output.splitlines() == [
59+
'Error: no such option: --nonexistingoption']
60+
assert result.exit_code == 2
61+
assert m.call_args_list == [mocker.call('WARNING')]
62+
63+
64+
@pytest.mark.parametrize('default', (None, 'INFO', 'WARNING'))
65+
def test_loglevel_default(default, mocker, runner):
66+
from covimerage import cli
67+
from covimerage.logger import LOGGER as logger
68+
69+
if default:
70+
mocker.patch.object(logger, 'level', getattr(logging, default))
71+
else:
72+
default = 'INFO'
73+
reload(cli)
74+
75+
result = runner.invoke(cli.main, ['-h'])
76+
77+
assert logging.getLevelName(logger.level) == default
78+
lines = result.output.splitlines()
79+
idx = lines.index(' -l, --loglevel [error|warning|info|debug]')
80+
assert idx
81+
indent = ' ' * 34
82+
assert lines[idx+1:idx+3] == [
83+
indent + 'Set logging level explicitly (overrides',
84+
indent + '-v/-q). [default: %s]' % (default.lower(),),
85+
]
86+
assert result.exit_code == 0

tests/test_main.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ def test_profile_repr_lines():
2222
assert repr(p.lines) == '{%r: {}}' % s
2323
assert repr(s) == "Script(path='script-path', sourced_count=None)"
2424

25-
l = Line('line1')
26-
s.lines[1] = l
27-
assert repr(p.lines) == ('{%r: {1: %r}}' % (s, l))
25+
line = Line('line1')
26+
s.lines[1] = line
27+
assert repr(p.lines) == ('{%r: {1: %r}}' % (s, line))
2828

2929

3030
def test_profile_fname_or_fobj(caplog, devnull):
@@ -60,8 +60,9 @@ def test_parse_count_and_times():
6060
def test_line():
6161
from covimerage import Line
6262

63-
l = Line(' 1 0.000005 Foo')
64-
assert repr(l) == "Line(line=' 1 0.000005 Foo', count=None, total_time=None, self_time=None)" # noqa
63+
line = ' 1 0.000005 Foo'
64+
assert repr(Line(line)) == 'Line(line=%r, count=None, total_time=None, self_time=None)' % ( # noqa:E501
65+
line)
6566

6667

6768
def test_profile_parse():

0 commit comments

Comments
 (0)