Skip to content

Commit

Permalink
Rewrite snakemake-popup as a transient
Browse files Browse the repository at this point in the history
Magit switched to Transient for its popups a while go.  Magit Popup is
still around for third-party libraries that may use it, but it's not
actively developed.

At the moment, this switch is trading one external library for another
(improved) one.  However, Transient will ship with Emacs starting with
the upcoming 28.1 release.

Message-Id: <[email protected]>
  • Loading branch information
kyleam committed Feb 22, 2022
1 parent 8684b45 commit 49f2ea5
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 47 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ jobs:
with:
repository: magnars/dash.el
path: dash.el
- name: Check out magit-popup
- name: Check out transient
uses: actions/checkout@v2
with:
repository: magit/magit-popup
path: magit-popup
repository: magit/transient
path: transient
- name: Check out snakemake-mode
uses: actions/checkout@v2
with:
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

LOAD_PATH = -L ../magit-popup -L ../dash.el -L .
LOAD_PATH = -L ../transient/lisp -L ../dash.el -L .
EMACS = emacs
BATCH = $(EMACS) -Q --batch $(LOAD_PATH)
CURL := curl --silent
Expand Down
4 changes: 4 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ NEWS -- history of user-visible changes -*- mode: org; -*-

* master (unreleased)

- The Magit Popup command ~snakemake-popup~ has been rewritten as a
transient, ~snakemake~. snakemake.el now depends on Transient
rather than Magit Popup.

- The 'name' keyword (new in Snakemake v5.31.0) is now recognized.

* v1.8.0
Expand Down
7 changes: 4 additions & 3 deletions README
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ This repo contains two Emacs libraries for Snakemake [^1].
* snakemake-mode.el provides a major mode for editing Snakemake
files.

* snakemake.el defines a popup interface for calling Snakemake.
* snakemake.el defines a transient [^2] for calling Snakemake.

See the header of each file for more information.

Expand All @@ -16,6 +16,7 @@ Both of these are available on MELPA under the snakemake-mode package:
https://melpa.org/#/snakemake-mode

[^1]: https://snakemake.readthedocs.io/en/stable/
[^2]: https://magit.vc/manual/transient/


Contributing
Expand All @@ -27,8 +28,8 @@ Please send a plain-text email to
[email protected]

Messages that include this address are public and available as
public-inbox [^2] archives at
public-inbox [^3] archives at

https://inbox.kyleam.com/snakemake-mode/

[^2]: https://public-inbox.org/README
[^3]: https://public-inbox.org/README
2 changes: 1 addition & 1 deletion snakemake-mode.el
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
;; URL: https://git.kyleam.com/snakemake-mode/about
;; Keywords: tools
;; Version: 1.8.0
;; Package-Requires: ((emacs "24.5") (cl-lib "0.5") (magit-popup "2.4.0"))
;; Package-Requires: ((emacs "24.5") (cl-lib "0.5") (transient "0.3.0"))

;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
Expand Down
90 changes: 51 additions & 39 deletions snakemake.el
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,13 @@

;;; Commentary:

;; This package provides a popup interface, built on Magit's popup
;; library [1], for calling Snakemake [2]. The main entry point is
;; `snakemake-popup', which you should consider giving a global key
;; binding.
;; This package provides a Transient interface [1] for calling
;; Snakemake [2]. The main entry point is the `snakemake' command,
;; which you should consider giving a global key binding.
;;
;; The popup currently includes four actions, all which lead to a
;; Snakemake call. What's different between the actions is how
;; targets are selected.
;; The `snakemake' transient currently includes four actions, all
;; which lead to a Snakemake call. What's different between the
;; actions is how targets are selected.
;;
;; snakemake-build-targets-at-point
;;
Expand Down Expand Up @@ -78,21 +77,21 @@
;; terminal can be created with `snakemake-term-start', in which case
;; commands are sent there instead.
;;
;; In addition to the popup commands, there are commands for showing
;; and saving the dependency graph of a target. The command
;; `snakemake-graph' displays the graph in a buffer. From this
;; buffer, `snakemake-graph-save' can be called to save the graph to
;; an output file.
;; In addition to the commands in the transient, there are commands
;; for showing and saving the dependency graph of a target. The
;; command `snakemake-graph' displays the graph in a buffer. From
;; this buffer, `snakemake-graph-save' can be called to save the graph
;; to an output file.
;;
;; [1] https://magit.vc/manual/magit-popup.html
;; [1] https://magit.vc/manual/transient/
;; [2] https://snakemake.github.io/

