diff --git a/modules/reitit-spec/src/reitit/coercion/spec.cljc b/modules/reitit-spec/src/reitit/coercion/spec.cljc index 72e9dc84..4f2a5c4e 100644 --- a/modules/reitit-spec/src/reitit/coercion/spec.cljc +++ b/modules/reitit-spec/src/reitit/coercion/spec.cljc @@ -2,27 +2,33 @@ (:require [clojure.spec.alpha :as s] [spec-tools.core :as st #?@(:cljs [:refer [Spec]])] [spec-tools.data-spec :as ds] - [spec-tools.conform :as conform] + [spec-tools.transform :as stt] [spec-tools.swagger.core :as swagger] [reitit.coercion :as coercion] [clojure.set :as set]) #?(:clj (:import (spec_tools.core Spec)))) -(def string-conforming - (st/type-conforming - (merge - conform/string-type-conforming - conform/strip-extra-keys-type-conforming))) +(def string-transformer + (st/type-transformer + {:name :string + :decoders (merge + stt/string-type-decoders + stt/strip-extra-keys-type-decoders) + :encoders stt/string-type-encoders + :default-encoder stt/any->any})) -(def json-conforming - (st/type-conforming - (merge - conform/json-type-conforming - conform/strip-extra-keys-type-conforming))) +(def json-transformer + (st/type-transformer + {:name :json + :decoders (merge + stt/json-type-decoders + stt/strip-extra-keys-type-decoders) + :encoders stt/json-type-encoders + :default-encoder stt/any->any})) -(def default-conforming - ::default) +(def just-validate-transformer + (st/type-transformer {})) (defprotocol IntoSpec (into-spec [this name])) @@ -58,12 +64,12 @@ (def default-options {:coerce-response? coerce-response? - :conforming {:body {:default default-conforming - :formats {"application/json" json-conforming}} - :string {:default string-conforming} - :response {:default default-conforming}}}) + :transformers {:body {:default just-validate-transformer + :formats {"application/json" json-transformer}} + :string {:default string-transformer} + :response {:default just-validate-transformer}}}) -(defn create [{:keys [conforming coerce-response?] :as opts}] +(defn create [{:keys [transformers coerce-response?] :as opts}] ^{:type ::coercion/coercion} (reify coercion/Coercion (-get-name [_] :spec) @@ -98,16 +104,16 @@ (update :problems (partial mapv #(update % :pred stringify-pred))))) (-request-coercer [this type spec] (let [spec (coercion/-compile-model this spec nil) - {:keys [formats default]} (conforming type)] + {:keys [formats default]} (transformers type)] (fn [value format] - (if-let [conforming (or (get formats format) default)] - (let [conformed (st/conform spec value conforming)] - (if (s/invalid? conformed) - (let [problems (st/explain-data spec value conforming)] + (if-let [transformer (or (get formats format) default)] + (let [transformed (st/conform spec value transformer)] + (if (s/invalid? transformed) + (let [problems (st/explain-data spec value transformer)] (coercion/map->CoercionError {:spec spec :problems (::s/problems problems)})) - (s/unform spec conformed))) + (s/unform spec transformed))) value)))) (-response-coercer [this spec] (if (coerce-response? spec) diff --git a/project.clj b/project.clj index 478410a3..01948ad4 100644 --- a/project.clj +++ b/project.clj @@ -18,8 +18,8 @@ [meta-merge "1.0.0"] [ring/ring-core "1.6.3"] - [metosin/spec-tools "0.6.2-SNAPSHOT"] - [metosin/schema-tools "0.10.2-SNAPSHOT"] + [metosin/spec-tools "0.7.0-SNAPSHOT"] + [metosin/schema-tools "0.10.2"] [metosin/ring-swagger-ui "2.2.10"] [metosin/jsonista "0.2.0"]] @@ -41,7 +41,7 @@ "modules/reitit-swagger/src"] :dependencies [[org.clojure/clojure "1.9.0"] - [org.clojure/clojurescript "1.9.946"] + [org.clojure/clojurescript "1.10.238"] ;; modules dependencies [metosin/reitit] @@ -58,7 +58,7 @@ [criterium "0.4.4"] [org.clojure/test.check "0.9.0"] [org.clojure/tools.namespace "0.2.11"] - [com.gfredericks/test.chuck "0.2.8"]]} + [com.gfredericks/test.chuck "0.2.9"]]} :perf {:jvm-opts ^:replace ["-server" "-Xmx4096m" "-Dclojure.compiler.direct-linking=true"] diff --git a/test/cljc/reitit/swagger_test.clj b/test/cljc/reitit/swagger_test.clj index 5921fb7b..d9eb412f 100644 --- a/test/cljc/reitit/swagger_test.clj +++ b/test/cljc/reitit/swagger_test.clj @@ -57,7 +57,8 @@ (let [spec (:body (app {:request-method :get :uri "/api/swagger.json"}))] - (is (= {:x-id ::math + (is (= {:x-id #{::math} + :swagger "2.0" :info {:title "my-api"} :paths {"/api/schema/plus" {:get {:parameters [{:description "" :format "int32"