Description
Motivation
I have been using selene in my projects lately and I think is a more strict linter in some cases, showing more errors
or warnings
to catch what luacheck
do not.
Example config
In the root project.
selene.toml
std="neovim"
exclude = [
"lua/plenary/profile/lua_profiler.lua",
"lua/plenary/profile/memory_profiler.lua",
"lua/plenary/profile/p.lua", # token `goto` detected as `parse_error`
"lua/plenary/async_lib/*.lua",
]
[rules]
global_usage = "warn"
deprecated = "warn" # If change for `allow` it will rely in `lua_ls` diagnostics alone
multiple_statements = "warn"
incorrect_standard_library_use = "allow" # This is for cases like `string.format`, `package.config`, etc.
mixed_table = "allow"
unused_variable = "warn"
undefined_variable = "warn"
neovim.yml
---
base: lua51
globals:
_:
any: true
a:
any: true
jit:
any: true
bit:
any: true
vim:
any: true
assert:
args:
- type: bool
- type: string
required: false
after_each:
args:
- type: function
before_each:
args:
- type: function
describe:
args:
- type: string
- type: function
it:
args:
- type: string
- type: function
With these two files in the root of the project, selene --display-style quiet lua/plenary --allow-warnings
results in the following.
lua/plenary/async/api.lua:4:22: warning[unused_variable]: t is defined, but never used
lua/plenary/bit.lua:136:21: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/bit.lua:176:22: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/bit.lua:179:22: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/bit.lua:182:22: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/bit.lua:226:28: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/bit.lua:227:28: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/bit.lua:228:28: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/bit.lua:252:27: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/bit.lua:269:27: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/async/tests.lua:14:3: warning[undefined_variable]: `pending` is not defined
lua/plenary/busted.lua:5:26: warning[unused_variable]: element is defined, but never used
lua/plenary/busted.lua:13:19: error[mismatched_arg_count]: this function takes 1 argument but 2 arguments were supplied
lua/plenary/busted.lua:74:41: warning[shadowing]: shadowing variable `msg`
lua/plenary/busted.lua:201:30: warning[unused_variable]: func is defined, but never used
lua/plenary/busted.lua:211:1: warning[unscoped_variables]: `pending` is not declared locally, and will be available in every scope
lua/plenary/busted.lua:211:1: warning[unused_variable]: pending is defined, but never used
lua/plenary/busted.lua:214:1: warning[unscoped_variables]: `clear` is not declared locally, and will be available in every scope
lua/plenary/busted.lua:214:1: warning[unused_variable]: clear is defined, but never used
lua/plenary/profile.lua:16:24: warning[multiple_statements]: only one statement per line is allowed
lua/plenary/run.lua:5:55: warning[unused_variable]: opts is defined, but never used
Results:
1 errors
20 warnings
0 parse errors
plenary.nvim/lua/plenary/busted.lua
Lines 1 to 18 in 08e3019
Note
The error shown is because in lua/plenary/busted.lua
we are using the function dirname
with 1 argument.
But in the line 13
, dirname(debug.getinfo(1, "Sl").source, ":h")
is using 2. Unlike in line 18
, dirname(info.source)
is just using one as the declaration for local dirname = function(p)
indicates.
If we fix that error, dirname(debug.getinfo(1, "Sl").source, ":h")
-> dirname(debug.getinfo(1, "Sl").source)
. The command for selene
with the --allow-warnings
flag will result in a success
exit code when linting.
Integrations
For the CI
process it will be easy.
- Extending the
Makefile
to include:make lint-selene
:selene --display-style quiet lua/plenary --allow-warnings
- Adding a
selene
job toworkflows
:
selene:
name: Selene
runs-on: ubuntu-22.04
steps:
- name: Checkout sources
uses: actions/checkout@v2
- name: Run selene
uses: NTBBloodbath/selene-action@v1.0.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
args: --display-style quiet lua/plenary --allow-warnings
Note
More about selene
action here