Skip to content

Commit 78e5dac

Browse files
committed
Wrap commands in __main__ to prepend 'covimerage: ' prefix with errors.
1 parent bb84cc9 commit 78e5dac

File tree

4 files changed

+70
-32
lines changed

4 files changed

+70
-32
lines changed

covimerage/__main__.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,39 @@
1-
if __name__ == '__main__':
1+
def wrap_for_errormsg(f, *args, **kwargs):
2+
import logging
3+
from .logger import handler
4+
5+
handler.setFormatter(logging.Formatter('covimerage: %(message)s'))
6+
7+
try:
8+
f(*args, standalone_mode=False, **kwargs)
9+
except Exception as exc:
10+
from click.exceptions import ClickException
11+
if isinstance(exc, ClickException):
12+
import re
13+
import sys
14+
from click.utils import echo
15+
from ._compat import StringIO
16+
17+
# Use `show()` to get extended message with UsageErrors.
18+
out = StringIO()
19+
exc.show(file=out)
20+
out.seek(0)
21+
msg = re.sub("^Error: ", "covimerage: Error: ", out.read(),
22+
flags=re.MULTILINE)
23+
echo(msg, err=True, nl=False)
24+
sys.exit(exc.exit_code)
25+
raise
26+
27+
28+
def main():
229
from .cli import main
30+
wrap_for_errormsg(main.main, prog_name='covimerage')
31+
32+
33+
def run():
34+
from .cli import run
35+
wrap_for_errormsg(run.main, prog_name='covimerage-run')
36+
37+
38+
if __name__ == '__main__':
339
main()

covimerage/logger.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
import logging
22
import sys
33

4-
logger = logging.getLogger('covimerage')
5-
logger.setLevel(logging.INFO)
6-
74

85
class AlwaysStderrHandler(logging.StreamHandler):
96
def __init__(self, level=logging.NOTSET):
@@ -18,4 +15,7 @@ def handleError(self, record):
1815
raise Exception('Internal logging error')
1916

2017

21-
logger.addHandler(AlwaysStderrHandler())
18+
handler = AlwaysStderrHandler()
19+
logger = logging.getLogger('covimerage')
20+
logger.setLevel(logging.INFO)
21+
logger.addHandler(handler)

setup.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ def run(self):
7373
url='https://github.com/Vimjas/covimerage',
7474
packages=['covimerage'],
7575
entry_points={
76-
'console_scripts': ['covimerage=covimerage.cli:main'],
76+
'console_scripts': [
77+
'covimerage=covimerage.__main__:main',
78+
],
7779
},
7880
use_scm_version={
7981
'write_to': 'covimerage/__version__.py',

tests/test_cli.py

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
def test_dunder_main_run(capfd):
1616
assert call([sys.executable, '-m', 'covimerage']) == 0
1717
out, err = capfd.readouterr()
18-
assert out.startswith('Usage: __main__')
18+
assert out.startswith('Usage: covimerage')
1919

2020

2121
def test_dunder_main_run_help(capfd):
@@ -67,8 +67,8 @@ def test_cli_run_with_args_fd(capfd):
6767
out, err = capfd.readouterr()
6868
lines = err.splitlines()
6969
assert lines == [
70-
"Running cmd: echo -- --no-profile %sMARKER --cmd 'profile start /doesnotexist' --cmd 'profile! file ./*' (in {})".format(os.getcwd()),
71-
'Error: The profile file (/doesnotexist) has not been created.']
70+
"covimerage: Running cmd: echo -- --no-profile %sMARKER --cmd 'profile start /doesnotexist' --cmd 'profile! file ./*' (in {})".format(os.getcwd()),
71+
'covimerage: Error: The profile file (/doesnotexist) has not been created.']
7272
assert ret == 1
7373

7474

@@ -259,9 +259,9 @@ def test_cli_run_report_fd(capfd, tmpdir, devnull):
259259
'----------------------------------------------------------------',
260260
'tests/test_plugin/conditional_function.vim 13 5 62%']
261261
assert err.splitlines() == [
262-
'Running cmd: true (in %s)' % str(os.getcwd()),
263-
'Parsing profile file %s.' % tmp_profile_fname,
264-
'Writing coverage file %s.' % data_file]
262+
'covimerage: Running cmd: true (in %s)' % str(os.getcwd()),
263+
'covimerage: Parsing profile file %s.' % tmp_profile_fname,
264+
'covimerage: Writing coverage file %s.' % data_file]
265265

