[#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?)]
(wrap-def task-name prog parallel? last?)))))
(defn format-task [init prog]
(defn format-task [init requires prog]
(format "
(require '[babashka.tasks :as tasks])
(def clojure tasks/clojure)
(def shell tasks/shell)
(ns %s %s)
(require '[babashka.tasks])
(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"
(gensym "user")
(if (seq requires)
(format "(:require %s)" (str/join " " requires))
"")
(str init)
prog))
@ -140,29 +150,34 @@
task (get tasks task-name)]
(if task
(let [m? (map? task)
requires (get tasks :requires)
init (get tasks :init)
prog (if-let [depends (when m? (:depends task))]
(let [targets (target-order tasks task-name)]
(loop [prog ""
targets (seq targets)]
targets (seq targets)
requires requires]
(let [t (first targets)
targets (next targets)]
(if targets
(if-let [task (get tasks t)]
(recur (str prog "\n" (assemble-task-1 t task parallel?))
targets)
targets
(concat requires (:requires task)))
[(binding [*out* *err*]
(println "No such task:" task-name)) 1])
(if-let [task (get tasks t)]
(let [prog (str prog "\n"
(apply str (map deref-task depends))
"\n"
(assemble-task-1 t task parallel? true))]
[[(format-task init prog)] nil])
(assemble-task-1 t task parallel? true))
requires (concat requires (:requires task))]
[[(format-task init requires prog)] nil])
[(binding [*out* *err*]
(println "No such task:" task-name)) 1])))))
[[(format-task
init
(concat requires (:requires task))
(assemble-task-1 task-name task parallel? true))] nil])]
(when (= "true" (System/getenv "BABASHKA_DEV"))
(println (ffirst prog)))

View file

@ -64,6 +64,17 @@
(test-utils/with-config '{:tasks {:init (def x 1)
foo x}}
(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
;; is inserted isn't very intuitive here
;; This is why we don't support :when for now