From 9ca51ed035d1fb3cefe28efe0dea60fbe71b4048 Mon Sep 17 00:00:00 2001 From: Devon Meunier Date: Tue, 16 May 2017 11:47:35 -0400 Subject: [PATCH 1/2] Allow overriding rubocop executable. --- ale_linters/ruby/rubocop.vim | 16 ++++++++-- doc/ale-ruby.txt | 9 ++++++ .../test_rubocop_command_callback.vader | 29 +++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 test/command_callback/test_rubocop_command_callback.vader diff --git a/ale_linters/ruby/rubocop.vim b/ale_linters/ruby/rubocop.vim index 95cb551..d1286f7 100644 --- a/ale_linters/ruby/rubocop.vim +++ b/ale_linters/ruby/rubocop.vim @@ -25,20 +25,32 @@ function! ale_linters#ruby#rubocop#Handle(buffer, lines) abort endfunction function! ale_linters#ruby#rubocop#GetCommand(buffer) abort - return 'rubocop --format emacs --force-exclusion ' + return ale#Var(a:buffer, 'ruby_rubocop_executable') + \ . ' --format emacs --force-exclusion ' \ . ale#Var(a:buffer, 'ruby_rubocop_options') \ . ' --stdin ' . bufname(a:buffer) endfunction +function! ale_linters#ruby#rubocop#GetExecutable(buffer) abort + let l:executable = split(ale#Var(a:buffer, 'ruby_rubocop_executable'))[0] + if executable(l:executable) + return l:executable + endif +endfunction + " Set this option to change Rubocop options. if !exists('g:ale_ruby_rubocop_options') " let g:ale_ruby_rubocop_options = '--lint' let g:ale_ruby_rubocop_options = '' endif +if !exists('g:ale_ruby_rubocop_executable') + let g:ale_ruby_rubocop_executable = 'rubocop' +endif + call ale#linter#Define('ruby', { \ 'name': 'rubocop', -\ 'executable': 'rubocop', +\ 'executable_callback': 'ale_linters#ruby#rubocop#GetExecutable', \ 'command_callback': 'ale_linters#ruby#rubocop#GetCommand', \ 'callback': 'ale_linters#ruby#rubocop#Handle', \}) diff --git a/doc/ale-ruby.txt b/doc/ale-ruby.txt index cbbb132..6e8aa0e 100644 --- a/doc/ale-ruby.txt +++ b/doc/ale-ruby.txt @@ -37,6 +37,15 @@ g:ale_ruby_reek_show_wiki_link *g:ale_ruby_reek_show_wiki_link* ------------------------------------------------------------------------------- rubocop *ale-ruby-rubocop* +g:ale_ruby_rubocop_executable g:ale_ruby_rubocop_executable + b:ale_ruby_rubocop_executable + Type: String + Default: 'rubocop' + + Override the invoked rubocop binary. This is useful for running rubocop + from binstubs or a bundle. + + g:ale_ruby_rubocop_options *g:ale_ruby_rubocop_options* *b:ale_ruby_rubocop_options* Type: |String| diff --git a/test/command_callback/test_rubocop_command_callback.vader b/test/command_callback/test_rubocop_command_callback.vader new file mode 100644 index 0000000..96a63ce --- /dev/null +++ b/test/command_callback/test_rubocop_command_callback.vader @@ -0,0 +1,29 @@ +Before: + runtime ale_linters/ruby/rubocop.vim + +Execute(Executable should default to rubocop): + AssertEqual + \ 'rubocop --format emacs --force-exclusion --stdin ''dummy.py''', + \ ale_linters#ruby#rubocop#GetCommand(bufnr('')) + +Execute(Should be able to set a custom executable): + let g:ale_ruby_rubocop_executable = 'bin/rubocop' + AssertEqual + \ 'bin/rubocop --format emacs --force-exclusion --stdin ''dummy.py''', + \ ale_linters#ruby#rubocop#GetCommand(bufnr('')) + +Execute(Custom executables should not be escaped): + let g:ale_ruby_rubocop_executable = 'bundle exec rubocop' + AssertEqual + \ 'bundle exec rubocop --format emacs --force-exclusion --stdin ''dummy.py''', + \ ale_linters#ruby#rubocop#GetCommand(bufnr('')) + +Execute(Executable callback should return the first token of the executable): + let g:ale_ruby_rubocop_executable = 'bundle exec rubocop' + AssertEqual + \ 'bundle', + \ ale_linters#ruby#rubocop#GetExecutable(bufnr('')) + let g:ale_ruby_rubocop_executable = 'bin/rubocop' + AssertEqual + \ 'bin/rubocop', + \ ale_linters#ruby#rubocop#GetExecutable(bufnr('')) From 3f926de76b74faf534c6e4c79cf3f28e96848b90 Mon Sep 17 00:00:00 2001 From: Devon Meunier Date: Wed, 17 May 2017 08:46:47 -0400 Subject: [PATCH 2/2] Escape executable --- ale_linters/ruby/rubocop.vim | 9 +++++++-- .../test_rubocop_command_callback.vader | 20 +++++-------------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/ale_linters/ruby/rubocop.vim b/ale_linters/ruby/rubocop.vim index d1286f7..786e1af 100644 --- a/ale_linters/ruby/rubocop.vim +++ b/ale_linters/ruby/rubocop.vim @@ -25,14 +25,19 @@ function! ale_linters#ruby#rubocop#Handle(buffer, lines) abort endfunction function! ale_linters#ruby#rubocop#GetCommand(buffer) abort - return ale#Var(a:buffer, 'ruby_rubocop_executable') + let l:unescaped = ale#Var(a:buffer, 'ruby_rubocop_executable') + let l:executable = ale#Escape(l:unescaped) + if l:unescaped =~? 'bundle$' + let l:executable = l:executable . ' exec rubocop' + endif + return l:executable \ . ' --format emacs --force-exclusion ' \ . ale#Var(a:buffer, 'ruby_rubocop_options') \ . ' --stdin ' . bufname(a:buffer) endfunction function! ale_linters#ruby#rubocop#GetExecutable(buffer) abort - let l:executable = split(ale#Var(a:buffer, 'ruby_rubocop_executable'))[0] + let l:executable = ale#Var(a:buffer, 'ruby_rubocop_executable') if executable(l:executable) return l:executable endif diff --git a/test/command_callback/test_rubocop_command_callback.vader b/test/command_callback/test_rubocop_command_callback.vader index 96a63ce..cda0c23 100644 --- a/test/command_callback/test_rubocop_command_callback.vader +++ b/test/command_callback/test_rubocop_command_callback.vader @@ -3,27 +3,17 @@ Before: Execute(Executable should default to rubocop): AssertEqual - \ 'rubocop --format emacs --force-exclusion --stdin ''dummy.py''', + \ '''rubocop'' --format emacs --force-exclusion --stdin ''dummy.py''', \ ale_linters#ruby#rubocop#GetCommand(bufnr('')) Execute(Should be able to set a custom executable): let g:ale_ruby_rubocop_executable = 'bin/rubocop' AssertEqual - \ 'bin/rubocop --format emacs --force-exclusion --stdin ''dummy.py''', + \ '''bin/rubocop'' --format emacs --force-exclusion --stdin ''dummy.py''', \ ale_linters#ruby#rubocop#GetCommand(bufnr('')) -Execute(Custom executables should not be escaped): - let g:ale_ruby_rubocop_executable = 'bundle exec rubocop' +Execute(Setting bundle appends 'exec rubocop'): + let g:ale_ruby_rubocop_executable = 'path to/bundle' AssertEqual - \ 'bundle exec rubocop --format emacs --force-exclusion --stdin ''dummy.py''', + \ '''path to/bundle'' exec rubocop --format emacs --force-exclusion --stdin ''dummy.py''', \ ale_linters#ruby#rubocop#GetCommand(bufnr('')) - -Execute(Executable callback should return the first token of the executable): - let g:ale_ruby_rubocop_executable = 'bundle exec rubocop' - AssertEqual - \ 'bundle', - \ ale_linters#ruby#rubocop#GetExecutable(bufnr('')) - let g:ale_ruby_rubocop_executable = 'bin/rubocop' - AssertEqual - \ 'bin/rubocop', - \ ale_linters#ruby#rubocop#GetExecutable(bufnr(''))