Skip to content

Commit 985da5d

Browse files
committed
[skip ci]
backport muuntaja json parse
1 parent 6f98c87 commit 985da5d

14 files changed

+1569
-492
lines changed
File renamed without changes.

Diff for: project.clj

+40-31
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,70 @@
1-
(defproject metosin/compojure-api "1.1.15-SNAPSHOT"
1+
(defproject metosin/compojure-api "2.0.0-alpha34-SNAPSHOT"
22
:description "Compojure Api"
33
:url "https://github.com/metosin/compojure-api"
44
:license {:name "Eclipse Public License"
55
:url "http://www.eclipse.org/legal/epl-v10.html"
66
:distribution :repo
77
:comments "same as Clojure"}
8-
:scm {:name "git"
9-
:url "https://github.com/metosin/compojure-api"}
10-
:dependencies [[prismatic/plumbing "0.6.0"]
11-
[cheshire "5.13.0"]
12-
[compojure "1.6.1"]
13-
[prismatic/schema "1.1.12"]
14-
[org.tobereplaced/lettercase "1.0.0"]
15-
[frankiesardo/linked "1.3.0"]
16-
[ring-middleware-format "0.7.4"]
8+
:dependencies [[prismatic/schema "1.1.12"]
9+
[prismatic/plumbing "0.5.5"]
10+
[ikitommi/linked "1.3.1-alpha1"] ;; waiting for the original
11+
[metosin/muuntaja "0.6.6"]
12+
[com.fasterxml.jackson.datatype/jackson-datatype-joda "2.10.1"]
13+
[ring/ring-core "1.8.0"]
14+
[compojure "1.6.1" ]
15+
[metosin/spec-tools "0.10.6"]
1716
[metosin/ring-http-response "0.9.1"]
17+
[metosin/ring-swagger-ui "3.24.3"]
1818
[metosin/ring-swagger "1.0.0"]
19-
[metosin/ring-swagger-ui "2.2.10"]]
19+
20+
;; Fix dependency conflicts
21+
[clj-time "0.15.2"]
22+
[joda-time "2.10.5"]
23+
[riddley "0.2.0"]]
24+
:pedantic? :abort
2025
:profiles {:uberjar {:aot :all
2126
:ring {:handler examples.thingie/app}
2227
:source-paths ["examples/thingie/src"]
2328
:dependencies [[org.clojure/clojure "1.9.0"]
2429
[http-kit "2.3.0"]
2530
[reloaded.repl "0.2.4"]
2631
[com.stuartsierra/component "0.4.0"]]}
27-
:dev {:jvm-opts ["-Dcompojure.api.core.allow-dangerous-middleware=true"]
28-
:repl-options {:init-ns user}
29-
:plugins [[lein-clojars "0.9.1"]
30-
[lein-midje "3.2.1"]
31-
[lein-ring "0.12.0"]
32+
:dev {:plugins [[lein-clojars "0.9.1"]
33+
[lein-ring "0.12.5"]
3234
[funcool/codeina "0.5.0"]]
3335
:dependencies [[org.clojure/clojure "1.9.0"]
34-
;; bump
35-
[fipp "0.6.26"]
36-
[metosin/spec-tools "0.10.6"]
37-
[metosin/muuntaja "0.6.6"]
38-
[metosin/jsonista "0.2.5"]
39-
[com.fasterxml.jackson.datatype/jackson-datatype-joda "2.10.1"]
40-
[slingshot "0.12.2"]
41-
[peridot "0.5.1"]
42-
[javax.servlet/servlet-api "2.5"]
43-
[midje "1.9.9"]
36+
[org.clojure/core.unify "0.6.0"]
37+
[org.clojure/core.async "0.6.532"]
38+
[javax.servlet/javax.servlet-api "4.0.1"]
39+
[peridot "0.5.2"]
4440
[com.stuartsierra/component "0.4.0"]
41+
[expound "0.8.2"]
42+
[metosin/jsonista "0.2.5"]
4543
[reloaded.repl "0.2.4"]
44+
[metosin/muuntaja-msgpack "0.6.6"]
45+
[metosin/muuntaja-yaml "0.6.6"]
46+
[org.immutant/immutant "2.1.10"]
4647
[http-kit "2.3.0"]
4748
[criterium "0.4.5"]]
49+
:jvm-opts ["-Dcompojure.api.meta.static-context-coach={:default :assert :verbose true}"]
50+
:test-paths ["test19"]
4851
:ring {:handler examples.thingie/app
4952
:reload-paths ["src" "examples/thingie/src"]}
5053
:source-paths ["examples/thingie/src" "examples/thingie/dev-src"]
5154
:main examples.server}
5255
:perf {:jvm-opts ^:replace ["-server"
5356
"-Xmx4096m"
5457
"-Dclojure.compiler.direct-linking=true"]}
55-
:logging {:dependencies [[org.clojure/tools.logging "0.5.0"]]}
58+
:logging {:dependencies [[org.clojure/tools.logging "0.5.0"]
59+
[org.slf4j/jcl-over-slf4j "1.7.30"]
60+
[org.slf4j/jul-to-slf4j "1.7.30"]
61+
[org.slf4j/log4j-over-slf4j "1.7.30"]
62+
[ch.qos.logback/logback-classic "1.2.3" ]]}
5663
:1.10 {:dependencies [[org.clojure/clojure "1.10.1"]]}
5764
:1.11 {:dependencies [[org.clojure/clojure "1.11.3"]]}
58-
:1.12 {:dependencies [[org.clojure/clojure "1.12.0-alpha11"]]}}
65+
:1.12 {:dependencies [[org.clojure/clojure "1.12.0-alpha11"]]}
66+
:async {:jvm-opts ["-Dcompojure-api.test.async=true"]
67+
:dependencies [[manifold "0.1.8" :exclusions [org.clojure/tools.logging]]]}}
5968
:eastwood {:namespaces [:source-paths]
6069
:add-linters [:unused-namespaces]}
6170
:codeina {:sources ["src"]
@@ -79,10 +88,10 @@
7988
["change" "version" "leiningen.release/bump-version"]
8089
["vcs" "commit"]
8190
["vcs" "push"]]
82-
:aliases {"all" ["with-profile" "dev:dev,logging:dev,1.10:dev,1.11:dev,1.12"]
91+
:aliases {"all" ["with-profile" "dev:dev,async:dev,1.10:dev,1.11:dev,1.12"]
8392
"start-thingie" ["run"]
8493
"aot-uberjar" ["with-profile" "uberjar" "do" "clean," "ring" "uberjar"]
85-
"test-ancient" ["midje"]
94+
"test-ancient" ["test"]
8695
"perf" ["with-profile" "default,dev,perf"]
8796
"deploy!" ^{:doc "Recompile sources, then deploy if tests succeed."}
88-
["do" ["clean"] ["midje"] ["deploy" "clojars"]]})
97+
["do" ["clean"] ["test"] ["deploy" "clojars"]]})

Diff for: src/compojure/api/api.clj

+42-17
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
(ns compojure.api.api
22
(:require [compojure.api.core :as c]
33
[compojure.api.swagger :as swagger]
4-
[compojure.api.middleware :as middleware]
4+
[compojure.api.middleware :as mw]
5+
[compojure.api.request :as request]
56
[compojure.api.routes :as routes]
67
[compojure.api.common :as common]
7-
[compojure.api.coerce :as coerce]
8+
[compojure.api.request :as request]
89
[ring.swagger.common :as rsc]
910
[ring.swagger.middleware :as rsm]))
1011

1112
(def api-defaults
1213
(merge
13-
middleware/api-middleware-defaults
14+
mw/api-middleware-defaults
1415
{:api {:invalid-routes-fn routes/log-invalid-child-routes
1516
:disable-api-middleware? false}
1617
:swagger {:ui nil, :spec nil}}))
@@ -23,8 +24,7 @@
2324
options map as the first parameter:
2425
2526
(api
26-
{:formats [:json-kw :edn :transit-msgpack :transit-json]
27-
:exceptions {:handlers {:compojure.api.exception/default my-logging-handler}}
27+
{:exceptions {:handlers {:compojure.api.exception/default my-logging-handler}}
2828
:api {:invalid-routes-fn (constantly nil)}
2929
:swagger {:spec \"/swagger.json\"
3030
:ui \"/api-docs\"
@@ -47,30 +47,55 @@
4747
4848
### api-middleware options
4949
50+
See `compojure.api.middleware/api-middleware` for more available options.
51+
5052
" (:doc (meta #'compojure.api.middleware/api-middleware)))}
5153
api
5254
[& body]
5355
(let [[options handlers] (common/extract-parameters body false)
56+
_ (assert (not (contains? options :format))
57+
(str "ERROR: Option [:format] is not used with 2.* version.\n"
58+
"Compojure-api uses now Muuntaja insted of ring-middleware-format,\n"
59+
"the new formatting options for it should be under [:formats]. See\n"
60+
"[[api-middleware]] documentation for more details.\n"))
61+
_ (when (and (not (:formatter options))
62+
(not (contains? options :formats))
63+
(not (System/getProperty "compojure.api.middleware.global-default-formatter")))
64+
(throw (ex-info (str "ERROR: Please set `:formatter :muuntaja` in the options map of `api`.\n"
65+
"e.g., (api {:formatter :muuntaja} routes...)\n"
66+
"To prepare for backwards compatibility with compojure-api 1.x, the formatting library must be\n"
67+
"explicitly chosen if not configured by `:format` (ring-middleware-format) or \n"
68+
"`:formats` (muuntaja). Once 2.x is stable, the default will be `:formatter :ring-middleware-format`.\n"
69+
"To globally override the formatter, use -Dcompojure.api.middleware.global-default-formatter=:muuntaja")
70+
{})))
5471
options (rsc/deep-merge api-defaults options)
5572
handler (apply c/routes (concat [(swagger/swagger-routes (:swagger options))] handlers))
56-
routes (routes/get-routes handler (:api options))
73+
partial-api-route (routes/map->Route
74+
{:childs [handler]
75+
:info {:coercion (:coercion options)}})
76+
routes (routes/get-routes partial-api-route (:api options))
5777
paths (-> routes routes/ring-swagger-paths swagger/transform-operations)
5878
lookup (routes/route-lookup-table routes)
5979
swagger-data (get-in options [:swagger :data])
6080
enable-api-middleware? (not (get-in options [:api :disable-api-middleware?]))
61-
api-handler (cond-> handler
62-
swagger-data (rsm/wrap-swagger-data swagger-data)
63-
enable-api-middleware? (middleware/api-middleware
64-
(dissoc options :api :swagger))
65-
true (middleware/wrap-options
66-
{:paths paths
67-
:coercer (coerce/memoized-coercer)
68-
:lookup lookup}))]
69-
(routes/create nil nil {} [handler] api-handler)))
81+
api-middleware-options (dissoc (mw/api-middleware-options (assoc (dissoc options :api :swagger) ::via-api true))
82+
::mw/api-middleware-defaults)
83+
api-handler (-> handler
84+
(cond-> swagger-data (rsm/wrap-swagger-data swagger-data))
85+
(cond-> enable-api-middleware? (mw/api-middleware
86+
api-middleware-options))
87+
(mw/wrap-inject-data
88+
{::request/paths paths
89+
::request/lookup lookup}))]
90+
(assoc partial-api-route :handler api-handler)))
7091

7192
(defmacro
72-
^{:doc (str
73-
"Defines an api.
93+
^{:superseded-by "api"
94+
:deprecated "2.0.0"
95+
:doc (str
96+
"Deprecated: please use (def name (api ...body..))
97+
98+
Defines an api.
7499
75100
API middleware options:
76101

Diff for: src/compojure/api/coerce.clj

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
;; 1.1.x
12
(ns compojure.api.coerce
23
(:require [schema.coerce :as sc]
34
[compojure.api.middleware :as mw]

Diff for: src/compojure/api/core.clj

+25-18
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
11
(ns compojure.api.core
22
(:require [compojure.api.meta :as meta]
3+
[compojure.api.async]
34
[compojure.api.routes :as routes]
45
[compojure.api.middleware :as mw]
56
[compojure.core :as compojure]
67
[clojure.tools.macro :as macro]))
78

8-
(defn- handle [handlers request]
9-
(some #(% request) handlers))
9+
(defn ring-handler
10+
"Creates vanilla ring-handler from any invokable thing (e.g. compojure-api route)"
11+
[handler]
12+
(fn
13+
([request] (handler request))
14+
([request respond raise] (handler request respond raise))))
1015

1116
(defn routes
1217
"Create a Ring handler by combining several handlers into one."
1318
[& handlers]
14-
(let [handlers (seq (keep identity handlers))]
15-
(routes/create nil nil {} (vec handlers) (partial handle handlers))))
19+
(let [handlers (seq (keep identity (flatten handlers)))]
20+
(routes/map->Route
21+
{:childs (vec handlers)
22+
:handler (meta/routing handlers)})))
1623

1724
(defmacro defroutes
1825
"Define a Ring handler function from a sequence of routes.
@@ -35,7 +42,7 @@
3542
not satisfying compojure.api.routes/Routing -protocol."
3643
[& handlers]
3744
(let [handlers (keep identity handlers)]
38-
(routes/create nil nil {} nil (partial handle handlers))))
45+
(routes/map->Route {:handler (meta/routing handlers)})))
3946

4047
(defmacro middleware
4148
"Wraps routes with given middlewares using thread-first macro.
@@ -47,16 +54,16 @@
4754
:deprecated "1.1.14"
4855
:superseded-by "route-middleware"}
4956
[middleware & body]
50-
(when (not= "true" (System/getProperty "compojure.api.core.suppress-middleware-warning"))
51-
(println (str "compojure.api.core.middleware is deprecated because of security issues. "
52-
"Please use route-middleware instead. middleware will be disabled in a future release."
53-
"Set -dcompojure.api.core.suppress-middleware-warning=true to suppress this warning.")))
57+
(assert (= "true" (System/getProperty "compojure.api.core.allow-dangerous-middleware"))
58+
(str "compojure.api.core.middleware is deprecated because of security issues. "
59+
"Please use route-middleware instead. "
60+
"Set compojure.api.core.allow-dangerous-middleware=true to keep using middleware."))
5461
`(let [body# (routes ~@body)
5562
wrap-mw# (mw/compose-middleware ~middleware)]
5663
(routes/create nil nil {} [body#] (wrap-mw# body#))))
5764

5865
(defn route-middleware
59-
"Wraps routes with given middleware using thread-first macro."
66+
"Wraps routes with given middlewares using thread-first macro."
6067
{:style/indent 1
6168
:supercedes "middleware"}
6269
[middleware & body]
@@ -67,13 +74,13 @@
6774
{:childs [handler]
6875
:handler x-handler})))
6976

70-
(defmacro context {:style/indent 2} [& args] (meta/restructure nil args {:context? true}))
77+
(defmacro context {:style/indent 2} [& args] (meta/restructure nil args {:context? true :&form &form :&env &env}))
7178

72-
(defmacro GET {:style/indent 2} [& args] (meta/restructure :get args nil))
73-
(defmacro ANY {:style/indent 2} [& args] (meta/restructure nil args nil))
74-
(defmacro HEAD {:style/indent 2} [& args] (meta/restructure :head args nil))
75-
(defmacro PATCH {:style/indent 2} [& args] (meta/restructure :patch args nil))
76-
(defmacro DELETE {:style/indent 2} [& args] (meta/restructure :delete args nil))
79+
(defmacro GET {:style/indent 2} [& args] (meta/restructure :get args nil))
80+
(defmacro ANY {:style/indent 2} [& args] (meta/restructure nil args nil))
81+
(defmacro HEAD {:style/indent 2} [& args] (meta/restructure :head args nil))
82+
(defmacro PATCH {:style/indent 2} [& args] (meta/restructure :patch args nil))
83+
(defmacro DELETE {:style/indent 2} [& args] (meta/restructure :delete args nil))
7784
(defmacro OPTIONS {:style/indent 2} [& args] (meta/restructure :options args nil))
78-
(defmacro POST {:style/indent 2} [& args] (meta/restructure :post args nil))
79-
(defmacro PUT {:style/indent 2} [& args] (meta/restructure :put args nil))
85+
(defmacro POST {:style/indent 2} [& args] (meta/restructure :post args nil))
86+
(defmacro PUT {:style/indent 2} [& args] (meta/restructure :put args nil))

0 commit comments

Comments
 (0)