diff --git a/deps.edn b/deps.edn index 69a12a1..bf7cd60 100644 --- a/deps.edn +++ b/deps.edn @@ -1,5 +1,6 @@ {:deps {nrepl/bencode {:mvn/version "1.1.0"} - cheshire {:mvn/version "5.10.0"}} + cheshire {:mvn/version "5.10.0"} + org.flatland/ordered {:mvn/version "1.5.9"}} :aliases {:sci {:extra-deps diff --git a/project.clj b/project.clj index 9d07df7..320154f 100644 --- a/project.clj +++ b/project.clj @@ -7,7 +7,8 @@ :url "https://www.eclipse.org/legal/epl-1.0/"} :dependencies [[org.clojure/clojure "1.10.2-alpha1"] [nrepl/bencode "1.1.0"] - [cheshire "5.10.0"]] + [cheshire "5.10.0"] + [org.flatland/ordered "1.5.9"]] :deploy-repositories [["clojars" {:url "https://clojars.org/repo" :username :env/babashka_nrepl_clojars_user :password :env/babashka_nrepl_clojars_pass diff --git a/src/babashka/pods/impl.clj b/src/babashka/pods/impl.clj index 1e845b9..601a9bb 100644 --- a/src/babashka/pods/impl.clj +++ b/src/babashka/pods/impl.clj @@ -3,7 +3,8 @@ (:refer-clojure :exclude [read]) (:require [bencode.core :as bencode] [cheshire.core :as cheshire] - [clojure.edn :as edn])) + [clojure.edn :as edn] + [flatland.ordered.map :refer [ordered-map]])) (set! *warn-on-reflection* true) @@ -200,7 +201,7 @@ (fn [& args] (let [res (invoke pod sym args {:async async?})] res)))))) - {} + (ordered-map) vars)) pod-namespaces (reduce (fn [namespaces namespace] (let [name-str (-> namespace (get "name") bytes->string) diff --git a/test-pod/pod/test_pod.clj b/test-pod/pod/test_pod.clj index 5bbb93f..d1a0472 100644 --- a/test-pod/pod/test_pod.clj +++ b/test-pod/pod/test_pod.clj @@ -26,6 +26,14 @@ (defn read [] (bencode/read-bencode stdin)) +(def dependents + (for [i (range 10)] + {"name" (str "x" i) + "code" + (if-not (zero? i) + (format "(def x%s (inc x%s))" i (dec i)) + "(def x0 0)")})) + (defn run-pod [cli-args] (let [format (if (contains? cli-args "--json") :json @@ -52,16 +60,17 @@ "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))"}]}] + "vars" (into [{"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))"}] + dependents)}] "ops" {"shutdown" {}}}) (recur)) :invoke (let [var (-> (get message "var") diff --git a/test-resources/test_program.clj b/test-resources/test_program.clj index 4cb4f52..0bb6ee2 100644 --- a/test-resources/test_program.clj +++ b/test-resources/test_program.clj @@ -41,6 +41,8 @@ (def add-result (pod.test-pod/add-sync 1 2 3)) (def nil-result (pod.test-pod/return-nil)) +(def x9 pod.test-pod/x9) + (pods/unload-pod pod-id) (def successfully-removed (nil? (find-ns 'pod.test-pod))) @@ -55,4 +57,5 @@ @callback-result (:ex-message @error-result) (:ex-data @error-result) - successfully-removed] + successfully-removed + x9] diff --git a/test/babashka/pods/test_common.clj b/test/babashka/pods/test_common.clj index c5efe1d..a53d81d 100644 --- a/test/babashka/pods/test_common.clj +++ b/test/babashka/pods/test_common.clj @@ -1,21 +1,27 @@ (ns babashka.pods.test-common (:require [clojure.java.io :as io] - [clojure.test :refer [is]])) + [clojure.test :refer [is]] + [clojure.string :as str])) (def test-program (slurp (io/file "test-resources" "test_program.clj"))) (defn assertions [out err ret] - (is (= '["pod.test-pod" - pod.test-pod - {:a 1, :b 2} - 6 - 3 - [1 2 3 4 5 6 7 8 9] - "Illegal arguments / {:args (1 2 3)}" - nil - 3 - "java.lang.String cannot be cast to java.lang.Number" - {:args ["1" 2]} - true] ret)) + (doseq [[expected actual] + (map vector '["pod.test-pod" + pod.test-pod + {:a 1, :b 2} + 6 + 3 + [1 2 3 4 5 6 7 8 9] + "Illegal arguments / {:args (1 2 3)}" + nil + 3 + "java.lang.String cannot be cast to java.lang.Number" + {:args ["1" 2]} + true + 9] ret)] + (if (string? expected) + (str/includes? actual expected) + (= expected actual))) (is (= "(\"hello\" \"print\" \"this\" \"debugging\" \"message\")\n:foo\n:foo\n" (str out))) (is (= "(\"hello\" \"print\" \"this\" \"error\")\n" (str err))))