83 lines
2.3 KiB
VimL
83 lines
2.3 KiB
VimL
" Author: Eddie Lebow https://github.com/elebow
|
|
" Description: Functions for integrating with Ruby tools
|
|
|
|
" Find the nearest dir containing "app", "db", and "config", and assume it is
|
|
" the root of a Rails app.
|
|
function! ale#ruby#FindRailsRoot(buffer) abort
|
|
for l:name in ['app', 'config', 'db']
|
|
let l:dir = fnamemodify(
|
|
\ ale#path#FindNearestDirectory(a:buffer, l:name),
|
|
\ ':h:h'
|
|
\)
|
|
|
|
if l:dir isnot# '.'
|
|
\&& isdirectory(l:dir . '/app')
|
|
\&& isdirectory(l:dir . '/config')
|
|
\&& isdirectory(l:dir . '/db')
|
|
return l:dir
|
|
endif
|
|
endfor
|
|
|
|
return ''
|
|
endfunction
|
|
|
|
" Find the nearest dir containing a potential ruby project.
|
|
function! ale#ruby#FindProjectRoot(buffer) abort
|
|
let l:dir = ale#ruby#FindRailsRoot(a:buffer)
|
|
|
|
if isdirectory(l:dir)
|
|
return l:dir
|
|
endif
|
|
|
|
for l:name in ['.solargraph.yml', 'Rakefile', 'Gemfile']
|
|
let l:dir = fnamemodify(
|
|
\ ale#path#FindNearestFile(a:buffer, l:name),
|
|
\ ':h'
|
|
\)
|
|
|
|
if l:dir isnot# '.' && isdirectory(l:dir)
|
|
return l:dir
|
|
endif
|
|
endfor
|
|
|
|
return ''
|
|
endfunction
|
|
|
|
" Handle output from rubocop and linters that depend on it (e.b. standardrb)
|
|
function! ale#ruby#HandleRubocopOutput(buffer, lines) abort
|
|
try
|
|
let l:errors = json_decode(a:lines[0])
|
|
catch
|
|
return []
|
|
endtry
|
|
|
|
if !has_key(l:errors, 'summary')
|
|
\|| l:errors['summary']['offense_count'] == 0
|
|
\|| empty(l:errors['files'])
|
|
return []
|
|
endif
|
|
|
|
let l:output = []
|
|
|
|
for l:error in l:errors['files'][0]['offenses']
|
|
let l:start_col = l:error['location']['column'] + 0
|
|
call add(l:output, {
|
|
\ 'lnum': l:error['location']['line'] + 0,
|
|
\ 'col': l:start_col,
|
|
\ 'end_col': l:start_col + l:error['location']['length'] - 1,
|
|
\ 'code': l:error['cop_name'],
|
|
\ 'text': l:error['message'],
|
|
\ 'type': ale_linters#ruby#rubocop#GetType(l:error['severity']),
|
|
\})
|
|
endfor
|
|
|
|
return l:output
|
|
endfunction
|
|
|
|
function! ale#ruby#EscapeExecutable(executable, bundle_exec) abort
|
|
let l:exec_args = a:executable =~? 'bundle'
|
|
\ ? ' exec ' . a:bundle_exec
|
|
\ : ''
|
|
|
|
return ale#Escape(a:executable) . l:exec_args
|
|
endfunction
|