From b210a98f8332c2cf89dcbd7630adc80a178a6266 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 3 Dec 2017 17:29:06 +0200 Subject: [PATCH] polish Coercion protocol * compile => compile-model * mae-open => open-model --- .../src/reitit/ring/coercion/protocol.cljc | 7 +++--- .../src/reitit/ring/coercion/schema.cljc | 7 +++--- .../src/reitit/ring/coercion/spec.cljc | 22 ++++++++----------- perf-test/clj/reitit/coercion_perf_test.clj | 4 ++-- 4 files changed, 17 insertions(+), 23 deletions(-) diff --git a/modules/reitit-ring/src/reitit/ring/coercion/protocol.cljc b/modules/reitit-ring/src/reitit/ring/coercion/protocol.cljc index eb8a961f..12838b55 100644 --- a/modules/reitit-ring/src/reitit/ring/coercion/protocol.cljc +++ b/modules/reitit-ring/src/reitit/ring/coercion/protocol.cljc @@ -1,12 +1,11 @@ -(ns reitit.ring.coercion.protocol - (:refer-clojure :exclude [compile])) +(ns reitit.ring.coercion.protocol) (defprotocol Coercion "Pluggable coercion protocol" (get-name [this] "Keyword name for the coercion") - (compile [this model name] "Compiles a coercion model") (get-apidocs [this model data] "???") - (make-open [this model] "Returns a new map model which doesn't fail on extra keys") + (compile-model [this model name] "Compiles a model") + (open-model [this model] "Returns a new model which allows extra keys in maps") (encode-error [this error] "Converts error in to a serializable format") (request-coercer [this type model] "Returns a `value format => value` request coercion function") (response-coercer [this model] "Returns a `value format => value` response coercion function")) diff --git a/modules/reitit-schema/src/reitit/ring/coercion/schema.cljc b/modules/reitit-schema/src/reitit/ring/coercion/schema.cljc index aebddea1..f514fc47 100644 --- a/modules/reitit-schema/src/reitit/ring/coercion/schema.cljc +++ b/modules/reitit-schema/src/reitit/ring/coercion/schema.cljc @@ -38,15 +38,14 @@ protocol/Coercion (get-name [_] name) - (compile [_ model _] - model) - (get-apidocs [_ _ {:keys [parameters responses] :as info}] (cond-> (dissoc info :parameters :responses) parameters (assoc ::swagger/parameters parameters) responses (assoc ::swagger/responses responses))) - (make-open [_ schema] (st/open-schema schema)) + (compile-model [_ model _] model) + + (open-model [_ schema] (st/open-schema schema)) (encode-error [_ error] (-> error diff --git a/modules/reitit-spec/src/reitit/ring/coercion/spec.cljc b/modules/reitit-spec/src/reitit/ring/coercion/spec.cljc index cd2aba4f..90dd3f2d 100644 --- a/modules/reitit-spec/src/reitit/ring/coercion/spec.cljc +++ b/modules/reitit-spec/src/reitit/ring/coercion/spec.cljc @@ -46,10 +46,6 @@ (into-spec [this _] (st/create-spec {:spec this}))) -;; TODO: proper name! -(def memoized-into-spec - (memoize #(into-spec %1 (gensym "spec")))) - (defn stringify-pred [pred] (str (if (seq? pred) (seq pred) pred))) @@ -61,33 +57,33 @@ protocol/Coercion (get-name [_] name) - (compile [_ model _] - (memoized-into-spec model)) - - (get-apidocs [_ _ {:keys [parameters responses] :as info}] + (get-apidocs [this _ {:keys [parameters responses] :as info}] (cond-> (dissoc info :parameters :responses) parameters (assoc ::swagger/parameters (into (empty parameters) (for [[k v] parameters] - [k memoized-into-spec]))) + [k (protocol/compile-model this v nil)]))) responses (assoc ::swagger/responses (into (empty responses) (for [[k response] responses] - [k (update response :schema memoized-into-spec)]))))) + [k (update response :schema #(protocol/compile-model this % nil))]))))) - (make-open [_ spec] spec) + (compile-model [_ model _] + (into-spec model (or name (gensym "spec")))) + + (open-model [_ spec] spec) (encode-error [_ error] (-> error (update :spec (comp str s/form)) (update :problems (partial mapv #(update % :pred stringify-pred))))) - (request-coercer [_ type spec] - (let [spec (memoized-into-spec spec) + (request-coercer [this type spec] + (let [spec (protocol/compile-model this spec nil) {:keys [formats default]} (conforming type)] (fn [value format] (if-let [conforming (or (get formats format) default)] diff --git a/perf-test/clj/reitit/coercion_perf_test.clj b/perf-test/clj/reitit/coercion_perf_test.clj index 2f6ee7ff..e664f1f0 100644 --- a/perf-test/clj/reitit/coercion_perf_test.clj +++ b/perf-test/clj/reitit/coercion_perf_test.clj @@ -87,9 +87,9 @@ (defrecord NoOpCoercion [] protocol/Coercion (get-name [_] :no-op) - (compile [_ model _] model) (get-apidocs [_ _ {:keys [parameters responses] :as info}]) - (make-open [_ spec] spec) + (compile-model [_ model _] model) + (open-model [_ spec] spec) (encode-error [_ error] error) (request-coercer [_ type spec] (fn [value format] value)) (response-coercer [this spec] (protocol/request-coercer this :response spec)))