A fast data-driven routing library for Clojure/Script
Find a file
Toni Vanhala 6bf4335f84 Add tests for intermediate paths in Ring
Added failing tests for resolving intermediate paths with Ring.
Handlers are inherited by children, but names are consumed by intermediate routes
See Github issue #175
2019-12-04 16:33:38 +02:00
.circleci Revert "Remove unused parameters" 2019-10-30 11:33:24 +02:00
dev-resources test perf with different json 2018-08-25 13:28:44 +03:00
doc Allow path conflict resolution with :conflicting 2019-11-13 22:49:21 +02:00
examples Add integrant repl for better development experience 2019-10-27 20:15:54 +02:00
modules Implement encoding of multi-valued query params. 2019-12-02 15:33:55 +02:00
perf-test/clj/reitit Merge pull request #263 from metosin/north 2019-05-10 14:28:39 +03:00
scripts New reitit-dev module for pretty errors 2019-03-03 20:54:21 +02:00
test Add tests for intermediate paths in Ring 2019-12-04 16:33:38 +02:00
.gitignore Create example 2018-07-12 12:46:41 +03:00
book.json initial rework 2018-09-02 19:23:18 +03:00
CHANGELOG.md Update CHANGELOG. 2019-12-02 15:41:59 +02:00
CONTRIBUTING.md Fix typos 2019-05-22 19:17:10 +02:00
LICENSE Initial commit 2017-08-07 14:15:45 +03:00
package-lock.json Update JS testing dependencies 2019-06-08 14:00:20 +03:00
package.json Update JS testing dependencies 2019-06-08 14:00:20 +03:00
project.clj 0.3.10 2019-10-08 10:28:25 +03:00
README.md Update README.md 2019-10-30 16:37:58 +02:00

reitit Build Status cljdoc badge Slack

A fast data-driven router for Clojure(Script).

Presentations:

Full Documentation

There is #reitit in Clojurians Slack for discussion & help.

Main Modules

  • reitit - all bundled
  • reitit-core - the routing core
  • reitit-ring - a ring router
  • reitit-middleware - common middleware
  • reitit-spec clojure.spec coercion
  • reitit-schema Schema coercion
  • reitit-swagger Swagger2 apidocs
  • reitit-swagger-ui Integrated Swagger UI
  • reitit-frontend Tools for frontend routing
  • reitit-http http-routing with Interceptors
  • reitit-interceptors - common interceptors
  • reitit-sieppari support for Sieppari
  • reitit-dev - development utilities

Extra modules

Latest version

All main modules bundled:

[metosin/reitit "0.3.10"]

Optionally, the parts can be required separately.

Quick start

(require '[reitit.core :as r])

(def router
  (r/router
    [["/api/ping" ::ping]
     ["/api/orders/:id" ::order]]))

(r/match-by-path router "/api/ping")
; #Match{:template "/api/ping"
;        :data {:name ::ping}
;        :result nil
;        :path-params {}
;        :path "/api/ping"}

(r/match-by-name router ::order {:id 2})
; #Match{:template "/api/orders/:id",
;        :data {:name ::order},
;        :result nil,
;        :path-params {:id 2},
;        :path "/api/orders/2"}

Ring example

A Ring routing app with input & output coercion using data-specs.

(require '[reitit.ring :as ring])
(require '[reitit.coercion.spec])
(require '[reitit.ring.coercion :as rrc])

(def app
  (ring/ring-handler
    (ring/router
      ["/api"
       ["/math" {: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)}})}}]]
      ;; router data effecting all routes
      {:data {:coercion reitit.coercion.spec/coercion
              :middleware [rrc/coerce-exceptions-middleware
                           rrc/coerce-request-middleware
                           rrc/coerce-response-middleware]}})))

Valid request:

(app {:request-method :get
      :uri "/api/math"
      :query-params {:x "1", :y "2"}})
; {:status 200
;  :body {:total 3}}

Invalid request:

(app {:request-method :get
      :uri "/api/math"
      :query-params {:x "1", :y "a"}})
;{:status 400,
; :body {:type :reitit.coercion/request-coercion,
;        :coercion :spec,
;        :spec "(spec-tools.core/spec {:spec (clojure.spec.alpha/keys :req-un [:$spec20745/x :$spec20745/y]), :type :map, :keys #{:y :x}, :keys/req #{:y :x}})",
;        :problems [{:path [:y],
;                    :pred "clojure.core/int?",
;                    :val "a",
;                    :via [:$spec20745/y],
;                    :in [:y]}],
;        :value {:x "1", :y "a"},
;        :in [:request :query-params]}}

More examples

All examples are in https://github.com/metosin/reitit/tree/master/examples

More info

Check out the full documentation!

Join #reitit channel in Clojurians slack.

Roadmap is mostly written in issues.

Special thanks

License

Copyright © 2017-2019 Metosin Oy

Distributed under the Eclipse Public License, the same as Clojure.