From f48fdbf16401153162f41bfa7cb11ae172795ea3 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Mon, 18 Jul 2016 04:07:34 +0100 Subject: [PATCH 01/58] Update Ring dependency to 1.6.0-beta4 --- project.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.clj b/project.clj index aadad410..70713997 100644 --- a/project.clj +++ b/project.clj @@ -7,7 +7,7 @@ [org.clojure/tools.macro "0.1.5"] [clout "2.1.2"] [medley "0.8.2"] - [ring/ring-core "1.5.0"] + [ring/ring-core "1.6.0-beta4"] [ring/ring-codec "1.0.1"]] :plugins [[lein-codox "0.9.5"]] :codox From cdefce35d041d4eba509fe326d870764e161407b Mon Sep 17 00:00:00 2001 From: James Reeves Date: Mon, 18 Jul 2016 15:37:45 +0100 Subject: [PATCH 02/58] Refactor route matching into one middleware --- src/compojure/core.clj | 61 ++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/src/compojure/core.clj b/src/compojure/core.clj index 93fd7d1f..a5be72e5 100644 --- a/src/compojure/core.clj +++ b/src/compojure/core.clj @@ -12,22 +12,27 @@ [ring.util.codec :as codec] [medley.core :refer [map-vals]])) -(defn- method-matches? [method request] - (let [request-method (request :request-method) - form-method (or (get-in request [:form-params "_method"]) - (get-in request [:multipart-params "_method"]))] - (if (and form-method (= request-method :post)) - (.equalsIgnoreCase (name method) form-method) - (= method request-method)))) - -(defn- if-method [method handler] - (fn [request] - (cond - (or (nil? method) (method-matches? method request)) - (handler request) - (and (= :get method) (= :head (:request-method request))) - (if-let [response (handler request)] - (assoc response :body nil))))) +(defn- form-method [request] + (or (get-in request [:form-params "_method"]) + (get-in request [:multipart-params "_method"]))) + +(defn- method-matches? [request method] + (or (nil? method) + (let [request-method (:request-method request)] + (case request-method + :head + (or (= method :head) (= method :get)) + :post + (if-let [fm (form-method request)] + (.equalsIgnoreCase (name method) fm) + (= method :post)) + ;else + (= request-method method))))) + +(defn- head-response [response request method] + (if (and (= :get method) (= :head (:request-method request))) + (assoc response :body nil) + response)) (defn- decode-route-params [params] (map-vals codec/url-decode params)) @@ -39,10 +44,9 @@ (let [path (:compojure/path request)] (clout/route-matches route (cond-> request path (assoc :path-info path))))) -(defn- if-route [route handler] - (fn [request] - (if-let [params (route-matches route request)] - (handler (assoc-route-params request (decode-route-params params)))))) +(defn- route-request [request route] + (if-let [params (route-matches route request)] + (assoc-route-params request (decode-route-params params)))) (defn- literal? [x] (if (coll? x) @@ -125,16 +129,21 @@ (fn [request] (handler (assoc request :compojure/route route-info)))) +(defn- wrap-route-matches [handler method path] + (fn [request] + (if (method-matches? request method) + (if-let [request (route-request request path)] + (some-> (handler request) + (head-response request method)))))) + (defn make-route "Returns a function that will only call the handler if the method and path match the request." [method path handler] - (let [route-info [(or method :any) (str path)]] - (if-method method - (if-route path - (-> (fn [request] (response/render (handler request) request)) - (wrap-route-middleware) - (wrap-route-info route-info)))))) + (-> (fn [request] (response/render (handler request) request)) + (wrap-route-middleware) + (wrap-route-info [(or method :any) (str path)]) + (wrap-route-matches method path))) (defn compile-route "Compile a route in the form `(method path bindings & body)` into a function. From 5026fe99a571b831e7ef23243a426eff265e0334 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Mon, 18 Jul 2016 17:43:08 +0100 Subject: [PATCH 03/58] Add async support to routing macros --- src/compojure/core.clj | 47 +++++++++++++++++++++++++----------- test/compojure/core_test.clj | 21 ++++++++++++++++ 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/src/compojure/core.clj b/src/compojure/core.clj index a5be72e5..e4637b57 100644 --- a/src/compojure/core.clj +++ b/src/compojure/core.clj @@ -30,7 +30,7 @@ (= request-method method))))) (defn- head-response [response request method] - (if (and (= :get method) (= :head (:request-method request))) + (if (and response (= :get method) (= :head (:request-method request))) (assoc response :body nil) response)) @@ -120,27 +120,45 @@ `(let [~bindings ~request] ~@body))) (defn- wrap-route-middleware [handler] - (fn [request] - (if-let [mw (:route-middleware request)] - ((mw handler) request) - (handler request)))) + (fn + ([request] + (if-let [mw (:route-middleware request)] + ((mw handler) request) + (handler request))) + ([request respond raise] + (if-let [mw (:route-middleware request)] + ((mw handler) request respond raise) + (handler request respond raise))))) (defn- wrap-route-info [handler route-info] - (fn [request] - (handler (assoc request :compojure/route route-info)))) + (fn + ([request] + (handler (assoc request :compojure/route route-info))) + ([request respond raise] + (handler (assoc request :compojure/route route-info) respond raise)))) (defn- wrap-route-matches [handler method path] - (fn [request] - (if (method-matches? request method) - (if-let [request (route-request request path)] - (some-> (handler request) - (head-response request method)))))) + (fn + ([request] + (if (method-matches? request method) + (if-let [request (route-request request path)] + (-> (handler request) + (head-response request method))))) + ([request respond raise] + (if (method-matches? request method) + (if-let [request (route-request request path)] + (handler request #(respond (head-response % request method)) raise) + (respond nil)))))) (defn make-route "Returns a function that will only call the handler if the method and path match the request." [method path handler] - (-> (fn [request] (response/render (handler request) request)) + (-> (fn + ([request] + (response/render (handler request) request)) + ([request respond raise] + (respond (response/render (handler request) request)))) (wrap-route-middleware) (wrap-route-info [(or method :any) (str path)]) (wrap-route-matches method path))) @@ -150,7 +168,8 @@ Used to create custom route macros." [method path bindings body] `(make-route - ~method ~(prepare-route path) + ~method + ~(prepare-route path) (fn [request#] (let-request [~bindings request#] ~@body)))) diff --git a/test/compojure/core_test.clj b/test/compojure/core_test.clj index 8790532a..fd139671 100644 --- a/test/compojure/core_test.clj +++ b/test/compojure/core_test.clj @@ -300,3 +300,24 @@ (testing "ANY request has matched route information" (is (= (request :compojure/route) [:any "/foo/:id"]))))) + +(deftest route-async-test + (let [route (GET "/hello/:name" [name] (str "hello " name))] + (testing "matching request" + (let [request (mock/request :get "/hello/world") + response (promise) + exception (promise)] + (route request response exception) + (is (not (realized? exception))) + (is (= @response + {:status 200 + :headers {"Content-Type" "text/html; charset=utf-8"} + :body "hello world"})))) + + (testing "not-matching request" + (let [request (mock/request :get "/goodbye/world") + response (promise) + exception (promise)] + (route request response exception) + (is (not (realized? exception))) + (is (nil? @response)))))) From 0d9e74fc4f585a67b574bffd62d4f9bf9adf8e13 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Mon, 18 Jul 2016 18:17:30 +0100 Subject: [PATCH 04/58] Add async support to routes function --- src/compojure/core.clj | 12 +++++++- test/compojure/core_test.clj | 60 ++++++++++++++++++++++++------------ 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/src/compojure/core.clj b/src/compojure/core.clj index e4637b57..d469baec 100644 --- a/src/compojure/core.clj +++ b/src/compojure/core.clj @@ -181,7 +181,17 @@ (defn routes "Create a Ring handler by combining several handlers into one." [& handlers] - #(apply routing % handlers)) + (fn + ([request] + (apply routing request handlers)) + ([request respond raise] + (letfn [(f [handlers] + (if (seq handlers) + (let [handler (first handlers) + respond' #(if % (respond %) (f (rest handlers)))] + (handler request respond' raise)) + (respond nil)))] + (f handlers))))) (defmacro defroutes "Define a Ring handler function from a sequence of routes. The name may diff --git a/test/compojure/core_test.clj b/test/compojure/core_test.clj index fd139671..63d187ce 100644 --- a/test/compojure/core_test.clj +++ b/test/compojure/core_test.clj @@ -302,22 +302,44 @@ [:any "/foo/:id"]))))) (deftest route-async-test - (let [route (GET "/hello/:name" [name] (str "hello " name))] - (testing "matching request" - (let [request (mock/request :get "/hello/world") - response (promise) - exception (promise)] - (route request response exception) - (is (not (realized? exception))) - (is (= @response - {:status 200 - :headers {"Content-Type" "text/html; charset=utf-8"} - :body "hello world"})))) - - (testing "not-matching request" - (let [request (mock/request :get "/goodbye/world") - response (promise) - exception (promise)] - (route request response exception) - (is (not (realized? exception))) - (is (nil? @response)))))) + (testing "single route" + (let [route (GET "/hello/:name" [name] (str "hello " name))] + (testing "matching request" + (let [request (mock/request :get "/hello/world") + response (promise) + exception (promise)] + (route request response exception) + (is (not (realized? exception))) + (is (= @response + {:status 200 + :headers {"Content-Type" "text/html; charset=utf-8"} + :body "hello world"})))) + + (testing "not-matching request" + (let [request (mock/request :get "/goodbye/world") + response (promise) + exception (promise)] + (route request response exception) + (is (not (realized? exception))) + (is (nil? @response)))))) + + (testing "multiple routes" + (let [route (routes + (GET "/foo" [] "foo") + (GET "/bar" [] "bar") + (GET "/baz" [] "baz"))] + (testing "matching request" + (let [request (mock/request :get "/bar") + response (promise) + exception (promise)] + (route request response exception) + (is (not (realized? exception))) + (is (= (:body @response) "bar")))) + + (testing "not-matching request" + (let [request (mock/request :get "/quz") + response (promise) + exception (promise)] + (route request response exception) + (is (not (realized? exception))) + (is (nil? @response))))))) From f39ee2c9a0b6b29b223ed291c485bb6722820eb8 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 20 Jul 2016 00:55:44 +0100 Subject: [PATCH 05/58] Add async support to rfn macro --- src/compojure/core.clj | 18 +++++++++++------- test/compojure/core_test.clj | 15 ++++++++++++++- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/compojure/core.clj b/src/compojure/core.clj index d469baec..367db0bd 100644 --- a/src/compojure/core.clj +++ b/src/compojure/core.clj @@ -9,6 +9,7 @@ (:require [compojure.response :as response] [clojure.tools.macro :as macro] [clout.core :as clout] + [ring.middleware.head :refer [wrap-head]] [ring.util.codec :as codec] [medley.core :refer [map-vals]])) @@ -232,15 +233,18 @@ [path args & body] (compile-route nil path args body)) +(defn ^:no-doc make-rfn [handler] + (-> (fn + ([request] + (response/render (handler request) request)) + ([request respond raise] + (respond (response/render (handler request) request)))) + wrap-route-middleware + wrap-head)) + (defmacro rfn "Generate a route that matches any method and path." [args & body] - `(#'wrap-route-middleware - (fn [request#] - (let [result# (let-request [~args request#] ~@body) - response# (response/render result# request#)] - (if (and response# (= :head (:request-method request#))) - (assoc response# :body nil) - response#))))) + `(make-rfn (fn [request#] (let-request [~args request#] ~@body)))) (defn- remove-suffix [path suffix] (subs path 0 (- (count path) (count suffix)))) diff --git a/test/compojure/core_test.clj b/test/compojure/core_test.clj index 63d187ce..be643601 100644 --- a/test/compojure/core_test.clj +++ b/test/compojure/core_test.clj @@ -342,4 +342,17 @@ exception (promise)] (route request response exception) (is (not (realized? exception))) - (is (nil? @response))))))) + (is (nil? @response)))))) + + (testing "rfn" + (let [route (rfn [name] (str "hello " name)) + request (-> (mock/request :get "/") + (assoc :params {:name "world"})) + response (promise) + exception (promise)] + (route request response exception) + (is (not (realized? exception))) + (is (= @response + {:status 200 + :headers {"Content-Type" "text/html; charset=utf-8"} + :body "hello world"}))))) From b8fe7eb2034de5e0362c0165037b168f19fff822 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 20 Jul 2016 01:44:54 +0100 Subject: [PATCH 06/58] Add async support to context macro --- src/compojure/core.clj | 47 +++++++++++++++++++++++------------- test/compojure/core_test.clj | 22 ++++++++++++++++- 2 files changed, 51 insertions(+), 18 deletions(-) diff --git a/src/compojure/core.clj b/src/compojure/core.clj index 367db0bd..7182b161 100644 --- a/src/compojure/core.clj +++ b/src/compojure/core.clj @@ -249,21 +249,17 @@ (defn- remove-suffix [path suffix] (subs path 0 (- (count path) (count suffix)))) -(defn- if-context [route handler] - (if (#{":__path-info" "/:__path-info"} (:source route)) - handler - (fn [request] - (if-let [params (clout/route-matches route request)] - (let [uri (:uri request) - path (:path-info request uri) - context (or (:context request) "") - subpath (:__path-info params) - params (dissoc params :__path-info)] - (handler - (-> request - (assoc-route-params (decode-route-params params)) - (assoc :path-info (if (= subpath "") "/" subpath) - :context (remove-suffix uri subpath))))))))) +(defn- context-request [request route] + (if-let [params (clout/route-matches route request)] + (let [uri (:uri request) + path (:path-info request uri) + context (or (:context request) "") + subpath (:__path-info params) + params (dissoc params :__path-info)] + (-> request + (assoc-route-params (decode-route-params params)) + (assoc :path-info (if (= subpath "") "/" subpath) + :context (remove-suffix uri subpath)))))) (defn- context-route [route] (let [re-context {:__path-info #"|/.*"}] @@ -281,6 +277,23 @@ :else `(clout/route-compile (str ~route ":__path-info") ~re-context)))) +(defn ^:no-doc make-context [route make-handler] + (letfn [(handler + ([request] + ((make-handler request) request)) + ([request respond raise] + ((make-handler request) request respond raise)))] + (if (#{":__path-info" "/:__path-info"} (:source route)) + handler + (fn + ([request] + (if-let [request (context-request request route)] + (handler request))) + ([request respond raise] + (if-let [request (context-request request route)] + (handler request respond raise) + (respond nil))))))) + (defmacro context "Give all routes in the form a common path prefix and set of bindings. @@ -291,11 +304,11 @@ (GET \"/profile\" [] ...) (GET \"/settings\" [] ...))" [path args & routes] - `(#'if-context + `(make-context ~(context-route path) (fn [request#] (let-request [~args request#] - (routing request# ~@routes))))) + (routes ~@routes))))) (defmacro let-routes "Takes a vector of bindings and a body of routes. diff --git a/test/compojure/core_test.clj b/test/compojure/core_test.clj index be643601..c3e26f5e 100644 --- a/test/compojure/core_test.clj +++ b/test/compojure/core_test.clj @@ -355,4 +355,24 @@ (is (= @response {:status 200 :headers {"Content-Type" "text/html; charset=utf-8"} - :body "hello world"}))))) + :body "hello world"})))) + + (testing "context" + (let [route (context "/:name" [name] + (GET "/bar" [] (str name "bar")) + (GET "/baz" [] (str name "baz")))] + (testing "matching request" + (let [request (mock/request :get "/foo/baz") + response (promise) + exception (promise)] + (route request response exception) + (is (not (realized? exception))) + (is (= (:body @response) "foobaz")))) + + (testing "not-matching request" + (let [request (mock/request :get "/foo/quz") + response (promise) + exception (promise)] + (route request response exception) + (is (not (realized? exception))) + (is (nil? @response))))))) From 2936aad1639f071c96285e1ae484ff5e836ab078 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 20 Jul 2016 02:54:06 +0100 Subject: [PATCH 07/58] Add async support to wrap-routes --- src/compojure/core.clj | 28 +++++++++++++++++++++------- test/compojure/core_test.clj | 25 +++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/src/compojure/core.clj b/src/compojure/core.clj index 7182b161..f849c474 100644 --- a/src/compojure/core.clj +++ b/src/compojure/core.clj @@ -320,17 +320,31 @@ `(let ~bindings (routes ~@body))) (defn- pre-init [middleware] - (let [proxy (middleware (fn [req] ((:route-handler req) req)))] + (let [proxy (middleware + (fn + ([request] + ((:route-handler request) request)) + ([request respond raise] + ((:route-handler request) request respond raise))))] (fn [handler] - (fn [request] - (proxy (assoc request :route-handler handler)))))) + (let [prep-request #(assoc % :route-handler handler)] + (fn + ([request] + (proxy (prep-request request))) + ([request respond raise] + (proxy (prep-request request) respond raise))))))) (defn wrap-routes "Apply a middleware function to routes after they have been matched." ([handler middleware] - (let [middleware (pre-init middleware)] - (fn [request] - (let [mw (:route-middleware request identity)] - (handler (assoc request :route-middleware (comp middleware mw))))))) + (let [middleware (pre-init middleware) + prep-request (fn [request] + (let [mw (:route-middleware request identity)] + (assoc request :route-middleware (comp middleware mw))))] + (fn + ([request] + (handler (prep-request request))) + ([request respond raise] + (handler (prep-request request) respond raise))))) ([handler middleware & args] (wrap-routes handler #(apply middleware % args)))) diff --git a/test/compojure/core_test.clj b/test/compojure/core_test.clj index c3e26f5e..ef60de9a 100644 --- a/test/compojure/core_test.clj +++ b/test/compojure/core_test.clj @@ -375,4 +375,29 @@ exception (promise)] (route request response exception) (is (not (realized? exception))) + (is (nil? @response)))))) + + (testing "wrap-routes" + (let [route (wrap-routes + (GET "/foo" [] "foo") + (fn [handler] + (fn [request respond raise] + (handler request + #(respond (assoc % ::r (:compojure/route request))) + raise))))] + (testing "matching request" + (let [request (mock/request :get "/foo") + response (promise) + exception (promise)] + (route request response exception) + (is (not (realized? exception))) + (is (= (:body @response) "foo")) + (is (= (::r @response) [:get "/foo"])))) + + (testing "not-matching request" + (let [request (mock/request :get "/bar") + response (promise) + exception (promise)] + (route request response exception) + (is (not (realized? exception))) (is (nil? @response))))))) From 6046602e2b3912ee80407a4e1d141db4af4cf011 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 20 Jul 2016 13:38:52 +0100 Subject: [PATCH 08/58] Add async support to wrap-canonical-redirect --- src/compojure/middleware.clj | 26 +++++++++++++++++++------- test/compojure/middleware_test.clj | 24 +++++++++++++++++++++++- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/compojure/middleware.clj b/src/compojure/middleware.clj index adb5e142..bbb2cb52 100644 --- a/src/compojure/middleware.clj +++ b/src/compojure/middleware.clj @@ -10,8 +10,14 @@ (.substring uri 0 (dec (.length uri))) uri)) -(defn- redirect-to-canonical [request] - (resp/redirect (:compojure/path request) 301)) +(defn- redirect-to-canonical + ([request] + (resp/redirect (:compojure/path request) 301)) + ([request respond raise] + (respond (redirect-to-canonical request)))) + +(defn- assoc-path [request path] + (assoc request :compojure/path path)) (defn wrap-canonical-redirect "Middleware that permanently redirects any non-canonical route to its @@ -22,8 +28,14 @@ (wrap-canonical-redirect handler remove-trailing-slash)) ([handler make-canonical] (let [redirect-handler (wrap-routes handler (constantly redirect-to-canonical))] - (fn [{uri :uri :as request}] - (let [canonical-uri (make-canonical uri)] - (if (= uri canonical-uri) - (handler request) - (redirect-handler (assoc request :compojure/path canonical-uri)))))))) + (fn + ([{uri :uri :as request}] + (let [canonical-uri (make-canonical uri)] + (if (= uri canonical-uri) + (handler request) + (redirect-handler (assoc-path request canonical-uri))))) + ([{uri :uri :as request} respond raise] + (let [canonical-uri (make-canonical uri)] + (if (= uri canonical-uri) + (handler request respond raise) + (redirect-handler (assoc-path request canonical-uri) respond raise)))))))) diff --git a/test/compojure/middleware_test.clj b/test/compojure/middleware_test.clj index 0dcccb6c..7d8f188b 100644 --- a/test/compojure/middleware_test.clj +++ b/test/compojure/middleware_test.clj @@ -6,7 +6,7 @@ [ring.mock.request :as mock] [ring.util.response :as resp])) -(deftest test-canonical-redirect +(deftest canonical-redirect-test (let [handler (wrap-canonical-redirect (routes (GET "/foo" [] "foo") @@ -28,3 +28,25 @@ {:status 404 :headers {"Content-Type" "text/html; charset=utf-8"} :body "not found"})))) + +(deftest canonical-redirect-async-test + (let [handler (wrap-canonical-redirect (GET "/foo" [] "foo"))] + (testing "matching route" + (let [response (promise) + exception (promise)] + (handler (mock/request :get "/foo") response exception) + (is (not (realized? exception))) + (is (= @response + {:status 200 + :headers {"Content-Type" "text/html; charset=utf-8"} + :body "foo"})))) + + (testing "redirect" + (let [response (promise) + exception (promise)] + (handler (mock/request :get "/foo/") response exception) + (is (not (realized? exception))) + (is (= @response + {:status 301 + :headers {"Location" "/foo"} + :body ""})))))) From be472d80f988662d01375c331aa0a689e0206ddc Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 20 Jul 2016 14:30:34 +0100 Subject: [PATCH 09/58] Add Sendable protocol --- src/compojure/core.clj | 21 +++++++++++---------- src/compojure/response.clj | 26 ++++++++++++++++++++++++-- test/compojure/core_test.clj | 14 +++++++++++++- test/compojure/response_test.clj | 23 ++++++++++++++++++++++- 4 files changed, 70 insertions(+), 14 deletions(-) diff --git a/src/compojure/core.clj b/src/compojure/core.clj index f849c474..809c1b5d 100644 --- a/src/compojure/core.clj +++ b/src/compojure/core.clj @@ -151,15 +151,19 @@ (handler request #(respond (head-response % request method)) raise) (respond nil)))))) +(defn- wrap-response [handler] + (fn + ([request] + (response/render (handler request) request)) + ([request respond raise] + (response/send (handler request) request respond raise)))) + (defn make-route "Returns a function that will only call the handler if the method and path match the request." [method path handler] - (-> (fn - ([request] - (response/render (handler request) request)) - ([request respond raise] - (respond (response/render (handler request) request)))) + (-> handler + (wrap-response) (wrap-route-middleware) (wrap-route-info [(or method :any) (str path)]) (wrap-route-matches method path))) @@ -234,11 +238,8 @@ (compile-route nil path args body)) (defn ^:no-doc make-rfn [handler] - (-> (fn - ([request] - (response/render (handler request) request)) - ([request respond raise] - (respond (response/render (handler request) request)))) + (-> handler + wrap-response wrap-route-middleware wrap-head)) diff --git a/src/compojure/response.clj b/src/compojure/response.clj index 59ea90fc..aa9ec8b0 100644 --- a/src/compojure/response.clj +++ b/src/compojure/response.clj @@ -1,5 +1,6 @@ (ns compojure.response "A protocol for generating Ring response maps" + (:refer-clojure :exclude [send]) (:require [ring.util.mime-type :as mime] [ring.util.response :as response])) @@ -10,8 +11,21 @@ This protocol supports rendering strings, maps, functions, refs, files, seqs, input streams and URLs by default, and may be extended to cover many custom types." - (render [this request] - "Render the object into a form suitable for the given request map.")) + (render [x request] + "Render `x` into a form suitable for the given request map.")) + +(defprotocol Sendable + "A protocol that tells Compojure how to handle the return value of + asynchronous routes, should they require special attention." + (send* [x request respond raise])) + +(defn send + "Send `x` as a Ring response. Checks to see if `x` satisfies [[Sendable]], + and if not, falls back to [[Renderable]]." + [x request respond raise] + (if (satisfies? Sendable x) + (send* x request respond raise) + (respond (render x request)))) (defn- guess-content-type [response name] (if-let [mime-type (mime/ext-mime-type (str name))] @@ -49,3 +63,11 @@ (render [url _] (-> (response/url-response url) (guess-content-type url)))) + +(extend-protocol Sendable + clojure.lang.Fn + (send* [func request respond raise] + (func request #(send % request respond raise) raise)) + clojure.lang.MultiFn + (send* [func request respond raise] + (func request #(send % request respond raise) raise))) diff --git a/test/compojure/core_test.clj b/test/compojure/core_test.clj index ef60de9a..0e07c107 100644 --- a/test/compojure/core_test.clj +++ b/test/compojure/core_test.clj @@ -400,4 +400,16 @@ exception (promise)] (route request response exception) (is (not (realized? exception))) - (is (nil? @response))))))) + (is (nil? @response)))))) + + (testing "async response" + (let [route (GET "/" [] (fn [_ respond _] (respond "foobar"))) + request (mock/request :get "/") + response (promise) + exception (promise)] + (route request response exception) + (is (not (realized? exception))) + (is (= @response + {:status 200 + :headers {"Content-Type" "text/html; charset=utf-8"} + :body "foobar"}))))) diff --git a/test/compojure/response_test.clj b/test/compojure/response_test.clj index 99ac7fd8..68f14a0a 100644 --- a/test/compojure/response_test.clj +++ b/test/compojure/response_test.clj @@ -14,7 +14,7 @@ (defmethod handler-multi :default [request] expected-response) -(deftest response-test +(deftest render-test (testing "with nil" (is (nil? (response/render nil {})))) @@ -74,3 +74,24 @@ (is (thrown-with-msg? IllegalArgumentException #"No implementation of method: :render of protocol" (response/render [] {}))))) + +(deftest send-test + (testing "render fallback" + (let [response (promise) + exception (promise)] + (response/send "foo" {} response exception) + (is (not (realized? exception))) + (is (= @response + {:status 200 + :headers {"Content-Type" "text/html; charset=utf-8"} + :body "foo"})))) + + (testing "function return value" + (let [response (promise) + exception (promise)] + (response/send (fn [_ respond _] (respond "bar")) {} response exception) + (is (not (realized? exception))) + (is (= @response + {:status 200 + :headers {"Content-Type" "text/html; charset=utf-8"} + :body "bar"}))))) From 46cc0a88de67f984e8a3bdebd61fc17a2363f4c1 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Fri, 22 Jul 2016 22:43:17 +0100 Subject: [PATCH 10/58] Release 1.6.0-beta1 --- HISTORY.md | 5 +++++ project.clj | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 4cd9b05a..83be4427 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,3 +1,8 @@ +## 1.6.0-beta1 (2016-07-22) + +* Updated Ring dependency to 1.6.0-beta4 +* Added support for asynchronous handlers + ## 1.5.1 (2016-06-19) * Fixed coercions for functions that return false (see #150) diff --git a/project.clj b/project.clj index 70713997..49c6a748 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject compojure "1.5.1" +(defproject compojure "1.6.0-beta1" :description "A concise routing library for Ring" :url "https://github.com/weavejester/compojure" :license {:name "Eclipse Public License" From 39346e4a4d1613a8b3ce9245a845addefe8afeb6 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Sat, 3 Dec 2016 14:38:55 +0000 Subject: [PATCH 11/58] Fix missing respond when method not matched --- src/compojure/core.clj | 3 ++- test/compojure/core_test.clj | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/compojure/core.clj b/src/compojure/core.clj index 809c1b5d..75ab0b7f 100644 --- a/src/compojure/core.clj +++ b/src/compojure/core.clj @@ -149,7 +149,8 @@ (if (method-matches? request method) (if-let [request (route-request request path)] (handler request #(respond (head-response % request method)) raise) - (respond nil)))))) + (respond nil)) + (respond nil))))) (defn- wrap-response [handler] (fn diff --git a/test/compojure/core_test.clj b/test/compojure/core_test.clj index 0e07c107..caad17d0 100644 --- a/test/compojure/core_test.clj +++ b/test/compojure/core_test.clj @@ -336,12 +336,20 @@ (is (not (realized? exception))) (is (= (:body @response) "bar")))) - (testing "not-matching request" + (testing "not-matching URI" (let [request (mock/request :get "/quz") response (promise) exception (promise)] (route request response exception) (is (not (realized? exception))) + (is (nil? @response)))) + + (testing "not-matching method" + (let [request (mock/request :post "/bar") + response (promise) + exception (promise)] + (route request response exception) + (is (not (realized? exception))) (is (nil? @response)))))) (testing "rfn" From 966260b628a6f8ffa1dc2b952d4352f1dede57a6 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Sat, 3 Dec 2016 14:46:09 +0000 Subject: [PATCH 12/58] Add async arity to not-found route --- src/compojure/route.clj | 11 +++++++---- test/compojure/route_test.clj | 10 +++++++++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/compojure/route.clj b/src/compojure/route.clj index 23419496..526d59cb 100644 --- a/src/compojure/route.clj +++ b/src/compojure/route.clj @@ -56,7 +56,10 @@ supplied response body. The response body may be anything accepted by the [[response/render]] function." [body] - (fn [request] - (-> (response/render body request) - (status 404) - (cond-> (= (:request-method request) :head) (assoc :body nil))))) + (fn handler + ([request] + (-> (response/render body request) + (status 404) + (cond-> (= (:request-method request) :head) (assoc :body nil)))) + ([request respond raise] + (respond (handler request))))) diff --git a/test/compojure/route_test.clj b/test/compojure/route_test.clj index 67f31077..027156f1 100644 --- a/test/compojure/route_test.clj +++ b/test/compojure/route_test.clj @@ -12,7 +12,15 @@ (let [response ((route/not-found {:status 200 :body "bar"}) (mock/request :get "/"))] (is (= (:status response) 404)) - (is (= (:body response) "bar"))))) + (is (= (:body response) "bar")))) + (testing "async arity" + (let [handler (route/not-found "baz") + response (promise) + exception (promise)] + (handler (mock/request :get "/") response exception) + (is (not (realized? exception))) + (is (= (:status @response) 404)) + (is (= (:body @response) "baz"))))) (deftest resources-route (let [route (route/resources "/foo" {:root "test_files"}) From 9ade69060e74a2160981cb6c6eecc6772202673f Mon Sep 17 00:00:00 2001 From: James Reeves Date: Sat, 3 Dec 2016 14:49:15 +0000 Subject: [PATCH 13/58] Update Ring dependency to 1.6.0-beta6 --- project.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.clj b/project.clj index 49c6a748..1f6e074e 100644 --- a/project.clj +++ b/project.clj @@ -7,7 +7,7 @@ [org.clojure/tools.macro "0.1.5"] [clout "2.1.2"] [medley "0.8.2"] - [ring/ring-core "1.6.0-beta4"] + [ring/ring-core "1.6.0-beta6"] [ring/ring-codec "1.0.1"]] :plugins [[lein-codox "0.9.5"]] :codox From 97f131ca16ea4d48dcf742a5dffc67ededd032a8 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Sat, 3 Dec 2016 14:49:38 +0000 Subject: [PATCH 14/58] Update other dependencies --- project.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project.clj b/project.clj index 1f6e074e..79edf7b4 100644 --- a/project.clj +++ b/project.clj @@ -6,7 +6,7 @@ :dependencies [[org.clojure/clojure "1.7.0"] [org.clojure/tools.macro "0.1.5"] [clout "2.1.2"] - [medley "0.8.2"] + [medley "0.8.4"] [ring/ring-core "1.6.0-beta6"] [ring/ring-codec "1.0.1"]] :plugins [[lein-codox "0.9.5"]] @@ -19,6 +19,6 @@ :profiles {:dev {:jvm-opts ^:replace [] :dependencies [[ring/ring-mock "0.3.0"] - [criterium "0.4.3"] + [criterium "0.4.4"] [javax.servlet/servlet-api "2.5"]]} :1.8 {:dependencies [[org.clojure/clojure "1.8.0"]]}}) From d5fadbfc531ce7fc155b99a74dde1f1d67fc5404 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Sat, 3 Dec 2016 14:49:55 +0000 Subject: [PATCH 15/58] Release 1.6.0-beta2 --- HISTORY.md | 5 +++++ project.clj | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 83be4427..54157d43 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,3 +1,8 @@ +## 1.6.0-beta2 (2016-12-03) + +* Fixed bug when route called asynchronously with non-matching method +* Added asynchronous support to compojure.route/not-found + ## 1.6.0-beta1 (2016-07-22) * Updated Ring dependency to 1.6.0-beta4 diff --git a/project.clj b/project.clj index 79edf7b4..9fd63355 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject compojure "1.6.0-beta1" +(defproject compojure "1.6.0-beta2" :description "A concise routing library for Ring" :url "https://github.com/weavejester/compojure" :license {:name "Eclipse Public License" From a179bae528a33f8c89f9c9b7d37074a6b1dcceea Mon Sep 17 00:00:00 2001 From: James Reeves Date: Tue, 10 Jan 2017 23:05:09 +0000 Subject: [PATCH 16/58] Update Ring version to 1.6.0-beta7 Fixes path traversal vulnerability in route/resources. --- project.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.clj b/project.clj index 9fd63355..34c7abca 100644 --- a/project.clj +++ b/project.clj @@ -7,7 +7,7 @@ [org.clojure/tools.macro "0.1.5"] [clout "2.1.2"] [medley "0.8.4"] - [ring/ring-core "1.6.0-beta6"] + [ring/ring-core "1.6.0-beta7"] [ring/ring-codec "1.0.1"]] :plugins [[lein-codox "0.9.5"]] :codox From b4fd659d7f9dd4dcb2f5d44ab496ebf9a169bac3 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Tue, 10 Jan 2017 23:07:51 +0000 Subject: [PATCH 17/58] Release 1.6.0-beta3 --- HISTORY.md | 4 ++++ project.clj | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 98710ad8..6e8d6959 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,3 +1,7 @@ +## 1.6.0-beta3 (2017-01-10) + +* Updated Ring dependency to 1.6.0-beta7 to fix path traversal vulnerability + ## 1.6.0-beta2 (2016-12-03) * Fixed bug when route called asynchronously with non-matching method diff --git a/project.clj b/project.clj index 34c7abca..db0c7b65 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject compojure "1.6.0-beta2" +(defproject compojure "1.6.0-beta3" :description "A concise routing library for Ring" :url "https://github.com/weavejester/compojure" :license {:name "Eclipse Public License" From 0920456a659c317c8b2dae19038f4987a46e8d30 Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Mon, 30 Jan 2017 12:39:43 +0200 Subject: [PATCH 18/58] Fix middleware ordering for nested wrap-routes --- src/compojure/core.clj | 2 +- test/compojure/core_test.clj | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/compojure/core.clj b/src/compojure/core.clj index 75ab0b7f..b02d4499 100644 --- a/src/compojure/core.clj +++ b/src/compojure/core.clj @@ -342,7 +342,7 @@ (let [middleware (pre-init middleware) prep-request (fn [request] (let [mw (:route-middleware request identity)] - (assoc request :route-middleware (comp middleware mw))))] + (assoc request :route-middleware (comp mw middleware))))] (fn ([request] (handler (prep-request request))) diff --git a/test/compojure/core_test.clj b/test/compojure/core_test.clj index caad17d0..ee183db6 100644 --- a/test/compojure/core_test.clj +++ b/test/compojure/core_test.clj @@ -286,7 +286,21 @@ middleware (fn [h] (fn [r] (reset! matched (:compojure/route r)) (h r))) handler (wrap-routes route middleware) response (handler (mock/request :get "/foo"))] - (is (= @matched [:get "/foo"]))))) + (is (= @matched [:get "/foo"])))) + + (testing "nested route-middlewares are applied in order" + (let [mw (fn [handler value] + (fn [req] + (let [resp (handler (update req :stack str value))] + (update resp :body str value)))) + handler (wrap-routes + (routes + (wrap-routes (GET "/foo" req (:stack req)) mw "a") + (wrap-routes (GET "/bar" req (:stack req)) mw "b")) + mw + "1")] + (is (= "1aa1" (:body (handler (mock/request :get "/foo"))))) + (is (= "1bb1" (:body (handler (mock/request :get "/bar")))))))) (deftest route-information-test (let [route (GET "/foo/:id" req req) From 06be3e231f2d217a0ce9f0aa1a4d9c24e9d0745a Mon Sep 17 00:00:00 2001 From: Tianxiang Xiong Date: Fri, 28 Apr 2017 20:49:54 -0700 Subject: [PATCH 19/58] Change Renderable to extend IPersistentMap Fixes #159. --- src/compojure/response.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compojure/response.clj b/src/compojure/response.clj index aa9ec8b0..0c9bdb67 100644 --- a/src/compojure/response.clj +++ b/src/compojure/response.clj @@ -39,7 +39,7 @@ (render [body _] (-> (response/response body) (response/content-type "text/html; charset=utf-8"))) - clojure.lang.APersistentMap + clojure.lang.IPersistentMap (render [resp-map _] (merge (with-meta (response/response "") (meta resp-map)) resp-map)) From 189337c9ffe0557874cfdce470d8b744695264d4 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 3 May 2017 15:11:46 +0100 Subject: [PATCH 20/58] Rename HISTORY.md to CHANGELOG.md --- HISTORY.md => CHANGELOG.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename HISTORY.md => CHANGELOG.md (100%) diff --git a/HISTORY.md b/CHANGELOG.md similarity index 100% rename from HISTORY.md rename to CHANGELOG.md From 0ab4b43cc9148e4b590edf369eb52aef6eeb297f Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 3 May 2017 15:12:39 +0100 Subject: [PATCH 21/58] Update Medley to 1.0.0 --- project.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.clj b/project.clj index db0c7b65..d31357ed 100644 --- a/project.clj +++ b/project.clj @@ -6,7 +6,7 @@ :dependencies [[org.clojure/clojure "1.7.0"] [org.clojure/tools.macro "0.1.5"] [clout "2.1.2"] - [medley "0.8.4"] + [medley "1.0.0"] [ring/ring-core "1.6.0-beta7"] [ring/ring-codec "1.0.1"]] :plugins [[lein-codox "0.9.5"]] From 9e40f01159a37b6ceb78db093bb6c33090400ed1 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 3 May 2017 15:13:16 +0100 Subject: [PATCH 22/58] Update Ring to 1.6.0 --- project.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.clj b/project.clj index d31357ed..3364cc45 100644 --- a/project.clj +++ b/project.clj @@ -7,7 +7,7 @@ [org.clojure/tools.macro "0.1.5"] [clout "2.1.2"] [medley "1.0.0"] - [ring/ring-core "1.6.0-beta7"] + [ring/ring-core "1.6.0"] [ring/ring-codec "1.0.1"]] :plugins [[lein-codox "0.9.5"]] :codox From 282d57ef446f6370465313a1ace1307e18b49072 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 3 May 2017 15:13:38 +0100 Subject: [PATCH 23/58] Update Codox to 0.10.3 --- project.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.clj b/project.clj index 3364cc45..3d8037de 100644 --- a/project.clj +++ b/project.clj @@ -9,7 +9,7 @@ [medley "1.0.0"] [ring/ring-core "1.6.0"] [ring/ring-codec "1.0.1"]] - :plugins [[lein-codox "0.9.5"]] + :plugins [[lein-codox "0.10.3"]] :codox {:output-path "codox" :metadata {:doc/format :markdown} From 7f5dbffdd658b5ccd23e1d4a1bdb0b5e9bbb9d53 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 3 May 2017 15:14:31 +0100 Subject: [PATCH 24/58] Update copyright year in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 73de64d8..54e99e8c 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,6 @@ Also refer to the [Getting Started][2] page on the wiki. ## License -Copyright © 2016 James Reeves +Copyright © 2017 James Reeves Distributed under the Eclipse Public License, the same as Clojure. From 94512347d95a1641e674a759b00244dd61d78dd9 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 3 May 2017 15:21:14 +0100 Subject: [PATCH 25/58] Fix typo in CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e8d6959..578c52b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,7 @@ ## 1.5.1 (2016-06-19) * Fixed coercions for functions that return false (see #150) -* Fixed contexts with a route of "/" (seee #125) +* Fixed contexts with a route of "/" (see #125) * Updated Ring dependency to 1.5.0 * Updated Medley dependency to 0.8.2 From 7252206adb8b4df471ecf885336bcf32fcf8fd02 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 3 May 2017 15:26:01 +0100 Subject: [PATCH 26/58] Release 1.6.0 --- CHANGELOG.md | 7 ++++++- README.md | 2 +- project.clj | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 578c52b5..da22e28e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.6.0 (2017-05-03) + +* Update Ring dependency to 1.6.0 +* Fixed middleware ordering on `wrap-routes` (see #157) +* Fixed `Renderable` protocol to use `IPersistentMap` (see #167) + ## 1.6.0-beta3 (2017-01-10) * Updated Ring dependency to 1.6.0-beta7 to fix path traversal vulnerability @@ -40,7 +46,6 @@ * Updated Ring dependency to 1.4.0 ## 1.3.4 (2015-05-08) - * Updated Clout dependency to 2.1.2 to fix Clojure 1.7.0-beta2 issue (see clout#24) ## 1.3.3 (2015-01-01) diff --git a/README.md b/README.md index 54e99e8c..efb9b7d8 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ applications to be composed of small, independent parts. Add the following dependency to your `project.clj` file: - [compojure "1.5.2"] + [compojure "1.6.0"] ## Documentation diff --git a/project.clj b/project.clj index 3d8037de..54d5c07b 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject compojure "1.6.0-beta3" +(defproject compojure "1.6.0" :description "A concise routing library for Ring" :url "https://github.com/weavejester/compojure" :license {:name "Eclipse Public License" From f404fdeb6a3bade14bd44e0c4723348acbd9fa3f Mon Sep 17 00:00:00 2001 From: Joe Hayes Date: Sat, 27 Jan 2018 16:51:07 -0500 Subject: [PATCH 27/58] Update Ring to 1.6.3 --- project.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.clj b/project.clj index 54d5c07b..d0b702e1 100644 --- a/project.clj +++ b/project.clj @@ -7,7 +7,7 @@ [org.clojure/tools.macro "0.1.5"] [clout "2.1.2"] [medley "1.0.0"] - [ring/ring-core "1.6.0"] + [ring/ring-core "1.6.3"] [ring/ring-codec "1.0.1"]] :plugins [[lein-codox "0.10.3"]] :codox From 100a7887645c8ee087f159bb8aa98073257ab341 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Sun, 15 Apr 2018 02:33:50 +0100 Subject: [PATCH 28/58] Update dependencies --- project.clj | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/project.clj b/project.clj index d0b702e1..f6281170 100644 --- a/project.clj +++ b/project.clj @@ -5,20 +5,21 @@ :url "http://www.eclipse.org/legal/epl-v10.html"} :dependencies [[org.clojure/clojure "1.7.0"] [org.clojure/tools.macro "0.1.5"] - [clout "2.1.2"] + [clout "2.2.1"] [medley "1.0.0"] [ring/ring-core "1.6.3"] - [ring/ring-codec "1.0.1"]] + [ring/ring-codec "1.1.0"]] :plugins [[lein-codox "0.10.3"]] :codox {:output-path "codox" :metadata {:doc/format :markdown} :source-uri "http://github.com/weavejester/compojure/blob/{version}/{filepath}#L{line}"} :aliases - {"test-all" ["with-profile" "default:+1.8" "test"]} + {"test-all" ["with-profile" "default:+1.8:+1.9" "test"]} :profiles {:dev {:jvm-opts ^:replace [] - :dependencies [[ring/ring-mock "0.3.0"] + :dependencies [[ring/ring-mock "0.3.2"] [criterium "0.4.4"] [javax.servlet/servlet-api "2.5"]]} - :1.8 {:dependencies [[org.clojure/clojure "1.8.0"]]}}) + :1.8 {:dependencies [[org.clojure/clojure "1.8.0"]]} + :1.9 {:dependencies [[org.clojure/clojure "1.9.0"]]}}) From 72a0be964e5d7553a9c042e8298f260cd4e7279b Mon Sep 17 00:00:00 2001 From: James Reeves Date: Sun, 15 Apr 2018 02:43:13 +0100 Subject: [PATCH 29/58] Update copyright year in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index efb9b7d8..6d0d630a 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,6 @@ Also refer to the [Getting Started][2] page on the wiki. ## License -Copyright © 2017 James Reeves +Copyright © 2018 James Reeves Distributed under the Eclipse Public License, the same as Clojure. From 7c4de648ced94b659cd4d07792e1619cd99fc039 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Sun, 15 Apr 2018 02:43:56 +0100 Subject: [PATCH 30/58] Release 1.6.1 --- CHANGELOG.md | 6 ++++++ README.md | 2 +- project.clj | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index da22e28e..a6a7eb7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.6.1 (2018-04-15) + +* Updated Ring dependency to 1.6.3 +* Updated Ring-Codec dependency to 1.1.0 +* Updated Clout dependency to 2.2.1 + ## 1.6.0 (2017-05-03) * Update Ring dependency to 1.6.0 diff --git a/README.md b/README.md index 6d0d630a..5dbc36a3 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ applications to be composed of small, independent parts. Add the following dependency to your `project.clj` file: - [compojure "1.6.0"] + [compojure "1.6.1"] ## Documentation diff --git a/project.clj b/project.clj index f6281170..80caceac 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject compojure "1.6.0" +(defproject compojure "1.6.1" :description "A concise routing library for Ring" :url "https://github.com/weavejester/compojure" :license {:name "Eclipse Public License" From 7d43e119606e7f6c8fcb95d9eac261022d0c3424 Mon Sep 17 00:00:00 2001 From: Stefan van der Meer Date: Thu, 9 Aug 2018 12:10:02 +0200 Subject: [PATCH 31/58] Avoid exception when coercion in context fails Fixes #183. --- src/compojure/core.clj | 7 +++++-- test/compojure/core_test.clj | 30 +++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/compojure/core.clj b/src/compojure/core.clj index b02d4499..32b25de9 100644 --- a/src/compojure/core.clj +++ b/src/compojure/core.clj @@ -282,9 +282,12 @@ (defn ^:no-doc make-context [route make-handler] (letfn [(handler ([request] - ((make-handler request) request)) + (when-let [context-handler (make-handler request)] + (context-handler request))) ([request respond raise] - ((make-handler request) request respond raise)))] + (if-let [context-handler (make-handler request)] + (context-handler request respond raise) + (respond nil))))] (if (#{":__path-info" "/:__path-info"} (:source route)) handler (fn diff --git a/test/compojure/core_test.clj b/test/compojure/core_test.clj index ee183db6..f5430801 100644 --- a/test/compojure/core_test.clj +++ b/test/compojure/core_test.clj @@ -61,6 +61,16 @@ (is (nil? ((GET "/foo/:x" [x :<< coercions/as-int] (str x)) (mock/request :get "/foo/bar"))))) + (testing "nil coercions in contexts" + (is (not (nil? ((context "/foo/:x" [x] (GET "/" [] (str x))) + (mock/request :get "/foo/bar"))))) + (is (not (nil? ((context "/foo/:x" [x :<< coercions/as-int] (GET "/" [] (str x))) + (mock/request :get "/foo/100"))))) + (is (not (nil? ((context "/foo/:x" [x :<< #(Boolean/valueOf %)] (GET "/" [] (str x))) + (mock/request :get "/foo/false"))))) + (is (nil? ((context "/foo/:x" [x :<< coercions/as-int] (GET "/" [] (str x))) + (mock/request :get "/foo/bar"))))) + (testing "map arguments" ((GET "/foo" {params :params} (is (= params {:x "a", :y "b"})) @@ -397,7 +407,25 @@ exception (promise)] (route request response exception) (is (not (realized? exception))) - (is (nil? @response)))))) + (is (nil? @response))))) + + (testing "with coercion" + (let [route (context "/:id" [id :<< coercions/as-int] + (GET "/" [] (str id)))] + (testing "matching request" + (let [request (mock/request :get "/123") + response (promise) + exception (promise)] + (route request response exception) + (is (not (realized? exception))) + (is (= (:body @response) "123")))) + (testing "not-matching request" + (let [request (mock/request :get "/foo") + response (promise) + exception (promise)] + (route request response exception) + (is (not (realized? exception))) + (is (nil? @response))))))) (testing "wrap-routes" (let [route (wrap-routes From 484f58c37695639bccae09bbb902d109cbb4ab74 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 5 Jun 2019 21:10:02 +0100 Subject: [PATCH 32/58] Replace LICENSE.html with LICENSE.txt A text-based license file is easier for tools to parse. --- LICENSE.html | 261 --------------------------------------------------- LICENSE.txt | 204 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 204 insertions(+), 261 deletions(-) delete mode 100644 LICENSE.html create mode 100644 LICENSE.txt diff --git a/LICENSE.html b/LICENSE.html deleted file mode 100644 index 813c07d8..00000000 --- a/LICENSE.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - -Codestin Search App - - - - - - -

Eclipse Public License - v 1.0

- -

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE -PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR -DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS -AGREEMENT.

- -

1. DEFINITIONS

- -

"Contribution" means:

- -

a) in the case of the initial Contributor, the initial -code and documentation distributed under this Agreement, and

-

b) in the case of each subsequent Contributor:

