blob: 7fc189932c0e854c0413ad01cd795fc043509a1f [file] [log] [blame]
Konfekt3c2596a2024-11-30 11:32:49 +01001" Vim compiler file
2" Compiler: Pytest (Python testing framework)
3" Maintainer: @Konfekt and @mgedmin
4" Last Change: 2024 Nov 28
5
6if exists("current_compiler") | finish | endif
7let current_compiler = "pytest"
8
9let s:cpo_save = &cpo
10set cpo&vim
11
12" CompilerSet makeprg=pytest
13if has('unix')
14 execute $'CompilerSet makeprg=/usr/bin/env\ PYTHONWARNINGS=ignore\ pytest\ {escape(get(b:, 'pytest_makeprg_params', get(g:, 'pytest_makeprg_params', '--tb=short --quiet')), ' \|"')}'
15elseif has('win32')
16 execute $'CompilerSet makeprg=set\ PYTHONWARNINGS=ignore\ &&\ pytest\ {escape(get(b:, 'pytest_makeprg_params', get(g:, 'pytest_makeprg_params', '--tb=short --quiet')), ' \|"')}'
17else
18 CompilerSet makeprg=pytest\ --tb=short\ --quiet
19 execute $'CompilerSet makeprg=pytest\ {escape(get(b:, 'pytest_makeprg_params', get(g:, 'pytest_makeprg_params', '--tb=short --quiet')), ' \|"')}'
20endif
21
22" Pytest syntax errors {{{2
23
24" Reset error format so that sourcing .vimrc again and again doesn't grow it
25" without bounds
26setlocal errorformat&
27
28" For the record, the default errorformat is this:
29"
30" %*[^"]"%f"%*\D%l: %m
31" "%f"%*\D%l: %m
32" %-G%f:%l: (Each undeclared identifier is reported only once
33" %-G%f:%l: for each function it appears in.)
34" %-GIn file included from %f:%l:%c:
35" %-GIn file included from %f:%l:%c\,
36" %-GIn file included from %f:%l:%c
37" %-GIn file included from %f:%l
38" %-G%*[ ]from %f:%l:%c
39" %-G%*[ ]from %f:%l:
40" %-G%*[ ]from %f:%l\,
41" %-G%*[ ]from %f:%l
42" %f:%l:%c:%m
43" %f(%l):%m
44" %f:%l:%m
45" "%f"\, line %l%*\D%c%*[^ ] %m
46" %D%*\a[%*\d]: Entering directory %*[`']%f'
47" %X%*\a[%*\d]: Leaving directory %*[`']%f'
48" %D%*\a: Entering directory %*[`']%f'
49" %X%*\a: Leaving directory %*[`']%f'
50" %DMaking %*\a in %f
51" %f|%l| %m
52"
53" and sometimes it misfires, so let's fix it up a bit
54" (TBH I don't even know what compiler produces filename(lineno) so why even
55" have it?)
56setlocal errorformat-=%f(%l):%m
57
58" Sometimes Vim gets confused about ISO-8601 timestamps and thinks they're
59" filenames; this is a big hammer that ignores anything filename-like on lines
60" that start with at least two spaces, possibly preceded by a number and
61" optional punctuation
62setlocal errorformat^=%+G%\\d%#%.%\\=\ \ %.%#
63
64" Similar, but when the entire line starts with a date
65setlocal errorformat^=%+G\\d\\d\\d\\d-\\d\\d-\\d\\d\ \\d\\d:\\d\\d%.%#
66
67" make: *** [Makefile:14: target] Error 1
68setlocal errorformat^=%+Gmake:\ ***\ %.%#
69
70" FAILED tests.py::test_with_params[YYYY-MM-DD:HH:MM:SS] - Exception: bla bla
71setlocal errorformat^=%+GFAILED\ %.%#
72
73" AssertionError: assert ...YYYY-MM-DD:HH:MM:SS...
74setlocal errorformat^=%+GAssertionError:\ %.%#
75
76" --- /path/to/file:before YYYY-MM-DD HH:MM:SS.ssssss
77setlocal errorformat^=---%f:%m
78
79" +++ /path/to/file:before YYYY-MM-DD HH:MM:SS.ssssss
80setlocal errorformat^=+++%f:%m
81
82" Sometimes pytest prepends an 'E' marker at the beginning of a traceback line
83setlocal errorformat+=E\ %#File\ \"%f\"\\,\ line\ %l%.%#
84
85" Python tracebacks (unittest + doctest output) {{{2
86
87" This collapses the entire traceback into just the last file+lineno,
88" which is convenient when you want to jump to the line that failed (and not
89" the top-level entry point), but it makes it impossible to see the full
90" traceback, which sucks.
91""setlocal errorformat+=
92"" \File\ \"%f\"\\,\ line\ %l%.%#,
93"" \%C\ %.%#,
94"" \%-A\ \ File\ \"unittest%.py\"\\,\ line\ %.%#,
95"" \%-A\ \ File\ \"%f\"\\,\ line\ 0%.%#,
96"" \%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,
97"" \%Z%[%^\ ]%\\@=%m
98setlocal errorformat+=File\ \"%f\"\\,\ line\ %l\\,%#%m
99
100exe 'CompilerSet errorformat='..escape(&l:errorformat, ' \|"')
101
102let &cpo = s:cpo_save
103unlet s:cpo_save