-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* dockerlinter support * Tests & ShellCheck reference * sort and align docs
- Loading branch information
Showing
7 changed files
with
193 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
" Author: Shad | ||
" Description: dockerlinter linter for dockerfile | ||
|
||
call ale#Set('dockerfile_dockerlinter_executable', 'dockerlinter') | ||
call ale#Set('dockerfile_dockerlinter_options', '') | ||
|
||
function! ale_linters#dockerfile#dockerlinter#GetType(type) abort | ||
if a:type is? 'error' | ||
return 'E' | ||
elseif a:type is? 'warning' | ||
return 'W' | ||
endif | ||
|
||
return 'I' | ||
endfunction | ||
|
||
function! ale_linters#dockerfile#dockerlinter#Handle(buffer, lines) abort | ||
try | ||
let l:data = json_decode(join(a:lines, '')) | ||
catch | ||
return [] | ||
endtry | ||
|
||
if empty(l:data) | ||
" Should never happen, but it's better to be on the safe side | ||
return [] | ||
endif | ||
|
||
let l:messages = [] | ||
|
||
for l:object in l:data | ||
let l:line = get(l:object, 'lineNumber', -1) | ||
let l:message = l:object['message'] | ||
let l:type = l:object['level'] | ||
let l:detail = l:message | ||
let l:code = l:object['code'] | ||
|
||
if l:code =~# '^SC' | ||
let l:link = 'https://www.shellcheck.net/wiki/' . l:code | ||
else | ||
let l:link = 'https://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md#' . l:code | ||
endif | ||
|
||
let l:detail = l:message . "\n\n" . l:link | ||
|
||
call add(l:messages, { | ||
\ 'lnum': l:line, | ||
\ 'code': l:code, | ||
\ 'text': l:message, | ||
\ 'type': ale_linters#dockerfile#dockerlinter#GetType(l:type), | ||
\ 'detail': l:detail, | ||
\}) | ||
endfor | ||
|
||
return l:messages | ||
endfunction | ||
|
||
function! ale_linters#dockerfile#dockerlinter#GetCommand(buffer) abort | ||
return '%e' . ale#Pad(ale#Var(a:buffer, 'dockerfile_dockerlinter_options')) | ||
\ . ' -j -f' | ||
\ . ' %t' | ||
endfunction | ||
|
||
call ale#linter#Define('dockerfile', { | ||
\ 'name': 'dockerlinter', | ||
\ 'executable': {b -> ale#Var(b, 'dockerfile_dockerlinter_executable')}, | ||
\ 'command': function('ale_linters#dockerfile#dockerlinter#GetCommand'), | ||
\ 'callback': 'ale_linters#dockerfile#dockerlinter#Handle', | ||
\}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
Before: | ||
runtime ale_linters/dockerfile/dockerlinter.vim | ||
|
||
After: | ||
call ale#linter#Reset() | ||
|
||
Execute(The dockerlinter handler should handle broken JSON): | ||
AssertEqual | ||
\ [], | ||
\ ale_linters#dockerfile#dockerlinter#Handle(bufnr(''), ["{asdf"]) | ||
|
||
Execute(The dockerlinter handler should handle an empty string response): | ||
AssertEqual | ||
\ [], | ||
\ ale_linters#dockerfile#dockerlinter#Handle(bufnr(''), []) | ||
|
||
Execute(The dockerlinter handler should handle an empty result, even if it shouldn't happen): | ||
AssertEqual | ||
\ [], | ||
\ ale_linters#dockerfile#dockerlinter#Handle(bufnr(''), ["{}"]) | ||
|
||
Execute(The dockerlinter handler should handle a normal example): | ||
AssertEqual | ||
\ [ | ||
\ { | ||
\ 'lnum': 11, | ||
\ 'type': 'I', | ||
\ 'code': 'ER0002', | ||
\ 'text': "Delete the apt-get lists after installing something", | ||
\ 'detail': "Delete the apt-get lists after installing something\n\nhttps://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md#ER0002", | ||
\ }, | ||
\ { | ||
\ 'lnum': 11, | ||
\ 'type': 'I', | ||
\ 'code': 'ER0010', | ||
\ 'text': "Avoid additional packages by specifying --no-install-recommends", | ||
\ 'detail': "Avoid additional packages by specifying --no-install-recommends\n\nhttps://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md#ER0010", | ||
\ }, | ||
\ { | ||
\ 'lnum': 11, | ||
\ 'type': 'I', | ||
\ 'code': 'ER0012', | ||
\ 'text': "Pin versions in apt get install", | ||
\ 'detail': "Pin versions in apt get install\n\nhttps://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md#ER0012", | ||
\ }, | ||
\ { | ||
\ 'lnum': 30, | ||
\ 'type': 'W', | ||
\ 'code': 'SC2155', | ||
\ 'text': "Declare and assign separately to avoid masking return values.", | ||
\ 'detail': "Declare and assign separately to avoid masking return values.\n\nhttps://www.shellcheck.net/wiki/SC2155", | ||
\ }, | ||
\ { | ||
\ 'lnum': 30, | ||
\ 'type': 'W', | ||
\ 'code': 'SC2046', | ||
\ 'text': "Quote this to prevent word splitting.", | ||
\ 'detail': "Quote this to prevent word splitting.\n\nhttps://www.shellcheck.net/wiki/SC2046", | ||
\ }, | ||
\ { | ||
\ 'lnum': 30, | ||
\ 'type': 'I', | ||
\ 'code': 'SC2086', | ||
\ 'text': "Double quote to prevent globbing and word splitting.", | ||
\ 'detail': "Double quote to prevent globbing and word splitting.\n\nhttps://www.shellcheck.net/wiki/SC2086", | ||
\ }, | ||
\ { | ||
\ 'lnum': 31, | ||
\ 'type': 'W', | ||
\ 'code': 'SC2046', | ||
\ 'text': "Quote this to prevent word splitting.", | ||
\ 'detail': "Quote this to prevent word splitting.\n\nhttps://www.shellcheck.net/wiki/SC2046", | ||
\ }, | ||
\ ], | ||
\ ale_linters#dockerfile#dockerlinter#Handle(bufnr(''), [ | ||
\ '[{"lineNumber":11,"message":"Delete the apt-get lists after installing something","level":"info","code":"ER0002"},{"lineNumber":11,"message":"Avoid additional packages by specifying --no-install-recommends","level":"info","code":"ER0010"},{"lineNumber":11,"message":"Pin versions in apt get install","level":"info","code":"ER0012"},{"lineNumber":30,"message":"Declare and assign separately to avoid masking return values.","level":"warning","code":"SC2155"},{"lineNumber":30,"message":"Quote this to prevent word splitting.","level":"warning","code":"SC2046"},{"lineNumber":30,"message":"Double quote to prevent globbing and word splitting.","level":"info","code":"SC2086"},{"lineNumber":31,"message":"Quote this to prevent word splitting.","level":"warning","code":"SC2046"}]', | ||
\ ]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
Before: | ||
call ale#assert#SetUpLinterTest('dockerfile', 'dockerlinter') | ||
|
||
After: | ||
call ale#assert#TearDownLinterTest() | ||
|
||
Execute(The default command should be correct): | ||
AssertLinter 'dockerlinter', ale#Escape('dockerlinter') . ' -j -f %t' | ||
|
||
Execute(The executable should be configurable): | ||
let b:ale_dockerfile_dockerlinter_executable = 'foobar' | ||
|
||
AssertLinter 'foobar', ale#Escape('foobar') . ' -j -f %t' | ||
|
||
Execute(The options should be configurable): | ||
let b:ale_dockerfile_dockerlinter_options = '-r additional.yaml' | ||
|
||
AssertLinter 'dockerlinter', ale#Escape('dockerlinter') . ' -r additional.yaml -j -f %t' | ||
|