-

i) changes to the Program, and

-

ii) additions to the Program;

-

where such changes and/or additions to the Program -originate from and are distributed by that particular Contributor. A -Contribution 'originates' from a Contributor if it was added to the -Program by such Contributor itself or anyone acting on such -Contributor's behalf. Contributions do not include additions to the -Program which: (i) are separate modules of software distributed in -conjunction with the Program under their own license agreement, and (ii) -are not derivative works of the Program.

- -

"Contributor" means any person or entity that distributes -the Program.

- -

"Licensed Patents" mean patent claims licensable by a -Contributor which are necessarily infringed by the use or sale of its -Contribution alone or when combined with the Program.

- -

"Program" means the Contributions distributed in accordance -with this Agreement.

- -

"Recipient" means anyone who receives the Program under -this Agreement, including all Contributors.

- -

2. GRANT OF RIGHTS

- -

a) Subject to the terms of this Agreement, each -Contributor hereby grants Recipient a non-exclusive, worldwide, -royalty-free copyright license to reproduce, prepare derivative works -of, publicly display, publicly perform, distribute and sublicense the -Contribution of such Contributor, if any, and such derivative works, in -source code and object code form.

- -

b) Subject to the terms of this Agreement, each -Contributor hereby grants Recipient a non-exclusive, worldwide, -royalty-free patent license under Licensed Patents to make, use, sell, -offer to sell, import and otherwise transfer the Contribution of such -Contributor, if any, in source code and object code form. This patent -license shall apply to the combination of the Contribution and the -Program if, at the time the Contribution is added by the Contributor, -such addition of the Contribution causes such combination to be covered -by the Licensed Patents. The patent license shall not apply to any other -combinations which include the Contribution. No hardware per se is -licensed hereunder.

