Add a fix function for breaking up long Python lines, which is hidden for now
This commit is contained in:
parent
d5ae3201a4
commit
78b9ae0f1c
3 changed files with 76 additions and 0 deletions
|
@ -23,3 +23,38 @@ function! ale#fixers#generic_python#AddLinesBeforeControlStatements(buffer, line
|
|||
|
||||
return l:new_lines
|
||||
endfunction
|
||||
|
||||
" This function breaks up long lines so that autopep8 or other tools can
|
||||
" fix the badly-indented code which is produced as a result.
|
||||
function! ale#fixers#generic_python#BreakUpLongLines(buffer, lines) abort
|
||||
" Default to a maximum line length of 79
|
||||
let l:max_line_length = 79
|
||||
let l:conf = ale#path#FindNearestFile(a:buffer, 'setup.cfg')
|
||||
|
||||
" Read the maximum line length from setup.cfg
|
||||
if !empty(l:conf)
|
||||
for l:match in ale#util#GetMatches(
|
||||
\ readfile(l:conf),
|
||||
\ '\v^ *max-line-length *\= *(\d+)',
|
||||
\)
|
||||
let l:max_line_length = str2nr(l:match[1])
|
||||
endfor
|
||||
endif
|
||||
|
||||
let l:new_list = []
|
||||
|
||||
for l:line in a:lines
|
||||
if len(l:line) > l:max_line_length && l:line !~# '# *noqa'
|
||||
let l:line = substitute(l:line, '\v([(,])([^)])', '\1\n\2', 'g')
|
||||
let l:line = substitute(l:line, '\v([^(])([)])', '\1,\n\2', 'g')
|
||||
|
||||
for l:split_line in split(l:line, "\n")
|
||||
call add(l:new_list, l:split_line)
|
||||
endfor
|
||||
else
|
||||
call add(l:new_list, l:line)
|
||||
endif
|
||||
endfor
|
||||
|
||||
return l:new_list
|
||||
endfunction
|
||||
|
|
2
test/fixers/long-line-project/setup.cfg
Normal file
2
test/fixers/long-line-project/setup.cfg
Normal file
|
@ -0,0 +1,2 @@
|
|||
[flake8]
|
||||
max-line-length = 90
|
39
test/fixers/test_break_up_long_lines_python_fixer.vader
Normal file
39
test/fixers/test_break_up_long_lines_python_fixer.vader
Normal file
|
@ -0,0 +1,39 @@
|
|||
Before:
|
||||
call ale#test#SetDirectory('/testplugin/test/fixers')
|
||||
|
||||
After:
|
||||
call ale#test#RestoreDirectory()
|
||||
|
||||
Execute(Long lines with basic function calls should be broken up correctly):
|
||||
AssertEqual
|
||||
\ [
|
||||
\ 'def foo():',
|
||||
\ ' some_variable = this_is_a_longer_function(',
|
||||
\ 'first_argument,',
|
||||
\ ' second_argument,',
|
||||
\ ' third_with_function_call(',
|
||||
\ 'foo,',
|
||||
\ ' bar,',
|
||||
\ '))',
|
||||
\ ],
|
||||
\ ale#fixers#generic_python#BreakUpLongLines(bufnr(''), [
|
||||
\ 'def foo():',
|
||||
\ ' some_variable = this_is_a_longer_function(first_argument, second_argument, third_with_function_call(foo, bar))',
|
||||
\ ])
|
||||
|
||||
Execute(Longer lines should be permitted if a configuration file allows it):
|
||||
call ale#test#SetFilename('long-line-project/foo/bar.py')
|
||||
|
||||
AssertEqual
|
||||
\ [
|
||||
\ 'x = this_line_is_between_79_and_90_characters(first, second, third, fourth, fifth)',
|
||||
\ 'y = this_line_is_longer_than_90_characters(',
|
||||
\ 'much_longer_word,',
|
||||
\ ' another_longer_word,',
|
||||
\ ' a_third_long_word,',
|
||||
\ ')'
|
||||
\ ],
|
||||
\ ale#fixers#generic_python#BreakUpLongLines(bufnr(''), [
|
||||
\ 'x = this_line_is_between_79_and_90_characters(first, second, third, fourth, fifth)',
|
||||
\ 'y = this_line_is_longer_than_90_characters(much_longer_word, another_longer_word, a_third_long_word)',
|
||||
\ ])
|
Reference in a new issue