From 0ecee5bf9423dd50eafdb0b26056e2e871ff3bff Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Mon, 12 Apr 2021 22:55:10 +0200 Subject: [PATCH] [#785] :requires option --- src/babashka/impl/tasks.clj | 31 +++++++++++++++++++++++-------- test/babashka/bb_edn_test.clj | 11 +++++++++++ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/babashka/impl/tasks.clj b/src/babashka/impl/tasks.clj index 552a1d48..c82b03ae 100644 --- a/src/babashka/impl/tasks.clj +++ b/src/babashka/impl/tasks.clj @@ -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))) diff --git a/test/babashka/bb_edn_test.clj b/test/babashka/bb_edn_test.clj index f47a44fc..a16fa234 100644 --- a/test/babashka/bb_edn_test.clj +++ b/test/babashka/bb_edn_test.clj @@ -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