We use Break Versioning. The version numbers follow a <major>.<minor>.<patch>
scheme with the following intent:
Bump | Intent |
---|---|
major |
Major breaking changes -- check the changelog for details. |
minor |
Minor breaking changes -- check the changelog for details. |
patch |
No breaking changes, ever!! |
-SNAPSHOT
versions are preview versions for upcoming releases.
- FIX #334 - Frontend: there is no way to catch the exception if coercion fails (via #549)
- Save three seq constructions #537
- update jackson-databind for CVE-2020-36518 #544
- Balance parenthesis in docs #547
- FIX match-by-path is broken if there are no non-conflicting wildcard routes #538
- Support for Malli Lite Syntax in coercion (enabled by default):
["/add/:id" {:post {:parameters {:path {:id int?}
:query {:a (l/optional int?)}
:body {:id int?
:data {:id (l/maybe int?)
:orders (l/map-of uuid? {:name string?})}}}
:responses {200 {:body {:total pos-int?}}
500 {:description "fail"}}}}]
-
Improved Reitit-frontend function docstrings
-
Updated deps:
[metosin/ring-swagger-ui "4.3.0"] is available but we use "3.46.0"
[metosin/jsonista "0.3.5"] is available but we use "0.3.3"
[metosin/malli "0.8.2"] is available but we use "0.5.1"
[com.fasterxml.jackson.core/jackson-core "2.13.1"] is available but we use "2.12.4"
[com.fasterxml.jackson.core/jackson-databind "2.13.1"] is available but we use "2.12.4"
[fipp "0.6.25"] is available but we use "0.6.24"
[expound "0.9.0"] is available but we use "0.8.9"
[ring/ring-core "1.9.5"] is available but we use "1.9.4"
- recompiled with Java8
- updated deps:
[metosin/ring-swagger-ui "3.46.0"] is available but we use "3.36.0"
[metosin/jsonista "0.3.3"] is available but we use "0.3.1"
[metosin/malli "0.5.1"] is available but we use "0.3.0"
[com.fasterxml.jackson.core/jackson-core "2.12.4"] is available but we use "2.12.1"
[com.fasterxml.jackson.core/jackson-databind "2.12.4"] is available but we use "2.12.1"
[fipp "0.6.24"] is available but we use "0.6.23"
[ring/ring-core "1.9.4"] is available but we use "1.9.1"
[io.pedestal/pedestal.service "0.5.9"] is available but we use "0.5.8"
- Fixes
reitit.ring/create-resource-handler
andreitit.ring/create-file-handler
to support URL-escaped characters. #484. PR #489.
- FIX: Malli response coercision seems to do nothing at all #498
- Enrich request for pedestal/routing-interceptor default-queue #495
- updated deps:
[metosin/malli "0.3.0"] is available but we use "0.2.1"
[metosin/schema-tools "0.12.3"] is available but we use "0.12.2"
[ring/ring-core "1.9.1"] is available but we use "1.9.0"
[metosin/schema-tools "0.12.3"] is available but we use "0.12.2"
[expound "0.8.9"] is available but we use "0.8.7"
[ring "1.9.1"] is available but we use "1.9.0"
- Make reitit.ring/create-resource-handler's
:not-found-handler
work when used outside of a router. #464. PR #471 by Kari Marttila and Metosin Maintenance Mob.
- updated deps:
[metosin/spec-tools "0.10.5"] is available but we use "0.10.4"
[metosin/jsonista "0.3.1"] is available but we use "0.3.0"
[metosin/muuntaja "0.6.8"] is available but we use "0.6.7"
[ring/ring-core "1.9.0"] is available but we use "1.8.2"
[metosin/muuntaja "0.6.8"] is available but we use "0.6.7"
[com.fasterxml.jackson.core/jackson-core "2.12.1"] is available but we use "2.12.0"
[com.fasterxml.jackson.core/jackson-databind "2.12.1"] is available but we use "2.12.0"
- Allow whitespace as separator in route paths. #411. PR #466 by Kimmo Koskinen and Metosin Maintenance Mob.
- updated deps:
[metosin/ring-swagger-ui "3.36.0"] is available but we use "3.25.3"
[metosin/jsonista "0.3.0"] is available but we use "0.2.7"
[com.fasterxml.jackson.core/jackson-core "2.12.0"] is available but we use "2.11.2"
[com.fasterxml.jackson.core/jackson-databind "2.12.0"] is available but we use "2.11.2"
- updated deps:
[metosin/malli "0.2.1] is available but we use "0.2.0"
- fix #445: Malli response coercion failing for
[:sequential string?]
if the response body is an empty vector
reitit.frontend.easy/start!
now correctly removes old event listeners when called repeatedly (e.g. with hot code reload workflow) (#438)
- Add
:conflicting
to route data spec #444.
- updated deps:
[metosin/malli "0.2.0"] is available but we use "0.0.1-20200924.063109-27"
[com.fasterxml.jackson.core/jackson-core "2.11.3"] is available but we use "2.11.2"
[com.fasterxml.jackson.core/jackson-databind "2.11.3"] is available but we use "2.11.2"
[expound "0.8.6"] is available but we use "0.8.5"
[ring/ring-core "1.8.2"] is available but we use "1.8.1"
- Fix resource handler path matching #443
- Automatically publish Swagger
:consumes
for:form
params, fixes #217.
- updated deps:
[metosin/malli "0.0.1-20200924.063109-27"] is available but we use "0.0.1-20200715.082439-21"
[metosin/spec-tools "0.10.4"] is available but we use "0.10.3"
[metosin/jsonista "0.2.7"] is available but we use "0.2.6"
[com.fasterxml.jackson.core/jackson-core "2.11.2"] is available but we use "2.11.0"
[com.fasterxml.jackson.core/jackson-databind "2.11.2"] is available but we use "2.11.0"
:map-of
keys in JSON are correctly decoded using string-decoders- new
:encode-error
option in coercion:
(def coercion
(reitit.coercion.malli/create
{:encode-error (fn [error] {:errors (:humanized error)})}))
; results in... => {:status 400, :body {:errors {:x ["missing required key"]}}}
- recompile with Java8
[metosin/malli "0.0.1-20200715.082439-21"] is available but we use "0.0.1-20200713.080243-20"
[metosin/malli "0.0.1-20200713.080243-20"] is available but we use "0.0.1-20200709.163702-18"
[metosin/malli "0.0.1-20200709.163702-18"] is available but we use "0.0.1-20200525.162645-15"
[metosin/malli "0.0.1-20200525.162645-15"] is available but we use "0.0.1-20200404.091302-14"
- Fixed coercion with
:and
and:or
, fixes #407. - New options to
reitit.coercion.malli/create
::validate
- boolean to indicate whether validation is enabled (true):enabled
- boolean to indicate whether coercion (and validation) is enabled (true)
- If no
:responses
are defined for an endpoint, add{:responses {:default {:description ""}}}
to make swagger spec valid, fixes #403 by 胡雨軒 Петр.
- Coercion middleware will not to mount if the selected
:coercion
is not enabled for the given:parameters
, e.g. "just api-docs"
- Coercion interceptor will not to mount if the selected
:coercion
is not enabled for the given:parameters
, e.g. "just api-docs"
[metosin/sieppari "0.0.0-alpha13"] is available but we use "0.0.0-alpha10"
- new sieppari NOT to include all it's dev dependencies, fixes #402
- re-compile with Java8
-
NOTE Due to issues with Jackson versioning, you might get errors after updating as Cheshire still uses older version as is most likely as a transitive dependency via 3rd party libs. To resolve issues (with Leiningen), you can either:
- move
[metosin/reitit "0.5.0"]
as the first dependency (Lein will pick up the latest versions from there) - add
[metosin/jsonista "0.2.5"]
as the first dependency - add explicit dependencies to
[com.fasterxml.jackson.core/jackson-core "2.11.0"]
and[com.fasterxml.jackson.core/jackson-databind "2.11.0"]
directly
- move
-
Updated deps:
[metosin/sieppari "0.0.0-alpha10"] is available but we use "0.0.0-alpha8"
[metosin/malli "0.0.1-20200404.091302-14"] is available but we use "0.0.1-20200305.102752-13"
[metosin/ring-swagger-ui "3.25.3"] is available but we use "2.2.10"
[metosin/spec-tools "0.10.3"] is available but we use "0.10.0"
[metosin/schema-tools "0.12.2"] is available but we use "0.12.1"
[metosin/muuntaja "0.6.7"] is available but we use "0.6.6"
[metosin/jsonista "0.2.6"] is available but we use "0.2.5"
[com.bhauman/spell-spec "0.1.2"] is available but we use "0.1.1"
[fipp "0.6.23"] is available but we use "0.6.22"
[ring/ring-core "1.8.1"] is available but we use "1.8.0"
- Route conflict resolution and thus, router creation is now an order of magnitude faster.
- Forcing router to be
reitit.core/linear-router
and disabling route conflict resolution totally bypasses route conflict resolution. For cases when router creating speed matters over routing performance:
(r/router ...zillions-of-routes... {:router r/linear-router, :conflicts nil})
reitit.frontend.easy
state is setup before useron-navigate
callback is called the first time, so thatrfe/push-state
and such can be called (#315)
reitit.ring/routes
strips awaynil
routes, fixes #394reitit.ring/create-file-handler
to serve files from filesystem, fixes #395- BREAKING: router option
:reitit.ring/default-options-handler
is deprecated- fails with router creation time error
- use
:reitit.ring/default-options-endpoint
instead, takes an expandable route data instead just of a handler.
- BREAKING: router option
:reitit.http/default-options-handler
is deprecated- fails with router creation time error
- use
:reitit.http/default-options-endpoint
instead, takes an expandable route data instead just of a handler.
- lots of bug fixes, see spec-tools changelog
- Swagger body-parameters don't use empty default, fixes #399
- changes from Sieppari:
- fixed performance regression bugs, order of magnitude faster dispatching
- BREAKING: Out-of-the-box support for
core.async
andmanifold
are dropped, to use them, one needs to explicitely require the following side-effecting namespaces:sieppari.async.core-async
for core.asyncsieppari.async.manifold
for manifold
- default to the new swagger-ui (3.25.3), to get old back add a dependency to:
[metosin/ring-swagger-ui "2.2.10"]
- Updated deps:
[com.fasterxml.jackson.core/jackson-core "2.10.0"]
- Updated deps:
[metosin/reitit-malli "0.4.1"]
- Updated deps:
[metosin/muuntaja "0.6.6"] is available but we use "0.6.5"
[fipp "0.6.22"] is available but we use "0.6.21"
[expound "0.8.4"] is available but we use "0.7.2"
[ring/ring-core "1.8.0"] is available but we use "1.7.1"
[metosin/schema-tools "0.12.1"] is available but we use "0.12.0"
- Added ability to mark individual routes as conflicting by using
:conflicting
route data. See documentation. Fixes #324 - Encode sequential and set values as multi-valued query params (e.g.
{:foo ["bar", "baz"]}
↦foo=bar&foo=baz
).
- Alpha of malli-based coercion! See example project.
- BREAKING:
:body
coercion defaults tospec-tools.core/strip-extra-keys-transformer
, so effectively all non-specceds/keys
keys are stripped also for non-JSON formats.
- BREAKING: Decode multi-valued query params correctly into seqs (e.g.
foo=bar&foo=baz
↦{:foo ["bar", "baz"]}
).- Previously you'd get only the first value. (e.g.
foo=bar&foo=baz
↦{:foo "bar"}
)
- Previously you'd get only the first value. (e.g.
- BREAKING: New validation rule:
:middleware
must be a vector, not a list. Fixes #296. (#319 by Daw-Ran Liou)
- Added support for metosin/ring-http-response to exception middleware. (#342 by Matt Russell)
- Updated deps:
[metosin/spec-tools "0.10.0"] is available but we use "0.9.3"
[metosin/muuntaja "0.6.5"] is available but we use "0.6.4"
[metosin/jsonista "0.2.5"] is available but we use "0.2.3"
[fipp "0.6.21"] is available but we use "0.6.18"
- Html5History: Added
:ignore-anchor-click?
option (#259)- This option can used to provide custom function which determines if clicks in anchor elements are ignored.
- Default logic can be extended by using
reitit.frontend.history/ignore-anchor-click?
in custom function.
- Html5History: Keep URL fragments when handling anchor element clicks (#300)
- Added async support for
default-options-handler
onreitit-ring
, fixes #293
- Updated dependencies:
[metosin/schema-tools "0.12.0"] is available but we use "0.11.0"
[metosin/spec-tools "0.9.3"] is available but we use "0.9.2"
[metosin/jsonista "0.2.3"] is available but we use "0.2.2"
-
Schema coercion supports transformtatins from keywords->clojure, via schema-tools.
-
Add support for explixit selection of router path-parameter
:syntax
, fixes #276
(require '[reitit.core :as r])
;; default
(-> (r/router
["http://localhost:8080/api/user/{id}" ::user-by-id])
(r/match-by-path "http://localhost:8080/api/user/123"))
;#Match{:template "http://localhost:8080/api/user/{id}",
; :data {:name :user/user-by-id},
; :result nil,
; :path-params {:id "123", :8080 ":8080"},
; :path "http://localhost:8080/api/user/123"}
;; just bracket-syntax
(-> (r/router
["http://localhost:8080/api/user/{id}" ::user-by-id]
{:syntax :bracket})
(r/match-by-path "http://localhost:8080/api/user/123"))
;#Match{:template "http://localhost:8080/api/user/{id}",
; :data {:name :user/user-by-id},
; :result nil,
; :path-params {:id "123"},
; :path "http://localhost:8080/api/user/123"}
- Fixed Pedestal Interceptor coercion bug, see #285.
- Fixed a zillion typos in docs by Marcus Spiegel.
- Fix on
reitit.ring/create-default-handler
to support overriding just some handlers, fixes #283, by Daniel Sunnerek.
- MAJOR: Fix bug in Java Trie (since 0.3.0!), which made invalid path parameter parsing in concurrent requests. All Trie implementation classes are final from now on.
- Spec problems are reported correctly in coercion by Kevin W. van Rooijen.
- Better error messages on route data merge error:
(ns user
(:require [reitit.core :as r]
[schema.core :as s]
[reitit.dev.pretty :as pretty]))
(r/router
["/kikka"
{:parameters {:body {:id s/Str}}}
["/kakka"
{:parameters {:body [s/Str]}}]]
{:exception pretty/exception})
; -- Router creation failed -------------------------------------------- user:7 --
;
; Error merging route-data:
;
; -- On route -----------------------
;
; /kikka/kakka
;
; -- Exception ----------------------
;
; Don't know how to create ISeq from: java.lang.Class
;
; {:parameters {:body {:id java.lang.String}}}
;
; {:parameters {:body [java.lang.String]}}
;
; https://cljdoc.org/d/metosin/reitit/CURRENT/doc/basics/route-data
;
; --------------------------------------------------------------------------------
- Updated dependencies:
[metosin/spec-tools "0.9.2"] is available but we use "0.9.0"
[metosin/muuntaja "0.6.4"] is available but we use "0.6.3"
[fipp "0.6.18"] is available but we use "0.6.17"
[lambdaisland/deep-diff "0.0-47"] is available but we use "0.0-25"
- Updated guides on Error Messages & Route-data Validation
- new options
:reitit.spec/wrap
to wrap top-level route data specs when spec validation is enabled. Usingspec-tools.spell/closed
closes top-level specs.- Updated swagger-examples to easily enable closed spec validation
(require '[reitit.core :as r])
(require '[reitit.spec :as rs])
(require '[reitit.dev.pretty :as pretty)
(require '[spec-tools.spell :as spell])
(require '[clojure.spec.alpha :as s])
(s/def ::description string?)
(r/router
["/api" {:summary "kikka"}]
{:validate rs/validate
:spec (s/merge ::rs/default-data (s/keys :req-un [::description]))
::rs/wrap spell/closed
:exception pretty/exception})
- add support for html5 links inside Shadow DOM by Antti Leppänen.
- lot's of React-router examples ported in, thanks to Valtteri Harmainen
- Automatically coerce Sieppari-style 1-arity
:error
handlers into Pedestal-style 2-arity:error
handlers. Thanks to Mathieu MARCHANDISE.
reitit.ring.middleware.dev/print-request-diffs
prints also response diffs.
- Recompiled with Java8 as target, fixes #241.
-
welcome new wildcard routing!
- optional bracket-syntax with parameters
"/user/:user-id"
="/user/{user-id}"
"/assets/*asset"
="/assets/{*asset}
- enabling qualified parameters
"/user/{my.user/id}/{my.order/id}"
- parameters don't have to span whole segments
"/file-:id/topics"
(free start, ends at slash)"/file-{name}.html"
(free start & end)
- backed by a new
:trie-router
, replacing:segment-router
- up to 2x faster on the JVM
- optional bracket-syntax with parameters
-
BREAKING:
reitit.spec/validate-spec!
has been renamed tovalidate
-
With
clojure.spec
coercion, values flow through bothst/coerce
&st/conform
yielding better error messages. Original issue in compojure-api.
- new module for friendly router creation time exception handling
(require '[reitit.core :as r])
(require '[reitit.dev.pretty :as pretty])
(r/router
[["/ping"]
["/:user-id/orders"]
["/bulk/:bulk-id"]
["/public/*path"]
["/:version/status"]]
{:exception pretty/exception})
(require '[reitit.spec :as spec])
(require '[clojure.spec.alpha :as s])
(s/def ::role #{:admin :user})
(s/def ::roles (s/coll-of ::role :into #{}))
(r/router
["/api/admin" {::roles #{:adminz}}]
{:validate spec/validate
:exception pretty/exception})
- Frontend controllers redesigned
- Controller
:params
function has been deprecated - Controller
:identity
function works the same as:params
- New
:parameters
option can be used to declare which parameters controller is interested in, as data, which should cover most use cases:{:start start-fn, :parameters {:path [:foo-id]}}
- Controller
- Ensure HTML5 History routing works with IE11
- Allow Middleware to compile to
nil
with Middleware Registries, fixes to #216. - BREAKING:
reitit.ring.spec/validate-spec!
has been renamed tovalidate
- Allow Interceptors to compile to
nil
with Interceptor Registries, related to #216. - BREAKING:
reitit.http.spec/validate-spec!
has been renamed tovalidate
- updated:
[metosin/spec-tools "0.9.0"] is available but we use "0.8.3"
[metosin/schema-tools "0.11.0"] is available but we use "0.10.5"
- Don't throw
StringIndexOutOfBoundsException
with empty path lookup on wildcard paths, fixes #209
- fixed reflection & boxed math warnings, fixes #207
- fixed arity-error on default routes with
reitit-ring
&reitit-http
when:inject-router?
set tofalse
.
- new guide on pretty printing spec coercion errors with expound, fixes #153.
reitit.core/Expand
can be extended, fixes #201.- new snappy Java-backed
SegmentTrie
routing algorithm and data structure backingreitit.core/segment-router
, making wildcard routing 2x faster on the JVM reitit.core/linear-router
uses the segment router behind the scenes, 2-4x faster on the JVM too.
- new options
:inject-match?
and:inject-router?
onreitit.ring/ring-handler
to optionally not to injectRouter
andMatch
into the request. See performance guide for details.
- new options
:inject-match?
and:inject-router?
onreitit.http/ring-handler
andreitit.http/routing-interceptor
to optionally not to injectRouter
andMatch
into the request. See performance guide for details.
- updated:
[metosin/spec-tools "0.8.3"] is available but we use "0.8.2"
segment-router
doesn't accept empty segments as path-parameters, fixes #181.- path-params are decoded correctly with
r/match-by-name
, fixes #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.
(-> [["/joulu/kinkku"] ;; linear-router
["/joulu/:torttu"] ;; linear-router
["/tonttu/:id"] ;; segment-router
["/manna/puuro"] ;; lookup-router
["/sinappi/silli"]] ;; lookup-router
(r/router {:conflicts nil})
(r/router-name))
; => :quarantine-router
reitit.interceptor/transform-butlast
helper to transform the interceptor chains (last one is usually the handler).
reitit.ring.middleware.dev/print-request-diffs
middleware transformation function to print out request diffs between middleware to the console- read the docs
- see example app
reitit.http.interceptors.dev/print-context-diffs
interceptor transformation function to print out context diffs between interceptor steps to the console:- read the docs
- see example app
- New version of Sieppari allows interceptors to run on ClojureScript too.
- updated:
[metosin/muuntaja "0.6.3"] is available but we use "0.6.1"
[metosin/sieppari "0.0.0-alpha6"] is available but we use "0.0.0-alpha7"
- support for vector data-specs for request & response parameters by Heikki Hämäläinen.
- Added support for composing middleware & interceptor transformations, fixes #167.
- Spec problems are exposed as-is into request & response coercion errors, enabling pretty-printers like expound to be used:
(require '[reitit.ring :as ring])
(require '[reitit.ring.middleware.exception :as exception])
(require '[reitit.ring.coercion :as coercion])
(require '[expound.alpha :as expound])
(defn coercion-error-handler [status]
(let [printer (expound/custom-printer {:theme :figwheel-theme, :print-specs? false})
handler (exception/create-coercion-handler status)]
(fn [exception request]
(printer (-> exception ex-data :problems))
(handler exception request))))
(def app
(ring/ring-handler
(ring/router
["/plus"
{:get
{:parameters {:query {:x int?, :y int?}}
:responses {200 {:body {:total pos-int?}}}
:handler (fn [{{{:keys [x y]} :query} :parameters}]
{:status 200, :body {:total (+ x y)}})}}]
{:data {:coercion reitit.coercion.spec/coercion
:middleware [(exception/create-exception-middleware
(merge
exception/default-handlers
{:reitit.coercion/request-coercion (coercion-error-handler 400)
:reitit.coercion/response-coercion (coercion-error-handler 500)}))
coercion/coerce-request-middleware
coercion/coerce-response-middleware]}})))
(app
{:uri "/plus"
:request-method :get
:query-params {"x" "1", "y" "fail"}})
(app
{:uri "/plus"
:request-method :get
:query-params {"x" "1", "y" "-2"}})
create-swagger-handler
support now 3-arity ring-async, thanks to Miloslav Nenadál
-
updated deps:
[metosin/spec-tools "0.8.2"] is available but we use "0.8.1"
- 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
-
redirect-trailing-slash-handler
can strip multiple slashes from end of the uri, by Hannu Hartikainen. -
Fixed a ClojureScript compiler warning about
satisfies?
being a macro. -
updated deps:
[ring "1.7.1"] is available but we use "1.7.0"
- updated deps:
[metosin/spec-tools "0.8.1"] is available but we use "0.8.0"
- updated deps:
[metosin/schema-tools "0.10.5"] is available but we use "0.10.4"
- updated deps:
[metosin/sieppari "0.0.0-alpha6"] is available but we use "0.0.0-alpha5"
- router is injected into request also in the default branch
- new
reitit.ring/redirect-trailing-slash-handler
to handle trailing slashes with style!
(require '[reitit.ring :as ring])
(def app
(ring/ring-handler
(ring/router
[["/ping" (constantly {:status 200, :body ""})]
["/pong/" (constantly {:status 200, :body ""})]])
(ring/redirect-trailing-slash-handler)))
(app {:uri "/ping/"})
; {:status 308, :headers {"Location" "/ping"}, :body ""}
(app {:uri "/pong"})
; {:status 308, :headers {"Location" "/pong/"}, :body ""}
- updated deps:
[ring/ring-core "1.7.1"] is available but we use "1.7.0"
- router is injected into request also in the default branch
- New option
:not-found-handler
inreitit.ring/create-resource-handler
to set how 404 is handled. Fixes #89, thanks to valerauko.
-
Latest features from spec-tools
- Swagger enhancements
- Better spec coercion via
st/coerce
using spec walking & inference: many simple specs (core predicates,spec-tools.core/spec
,s/and
,s/or
,s/coll-of
,s/keys
,s/map-of
,s/nillable
ands/every
) can be transformed without needing spec to be wrapped. Fallbacks to old conformed based approach. - example app.
-
updated deps:
[metosin/spec-tools "0.8.0"] is available but we use "0.7.1"
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:
(require '[reitit.ring :as ring])
(defn wrap [handler id]
(fn [request]
(handler (update request ::acc (fnil conj []) id))))
(defn handler [{::keys [acc]}]
{:status 200, :body (conj acc :handler)})
(def app
(ring/ring-handler
(ring/router
["/api" {:middleware [[mw :api]]}
["/get" {:get handler}]])
(ring/create-default-handler)
{:middleware [[mw :top]]}))
(app {:request-method :get, :uri "/api/get"})
; {:status 200, :body [:top :api :ok]}
(require '[reitit.core :as r])
(-> app (ring/get-router))
; #object[reitit.core$single_static_path_router]
-
:options
requests are served for all routes by default with 200 OK to better support things like CORS- the default handler is not documented in Swagger
- new router option
:reitit.ring/default-options-handler
to change this behavior. Settingnil
disables this.
-
updated deps:
[ring/ring-core "1.7.0"] is available but we use "1.6.3"
:options
requests are served for all routes by default with 200 OK to better support things like CORS- the default handler is not documented in Swagger
- new router option
:reitit.http/default-options-handler
to change this behavior. Settingnil
disables this.
-
fix
reitit.ring.middleware.parameters/parameters-middleware
-
updated deps:
[metosin/muuntaja "0.6.1"] is available but we use "0.6.0"
- updated deps:
[metosin/jsonista "0.2.2"] is available but we use "0.2.1"
- better documentation for interceptors
- sample apps:
- new middleware
reitit.ring.middleware.parameters/parameters-middleware
to wrap query & form params.
- new module like
reitit-middleware
but for interceptors. See the Docs.
- updated deps:
[metosin/schema-tools "0.10.4"] is available but we use "0.10.3"
- updated deps:
[metosin/muuntaja "0.6.0"] is available but we use "0.6.0-alpha5"
Sample apps demonstrating the current status of reitit
:
reitit-ring
with coercion, swagger and default middlewarereitit-frontend
, the easy wayreitit-frontent
with Keechma-style controllersreitit-http
with Pedestalreitit-http
with Sieppari
- 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.
- the
r/routes
returns just the path + data tuples as documented, not the compiled route results. To get the compiled results, user/compiled-routes
instead. - new faster and more correct encoders and decoders for query & path params.
- all path-parameters are now decoded correctly with
reitit.impl/url-decode
, thanks to Matthew Davidson! - query-parameters are encoded with
reitit.impl/form-encode
, so spaces are+
instead of%20
.
- all path-parameters are now decoded correctly with
- correctly read
:header
params from request:headers
, not:header-params
- welcome route name conflict resolution! If router has routes with same names, router can't be created. fix 'em.
- sequential child routes are allowed, enabling this:
(-> ["/api"
(for [i (range 4)]
[(str "/" i)])]
(r/router)
(r/routes))
;[["/api/0" {}]
; ["/api/1" {}]
; ["/api/2" {}]
; ["/api/3" {}]]
- A Guide to compose routers
- Welcome Middleware and Intercetor Registries!
(require '[reitit.ring :as ring])
(require '[reitit.middleware :as middleware])
(defn wrap-bonus [handler value]
(fn [request]
(handler (update request :bonus (fnil + 0) value))))
(def app
(ring/ring-handler
(ring/router
["/api" {:middleware [[:bonus 20]]}
["/bonus" {:middleware [:bonus10]
:get (fn [{:keys [bonus]}]
{:status 200, :body {:bonus bonus}})}]]
{::middleware/registry {:bonus wrap-bonus
:bonus10 [:bonus 10]}})))
(app {:request-method :get, :uri "/api/bonus"})
; {:status 200, :body {:bonus 30}}
- In case of just one swagger api per router, the swagger api doesn't have to identified, so this works now:
(require '[reitit.ring :as ring])
(require '[reitit.swagger :as swagger])
(require '[reitit.swagger-ui :as swagger-ui])
(ring/ring-handler
(ring/router
[["/ping"
{:get (fn [_] {:status 200, :body "pong"})}]
["/swagger.json"
{:get {:no-doc true
:handler (swagger/create-swagger-handler)}}]])
(swagger-ui/create-swagger-ui-handler {:path "/"}))
- A new module with common data-driven middleware: exception handling, content negotiation & multipart requests. See the docs.
- BREAKING: pass swagger-ui
:config
as-is (instead of mixed-casing keys) to swagger-ui, fixes #109:- see docs for available parameters.
(swagger-ui/create-swagger-ui-handler
{:path "/"
:url "/api/swagger.json"
:config {:jsonEditor true
:validatorUrl nil}})
- new module for frontend-routing. See docs for details.
reitit.coercion/coerce!
coerced all parameters found in match, e.g. injecting in:query-parameters
intoMatch
with coerce those too if:query
coercion is defined.- if response coercion is not defined for a response status, response is still returned
spec-tools.data-spec/maybe
can be used in spec-coercion.
(def router
(reitit.core/router
["/spec" {:coercion reitit.coercion.spec/coercion}
["/:number/:keyword" {:parameters {:path {:number int?
:keyword keyword?}
:query (ds/maybe {:int int?})}}]]
{:compile reitit.coercion/compile-request-coercers}))
(-> (reitit.core/match-by-path router "/spec/10/kikka")
(assoc :query-params {:int "10"})
(reitit.coercion/coerce!))
; {:path {:number 10, :keyword :kikka}
; :query {:int 10}}
reitit.core/match->path
to create full paths from match, including the query parameters:
(require '[reitit.core :as r])
(-> (r/router ["/:a/:b" ::route])
(r/match-by-name! ::route {:a "olipa", :b "kerran"})
(r/match->path))
; "/olipa/kerran"
(-> (r/router ["/:a/:b" ::route])
(r/match-by-name! ::route {:a "olipa", :b "kerran"})
(r/match->path {:iso "pöriläinen"}))
; "/olipa/kerran?iso=p%C3%B6ril%C3%A4inen"
[metosin/spec-tools "0.7.1"]
with swagger generation enhancements, see the CHANGELOG- if response coercion is not defined for a response status, no
:schema
is not emitted. - updated dependencies:
[metosin/spec-tools "0.7.1"] is available but we use "0.7.0"
- if response coercion is not defined for a response status, no
:schema
is not emitted.
- Better handling of
nil
in route syntax:- explicit
nil
after path string is always handled asnil
route nil
as path string causes the whole route to benil
nil
as child route is stripped away
- explicit
(testing "nil routes are stripped"
(is (= [] (r/routes (r/router nil))))
(is (= [] (r/routes (r/router [nil ["/ping"]]))))
(is (= [] (r/routes (r/router [nil [nil] [[nil nil nil]]]))))
(is (= [] (r/routes (r/router ["/ping" [nil "/pong"]])))))
- Use HTTP redirect (302) with index-files in
reitit.ring/create-resource-handler
. reitit.ring/create-default-handler
now conforms to RING Spec, Fixes #83
- updated dependencies:
[metosin/schema-tools "0.10.3"] is available but we use "0.10.2"
- Fix Swagger-paths, by Kirill Chernyshov.
-
Use HTTP redirect (302) with index-files in
reitit.swagger-ui/create-swagger-ui-handler
. -
updated dependencies:
[metosin/jsonista "0.2.1"] is available but we use "0.2.0"
linear-router
now works with unnamed catch-all parameters, e.g."/files/*"
match-by-path
encodes parameters into strings using (internal)reitit.impl/IntoString
protocol. Handles all of: strings, numbers, keywords, booleans, objects. Fixes #75.
(require '[reitit.core :as r])
(r/match-by-name
(r/router
["/coffee/:type" ::coffee])
::coffee
{:type :luwak})
;#Match{:template "/coffee/:type",
; :data {:name :user/coffee},
; :result nil,
; :path-params {:type "luwak"},
; :path "/coffee/luwak"}
-
reitit.ring/default-handler
now works correctly with async ring -
new helper
reitit.ring/router
to compose routes outside of a router. -
reitit.ring/create-resource-handler
function to serve static routes. See docs. -
new dependencies:
[ring/ring-core "1.6.3"]
- New module to produce swagger-docs from routing tree, including
Coercion
definitions. Works with both middleware & interceptors and Schema & Spec. See docs and example project.
New module to server pre-integrated Swagger-ui. See docs.
- new dependencies:
[metosin/jsonista "0.2.0"]
[metosin/ring-swagger-ui "2.2.10"]
[metosin/spec-tools "0.7.0"] is available but we use "0.6.1"
[metosin/schema-tools "0.10.2"] is available but we use "0.10.1"
- First release