[#21] Support transit+json
This commit is contained in:
parent
dd57413d27
commit
e1ab6a00e5
5 changed files with 67 additions and 19 deletions
5
deps.edn
5
deps.edn
|
|
@ -1,5 +1,6 @@
|
||||||
{:deps {nrepl/bencode {:mvn/version "1.1.0"}
|
{:deps {nrepl/bencode {:mvn/version "1.1.0"}
|
||||||
cheshire {:mvn/version "5.10.0"}}
|
cheshire/cheshire {:mvn/version "5.10.0"}
|
||||||
|
com.cognitect/transit-clj {:mvn/version "1.0.324"}}
|
||||||
:aliases
|
:aliases
|
||||||
{:sci
|
{:sci
|
||||||
{:extra-deps
|
{:extra-deps
|
||||||
|
|
@ -7,7 +8,7 @@
|
||||||
:sha "a7f8d05f08ab150621c2403dacdd57c47ea09ff4"}}}
|
:sha "a7f8d05f08ab150621c2403dacdd57c47ea09ff4"}}}
|
||||||
:test
|
:test
|
||||||
{:extra-deps
|
{:extra-deps
|
||||||
{test-runner
|
{cognitect/test-runner
|
||||||
{:git/url "https://github.com/cognitect-labs/test-runner"
|
{:git/url "https://github.com/cognitect-labs/test-runner"
|
||||||
:sha "cb96e80f6f3d3b307c59cbeb49bb0dcb3a2a780b"}}
|
:sha "cb96e80f6f3d3b307c59cbeb49bb0dcb3a2a780b"}}
|
||||||
:extra-paths ["test"]
|
:extra-paths ["test"]
|
||||||
|
|
|
||||||
|
|
@ -5,17 +5,26 @@ export BABASHKA_POD_TEST_SOCKET
|
||||||
|
|
||||||
# format = edn
|
# format = edn
|
||||||
BABASHKA_POD_TEST_FORMAT=edn
|
BABASHKA_POD_TEST_FORMAT=edn
|
||||||
|
echo "Testing edn"
|
||||||
clojure -A:test -n babashka.pods.jvm-test
|
clojure -A:test -n babashka.pods.jvm-test
|
||||||
clojure -A:sci:test -n babashka.pods.sci-test
|
clojure -A:sci:test -n babashka.pods.sci-test
|
||||||
|
|
||||||
# format = json
|
# format = json
|
||||||
BABASHKA_POD_TEST_FORMAT=json
|
BABASHKA_POD_TEST_FORMAT=json
|
||||||
|
echo "Testing json"
|
||||||
|
clojure -A:test -n babashka.pods.jvm-test
|
||||||
|
clojure -A:sci:test -n babashka.pods.sci-test
|
||||||
|
|
||||||
|
# format = json
|
||||||
|
BABASHKA_POD_TEST_FORMAT="transit+json"
|
||||||
|
echo "Testing transit"
|
||||||
clojure -A:test -n babashka.pods.jvm-test
|
clojure -A:test -n babashka.pods.jvm-test
|
||||||
clojure -A:sci:test -n babashka.pods.sci-test
|
clojure -A:sci:test -n babashka.pods.sci-test
|
||||||
|
|
||||||
# socket = true
|
# socket = true
|
||||||
unset BABASHKA_POD_TEST_FORMAT
|
unset BABASHKA_POD_TEST_FORMAT
|
||||||
BABASHKA_POD_TEST_SOCKET=true
|
BABASHKA_POD_TEST_SOCKET=true
|
||||||
|
echo "Testing socket"
|
||||||
clojure -A:test -n babashka.pods.jvm-test
|
clojure -A:test -n babashka.pods.jvm-test
|
||||||
clojure -A:sci:test -n babashka.pods.sci-test
|
clojure -A:sci:test -n babashka.pods.sci-test
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,8 @@
|
||||||
[cheshire.core :as cheshire]
|
[cheshire.core :as cheshire]
|
||||||
[clojure.edn :as edn]
|
[clojure.edn :as edn]
|
||||||
[clojure.java.io :as io]
|
[clojure.java.io :as io]
|
||||||
[clojure.string :as str])
|
[clojure.string :as str]
|
||||||
|
[cognitect.transit :as transit])
|
||||||
(:import [java.io PushbackInputStream]
|
(:import [java.io PushbackInputStream]
|
||||||
[java.net Socket]))
|
[java.net Socket]))
|
||||||
|
|
||||||
|
|
@ -37,6 +38,17 @@
|
||||||
(defn next-id []
|
(defn next-id []
|
||||||
(str (java.util.UUID/randomUUID)))
|
(str (java.util.UUID/randomUUID)))
|
||||||
|
|
||||||
|
(defn transit-json-read [^String s]
|
||||||
|
(with-open [bais (java.io.ByteArrayInputStream. (.getBytes s "UTF-8"))]
|
||||||
|
(let [r (transit/reader bais :json)]
|
||||||
|
(transit/read r))))
|
||||||
|
|
||||||
|
(defn transit-json-write [^String s]
|
||||||
|
(with-open [baos (java.io.ByteArrayOutputStream. 4096)]
|
||||||
|
(let [w (transit/writer baos :json)]
|
||||||
|
(transit/write w s)
|
||||||
|
(str baos))))
|
||||||
|
|
||||||
(defn invoke [pod pod-var args opts]
|
(defn invoke [pod pod-var args opts]
|
||||||
(let [handlers (:handlers opts)
|
(let [handlers (:handlers opts)
|
||||||
stream (:stdin pod)
|
stream (:stdin pod)
|
||||||
|
|
@ -44,7 +56,8 @@
|
||||||
chans (:chans pod)
|
chans (:chans pod)
|
||||||
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)
|
||||||
id (next-id)
|
id (next-id)
|
||||||
chan (if handlers handlers
|
chan (if handlers handlers
|
||||||
(promise))
|
(promise))
|
||||||
|
|
@ -95,6 +108,13 @@
|
||||||
(catch Exception e
|
(catch Exception e
|
||||||
(binding [*out* *err*]
|
(binding [*out* *err*]
|
||||||
(println "Cannot read JSON: " (pr-str s))
|
(println "Cannot read JSON: " (pr-str s))
|
||||||
|
(throw e)))))
|
||||||
|
:transit+json
|
||||||
|
(fn [s]
|
||||||
|
(try (transit-json-read s)
|
||||||
|
(catch Exception e
|
||||||
|
(binding [*out* *err*]
|
||||||
|
(println "Cannot read Transit JSON: " (pr-str s))
|
||||||
(throw e))))))]
|
(throw e))))))]
|
||||||
(try
|
(try
|
||||||
(loop []
|
(loop []
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,8 @@
|
||||||
(:require [bencode.core :as bencode]
|
(:require [bencode.core :as bencode]
|
||||||
[cheshire.core :as cheshire]
|
[cheshire.core :as cheshire]
|
||||||
[clojure.edn :as edn]
|
[clojure.edn :as edn]
|
||||||
[clojure.java.io :as io])
|
[clojure.java.io :as io]
|
||||||
|
[cognitect.transit :as transit])
|
||||||
(:import [java.io PushbackInputStream]
|
(:import [java.io PushbackInputStream]
|
||||||
[java.net ServerSocket])
|
[java.net ServerSocket])
|
||||||
(:gen-class))
|
(:gen-class))
|
||||||
|
|
@ -33,16 +34,29 @@
|
||||||
(format "(def x%s (inc x%s))" i (dec i))
|
(format "(def x%s (inc x%s))" i (dec i))
|
||||||
"(def x0 0)")}))
|
"(def x0 0)")}))
|
||||||
|
|
||||||
|
(defn transit-json-read [^String s]
|
||||||
|
(with-open [bais (java.io.ByteArrayInputStream. (.getBytes s "UTF-8"))]
|
||||||
|
(let [r (transit/reader bais :json)]
|
||||||
|
(transit/read r))))
|
||||||
|
|
||||||
|
(defn transit-json-write [^String s]
|
||||||
|
(with-open [baos (java.io.ByteArrayOutputStream. 4096)]
|
||||||
|
(let [w (transit/writer baos :json)]
|
||||||
|
(transit/write w s)
|
||||||
|
(str baos))))
|
||||||
|
|
||||||
(defn run-pod [cli-args]
|
(defn run-pod [cli-args]
|
||||||
(let [format (if (contains? cli-args "--json")
|
(let [format (cond (contains? cli-args "--json") :json
|
||||||
:json
|
(contains? cli-args "--transit+json") :transit+json
|
||||||
:edn)
|
:else :edn)
|
||||||
write-fn (if (identical? :json format)
|
write-fn (case format
|
||||||
cheshire/generate-string
|
:edn pr-str
|
||||||
pr-str)
|
:json cheshire/generate-string
|
||||||
read-fn (if (identical? :json format)
|
:transit+json transit-json-write)
|
||||||
#(cheshire/parse-string % true)
|
read-fn (case format
|
||||||
edn/read-string)
|
:edn edn/read-string
|
||||||
|
:json #(cheshire/parse-string % true)
|
||||||
|
:transit+json transit-json-read)
|
||||||
socket (= "true" (System/getenv "BABASHKA_POD_SOCKET"))
|
socket (= "true" (System/getenv "BABASHKA_POD_SOCKET"))
|
||||||
[in out] (if socket
|
[in out] (if socket
|
||||||
(let [server (ServerSocket. 0)
|
(let [server (ServerSocket. 0)
|
||||||
|
|
@ -70,9 +84,10 @@
|
||||||
op (keyword op)]
|
op (keyword op)]
|
||||||
(case op
|
(case op
|
||||||
:describe
|
:describe
|
||||||
(do (write out {"format" (if (= format :json)
|
(do (write out {"format" (case format
|
||||||
"json"
|
:edn "edn"
|
||||||
"edn")
|
:json "json"
|
||||||
|
:transit+json "transit+json")
|
||||||
"readers" {"my/tag" "identity"
|
"readers" {"my/tag" "identity"
|
||||||
;; NOTE: this function is defined later,
|
;; NOTE: this function is defined later,
|
||||||
;; which should be supported
|
;; which should be supported
|
||||||
|
|
@ -209,5 +224,7 @@
|
||||||
(prn e))))))
|
(prn e))))))
|
||||||
|
|
||||||
(defn -main [& args]
|
(defn -main [& args]
|
||||||
|
#_(binding [*out* *err*]
|
||||||
|
(prn :args args))
|
||||||
(when (= "true" (System/getenv "BABASHKA_POD"))
|
(when (= "true" (System/getenv "BABASHKA_POD"))
|
||||||
(run-pod (set args))))
|
(run-pod (set args))))
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,8 @@
|
||||||
(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 pod-id (:pod/id (pods/load-pod (cond-> ["clojure" "-A:test-pod"]
|
||||||
(= "json" fmt) (conj "--json"))
|
(= "json" fmt) (conj "--json")
|
||||||
|
(= "transit+json" fmt) (conj "--transit+json"))
|
||||||
{:socket (boolean socket)})))
|
{:socket (boolean socket)})))
|
||||||
|
|
||||||
(require '[pod.test-pod :as pod])
|
(require '[pod.test-pod :as pod])
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue