diff --git a/deps.edn b/deps.edn index 8d1119f..85e11d9 100644 --- a/deps.edn +++ b/deps.edn @@ -4,7 +4,7 @@ :aliases {:sci {:extra-deps - {borkdude/sci {:mvn/version "0.0.13-alpha.19"}}} + {borkdude/sci {:mvn/version "0.0.13-alpha.22"}}} :test {:extra-deps {test-runner diff --git a/src/babashka/pods/impl.clj b/src/babashka/pods/impl.clj index 6d6d968..d779535 100644 --- a/src/babashka/pods/impl.clj +++ b/src/babashka/pods/impl.clj @@ -27,6 +27,10 @@ (-> (get m k) bytes->string)) +(defn get-maybe-string [m k] + (some-> (get m k) + bytes->string)) + (defn processor [pod] (let [stdout (:stdout pod) format (:format pod) @@ -154,10 +158,13 @@ bytes->string #(Boolean/parseBoolean %)) name-sym (symbol name) - sym (symbol ns-name-str name)] - (assoc m name-sym (fn [& args] - (let [res (invoke pod sym args async?)] - res))))) + sym (symbol ns-name-str name) + code (get-maybe-string var "code")] + (assoc m name-sym + (or code + (fn [& args] + (let [res (invoke pod sym args async?)] + res)))))) {} vars)) pod-namespaces (reduce (fn [namespaces namespace] diff --git a/src/babashka/pods/jvm.clj b/src/babashka/pods/jvm.clj index 355a279..2518ef9 100644 --- a/src/babashka/pods/jvm.clj +++ b/src/babashka/pods/jvm.clj @@ -7,9 +7,14 @@ (let [pod (impl/load-pod pod-spec _opts) namespaces (:namespaces pod)] (doseq [[ns-sym v] namespaces] - (binding [*ns* (create-ns ns-sym)] - (dosync (commute @#'clojure.core/*loaded-libs* conj ns-sym))) - (doseq [[var-sym v] v] - (intern ns-sym var-sym v))) + (binding [*ns* (load-string (format "(ns %s) *ns*" ns-sym))] + (doseq [[var-sym v] v] + (cond + (ifn? v) + (do + (ns-unmap *ns* var-sym) + (intern ns-sym var-sym v)) + (string? v) + (load-string v))))) (future (impl/processor pod)) nil))) diff --git a/src/babashka/pods/sci.clj b/src/babashka/pods/sci.clj index af3c211..c1f06c0 100644 --- a/src/babashka/pods/sci.clj +++ b/src/babashka/pods/sci.clj @@ -12,7 +12,14 @@ (impl/load-pod pod-spec _opts)) namespaces (:namespaces pod) env (:env ctx)] - (swap! env update :namespaces merge namespaces) + (doseq [[ns-name vars] namespaces + :let [sci-ns (sci/create-ns ns-name)]] + (sci/binding [sci/ns sci-ns] + (doseq [[var-name var-value] vars] + (cond (ifn? var-value) + (swap! env assoc-in [:namespaces ns-name var-name] var-value) + (string? var-value) + (sci/eval-string* ctx var-value))))) (sci/future (impl/processor pod)) nil))) {:sci.impl/op :needs-ctx})) diff --git a/test-pod/pod/test_pod.clj b/test-pod/pod/test_pod.clj index 740d9d1..5c77067 100644 --- a/test-pod/pod/test_pod.clj +++ b/test-pod/pod/test_pod.clj @@ -45,21 +45,24 @@ op (read-string op) op (keyword op)] (case op - :describe (do (write {"format" (if (= format :json) - "json" - "edn") - "namespaces" - [{"name" "pod.test-pod" - "vars" [{"name" "add-sync"} - {"name" "range-stream" - "async" "true"} - {"name" "assoc"} - {"name" "error"} - {"name" "print"} - {"name" "print-err"} - {"name" "return-nil"}]}] - "ops" {"shutdown" {}}}) - (recur)) + :describe + (do (write {"format" (if (= format :json) + "json" + "edn") + "namespaces" + [{"name" "pod.test-pod" + "vars" [{"name" "add-sync"} + {"name" "range-stream" + "async" "true"} + {"name" "assoc"} + {"name" "error"} + {"name" "print"} + {"name" "print-err"} + {"name" "return-nil"} + {"name" "do-twice" + "code" "(defmacro do-twice [x] `(do ~x ~x))"}]}] + "ops" {"shutdown" {}}}) + (recur)) :invoke (let [var (-> (get message "var") read-string symbol) diff --git a/test/babashka/pods/jvm_test.clj b/test/babashka/pods/jvm_test.clj index a8c1895..30df013 100644 --- a/test/babashka/pods/jvm_test.clj +++ b/test/babashka/pods/jvm_test.clj @@ -1,6 +1,6 @@ (ns babashka.pods.jvm-test - (:require [babashka.pods.test-common :refer [test-program]] - [clojure.test :refer [deftest is]])) + (:require [babashka.pods.test-common :refer [test-program assertions]] + [clojure.test :refer [deftest]])) (deftest jvm-test (let [out (java.io.StringWriter.) @@ -11,10 +11,4 @@ test-program) (catch Exception e (prn e))))] - (is (= '[{:a 1, :b 2} - 6 - [1 2 3 4 5 6 7 8 9] - "Illegal arguments / {:args (1 2 3)}" - nil] ret)) - (is (= "nil\n(\"hello\" \"print\" \"this\" \"debugging\" \"message\")\n" (str out))) - (is (= "(\"hello\" \"print\" \"this\" \"error\")\n" (str err))))) + (assertions out err ret))) diff --git a/test/babashka/pods/sci_test.clj b/test/babashka/pods/sci_test.clj index 407c24e..4666aff 100644 --- a/test/babashka/pods/sci_test.clj +++ b/test/babashka/pods/sci_test.clj @@ -1,8 +1,8 @@ (ns babashka.pods.sci-test (:require [babashka.pods.sci :as pods] - [babashka.pods.test-common :refer [test-program]] + [babashka.pods.test-common :refer [test-program assertions]] [clojure.core.async :as async] - [clojure.test :refer [deftest is]] + [clojure.test :refer [deftest]] [sci.core :as sci])) (deftest sci-test @@ -17,10 +17,4 @@ 'clojure.core.async {'