Scope transit read and write handlers to pod ids
This commit is contained in:
parent
1fdd8231bd
commit
05ecf97127
8 changed files with 52 additions and 38 deletions
2
deps.edn
2
deps.edn
|
|
@ -18,5 +18,5 @@
|
||||||
{lambdaisland/kaocha {:mvn/version "1.0.632"}}
|
{lambdaisland/kaocha {:mvn/version "1.0.632"}}
|
||||||
:main-opts ["-m" "kaocha.runner"]}
|
:main-opts ["-m" "kaocha.runner"]}
|
||||||
:test-pod
|
:test-pod
|
||||||
{:paths ["src" "test-pod"]
|
{:extra-paths ["src" "test-pod"]
|
||||||
:main-opts ["-m" "pod.test-pod"]}}}
|
:main-opts ["-m" "pod.test-pod"]}}}
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,8 @@
|
||||||
([pod-id-or-pod sym args] (invoke pod-id-or-pod sym args {}))
|
([pod-id-or-pod sym args] (invoke pod-id-or-pod sym args {}))
|
||||||
([pod-id-or-pod sym args opts] (jvm/invoke pod-id-or-pod sym args opts)))
|
([pod-id-or-pod sym args opts] (jvm/invoke pod-id-or-pod sym args opts)))
|
||||||
|
|
||||||
(defn add-transit-read-handler [tag fn]
|
(defn add-transit-read-handler [pod-id tag fn]
|
||||||
(jvm/add-transit-read-handler tag fn))
|
(jvm/add-transit-read-handler pod-id tag fn))
|
||||||
|
|
||||||
(defn add-transit-write-handler [tag fn classes]
|
(defn add-transit-write-handler [pod-id tag fn classes]
|
||||||
(jvm/add-transit-write-handler tag fn classes))
|
(jvm/add-transit-write-handler pod-id tag fn classes))
|
||||||
|
|
|
||||||
|
|
@ -40,28 +40,43 @@
|
||||||
(str (java.util.UUID/randomUUID)))
|
(str (java.util.UUID/randomUUID)))
|
||||||
|
|
||||||
(defonce transit-read-handlers (atom {}))
|
(defonce transit-read-handlers (atom {}))
|
||||||
|
(defonce transit-read-handler-maps (atom {}))
|
||||||
|
|
||||||
(defn transit-json-read [^String s]
|
(defn update-transit-read-handler-map [pod-id]
|
||||||
|
(swap! transit-read-handler-maps assoc pod-id
|
||||||
|
(transit/read-handler-map (get @transit-read-handlers pod-id))))
|
||||||
|
|
||||||
|
(defn transit-json-read [pod-id ^String s]
|
||||||
(with-open [bais (java.io.ByteArrayInputStream. (.getBytes s "UTF-8"))]
|
(with-open [bais (java.io.ByteArrayInputStream. (.getBytes s "UTF-8"))]
|
||||||
(let [r (transit/reader bais :json {:handlers @transit-read-handlers})]
|
(let [r (transit/reader bais :json {:handlers (get @transit-read-handler-maps pod-id)})]
|
||||||
(transit/read r))))
|
(transit/read r))))
|
||||||
|
|
||||||
;; https://www.cognitect.com/blog/2015/9/10/extending-transit
|
;; https://www.cognitect.com/blog/2015/9/10/extending-transit
|
||||||
(defn add-transit-read-handler [tag fn]
|
(defn add-transit-read-handler [pod-id tag fn]
|
||||||
(let [rh (transit/read-handler fn)]
|
(let [rh (transit/read-handler fn)]
|
||||||
(swap! transit-read-handlers assoc tag rh)))
|
(swap! transit-read-handlers assoc-in [pod-id tag] rh)
|
||||||
|
(update-transit-read-handler-map pod-id)
|
||||||
|
nil))
|
||||||
|
|
||||||
(defonce transit-write-handlers (atom {}))
|
(defonce transit-write-handlers (atom {}))
|
||||||
|
(defonce transit-write-handler-maps (atom {}))
|
||||||
|
|
||||||
|
(defn update-transit-write-handler-map [pod-id]
|
||||||
|
(swap! transit-write-handler-maps assoc pod-id
|
||||||
|
(transit/write-handler-map (get @transit-write-handlers pod-id))))
|
||||||
|
|
||||||
;; https://www.cognitect.com/blog/2015/9/10/extending-transit
|
;; https://www.cognitect.com/blog/2015/9/10/extending-transit
|
||||||
(defn add-transit-write-handler [tag fn classes]
|
(defn add-transit-write-handler [pod-id tag fn classes]
|
||||||
(let [rh (transit/write-handler tag fn)]
|
(let [rh (transit/write-handler tag fn)]
|
||||||
(doseq [class classes]
|
(doseq [class classes]
|
||||||
(swap! transit-write-handlers assoc class rh))))
|
(swap! transit-write-handlers assoc-in [pod-id class] rh)))
|
||||||
|
(update-transit-write-handler-map pod-id)
|
||||||
|
nil)
|
||||||
|
|
||||||
(defn transit-json-write [^String s]
|
(defn transit-json-write [pod-id ^String s]
|
||||||
|
;; (.println System/err (:pod-id pod))
|
||||||
(with-open [baos (java.io.ByteArrayOutputStream. 4096)]
|
(with-open [baos (java.io.ByteArrayOutputStream. 4096)]
|
||||||
(let [w (transit/writer baos :json {:handlers @transit-write-handlers})]
|
(let [w (transit/writer baos :json {:handlers (get @transit-write-handler-maps pod-id)})]
|
||||||
(transit/write w s)
|
(transit/write w s)
|
||||||
(str baos))))
|
(str baos))))
|
||||||
|
|
||||||
|
|
@ -73,7 +88,7 @@
|
||||||
write-fn (case format
|
write-fn (case format
|
||||||
:edn pr-str
|
:edn pr-str
|
||||||
:json cheshire/generate-string
|
:json cheshire/generate-string
|
||||||
:transit+json transit-json-write)
|
:transit+json #(transit-json-write (:pod-id pod) %))
|
||||||
id (next-id)
|
id (next-id)
|
||||||
chan (if handlers handlers
|
chan (if handlers handlers
|
||||||
(promise))
|
(promise))
|
||||||
|
|
@ -127,7 +142,7 @@
|
||||||
(throw e)))))
|
(throw e)))))
|
||||||
:transit+json
|
:transit+json
|
||||||
(fn [s]
|
(fn [s]
|
||||||
(try (transit-json-read s)
|
(try (transit-json-read (:pod-id pod) s)
|
||||||
(catch Exception e
|
(catch Exception e
|
||||||
(binding [*out* *err*]
|
(binding [*out* *err*]
|
||||||
(println "Cannot read Transit JSON: " (pr-str s))
|
(println "Cannot read Transit JSON: " (pr-str s))
|
||||||
|
|
@ -285,14 +300,6 @@
|
||||||
(binding [*out* *err*]
|
(binding [*out* *err*]
|
||||||
(println (str/join " " (map pr-str strs)))))
|
(println (str/join " " (map pr-str strs)))))
|
||||||
|
|
||||||
;; TODO: symbol -> look up pod in local cache, invoke if present, else
|
|
||||||
;; download via package.
|
|
||||||
;; What about versions?
|
|
||||||
;; bb can package definitions of popular pods in its resources
|
|
||||||
;; but what if the resources have an error - maybe best to fetch the definitions from github
|
|
||||||
;; (load-pod 'org.babashka/postgresql)
|
|
||||||
;; (load-pod 'org.babashka/postgresql_0.0.1)
|
|
||||||
|
|
||||||
(defn load-pod
|
(defn load-pod
|
||||||
([pod-spec] (load-pod pod-spec nil))
|
([pod-spec] (load-pod pod-spec nil))
|
||||||
([pod-spec opts]
|
([pod-spec opts]
|
||||||
|
|
|
||||||
|
|
@ -70,8 +70,8 @@
|
||||||
([pod-id sym args] (invoke pod-id sym args {}))
|
([pod-id sym args] (invoke pod-id sym args {}))
|
||||||
([pod-id sym args opts] (impl/invoke-public pod-id sym args opts)))
|
([pod-id sym args opts] (impl/invoke-public pod-id sym args opts)))
|
||||||
|
|
||||||
(defn add-transit-read-handler [tag fn]
|
(defn add-transit-read-handler [pod-id tag fn]
|
||||||
(impl/add-transit-read-handler tag fn))
|
(impl/add-transit-read-handler pod-id tag fn))
|
||||||
|
|
||||||
(defn add-transit-write-handler [tag fn classes]
|
(defn add-transit-write-handler [pod-id tag fn classes]
|
||||||
(impl/add-transit-write-handler tag fn classes))
|
(impl/add-transit-write-handler pod-id tag fn classes))
|
||||||
|
|
|
||||||
|
|
@ -80,8 +80,8 @@
|
||||||
([pod-id sym args] (invoke pod-id sym args {}))
|
([pod-id sym args] (invoke pod-id sym args {}))
|
||||||
([pod-id sym args opts] (impl/invoke-public pod-id sym args opts)))
|
([pod-id sym args opts] (impl/invoke-public pod-id sym args opts)))
|
||||||
|
|
||||||
(defn add-transit-read-handler [tag fn]
|
(defn add-transit-read-handler [pod-id tag fn]
|
||||||
(impl/add-transit-read-handler tag fn))
|
(impl/add-transit-read-handler pod-id tag fn))
|
||||||
|
|
||||||
(defn add-transit-write-handler [tag fn classes]
|
(defn add-transit-write-handler [pod-id tag fn classes]
|
||||||
(impl/add-transit-write-handler tag fn classes))
|
(impl/add-transit-write-handler pod-id tag fn classes))
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@
|
||||||
(defn transit-json-read [^String s]
|
(defn transit-json-read [^String s]
|
||||||
(with-open [bais (java.io.ByteArrayInputStream. (.getBytes s "UTF-8"))]
|
(with-open [bais (java.io.ByteArrayInputStream. (.getBytes s "UTF-8"))]
|
||||||
(let [r (transit/reader bais :json {:handlers
|
(let [r (transit/reader bais :json {:handlers
|
||||||
{"pod.test-pod/local-date-time"
|
{"local-date-time"
|
||||||
(transit/read-handler
|
(transit/read-handler
|
||||||
(fn [s]
|
(fn [s]
|
||||||
(java.time.LocalDateTime/parse s)))}})]
|
(java.time.LocalDateTime/parse s)))}})]
|
||||||
|
|
@ -48,7 +48,7 @@
|
||||||
(let [w (transit/writer baos :json {:handlers
|
(let [w (transit/writer baos :json {:handlers
|
||||||
{java.time.LocalDateTime
|
{java.time.LocalDateTime
|
||||||
(transit/write-handler
|
(transit/write-handler
|
||||||
"pod.test-pod/local-date-time"
|
"local-date-time"
|
||||||
str)}})]
|
str)}})]
|
||||||
(transit/write w s)
|
(transit/write w s)
|
||||||
(str baos))))
|
(str baos))))
|
||||||
|
|
@ -123,9 +123,9 @@
|
||||||
{"name" "-local-date-time"}
|
{"name" "-local-date-time"}
|
||||||
{"name" "local-date-time"
|
{"name" "local-date-time"
|
||||||
"code" "
|
"code" "
|
||||||
(babashka.pods/add-transit-read-handler \"pod.test-pod/local-date-time\"
|
(babashka.pods/add-transit-read-handler \"pod.test-pod\" \"local-date-time\"
|
||||||
(fn [s] (java.time.LocalDateTime/parse s)))
|
(fn [s] (java.time.LocalDateTime/parse s)))
|
||||||
(babashka.pods/add-transit-write-handler \"pod.test-pod/local-date-time\"
|
(babashka.pods/add-transit-write-handler \"pod.test-pod\" \"local-date-time\"
|
||||||
str #{java.time.LocalDateTime})
|
str #{java.time.LocalDateTime})
|
||||||
(defn local-date-time [x]
|
(defn local-date-time [x]
|
||||||
(-local-date-time x))"}]
|
(-local-date-time x))"}]
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,13 @@
|
||||||
|
|
||||||
(def socket (System/getenv "BABASHKA_POD_TEST_SOCKET"))
|
(def socket (System/getenv "BABASHKA_POD_TEST_SOCKET"))
|
||||||
|
|
||||||
(def pod-id (:pod/id (pods/load-pod (cond-> ["clojure" "-A:test-pod"]
|
(def cmd (cond-> ["clojure" "-M:test-pod"]
|
||||||
(= "json" fmt) (conj "--json")
|
(= "json" fmt) (conj "--json")
|
||||||
(= "transit+json" fmt) (conj "--transit+json"))
|
(= "transit+json" fmt) (conj "--transit+json")))
|
||||||
|
|
||||||
|
;; (.println System/err cmd)
|
||||||
|
|
||||||
|
(def pod-id (:pod/id (pods/load-pod cmd
|
||||||
{:socket (boolean socket)})))
|
{:socket (boolean socket)})))
|
||||||
|
|
||||||
(require '[pod.test-pod :as pod])
|
(require '[pod.test-pod :as pod])
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,9 @@
|
||||||
(def test-program (slurp (io/file "test-resources" "test_program.clj")))
|
(def test-program (slurp (io/file "test-resources" "test_program.clj")))
|
||||||
|
|
||||||
(defn assertions [out err ret]
|
(defn assertions [out err ret]
|
||||||
|
;; (.println System/err ret)
|
||||||
|
;; (.println System/err out)
|
||||||
|
;; (.println System/err err)
|
||||||
(doseq [[expected actual]
|
(doseq [[expected actual]
|
||||||
(map vector '["pod.test-pod"
|
(map vector '["pod.test-pod"
|
||||||
pod.test-pod
|
pod.test-pod
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue