add support for --init as a file to be loaded before evaluation actions (#1033)

This commit is contained in:
Bob 2021-10-17 04:44:31 -04:00 committed by GitHub
parent b9396ac318
commit bf3b6d2dca
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 57 additions and 1 deletions

View file

@ -132,6 +132,7 @@ Global opts:
-cp, --classpath Classpath to use. Overrides bb.edn classpath.
--debug Print debug information and internal stacktrace in case of exception.
--force Passes -Sforce to deps.clj, forcing recalculation of the classpath.
--init <file> Load file after any preloads and prior to evaluation/subcommands.
Help:
@ -586,6 +587,10 @@ Use bb run --help to show this help output.
(let [options (next options)]
(recur (next options)
(assoc opts-map :main (first options))))
("--init")
(let [options (next options)]
(recur (next options)
(assoc opts-map :init (first options))))
("--run")
(parse-run-opts opts-map (next options))
("--tasks")
@ -662,7 +667,7 @@ Use bb run --help to show this help output.
(let [{version-opt :version
:keys [:shell-in :edn-in :shell-out :edn-out
:help :file :command-line-args
:expressions :stream?
:expressions :stream? :init
:repl :socket-repl :nrepl
:debug :classpath :force?
:main :uberscript :describe?
@ -762,6 +767,7 @@ Use bb run --help to show this help output.
(error-handler e {:expression expressions
:debug debug
:preloads preloads
:init init
:loader (:loader @cp/cp-state)}))))
expression (str/join " " expressions) ;; this might mess with the locations...
exit-code
@ -775,8 +781,22 @@ Use bb run --help to show this help output.
(error-handler e {:expression expression
:debug debug
:preloads preloads
:init init
:loader (:loader @cp/cp-state)})))))
nil))
exit-code
;; handle --init
(if exit-code exit-code
(do (when init
(try
(load-file* init)
(catch Throwable e
(error-handler e {:expression expression
:debug debug
:preloads preloads
:init init
:loader (:loader @cp/cp-state)}))))
nil))
;; socket REPL is start asynchronously. when no other args are
;; provided, a normal REPL will be started as well, which causes the
;; process to wait until SIGINT

View file

@ -0,0 +1,4 @@
(ns init-caller
(:require [init-test :as i]))
(i/do-a-thing)

View file

@ -0,0 +1,6 @@
(ns init-test)
(defn do-a-thing [] "foo")
(defn -main [& _]
"Hello from init!")

View file

@ -0,0 +1,6 @@
(ns call-init-main
(:require [init-test :as i]))
(defn foobar [] (str (i/do-a-thing) "bar"))
(defn -main [& _] (i/do-a-thing))

View file

@ -189,6 +189,26 @@
(defn bar [x y] (* x y))
(bar (foo 10 30) 3)))"))))
(deftest init-test
(testing "init with a file"
(is (= "foo" (bb nil "--init" "test-resources/babashka/init_test.clj"
"-f" "test-resources/babashka/init_caller.clj"))))
(testing "init with eval(s)"
(is (= "foo" (bb nil "--init" "test-resources/babashka/init_test.clj"
"-e" "(init-test/do-a-thing)"))))
(testing "init with main from init'ed ns"
(is (= "Hello from init!" (bb nil "--init" "test-resources/babashka/init_test.clj"
"-m" "init-test"))))
(testing "init with main from another namespace"
(test-utils/with-config '{:paths ["test-resources/babashka/src_for_classpath_test"]}
(is (= "foo" (bb nil "--init" "test-resources/babashka/init_test.clj"
"-m" "call-init-main")))))
(testing "init with a qualified function passed to --main"
(test-utils/with-config '{:paths ["test-resources/babashka/src_for_classpath_test"]}
(is (= "foobar" (bb nil "--init" "test-resources/babashka/init_test.clj"
"-m" "call-init-main/foobar"))))))
(deftest preloads-test
;; THIS TEST REQUIRES:
;; export BABASHKA_PRELOADS='(defn __bb__foo [] "foo") (defn __bb__bar [] "bar")'