- -

c) Recipient understands that although each Contributor -grants the licenses to its Contributions set forth herein, no assurances -are provided by any Contributor that the Program does not infringe the -patent or other intellectual property rights of any other entity. Each -Contributor disclaims any liability to Recipient for claims brought by -any other entity based on infringement of intellectual property rights -or otherwise. As a condition to exercising the rights and licenses -granted hereunder, each Recipient hereby assumes sole responsibility to -secure any other intellectual property rights needed, if any. For -example, if a third party patent license is required to allow Recipient -to distribute the Program, it is Recipient's responsibility to acquire -that license before distributing the Program.

- -

d) Each Contributor represents that to its knowledge it -has sufficient copyright rights in its Contribution, if any, to grant -the copyright license set forth in this Agreement.

- -

3. REQUIREMENTS

- -

A Contributor may choose to distribute the Program in object code -form under its own license agreement, provided that:

- -

a) it complies with the terms and conditions of this -Agreement; and

- -

b) its license agreement:

- -

i) effectively disclaims on behalf of all Contributors -all warranties and conditions, express and implied, including warranties -or conditions of title and non-infringement, and implied warranties or -conditions of merchantability and fitness for a particular purpose;

- -

ii) effectively excludes on behalf of all Contributors -all liability for damages, including direct, indirect, special, -incidental and consequential damages, such as lost profits;

