From 1f624b6d50c7d6ec73a2d9dcef061d32f05e3726 Mon Sep 17 00:00:00 2001 From: Peter Taoussanis Date: Wed, 8 May 2024 09:05:48 +0200 Subject: [PATCH] [mod] `pr-signal`: switch to single (opts) arity only For consistency with other utils and handlers --- examples.cljc | 7 ++++--- src/taoensso/telemere/utils.cljc | 30 ++++++++++++++++++------------ test/taoensso/telemere_tests.cljc | 25 ++++++++++++++----------- wiki/4-Handlers.md | 7 ++++--- 4 files changed, 40 insertions(+), 29 deletions(-) diff --git a/examples.cljc b/examples.cljc index d442496..da3a720 100644 --- a/examples.cljc +++ b/examples.cljc @@ -141,7 +141,7 @@ ;; Create console which writes signals as edn (def my-handler (t/handler:console - {:output-fn (t/pr-signal-fn :edn)})) + {:output-fn (t/pr-signal-fn {:pr-fn :edn})})) (my-handler my-signal) ; => ;; {:inst #inst "2024-04-11T10:54:57.202869Z", :msg_ "My message", :ns "examples", ...} @@ -152,8 +152,9 @@ (t/handler:console {:output-fn (t/pr-signal-fn - #?(:cljs :json - :clj jsonista.core/write-value-as-string))})) + {:pr-fn + #?(:cljs :json + :clj jsonista.core/write-value-as-string)})})) (my-handler my-signal) ; => ;; {"inst":"2024-04-11T10:54:57.202869Z","msg_":"My message","ns":"examples", ...} diff --git a/src/taoensso/telemere/utils.cljc b/src/taoensso/telemere/utils.cljc index fd6834a..555992b 100644 --- a/src/taoensso/telemere/utils.cljc +++ b/src/taoensso/telemere/utils.cljc @@ -582,26 +582,27 @@ - Returns a machine-readable (minified) signal string. Options: - `pr-fn` - ∈ #{ :edn :json (Cljs only)} + `:pr-fn` - ∈ #{ :edn (default) :json (Cljs only)} `:incl-thread?` - Include signal `:thread` info? (default false) `:incl-kvs?` - Include signal `:kvs` info? (default false) `:incl-newline?` - Include terminating system newline? (default true) Examples: - (pr-signal-fn :edn {}) - (pr-signal-fn :json {}) ; Cljs only + (pr-signal-fn {:pr-fn :edn ...}) ; Outputs edn + (pr-signal-fn {:pr-fn :json ...}) ; Outputs JSON (Cljs only) + + To output JSON for Clj, you must provide an appropriate `:pr-fn`. + `jsonista` is one good option, Ref. : - ;; To output JSON for Clj, you must provide an appropriate `pr-fn`. - ;; `jsonista` is a good option, Ref. : (require '[jsonista.core :as jsonista]) - (pr-signal-fn jsonista/write-value-as-string {}) + (pr-signal-fn {:pr-fn jsonista/write-value-as-string ...}) See also `format-signal-fn` for human-readable output." - ([pr-fn] (pr-signal-fn pr-fn nil)) - ([pr-fn - {:keys [incl-thread? incl-kvs? incl-newline?, prep-fn] + ([] (pr-signal-fn nil)) + ([{:keys [incl-thread? incl-kvs? incl-newline?, pr-fn prep-fn] :or {incl-newline? true + pr-fn :edn prep-fn (comp error-in-signal->maps minify-signal)}}] @@ -611,7 +612,12 @@ (or (case pr-fn :edn pr-edn - #?@(:cljs [:json pr-json]) + :json + #?(:cljs pr-json + :clj + (throw + (ex-info "`:json` pr-fn only supported in Cljs. To output JSON in Clj, please provide an appropriate unary fn instead (e.g. jsonista/write-value-as-string)." + {}))) (if (fn? pr-fn) (do pr-fn) @@ -634,8 +640,8 @@ (do output))))))) (comment - ((pr-signal-fn :edn) (tel/with-signal (tel/event! ::ev-id {:kvs {:k1 "v1"}}))) - ((pr-signal-fn (fn [_] "str")) (tel/with-signal (tel/event! ::ev-id {:kvs {:k1 "v1"}})))) + ((pr-signal-fn {:pr-fn :edn}) (tel/with-signal (tel/event! ::ev-id {:kvs {:k1 "v1"}}))) + ((pr-signal-fn {:pr-fn (fn [_] "str")}) (tel/with-signal (tel/event! ::ev-id {:kvs {:k1 "v1"}})))) (defn format-signal-fn "Experimental, subject to change. diff --git a/test/taoensso/telemere_tests.cljc b/test/taoensso/telemere_tests.cljc index 2748218..9ed4056 100644 --- a/test/taoensso/telemere_tests.cljc +++ b/test/taoensso/telemere_tests.cljc @@ -690,19 +690,22 @@ (let [sig (with-sig (tel/event! ::ev-id {:inst t0}))] [(testing ":edn" - (let [sig (update sig :inst enc/inst->udt) - sig* (enc/read-edn ((tel/pr-signal-fn :edn) sig))] - (is - (enc/submap? sig* - {:schema 1, :kind :event, :id ::ev-id, :level :info, - :ns "taoensso.telemere-tests" - :inst udt0 - :line pnat-int? - :column pnat-int?})))) + (let [sig (update sig :inst enc/inst->udt) + sig*1 (enc/read-edn ((tel/pr-signal-fn {:pr-fn :edn}) sig)) + sig*2 (enc/read-edn ((tel/pr-signal-fn) sig))] + + [(is (= sig*1 sig*2) "Default :pr-fn is :edn") + (is + (enc/submap? sig*1 + {:schema 1, :kind :event, :id ::ev-id, :level :info, + :ns "taoensso.telemere-tests" + :inst udt0 + :line pnat-int? + :column pnat-int?}))])) #?(:cljs (testing ":json" - (let [sig* (enc/read-json ((tel/pr-signal-fn :json) sig))] + (let [sig* (enc/read-json ((tel/pr-signal-fn {:pr-fn :json}) sig))] (is (enc/submap? sig* {"schema" 1, "kind" "event", "id" "taoensso.telemere-tests/ev-id", @@ -712,7 +715,7 @@ "column" pnat-int?}))))) (testing "user fn" - (is (= ((tel/pr-signal-fn (fn [_] "str")) sig) (str "str" utils/newline))))])) + (is (= ((tel/pr-signal-fn {:pr-fn (fn [_] "str")}) sig) (str "str" utils/newline))))])) (testing "format-signal-fn" (let [sig (with-sig (tel/event! ::ev-id {:inst t0}))] diff --git a/wiki/4-Handlers.md b/wiki/4-Handlers.md index 12c8c75..897d73a 100644 --- a/wiki/4-Handlers.md +++ b/wiki/4-Handlers.md @@ -76,7 +76,7 @@ To instead writes signals as edn: ;; Create console which writes edn (def my-handler (t/handler:console - {:output-fn (t/pr-signal-fn :edn)})) + {:output-fn (t/pr-signal-fn {:pr-fn :edn})})) (my-handler my-signal) ; => ;; {:inst #inst "2024-04-11T10:54:57.202869Z", :msg_ "My message", :ns "examples", ...} @@ -91,8 +91,9 @@ To instead writes signals as JSON: (t/handler:console {:output-fn (t/pr-signal-fn - #?(:cljs :json - :clj jsonista.core/write-value-as-string))})) + {:pr-fn + #?(:cljs :json + :clj jsonista.core/write-value-as-string)})})) ``` Note that when writing JSON with Clojure, you *must* provide an appropriate `pr-fn`. This lets you plug in the JSON serializer of your choice ([jsonista](https://github.com/metosin/jsonista) is my default recommendation).