* [PATCH] Implement Python backend for Flymake
@ 2017-10-13 9:04 Lele Gaifax
2017-10-13 9:09 ` Clément Pit-Claudel
0 siblings, 1 reply; 6+ messages in thread
From: Lele Gaifax @ 2017-10-13 9:04 UTC (permalink / raw)
To: emacs-devel
[-- Attachment #1: Type: text/plain, Size: 348 bytes --]
Hi,
here below you can find an implementation of a Python backend for the new
Flymake facility.
I'm quite satisfied by it: I tested both the default settings (targeting
`pyflakes') and the `flake8' customization suggested in the docstrings.
As always, I'm willing to apply whatever tweak/fix you may find reasonable.
Thanks a lot,
ciao, lele.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Fix-typo.patch --]
[-- Type: text/x-diff, Size: 782 bytes --]
From 16828afebe3e732e3cbf856b093dfff65d3319ff Mon Sep 17 00:00:00 2001
From: Lele Gaifax <lele@metapensiero.it>
Date: Fri, 13 Oct 2017 10:43:13 +0200
Subject: [PATCH 1/2] Fix typo
---
lisp/progmodes/flymake.el | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el
index 8c9c4b211a..8fa763a4b8 100644
--- a/lisp/progmodes/flymake.el
+++ b/lisp/progmodes/flymake.el
@@ -124,7 +124,7 @@ flymake-gui-warnings-enabled
"it no longer has any effect." "26.1")
(defcustom flymake-start-on-flymake-mode t
- "Start syntax check when `flymake-mode'is enabled.
+ "Start syntax check when `flymake-mode' is enabled.
Specifically, start it when the buffer is actually displayed."
:type 'boolean)
--
2.15.0.rc0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-Add-a-Flymake-backend-for-Python.patch --]
[-- Type: text/x-diff, Size: 5394 bytes --]
From 84a4dd4ef7a6ae9e49cb7442070744b5d6e3ec95 Mon Sep 17 00:00:00 2001
From: Lele Gaifax <lele@metapensiero.it>
Date: Fri, 13 Oct 2017 10:44:02 +0200
Subject: [PATCH 2/2] Add a Flymake backend for Python
* lisp/progmodes/python.el: Implement new Flymake backend with
related customizable settings.
(python-flymake-command, python-flymake-command-output-regexp,
python-flymake-msg-alist): New defcustom.
(python-flymake): New function.
(python-flymake-activate): New function.
---
lisp/progmodes/python.el | 101 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 101 insertions(+)
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index f79d9a47d3..866e02ffbd 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -5141,6 +5141,107 @@ python-util-valid-regexp-p
(ignore-errors (string-match regexp "") t))
\f
+;;; Flymake integration
+
+(defgroup python-flymake nil
+ "Integration between Python and Flymake."
+ :group 'python
+ :link '(custom-group-link :tag "Flymake" flymake)
+ :version "26.1")
+
+(defcustom python-flymake-command '("pyflakes")
+ "The external tool that will be used to perform the syntax check.
+This is a non empty list of strings, the checker tool possibly followed by
+required arguments: to use `flake8' you would set this to (\"flake8\" \"-\")."
+ :group 'python-flymake
+ :type '(repeat string))
+
+;; The default regexp accomodates for older pyflakes, which did not
+;; report the column number
+(defcustom python-flymake-command-output-regexp
+ "^\\(?:<stdin>\\):\\(?1:[0-9]+\\):\\(?:\\(?2:[0-9]+\\):\\)? \\(?3:.*\\)$"
+ "The regexp used to parse the output of the specified tool.
+It must contain two or three groups: group 1 is the line number, group 2 the
+optional column number and the third is the actual message."
+ :group 'python-flymake
+ :type 'regexp)
+
+(defcustom python-flymake-msg-alist
+ '(("\\(^redefinition\\|.*unused.*\\|used$\\)" . :warning))
+ "Alist used to associate messages to their types.
+Each element should be a cons-cell (REGEXP . TYPE), where TYPE must be
+one defined in the variable `flymake-diagnostic-types-alist'.
+For example, when using `flake8' a possible configuration could be:
+
+ ((\"\\(^redefinition\\|.*unused.*\\|used$\\)\" . :warning)
+ (\"^E999\" . :error)
+ (\"^[EW][0-9]+\" . :note))
+
+By default messages are considered errors."
+ :group 'python-flymake
+ :type `(alist :key-type (regexp)
+ :value-type (symbol)))
+
+(defvar-local python--flymake-proc nil)
+
+(defun python-flymake (report-fn &rest _args)
+ "Flymake backend for Python.
+This backend uses `python-flymake-command' (which see) to launch a process
+that is passed the current buffer's content via stdin.
+REPORT-FN is Flymake's callback function."
+ (unless (executable-find (car python-flymake-command))
+ (error "Cannot find a suitable checker"))
+
+ (unless (derived-mode-p 'python-mode)
+ (error "Can only work on `python-mode' buffers"))
+
+ (when (process-live-p python--flymake-proc)
+ (kill-process python--flymake-proc))
+
+ (let ((source (current-buffer)))
+ (save-restriction
+ (widen)
+ (setq python--flymake-proc
+ (make-process
+ :name "python-flymake"
+ :noquery t
+ :connection-type 'pipe
+ :buffer (generate-new-buffer " *python-flymake*")
+ :command python-flymake-command
+ :sentinel
+ (lambda (proc _event)
+ (when (eq 'exit (process-status proc))
+ (unwind-protect
+ (when (eq proc python--flymake-proc)
+ (with-current-buffer (process-buffer proc)
+ (goto-char (point-min))
+ (cl-loop
+ while (search-forward-regexp
+ python-flymake-command-output-regexp nil t)
+ for msg = (match-string 3)
+ for (beg . end) = (flymake-diag-region
+ source
+ (string-to-number (match-string 1))
+ (and (match-string 2)
+ (string-to-number
+ (match-string 2))))
+ for type = (or (assoc-default msg
+ python-flymake-msg-alist
+ #'string-match)
+ :error)
+ collect (flymake-make-diagnostic
+ source beg end type msg)
+ into diags
+ finally (funcall report-fn diags))))
+ (kill-buffer (process-buffer proc)))))))
+ (process-send-region python--flymake-proc (point-min) (point-max))
+ (process-send-eof python--flymake-proc))))
+
+(defun python-flymake-activate ()
+ "Activate the Flymake syntax check on all python-mode buffers."
+ (add-hook 'flymake-diagnostic-functions #'python-flymake nil t))
+
+\f
(defun python-electric-pair-string-delimiter ()
(when (and electric-pair-mode
(memq last-command-event '(?\" ?\'))
--
2.15.0.rc0
[-- Attachment #4: Type: text/plain, Size: 206 bytes --]
--
nickname: Lele Gaifax | Quando vivrò di quello che ho pensato ieri
real: Emanuele Gaifas | comincerò ad aver paura di chi mi copia.
lele@metapensiero.it | -- Fortunato Depero, 1929.
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] Implement Python backend for Flymake
2017-10-13 9:04 [PATCH] Implement Python backend for Flymake Lele Gaifax
@ 2017-10-13 9:09 ` Clément Pit-Claudel
2017-10-13 9:22 ` Lele Gaifax
0 siblings, 1 reply; 6+ messages in thread
From: Clément Pit-Claudel @ 2017-10-13 9:09 UTC (permalink / raw)
To: emacs-devel
On 2017-10-13 11:04, Lele Gaifax wrote:
> Hi,
>
> here below you can find an implementation of a Python backend for the new
> Flymake facility.
Aren't patches supposed to go to bug-gnu-emacs?
Thanks :)
Clément.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] Implement Python backend for Flymake
2017-10-13 9:09 ` Clément Pit-Claudel
@ 2017-10-13 9:22 ` Lele Gaifax
2017-10-13 9:50 ` Eli Zaretskii
0 siblings, 1 reply; 6+ messages in thread
From: Lele Gaifax @ 2017-10-13 9:22 UTC (permalink / raw)
To: emacs-devel
Clément Pit-Claudel <cpitclaudel@gmail.com> writes:
> On 2017-10-13 11:04, Lele Gaifax wrote:
>> Hi,
>>
>> here below you can find an implementation of a Python backend for the new
>> Flymake facility.
>
> Aren't patches supposed to go to bug-gnu-emacs?
>
> Thanks :)
> Clément.
I followed other's similar proposals, but I can surely send them there, if
that's preferred.
ciao, lele.
--
nickname: Lele Gaifax | Quando vivrò di quello che ho pensato ieri
real: Emanuele Gaifas | comincerò ad aver paura di chi mi copia.
lele@metapensiero.it | -- Fortunato Depero, 1929.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] Implement Python backend for Flymake
2017-10-13 9:22 ` Lele Gaifax
@ 2017-10-13 9:50 ` Eli Zaretskii
2017-10-13 9:52 ` Lele Gaifax
0 siblings, 1 reply; 6+ messages in thread
From: Eli Zaretskii @ 2017-10-13 9:50 UTC (permalink / raw)
To: Lele Gaifax; +Cc: emacs-devel
> From: Lele Gaifax <lele@metapensiero.it>
> Date: Fri, 13 Oct 2017 11:22:44 +0200
>
> > Aren't patches supposed to go to bug-gnu-emacs?
> >
>
> I followed other's similar proposals, but I can surely send them there, if
> that's preferred.
It's preferred to send to bug-gnu-emacs, yes. The reason is that
doing so provides a reference that's easy to cite in a log message.
It also allows to produce various reports using the debbugs features.
Thanks.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] Implement Python backend for Flymake
2017-10-13 9:50 ` Eli Zaretskii
@ 2017-10-13 9:52 ` Lele Gaifax
2017-10-18 18:06 ` Lele Gaifax
0 siblings, 1 reply; 6+ messages in thread
From: Lele Gaifax @ 2017-10-13 9:52 UTC (permalink / raw)
To: emacs-devel
Eli Zaretskii <eliz@gnu.org> writes:
>> I followed other's similar proposals, but I can surely send them there, if
>> that's preferred.
>
> It's preferred to send to bug-gnu-emacs, yes. The reason is that
> doing so provides a reference that's easy to cite in a log message.
> It also allows to produce various reports using the debbugs features.
Ok, doing that immediately.
Thank you,
ciao, lele.
--
nickname: Lele Gaifax | Quando vivrò di quello che ho pensato ieri
real: Emanuele Gaifas | comincerò ad aver paura di chi mi copia.
lele@metapensiero.it | -- Fortunato Depero, 1929.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] Implement Python backend for Flymake
2017-10-13 9:52 ` Lele Gaifax
@ 2017-10-18 18:06 ` Lele Gaifax
0 siblings, 0 replies; 6+ messages in thread
From: Lele Gaifax @ 2017-10-18 18:06 UTC (permalink / raw)
To: emacs-devel
Lele Gaifax <lele@metapensiero.it> writes:
> Eli Zaretskii <eliz@gnu.org> writes:
>
>> It's preferred to send to bug-gnu-emacs, yes. The reason is that
>> doing so provides a reference that's easy to cite in a log message.
>> It also allows to produce various reports using the debbugs features.
>
> Ok, doing that immediately.
I went ahead on this, my latest version is here:
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=28808#23
Please let me know if there's anything else I could/should do.
Thanks&bye, lele.
--
nickname: Lele Gaifax | Quando vivrò di quello che ho pensato ieri
real: Emanuele Gaifas | comincerò ad aver paura di chi mi copia.
lele@metapensiero.it | -- Fortunato Depero, 1929.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2017-10-18 18:06 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-10-13 9:04 [PATCH] Implement Python backend for Flymake Lele Gaifax
2017-10-13 9:09 ` Clément Pit-Claudel
2017-10-13 9:22 ` Lele Gaifax
2017-10-13 9:50 ` Eli Zaretskii
2017-10-13 9:52 ` Lele Gaifax
2017-10-18 18:06 ` Lele Gaifax
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).