- -

iii) states that any provisions which differ from this -Agreement are offered by that Contributor alone and not by any other -party; and

- -

iv) states that source code for the Program is available -from such Contributor, and informs licensees how to obtain it in a -reasonable manner on or through a medium customarily used for software -exchange.

- -

When the Program is made available in source code form:

- -

a) it must be made available under this Agreement; and

- -

b) a copy of this Agreement must be included with each -copy of the Program.

- -

Contributors may not remove or alter any copyright notices contained -within the Program.

- -

Each Contributor must identify itself as the originator of its -Contribution, if any, in a manner that reasonably allows subsequent -Recipients to identify the originator of the Contribution.

- -

4. COMMERCIAL DISTRIBUTION

- -

Commercial distributors of software may accept certain -responsibilities with respect to end users, business partners and the -like. While this license is intended to facilitate the commercial use of -the Program, the Contributor who includes the Program in a commercial -product offering should do so in a manner which does not create -potential liability for other Contributors. Therefore, if a Contributor -includes the Program in a commercial product offering, such Contributor -("Commercial Contributor") hereby agrees to defend and -indemnify every other Contributor ("Indemnified Contributor") -against any losses, damages and costs (collectively "Losses") -arising from claims, lawsuits and other legal actions brought by a third -party against the Indemnified Contributor to the extent caused by the -acts or omissions of such Commercial Contributor in connection with its -distribution of the Program in a commercial product offering. The -obligations in this section do not apply to any claims or Losses -relating to any actual or alleged intellectual property infringement. In -order to qualify, an Indemnified Contributor must: a) promptly notify -the Commercial Contributor in writing of such claim, and b) allow the -Commercial Contributor to control, and cooperate with the Commercial -Contributor in, the defense and any related settlement negotiations. The -Indemnified Contributor may participate in any such claim at its own -expense.

