diff --git a/sci b/sci index 1d41480d..87938f46 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 1d41480d9dca2cd62f8cd341392919d1b64183ec +Subproject commit 87938f46813e73e0f2d8b5ebf4a421b0f0b75031 diff --git a/src/babashka/main.clj b/src/babashka/main.clj index 6d6c99d1..e3c053a4 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -76,15 +76,19 @@ -io: combination of -i and -o. --stream: stream over lines or EDN values from stdin. Combined with -i *in* becomes a single line per iteration. --file or -f: read expressions from file instead of argument wrapped in an implicit do. + --time: print execution time before exiting. ")) +(defn wrap-do [s] + (format "(do %s)" s)) + (defn read-file [file] (let [f (io/file file)] (if (.exists f) (as-> (slurp file) x ;; remove shebang (str/replace x #"^#!.*" "") - (format "(do %s)" x)) + (wrap-do x)) (throw (Exception. (str "File does not exist: " file)))))) (defn get-env @@ -138,6 +142,11 @@ (System/setProperty "javax.net.ssl.trustStore" ca-certs) (System/setProperty "javax.net.ssl.tru stAnchors" ca-certs))) +(defn load-file* [ctx file] + (let [s (slurp file) + s (wrap-do s)] + (sci/eval-string s ctx))) + (defn main [& args] #_(binding [*out* *err*] @@ -147,6 +156,7 @@ :help? :file :command-line-args :expression :stream? :time?] :as _opts} (parse-opts args) + env (atom {}) exit-code (or #_(binding [*out* *err*] @@ -159,7 +169,7 @@ :else (try - (let [expr (if file (read-file file) (format "(do %s)" expression)) + (let [expr (if file (read-file file) (wrap-do expression)) read-next #(if stream? (if raw-in (or (read-line) ::EOF) (read-edn)) @@ -168,27 +178,30 @@ (parse-shell-string in) (edn/read-string in)))))] (loop [in (read-next)] - (if (identical? ::EOF in) - [nil 0] ;; done streaming - (let [res [(do (when-not (or expression file) - (throw (Exception. (str args "Babashka expected an expression. Type --help to print help.")))) - (let [res (sci/eval-string - expr - {:bindings (assoc bindings - (with-meta '*in* - (when-not stream? {:sci/deref! true})) in - #_(with-meta 'bb/*in* - {:sci/deref! true}) #_do-in - '*command-line-args* command-line-args)})] - (if raw-out - (if (coll? res) - (doseq [l res] - (println l)) - (println res)) - ((if println? println? prn) res)))) 0]] - (if stream? - (recur (read-next)) - res))))) + (let [ctx {:bindings (assoc bindings + (with-meta '*in* + (when-not stream? {:sci/deref! true})) in + #_(with-meta 'bb/*in* + {:sci/deref! true}) #_do-in + '*command-line-args* command-line-args) + :env env} + ctx (update ctx :bindings assoc 'load-file #(load-file* ctx %))] + (if (identical? ::EOF in) + [nil 0] ;; done streaming + (let [res [(do (when-not (or expression file) + (throw (Exception. (str args "Babashka expected an expression. Type --help to print help.")))) + (let [res (sci/eval-string + expr + ctx)] + (if raw-out + (if (coll? res) + (doseq [l res] + (println l)) + (println res)) + ((if println? println? prn) res)))) 0]] + (if stream? + (recur (read-next)) + res)))))) (catch Exception e (binding [*out* *err*] (let [d (ex-data e) diff --git a/test/babashka/main_test.clj b/test/babashka/main_test.clj index 8e0abdbc..6ca53232 100644 --- a/test/babashka/main_test.clj +++ b/test/babashka/main_test.clj @@ -86,7 +86,7 @@ (deftest ssl-test (let [graalvm-home (System/getenv "GRAALVM_HOME") lib-path (format "%1$s/jre/lib:%1$s/jre/lib/amd64" graalvm-home) - _ (prn "lib-path" lib-path) + ;; _ (prn "lib-path" lib-path) resp (bb nil (format "(System/setProperty \"java.library.path\" \"%s\") (slurp \"https://www.google.com\")" lib-path))] @@ -99,3 +99,9 @@ (is (= x (test-utils/bb x "--stream" "-io" "*in*")))) (let [x "f\n\b\n"] (is (= x (test-utils/bb x "--stream" "-io" "(subs *in* 0 1)"))))) + +(deftest load-file-test + (let [tmp (java.io.File/createTempFile "script" ".clj")] + (spit tmp "(defn foo [x y] (+ x y)) (defn bar [x y] (* x y))") + (is (= "120\n" (test-utils/bb nil (format "(load-file \"%s\") (bar (foo 10 30) 3)" + (.getPath tmp))))))) diff --git a/test/babashka/test_utils.clj b/test/babashka/test_utils.clj index 76952cfb..12bcd89e 100644 --- a/test/babashka/test_utils.clj +++ b/test/babashka/test_utils.clj @@ -12,7 +12,7 @@ (if input (with-in-str input (apply main/main args)) - (apply main/main input args))))] + (apply main/main args))))] (if-let [err ^String (not-empty (str sw))] (throw (Exception. err)) res))) @@ -21,7 +21,7 @@ (try (if input (apply bb (conj (vec args) {:in input})) - (apply bb input args)) + (apply bb args)) (catch Exception e (let [d (ex-data e) err-msg (or (:stderr (ex-data e)) "")]