neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

pytest.vim (3808B)


      1 " Vim compiler file
      2 " Compiler:     Pytest (Python testing framework)
      3 " Maintainer:   @Konfekt and @mgedmin
      4 " Last Change:  2024 Nov 28
      5 
      6 if exists("current_compiler") | finish | endif
      7 let current_compiler = "pytest"
      8 
      9 let s:cpo_save = &cpo
     10 set cpo&vim
     11 
     12 " CompilerSet makeprg=pytest
     13 if 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')), ' \|"')}'
     15 elseif has('win32')
     16  execute $'CompilerSet makeprg=set\ PYTHONWARNINGS=ignore\ &&\ pytest\ {escape(get(b:, 'pytest_makeprg_params', get(g:, 'pytest_makeprg_params', '--tb=short --quiet')), ' \|"')}'
     17 else
     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')), ' \|"')}'
     20 endif
     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
     26 setlocal 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?)
     56 setlocal 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
     62 setlocal errorformat^=%+G%\\d%#%.%\\=\ \ %.%#
     63 
     64 " Similar, but when the entire line starts with a date
     65 setlocal errorformat^=%+G\\d\\d\\d\\d-\\d\\d-\\d\\d\ \\d\\d:\\d\\d%.%#
     66 
     67 " make: *** [Makefile:14: target] Error 1
     68 setlocal errorformat^=%+Gmake:\ ***\ %.%#
     69 
     70 " FAILED tests.py::test_with_params[YYYY-MM-DD:HH:MM:SS] - Exception: bla bla
     71 setlocal errorformat^=%+GFAILED\ %.%#
     72 
     73 " AssertionError: assert ...YYYY-MM-DD:HH:MM:SS...
     74 setlocal errorformat^=%+GAssertionError:\ %.%#
     75 
     76 " --- /path/to/file:before  YYYY-MM-DD HH:MM:SS.ssssss
     77 setlocal errorformat^=---%f:%m
     78 
     79 " +++ /path/to/file:before  YYYY-MM-DD HH:MM:SS.ssssss
     80 setlocal errorformat^=+++%f:%m
     81 
     82 " Sometimes pytest prepends an 'E' marker at the beginning of a traceback line
     83 setlocal 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
     98 setlocal errorformat+=File\ \"%f\"\\,\ line\ %l\\,%#%m
     99 
    100 exe 'CompilerSet errorformat='..escape(&l:errorformat, ' \|"')
    101 
    102 let &cpo = s:cpo_save
    103 unlet s:cpo_save