266266
# Same, but to some file.
267267
ofname = str(tmpdir.join('ofname'))
@@ -270,9 +270,9 @@ def test_cli_run_report_fd(capfd, tmpdir, devnull):
270270
assert exit_code == 0, err
271271
assert out == ''
272272
assert err.splitlines() == [
273-
'Running cmd: true (in %s)' % str(os.getcwd()),
274-
'Parsing profile file %s.' % tmp_profile_fname,
275-
'Writing coverage file %s.' % data_file]
273+
'covimerage: Running cmd: true (in %s)' % str(os.getcwd()),
274+
'covimerage: Parsing profile file %s.' % tmp_profile_fname,
275+
'covimerage: Writing coverage file %s.' % data_file]
276276
assert open(ofname).read().splitlines() == [
277277
'Name Stmts Miss Cover',
278278
'----------------------------------------------------------------',
@@ -295,14 +295,14 @@ def test_cli_call(capfd):
295295
# click after 6.7 (9cfea14) includes: 'Try "covimerage --help" for help.'
296296
assert err_lines[-2:] == [
297297
'',
298-
'Error: No such command "file not found".']
298+
'covimerage: Error: No such command "file not found".']
299299
assert out == ''
300300

301301
assert call(['covimerage', 'write_coverage', 'file not found']) == 2
302302
out, err = capfd.readouterr()
303303
err_lines = err.splitlines()
304304
assert err_lines[-1] == (
305-
'Error: Invalid value for "%s": Could not open file: file not found: No such file or directory' % (
305+
'covimerage: Error: Invalid value for "%s": Could not open file: file not found: No such file or directory' % (
306306
"profile_file" if click.__version__ < '7.0' else "[PROFILE_FILE]...",))
307307
assert out == ''
308308

@@ -312,38 +312,38 @@ def test_cli_call_verbosity_fd(capfd):
312312
out, err = capfd.readouterr()
313313
assert out == ''
314314
assert err.splitlines() == [
315-
'Not writing coverage file: no data to report!',
316-
'Error: No data to report.']
315+
'covimerage: Not writing coverage file: no data to report!',
316+
'covimerage: Error: No data to report.']
317317

318318
assert call(['covimerage', '-v', 'write_coverage', os.devnull]) == 1
319319
out, err = capfd.readouterr()
320320
assert out == ''
321321
assert err.splitlines() == [
322-
'Parsing file: /dev/null',
323-
'source_files: []',
324-
'Not writing coverage file: no data to report!',
325-
'Error: No data to report.']
322+
'covimerage: Parsing file: /dev/null',
323+
'covimerage: source_files: []',
324+
'covimerage: Not writing coverage file: no data to report!',
325+
'covimerage: Error: No data to report.']
326326

327327
assert call(['covimerage', '-vvvv', 'write_coverage', os.devnull]) == 1
328328
out, err = capfd.readouterr()
329329
assert out == ''
330330
assert err.splitlines() == [
331-
'Parsing file: /dev/null',
332-
'source_files: []',
333-
'Not writing coverage file: no data to report!',
334-
'Error: No data to report.']
331+
'covimerage: Parsing file: /dev/null',
332+
'covimerage: source_files: []',
333+
'covimerage: Not writing coverage file: no data to report!',
334+
'covimerage: Error: No data to report.']
335335

336336
assert call(['covimerage', '-vq', 'write_coverage', os.devnull]) == 1
337337
out, err = capfd.readouterr()
338338
assert out == ''
339339
assert err.splitlines() == [
340-
'Not writing coverage file: no data to report!',
341-
'Error: No data to report.']
340+
'covimerage: Not writing coverage file: no data to report!',
341+
'covimerage: Error: No data to report.']
342342

343343
assert call(['covimerage', '-qq', 'write_coverage', os.devnull]) == 1
344344
out, err = capfd.readouterr()
345345
assert out == ''
346-
assert err == 'Error: No data to report.\n'
346+
assert err == 'covimerage: Error: No data to report.\n'
347347

348348

349349
def test_cli_writecoverage_without_data(runner):
@@ -641,7 +641,7 @@ def test_run_handles_exit_code_from_python_fd(capfd):
641641
ret = call(['covimerage', 'run',
642642
'python', '-c', 'print("output"); import sys; sys.exit(42)'])
643643
out, err = capfd.readouterr()
644-
assert 'Error: Command exited non-zero: 42.' in err.splitlines()
644+
assert 'covimerage: Error: Command exited non-zero: 42.' in err.splitlines()
645645
assert out == 'output\n'
646646
assert ret == 42
647647

@@ -652,7 +652,7 @@ def test_run_handles_exit_code_from_python_pty_fd(capfd):
652652
"import pty; pty.spawn(['/bin/sh', '-c', "
653653
"'printf output; exit 42'])"])
654654
out, err = capfd.readouterr()
655-
assert ('Error: The profile file (/not/used) has not been created.' in
655+
assert ('covimerage: Error: The profile file (/not/used) has not been created.' in
656656
err.splitlines())
657657
assert out == 'output'
658658
assert ret == 1

0 commit comments

Comments
 (0)