Before: Save g:ale_python_flake8_executable Save g:ale_python_flake8_options Save g:ale_python_flake8_use_global unlet! g:ale_python_flake8_executable unlet! g:ale_python_flake8_args unlet! g:ale_python_flake8_options unlet! g:ale_python_flake8_use_global runtime ale_linters/python/flake8.vim call ale#test#SetDirectory('/testplugin/test/command_callback') After: Restore unlet! g:ale_python_flake8_args call ale#test#RestoreDirectory() call ale#linter#Reset() call ale_linters#python#flake8#ClearVersionCache() Execute(The flake8 callbacks should return the correct default values): AssertEqual \ 'flake8', \ ale_linters#python#flake8#GetExecutable(bufnr('')) AssertEqual \ '''flake8'' --version', \ ale_linters#python#flake8#VersionCheck(bufnr('')) AssertEqual \ '''flake8'' --format=default --stdin-display-name %s -', \ ale_linters#python#flake8#GetCommand(bufnr(''), ['3.0.0']) " Try with older versions. call ale_linters#python#flake8#ClearVersionCache() AssertEqual \ '''flake8'' --format=default -', \ ale_linters#python#flake8#GetCommand(bufnr(''), ['2.9.9']) Execute(The flake8 command callback should let you set options): let g:ale_python_flake8_options = '--some-option' AssertEqual \ '''flake8'' --some-option --format=default --stdin-display-name %s -', \ ale_linters#python#flake8#GetCommand(bufnr(''), ['3.0.4']) call ale_linters#python#flake8#ClearVersionCache() AssertEqual \ '''flake8'' --some-option --format=default -', \ ale_linters#python#flake8#GetCommand(bufnr(''), ['2.9.9']) Execute(You should be able to set a custom executable and it should be escaped): let g:ale_python_flake8_executable = 'executable with spaces' AssertEqual \ 'executable with spaces', \ ale_linters#python#flake8#GetExecutable(bufnr('')) AssertEqual \ '''executable with spaces'' --version', \ ale_linters#python#flake8#VersionCheck(bufnr('')) AssertEqual \ '''executable with spaces'' --format=default --stdin-display-name %s -', \ ale_linters#python#flake8#GetCommand(bufnr(''), ['3.0.0']) Execute(The flake8 callbacks should detect virtualenv directories): silent execute 'file ' . fnameescape(g:dir . '/python_paths/with_virtualenv/subdir/foo/bar.py') AssertEqual \ g:dir . '/python_paths/with_virtualenv/env/bin/flake8', \ ale_linters#python#flake8#GetExecutable(bufnr('')) AssertEqual \ '''' . g:dir . '/python_paths/with_virtualenv/env/bin/flake8'' --version', \ ale_linters#python#flake8#VersionCheck(bufnr('')) AssertEqual \ '''' . g:dir . '/python_paths/with_virtualenv/env/bin/flake8''' \ . ' --format=default --stdin-display-name %s -', \ ale_linters#python#flake8#GetCommand(bufnr(''), ['3.0.0']) Execute(The FindProjectRoot should detect the project root directory for namespace package via Manifest.in): silent execute 'file ' . fnameescape(g:dir . '/python_paths/namespace_package_manifest/namespace/foo/bar.py') AssertEqual \ fnameescape(g:dir . '/python_paths/namespace_package_manifest'), \ ale#python#FindProjectRoot(bufnr('')) Execute(The FindProjectRoot should detect the project root directory for namespace package via setup.cf): silent execute 'file ' . fnameescape(g:dir . '/python_paths/namespace_package_setup/namespace/foo/bar.py') AssertEqual \ fnameescape(g:dir . '/python_paths/namespace_package_setup'), \ ale#python#FindProjectRoot(bufnr('')) Execute(The FindProjectRoot should detect the project root directory for namespace package via pytest.ini): silent execute 'file ' . fnameescape(g:dir . '/python_paths/namespace_package_pytest/namespace/foo/bar.py') AssertEqual \ fnameescape(g:dir . '/python_paths/namespace_package_pytest'), \ ale#python#FindProjectRoot(bufnr('')) Execute(The FindProjectRoot should detect the project root directory for namespace package via tox.ini): silent execute 'file ' . fnameescape(g:dir . '/python_paths/namespace_package_tox/namespace/foo/bar.py') AssertEqual \ fnameescape(g:dir . '/python_paths/namespace_package_tox'), \ ale#python#FindProjectRoot(bufnr('')) Execute(The FindProjectRoot should detect the project root directory for non-namespace package): silent execute 'file ' . fnameescape(g:dir . '/python_paths/no_virtualenv/subdir/foo/bar.py') AssertEqual \ fnameescape(g:dir . '/python_paths/no_virtualenv/subdir'), \ ale#python#FindProjectRoot(bufnr('')) " Some users currently run flake8 this way, so we should support it. Execute(Using `python -m flake8` should be supported for running flake8): silent execute 'file ' . fnameescape(g:dir . '/python_paths/with_virtualenv/subdir/foo/bar.py') let g:ale_python_flake8_executable = 'python' let g:ale_python_flake8_options = '-m flake8 --some-option' AssertEqual \ 'python', \ ale_linters#python#flake8#GetExecutable(bufnr('')) AssertEqual \ '''python'' -m flake8 --version', \ ale_linters#python#flake8#VersionCheck(bufnr('')) AssertEqual \ '''python'' -m flake8 --some-option --format=default -', \ ale_linters#python#flake8#GetCommand(bufnr(''), ['2.9.9']) call ale_linters#python#flake8#ClearVersionCache() " Leading spaces shouldn't matter let g:ale_python_flake8_options = ' -m flake8 --some-option' AssertEqual \ 'python', \ ale_linters#python#flake8#GetExecutable(bufnr('')) AssertEqual \ '''python'' -m flake8 --version', \ ale_linters#python#flake8#VersionCheck(bufnr('')) AssertEqual \ '''python'' -m flake8 --some-option --format=default -', \ ale_linters#python#flake8#GetCommand(bufnr(''), ['2.9.9']) Execute(Using `python2 -m flake8` should be use with the old args option): let g:ale_python_flake8_executable = 'python2' let g:ale_python_flake8_args = '-m flake8' let g:ale_python_flake8_use_global = 0 unlet! g:ale_python_flake8_options call ale#linter#Reset() runtime ale_linters/python/flake8.vim silent execute 'file ' . fnameescape(g:dir . '/python_paths/with_virtualenv/subdir/foo/bar.py') AssertEqual \ 'python2', \ ale_linters#python#flake8#GetExecutable(bufnr('')) AssertEqual \ '''python2'' -m flake8 --version', \ ale_linters#python#flake8#VersionCheck(bufnr('')) AssertEqual \ '''python2'' -m flake8 --format=default -', \ ale_linters#python#flake8#GetCommand(bufnr(''), ['2.9.9'])