;;; Code:

(require 'cl-lib)
(require 'compile)
(require 'term)
(require 'magit-popup)
(require 'transient)

(require 'snakemake-mode)

Expand Down Expand Up @@ -672,7 +671,7 @@ send the command there. Otherwise, run the command with
"Build target(s) at point without any prompts.
$ snakemake [ARGS] -- <targets>"
(interactive (list (snakemake-arguments)))
(interactive (list (transient-args 'snakemake)))
(snakemake-build-targets
(or (snakemake-file-targets-at-point 'check)
(snakemake-rule-at-point 'target)
Expand All @@ -684,7 +683,7 @@ $ snakemake [ARGS] -- <targets>"
"Build target file.
$ snakemake [ARGS] -- <file>"
(interactive (list (snakemake-arguments)))
(interactive (list (transient-args 'snakemake)))
(snakemake-build-targets
(list (snakemake-read-file-target))
args))
Expand All @@ -694,7 +693,7 @@ $ snakemake [ARGS] -- <file>"
"Build target rule, prompting with known rules.
$ snakemake [ARGS] -- <rule>"
(interactive (list (snakemake-arguments)))
(interactive (list (transient-args 'snakemake)))
(snakemake-build-targets
(list (snakemake-read-rule 'targets))
args))
Expand All @@ -711,7 +710,7 @@ To start a terminal for the current Snakefile directory, run
`\\[snakemake-term-start]'.
$ snakemake [ARGS] -- <targets>"
(interactive (list (snakemake-arguments)))
(interactive (list (transient-args 'snakemake)))
(let ((cmd (snakemake--make-command
(or (snakemake-file-targets-at-point)
(snakemake-rule-at-point)
Expand All @@ -727,27 +726,40 @@ $ snakemake [ARGS] -- <targets>"

(define-obsolete-function-alias 'snakemake-compile 'snakemake-build "1.2.0")

;;;###autoload (autoload 'snakemake-popup "snakemake" nil t)
(magit-define-popup snakemake-popup
"Popup console for running Snakemake."
:switches
'((?c "Use conda" "--use-conda")
(?f "Force" "--force")
(?i "Ignore temp()" "--notemp")
(?n "Dry run" "--dryrun")
(?p "Print shell commands" "-p")
(?r "Print reason" "--reason")
(?t "Touch files" "--touch"))
:options
'((?a "Allowed rules" "--allowed-rules " snakemake-read-rules)
(?j "Number of jobs" "-j"))
:actions
'((?c "Edit and run command" snakemake-build) nil nil
(?p "Build target at point" snakemake-build-targets-at-point)
(?f "Build file" snakemake-build-file-target)
(?r "Build rule" snakemake-build-rule-target))
:default-action 'snakemake-compile
:max-action-columns 3)
(transient-define-argument snakemake:--allowed-rules ()
:description "Allowed rules"
:class 'transient-option
:key "-a"
:argument "--allowed-rules="
:reader 'snakemake-read-rules)

(transient-define-argument snakemake:--jobs ()
:description "Number of jobs"
:class 'transient-option
:key "-j"
:argument "--jobs=")

;;;###autoload (autoload 'snakemake "snakemake" nil t)
(transient-define-prefix snakemake
"Transient for running Snakemake."
["Arguments"
("-c" "Use conda" "--use-conda")
("-f" "Force" "--force")
("-i" "Ignore temp()" "--notemp")
("-n" "Dry run" "--dryrun")
("-p" "Print shell commands" "-p")
("-r" "Print reason" "--reason")
("-t" "Touch files" "--touch")
(snakemake:--allowed-rules)
(snakemake:--jobs)]
["Actions"
[("c" "Edit and run command" snakemake-build)]
[("p" "Build target at point" snakemake-build-targets-at-point)
("f" "Build file" snakemake-build-file-target)
("r" "Build rule" snakemake-build-rule-target)]])

;;;###autoload
(define-obsolete-function-alias 'snakemake-popup 'snakemake "2.0.0")

(provide 'snakemake)
;;; snakemake.el ends here

0 comments on commit 49f2ea5

Please sign in to comment.