Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(lint): let attributes be functions #112

Merged
merged 1 commit into from
Oct 8, 2023

Conversation

MoritzBoehme
Copy link
Contributor

This change is prompted by a change in the python linter ruff. The json output has changed a bit and the severity no longer simply parsed. Example:

import random
[
  {
    "code": "F401",
    "message": "`random` imported but unused",
    "fix": {
      "applicability": "Unspecified",
      "message": "Remove unused import: `random`",
      "edits": [
        {
          "content": "",
          "location": {
            "row": 1,
            "column": 1
          },
          "end_location": {
            "row": 2,
            "column": 1
          }
        }
      ]
    },
    "location": {
      "row": 1,
      "column": 8
    },
    "end_location": {
      "row": 1,
      "column": 14
    },
    "filename": "/tmp/tmp.zV0Bmo7zZd/tmp.py",
    "noqa_row": 1
  }
]

By making all attributes in from_json a function or a key to the json message table, we can again extract the severity.
The new ruff config would be something like this:

{
  cmd = "ruff",
  args = {
    "-n",
    "-e",
    "--format",
    "json",
    "-",
    "--stdin-filename",
  },
  fname = true,
  stdin = true,
  parse = lint.from_json({
    attributes = {
      severity = function(js)
        return string.sub(js["code"], 1, 1) -- first character
      end,
      lnum = function(js)
        return js["location"]["row"]
      end,
      col = function(js)
        return js["location"]["column"]
      end,
    },
    severities = {
      E = lint.severities.error, -- pycodestyle errors
      W = lint.severities.warning, -- pycodestyle warnings
      F = lint.severities.info, -- pyflakes
      A = lint.severities.info, -- flake8-builtins
      B = lint.severities.warning, -- flake8-bugbear
      C = lint.severities.warning, -- flake8-comprehensions
      T = lint.severities.info, -- flake8-print
      U = lint.severities.info, -- pyupgrade
      D = lint.severities.info, -- pydocstyle
      M = lint.severities.into, -- Meta
    },
    source = "ruff",
  }),
}

I have tested this on my machine, but as this is part of https://github.com/nvimdev/guard-collection I didn't add or alter any test in this repo. Let me know what you think about this change :)

@@ -130,13 +130,20 @@ local function from_json(opts)
or mes[opts.attributes.lnum]
local col = type(opts.attributes.col) == 'function' and opts.attributes.col(mes)
or mes[opts.attributes.col]
local message = type(opts.attributes.message) == 'function' and opts.attributes.message(mes)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe separate the logic into a function since it appears many times

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, good call 👍

Copy link
Collaborator

@xiaoshihou514 xiaoshihou514 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems great! Makes api more consistent

@MoritzBoehme MoritzBoehme force-pushed the json-attributes-functions branch from 862b634 to 44742eb Compare October 8, 2023 09:56
@xiaoshihou514 xiaoshihou514 merged commit 17e8884 into nvimdev:main Oct 8, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants