[#785] :requires option

This commit is contained in:
Michiel Borkent 2021-04-12 22:55:10 +02:00
parent 478dd780b7
commit 0ecee5bf94
2 changed files with 34 additions and 8 deletions

View file

@ -111,13 +111,23 @@
prog (wrap-depends task depends parallel?)] prog (wrap-depends task depends parallel?)]
(wrap-def task-name prog parallel? last?))))) (wrap-def task-name prog parallel? last?)))))
(defn format-task [init prog] (defn format-task [init requires prog]
(format " (format "
(require '[babashka.tasks :as tasks]) (ns %s %s)
(def clojure tasks/clojure) (require '[babashka.tasks])
(def shell tasks/shell) (when-not (resolve 'clojure)
;; we don't use refer so users can override this
(intern *ns* 'clojure babashka.tasks/clojure))
(when-not (resolve 'shell)
(intern *ns* 'shell babashka.tasks/shell))
%s %s
%s" %s"
(gensym "user")
(if (seq requires)
(format "(:require %s)" (str/join " " requires))
"")
(str init) (str init)
prog)) prog))
@ -140,29 +150,34 @@
task (get tasks task-name)] task (get tasks task-name)]
(if task (if task
(let [m? (map? task) (let [m? (map? task)
requires (get tasks :requires)
init (get tasks :init) init (get tasks :init)
prog (if-let [depends (when m? (:depends task))] prog (if-let [depends (when m? (:depends task))]
(let [targets (target-order tasks task-name)] (let [targets (target-order tasks task-name)]
(loop [prog "" (loop [prog ""
targets (seq targets)] targets (seq targets)
requires requires]
(let [t (first targets) (let [t (first targets)
targets (next targets)] targets (next targets)]
(if targets (if targets
(if-let [task (get tasks t)] (if-let [task (get tasks t)]
(recur (str prog "\n" (assemble-task-1 t task parallel?)) (recur (str prog "\n" (assemble-task-1 t task parallel?))
targets) targets
(concat requires (:requires task)))
[(binding [*out* *err*] [(binding [*out* *err*]
(println "No such task:" task-name)) 1]) (println "No such task:" task-name)) 1])
(if-let [task (get tasks t)] (if-let [task (get tasks t)]
(let [prog (str prog "\n" (let [prog (str prog "\n"
(apply str (map deref-task depends)) (apply str (map deref-task depends))
"\n" "\n"
(assemble-task-1 t task parallel? true))] (assemble-task-1 t task parallel? true))
[[(format-task init prog)] nil]) requires (concat requires (:requires task))]
[[(format-task init requires prog)] nil])
[(binding [*out* *err*] [(binding [*out* *err*]
(println "No such task:" task-name)) 1]))))) (println "No such task:" task-name)) 1])))))
[[(format-task [[(format-task
init init
(concat requires (:requires task))
(assemble-task-1 task-name task parallel? true))] nil])] (assemble-task-1 task-name task parallel? true))] nil])]
(when (= "true" (System/getenv "BABASHKA_DEV")) (when (= "true" (System/getenv "BABASHKA_DEV"))
(println (ffirst prog))) (println (ffirst prog)))

View file

@ -64,6 +64,17 @@
(test-utils/with-config '{:tasks {:init (def x 1) (test-utils/with-config '{:tasks {:init (def x 1)
foo x}} foo x}}
(is (= 1 (bb "foo"))))) (is (= 1 (bb "foo")))))
(testing "requires test"
(test-utils/with-config '{:tasks {:requires ([babashka.fs :as fs])
foo (fs/exists? ".")}}
(is (= true (bb "foo"))))
(test-utils/with-config '{:tasks {foo {:requires ([babashka.fs :as fs])
:task (fs/exists? ".")}}}
(is (= true (bb "foo"))))
(test-utils/with-config '{:tasks {bar {:requires ([babashka.fs :as fs])}
foo {:depends [bar]
:task (fs/exists? ".")}}}
(is (= true (bb "foo")))))
;; Note: this behavior with :when was complex, since the place where :when ;; Note: this behavior with :when was complex, since the place where :when
;; is inserted isn't very intuitive here ;; is inserted isn't very intuitive here
;; This is why we don't support :when for now ;; This is why we don't support :when for now