summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHoracio Sanson <hsanson@gmail.com>2021-01-23 16:00:45 +0900
committerGitHub <noreply@github.com>2021-01-23 16:00:45 +0900
commit3c3dcd40412f593d315383e6c2ca898fc8fb7dc4 (patch)
tree0d1301fb2bfb49ce9c1bd2de3184645583d64414
parentc37473630189a597f20016d11ba3ba1ae0bd6923 (diff)
parent66b3e768db55b0c03fa34310a5c79bbd24209694 (diff)
downloadale-3c3dcd40412f593d315383e6c2ca898fc8fb7dc4.zip
Merge pull request #3489 from t2h5/yaml-spectral-linter
Add Stoplight Spectral linter for yaml
-rw-r--r--ale_linters/json/spectral.vim14
-rw-r--r--ale_linters/yaml/spectral.vim14
-rw-r--r--autoload/ale/handlers/spectral.vim31
-rw-r--r--doc/ale-json.txt32
-rw-r--r--doc/ale-supported-languages-and-tools.txt2
-rw-r--r--doc/ale-yaml.txt32
-rw-r--r--doc/ale.txt2
-rw-r--r--supported-tools.md2
-rw-r--r--test/command_callback/spectral_paths/node_modules/.bin/spectral0
-rw-r--r--test/command_callback/spectral_paths/openapi.yaml0
-rw-r--r--test/command_callback/test_spectral_command_callback.vader31
-rw-r--r--test/handler/test_spectral_handler.vader52
12 files changed, 212 insertions, 0 deletions
diff --git a/ale_linters/json/spectral.vim b/ale_linters/json/spectral.vim
new file mode 100644
index 00000000..c7d56234
--- /dev/null
+++ b/ale_linters/json/spectral.vim
@@ -0,0 +1,14 @@
+" Author: t2h5 <https://github.com/t2h5>
+" Description: Integration of Stoplight Spectral CLI with ALE.
+
+call ale#Set('json_spectral_executable', 'spectral')
+call ale#Set('json_spectral_use_global', get(g:, 'ale_use_global_executables', 0))
+
+call ale#linter#Define('json', {
+\ 'name': 'spectral',
+\ 'executable': {b -> ale#node#FindExecutable(b, 'json_spectral', [
+\ 'node_modules/.bin/spectral',
+\ ])},
+\ 'command': '%e lint --ignore-unknown-format -q -f text %t',
+\ 'callback': 'ale#handlers#spectral#HandleSpectralOutput'
+\})
diff --git a/ale_linters/yaml/spectral.vim b/ale_linters/yaml/spectral.vim
new file mode 100644
index 00000000..bd4623a5
--- /dev/null
+++ b/ale_linters/yaml/spectral.vim
@@ -0,0 +1,14 @@
+" Author: t2h5 <https://github.com/t2h5>
+" Description: Integration of Stoplight Spectral CLI with ALE.
+
+call ale#Set('yaml_spectral_executable', 'spectral')
+call ale#Set('yaml_spectral_use_global', get(g:, 'ale_use_global_executables', 0))
+
+call ale#linter#Define('yaml', {
+\ 'name': 'spectral',
+\ 'executable': {b -> ale#node#FindExecutable(b, 'yaml_spectral', [
+\ 'node_modules/.bin/spectral',
+\ ])},
+\ 'command': '%e lint --ignore-unknown-format -q -f text %t',
+\ 'callback': 'ale#handlers#spectral#HandleSpectralOutput'
+\})
diff --git a/autoload/ale/handlers/spectral.vim b/autoload/ale/handlers/spectral.vim
new file mode 100644
index 00000000..1eb4a5de
--- /dev/null
+++ b/autoload/ale/handlers/spectral.vim
@@ -0,0 +1,31 @@
+" Author: t2h5 <https://github.com/t2h5>
+" Description: Integration of Stoplight Spectral CLI with ALE.
+
+function! ale#handlers#spectral#HandleSpectralOutput(buffer, lines) abort
+ " Matches patterns like the following:
+ " openapi.yml:1:1 error oas3-schema "Object should have required property `info`."
+ " openapi.yml:1:1 warning oas3-api-servers "OpenAPI `servers` must be present and non-empty array."
+ let l:pattern = '\v^.*:(\d+):(\d+) (error|warning) (.*)$'
+ let l:output = []
+
+ for l:match in ale#util#GetMatches(a:lines, l:pattern)
+ let l:obj = {
+ \ 'lnum': l:match[1] + 0,
+ \ 'col': l:match[2] + 0,
+ \ 'type': l:match[3] is# 'error' ? 'E' : 'W',
+ \ 'text': l:match[4],
+ \}
+
+ let l:code_match = matchlist(l:obj.text, '\v^(.+) "(.+)"$')
+
+ if !empty(l:code_match)
+ let l:obj.code = l:code_match[1]
+ let l:obj.text = l:code_match[2]
+ endif
+
+ call add(l:output, l:obj)
+ endfor
+
+ return l:output
+endfunction
+
diff --git a/doc/ale-json.txt b/doc/ale-json.txt
index 96499a04..dc91e14c 100644
--- a/doc/ale-json.txt
+++ b/doc/ale-json.txt
@@ -102,4 +102,36 @@ See |ale-javascript-prettier| for information about the available options.
===============================================================================
+spectral *ale-json-spectral*
+
+Website: https://github.com/stoplightio/spectral
+
+Installation
+-------------------------------------------------------------------------------
+
+Install spectral either globally or locally: >
+
+ npm install @stoplight/spectral -g # global
+ npm install @stoplight/spectral # local
+<
+
+Options
+-------------------------------------------------------------------------------
+
+g:ale_json_spectral_executable *g:ale_json_spectral_executable*
+ *b:ale_json_spectral_executable*
+ Type: |String|
+ Default: `'spectral'`
+
+ This variable can be set to change the path to spectral.
+
+g:ale_json_spectral_use_global *g:ale_json_spectral_use_global*
+ *b:ale_json_spectral_use_global*
+ Type: |String|
+ Default: `get(g:, 'ale_use_global_executables', 0)`
+
+ See |ale-integrations-local-executables|
+
+
+===============================================================================
vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl:
diff --git a/doc/ale-supported-languages-and-tools.txt b/doc/ale-supported-languages-and-tools.txt
index 6744e30e..ce73136f 100644
--- a/doc/ale-supported-languages-and-tools.txt
+++ b/doc/ale-supported-languages-and-tools.txt
@@ -248,6 +248,7 @@ Notes:
* `jq`
* `jsonlint`
* `prettier`
+ * `spectral`
* Julia
* `languageserver`
* Kotlin
@@ -537,6 +538,7 @@ Notes:
* `xmllint`
* YAML
* `prettier`
+ * `spectral`
* `swaglint`
* `yamlfix`
* `yamllint`
diff --git a/doc/ale-yaml.txt b/doc/ale-yaml.txt
index 61bfc139..04871403 100644
--- a/doc/ale-yaml.txt
+++ b/doc/ale-yaml.txt
@@ -16,6 +16,38 @@ Install prettier either globally or locally: >
npm install prettier # local
<
===============================================================================
+spectral *ale-yaml-spectral*
+
+Website: https://github.com/stoplightio/spectral
+
+Installation
+-------------------------------------------------------------------------------
+
+Install spectral either globally or locally: >
+
+ npm install @stoplight/spectral -g # global
+ npm install @stoplight/spectral # local
+<
+
+Options
+-------------------------------------------------------------------------------
+
+g:ale_yaml_spectral_executable *g:ale_yaml_spectral_executable*
+ *b:ale_yaml_spectral_executable*
+ Type: |String|
+ Default: `'spectral'`
+
+ This variable can be set to change the path to spectral.
+
+g:ale_yaml_spectral_use_global *g:ale_yaml_spectral_use_global*
+ *b:ale_yaml_spectral_use_global*
+ Type: |String|
+ Default: `get(g:, 'ale_use_global_executables', 0)`
+
+ See |ale-integrations-local-executables|
+
+
+===============================================================================
swaglint *ale-yaml-swaglint*
Website: https://github.com/byCedric/swaglint
diff --git a/doc/ale.txt b/doc/ale.txt
index 97fb0786..5cbc10c4 100644
--- a/doc/ale.txt
+++ b/doc/ale.txt
@@ -2785,6 +2785,7 @@ documented in additional help files.
jsonlint..............................|ale-json-jsonlint|
jq....................................|ale-json-jq|
prettier..............................|ale-json-prettier|
+ spectral..............................|ale-json-spectral|
julia...................................|ale-julia-options|
languageserver........................|ale-julia-languageserver|
kotlin..................................|ale-kotlin-options|
@@ -3028,6 +3029,7 @@ documented in additional help files.
xmllint...............................|ale-xml-xmllint|
yaml....................................|ale-yaml-options|
prettier..............................|ale-yaml-prettier|
+ spectral..............................|ale-yaml-spectral|
swaglint..............................|ale-yaml-swaglint|
yamlfix...............................|ale-yaml-yamlfix|
yamllint..............................|ale-yaml-yamllint|
diff --git a/supported-tools.md b/supported-tools.md
index cd8a8fdc..0e1e6b29 100644
--- a/supported-tools.md
+++ b/supported-tools.md
@@ -257,6 +257,7 @@ formatting.
* [jq](https://stedolan.github.io/jq/)
* [jsonlint](http://zaa.ch/jsonlint/)
* [prettier](https://github.com/prettier/prettier)
+ * [spectral](https://github.com/stoplightio/spectral)
* Julia
* [languageserver](https://github.com/JuliaEditorSupport/LanguageServer.jl)
* Kotlin
@@ -546,6 +547,7 @@ formatting.
* [xmllint](http://xmlsoft.org/xmllint.html)
* YAML
* [prettier](https://github.com/prettier/prettier)
+ * [spectral](https://github.com/stoplightio/spectral)
* [swaglint](https://github.com/byCedric/swaglint)
* [yamlfix](https://lyz-code.github.io/yamlfix)
* [yamllint](https://yamllint.readthedocs.io/)
diff --git a/test/command_callback/spectral_paths/node_modules/.bin/spectral b/test/command_callback/spectral_paths/node_modules/.bin/spectral
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/command_callback/spectral_paths/node_modules/.bin/spectral
diff --git a/test/command_callback/spectral_paths/openapi.yaml b/test/command_callback/spectral_paths/openapi.yaml
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/test/command_callback/spectral_paths/openapi.yaml
diff --git a/test/command_callback/test_spectral_command_callback.vader b/test/command_callback/test_spectral_command_callback.vader
new file mode 100644
index 00000000..ed3795b9
--- /dev/null
+++ b/test/command_callback/test_spectral_command_callback.vader
@@ -0,0 +1,31 @@
+Before:
+ call ale#assert#SetUpLinterTest('yaml', 'spectral')
+
+After:
+ call ale#assert#TearDownLinterTest()
+
+Execute(The yaml spectral command callback should return the correct default string):
+ AssertLinter 'spectral', ale#Escape('spectral') . ' lint --ignore-unknown-format -q -f text %t'
+
+Execute(The yaml spectral command callback should be configurable):
+ let g:ale_yaml_spectral_executable = '~/.local/bin/spectral'
+
+ AssertLinter '~/.local/bin/spectral',
+ \ ale#Escape('~/.local/bin/spectral')
+ \ . ' lint --ignore-unknown-format -q -f text %t'
+
+Execute(The yaml spectral command callback should allow a global installation to be used):
+ let g:ale_yaml_spectral_executable = '/usr/local/bin/spectral'
+ let g:ale_yaml_spectral_use_global = 1
+
+ AssertLinter '/usr/local/bin/spectral',
+ \ ale#Escape('/usr/local/bin/spectral')
+ \ . ' lint --ignore-unknown-format -q -f text %t'
+
+Execute(The yaml spectral command callback should allow a local installation to be used):
+ call ale#test#SetFilename('spectral_paths/openapi.yaml')
+
+ AssertLinter
+ \ ale#path#Simplify(g:dir . '/spectral_paths/node_modules/.bin/spectral'),
+ \ ale#Escape(ale#path#Simplify(g:dir . '/spectral_paths/node_modules/.bin/spectral'))
+ \ . ' lint --ignore-unknown-format -q -f text %t'
diff --git a/test/handler/test_spectral_handler.vader b/test/handler/test_spectral_handler.vader
new file mode 100644
index 00000000..89a3ff1b
--- /dev/null
+++ b/test/handler/test_spectral_handler.vader
@@ -0,0 +1,52 @@
+Before:
+ runtime ale_linters/yaml/spectral.vim
+
+After:
+ call ale#linter#Reset()
+
+Execute(spectral handler should parse lines correctly):
+ AssertEqual
+ \ [
+ \ {
+ \ 'lnum': 1,
+ \ 'col': 1,
+ \ 'code': 'oas3-api-servers',
+ \ 'text': 'OpenAPI `servers` must be present and non-empty array.',
+ \ 'type': 'W'
+ \ },
+ \ {
+ \ 'lnum': 1,
+ \ 'col': 1,
+ \ 'code': 'oas3-schema',
+ \ 'text': 'Object should have required property `paths`.',
+ \ 'type': 'E'
+ \ },
+ \ {
+ \ 'lnum': 1,
+ \ 'col': 1,
+ \ 'code': 'openapi-tags',
+ \ 'text': 'OpenAPI object should have non-empty `tags` array.',
+ \ 'type': 'W'
+ \ },
+ \ {
+ \ 'lnum': 3,
+ \ 'col': 6,
+ \ 'code': 'info-contact',
+ \ 'text': 'Info object should contain `contact` object.',
+ \ 'type': 'W'
+ \ },
+ \ {
+ \ 'lnum': 3,
+ \ 'col': 6,
+ \ 'code': 'oas3-schema',
+ \ 'text': '`info` property should have required property `version`.',
+ \ 'type': 'E'
+ \ },
+ \ ],
+ \ ale#handlers#spectral#HandleSpectralOutput(bufnr(''), [
+ \ 'openapi.yml:1:1 warning oas3-api-servers "OpenAPI `servers` must be present and non-empty array."',
+ \ 'openapi.yml:1:1 error oas3-schema "Object should have required property `paths`."',
+ \ 'openapi.yml:1:1 warning openapi-tags "OpenAPI object should have non-empty `tags` array."',
+ \ 'openapi.yml:3:6 warning info-contact "Info object should contain `contact` object."',
+ \ 'openapi.yml:3:6 error oas3-schema "`info` property should have required property `version`."',
+ \ ])