From 7def00d5a90059b9776e1bf41ea32bd90deb6007 Mon Sep 17 00:00:00 2001 From: Jonathan Boudreau Date: Sat, 8 Jul 2017 13:37:21 -0400 Subject: [PATCH] Use different reporter to support older versions of jscs (#737) * Use different reporter to support older versions of jscs * Add test and make more consistent with other code * Add documentation for jscs * Add more test coverage --- ale_linters/javascript/jscs.vim | 60 ++++++++++++++++++- doc/ale-javascript.txt | 19 ++++++ .../test_jscs_command_callback.vader | 25 ++++++++ test/handler/test_jscs_handler.vader | 25 ++++++++ 4 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 test/command_callback/test_jscs_command_callback.vader create mode 100644 test/handler/test_jscs_handler.vader diff --git a/ale_linters/javascript/jscs.vim b/ale_linters/javascript/jscs.vim index aef607ec..b3f826cf 100644 --- a/ale_linters/javascript/jscs.vim +++ b/ale_linters/javascript/jscs.vim @@ -1,9 +1,63 @@ " Author: Chris Kyrouac - https://github.com/fijshion " Description: jscs for JavaScript files +call ale#Set('javascript_jscs_executable', 'jscs') +call ale#Set('javascript_jscs_use_global', 0) + +function! ale_linters#javascript#jscs#GetExecutable(buffer) abort + return ale#node#FindExecutable(a:buffer, 'javascript_jscs', [ + \ 'node_modules/.bin/jscs', + \]) +endfunction + +function! ale_linters#javascript#jscs#GetCommand(buffer) abort + " Search for a local JShint config locaation, and default to a global one. + let l:jscs_config = ale#path#ResolveLocalPath( + \ a:buffer, + \ '.jscsrc', + \ get(g:, 'ale_jscs_config_loc', '') + \) + + let l:command = ale#Escape(ale_linters#javascript#jscs#GetExecutable(a:buffer)) + let l:command .= ' --reporter inline --no-colors' + + if !empty(l:jscs_config) + let l:command .= ' --config ' . ale#Escape(l:jscs_config) + endif + + let l:command .= ' -' + + return l:command +endfunction + +function! ale_linters#javascript#jscs#Handle(buffer, lines) abort + " Matches patterns looking like the following + " + " foobar.js: line 2, col 1, Expected indentation of 1 characters + " + let l:pattern = '^.*:\s\+line \(\d\+\),\s\+col\s\+\(\d\+\),\s\+\(.*\)$' + let l:output = [] + let l:m = ale#util#GetMatches(a:lines, [l:pattern]) + + for l:match in l:m + let l:text = l:match[3] + + let l:obj = { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[3] + \} + + call add(l:output, l:obj) + endfor + + return l:output +endfunction + call ale#linter#Define('javascript', { \ 'name': 'jscs', -\ 'executable': 'jscs', -\ 'command': 'jscs -r unix -n -', -\ 'callback': 'ale#handlers#unix#HandleAsError', +\ 'executable_callback': 'ale_linters#javascript#jscs#GetExecutable', +\ 'command_callback': 'ale_linters#javascript#jscs#GetCommand', +\ 'callback': 'ale_linters#javascript#jscs#Handle', \}) + diff --git a/doc/ale-javascript.txt b/doc/ale-javascript.txt index 97ad709a..4abc6298 100644 --- a/doc/ale-javascript.txt +++ b/doc/ale-javascript.txt @@ -168,6 +168,25 @@ g:ale_javascript_flow_use_global *g:ale_javascript_flow_use_global* See |ale-integrations-local-executables| +=============================================================================== +jscs *ale-javascript-jscs* + +g:ale_javascript_jscs_executable *g:ale_javascript_jscs_executable* + *b:ale_javascript_jscs_executable* + Type: |String| + Default: `'jscs'` + + See |ale-integrations-local-executables| + + +g:ale_javascript_jscs_use_global *g:ale_javascript_jscs_use_global* + *b:ale_javascript_jscs_use_global* + Type: |Number| + Default: `0` + + See |ale-integrations-local-executables| + + =============================================================================== jshint *ale-javascript-jshint* diff --git a/test/command_callback/test_jscs_command_callback.vader b/test/command_callback/test_jscs_command_callback.vader new file mode 100644 index 00000000..8245337e --- /dev/null +++ b/test/command_callback/test_jscs_command_callback.vader @@ -0,0 +1,25 @@ +Before: + runtime ale_linters/javascript/jscs.vim + +After: + call ale#linter#Reset() + let g:ale_javascript_jscs_executable = 'jscs' + +Execute(Should return the correct default values): + AssertEqual + \ 'jscs', + \ ale_linters#javascript#jscs#GetExecutable(bufnr('')) + AssertEqual + \ '''jscs'' --reporter inline --no-colors -', + \ ale_linters#javascript#jscs#GetCommand(bufnr('')) + + +Execute(Should allow using a custom executable): + let g:ale_javascript_jscs_executable = 'foobar' + + AssertEqual + \ 'foobar', + \ ale_linters#javascript#jscs#GetExecutable(bufnr('')) + AssertEqual + \ '''foobar'' --reporter inline --no-colors -', + \ ale_linters#javascript#jscs#GetCommand(bufnr('')) diff --git a/test/handler/test_jscs_handler.vader b/test/handler/test_jscs_handler.vader new file mode 100644 index 00000000..81e91d8e --- /dev/null +++ b/test/handler/test_jscs_handler.vader @@ -0,0 +1,25 @@ + +Execute(jscs should parse lines correctly): + AssertEqual + \ [ + \ { + \ 'lnum': 1, + \ 'col': 7, + \ 'text': 'disallowVar: Variable declarations should use `let` or `const` not `var`', + \ }, + \ { + \ 'lnum': 3, + \ 'col': 21, + \ 'text': 'disallowTrailingWhitespace: Illegal trailing whitespace', + \ }, + \ { + \ 'lnum': 5, + \ 'col': 9, + \ 'text': 'disallowUnusedVariables: Variable `hello` is not used', + \ }, + \ ], + \ ale_linters#javascript#jscs#Handle(347, [ + \ 'foobar.js: line 1, col 7, disallowVar: Variable declarations should use `let` or `const` not `var`', + \ 'foobar.js: line 3, col 21, disallowTrailingWhitespace: Illegal trailing whitespace', + \ 'foobar.js: line 5, col 9, disallowUnusedVariables: Variable `hello` is not used', + \ ])