summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--autoload/ale/fixers/generic_python.vim35
-rw-r--r--test/fixers/long-line-project/setup.cfg2
-rw-r--r--test/fixers/test_break_up_long_lines_python_fixer.vader39
3 files changed, 76 insertions, 0 deletions
diff --git a/autoload/ale/fixers/generic_python.vim b/autoload/ale/fixers/generic_python.vim
index 8bdde505..124146be 100644
--- a/autoload/ale/fixers/generic_python.vim
+++ b/autoload/ale/fixers/generic_python.vim
@@ -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
diff --git a/test/fixers/long-line-project/setup.cfg b/test/fixers/long-line-project/setup.cfg
new file mode 100644
index 00000000..43d7a3a1
--- /dev/null
+++ b/test/fixers/long-line-project/setup.cfg
@@ -0,0 +1,2 @@
+[flake8]
+max-line-length = 90
diff --git a/test/fixers/test_break_up_long_lines_python_fixer.vader b/test/fixers/test_break_up_long_lines_python_fixer.vader
new file mode 100644
index 00000000..5fd991f0
--- /dev/null
+++ b/test/fixers/test_break_up_long_lines_python_fixer.vader
@@ -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)',
+ \ ])