From bbf02d837e3a501c6acaca51b257672198d35591 Mon Sep 17 00:00:00 2001 From: Aryeh Leib Taurog Date: Tue, 1 Jan 2019 21:37:42 +0200 Subject: [PATCH 1/4] test elm-make changes to rootdir when elm.json is found most projects will have an elm.json file (>= 0.19) or elm-package.json (< 0.19) --- .../test_elm_make_command_callback.vader | 9 ++++++--- test/elm-test-files/app/elm.json | 0 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 test/elm-test-files/app/elm.json diff --git a/test/command_callback/test_elm_make_command_callback.vader b/test/command_callback/test_elm_make_command_callback.vader index 6d95676f..9e3ce214 100644 --- a/test/command_callback/test_elm_make_command_callback.vader +++ b/test/command_callback/test_elm_make_command_callback.vader @@ -12,7 +12,8 @@ Execute(should get valid executable with default params): let g:executable = ale#path#Simplify(g:dir . '/../elm-test-files/app/node_modules/.bin/elm') AssertLinter g:executable, - \ ale#Escape(g:executable) . ' make --report=json --output=/dev/null %t' + \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/app')) . ' && ' + \ . ale#Escape(g:executable) . ' make --report=json --output=/dev/null %t' Execute(should get valid executable with 'use_global' params): let g:ale_elm_make_use_global = 1 @@ -20,7 +21,8 @@ Execute(should get valid executable with 'use_global' params): call ale#test#SetFilename('../elm-test-files/app/testfile.elm') AssertLinter 'elm', - \ ale#Escape('elm') . ' make --report=json --output=/dev/null %t' + \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/app')) . ' && ' + \ . ale#Escape('elm') . ' make --report=json --output=/dev/null %t' Execute(should get valid executable with 'use_global' and 'executable' params): let g:ale_elm_make_executable = 'other-elm' @@ -29,4 +31,5 @@ Execute(should get valid executable with 'use_global' and 'executable' params): call ale#test#SetFilename('../elm-test-files/app/testfile.elm') AssertLinter 'other-elm', - \ ale#Escape('other-elm') . ' make --report=json --output=/dev/null %t' + \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/app')) . ' && ' + \ . ale#Escape('other-elm') . ' make --report=json --output=/dev/null %t' diff --git a/test/elm-test-files/app/elm.json b/test/elm-test-files/app/elm.json new file mode 100644 index 00000000..e69de29b From ba38688dffd846a633ae2c076441927c864ffd5f Mon Sep 17 00:00:00 2001 From: Aryeh Leib Taurog Date: Tue, 1 Jan 2019 20:42:06 +0200 Subject: [PATCH 2/4] support tests/ with elm 0.19.0 With earlier elm versions, a separate package file is maintained for tests, which when properly configured enabled the compiler to find what it needed to compile the tests. Under elm 0.19, test dependencies are managed in the top-level package file, so `elm make` will fail on the tests. `elm-test make` is required in this case. See https://github.com/elm-explorations/test/issues/64 --- ale_linters/elm/make.vim | 66 +++++++++++++++++-- .../test_elm_make_command_callback.vader | 32 +++++++-- test/elm-test-files/{app => newapp}/elm.json | 0 .../{app => newapp}/node_modules/.bin/elm | 0 .../node_modules/.bin/elm-test} | 0 test/elm-test-files/newapp/src/Main.elm | 0 .../elm-test-files/newapp/tests/TestSuite.elm | 0 test/elm-test-files/oldapp/elm-package.json | 0 .../oldapp/node_modules/.bin/elm | 0 .../oldapp/node_modules/.bin/elm-test | 0 test/elm-test-files/oldapp/src/Main.elm | 0 .../elm-test-files/oldapp/tests/TestSuite.elm | 0 12 files changed, 84 insertions(+), 14 deletions(-) rename test/elm-test-files/{app => newapp}/elm.json (100%) rename test/elm-test-files/{app => newapp}/node_modules/.bin/elm (100%) rename test/elm-test-files/{app/filetest.elm => newapp/node_modules/.bin/elm-test} (100%) create mode 100644 test/elm-test-files/newapp/src/Main.elm create mode 100644 test/elm-test-files/newapp/tests/TestSuite.elm create mode 100644 test/elm-test-files/oldapp/elm-package.json create mode 100644 test/elm-test-files/oldapp/node_modules/.bin/elm create mode 100644 test/elm-test-files/oldapp/node_modules/.bin/elm-test create mode 100644 test/elm-test-files/oldapp/src/Main.elm create mode 100644 test/elm-test-files/oldapp/tests/TestSuite.elm diff --git a/ale_linters/elm/make.vim b/ale_linters/elm/make.vim index ddea983f..a6884750 100644 --- a/ale_linters/elm/make.vim +++ b/ale_linters/elm/make.vim @@ -137,9 +137,7 @@ function! ale_linters#elm#make#ParseMessageItem(item) abort endif endfunction -" Return the command to execute the linter in the projects directory. -" If it doesn't, then this will fail when imports are needed. -function! ale_linters#elm#make#GetCommand(buffer) abort +function! ale_linters#elm#make#GetPackageFile(buffer) abort let l:elm_json = ale#path#FindNearestFile(a:buffer, 'elm.json') if empty(l:elm_json) @@ -147,10 +145,55 @@ function! ale_linters#elm#make#GetCommand(buffer) abort let l:elm_json = ale#path#FindNearestFile(a:buffer, 'elm-package.json') endif + return l:elm_json +endfunction + +function! ale_linters#elm#make#IsVersionGte19(buffer) abort + let l:elm_json = ale_linters#elm#make#GetPackageFile(a:buffer) + + if l:elm_json =~# '-package' + return 0 + else + return 1 + endif +endfunction + +function! ale_linters#elm#make#GetRootDir(buffer) abort + let l:elm_json = ale_linters#elm#make#GetPackageFile(a:buffer) + if empty(l:elm_json) + return '' + else + return fnamemodify(l:elm_json, ':p:h') + endif +endfunction + +function! ale_linters#elm#make#IsTest(buffer) abort + let l:root_dir = ale_linters#elm#make#GetRootDir(a:buffer) + + if empty(l:root_dir) + return 0 + endif + + let l:tests_dir = join([l:root_dir, 'tests', ''], has('win32') ? '\' : '/') + + let l:buffer_path = fnamemodify(bufname(a:buffer), ':p') + + if match(l:buffer_path, l:tests_dir) == 0 + return 1 + else + return 0 + endif +endfunction + +" Return the command to execute the linter in the projects directory. +" If it doesn't, then this will fail when imports are needed. +function! ale_linters#elm#make#GetCommand(buffer) abort + let l:root_dir = ale_linters#elm#make#GetRootDir(a:buffer) + + if empty(l:root_dir) let l:dir_set_cmd = '' else - let l:root_dir = fnamemodify(l:elm_json, ':p:h') let l:dir_set_cmd = 'cd ' . ale#Escape(l:root_dir) . ' && ' endif @@ -161,11 +204,20 @@ function! ale_linters#elm#make#GetCommand(buffer) abort return l:dir_set_cmd . '%e make --report=json --output=/dev/null %t' endfunction +function! ale_linters#elm#make#GetExecutable(buffer) abort + let l:is_test = ale_linters#elm#make#IsTest(a:buffer) + let l:is_v19 = ale_linters#elm#make#IsVersionGte19(a:buffer) + + if l:is_test && l:is_v19 + return ale#node#FindExecutable(a:buffer, 'elm_make', ['node_modules/.bin/elm-test']) + else + return ale#node#FindExecutable(a:buffer, 'elm_make', ['node_modules/.bin/elm']) + endif +endfunction + call ale#linter#Define('elm', { \ 'name': 'make', -\ 'executable_callback': ale#node#FindExecutableFunc('elm_make', [ -\ 'node_modules/.bin/elm', -\ ]), +\ 'executable_callback': 'ale_linters#elm#make#GetExecutable', \ 'output_stream': 'both', \ 'command_callback': 'ale_linters#elm#make#GetCommand', \ 'callback': 'ale_linters#elm#make#Handle' diff --git a/test/command_callback/test_elm_make_command_callback.vader b/test/command_callback/test_elm_make_command_callback.vader index 9e3ce214..6400e187 100644 --- a/test/command_callback/test_elm_make_command_callback.vader +++ b/test/command_callback/test_elm_make_command_callback.vader @@ -7,29 +7,47 @@ After: call ale#assert#TearDownLinterTest() Execute(should get valid executable with default params): - call ale#test#SetFilename('../elm-test-files/app/testfile.elm') + call ale#test#SetFilename('../elm-test-files/newapp/src/Main.elm') - let g:executable = ale#path#Simplify(g:dir . '/../elm-test-files/app/node_modules/.bin/elm') + let g:executable = ale#path#Simplify(g:dir . '/../elm-test-files/newapp/node_modules/.bin/elm') AssertLinter g:executable, - \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/app')) . ' && ' + \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/newapp')) . ' && ' + \ . ale#Escape(g:executable) . ' make --report=json --output=/dev/null %t' + +Execute(should get elm-test executable for test code with elm >= 0.19): + call ale#test#SetFilename('../elm-test-files/newapp/tests/TestSuite.elm') + + let g:executable = ale#path#Simplify(g:dir . '/../elm-test-files/newapp/node_modules/.bin/elm-test') + + AssertLinter g:executable, + \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/newapp')) . ' && ' + \ . ale#Escape(g:executable) . ' make --report=json --output=/dev/null %t' + +Execute(should get plain elm executable for test code with elm < 0.19): + call ale#test#SetFilename('../elm-test-files/oldapp/tests/TestSuite.elm') + + let g:executable = ale#path#Simplify(g:dir . '/../elm-test-files/oldapp/node_modules/.bin/elm') + + AssertLinter g:executable, + \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/oldapp')) . ' && ' \ . ale#Escape(g:executable) . ' make --report=json --output=/dev/null %t' Execute(should get valid executable with 'use_global' params): let g:ale_elm_make_use_global = 1 - call ale#test#SetFilename('../elm-test-files/app/testfile.elm') + call ale#test#SetFilename('../elm-test-files/newapp/src/Main.elm') AssertLinter 'elm', - \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/app')) . ' && ' + \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/newapp')) . ' && ' \ . ale#Escape('elm') . ' make --report=json --output=/dev/null %t' Execute(should get valid executable with 'use_global' and 'executable' params): let g:ale_elm_make_executable = 'other-elm' let g:ale_elm_make_use_global = 1 - call ale#test#SetFilename('../elm-test-files/app/testfile.elm') + call ale#test#SetFilename('../elm-test-files/newapp/src/Main.elm') AssertLinter 'other-elm', - \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/app')) . ' && ' + \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/newapp')) . ' && ' \ . ale#Escape('other-elm') . ' make --report=json --output=/dev/null %t' diff --git a/test/elm-test-files/app/elm.json b/test/elm-test-files/newapp/elm.json similarity index 100% rename from test/elm-test-files/app/elm.json rename to test/elm-test-files/newapp/elm.json diff --git a/test/elm-test-files/app/node_modules/.bin/elm b/test/elm-test-files/newapp/node_modules/.bin/elm similarity index 100% rename from test/elm-test-files/app/node_modules/.bin/elm rename to test/elm-test-files/newapp/node_modules/.bin/elm diff --git a/test/elm-test-files/app/filetest.elm b/test/elm-test-files/newapp/node_modules/.bin/elm-test similarity index 100% rename from test/elm-test-files/app/filetest.elm rename to test/elm-test-files/newapp/node_modules/.bin/elm-test diff --git a/test/elm-test-files/newapp/src/Main.elm b/test/elm-test-files/newapp/src/Main.elm new file mode 100644 index 00000000..e69de29b diff --git a/test/elm-test-files/newapp/tests/TestSuite.elm b/test/elm-test-files/newapp/tests/TestSuite.elm new file mode 100644 index 00000000..e69de29b diff --git a/test/elm-test-files/oldapp/elm-package.json b/test/elm-test-files/oldapp/elm-package.json new file mode 100644 index 00000000..e69de29b diff --git a/test/elm-test-files/oldapp/node_modules/.bin/elm b/test/elm-test-files/oldapp/node_modules/.bin/elm new file mode 100644 index 00000000..e69de29b diff --git a/test/elm-test-files/oldapp/node_modules/.bin/elm-test b/test/elm-test-files/oldapp/node_modules/.bin/elm-test new file mode 100644 index 00000000..e69de29b diff --git a/test/elm-test-files/oldapp/src/Main.elm b/test/elm-test-files/oldapp/src/Main.elm new file mode 100644 index 00000000..e69de29b diff --git a/test/elm-test-files/oldapp/tests/TestSuite.elm b/test/elm-test-files/oldapp/tests/TestSuite.elm new file mode 100644 index 00000000..e69de29b From 4a11a6337e37a1e3b5ad28f77f15979ccd47d587 Mon Sep 17 00:00:00 2001 From: Aryeh Leib Taurog Date: Thu, 3 Jan 2019 21:45:25 +0200 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20don=E2=80=99t=20use=20regex=20match?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit windows paths have backslashes, which are special in regex patterns --- ale_linters/elm/make.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ale_linters/elm/make.vim b/ale_linters/elm/make.vim index a6884750..37b8d07c 100644 --- a/ale_linters/elm/make.vim +++ b/ale_linters/elm/make.vim @@ -179,7 +179,7 @@ function! ale_linters#elm#make#IsTest(buffer) abort let l:buffer_path = fnamemodify(bufname(a:buffer), ':p') - if match(l:buffer_path, l:tests_dir) == 0 + if stridx(l:buffer_path, l:tests_dir) == 0 return 1 else return 0 From 1f21eb0c422e8ae351981544a7e0da4f369e6144 Mon Sep 17 00:00:00 2001 From: Aryeh Leib Taurog Date: Fri, 4 Jan 2019 08:57:14 +0200 Subject: [PATCH 4/4] =?UTF-8?q?fallback=20to=20elm=20if=20elm-tests=20isn?= =?UTF-8?q?=E2=80=99t=20available?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ale_linters/elm/make.vim | 6 +++++- .../test_elm_make_command_callback.vader | 9 +++++++++ test/elm-test-files/newapp-notests/elm.json | 0 test/elm-test-files/newapp-notests/node_modules/.bin/elm | 0 test/elm-test-files/newapp-notests/tests/TestMain.elm | 0 5 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 test/elm-test-files/newapp-notests/elm.json create mode 100644 test/elm-test-files/newapp-notests/node_modules/.bin/elm create mode 100644 test/elm-test-files/newapp-notests/tests/TestMain.elm diff --git a/ale_linters/elm/make.vim b/ale_linters/elm/make.vim index 37b8d07c..76622028 100644 --- a/ale_linters/elm/make.vim +++ b/ale_linters/elm/make.vim @@ -209,7 +209,11 @@ function! ale_linters#elm#make#GetExecutable(buffer) abort let l:is_v19 = ale_linters#elm#make#IsVersionGte19(a:buffer) if l:is_test && l:is_v19 - return ale#node#FindExecutable(a:buffer, 'elm_make', ['node_modules/.bin/elm-test']) + return ale#node#FindExecutable( +\ a:buffer, +\ 'elm_make', +\ ['node_modules/.bin/elm-test', 'node_modules/.bin/elm'] +\ ) else return ale#node#FindExecutable(a:buffer, 'elm_make', ['node_modules/.bin/elm']) endif diff --git a/test/command_callback/test_elm_make_command_callback.vader b/test/command_callback/test_elm_make_command_callback.vader index 6400e187..02b2d76c 100644 --- a/test/command_callback/test_elm_make_command_callback.vader +++ b/test/command_callback/test_elm_make_command_callback.vader @@ -24,6 +24,15 @@ Execute(should get elm-test executable for test code with elm >= 0.19): \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/newapp')) . ' && ' \ . ale#Escape(g:executable) . ' make --report=json --output=/dev/null %t' +Execute(should fallback to elm executable with elm >= 0.19): + call ale#test#SetFilename('../elm-test-files/newapp-notests/tests/TestMain.elm') + + let g:executable = ale#path#Simplify(g:dir . '/../elm-test-files/newapp-notests/node_modules/.bin/elm') + + AssertLinter g:executable, + \ 'cd ' . ale#Escape(ale#path#Simplify(g:dir . '/../elm-test-files/newapp-notests')) . ' && ' + \ . ale#Escape(g:executable) . ' make --report=json --output=/dev/null %t' + Execute(should get plain elm executable for test code with elm < 0.19): call ale#test#SetFilename('../elm-test-files/oldapp/tests/TestSuite.elm') diff --git a/test/elm-test-files/newapp-notests/elm.json b/test/elm-test-files/newapp-notests/elm.json new file mode 100644 index 00000000..e69de29b diff --git a/test/elm-test-files/newapp-notests/node_modules/.bin/elm b/test/elm-test-files/newapp-notests/node_modules/.bin/elm new file mode 100644 index 00000000..e69de29b diff --git a/test/elm-test-files/newapp-notests/tests/TestMain.elm b/test/elm-test-files/newapp-notests/tests/TestMain.elm new file mode 100644 index 00000000..e69de29b