summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian <bardzusny@users.noreply.github.com>2017-04-07 16:38:50 +0200
committerw0rp <w0rp@users.noreply.github.com>2017-04-07 15:38:50 +0100
commitd28d7f732ae5c5017c7e4c2497a744a781e48dab (patch)
tree14039f15233099ed5b178fd75975e2fe20b7d06c
parent4caf273d53e7d90e845cb79d0293b1b410f22138 (diff)
downloadale-d28d7f732ae5c5017c7e4c2497a744a781e48dab.zip
Add support for linting Handlebars templates with ember-template-lint (#452)
* Ember-template-lint Handlebars template linter: initial handler, test. * Handlebars support with ember-template-lint: basic documentation entries.
-rw-r--r--README.md1
-rw-r--r--ale_linters/handlebars/embertemplatelint.vim55
-rw-r--r--doc/ale-handlebars.txt34
-rw-r--r--doc/ale.txt3
-rw-r--r--test/handler/test_embertemplatelint_handler.vader56
5 files changed, 149 insertions, 0 deletions
diff --git a/README.md b/README.md
index bc00a88e..7c0507ab 100644
--- a/README.md
+++ b/README.md
@@ -73,6 +73,7 @@ name. That seems to be the fairest way to arrange this table.
| Fortran | [gcc](https://gcc.gnu.org/) |
| Go | [gofmt -e](https://golang.org/cmd/gofmt/), [go vet](https://golang.org/cmd/vet/), [golint](https://godoc.org/github.com/golang/lint), [go build](https://golang.org/cmd/go/), [gosimple](https://github.com/dominikh/go-tools/tree/master/cmd/gosimple), [staticcheck](https://github.com/dominikh/go-tools/tree/master/cmd/staticcheck) |
| Haml | [haml-lint](https://github.com/brigade/haml-lint)
+| Handlebars | [ember-template-lint](https://github.com/rwjblue/ember-template-lint) |
| Haskell | [ghc](https://www.haskell.org/ghc/), [hlint](https://hackage.haskell.org/package/hlint), [hdevtools](https://hackage.haskell.org/package/hdevtools) |
| HTML | [HTMLHint](http://htmlhint.com/), [proselint](http://proselint.com/), [tidy](http://www.html-tidy.org/) |
| Java | [javac](http://www.oracle.com/technetwork/java/javase/downloads/index.html) |
diff --git a/ale_linters/handlebars/embertemplatelint.vim b/ale_linters/handlebars/embertemplatelint.vim
new file mode 100644
index 00000000..7a630e19
--- /dev/null
+++ b/ale_linters/handlebars/embertemplatelint.vim
@@ -0,0 +1,55 @@
+" Author: Adrian Zalewski <aazalewski@hotmail.com>
+" Description: Ember-template-lint for checking Handlebars files
+
+let g:ale_handlebars_embertemplatelint_executable =
+\ get(g:, 'ale_handlebars_embertemplatelint_executable', 'ember-template-lint')
+
+let g:ale_handlebars_embertemplatelint_use_global =
+\ get(g:, 'ale_handlebars_embertemplatelint_use_global', 0)
+
+function! ale_linters#handlebars#embertemplatelint#GetExecutable(buffer) abort
+ if g:ale_handlebars_embertemplatelint_use_global
+ return g:ale_handlebars_embertemplatelint_executable
+ endif
+
+ return ale#util#ResolveLocalPath(
+ \ a:buffer,
+ \ 'node_modules/.bin/ember-template-lint',
+ \ g:ale_handlebars_embertemplatelint_executable
+ \)
+endfunction
+
+function! ale_linters#handlebars#embertemplatelint#GetCommand(buffer) abort
+ return ale_linters#handlebars#embertemplatelint#GetExecutable(a:buffer)
+ \ . ' --json %t'
+endfunction
+
+function! ale_linters#handlebars#embertemplatelint#Handle(buffer, lines) abort
+ if len(a:lines) == 0
+ return []
+ end
+
+ let l:output = []
+
+ let l:input_json = json_decode(join(a:lines, ''))
+ let l:file_errors = values(l:input_json)[0]
+
+ for l:error in l:file_errors
+ call add(l:output, {
+ \ 'bufnr': a:buffer,
+ \ 'lnum': l:error.line,
+ \ 'col': l:error.column,
+ \ 'text': l:error.rule . ': ' . l:error.message,
+ \ 'type': l:error.severity == 1 ? 'W' : 'E',
+ \})
+ endfor
+
+ return l:output
+endfunction
+
+call ale#linter#Define('handlebars', {
+\ 'name': 'ember-template-lint',
+\ 'executable_callback': 'ale_linters#handlebars#embertemplatelint#GetExecutable',
+\ 'command_callback': 'ale_linters#handlebars#embertemplatelint#GetCommand',
+\ 'callback': 'ale_linters#handlebars#embertemplatelint#Handle',
+\})
diff --git a/doc/ale-handlebars.txt b/doc/ale-handlebars.txt
new file mode 100644
index 00000000..7722318c
--- /dev/null
+++ b/doc/ale-handlebars.txt
@@ -0,0 +1,34 @@
+===============================================================================
+ALE Handlebars Integration *ale-handlebars-options*
+
+
+-------------------------------------------------------------------------------
+ember-template-lint *ale-handlebars-embertemplatelint*
+
+g:ale_handlebars_embertemplatelint_executable
+ \ *g:ale_handlebars_embertemplatelint_executable*
+
+ Type: |String|
+ Default: `'ember-template-lint'`
+
+ ALE will look for ember-template-lint executable in ancestor node_modules
+ directory. When it cannot find it, this variable will be used instead.
+
+ If you wish to use only a globally installed version of ember-template-lint,
+ set |g:ale_handlebars_embertemplatelint_use_global| to `1`.
+
+
+g:ale_handlebars_embertemplatelint_use_global
+ \ *g:ale_handlebars_embertemplatelint_use_global*
+
+ Type: |Number|
+ Default: `0`
+
+ This variable controls whether or not ALE will search for a local
+ ember-template-lint executable first. If this variable is set to `1`, then
+ ALE will always use the global version of ember-template-lint, in preference
+ to version installed in local node_modules directory.
+
+
+-------------------------------------------------------------------------------
+ vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl:
diff --git a/doc/ale.txt b/doc/ale.txt
index 451cb4b3..04d5c344 100644
--- a/doc/ale.txt
+++ b/doc/ale.txt
@@ -31,6 +31,8 @@ CONTENTS *ale-contents*
erlc................................|ale-erlang-erlc|
fortran...............................|ale-fortran-options|
gcc.................................|ale-fortran-gcc|
+ handlebars............................|ale-handlebars-options|
+ ember-template-lint.................|ale-handlebars-embertemplatelint|
html..................................|ale-html-options|
htmlhint............................|ale-html-htmlhint|
tidy................................|ale-html-tidy|
@@ -123,6 +125,7 @@ The following languages and tools are supported.
* Fortran: 'gcc'
* Go: 'gofmt -e', 'go vet', 'golint', 'go build', 'gosimple', 'staticcheck'
* Haml: 'hamllint'
+* Handlebars: 'ember-template-lint'
* Haskell: 'ghc', 'hlint'
* HTML: 'HTMLHint', 'proselint', 'tidy'
* Java: 'javac'
diff --git a/test/handler/test_embertemplatelint_handler.vader b/test/handler/test_embertemplatelint_handler.vader
new file mode 100644
index 00000000..5261bbe5
--- /dev/null
+++ b/test/handler/test_embertemplatelint_handler.vader
@@ -0,0 +1,56 @@
+" Author: Adrian Zalewski <aazalewski@hotmail.com>
+
+Before:
+ runtime ale_linters/handlebars/embertemplatelint.vim
+
+Execute(The ember-template-lint handler should parse lines correctly):
+ let input_lines = split('{
+ \ "/ember-project/app/templates/application.hbs": [
+ \ {
+ \ "moduleId": "app/templates/application",
+ \ "rule": "bare-strings",
+ \ "severity": 2,
+ \ "message": "Non-translated string used",
+ \ "line": 1,
+ \ "column": 10,
+ \ "source": " Bare String\n"
+ \ },
+ \ {
+ \ "moduleId": "app/templates/application",
+ \ "rule": "invalid-interactive",
+ \ "severity": 1,
+ \ "message": "Interaction added to non-interactive element",
+ \ "line": 3,
+ \ "column": 6,
+ \ "source": "<span {{action someAction}}></span>"
+ \ }
+ \ ]
+ \ }', '\n')
+
+ AssertEqual
+ \ [
+ \ {
+ \ 'bufnr': 347,
+ \ 'lnum': 1,
+ \ 'col': 10,
+ \ 'text': 'bare-strings: Non-translated string used',
+ \ 'type': 'E',
+ \ },
+ \ {
+ \ 'bufnr': 347,
+ \ 'lnum': 3,
+ \ 'col': 6,
+ \ 'text': 'invalid-interactive: Interaction added to non-interactive element',
+ \ 'type': 'W',
+ \ },
+ \ ],
+ \ ale_linters#handlebars#embertemplatelint#Handle(347, input_lines)
+
+Execute(The ember-template-lint handler should handle no lint errors/warnings):
+ AssertEqual
+ \ [
+ \ ],
+ \ ale_linters#handlebars#embertemplatelint#Handle(347, [])
+
+After:
+ call ale#linter#Reset()