branch: elpa/flymake-collection commit 67d66d1870284c960e07daa2308e4892206ae5b4 Author: Fredrik Bergroth <fbergr...@gmail.com> Commit: GitHub <nore...@github.com>
checkers: Add flymake-collection-ruff (#14) --- src/checkers/flymake-collection-ruff.el | 77 +++++++++++++++++++++++++++++++++ src/flymake-collection-hook.el | 3 +- tests/checkers/installers/ruff.bash | 1 + tests/checkers/test-cases/ruff.yml | 28 ++++++++++++ 4 files changed, 108 insertions(+), 1 deletion(-) diff --git a/src/checkers/flymake-collection-ruff.el b/src/checkers/flymake-collection-ruff.el new file mode 100644 index 0000000000..9336872162 --- /dev/null +++ b/src/checkers/flymake-collection-ruff.el @@ -0,0 +1,77 @@ +;;; flymake-collection-ruff.el --- Ruff diagnostic function -*- lexical-binding: t -*- + +;; Copyright (c) 2022 Fredrik Bergroth + +;; Permission is hereby granted, free of charge, to any person obtaining a copy +;; of this software and associated documentation files (the "Software"), to deal +;; in the Software without restriction, including without limitation the rights +;; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +;; copies of the Software, and to permit persons to whom the Software is +;; furnished to do so, subject to the following conditions: + +;; The above copyright notice and this permission notice shall be included in all +;; copies or substantial portions of the Software. + +;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +;; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +;; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +;; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +;; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +;; SOFTWARE. + +;;; Commentary: + +;; `flymake' syntax checker for python using ruff. + +;;; Code: + +(require 'flymake) +(require 'flymake-collection) + +(eval-when-compile + (require 'flymake-collection-define)) + +(defcustom flymake-collection-ruff-args nil + "Command line arguments always passed to `flymake-collection-ruff'." + :type '(repeat string) + :group 'flymake-collection) + +;;;###autoload (autoload 'flymake-collection-ruff "flymake-collection-ruff") +(flymake-collection-define-enumerate flymake-collection-ruff + "A Python syntax and style checker using Ruff. + +See URL `https://github.com/charliermarsh/ruff'." + :title "ruff" + :pre-let ((ruff-exec (executable-find "ruff"))) + :pre-check (unless ruff-exec + (error "Cannot find ruff executable")) + :write-type 'pipe + :command `(,ruff-exec + "--format" "json" + ,@flymake-collection-ruff-args + ,@(when-let ((file (buffer-file-name flymake-collection-source))) + (list "--stdin-filename" file)) + "-") + + :generator + (car (flymake-collection-parse-json + (buffer-substring-no-properties + (point-min) (point-max)))) + :enumerate-parser + (let-alist it + (let ((loc (cons (car (flymake-diag-region + flymake-collection-source + .location.row .location.column)) + (cdr (flymake-diag-region + flymake-collection-source + .end_location.row .end_location.column))))) + (list flymake-collection-source + (car loc) + (cdr loc) + :warning + (concat (propertize (format "SC%s" .code) 'face 'flymake-collection-diag-id) " " .message))))) + +(provide 'flymake-collection-ruff) + +;;; flymake-collection-ruff.el ends here diff --git a/src/flymake-collection-hook.el b/src/flymake-collection-hook.el index cb09f9e30f..3b0023d93d 100644 --- a/src/flymake-collection-hook.el +++ b/src/flymake-collection-hook.el @@ -39,7 +39,8 @@ flymake-collection-pycodestyle (flymake-mypy :disabled t) (flymake-collection-pylint :disabled t) - (flymake-collection-flake8 :disabled t)) + (flymake-collection-flake8 :disabled t) + (flymake-collection-ruff :disabled t)) (awk-mode flymake-collection-awk-gawk) (c-mode flymake-collection-clang diff --git a/tests/checkers/installers/ruff.bash b/tests/checkers/installers/ruff.bash new file mode 100755 index 0000000000..024f3d541f --- /dev/null +++ b/tests/checkers/installers/ruff.bash @@ -0,0 +1 @@ +python3.8 -m pip install ruff diff --git a/tests/checkers/test-cases/ruff.yml b/tests/checkers/test-cases/ruff.yml new file mode 100644 index 0000000000..10763c8ddf --- /dev/null +++ b/tests/checkers/test-cases/ruff.yml @@ -0,0 +1,28 @@ +--- +checker: flymake-collection-ruff +tests: + - name: no-lints + file: | + """A test case with no output from ruff.""" + + print("hello world") + lints: [] + - name: notes + file: | + """A test case with a warning lint.""" + + a == None + lints: + - point: [3, 0] + level: warning + message: SCF821 Undefined name `a` (ruff) + - point: [3, 5] + level: warning + message: SCE711 Comparison to `None` should be `cond is None` (ruff) + - name: syntax-error + file: | + definitely should not work + lints: + - point: [1, 12] + level: warning + message: "SCE999 SyntaxError: invalid syntax. Got unexpected token 'should' (ruff)"