Add Ruby MRI linter (#453)

* Added ruby mri linter

* Added to the list of supported linters

* Async and now with 4 spaces

* Vader tests for ruby

* Match style choices

* Vader test for the Ruby handler now works and passes
This commit is contained in:
Brandon Roehl 2017-04-08 05:24:20 -05:00 committed by w0rp
parent cc8eb05860
commit 4e40e8cb60
3 changed files with 80 additions and 1 deletions

View File

@ -94,7 +94,7 @@ name. That seems to be the fairest way to arrange this table.
| Puppet | [puppet](https://puppet.com), [puppet-lint](https://puppet-lint.com) |
| Python | [flake8](http://flake8.pycqa.org/en/latest/), [mypy](http://mypy-lang.org/), [pylint](https://www.pylint.org/) |
| reStructuredText | [proselint](http://proselint.com/)|
| Ruby | [rubocop](https://github.com/bbatsov/rubocop) |
| Ruby | [rubocop](https://github.com/bbatsov/rubocop), [ruby](https://www.ruby-lang.org) |
| Rust | [rustc](https://www.rust-lang.org/), cargo (see `:help ale-integration-rust` for configuration instructions) |
| SASS | [sass-lint](https://www.npmjs.com/package/sass-lint), [stylelint](https://github.com/stylelint/stylelint) |
| SCSS | [sass-lint](https://www.npmjs.com/package/sass-lint), [scss-lint](https://github.com/brigade/scss-lint), [stylelint](https://github.com/stylelint/stylelint) |

40
ale_linters/ruby/ruby.vim Normal file
View File

@ -0,0 +1,40 @@
" Author: Brandon Roehl - https://github.com/BrandonRoehl
" Description: Ruby MRI for Ruby files
function! ale_linters#ruby#ruby#Handle(buffer, lines) abort
" Matches patterns line the following:
"
" test.rb:3: warning: parentheses after method name is interpreted as an argument list, not a decomposed argument
" test.rb:8: syntax error, unexpected keyword_end, expecting end-of-input
let l:pattern = '\v^.+:(\d+): (warning: )?(.+)$'
let l:column = '\v^(\s+)\^$'
let l:output = []
for l:line in a:lines
let l:match = matchlist(l:line, l:pattern)
if len(l:match) == 0
let l:match = matchlist(l:line, l:column)
if len(l:match) != 0
let l:output[len(l:output) - 1]['col'] = len(l:match[1])
endif
else
call add(l:output, {
\ 'bufnr': a:buffer,
\ 'lnum': l:match[1] + 0,
\ 'col': 0,
\ 'text': l:match[2] . l:match[3],
\ 'type': empty(l:match[2]) ? 'E' : 'W',
\})
endif
endfor
return l:output
endfunction
call ale#linter#Define('ruby', {
\ 'name': 'ruby',
\ 'executable': 'ruby',
\ 'output_stream': 'stderr',
\ 'command': 'ruby -w -c -T1 %t',
\ 'callback': 'ale_linters#ruby#ruby#Handle',
\})

View File

@ -0,0 +1,39 @@
Execute(The ruby handler should parse lines correctly and add the column if it can):
runtime ale_linters/ruby/ruby.vim
" Point Error
" Warning
" Line Error
AssertEqual
\ [
\ {
\ 'lnum': 6,
\ 'bufnr': 255,
\ 'col': 13,
\ 'type': 'E',
\ 'text': 'syntax error, unexpected '';'''
\ },
\ {
\ 'lnum': 9,
\ 'bufnr': 255,
\ 'col': 0,
\ 'type': 'W',
\ 'text': 'warning: statement not reached'
\ },
\ {
\ 'lnum': 12,
\ 'bufnr': 255,
\ 'col': 0,
\ 'type': 'E',
\ 'text': 'syntax error, unexpected end-of-input, expecting keyword_end'
\ }
\ ],
\ ale_linters#ruby#ruby#Handle(255, [
\ "test.rb:6: syntax error, unexpected ';'",
\ " t = ;",
\ " ^",
\ "test.rb:9: warning: statement not reached",
\ "test.rb:12: syntax error, unexpected end-of-input, expecting keyword_end",
\ ])
After:
call ale#linter#Reset()