diff --git a/project.clj b/project.clj index 22e272e..303ea02 100644 --- a/project.clj +++ b/project.clj @@ -12,4 +12,4 @@ :username :env/babashka_nrepl_clojars_user :password :env/babashka_nrepl_clojars_pass :sign-releases false}]] - :profiles {:test {:dependencies [[borkdude/sci "0.0.13-alpha.26"]]}}) + :profiles {:test {:dependencies [[borkdude/sci "0.0.13-alpha.27"]]}}) diff --git a/src/babashka/pods/impl.clj b/src/babashka/pods/impl.clj index 7c6317a..83e77a8 100644 --- a/src/babashka/pods/impl.clj +++ b/src/babashka/pods/impl.clj @@ -236,8 +236,8 @@ (defn load-ns [pod namespace callback] (let [id (next-id) callback (fn [reply] - (let [namespace (bencode->namespace pod reply)] - (callback namespace)))] + (let [[name-sym vars] (bencode->namespace pod reply)] + (callback {:name name-sym :vars vars})))] (swap! callbacks assoc id callback) (write (:stdin pod) {"op" "load" diff --git a/src/babashka/pods/sci.clj b/src/babashka/pods/sci.clj index cd5ef35..6de1045 100644 --- a/src/babashka/pods/sci.clj +++ b/src/babashka/pods/sci.clj @@ -13,7 +13,9 @@ (sci/new-var (symbol (str ns-name) (str var-name)) var-value)) (string? var-value) - (sci/eval-string* ctx var-value)))))) + (do + (prn "eval" @sci/ns var-value) + (sci/eval-string* ctx var-value))))))) (def load-pod (with-meta @@ -40,9 +42,11 @@ v) v))))})) namespaces (:namespaces pod) - namespaces-to-load (when (contains? (:ops pod) :load) - (set (filter (fn [[_ns-name vars]] - (nil? vars)) + load? (contains? (:ops pod) :load) + namespaces-to-load (when load? + (set (keep (fn [[ns-name vars]] + (when (empty? vars) + ns-name)) namespaces)))] (when (seq namespaces-to-load) (let [load-fn (fn load-fn [{:keys [:namespace]}] @@ -57,7 +61,9 @@ (when prev-load-fn (prev-load-fn m))))] (swap! env assoc :load-fn new-load-fn))) - (doseq [[ns-name vars] namespaces] + (doseq [[ns-name vars] namespaces + :when (or (not load) + (seq vars))] (process-namespace ctx {:name ns-name :vars vars})) (sci/future (impl/processor pod)) {:pod/id (:pod-id pod)}))) diff --git a/test-pod/pod/test_pod.clj b/test-pod/pod/test_pod.clj index d4f4caf..ea44a26 100644 --- a/test-pod/pod/test_pod.clj +++ b/test-pod/pod/test_pod.clj @@ -80,8 +80,10 @@ ;; reads thing with other tag {"name" "read-other-tag" "code" "(defn read-other-tag [x] [x x])"}] - dependents)}] - "ops" {"shutdown" {}}}) + dependents)} + {"name" "pod.test-pod.loaded"}] + "ops" {"shutdown" {} + "load" {}}}) (recur)) :invoke (let [var (-> (get message "var") read-string @@ -156,7 +158,20 @@ "id" id "value" "#my/other-tag[1]"})) (recur)) - :shutdown (System/exit 0)))))) + :shutdown (System/exit 0) + :load (let [path (-> (get message "path") + read-string + symbol) + id (-> (get message "id") + read-string)] + (case path + pod.test-pod.loaded + (write + {"status" ["done"] + "id" id + "name" "pod.test-pod.loaded" + "vars" [{"name" "loaded" + "code" "(defn loaded [x] (inc x))"}]})))))))) (catch Exception e (binding [*out* *err*] (prn e)))))) diff --git a/test-resources/test_program.clj b/test-resources/test_program.clj index 64293c5..1d878a6 100644 --- a/test-resources/test_program.clj +++ b/test-resources/test_program.clj @@ -46,6 +46,10 @@ (def tagged (pod/reader-tag)) (def other-tagged (pod/other-tag)) +(require '[pod.test-pod.loaded]) + +(def loaded (pod.test-pod.loaded/loaded 1)) + (pods/unload-pod pod-id) (def successfully-removed (nil? (find-ns 'pod.test-pod))) @@ -63,4 +67,5 @@ successfully-removed x9 tagged - other-tagged] + other-tagged + loaded]