From ab534c2995dabfb8adcdc62d0ac66ed1b1110f4c Mon Sep 17 00:00:00 2001 From: Eric Stern Date: Wed, 21 Jun 2017 13:35:40 -0700 Subject: Support project's local phpcs installation (#666) * Use locally-installed PHPCS if available * Add author * Add configuration options * Escape executable * Add tests --- ale_linters/php/phpcs.vim | 19 +++++++-- .../project-with-phpcs/vendor/bin/phpcs | 0 test/test_phpcs_executable_detection.vader | 45 ++++++++++++++++++++++ 3 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 test/phpcs-test-files/project-with-phpcs/vendor/bin/phpcs create mode 100644 test/test_phpcs_executable_detection.vader diff --git a/ale_linters/php/phpcs.vim b/ale_linters/php/phpcs.vim index 94c887c4..a8eae4e6 100644 --- a/ale_linters/php/phpcs.vim +++ b/ale_linters/php/phpcs.vim @@ -1,15 +1,28 @@ -" Author: jwilliams108 +" Author: jwilliams108 , Eric Stern " Description: phpcs for PHP files let g:ale_php_phpcs_standard = get(g:, 'ale_php_phpcs_standard', '') +call ale#Set('php_phpcs_executable', 'phpcs') +call ale#Set('php_phpcs_use_global', 0) + +function! ale_linters#php#phpcs#GetExecutable(buffer) abort + return ale#node#FindExecutable(a:buffer, 'php_phpcs', [ + \ 'vendor/bin/phpcs', + \ 'phpcs' + \]) +endfunction + function! ale_linters#php#phpcs#GetCommand(buffer) abort + let l:executable = ale_linters#php#phpcs#GetExecutable(a:buffer) + let l:standard = ale#Var(a:buffer, 'php_phpcs_standard') let l:standard_option = !empty(l:standard) \ ? '--standard=' . l:standard \ : '' - return 'phpcs -s --report=emacs --stdin-path=%s ' . l:standard_option + return ale#Escape(l:executable) + \ . ' -s --report=emacs --stdin-path=%s ' . l:standard_option endfunction function! ale_linters#php#phpcs#Handle(buffer, lines) abort @@ -36,7 +49,7 @@ endfunction call ale#linter#Define('php', { \ 'name': 'phpcs', -\ 'executable': 'phpcs', +\ 'executable_callback': 'ale_linters#php#phpcs#GetExecutable', \ 'command_callback': 'ale_linters#php#phpcs#GetCommand', \ 'callback': 'ale_linters#php#phpcs#Handle', \}) diff --git a/test/phpcs-test-files/project-with-phpcs/vendor/bin/phpcs b/test/phpcs-test-files/project-with-phpcs/vendor/bin/phpcs new file mode 100644 index 00000000..e69de29b diff --git a/test/test_phpcs_executable_detection.vader b/test/test_phpcs_executable_detection.vader new file mode 100644 index 00000000..678606f8 --- /dev/null +++ b/test/test_phpcs_executable_detection.vader @@ -0,0 +1,45 @@ +Before: + let g:ale_php_phpcs_executable = 'phpcs_test' + + silent! cd /testplugin/test + let g:dir = getcwd() + + runtime ale_linters/php/phpcs.vim + +After: + let g:ale_php_phpcs_executable = 'phpcs' + let g:ale_php_phpcs_use_global = 0 + + silent execute 'cd ' . g:dir + unlet! g:dir + + call ale#linter#Reset() + +Execute(project with phpcs should use local by default): + silent noautocmd new phpcs-test-files/project-with-phpcs/vendor/bin/phpcs + + AssertEqual + \ g:dir . '/phpcs-test-files/project-with-phpcs/vendor/bin/phpcs', + \ ale_linters#php#phpcs#GetExecutable(bufnr('')) + + :q + +Execute(use-global should override local detection): + let g:ale_php_phpcs_use_global = 1 + + silent noautocmd new phpcs-test-files/project-with-phpcs/vendor/bin/phpcs + + AssertEqual + \ 'phpcs_test', + \ ale_linters#php#phpcs#GetExecutable(bufnr('')) + + :q + +Execute(project without phpcs should use global): + silent noautocmd new phpcs-test-files/project-without-phpcs/vendor/bin/phpcs + + AssertEqual + \ 'phpcs_test', + \ ale_linters#php#phpcs#GetExecutable(bufnr('')) + + :q -- cgit v1.2.3