- -

For example, a Contributor might include the Program in a commercial -product offering, Product X. That Contributor is then a Commercial -Contributor. If that Commercial Contributor then makes performance -claims, or offers warranties related to Product X, those performance -claims and warranties are such Commercial Contributor's responsibility -alone. Under this section, the Commercial Contributor would have to -defend claims against the other Contributors related to those -performance claims and warranties, and if a court requires any other -Contributor to pay any damages as a result, the Commercial Contributor -must pay those damages.

- -

5. NO WARRANTY

- -

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS -PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS -OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, -ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY -OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely -responsible for determining the appropriateness of using and -distributing the Program and assumes all risks associated with its -exercise of rights under this Agreement , including but not limited to -the risks and costs of program errors, compliance with applicable laws, -damage to or loss of data, programs or equipment, and unavailability or -interruption of operations.

- -

6. DISCLAIMER OF LIABILITY

- -

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT -NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING -WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR -DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED -HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

- -

7. GENERAL

- -

If any provision of this Agreement is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of -the remainder of the terms of this Agreement, and without further action -by the parties hereto, such provision shall be reformed to the minimum -extent necessary to make such provision valid and enforceable.

- -

If Recipient institutes patent litigation against any entity -(including a cross-claim or counterclaim in a lawsuit) alleging that the -Program itself (excluding combinations of the Program with other -software or hardware) infringes such Recipient's patent(s), then such -Recipient's rights granted under Section 2(b) shall terminate as of the -date such litigation is filed.

- -

All Recipient's rights under this Agreement shall terminate if it -fails to comply with any of the material terms or conditions of this -Agreement and does not cure such failure in a reasonable period of time -after becoming aware of such noncompliance. If all Recipient's rights -under this Agreement terminate, Recipient agrees to cease use and -distribution of the Program as soon as reasonably practicable. However, -Recipient's obligations under this Agreement and any licenses granted by -Recipient relating to the Program shall continue and survive.

- -

Everyone is permitted to copy and distribute copies of this -Agreement, but in order to avoid inconsistency the Agreement is -copyrighted and may only be modified in the following manner. The -Agreement Steward reserves the right to publish new versions (including -revisions) of this Agreement from time to time. No one other than the -Agreement Steward has the right to modify this Agreement. The Eclipse -Foundation is the initial Agreement Steward. The Eclipse Foundation may -assign the responsibility to serve as the Agreement Steward to a -suitable separate entity. Each new version of the Agreement will be -given a distinguishing version number. The Program (including -Contributions) may always be distributed subject to the version of the -Agreement under which it was received. In addition, after a new version -of the Agreement is published, Contributor may elect to distribute the -Program (including its Contributions) under the new version. Except as -expressly stated in Sections 2(a) and 2(b) above, Recipient receives no -rights or licenses to the intellectual property of any Contributor under -this Agreement, whether expressly, by implication, estoppel or -otherwise. All rights in the Program not expressly granted under this -Agreement are reserved.

