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
|
return l:new_lines
|
||||||
endfunction
|
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