Add ALEInfo command to get list of available/enabled linters (#273)

* Add ALEInfo command to get list of available/enabled linters for current filetype

* Add Vader tests for ALEInfo command

* Fix ALEInfo tests breaking CI by echoing too much output to screen

* Speculative change to Makefile which seems to fix test hanging problem locally.

* Fix Vader tests to not require a TTY
This commit is contained in:
DiscoViking 2017-01-25 00:50:49 +09:00 committed by w0rp
parent fd89da113d
commit a9c650cd05
3 changed files with 135 additions and 13 deletions

View File

@ -103,7 +103,7 @@ function! ale#linter#Define(filetype, linter) abort
call add(s:linters[a:filetype], l:new_linter) call add(s:linters[a:filetype], l:new_linter)
endfunction endfunction
function! s:LoadLinters(filetype) abort function! ale#linter#GetAll(filetype) abort
if a:filetype ==# '' if a:filetype ==# ''
" Empty filetype? Nothing to be done about that. " Empty filetype? Nothing to be done about that.
return [] return []
@ -125,22 +125,28 @@ function! s:LoadLinters(filetype) abort
return s:linters[a:filetype] return s:linters[a:filetype]
endfunction endfunction
function! s:ResolveFiletype(original_filetype) abort
" Try and get an aliased file type either from the user's Dictionary, or
" our default Dictionary, otherwise use the filetype as-is.
let l:filetype = get(
\ g:ale_linter_aliases,
\ a:original_filetype,
\ get(
\ s:default_ale_linter_aliases,
\ a:original_filetype,
\ a:original_filetype
\ )
\)
return l:filetype
endfunction
function! ale#linter#Get(original_filetypes) abort function! ale#linter#Get(original_filetypes) abort
let l:combined_linters = [] let l:combined_linters = []
" Handle dot-seperated filetypes. " Handle dot-seperated filetypes.
for l:original_filetype in split(a:original_filetypes, '\.') for l:original_filetype in split(a:original_filetypes, '\.')
" Try and get an aliased file type either from the user's Dictionary, or let l:filetype = s:ResolveFiletype(l:original_filetype)
" our default Dictionary, otherwise use the filetype as-is.
let l:filetype = get(
\ g:ale_linter_aliases,
\ l:original_filetype,
\ get(
\ s:default_ale_linter_aliases,
\ l:original_filetype,
\ l:original_filetype
\ )
\)
" Try and get a list of linters to run, using the original file type, " Try and get a list of linters to run, using the original file type,
" not the aliased filetype. We have some linters to limit by default, " not the aliased filetype. We have some linters to limit by default,
@ -155,7 +161,7 @@ function! ale#linter#Get(original_filetypes) abort
\ ) \ )
\) \)
let l:all_linters = s:LoadLinters(l:filetype) let l:all_linters = ale#linter#GetAll(l:filetype)
let l:filetype_linters = [] let l:filetype_linters = []
if type(l:linter_names) == type('') && l:linter_names ==# 'all' if type(l:linter_names) == type('') && l:linter_names ==# 'all'
@ -174,3 +180,25 @@ function! ale#linter#Get(original_filetypes) abort
return l:combined_linters return l:combined_linters
endfunction endfunction
function! ale#linter#Info() abort
let l:original_filetypes = &filetype
" We get the list of enabled linters for free by the above function.
let l:enabled_linters = deepcopy(ale#linter#Get(l:original_filetypes))
" But have to build the list of available linters ourselves.
let l:all_linters = []
for l:original_filetype in split(l:original_filetypes, '\.')
let l:filetype = s:ResolveFiletype(l:original_filetype)
let l:filetype_linters = ale#linter#GetAll(l:filetype)
call extend(l:all_linters, l:filetype_linters)
endfor
let l:all_names = map(l:all_linters, 'v:val[''name'']')
let l:enabled_names = map(l:enabled_linters, 'v:val[''name'']')
echom ' Current Filetype: ' . l:original_filetypes
echom 'Available Linters: ' . string(l:all_names)
echom ' Enabled Linters: ' . string(l:enabled_names)
endfunction

View File

@ -138,6 +138,9 @@ command! ALEPreviousWrap :call ale#loclist_jumping#Jump('before', 1)
command! ALENext :call ale#loclist_jumping#Jump('after', 0) command! ALENext :call ale#loclist_jumping#Jump('after', 0)
command! ALENextWrap :call ale#loclist_jumping#Jump('after', 1) command! ALENextWrap :call ale#loclist_jumping#Jump('after', 1)
" Define command to get information about current filetype.
command! ALEInfo :call ale#linter#Info()
" <Plug> mappings for commands " <Plug> mappings for commands
nnoremap <silent> <Plug>(ale_previous) :ALEPrevious<Return> nnoremap <silent> <Plug>(ale_previous) :ALEPrevious<Return>
nnoremap <silent> <Plug>(ale_previous_wrap) :ALEPreviousWrap<Return> nnoremap <silent> <Plug>(ale_previous_wrap) :ALEPreviousWrap<Return>

91
test/test_ale_info.vader Normal file
View File

@ -0,0 +1,91 @@
Before:
let g:testlinter1 = {'name': 'testlinter1', 'executable': 'testlinter1', 'command': 'testlinter1', 'callback': 'testCB1', 'output_stream': 'stdout'}
let g:testlinter2 = {'name': 'testlinter2', 'executable': 'testlinter2', 'command': 'testlinter2', 'callback': 'testCB2', 'output_stream': 'stdout'}
call ale#linter#Reset()
let g:ale_linters = {}
let g:ale_linter_aliases = {}
After:
unlet! g:output
Given nolintersft (Empty buffer with no linters):
Execute (ALEInfo with no linters should return the right output):
redir => g:output
silent ALEInfo
redir END
AssertEqual "\n
\ Current Filetype: nolintersft\n
\Available Linters: []\n
\ Enabled Linters: []", g:output
Given (Empty buffer with no filetype):
Execute (ALEInfo with no filetype should return the right output):
redir => g:output
silent ALEInfo
redir END
AssertEqual "\n
\ Current Filetype: \n
\Available Linters: []\n
\ Enabled Linters: []", g:output
Given testft (Empty buffer):
Execute (ALEInfo with a single linter should return the right output):
call ale#linter#Define('testft', g:testlinter1)
redir => g:output
silent ALEInfo
redir END
AssertEqual "\n
\ Current Filetype: testft\n
\Available Linters: ['testlinter1']\n
\ Enabled Linters: ['testlinter1']", g:output
Given testft (Empty buffer):
Execute (ALEInfo with two linters should return the right output):
call ale#linter#Define('testft', g:testlinter1)
call ale#linter#Define('testft', g:testlinter2)
redir => g:output
silent ALEInfo
redir END
AssertEqual "\n
\ Current Filetype: testft\n
\Available Linters: ['testlinter1', 'testlinter2']\n
\ Enabled Linters: ['testlinter1', 'testlinter2']", g:output
Given testft (Empty buffer):
Execute (ALEInfo should calculate enabled linters correctly):
call ale#linter#Define('testft', g:testlinter1)
call ale#linter#Define('testft', g:testlinter2)
let g:ale_linters = { 'testft': ['testlinter2'] }
redir => g:output
silent ALEInfo
redir END
AssertEqual "\n
\ Current Filetype: testft\n
\Available Linters: ['testlinter1', 'testlinter2']\n
\ Enabled Linters: ['testlinter2']", g:output
Given testft (Empty buffer):
Execute (ALEInfo should only return linters for current filetype):
call ale#linter#Define('testft', g:testlinter1)
call ale#linter#Define('testft2', g:testlinter2)
redir => g:output
silent ALEInfo
redir END
AssertEqual "\n
\ Current Filetype: testft\n
\Available Linters: ['testlinter1']\n
\ Enabled Linters: ['testlinter1']", g:output
Given testft.testft2 (Empty buffer with two filetypes):
Execute (ALEInfo with compound filetypes should return linters for both of them):
call ale#linter#Define('testft', g:testlinter1)
call ale#linter#Define('testft2', g:testlinter2)
redir => g:output
silent ALEInfo
redir END
AssertEqual "\n
\ Current Filetype: testft.testft2\n
\Available Linters: ['testlinter1', 'testlinter2']\n
\ Enabled Linters: ['testlinter1', 'testlinter2']", g:output