- -

This Agreement is governed by the laws of the State of New York and -the intellectual property laws of the United States of America. No party -to this Agreement will bring a legal action under this Agreement more -than one year after the cause of action arose. Each party waives its -rights to a jury trial in any resulting litigation.

- - - - diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..8f48f685 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,204 @@ +Eclipse Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC +LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM +CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + a) in the case of the initial Contributor, the initial code and + documentation distributed under this Agreement, and + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + +where such changes and/or additions to the Program originate from and are +distributed by that particular Contributor. A Contribution 'originates' from a +Contributor if it was added to the Program by such Contributor itself or +anyone acting on such Contributor's behalf. Contributions do not include +additions to the Program which: (i) are separate modules of software +distributed in conjunction with the Program under their own license agreement, +and (ii) are not derivative works of the Program. +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which are +necessarily infringed by the use or sale of its Contribution alone or when +combined with the Program. + +"Program" means the Contributions distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, +including all Contributors. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby grants + Recipient a non-exclusive, worldwide, royalty-free copyright license to + reproduce, prepare derivative works of, publicly display, publicly + perform, distribute and sublicense the Contribution of such Contributor, + if any, and such derivative works, in source code and object code form. + + b) Subject to the terms of this Agreement, each Contributor hereby grants + Recipient a non-exclusive, worldwide, royalty-free patent license under + Licensed Patents to make, use, sell, offer to sell, import and otherwise + transfer the Contribution of such Contributor, if any, in source code and + object code form. This patent license shall apply to the combination of + the Contribution and the Program if, at the time the Contribution is + added by the Contributor, such addition of the Contribution causes such + combination to be covered by the Licensed Patents. The patent license + shall not apply to any other combinations which include the Contribution. + No hardware per se is licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the patent + or other intellectual property rights of any other entity. Each + Contributor disclaims any liability to Recipient for claims brought by + any other entity based on infringement of intellectual property rights or + otherwise. As a condition to exercising the rights and licenses granted + hereunder, each Recipient hereby assumes sole responsibility to secure + any other intellectual property rights needed, if any. For example, if a + third party patent license is required to allow Recipient to distribute + the Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has sufficient + copyright rights in its Contribution, if any, to grant the copyright + license set forth in this Agreement. + +3. REQUIREMENTS +A Contributor may choose to distribute the Program in object code form under +its own license agreement, provided that: + + a) it complies with the terms and conditions of this Agreement; and + + b) its license agreement: + i) effectively disclaims on behalf of all Contributors all + warranties and conditions, express and implied, including warranties + or conditions of title and non-infringement, and implied warranties + or conditions of merchantability and fitness for a particular + purpose; + ii) effectively excludes on behalf of all Contributors all liability + for damages, including direct, indirect, special, incidental and + consequential damages, such as lost profits; + iii) states that any provisions which differ from this Agreement are + offered by that Contributor alone and not by any other party; and + iv) states that source code for the Program is available from such + Contributor, and informs licensees how to obtain it in a reasonable + manner on or through a medium customarily used for software + exchange. + +When the Program is made available in source code form: + + a) it must be made available under this Agreement; and + + b) a copy of this Agreement must be included with each copy of the + Program. +Contributors may not remove or alter any copyright notices contained within +the Program. + +Each Contributor must identify itself as the originator of its Contribution, +if any, in a manner that reasonably allows subsequent Recipients to identify +the originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION +Commercial distributors of software may accept certain responsibilities with +respect to end users, business partners and the like. While this license is +intended to facilitate the commercial use of the Program, the Contributor who +includes the Program in a commercial product offering should do so in a manner +which does not create potential liability for other Contributors. Therefore, +if a Contributor includes the Program in a commercial product offering, such +Contributor ("Commercial Contributor") hereby agrees to defend and indemnify +every other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits and +other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such Commercial +Contributor in connection with its distribution of the Program in a commercial +product offering. The obligations in this section do not apply to any claims +or Losses relating to any actual or alleged intellectual property +infringement. In order to qualify, an Indemnified Contributor must: a) +promptly notify the Commercial Contributor in writing of such claim, and b) +allow the Commercial Contributor to control, and cooperate with the Commercial +Contributor in, the defense and any related settlement negotiations. The +Indemnified Contributor may participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product +offering, Product X. That Contributor is then a Commercial Contributor. If +that Commercial Contributor then makes performance claims, or offers +warranties related to Product X, those performance claims and warranties are +such Commercial Contributor's responsibility alone. Under this section, the +Commercial Contributor would have to defend claims against the other +Contributors related to those performance claims and warranties, and if a +court requires any other Contributor to pay any damages as a result, the +Commercial Contributor must pay those damages. + +5. NO WARRANTY +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each +Recipient is solely responsible for determining the appropriateness of using +and distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement , including but not limited to the +risks and costs of program errors, compliance with applicable laws, damage to +or loss of data, programs or equipment, and unavailability or interruption of +operations. + +6. DISCLAIMER OF LIABILITY +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY +CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION +LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of the +remainder of the terms of this Agreement, and without further action by the +parties hereto, such provision shall be reformed to the minimum extent +necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Program itself +(excluding combinations of the Program with other software or hardware) +infringes such Recipient's patent(s), then such Recipient's rights granted +under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to +comply with any of the material terms or conditions of this Agreement and does +not cure such failure in a reasonable period of time after becoming aware of +such noncompliance. If all Recipient's rights under this Agreement terminate, +Recipient agrees to cease use and distribution of the Program as soon as +reasonably practicable. However, Recipient's obligations under this Agreement +and any licenses granted by Recipient relating to the Program shall continue +and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in +order to avoid inconsistency the Agreement is copyrighted and may only be +modified in the following manner. The Agreement Steward reserves the right to +publish new versions (including revisions) of this Agreement from time to +time. No one other than the Agreement Steward has the right to modify this +Agreement. The Eclipse Foundation is the initial Agreement Steward. The +Eclipse Foundation may assign the responsibility to serve as the Agreement +Steward to a suitable separate entity. Each new version of the Agreement will +be given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the +Agreement under which it was received. In addition, after a new version of the +Agreement is published, Contributor may elect to distribute the Program +(including its Contributions) under the new version. Except as expressly +stated in Sections 2(a) and 2(b) above, Recipient receives no rights or +licenses to the intellectual property of any Contributor under this Agreement, +whether expressly, by implication, estoppel or otherwise. All rights in the +Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the +intellectual property laws of the United States of America. No party to this +Agreement will bring a legal action under this Agreement more than one year +after the cause of action arose. Each party waives its rights to a jury trial +in any resulting litigation. From bb2fcc7ffdc910555d24ff64a8e7ffacb2c1c478 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 5 Jun 2019 21:10:59 +0100 Subject: [PATCH 33/58] Add CONTRIBUTING.md (fixes #188) --- CONTRIBUTING.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..bf2cf212 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,32 @@ +# Contributing Guidelines + +**Do** follow [the seven rules of a great Git commit message][1]. + +**Do** follow [the Clojure Style Guide][2]. + +**Do** include tests for your change when appropriate. + +**Do** ensure that the CI checks pass. + +**Do** squash the commits in your PR to remove corrections +irrelevant to the code history, once the PR has been reviewed. + +**Do** feel free to pester the project maintainers about the PR if it +hasn't been responded to. Sometimes notifications can be missed. + +**Don't** include more than one feature or fix in a single PR. + +**Don't** include changes unrelated to the purpose of the PR. This +includes changing the project version number, adding lines to the +`.gitignore` file, or changing the indentation or formatting. + +**Don't** open a new PR if changes are requested. Just push to the +same branch and the PR will be updated. + +**Don't** overuse vertical whitespace; avoid multiple sequential blank +lines. + +**Don't** docstring private vars or functions. + +[1]: https://chris.beams.io/posts/git-commit/#seven-rules +[2]: https://github.com/bbatsov/clojure-style-guide From 1b16243d11acce57f33eafd74e7fd28706a3581b Mon Sep 17 00:00:00 2001 From: semsorock Date: Thu, 30 Jul 2020 12:24:06 +0300 Subject: [PATCH 34/58] Add Clojure 1.10 test profile --- project.clj | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/project.clj b/project.clj index 80caceac..e1f0f645 100644 --- a/project.clj +++ b/project.clj @@ -15,11 +15,12 @@ :metadata {:doc/format :markdown} :source-uri "http://github.com/weavejester/compojure/blob/{version}/{filepath}#L{line}"} :aliases - {"test-all" ["with-profile" "default:+1.8:+1.9" "test"]} + {"test-all" ["with-profile" "default:+1.8:+1.9:+1.10" "test"]} :profiles {:dev {:jvm-opts ^:replace [] :dependencies [[ring/ring-mock "0.3.2"] [criterium "0.4.4"] [javax.servlet/servlet-api "2.5"]]} :1.8 {:dependencies [[org.clojure/clojure "1.8.0"]]} - :1.9 {:dependencies [[org.clojure/clojure "1.9.0"]]}}) + :1.9 {:dependencies [[org.clojure/clojure "1.9.0"]]} + :1.10 {:dependencies [[org.clojure/clojure "1.10.0"]]}}) From e0eccf8e9821d7fc7243b03e2e69cb7d3b2cc830 Mon Sep 17 00:00:00 2001 From: semsorock Date: Tue, 28 Jul 2020 21:06:47 +0300 Subject: [PATCH 35/58] Update Ring dependencies --- project.clj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/project.clj b/project.clj index 80caceac..51d35b6c 100644 --- a/project.clj +++ b/project.clj @@ -7,8 +7,8 @@ [org.clojure/tools.macro "0.1.5"] [clout "2.2.1"] [medley "1.0.0"] - [ring/ring-core "1.6.3"] - [ring/ring-codec "1.1.0"]] + [ring/ring-core "1.8.1"] + [ring/ring-codec "1.1.2"]] :plugins [[lein-codox "0.10.3"]] :codox {:output-path "codox" @@ -18,7 +18,7 @@ {"test-all" ["with-profile" "default:+1.8:+1.9" "test"]} :profiles {:dev {:jvm-opts ^:replace [] - :dependencies [[ring/ring-mock "0.3.2"] + :dependencies [[ring/ring-mock "0.4.0"] [criterium "0.4.4"] [javax.servlet/servlet-api "2.5"]]} :1.8 {:dependencies [[org.clojure/clojure "1.8.0"]]} From e70ff53fb84ca1ad5481ba61b6b615589ed34e91 Mon Sep 17 00:00:00 2001 From: semsorock Date: Mon, 3 Aug 2020 13:44:29 +0300 Subject: [PATCH 36/58] Update dependencies --- project.clj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/project.clj b/project.clj index 9efb4f2f..bc236f25 100644 --- a/project.clj +++ b/project.clj @@ -6,10 +6,10 @@ :dependencies [[org.clojure/clojure "1.7.0"] [org.clojure/tools.macro "0.1.5"] [clout "2.2.1"] - [medley "1.0.0"] + [medley "1.3.0"] [ring/ring-core "1.8.1"] [ring/ring-codec "1.1.2"]] - :plugins [[lein-codox "0.10.3"]] + :plugins [[lein-codox "0.10.7"]] :codox {:output-path "codox" :metadata {:doc/format :markdown} @@ -19,7 +19,7 @@ :profiles {:dev {:jvm-opts ^:replace [] :dependencies [[ring/ring-mock "0.4.0"] - [criterium "0.4.4"] + [criterium "0.4.6"] [javax.servlet/servlet-api "2.5"]]} :1.8 {:dependencies [[org.clojure/clojure "1.8.0"]]} :1.9 {:dependencies [[org.clojure/clojure "1.9.0"]]} From dbef0ccdcf5608963f3e71a2e08db5aa3c35e8ba Mon Sep 17 00:00:00 2001 From: James Reeves Date: Tue, 4 Aug 2020 19:39:37 +0100 Subject: [PATCH 37/58] Update copyright year in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5dbc36a3..c8e2b59d 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,6 @@ Also refer to the [Getting Started][2] page on the wiki. ## License -Copyright © 2018 James Reeves +Copyright © 2020 James Reeves Distributed under the Eclipse Public License, the same as Clojure. From bdf6c8cf630e160967a5e1e8cf8f60688e85c24f Mon Sep 17 00:00:00 2001 From: James Reeves Date: Tue, 4 Aug 2020 19:41:01 +0100 Subject: [PATCH 38/58] Release 1.6.2 --- CHANGELOG.md | 7 +++++++ README.md | 2 +- project.clj | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6a7eb7b..afcb2696 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 1.6.2 (2020-08-04) + +* Fixed exception when coercion in context fails (see #184) +* Updated Ring dependency to 1.8.1 +* Updated Ring-Codec dependency to 1.1.2 +* Updated Medley dependency to 1.3.0 + ## 1.6.1 (2018-04-15) * Updated Ring dependency to 1.6.3 diff --git a/README.md b/README.md index c8e2b59d..707cb8e3 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ applications to be composed of small, independent parts. Add the following dependency to your `project.clj` file: - [compojure "1.6.1"] + [compojure "1.6.2"] ## Documentation diff --git a/project.clj b/project.clj index bc236f25..1c4490b7 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject compojure "1.6.1" +(defproject compojure "1.6.2" :description "A concise routing library for Ring" :url "https://github.com/weavejester/compojure" :license {:name "Eclipse Public License" From 14fdbccbdf7d288d38b5d84211f17e588990d573 Mon Sep 17 00:00:00 2001 From: Audrius <41568862+audriu@users.noreply.github.com> Date: Tue, 20 Apr 2021 16:00:11 +0300 Subject: [PATCH 39/58] Fix API Docs link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 707cb8e3..9df7216c 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Add the following dependency to your `project.clj` file: ## Documentation * [Wiki](https://github.com/weavejester/compojure/wiki) -* [API Docs](http://weavejester.github.com/compojure) +* [API Docs](http://weavejester.github.io/compojure) ## Community From aa83158f3f178ebc03bf668e7c3386643befc4de Mon Sep 17 00:00:00 2001 From: stevejmp Date: Fri, 1 Apr 2022 12:59:00 +0900 Subject: [PATCH 40/58] Update Medley to 1.4.0 to fix Clojure 1.11 warning Fixes #205 --- project.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.clj b/project.clj index 1c4490b7..a4e1a782 100644 --- a/project.clj +++ b/project.clj @@ -6,7 +6,7 @@ :dependencies [[org.clojure/clojure "1.7.0"] [org.clojure/tools.macro "0.1.5"] [clout "2.2.1"] - [medley "1.3.0"] + [medley "1.4.0"] [ring/ring-core "1.8.1"] [ring/ring-codec "1.1.2"]] :plugins [[lein-codox "0.10.7"]] From 1ed80d0e86bc2711e12bd1c7959906c344251f7e Mon Sep 17 00:00:00 2001 From: James Reeves Date: Thu, 12 May 2022 01:48:17 +0100 Subject: [PATCH 41/58] Update copyright year in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9df7216c..0aa35f8f 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,6 @@ Also refer to the [Getting Started][2] page on the wiki. ## License -Copyright © 2020 James Reeves +Copyright © 2022 James Reeves Distributed under the Eclipse Public License, the same as Clojure. From 409b14b73d9a3dd2032d2802eb67881b16942af6 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Thu, 12 May 2022 01:48:36 +0100 Subject: [PATCH 42/58] Release 1.6.3 --- CHANGELOG.md | 4 ++++ README.md | 2 +- project.clj | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index afcb2696..e1866382 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.6.3 (2022-05-12) + +* Updated Medley dependency to 1.4.0 (see #206) + ## 1.6.2 (2020-08-04) * Fixed exception when coercion in context fails (see #184) diff --git a/README.md b/README.md index 0aa35f8f..7e331359 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ applications to be composed of small, independent parts. Add the following dependency to your `project.clj` file: - [compojure "1.6.2"] + [compojure "1.6.3"] ## Documentation diff --git a/project.clj b/project.clj index a4e1a782..8835a877 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject compojure "1.6.2" +(defproject compojure "1.6.3" :description "A concise routing library for Ring" :url "https://github.com/weavejester/compojure" :license {:name "Eclipse Public License" From 6ae24d4ee3557d503cab2e8bf130f49d1aad62fe Mon Sep 17 00:00:00 2001 From: Liam Chen Date: Wed, 11 May 2022 15:47:17 -0400 Subject: [PATCH 43/58] Add :compojure/route-context to the request map Contains the combined route context for the current route. --- src/compojure/core.clj | 12 +++++++----- test/compojure/core_test.clj | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/compojure/core.clj b/src/compojure/core.clj index 32b25de9..4216cbea 100644 --- a/src/compojure/core.clj +++ b/src/compojure/core.clj @@ -251,7 +251,7 @@ (defn- remove-suffix [path suffix] (subs path 0 (- (count path) (count suffix)))) -(defn- context-request [request route] +(defn- context-request [request route route-context] (if-let [params (clout/route-matches route request)] (let [uri (:uri request) path (:path-info request uri) @@ -261,7 +261,8 @@ (-> request (assoc-route-params (decode-route-params params)) (assoc :path-info (if (= subpath "") "/" subpath) - :context (remove-suffix uri subpath)))))) + :context (remove-suffix uri subpath)) + (update :compojure/route-context str route-context))))) (defn- context-route [route] (let [re-context {:__path-info #"|/.*"}] @@ -279,7 +280,7 @@ :else `(clout/route-compile (str ~route ":__path-info") ~re-context)))) -(defn ^:no-doc make-context [route make-handler] +(defn ^:no-doc make-context [route path make-handler] (letfn [(handler ([request] (when-let [context-handler (make-handler request)] @@ -292,10 +293,10 @@ handler (fn ([request] - (if-let [request (context-request request route)] + (if-let [request (context-request request route path)] (handler request))) ([request respond raise] - (if-let [request (context-request request route)] + (if-let [request (context-request request route path)] (handler request respond raise) (respond nil))))))) @@ -311,6 +312,7 @@ [path args & routes] `(make-context ~(context-route path) + ~path (fn [request#] (let-request [~args request#] (routes ~@routes))))) diff --git a/test/compojure/core_test.clj b/test/compojure/core_test.clj index f5430801..7576ad73 100644 --- a/test/compojure/core_test.clj +++ b/test/compojure/core_test.clj @@ -196,6 +196,23 @@ "/foo/10/b%20r" "/b%20r" "/bar/10" nil))) + (testing ":compojure/route-context key" + (let [handler (context "/foo/:id" [_] :compojure/route-context)] + (are [url route-context] (= (handler (mock/request :get url)) route-context) + "/foo/10" "/foo/:id" + "/foo/10/bar" "/foo/:id" + "/foo/10/b%20r" "/foo/:id" + "/bar/10" nil))) + + (testing ":compojure/route-context key in nested context" + (let [handler (context "/foo/:foo-id" [_] + (context "/bar/:bar-id" [_] :compojure/route-context))] + (are [url route-context] (= (handler (mock/request :get url)) route-context) + "/foo/1/bar/2" "/foo/:foo-id/bar/:bar-id" + "/foo/1/bar/2/baz" "/foo/:foo-id/bar/:bar-id" + "/foo/1/bar/2/b%20r" "/foo/:foo-id/bar/:bar-id" + "/bar/10" nil))) + (testing "routes" (let [handler (context "/foo/:id" [id] (GET "/" [] "root") From ba586074bdd5174490ccbd01ba8fe1340219afaf Mon Sep 17 00:00:00 2001 From: James Reeves Date: Thu, 19 May 2022 17:39:23 +0100 Subject: [PATCH 44/58] Update dependencies --- project.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project.clj b/project.clj index 8835a877..e6fece0d 100644 --- a/project.clj +++ b/project.clj @@ -7,8 +7,8 @@ [org.clojure/tools.macro "0.1.5"] [clout "2.2.1"] [medley "1.4.0"] - [ring/ring-core "1.8.1"] - [ring/ring-codec "1.1.2"]] + [ring/ring-core "1.9.5"] + [ring/ring-codec "1.2.0"]] :plugins [[lein-codox "0.10.7"]] :codox {:output-path "codox" From e79672fd3311e74b6832013eaed60de98971d252 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Thu, 19 May 2022 17:41:09 +0100 Subject: [PATCH 45/58] Add test profile for Clojure 1.11 --- project.clj | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/project.clj b/project.clj index e6fece0d..c23b4710 100644 --- a/project.clj +++ b/project.clj @@ -15,7 +15,7 @@ :metadata {:doc/format :markdown} :source-uri "http://github.com/weavejester/compojure/blob/{version}/{filepath}#L{line}"} :aliases - {"test-all" ["with-profile" "default:+1.8:+1.9:+1.10" "test"]} + {"test-all" ["with-profile" "default:+1.8:+1.9:+1.10:+1.11" "test"]} :profiles {:dev {:jvm-opts ^:replace [] :dependencies [[ring/ring-mock "0.4.0"] @@ -23,4 +23,5 @@ [javax.servlet/servlet-api "2.5"]]} :1.8 {:dependencies [[org.clojure/clojure "1.8.0"]]} :1.9 {:dependencies [[org.clojure/clojure "1.9.0"]]} - :1.10 {:dependencies [[org.clojure/clojure "1.10.0"]]}}) + :1.10 {:dependencies [[org.clojure/clojure "1.10.0"]]} + :1.11 {:dependencies [[org.clojure/clojure "1.11.1"]]}}) From cd9536e11f24c075ec670c2abc4b0405be60c57e Mon Sep 17 00:00:00 2001 From: James Reeves Date: Sat, 21 May 2022 00:49:34 +0100 Subject: [PATCH 46/58] Release 1.7.0 --- CHANGELOG.md | 6 ++++++ README.md | 2 +- project.clj | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1866382..88d9f8b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.7.0 (2022-05-21) + +* Added `:compojure/route-context` key to requests (see #212) +* Updated Ring dependency to 1.9.3 +* Updated Ring-Codec dependency to 1.2.0 + ## 1.6.3 (2022-05-12) * Updated Medley dependency to 1.4.0 (see #206) diff --git a/README.md b/README.md index 7e331359..150f9ebd 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ applications to be composed of small, independent parts. Add the following dependency to your `project.clj` file: - [compojure "1.6.3"] + [compojure "1.7.0"] ## Documentation diff --git a/project.clj b/project.clj index c23b4710..76178f79 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject compojure "1.6.3" +(defproject compojure "1.7.0" :description "A concise routing library for Ring" :url "https://github.com/weavejester/compojure" :license {:name "Eclipse Public License" From 1bc0e60245b71b7f149b42b75cc9b3ed15487078 Mon Sep 17 00:00:00 2001 From: Ari Paasonen Date: Wed, 19 Apr 2023 10:01:27 +0900 Subject: [PATCH 47/58] Update Ring to 1.10.0 --- project.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.clj b/project.clj index 76178f79..3b42ec71 100644 --- a/project.clj +++ b/project.clj @@ -7,7 +7,7 @@ [org.clojure/tools.macro "0.1.5"] [clout "2.2.1"] [medley "1.4.0"] - [ring/ring-core "1.9.5"] + [ring/ring-core "1.10.0"] [ring/ring-codec "1.2.0"]] :plugins [[lein-codox "0.10.7"]] :codox From ec84e655010b319e50d6ec5d29b0aabed294810a Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 31 Jan 2024 18:51:07 +0000 Subject: [PATCH 48/58] Update dependencies --- project.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.clj b/project.clj index 3b42ec71..0add6328 100644 --- a/project.clj +++ b/project.clj @@ -7,7 +7,7 @@ [org.clojure/tools.macro "0.1.5"] [clout "2.2.1"] [medley "1.4.0"] - [ring/ring-core "1.10.0"] + [ring/ring-core "1.11.0"] [ring/ring-codec "1.2.0"]] :plugins [[lein-codox "0.10.7"]] :codox From 2d794d7d3f7718711b33bb8dc4bacff0c073080d Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 31 Jan 2024 18:51:43 +0000 Subject: [PATCH 49/58] Update minimum Clojure version to 1.9.0 --- project.clj | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/project.clj b/project.clj index 0add6328..a1615ceb 100644 --- a/project.clj +++ b/project.clj @@ -3,7 +3,7 @@ :url "https://github.com/weavejester/compojure" :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} - :dependencies [[org.clojure/clojure "1.7.0"] + :dependencies [[org.clojure/clojure "1.9.0"] [org.clojure/tools.macro "0.1.5"] [clout "2.2.1"] [medley "1.4.0"] @@ -15,13 +15,11 @@ :metadata {:doc/format :markdown} :source-uri "http://github.com/weavejester/compojure/blob/{version}/{filepath}#L{line}"} :aliases - {"test-all" ["with-profile" "default:+1.8:+1.9:+1.10:+1.11" "test"]} + {"test-all" ["with-profile" "default:+1.10:+1.11" "test"]} :profiles {:dev {:jvm-opts ^:replace [] :dependencies [[ring/ring-mock "0.4.0"] [criterium "0.4.6"] [javax.servlet/servlet-api "2.5"]]} - :1.8 {:dependencies [[org.clojure/clojure "1.8.0"]]} - :1.9 {:dependencies [[org.clojure/clojure "1.9.0"]]} :1.10 {:dependencies [[org.clojure/clojure "1.10.0"]]} :1.11 {:dependencies [[org.clojure/clojure "1.11.1"]]}}) From 089a20fa27d8ffe03acb66b8292d7bd0cdf03eab Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 31 Jan 2024 18:52:38 +0000 Subject: [PATCH 50/58] Update copyright year in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 150f9ebd..7f273435 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,6 @@ Also refer to the [Getting Started][2] page on the wiki. ## License -Copyright © 2022 James Reeves +Copyright © 2024 James Reeves Distributed under the Eclipse Public License, the same as Clojure. From 22c56a627522f3343026c3a773630713e1e00eae Mon Sep 17 00:00:00 2001 From: James Reeves Date: Wed, 31 Jan 2024 18:54:32 +0000 Subject: [PATCH 51/58] Release 1.7.1 --- CHANGELOG.md | 5 +++++ README.md | 2 +- project.clj | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 88d9f8b3..72d93d42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.7.1 (2024-01-31) + +* Updated Ring dependency to 1.11.0 +* Updated minimum Clojure version to 1.9.0 + ## 1.7.0 (2022-05-21) * Added `:compojure/route-context` key to requests (see #212) diff --git a/README.md b/README.md index 7f273435..cd66d506 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ applications to be composed of small, independent parts. Add the following dependency to your `project.clj` file: - [compojure "1.7.0"] + [compojure "1.7.1"] ## Documentation diff --git a/project.clj b/project.clj index a1615ceb..09e94685 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject compojure "1.7.0" +(defproject compojure "1.7.1" :description "A concise routing library for Ring" :url "https://github.com/weavejester/compojure" :license {:name "Eclipse Public License" From 852eb29c2dae4bb5794a005222ca6e32dc9df6c3 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Mon, 15 Sep 2025 15:33:11 +0100 Subject: [PATCH 52/58] Replace Travis CI with GitHub Actions --- .github/workflows/test.yml | 29 +++++++++++++++++++++++++++++ .travis.yml | 2 -- README.md | 4 +--- 3 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/test.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..4abd42ad --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,29 @@ +name: Tests +on: [push, pull_request] +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Prepare java + uses: actions/setup-java@v5 + with: + distribution: 'zulu' + java-version: '11' + + - name: Install clojure tools + uses: DeLaGuardo/setup-clojure@13.4 + with: + lein: 2.12.0 + + - name: Cache clojure dependencies + uses: actions/cache@v4 + with: + path: ~/.m2/repository + key: cljdeps-${{ hashFiles('project.clj') }} + restore-keys: cljdeps- + + - name: Run tests + run: lein test-all diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index f0bfe7e7..00000000 --- a/.travis.yml +++ /dev/null @@ -1,2 +0,0 @@ -language: clojure -script: lein test-all diff --git a/README.md b/README.md index cd66d506..55895f94 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -# Compojure - -[![Build Status](https://travis-ci.org/weavejester/compojure.svg?branch=master)](https://travis-ci.org/weavejester/compojure) +# Compojure [![Build Status](https://github.com/weavejester/compojure/actions/workflows/test.yml/badge.svg)](https://github.com/weavejester/compojure/actions/workflows/test.yml) Compojure is a small routing library for [Ring][1] that allows web applications to be composed of small, independent parts. From ef8d8cb659892dea91962c5007de4f42514b1e3a Mon Sep 17 00:00:00 2001 From: James Reeves Date: Mon, 15 Sep 2025 15:33:54 +0100 Subject: [PATCH 53/58] Add .clj-kondo to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d4074226..7d58bdd6 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ pom.xml.asc *.class /.lein-* /.nrepl-port +/.clj-kondo \ No newline at end of file From 0636ce6fa68d62c0bad88f138e072f8d408cebc8 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Mon, 15 Sep 2025 15:36:36 +0100 Subject: [PATCH 54/58] Update dependencies Closes #222. --- project.clj | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/project.clj b/project.clj index 09e94685..90b1395e 100644 --- a/project.clj +++ b/project.clj @@ -4,12 +4,12 @@ :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} :dependencies [[org.clojure/clojure "1.9.0"] - [org.clojure/tools.macro "0.1.5"] + [org.clojure/tools.macro "0.2.1"] [clout "2.2.1"] - [medley "1.4.0"] - [ring/ring-core "1.11.0"] - [ring/ring-codec "1.2.0"]] - :plugins [[lein-codox "0.10.7"]] + [dev.weavejester/medley "1.9.0"] + [ring/ring-core "1.15.1"] + [ring/ring-codec "1.3.0"]] + :plugins [[lein-codox "0.10.8"]] :codox {:output-path "codox" :metadata {:doc/format :markdown} @@ -18,8 +18,8 @@ {"test-all" ["with-profile" "default:+1.10:+1.11" "test"]} :profiles {:dev {:jvm-opts ^:replace [] - :dependencies [[ring/ring-mock "0.4.0"] + :dependencies [[ring/ring-mock "0.6.2"] [criterium "0.4.6"] [javax.servlet/servlet-api "2.5"]]} :1.10 {:dependencies [[org.clojure/clojure "1.10.0"]]} - :1.11 {:dependencies [[org.clojure/clojure "1.11.1"]]}}) + :1.11 {:dependencies [[org.clojure/clojure "1.11.4"]]}}) From dbe96b700c24a664e2cc9b53f8d3c0ceea458256 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Mon, 15 Sep 2025 15:38:59 +0100 Subject: [PATCH 55/58] Add Clojure 1.12 test profile --- project.clj | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/project.clj b/project.clj index 90b1395e..52d1b03d 100644 --- a/project.clj +++ b/project.clj @@ -15,11 +15,12 @@ :metadata {:doc/format :markdown} :source-uri "http://github.com/weavejester/compojure/blob/{version}/{filepath}#L{line}"} :aliases - {"test-all" ["with-profile" "default:+1.10:+1.11" "test"]} + {"test-all" ["with-profile" "default:+1.10:+1.11:+1.12" "test"]} :profiles {:dev {:jvm-opts ^:replace [] :dependencies [[ring/ring-mock "0.6.2"] [criterium "0.4.6"] [javax.servlet/servlet-api "2.5"]]} :1.10 {:dependencies [[org.clojure/clojure "1.10.0"]]} - :1.11 {:dependencies [[org.clojure/clojure "1.11.4"]]}}) + :1.11 {:dependencies [[org.clojure/clojure "1.11.4"]]} + :1.12 {:dependencies [[org.clojure/clojure "1.12.2"]]}}) From 73baddaf9ccd462d6a8b036fd8c75a62608e3c90 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Mon, 15 Sep 2025 15:40:22 +0100 Subject: [PATCH 56/58] Update copyright year in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 55895f94..c9c8f9d9 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,6 @@ Also refer to the [Getting Started][2] page on the wiki. ## License -Copyright © 2024 James Reeves +Copyright © 2025 James Reeves Distributed under the Eclipse Public License, the same as Clojure. From 9cd721dee1e26a3daf26a4a4bbb7558ec155d185 Mon Sep 17 00:00:00 2001 From: James Reeves Date: Mon, 15 Sep 2025 15:41:29 +0100 Subject: [PATCH 57/58] Update installation instructions in README --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c9c8f9d9..bf05bcf6 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,11 @@ applications to be composed of small, independent parts. ## Installation -Add the following dependency to your `project.clj` file: +Add the following dependency to your deps.edn file: + + compojure/compojure {:mvn/version "1.7.1"} + +Or to your Leiningen project file: [compojure "1.7.1"] From 8a4758d28e8fcd28fa7610dca6e2908d039e6a4f Mon Sep 17 00:00:00 2001 From: James Reeves Date: Mon, 15 Sep 2025 15:43:52 +0100 Subject: [PATCH 58/58] Release 1.7.2 --- CHANGELOG.md | 7 +++++++ README.md | 4 ++-- project.clj | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 72d93d42..e1765751 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 1.7.2 (2025-09-15) + +* Updated Medley dependency to 1.9.0 (see #222) +* Updated Ring dependency to 1.15.1 +* Updated Ring-Codec dependency to 1.3.0 +* Updated tools.macro dependency to 0.2.1 + ## 1.7.1 (2024-01-31) * Updated Ring dependency to 1.11.0 diff --git a/README.md b/README.md index bf05bcf6..0dc6e047 100644 --- a/README.md +++ b/README.md @@ -7,11 +7,11 @@ applications to be composed of small, independent parts. Add the following dependency to your deps.edn file: - compojure/compojure {:mvn/version "1.7.1"} + compojure/compojure {:mvn/version "1.7.2"} Or to your Leiningen project file: - [compojure "1.7.1"] + [compojure "1.7.2"] ## Documentation diff --git a/project.clj b/project.clj index 52d1b03d..16c286a4 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject compojure "1.7.1" +(defproject compojure "1.7.2" :description "A concise routing library for Ring" :url "https://github.com/weavejester/compojure" :license {:name "Eclipse Public License"