diff --git a/src/babashka/pods/jvm.clj b/src/babashka/pods/jvm.clj index 404516d..437a360 100644 --- a/src/babashka/pods/jvm.clj +++ b/src/babashka/pods/jvm.clj @@ -1,6 +1,38 @@ (ns babashka.pods.jvm (:require [babashka.pods.impl :as impl])) +(def ^:private namespaces-to-load (atom {})) + +(defn- unroot-resource [^String path] + (symbol (.. path + (substring 1) + (replace \/ \. ) + (replace \_ \-)))) + +(defn- process-namespace [{:keys [:name :vars :done]}] + (binding [*ns* (load-string (format "(ns %s) *ns*" name))] + (doseq [[var-sym v] vars] + (cond + (ifn? v) + (do + (ns-unmap *ns* var-sym) + (intern name var-sym v)) + (string? v) + (load-string v)))) + (when done (deliver done :ok))) + +(let [core-load clojure.core/load] + (intern 'clojure.core 'load + (fn [& paths] + (let [nss @namespaces-to-load] + (doseq [path paths] + (let [lib (unroot-resource path)] + (if-let [pod (get nss lib)] + (impl/load-ns + pod lib (fn [namespace] + (process-namespace namespace))) + (core-load path)))))))) + (defn load-pod ([pod-spec] (load-pod pod-spec nil)) ([pod-spec _opts] @@ -12,17 +44,20 @@ (intern (create-ns (symbol (namespace sym))) (symbol (name sym)))))}) - namespaces (:namespaces pod)] - (doseq [[ns-sym v] namespaces] - (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))))) + namespaces (:namespaces pod) + load? (contains? (:ops pod) :load)] + (when load? + (swap! namespaces-to-load + merge + (into {} + (keep (fn [[ns-name vars]] + (when (empty? vars) + [ns-name pod])) + namespaces)))) + (doseq [[ns-sym vars] namespaces + :when (or (not load) + (seq vars))] + (process-namespace {:name ns-sym :vars vars})) (future (impl/processor pod)) {:pod/id (:pod-id pod)}))) diff --git a/test-resources/test_program.clj b/test-resources/test_program.clj index 1d878a6..906d0e3 100644 --- a/test-resources/test_program.clj +++ b/test-resources/test_program.clj @@ -47,7 +47,6 @@ (def other-tagged (pod/other-tag)) (require '[pod.test-pod.loaded]) - (def loaded (pod.test-pod.loaded/loaded 1)) (pods/unload-pod pod-id)