reitit/README.md

164 lines
5.2 KiB
Markdown
Raw Normal View History

2017-12-29 10:17:53 +00:00
# reitit [![Build Status](https://travis-ci.org/metosin/reitit.svg?branch=master)](https://travis-ci.org/metosin/reitit)
2017-08-07 11:08:39 +00:00
A friendly data-driven router for Clojure(Script).
2017-08-07 11:08:39 +00:00
* Simple data-driven [route syntax](https://metosin.github.io/reitit/basics/route_syntax.html)
* Route [conflict resolution](https://metosin.github.io/reitit/basics/route_conflicts.html)
2017-11-18 10:47:16 +00:00
* First-class [route data](https://metosin.github.io/reitit/basics/route_data.html)
2017-10-29 07:29:06 +00:00
* Bi-directional routing
2017-12-10 15:50:17 +00:00
* [Pluggable coercion](https://metosin.github.io/reitit/coercion/coercion.html) ([schema](https://github.com/plumatic/schema) & [clojure.spec](https://clojure.org/about/spec))
* Extendable
2017-11-27 06:02:35 +00:00
* Modular
2017-11-01 08:17:57 +00:00
* [Fast](https://metosin.github.io/reitit/performance.html)
2018-02-01 14:32:07 +00:00
The following higher-level routers are also available as separate modules:
* [ring-router](https://metosin.github.io/reitit/ring/ring.html) with [data-driven middleware](https://metosin.github.io/reitit/ring/data_driven_middleware.html)
* http-router with Pedestal-style Interceptors (WIP)
* cljs-router with Keechma-style Controllers (WIP)
2017-12-27 19:35:37 +00:00
2017-11-12 19:44:40 +00:00
See the [full documentation](https://metosin.github.io/reitit/) for details.
2017-08-17 06:24:23 +00:00
2017-08-07 11:08:39 +00:00
## Latest version
2017-11-01 07:29:16 +00:00
All bundled:
2017-11-01 17:03:41 +00:00
```clj
[metosin/reitit "0.1.0-SNAPSHOT"]
```
2017-11-01 07:29:16 +00:00
2017-11-01 17:03:41 +00:00
Optionally, the parts can be required separately:
2017-11-01 07:29:16 +00:00
2017-11-01 17:03:41 +00:00
```clj
[metosin/reitit-core "0.1.0-SNAPSHOT"] ; just the router
[metosin/reitit-ring "0.1.0-SNAPSHOT"] ; ring-router
2017-11-27 06:02:35 +00:00
[metosin/reitit-spec "0.1.0-SNAPSHOT"] ; spec coercion
[metosin/reitit-schema "0.1.0-SNAPSHOT"] ; schema coercion
2017-11-01 17:03:41 +00:00
```
2017-11-01 07:29:16 +00:00
## Quick start
```clj
(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"
2017-11-18 10:47:16 +00:00
; :data {:name ::ping}
; :result nil
2018-02-01 14:23:44 +00:00
; :path-params {}
; :path "/api/ping"}
(r/match-by-name router ::order {:id 2})
; #Match{:template "/api/orders/:id",
2017-11-18 10:47:16 +00:00
;       :data {:name ::order},
; :result nil,
2018-02-01 14:23:44 +00:00
; :path-params {:id 2},
; :path "/api/orders/2"}
```
2017-12-27 19:35:37 +00:00
## Ring example
A Ring routing app with input & output coercion using [data-specs](https://github.com/metosin/spec-tools/blob/master/README.md#data-specs).
```clj
(require '[reitit.ring :as ring])
(require '[reitit.coercion.spec])
2017-12-31 09:29:51 +00:00
(require '[reitit.ring.coercion :as rrc])
2017-12-27 19:35:37 +00:00
(def app
(ring/ring-handler
(ring/router
["/api"
2017-12-31 09:29:51 +00:00
["/math" {:get {:parameters {:query {:x int?, :y int?}}
2017-12-27 19:35:37 +00:00
:responses {200 {:schema {:total pos-int?}}}
:handler (fn [{{{:keys [x y]} :query} :parameters}]
{:status 200
:body {:total (+ x y)}})}}]]
2017-12-31 09:29:51 +00:00
;; router data effecting all routes
{:data {:coercion reitit.coercion.spec/coercion
:middleware [rrc/coerce-exceptions-middleware
rrc/coerce-request-middleware
rrc/coerce-response-middleware]}})))
2017-12-27 19:35:37 +00:00
```
Valid request:
```clj
(app {:request-method :get
:uri "/api/math"
:query-params {:x "1", :y "2"}})
; {:status 200
; :body {:total 3}}
```
Invalid request:
```clj
(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}})",
2017-12-29 10:17:53 +00:00
; :problems [{:path [:y],
; :pred "clojure.core/int?",
; :val "a",
; :via [:$spec20745/y],
2017-12-27 19:35:37 +00:00
; :in [:y]}],
; :value {:x "1", :y "a"},
; :in [:request :query-params]}}
```
2017-11-12 19:44:40 +00:00
## More info
2017-08-07 11:08:39 +00:00
2017-09-14 13:33:36 +00:00
[Check out the full documentation!](https://metosin.github.io/reitit/)
2017-12-29 10:17:53 +00:00
Join [#reitit](https://clojurians.slack.com/messages/reitit/) channel in [Clojurians slack](http://clojurians.net/).
2017-11-12 19:44:40 +00:00
2017-12-29 10:17:53 +00:00
Roadmap is mostly written in [issues](https://github.com/metosin/reitit/issues).
2017-11-12 19:44:40 +00:00
## Special thanks
2017-12-29 10:17:53 +00:00
* Existing Clojure(Script) routing libs, expecially to
[Ataraxy](https://github.com/weavejester/ataraxy), [Bide](https://github.com/funcool/bide), [Bidi](https://github.com/juxt/bidi), [Compojure](https://github.com/weavejester/compojure) and
2017-08-09 07:36:57 +00:00
[Pedestal](https://github.com/pedestal/pedestal/tree/master/route).
2017-12-29 10:17:53 +00:00
* [Compojure-api](https://github.com/metosin/compojure-api), [Kekkonen](https://github.com/metosin/kekkonen), [Ring-swagger](https://github.com/metosin/ring-swagger) and [Yada](https://github.com/juxt/yada) and for ideas, coercion & stuff.
* [Schema](https://github.com/plumatic/schema) and [clojure.spec](https://clojure.org/about/spec) for the formal validation.
2017-09-08 05:29:39 +00:00
## Development instructions
The documentation is built with [gitbook](https://toolchain.gitbook.com). To preview your changes locally:
```bash
npm install -g gitbook-cli
2017-09-18 04:36:02 +00:00
gitbook install
gitbook serve
```
To bump up version:
2017-10-29 07:30:48 +00:00
```bash
# new version
./scripts/set-version "1.0.0"
./scripts/lein-modules install
# works
lein test
# deploy to clojars
./scripts/lein-modules do clean, deploy clojars
```
2017-08-07 11:08:39 +00:00
## License
Copyright © 2017 [Metosin Oy](http://www.metosin.fi)
2017-08-07 11:08:39 +00:00
Distributed under the Eclipse Public License, the same as Clojure.