1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-24 06:30:03 +08:00
SpaceVim/bundle/neomake/tests/ft_python.vader
2020-06-13 14:06:35 +08:00

435 lines
16 KiB
Plaintext

Include: include/setup.vader
Execute (python: errorformat):
new
e tests/fixtures/errors.py
call neomake#config#set('b:ft.python.python.exe', 'python3')
Neomake python
NeomakeTestsWaitForFinishedJobs
AssertEqualQf getloclist(0), [{
\ 'lnum': 1,
\ 'bufnr': bufnr('%'),
\ 'col': 16,
\ 'valid': 1,
\ 'vcol': 0,
\ 'nr': -1,
\ 'type': 'E',
\ 'pattern': '',
\ 'text': 'unexpected EOF while parsing'}]
bwipe
Execute (python: pylama: errorformat):
Save &errorformat
let &errorformat = neomake#makers#ft#python#pylama().errorformat
new
file file1.py
lgetexpr "file1.py:16:1: [C] C901 'load_library' is too complex (13) [mccabe]"
AssertEqualQf getloclist(0), [
\ {'lnum': 16, 'bufnr': bufnr('%'), 'col': 1, 'valid': 1, 'vcol': 0,
\ 'nr': -1, 'type': 'C', 'pattern': '',
\ 'text': 'C901 ''load_library'' is too complex (13) [mccabe]'}]
let e = getloclist(0)[0]
call neomake#makers#ft#python#PylamaEntryProcess(e)
AssertEqualQf [e], [{
\ 'lnum': 16,
\ 'bufnr': bufnr('%'),
\ 'col': 1,
\ 'valid': 1,
\ 'vcol': 0,
\ 'nr': 901,
\ 'type': 'I',
\ 'pattern': '',
\ 'text': "C901 'load_library' is too complex (13) [mccabe]"}]
bwipe
Execute (python: pylama: cwd):
let tempdir = tempname()
call mkdir(tempdir)
new
exe 'lcd '.tempdir
let maker = neomake#makers#ft#python#pylama()
if has_key(maker, 'cwd')
" Might happen with e.g. an existing /tmp/setup.cwd..
call vader#log(printf('NOTE: got cwd already: %s', maker.cwd))
endif
call mkdir('pylama/subdir', 'p')
call writefile([], 'pylama/setup.cfg')
lcd pylama/subdir
let maker = neomake#makers#ft#python#pylama()
AssertEqual maker.cwd, tempdir . neomake#utils#Slash() . 'pylama'
bwipe
Execute (python: flake8: errorformat/postprocess: F811):
Save &errorformat
let &errorformat = neomake#makers#ft#python#flake8().errorformat
new
file file1.py
norm Iimport os
norm oimport os . path as os
norm ofrom os import os
lgetexpr "file1.py:2:1: F811 redefinition of unused 'os' from line 1"
AssertEqualQf getloclist(0), [
\ {'lnum': 2, 'bufnr': bufnr('%'), 'col': 1, 'valid': 1, 'vcol': 0,
\ 'nr': 811, 'type': 'F', 'pattern': '',
\ 'text': "redefinition of unused 'os' from line 1"}]
let e = getloclist(0)[0]
call neomake#makers#ft#python#Flake8EntryProcess(e)
AssertEqualQf [e], [{
\ 'lnum': 2,
\ 'bufnr': bufnr('%'),
\ 'col': 21,
\ 'pattern': '',
\ 'valid': 1,
\ 'vcol': 0,
\ 'nr': -1,
\ 'length': 2,
\ 'type': 'E',
\ 'text': "F811 redefinition of unused 'os' from line 1"}]
lgetexpr "file1.py:3:1: F811 redefinition of unused 'os' from line 2"
AssertEqualQf getloclist(0), [
\ {'lnum': 3, 'bufnr': bufnr('%'), 'col': 1, 'valid': 1, 'vcol': 0,
\ 'nr': 811, 'type': 'F', 'pattern': '',
\ 'text': "redefinition of unused 'os' from line 2"}]
let e = getloclist(0)[0]
call neomake#makers#ft#python#Flake8EntryProcess(e)
AssertEqualQf [e], [{
\ 'lnum': 3,
\ 'bufnr': bufnr('%'),
\ 'col': 16,
\ 'pattern': '',
\ 'valid': 1,
\ 'vcol': 0,
\ 'nr': -1,
\ 'length': 2,
\ 'type': 'E',
\ 'text': "F811 redefinition of unused 'os' from line 2"}]
bwipe!
Execute (python: flake8: format of current error msg):
let maker = NeomakeTestsGetMakerWithOutput(neomake#makers#ft#python#flake8(), [
\ 'file1.py:1:1: F811 redefinition of unused ''os'' from line 1',
\ ])
let maker.name = 'flake8'
new
file file1.py
CallNeomake 1, [maker]
AssertEqual line('.'), 1
AssertEqual neomake#GetCurrentErrorMsg(),
\ 'flake8: F811 redefinition of unused ''os'' from line 1 (E)'
bwipe
Execute (flake8: postprocess for F821 in continuous f-strings):
new
let bufnr = bufnr('%')
file t-undefined-in-fstring.py
call append(0, [
\ 'bar',
\ 'BAZ = 1',
\ 'foo = (f"prefix {foo}"',
\ ' f"prefix {BAZ} {baz} {obj.attr} {f(arg)}")',
\ ])
" Output from flake8:
" t-undefined-in-fstring.py:1:1: F821 undefined name 'bar'
" t-undefined-in-fstring.py:3:9: F821 undefined name 'baz'
" t-undefined-in-fstring.py:3:9: F821 undefined name 'obj'
" t-undefined-in-fstring.py:3:9: F821 undefined name 'f'
" t-undefined-in-fstring.py:3:11: F821 undefined name 'arg'
" t-undefined-in-fstring.py:3:18: F821 undefined name 'foo'
let e = {'lnum': 1, 'bufnr': bufnr, 'col': 1, 'valid': 1, 'vcol': 0, 'nr': 821, 'type': 'F', 'pattern': '', 'text': 'F821 undefined name ''bar'''}
call neomake#makers#ft#python#Flake8EntryProcess(e)
AssertEqual [e.lnum, e.col, e.length], [1, 1, 3]
" Correct for first line in f-string.
let e = {'lnum': 3, 'bufnr': bufnr, 'col': 18, 'valid': 1, 'vcol': 0, 'nr': 821, 'type': 'F', 'pattern': '', 'text': 'F821 undefined name ''foo'''}
call neomake#makers#ft#python#Flake8EntryProcess(e)
AssertEqual [e.lnum, e.col, e.length], [3, 18, 3]
" Needs adjustment for second line in f-string.
let e = {'lnum': 3, 'bufnr': bufnr, 'col': 9, 'valid': 1, 'vcol': 0, 'nr': 821, 'type': 'F', 'pattern': '', 'text': 'F821 undefined name ''baz'''}
call neomake#makers#ft#python#Flake8EntryProcess(e)
AssertEqual [e.lnum, e.col, e.length], [4, 24, 3]
" Needs adjustment for second line in f-string, handling objects.
let e = {'lnum': 3, 'bufnr': bufnr, 'col': 9, 'valid': 1, 'vcol': 0, 'nr': 821, 'type': 'F', 'pattern': '', 'text': 'F821 undefined name ''obj'''}
call neomake#makers#ft#python#Flake8EntryProcess(e)
AssertEqual [e.lnum, e.col, e.length], [4, 30, 3]
" Needs adjustment for second line in f-string, handling func.
let e = {'lnum': 3, 'bufnr': bufnr, 'col': 9, 'valid': 1, 'vcol': 0, 'nr': 821, 'type': 'F', 'pattern': '', 'text': 'F821 undefined name ''f'''}
call neomake#makers#ft#python#Flake8EntryProcess(e)
AssertEqual [e.lnum, e.col, e.length], [4, 41, 1]
" Needs adjustment for second line in f-string, handling func arg.
let e = {'lnum': 3, 'bufnr': bufnr, 'col': 11, 'valid': 1, 'vcol': 0, 'nr': 821, 'type': 'F', 'pattern': '', 'text': 'F821 undefined name ''arg'''}
call neomake#makers#ft#python#Flake8EntryProcess(e)
AssertEqual [e.lnum, e.col, e.length], [4, 43, 3]
" Something that cannot be found.
let e = {'lnum': 3, 'bufnr': bufnr, 'col': 9, 'valid': 1, 'vcol': 0, 'nr': 821, 'type': 'F', 'pattern': '', 'text': 'F821 undefined name ''cannotbefound'''}
call neomake#makers#ft#python#Flake8EntryProcess(e)
AssertEqual [e.lnum, e.col], [3, 9]
Assert !has_key(e, 'length')
bwipe!
Execute (python: flake8: neomake#makers#ft#python#Flake8EntryProcess):
let bufnr = bufnr('%')
let entry = {'type': 'F', 'nr': 841, 'text': "local variable 'foo' is assigned to but never used", 'lnum': 1, 'col': 1, 'bufnr': bufnr}
call neomake#makers#ft#python#Flake8EntryProcess(entry)
AssertEqual entry.type, 'W'
let entry = {'type': 'F', 'nr': 999, 'text': "something", 'lnum': 1, 'col': 1, 'bufnr': bufnr}
call neomake#makers#ft#python#Flake8EntryProcess(entry)
AssertEqual entry.type, 'E'
let entry = {'type': 'F', 'nr': 404, 'text': "not found", 'lnum': 1, 'col': 1, 'bufnr': bufnr}
call neomake#makers#ft#python#Flake8EntryProcess(entry)
AssertEqual entry.type, 'W'
let entry = {'type': 'F', 'nr': 407, 'text': "no future", 'lnum': 1, 'col': 1, 'bufnr': bufnr}
call neomake#makers#ft#python#Flake8EntryProcess(entry)
AssertEqual entry.type, 'E'
Execute (python: flake8):
Save &errorformat
let &errorformat = neomake#makers#ft#python#flake8().errorformat
new
file foo/bar.py
lgetexpr 'foo/bar.py:90:1: I001 isort found an import in the wrong position'
let llist = getloclist(0)
let bufnr = bufnr('%')
AssertEqualQf llist, [
\ {'lnum': 90, 'bufnr': bufnr, 'col': 1, 'valid': 1, 'vcol': 0,
\ 'nr': 1, 'type': 'I', 'pattern': '',
\ 'text': 'isort found an import in the wrong position'}]
let entry = llist[0]
call neomake#makers#ft#python#Flake8EntryProcess(entry)
AssertEqualQf [entry], [{'lnum': 90, 'bufnr': bufnr, 'col': 1, 'valid': 1,
\ 'vcol': 0, 'nr': -1, 'type': 'I', 'pattern': '',
\ 'text': 'I1 isort found an import in the wrong position'}]
bwipe
Execute (python: flake8: supports_stdin):
new
noautocmd setfiletype python
let b:neomake = {'flake8': {'exe': 'echo', 'errorformat': '%m'}}
CallNeomake 1, ['flake8']
AssertNeomakeMessage '\vStarting .{-}: echo --format\=default --stdin-display-name '''' -.', 2
AssertEqual getloclist(0)[0].text,
\ '-1 --format=default --stdin-display-name -'
bwipe
Execute (python: flake8: supports_stdin: changes cwd (non-existing)):
new
let tempdir = tempname()
let fname = tempdir.neomake#utils#Slash().'fname'
exe 'file' fname
noautocmd setfiletype python
let b:neomake = {'flake8': {'exe': 'echo', 'errorformat': '%m'}}
CallNeomake 1, ['flake8']
AssertNeomakeMessage printf('\Vjobinfo.cd(): error when trying to change cwd to %s:', tempdir)
AssertNeomakeMessage printf('\vStarting .{-}: echo --format\=default --stdin-display-name %s -.', fname), 2
AssertNeomakeMessage printf('cwd: %s.', getcwd())
AssertEqual getloclist(0)[0].text,
\ printf('-1 --format=default --stdin-display-name %s -', fname)
bwipe
Execute (python: flake8: supports_stdin: changes cwd (existing)):
new
let fname = tempname()
let tempdir = fnamemodify(fname, ':h')
exe 'file' fname
noautocmd setfiletype python
let b:neomake = {'flake8': {'exe': 'echo', 'errorformat': '%m'}}
CallNeomake 1, ['flake8']
AssertNeomakeMessage printf('\vStarting .{-}: echo --format\=default --stdin-display-name %s -.', fname), 2
AssertNeomakeMessage printf('cwd: %s (changed).', tempdir)
AssertEqual getloclist(0)[0].text,
\ printf('-1 --format=default --stdin-display-name %s -', fname)
bwipe
Execute (python: flake8: supports_stdin: does not change cwd with buffer in subdir):
new
let cwd = tempname()
let fdir = cwd.neomake#utils#Slash().'subdir'
call mkdir(fdir, 'p')
let fname = fdir.neomake#utils#Slash().'fname'
exe 'file' fname
exe 'lcd' cwd
noautocmd setfiletype python
let b:neomake = {'flake8': {'exe': 'echo', 'errorformat': '%m'}}
CallNeomake 1, ['flake8']
AssertNeomakeMessageAbsent '\Verror when trying to change cwd'
AssertNeomakeMessage printf('\vStarting .{-}: echo --format\=default --stdin-display-name %s -.',
\ fname), 2
AssertNeomakeMessage printf('cwd: %s.', cwd)
AssertEqual getloclist(0)[0].text,
\ printf('-1 --format=default --stdin-display-name %s -', fname)
bwipe
Execute (python: pylint):
let entry = {'type': 'F', 'col': 1}
call neomake#makers#ft#python#PylintEntryProcess(entry)
AssertEqual entry.type, 'E'
AssertEqual entry.col, 2
let entry = {'type': 'E', 'col': 1}
call neomake#makers#ft#python#PylintEntryProcess(entry)
AssertEqual entry.type, 'E'
AssertEqual entry.col, 2
let entry = {'type': 'W', 'col': 1}
call neomake#makers#ft#python#PylintEntryProcess(entry)
AssertEqual entry.type, 'W'
AssertEqual entry.col, 2
let entry = {'type': 'R', 'col': 1}
call neomake#makers#ft#python#PylintEntryProcess(entry)
AssertEqual entry.type, 'W'
AssertEqual entry.col, 2
let entry = {'type': 'C', 'col': 1}
call neomake#makers#ft#python#PylintEntryProcess(entry)
AssertEqual entry.type, 'W'
AssertEqual entry.col, 2
let entry = {'type': 'I', 'col': 1}
call neomake#makers#ft#python#PylintEntryProcess(entry)
AssertEqual entry.type, 'I'
AssertEqual entry.col, 2
Execute (python: pylint: filters expected msgs on stderr):
let stderr = [
\ 'No config file found, using default configuration',
\ 'Using config file /Users/liyong/.pylintrc',
\ 'Some unexpected error',
\ ]
let maker = neomake#GetMaker('pylint', 'python')
let output = copy(stderr)
call maker.filter_output(output, {'source': 'stderr'})
AssertEqual output, [
\ 'Some unexpected error',
\ ]
let output = copy(stderr)
call maker.filter_output(output, {'source': 'stdout'})
AssertEqual output, stderr
Execute (python: pylint: filters Python warnings):
let stderr = [
\ '/usr/lib/python3.6/inspect.py:79: Warning: gsignal.c:1675: parameter 1 of type ''<invalid>'' for signal "GstBus::sync_message" is not a value type',
\ ' return isinstance(object, type)',
\ '/usr/lib/python3.6/inspect.py:79: Warning: gsignal.c:1675: parameter 1 of type ''<invalid>'' for signal "GstBus::message" is not a value type',
\ ' return isinstance(object, type)',
\ 'Some unexpected error',
\ '/usr/lib/python3.6/inspect.py:79: Warning: g_param_spec_boxed: assertion ''G_TYPE_IS_BOXED (boxed_type)'' failed',
\ ' return isinstance(object, type)',
\ '/usr/lib/python3.6/inspect.py:79: Warning: validate_pspec_to_install: assertion ''G_IS_PARAM_SPEC (pspec)'' failed',
\ ' return isinstance(object, type)',
\ 'Another unexpected error',
\ ]
let maker = neomake#GetMaker('pylint', 'python')
let output = copy(stderr)
call maker.filter_output(output, {'source': 'stderr'})
AssertEqual output, [
\ 'Some unexpected error',
\ 'Another unexpected error',
\ ]
let output = copy(stderr)
call maker.filter_output(output, {'source': 'stdout'})
AssertEqual output, stderr
Execute (neomake#makers#ft#python#FilterPythonWarnings):
let lines = [
\ '/usr/lib/python3.6/inspect.py:79: Warning: gsignal.c:1675: parameter 1 of type ''<invalid>'' for signal "GstBus::sync_message" is not a value type',
\ 'this is not a source location',
\]
call neomake#makers#ft#python#FilterPythonWarnings(lines, {'source': 'stderr'})
AssertEqual lines, [
\ 'this is not a source location',
\ ]
Execute (neomake#makers#ft#python#FilterPythonWarnings: FutureWarning):
let lines = [
\ '/some/.venv 37 with space/lib/python3.7/site-packages/pycodestyle.py:113: FutureWarning: Possible nested set at position 1',
\ " EXTRANEOUS_WHITESPACE_REGEX = re.compile(r'[[({] | []}),;:]')",
\ ]
call neomake#makers#ft#python#FilterPythonWarnings(lines, {'source': 'stderr'})
AssertEqual lines, []
Execute (python: mypy: handles --py2):
call g:NeomakeTestsSetPATH('')
let base_args = [
\ '--show-column-numbers',
\ '--show-error-codes',
\ '--check-untyped-defs',
\ '--ignore-missing-imports'
\ ]
" Defaults to py3.
call neomake#makers#ft#python#DetectPythonVersion()
let maker = neomake#makers#ft#python#mypy()
AssertEqual maker.args, base_args
AssertNeomakeMessage '\v^Failed to detect Python version: .*', 0
" Appends --py2 with Python 2.
call g:NeomakeTestsCreateExe('python', ['#!/bin/sh', 'echo Python 2.7.14'])
call neomake#makers#ft#python#DetectPythonVersion()
let maker = neomake#makers#ft#python#mypy()
AssertEqual maker.args, base_args + ['--py2']
" Does not append --py2 with Python 3.
call g:NeomakeTestsCreateExe('python', ['#!/bin/sh', 'echo Python 3.6.4'])
call neomake#makers#ft#python#DetectPythonVersion()
let maker = neomake#makers#ft#python#mypy()
AssertEqual maker.args, base_args
Execute (python: mypy):
let maker = neomake#GetMaker('mypy', 'python')
let base_args = [
\ '--show-column-numbers',
\ '--show-error-codes',
\ '--check-untyped-defs',
\ '--ignore-missing-imports'
\ ]
let options = {'file_mode': 1}
let bound_maker = neomake#core#instantiate_maker(maker, options, 0)
AssertEqual bound_maker.args, ['--follow-imports=silent'] + base_args
new
let b:neomake = {'project_root': 'fake_project_root'}
let options = {'file_mode': 0, 'bufnr': bufnr('%')}
let bound_maker = neomake#core#instantiate_maker(maker, options, 0)
AssertEqual bound_maker.args, base_args + ['fake_project_root']
let b:neomake = {'project_root': ''}
let options = {'file_mode': 0, 'bufnr': bufnr('%')}
let bound_maker = neomake#core#instantiate_maker(maker, options, 0)
AssertEqual bound_maker.args, base_args + ['.']
let jobinfo = NeomakeTestsFakeJobinfo()
AssertEqual bound_maker.supports_stdin(jobinfo), 0
let fname = bound_maker._get_fname_for_buffer(jobinfo)
AssertNeomakeMessage '\vUsing tempfile for unnamed buffer: "(.*)".', 3
let tmpfile = g:neomake_test_matchlist[1]
AssertEqual fname, tmpfile
bwipe