- 
          
- 
                Notifications
    You must be signed in to change notification settings 
- Fork 319
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: functionWith 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 errorsplenary.nvim/lua/plenary/busted.lua
Lines 1 to 18 in 08e3019
| local dirname = function(p) | |
| return vim.fn.fnamemodify(p, ":h") | |
| end | |
| local function get_trace(element, level, msg) | |
| local function trimTrace(info) | |
| local index = info.traceback:find "\n%s*%[C]" | |
| info.traceback = info.traceback:sub(1, index) | |
| return info | |
| end | |
| level = level or 3 | |
| local thisdir = dirname(debug.getinfo(1, "Sl").source, ":h") | |
| local info = debug.getinfo(level, "Sl") | |
| while | |
| info.what == "C" | |
| or info.short_src:match "luassert[/\\].*%.lua$" | |
| or (info.source:sub(1, 1) == "@" and thisdir == dirname(info.source)) | 
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 Makefileto include:- make lint-selene:- selene --display-style quiet lua/plenary --allow-warnings
 
- Adding a selenejob toworkflows:
  selene:
    name: Selene
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout sources
        uses: actions/checkout@v2
      - name: Run selene
        uses: NTBBloodbath/[email protected]
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          args: --display-style quiet lua/plenary --allow-warningsNote
More about selene action here