diff --git a/CHANGELOG.md b/CHANGELOG.md index 821cea66..f3d51a94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,14 +1,14 @@ ## UNRELEASED -## `reitit-core` +### `reitit-core` * `segment-router` doesn't accept empty segments as path-parameters, fixes [#181](https://github.com/metosin/reitit/issues/181). * path-params are decoded correctly with `r/match-by-name`, fixes [#192](https://github.com/metosin/reitit/issues/192). * new `:quarantine-router`, which is uses by default if there are any path conflicts: uses internally `:mixed-router` for non-conflicting routes and `:linear-router` for conflicting routes. ```clj -(-> [["/joulu/kinkku"] ;; linear router - ["/joulu/:torttu"] ;; linear router +(-> [["/joulu/kinkku"] ;; linear-router + ["/joulu/:torttu"] ;; linear-router ["/tonttu/:id"] ;; segment-router ["/manna/puuro"] ;; lookup-router ["/sinappi/silli"]] ;; lookup-router @@ -17,7 +17,13 @@ ; => :quarantine-router ``` -* updated deps: +### `reitit-pedestal` + +* new optional module for [Pedestal](http://pedestal.io/) integration. See [the docs](https://metosin.github.io/reitit/http/pedestal.html). + +### dependencies + +* updated: ```clj [metosin/muuntaja "0.6.3"] is available but we use "0.6.1" @@ -25,17 +31,17 @@ ## 0.2.9 (2018-11-21) -## `reitit-spec` +### `reitit-spec` * support for vector data-specs for request & response parameters by [Heikki Hämäläinen](https://github.com/hjhamala). ## 0.2.8 (2018-11-18) -## `reitit-core` +### `reitit-core` * Added support for composing middleware & interceptor transformations, fixes [#167](https://github.com/metosin/reitit/issues/167). -## `reitit-spec` +### `reitit-spec` * Spec problems are exposed as-is into request & response coercion errors, enabling pretty-printers like [expound](https://github.com/bhb/expound) to be used: @@ -81,13 +87,13 @@ :query-params {"x" "1", "y" "-2"}}) ``` -## `reitit-swagger` +### `reitit-swagger` * `create-swagger-handler` support now 3-arity ring-async, thanks to [Miloslav Nenadál](https://github.com/nenadalm) ## 0.2.7 (2018-11-11) -## `reitit-spec` +### `reitit-spec` * Fixes [spec coercion issue with aliased specs](https://github.com/metosin/spec-tools/issues/145) @@ -99,12 +105,12 @@ ## 0.2.6 (2018-11-09) -## `reitit-core` +### `reitit-core` * Faster path-parameter decoding: doing less work when parameters don't need decoding. Wildcard-routing is now 10-15% faster in perf tests (opensensors & github api). * Fixed a ClojureScript compiler warning about private var usage. [#169](https://github.com/metosin/reitit/issues/169) -## `reitit-ring` +### `reitit-ring` * `redirect-trailing-slash-handler` can strip multiple slashes from end of the uri, by [Hannu Hartikainen](https://github.com/dancek). * Fixed a ClojureScript compiler warning about `satisfies?` being a macro. @@ -115,7 +121,7 @@ [ring "1.7.1"] is available but we use "1.7.0" ``` -## `reitit-spec` +### `reitit-spec` * updated deps: @@ -123,7 +129,7 @@ [metosin/spec-tools "0.8.1"] is available but we use "0.8.0" ``` -## `reitit-schema` +### `reitit-schema` * updated deps: @@ -131,7 +137,7 @@ [metosin/schema-tools "0.10.5"] is available but we use "0.10.4" ``` -## `reitit-sieppari` +### `reitit-sieppari` * updated deps: @@ -141,7 +147,7 @@ ## 0.2.5 (2018-10-30) -## `reitit-ring` +### `reitit-ring` * router is injected into request also in the default branch * new `reitit.ring/redirect-trailing-slash-handler` to [handle trailing slashes](https://metosin.github.io/reitit/ring/slash_handler.html) with style! @@ -170,17 +176,17 @@ [ring/ring-core "1.7.1"] is available but we use "1.7.0" ``` -## `reitit-http` +### `reitit-http` * router is injected into request also in the default branch ## 0.2.4 (2018-10-21) -## `reitit-ring` +### `reitit-ring` * New option `:not-found-handler` in `reitit.ring/create-resource-handler` to set how 404 is handled. Fixes [#89](https://github.com/metosin/reitit/issues/89), thanks to [valerauko](https://github.com/valerauko). -## `reitit-spec` +### `reitit-spec` * Latest features from [spec-tools](https://github.com/metosin/spec-tools) * Swagger enchancements @@ -195,7 +201,7 @@ ## 0.2.3 (2018-09-24) -## `reitit-ring` +### `reitit-ring` * `ring-handler` takes optionally a 3rd argument, an options map which can be used to se top-level middleware, applied before any routing is done: @@ -236,13 +242,13 @@ [ring/ring-core "1.7.0"] is available but we use "1.6.3" ``` -## `reitit-http` +### `reitit-http` * `:options` requests are served for all routes by default with 200 OK to better support things like [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) * the default handler is not documented in Swagger * new router option `:reitit.http/default-options-handler` to change this behavior. Setting `nil` disables this. -## `reitit-middleware` +### `reitit-middleware` * fix `reitit.ring.middleware.parameters/parameters-middleware` @@ -252,7 +258,7 @@ [metosin/muuntaja "0.6.1"] is available but we use "0.6.0" ``` -## `reitit-swagger-ui` +### `reitit-swagger-ui` * updated deps: @@ -267,17 +273,17 @@ * [Sieppari, reitit-http & swagger](https://github.com/metosin/reitit/blob/master/examples/http-swagger/src/example/server.clj) * [Pedestal, reitit-http & swagger](https://github.com/metosin/reitit/blob/master/examples/pedestal-swagger/src/example/server.clj) -## `reitit-middleware` +### `reitit-middleware` * new middleware `reitit.ring.middleware.parameters/parameters-middleware` to wrap query & form params. -## `reitit-interceptors` +### `reitit-interceptors` * new module like `reitit-middleware` but for interceptors. See the [Docs](https://metosin.github.io/reitit/http/default_interceptors.html). ## 0.2.1 (2018-09-04) -## `reitit-schema` +### `reitit-schema` * updated deps: @@ -285,7 +291,7 @@ [metosin/schema-tools "0.10.4"] is available but we use "0.10.3" ``` -## `reitit-middleware` +### `reitit-middleware` * updated deps: @@ -303,7 +309,7 @@ Sample apps demonstraing the current status of `reitit`: * [`reitit-http` with Pedestal](https://github.com/metosin/reitit/blob/master/examples/pedestal/src/example/server.clj) * [`reitit-http` with Sieppari](https://github.com/metosin/reitit/blob/master/examples/http/src/example/server.clj) -## `reitit-core` +### `reitit-core` * **BREAKING**: the router option key to extract body format has been renamed: `:extract-request-format` => `:reitit.coercion/extract-request-format` * should only concern you if you are not using [Muuntaja](https://github.com/metosin/muuntaja). @@ -355,7 +361,7 @@ Sample apps demonstraing the current status of `reitit`: ; {:status 200, :body {:bonus 30}} ``` -## `reitit-swagger` +### `reitit-swagger` * In case of just one swagger api per router, the swagger api doesn't have to identified, so this works now: @@ -374,12 +380,12 @@ Sample apps demonstraing the current status of `reitit`: (swagger-ui/create-swagger-ui-handler {:path "/"})) ``` -## `reitit-middleware` +### `reitit-middleware` * A new module with common data-driven middleware: exception handling, content negotiation & multipart requests. See [the docs](https://metosin.github.io/reitit/ring/default_middleware.html). -## `reitit-swagger-ui` +### `reitit-swagger-ui` * **BREAKING**: pass swagger-ui `:config` as-is (instead of mixed-casing keys) to swagger-ui, fixes [#109](https://github.com/metosin/reitit/issues/109): * see [docs](https://github.com/swagger-api/swagger-ui/tree/2.x#parameters) for available parameters. @@ -392,13 +398,13 @@ Sample apps demonstraing the current status of `reitit`: :validatorUrl nil}}) ``` -## `reitit-frontend` +### `reitit-frontend` * new module for frontend-routing. See [docs](https://metosin.github.io/reitit/frontend/basics.html) for details. ## 0.1.3 (2018-6-25) -## `reitit-core` +### `reitit-core` * `reitit.coercion/coerce!` coerced all parameters found in match, e.g. injecting in `:query-parameters` into `Match` with coerce those too if `:query` coercion is defined. * if response coercion is not defined for a response status, response is still returned diff --git a/doc/http/pedestal.md b/doc/http/pedestal.md index ed61ace2..713a0103 100644 --- a/doc/http/pedestal.md +++ b/doc/http/pedestal.md @@ -1,12 +1,23 @@ # Pedestal -[Pedestal](http://pedestal.io/) is a well known interceptor-based web framework for Clojure. To use `reitit-http` with Pedestal, we need to change the default routing interceptor. The needed helpers for this are found in a separate package: +[Pedestal](http://pedestal.io/) is a backend web framework for Clojure. `reitit-pedestal` provides an alternative routing engine for Pedestal. ```clj -[metosin/reitit-ring "0.2.9"] +[metosin/reitit-pedestal "0.2.9"] ``` -You should read the [interceptor guide](interceptors.md) to understand the basics on Interceptor-based dispatch. +Why should one use reitit instead of the Pedestal [default routing](http://pedestal.io/reference/routing-quick-reference)? + +* One simple [route syntax](../basics/route_syntax.md), with full [route conflict resolution](../basics/route_conflicts.md). +* Supports [first class route data](../basics/route_data.md) with [spec validation](../basics/route_data_validation.md). +* Fixes some [known problems](https://github.com/pedestal/pedestal/issues/532) in routing. +* Can handle [trailing backslashes](../ring/slash_handler.md). +* One router for both backend and [frontend](../frontend/basics.md). +* Supports [parameter coercion](../ring/coercion.md) & [Swagger](../ring/swagger.md). +* Is even [faster](../performance.md). + +To use Pedestal with reitit, you should first read both the [Pedestal docs](http://pedestal.io/) and the [reitit interceptor guide](interceptors.md). + ## Example @@ -24,47 +35,38 @@ A minimalistic example on how to to swap the default-router with a reitit router [reitit.http :as http] [reitit.ring :as ring])) -(def router - (pedestal/routing-interceptor - (http/router - ["/ping" (fn [_] {:status 200, :body "pong"})]) - (ring/create-default-handler))) +(def routes + ["/ping" {:get (fn [_] {:status 200, :body "pong"})}]) -(defn start [] - (-> {::server/type :jetty - ::server/port 3000 - ::server/join? false - ;; no pedestal routes - ::server/routes []} - (server/default-interceptors) - ;; swap the reitit router - (pedestal/replace-last-interceptor router) - (server/dev-interceptors) - (server/create-server) - (server/start)) - (println "server running in port 3000")) - -(start) +(-> {::server/type :jetty + ::server/port 3000 + ::server/join? false + ;; no pedestal routes + ::server/routes []} + (server/default-interceptors) + ;; swap the reitit router + (pedestal/replace-last-interceptor + (pedestal/routing-interceptor + (http/router routes))) + (server/dev-interceptors) + (server/create-server) + (server/start)) ``` -## Caveat +## Compatibility -There is no common interceptor spec for Clojure and All default reitit interceptors (coercion, exceptions etc.) use the [Sieppari](https://github.com/metosin/sieppari) interceptor model. For most parts, they are fully compatible with the Pedestal Interceptor model. Only exception being that the `:error` handlers take just 1 arity (`context`) compared to [Pedestal's 2-arity](http://pedestal.io/reference/error-handling) (`context` and `exception`). +There is no common interceptor spec for Clojure and all default reitit interceptors (coercion, exceptions etc.) use the [Sieppari](https://github.com/metosin/sieppari) interceptor model. It is mostly compatible with the Pedestal Interceptor model, only exception being that the `:error` handlers take just 1 arity (`context`) compared to [Pedestal's 2-arity](http://pedestal.io/reference/error-handling) (`context` and `exception`). -Currently, there is only the `reitit.http.interceptors.exception/exception-interceptor` which has `:error` defined - just don't use it and everything should just work. +Currently, out of the reitit default interceptors, there is only the `reitit.http.interceptors.exception/exception-interceptor` which has the `:error` defined. -You are most welcome to discuss about a common interceptor spec in [#interceptors](https://clojurians.slack.com/messages/interceptors/) in [Clojurians Slack](http://clojurians.net/). - -See the [error handling guide](http://pedestal.io/reference/error-handling) on how to handle errors with Pedestal. +You are most welcome to discuss about a common interceptor spec in [#interceptors](https://clojurians.slack.com/messages/interceptors/) on [Clojurians Slack](http://clojurians.net/). ## More examples ### Simple -Simple example, with both sync & async interceptors: https://github.com/metosin/reitit/tree/master/examples/pedestal +Simple example with sync & async interceptors: https://github.com/metosin/reitit/tree/master/examples/pedestal ### Swagger -More complete example with custom interceptors, [default interceptors](default_interceptors.md), [coercion](../coercion/coercion.md) and [swagger](../ring/swagger.md)-support: https://github.com/metosin/reitit/tree/master/examples/pedestal-swagger - -note: exception handling is disabled in this example +More complete example with custom interceptors, [default interceptors](default_interceptors.md), [coercion](../coercion/coercion.md) and [swagger](../ring/swagger.md)-support enabled: https://github.com/metosin/reitit/tree/master/examples/pedestal-swagger diff --git a/modules/reitit-pedestal/project.clj b/modules/reitit-pedestal/project.clj index 8a1ebc89..d57d57c1 100644 --- a/modules/reitit-pedestal/project.clj +++ b/modules/reitit-pedestal/project.clj @@ -8,4 +8,5 @@ :plugins [[lein-parent "0.3.2"]] :parent-project {:path "../../project.clj" :inherit [:deploy-repositories :managed-dependencies]} - :dependencies [[metosin/reitit-http]]) + :dependencies [[io.pedestal/pedestal.service] + [metosin/reitit-http]]) diff --git a/project.clj b/project.clj index 0982a6d9..a0c51beb 100644 --- a/project.clj +++ b/project.clj @@ -23,15 +23,18 @@ [metosin/reitit-frontend "0.2.9"] [metosin/reitit-sieppari "0.2.9"] [metosin/reitit-pedestal "0.2.9"] - [meta-merge "1.0.0"] - [lambdaisland/deep-diff "0.0-25"] - [ring/ring-core "1.7.1"] [metosin/ring-swagger-ui "2.2.10"] [metosin/spec-tools "0.8.2"] [metosin/schema-tools "0.10.5"] [metosin/muuntaja "0.6.3"] [metosin/jsonista "0.2.2"] - [metosin/sieppari "0.0.0-alpha6"]] + [metosin/sieppari "0.0.0-alpha6"] + + [meta-merge "1.0.0"] + [lambdaisland/deep-diff "0.0-25"] + [ring/ring-core "1.7.1"] + + [io.pedestal/pedestal.service "0.5.5"]] :plugins [[jonase/eastwood "0.3.4"] [lein-doo "0.1.11"]