From e82fd24943224feacb13e936134a07f97d778eda Mon Sep 17 00:00:00 2001 From: axhav Date: Sun, 29 Dec 2024 05:36:18 +0100 Subject: [PATCH] Add yq support (#4861) * Added jq support Cleaned up yq.vim file * Updated docs * Updated supported-tools.md * Added yq tests * Fix python linting/formatting error when in virtual environment (#4865) Python fixers and linters were failing when vim is running in a virtual environment that's located in a path containing text `poetry`. The cause of this was the regular expression `poetry\|pipenv\|uv$` which matches `poetry` and `pipenv` if they appear anywhere in the virtualenv path. * Add cljfmt fixer for clojure files (#4860) * When using `actionlint` look for & use a config file (#4858) Actionlint supports a config file and it lives in a very searchable path, as the only files it acts on are in the `.github` directory already. Look for an `actionlint.yml` and `.yaml` in that path, and use the config if its there. * Fix linting with jq (#4765) (#4862) With the 1.6 version of jq the error message start with "parse error". With the last version of jq the error message start with "jq: parse error". Fix it by using a regular expression that works in both cases. * Properly handle optional end_line_no/end_line_pos in sqlfluff (#4867) end_line_no/end_line_pos are optional. Example SQL: `SELECT NULL FROM {{ a_jinja_templated_table }};` `sqlfluff lint --dialect ansi --format json` gives the following error among others: ``` {"start_line_no": 1, "start_line_pos": 21, "code": "TMP", "description": "Undefined jinja template variable: 'a_jinja_templated_table'", "name": "", "warning": false} ``` As one can see there is no end_line_no/end_line_pos. * Add golangci-lint fixer (#4853) Closes #4616 * Fixed copy-paste misstakes and added filter to docs * Added test vader file for yq * Fixed and updated the test case --------- Co-authored-by: Walter Kaunda <14844142+kwalter94@users.noreply.github.com> Co-authored-by: rudolf ordoyne <49649789+casens5@users.noreply.github.com> Co-authored-by: Bea Hughes <108035665+beahues@users.noreply.github.com> Co-authored-by: benjos1234 Co-authored-by: Coacher Co-authored-by: Ian Stapleton Cordasco --- ale_linters/yaml/yq.vim | 22 +++++++++++++ autoload/ale/fix/registry.vim | 5 +++ autoload/ale/fixers/yq.vim | 22 +++++++++++++ doc/ale-supported-languages-and-tools.txt | 1 + doc/ale-yaml.txt | 38 +++++++++++++++++++++++ doc/ale.txt | 1 + supported-tools.md | 1 + test/handler/test_yq_handler.vader | 19 ++++++++++++ test/linter/test_yq.vader | 8 +++++ 9 files changed, 117 insertions(+) create mode 100644 ale_linters/yaml/yq.vim create mode 100644 autoload/ale/fixers/yq.vim create mode 100644 test/handler/test_yq_handler.vader create mode 100644 test/linter/test_yq.vader diff --git a/ale_linters/yaml/yq.vim b/ale_linters/yaml/yq.vim new file mode 100644 index 0000000000..35aef654c0 --- /dev/null +++ b/ale_linters/yaml/yq.vim @@ -0,0 +1,22 @@ +" Author: axhav +call ale#Set('yaml_yq_executable', 'yq') +call ale#Set('yaml_yq_options', '') +call ale#Set('yaml_yq_filters', '.') + +" Matches patterns like the following: +let s:pattern = '^Error\:.* line \(\d\+\)\: \(.\+\)$' + +function! ale_linters#yaml#yq#Handle(buffer, lines) abort + return ale#util#MapMatches(a:lines, s:pattern, {match -> { + \ 'lnum': match[1] + 0, + \ 'text': match[2], + \}}) +endfunction + +call ale#linter#Define('yaml', { +\ 'name': 'yq', +\ 'executable': {b -> ale#Var(b, 'yaml_yq_executable')}, +\ 'output_stream': 'stderr', +\ 'command': '%e', +\ 'callback': 'ale_linters#yaml#yq#Handle', +\}) diff --git a/autoload/ale/fix/registry.vim b/autoload/ale/fix/registry.vim index 57ffa9a3b6..4ff04bac81 100644 --- a/autoload/ale/fix/registry.vim +++ b/autoload/ale/fix/registry.vim @@ -207,6 +207,11 @@ let s:default_registry = { \ 'suggested_filetypes': ['python'], \ 'description': 'Fix Python files with yapf.', \ }, +\ 'yq': { +\ 'function': 'ale#fixers#yq#Fix', +\ 'suggested_filetypes': ['yaml'], +\ 'description': 'Fix YAML files with yq.', +\ }, \ 'rubocop': { \ 'function': 'ale#fixers#rubocop#Fix', \ 'suggested_filetypes': ['ruby'], diff --git a/autoload/ale/fixers/yq.vim b/autoload/ale/fixers/yq.vim new file mode 100644 index 0000000000..b9bf70070e --- /dev/null +++ b/autoload/ale/fixers/yq.vim @@ -0,0 +1,22 @@ +call ale#Set('yaml_yq_executable', 'yq') +call ale#Set('yaml_yq_options', '') +call ale#Set('yaml_yq_filters', '.') + +function! ale#fixers#yq#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'yaml_yq_executable') +endfunction + +function! ale#fixers#yq#Fix(buffer) abort + let l:options = ale#Var(a:buffer, 'yaml_yq_options') + let l:filters = ale#Var(a:buffer, 'yaml_yq_filters') + + if empty(l:filters) + return 0 + endif + + return { + \ 'command': ale#Escape(ale#fixers#yq#GetExecutable(a:buffer)) + \ . ' ' . l:filters . ' ' + \ . l:options, + \} +endfunction diff --git a/doc/ale-supported-languages-and-tools.txt b/doc/ale-supported-languages-and-tools.txt index 6a11d4aaca..40d9210c30 100644 --- a/doc/ale-supported-languages-and-tools.txt +++ b/doc/ale-supported-languages-and-tools.txt @@ -729,6 +729,7 @@ Notes: * `yamlfix` * `yamlfmt` * `yamllint` + * `yq` * YANG * `yang-lsp` * Zeek diff --git a/doc/ale-yaml.txt b/doc/ale-yaml.txt index a6741c8320..fc52dc73bc 100644 --- a/doc/ale-yaml.txt +++ b/doc/ale-yaml.txt @@ -366,5 +366,43 @@ g:ale_yaml_gitlablint_options *g:ale_yaml_gitlablint_options This variable can be set to pass additional options to gll. +=============================================================================== +yq *ale-yaml-yq* + +Website: https://github.com/mikefarah/yq + + +Installation +------------------------------------------------------------------------------- + +Install yq: > + + wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY}.tar.gz -O - | tar xz && mv ${BINARY} /usr/bin/yq + +Options +------------------------------------------------------------------------------- + +g:ale_yaml_yq_executable *g:ale_yaml_yq_executable* + *b:ale_yaml_yq_executable* + Type: |String| + Default: `'yq'` + + This variable can be set to change the path to yq. + + +g:ale_yaml_yq_options *g:ale_yaml_yq_options* + *b:ale_yaml_yq_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to yq. + +g:ale_yaml_yq_filters *g:ale_yaml_yq_filters + *b:ale_yaml_yq_filters* + Type: |String| + Default: `'.'` + + This option can be changed to pass additional filters to yq + =============================================================================== vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/doc/ale.txt b/doc/ale.txt index 1d62fd2d6b..3d7e8f5a94 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -3517,6 +3517,7 @@ documented in additional help files. yamlfmt...............................|ale-yaml-yamlfmt| yamllint..............................|ale-yaml-yamllint| gitlablint............................|ale-yaml-gitlablint| + yq....................................|ale-yaml-yq| yang....................................|ale-yang-options| yang-lsp..............................|ale-yang-lsp| zeek....................................|ale-zeek-options| diff --git a/supported-tools.md b/supported-tools.md index 985f0f4617..c6a99de02c 100644 --- a/supported-tools.md +++ b/supported-tools.md @@ -738,6 +738,7 @@ formatting. * [yamlfix](https://lyz-code.github.io/yamlfix) * [yamlfmt](https://github.com/google/yamlfmt) * [yamllint](https://yamllint.readthedocs.io/) + * [yq](https://github.com/mikefarah/yq) * YANG * [yang-lsp](https://github.com/theia-ide/yang-lsp) * Zeek diff --git a/test/handler/test_yq_handler.vader b/test/handler/test_yq_handler.vader new file mode 100644 index 0000000000..861bf9e401 --- /dev/null +++ b/test/handler/test_yq_handler.vader @@ -0,0 +1,19 @@ +Before: + runtime ale_linters/yaml/yq.vim + +After: + call ale#linter#Reset() + +Execute (Should parse error correctly): + AssertEqual + \ [ + \ { + \ 'lnum': 2, + \ 'text': "did not find expected ',' or ']'", + \ } + \ ], + \ ale_linters#yaml#yq#Handle(bufnr(''), [ + \ "Error: bad file '-': yaml: line 2: did not find expected ',' or ']'" + \ ]) + + diff --git a/test/linter/test_yq.vader b/test/linter/test_yq.vader new file mode 100644 index 0000000000..e2e7dcd100 --- /dev/null +++ b/test/linter/test_yq.vader @@ -0,0 +1,8 @@ +Before: + call ale#assert#SetUpLinterTest('yaml', 'yq') + +After: + call ale#assert#TearDownLinterTest() + +Execute(The default command should be correct): + AssertLinter 'yq', ale#Escape('yq')