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)"

Reply via email to