summaryrefslogtreecommitdiff
path: root/ale_linters/python
diff options
context:
space:
mode:
authorw0rp <devw0rp@gmail.com>2017-02-06 11:12:21 +0000
committerw0rp <devw0rp@gmail.com>2017-02-06 11:12:27 +0000
commita3b7056cadb045906141cc342404950b6d673959 (patch)
tree0e37604b36c6f1ad5085b1e51fb6c220db39e4e3 /ale_linters/python
parenta9a76241ac12901f3f48ab80a6552204c5d01159 (diff)
downloadale-a3b7056cadb045906141cc342404950b6d673959.zip
#289 Only use the --stdin-display-name flag if the flake8 version supports it
Diffstat (limited to 'ale_linters/python')
-rw-r--r--ale_linters/python/flake8.vim58
1 files changed, 55 insertions, 3 deletions
diff --git a/ale_linters/python/flake8.vim b/ale_linters/python/flake8.vim
index 42b8ca78..bd136b27 100644
--- a/ale_linters/python/flake8.vim
+++ b/ale_linters/python/flake8.vim
@@ -7,18 +7,70 @@ let g:ale_python_flake8_executable =
let g:ale_python_flake8_args =
\ get(g:, 'ale_python_flake8_args', '')
+" A map from Python executable paths to semver strings parsed for those
+" executables, so we don't have to look up the version number constantly.
+let s:version_cache = {}
+
function! ale_linters#python#flake8#GetExecutable(buffer) abort
return g:ale_python_flake8_executable
endfunction
-function! ale_linters#python#flake8#GetCommand(buffer) abort
+function! ale_linters#python#flake8#VersionCheck(buffer) abort
+ let l:executable = ale_linters#python#flake8#GetExecutable(a:buffer)
+
+ " If we have previously stored the version number in a cache, then
+ " don't look it up again.
+ if has_key(s:version_cache, l:executable)
+ " Returning an empty string skips this command.
+ return ''
+ endif
+
+ return ale_linters#python#flake8#GetExecutable(a:buffer) . ' --version'
+endfunction
+
+" Get the flake8 version from the output, or the cache.
+function! s:GetVersion(buffer, version_output) abort
+ let l:executable = ale_linters#python#flake8#GetExecutable(a:buffer)
+ let l:version = []
+
+ " Get the version from the cache.
+ if has_key(s:version_cache, l:executable)
+ return s:version_cache[l:executable]
+ endif
+
+ if !empty(a:version_output)
+ " Parse the version string, and store it in the cache.
+ let l:version = ale#semver#Parse(a:version_output[0])
+ let s:version_cache[l:executable] = l:version
+ endif
+
+ return l:version
+endfunction
+
+" flake8 versions 3 and up support the --stdin-display-name argument.
+function! s:SupportsDisplayName(version) abort
+ return !empty(a:version) && ale#semver#GreaterOrEqual(a:version, [3, 0, 0])
+endfunction
+
+function! ale_linters#python#flake8#GetCommand(buffer, version_output) abort
+ let l:version = s:GetVersion(a:buffer, a:version_output)
+
+ " Only include the --stdin-display-name argument if we can parse the
+ " flake8 version, and it is recent enough to support it.
+ let l:display_name_args = s:SupportsDisplayName(l:version)
+ \ ? '--stdin-display-name %s'
+ \ : ''
+
return ale_linters#python#flake8#GetExecutable(a:buffer)
- \ . ' ' . g:ale_python_flake8_args . ' --stdin-display-name %s -'
+ \ . ' ' . g:ale_python_flake8_args . ' ' . l:display_name_args . ' -'
endfunction
call ale#linter#Define('python', {
\ 'name': 'flake8',
\ 'executable_callback': 'ale_linters#python#flake8#GetExecutable',
-\ 'command_callback': 'ale_linters#python#flake8#GetCommand',
+\ 'command_chain': [
+\ {'callback': 'ale_linters#python#flake8#VersionCheck'},
+\ {'callback': 'ale_linters#python#flake8#GetCommand'},
+\ ],
\ 'callback': 'ale#handlers#HandlePEP8Format',
\})