Close #4389 - Run pyright via poetry, pipenv, venv

Add support for automatically detecting and running Pyright via poetry,
pipenv, and virtualenv directories just like we do with flake8.
This commit is contained in:
w0rp 2023-02-08 08:24:16 +00:00
parent f2a21c960a
commit 6ff1f0b200
No known key found for this signature in database
GPG Key ID: 0FC1ECAA8C81CD83
3 changed files with 80 additions and 12 deletions

View File

@ -1,5 +1,21 @@
call ale#Set('python_pyright_use_global', get(g:, 'ale_use_global_executables', 0))
call ale#Set('python_pyright_executable', 'pyright-langserver')
call ale#Set('python_pyright_config', {})
call ale#Set('python_pyright_auto_pipenv', 0)
call ale#Set('python_pyright_auto_poetry', 0)
" Force the cwd of the server to be the same as the project root to
" fix issues with treating local files matching first or third party library
" names being imported incorrectly.
function! ale_linters#python#pyright#GetCwd(buffer) abort
let l:fake_linter = {
\ 'name': 'pyright',
\ 'project_root': function('ale#python#FindProjectRoot'),
\}
let l:root = ale#lsp_linter#FindProjectRoot(a:buffer, l:fake_linter)
return !empty(l:root) ? l:root : v:null
endfunction
function! ale_linters#python#pyright#GetConfig(buffer) abort
let l:config = deepcopy(ale#Var(a:buffer, 'python_pyright_config'))
@ -32,25 +48,36 @@ function! ale_linters#python#pyright#GetConfig(buffer) abort
return l:config
endfunction
" Force the cwd of the server to be the same as the project root to
" fix issues with treating local files matching first or third party library
" names being imported incorrectly.
function! ale_linters#python#pyright#GetCwd(buffer) abort
let l:fake_linter = {
\ 'name': 'pyright',
\ 'project_root': function('ale#python#FindProjectRoot'),
\}
let l:root = ale#lsp_linter#FindProjectRoot(a:buffer, l:fake_linter)
function! ale_linters#python#pyright#GetExecutable(buffer) abort
if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_pyright_auto_pipenv'))
\ && ale#python#PipenvPresent(a:buffer)
return 'pipenv'
endif
return !empty(l:root) ? l:root : v:null
if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_pyright_auto_poetry'))
\ && ale#python#PoetryPresent(a:buffer)
return 'poetry'
endif
return ale#python#FindExecutable(a:buffer, 'python_pyright', ['pyright-langserver'])
endfunction
function! ale_linters#python#pyright#GetCommand(buffer) abort
let l:executable = ale_linters#python#pyright#GetExecutable(a:buffer)
let l:exec_args = l:executable =~? 'pipenv\|poetry$'
\ ? ' run pyright'
\ : ''
return ale#Escape(l:executable) . l:exec_args . ' --stdio'
endfunction
call ale#linter#Define('python', {
\ 'name': 'pyright',
\ 'lsp': 'stdio',
\ 'executable': {b -> ale#Var(b, 'python_pyright_executable')},
\ 'cwd': function('ale_linters#python#pyright#GetCwd'),
\ 'command': '%e --stdio',
\ 'executable': function('ale_linters#python#pyright#GetExecutable'),
\ 'command': function('ale_linters#python#pyright#GetCommand'),
\ 'project_root': function('ale#python#FindProjectRoot'),
\ 'completion_filter': 'ale#completion#python#CompletionItemFilter',
\ 'lsp_config': function('ale_linters#python#pyright#GetConfig'),

View File

@ -122,3 +122,44 @@ Execute(You should be able to define other settings):
\ 'disableLanguageServices': v:true,
\ },
\}
Execute(The pyright callbacks should detect virtualenv directories):
call ale#test#SetFilename('../test-files/python/with_virtualenv/subdir/foo/bar.py')
let b:executable = ale#path#Simplify(
\ g:dir . '/../test-files/python/with_virtualenv/env/' . b:bin_dir . '/pyright-langserver'
\)
AssertLinter b:executable, ale#Escape(b:executable) . ' --stdio'
Execute(Setting executable to 'pipenv' should append 'run pyright'):
call ale#test#SetFilename('../test-files')
let g:ale_python_pyright_executable = 'path/to/pipenv'
GivenCommandOutput []
AssertLinter 'path/to/pipenv',
\ ale#Escape('path/to/pipenv') . ' run pyright --stdio'
Execute(Pipenv is detected when python_pyright_auto_pipenv is set):
let g:ale_python_pyright_auto_pipenv = 1
call ale#test#SetFilename('../test-files/python/pipenv/whatever.py')
AssertLinterCwd ale#python#FindProjectRootIni(bufnr(''))
AssertLinter 'pipenv',
\ ale#Escape('pipenv') . ' run pyright --stdio'
Execute(Setting executable to 'poetry' should append 'run pyright'):
let g:ale_python_pyright_executable = 'path/to/poetry'
GivenCommandOutput []
AssertLinter 'path/to/poetry',
\ ale#Escape('path/to/poetry') . ' run pyright --stdio'
Execute(poetry is detected when python_pyright_auto_poetry is set):
let g:ale_python_pyright_auto_poetry = 1
call ale#test#SetFilename('../test-files/python/poetry/whatever.py')
AssertLinterCwd ale#python#FindProjectRootIni(bufnr(''))
AssertLinter 'poetry',
\ ale#Escape('poetry') . ' run pyright --stdio'