mirror of
https://github.com/metosin/reitit.git
synced 2025-12-16 16:01:11 +00:00
0.7.0-alpha1
This commit is contained in:
parent
a3ab5714cb
commit
3336880b01
51 changed files with 272 additions and 83 deletions
|
|
@ -12,7 +12,7 @@ We use [Break Versioning][breakver]. The version numbers follow a `<major>.<mino
|
|||
|
||||
[breakver]: https://github.com/ptaoussanis/encore/blob/master/BREAK-VERSIONING.md
|
||||
|
||||
## UNRELEASED
|
||||
## 0.7.0-alpha1 (2023-05-03)
|
||||
|
||||
* Initial Openapi3 support. See [docs](./doc/ring/openapi.md). Works for simple cases but might still have some rough edges. [#84](https://github.com/metosin/reitit/issues/84)
|
||||
* Frontend: provide easy way to update current query params. [#600](https://github.com/metosin/reitit/issues/600)
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ There is [#reitit](https://clojurians.slack.com/messages/reitit/) in [Clojurians
|
|||
All main modules bundled:
|
||||
|
||||
```clj
|
||||
[metosin/reitit "0.6.0"]
|
||||
[metosin/reitit "0.7.0-alpha1"]
|
||||
```
|
||||
|
||||
Optionally, the parts can be required separately.
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ There is [#reitit](https://clojurians.slack.com/messages/reitit/) in [Clojurians
|
|||
All bundled:
|
||||
|
||||
```clj
|
||||
[metosin/reitit "0.6.0"]
|
||||
[metosin/reitit "0.7.0-alpha1"]
|
||||
```
|
||||
|
||||
Optionally, the parts can be required separately.
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ The default exception formatting uses `reitit.exception/exception`. It produces
|
|||
## Pretty Errors
|
||||
|
||||
```clj
|
||||
[metosin/reitit-dev "0.6.0"]
|
||||
[metosin/reitit-dev "0.7.0-alpha1"]
|
||||
```
|
||||
|
||||
For human-readable and developer-friendly exception messages, there is `reitit.dev.pretty/exception` (in the `reitit-dev` module). It is inspired by the lovely errors messages of [ELM](https://elm-lang.org/blog/compiler-errors-for-humans) and [ETA](https://twitter.com/jyothsnasrin/status/1037703436043603968) and uses [fipp](https://github.com/brandonbloom/fipp), [expound](https://github.com/bhb/expound) and [spell-spec](https://github.com/bhauman/spell-spec) for most of heavy lifting.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Default Interceptors
|
||||
|
||||
```clj
|
||||
[metosin/reitit-interceptors "0.6.0"]
|
||||
[metosin/reitit-interceptors "0.7.0-alpha1"]
|
||||
```
|
||||
|
||||
Just like the [ring default middleware](../ring/default_middleware.md), but for interceptors.
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ Reitit has also support for [interceptors](http://pedestal.io/reference/intercep
|
|||
## Reitit-http
|
||||
|
||||
```clj
|
||||
[metosin/reitit-http "0.6.0"]
|
||||
[metosin/reitit-http "0.7.0-alpha1"]
|
||||
```
|
||||
|
||||
A module for http-routing using interceptors instead of middleware. Builds on top of the [`reitit-ring`](../ring/ring.md) module having all the same features.
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
[Pedestal](http://pedestal.io/) is a backend web framework for Clojure. `reitit-pedestal` provides an alternative routing engine for Pedestal.
|
||||
|
||||
```clj
|
||||
[metosin/reitit-pedestal "0.6.0"]
|
||||
[metosin/reitit-pedestal "0.7.0-alpha1"]
|
||||
```
|
||||
|
||||
Why should one use reitit instead of the Pedestal [default routing](http://pedestal.io/reference/routing-quick-reference)?
|
||||
|
|
@ -26,8 +26,8 @@ A minimalistic example on how to to swap the default-router with a reitit router
|
|||
```clj
|
||||
; [io.pedestal/pedestal.service "0.5.5"]
|
||||
; [io.pedestal/pedestal.jetty "0.5.5"]
|
||||
; [metosin/reitit-pedestal "0.6.0"]
|
||||
; [metosin/reitit "0.6.0"]
|
||||
; [metosin/reitit-pedestal "0.7.0-alpha1"]
|
||||
; [metosin/reitit "0.7.0-alpha1"]
|
||||
|
||||
(require '[io.pedestal.http :as server])
|
||||
(require '[reitit.pedestal :as pedestal])
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Sieppari
|
||||
|
||||
```clj
|
||||
[metosin/reitit-sieppari "0.6.0"]
|
||||
[metosin/reitit-sieppari "0.7.0-alpha1"]
|
||||
```
|
||||
|
||||
[Sieppari](https://github.com/metosin/sieppari) is a new and fast interceptor implementation for Clojure, with pluggable async supporting [core.async](https://github.com/clojure/core.async), [Manifold](https://github.com/ztellman/manifold) and [Promesa](http://funcool.github.io/promesa/latest).
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ There is an extra option in http-router (actually, in the underlying interceptor
|
|||
### Printing Context Diffs
|
||||
|
||||
```clj
|
||||
[metosin/reitit-interceptors "0.6.0"]
|
||||
[metosin/reitit-interceptors "0.7.0-alpha1"]
|
||||
```
|
||||
|
||||
Using `reitit.http.interceptors.dev/print-context-diffs` transformation, the context diffs between each interceptor are printed out to the console. To use it, add the following router option:
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Default Middleware
|
||||
|
||||
```clj
|
||||
[metosin/reitit-middleware "0.6.0"]
|
||||
[metosin/reitit-middleware "0.7.0-alpha1"]
|
||||
```
|
||||
|
||||
Any Ring middleware can be used with `reitit-ring`, but using data-driven middleware is preferred as they are easier to manage and in many cases yield better performance. `reitit-middleware` contains a set of common ring middleware, lifted into data-driven middleware.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Exception Handling with Ring
|
||||
|
||||
```clj
|
||||
[metosin/reitit-middleware "0.6.0"]
|
||||
[metosin/reitit-middleware "0.7.0-alpha1"]
|
||||
```
|
||||
|
||||
Exceptions thrown in router creation can be [handled with custom exception handler](../basics/error_messages.md). By default, exceptions thrown at runtime from a handler or a middleware are not caught by the `reitit.ring/ring-handler`. A good practice is to have a top-level exception handler to log and format errors for clients.
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
Read more about the [Ring Concepts](https://github.com/ring-clojure/ring/wiki/Concepts).
|
||||
|
||||
```clj
|
||||
[metosin/reitit-ring "0.6.0"]
|
||||
[metosin/reitit-ring "0.7.0-alpha1"]
|
||||
```
|
||||
|
||||
## `reitit.ring/router`
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Swagger Support
|
||||
|
||||
```
|
||||
[metosin/reitit-swagger "0.6.0"]
|
||||
[metosin/reitit-swagger "0.7.0-alpha1"]
|
||||
```
|
||||
|
||||
Reitit supports [Swagger2](https://swagger.io/) documentation, thanks to [schema-tools](https://github.com/metosin/schema-tools) and [spec-tools](https://github.com/metosin/spec-tools). Documentation is extracted from route definitions, coercion `:parameters` and `:responses` and from a set of new documentation keys.
|
||||
|
|
@ -47,7 +47,7 @@ If you need to post-process the generated spec, just wrap the handler with a cus
|
|||
[Swagger-ui](https://github.com/swagger-api/swagger-ui) is a user interface to visualize and interact with the Swagger specification. To make things easy, there is a pre-integrated version of the swagger-ui as a separate module.
|
||||
|
||||
```
|
||||
[metosin/reitit-swagger-ui "0.6.0"]
|
||||
[metosin/reitit-swagger-ui "0.7.0-alpha1"]
|
||||
```
|
||||
|
||||
`reitit.swagger-ui/create-swagger-ui-handler` can be used to create a ring-handler to serve the swagger-ui. It accepts the following options:
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ There is an extra option in the Ring router (actually, in the underlying middlew
|
|||
### Printing Request Diffs
|
||||
|
||||
```clj
|
||||
[metosin/reitit-middleware "0.6.0"]
|
||||
[metosin/reitit-middleware "0.7.0-alpha1"]
|
||||
```
|
||||
|
||||
Using `reitit.ring.middleware.dev/print-request-diffs` transformation, the request diffs between each middleware are printed out to the console. To use it, add the following router option:
|
||||
|
|
|
|||
|
|
@ -2,6 +2,6 @@
|
|||
:description "Reitit Buddy Auth App"
|
||||
:dependencies [[org.clojure/clojure "1.10.1"]
|
||||
[ring/ring-jetty-adapter "1.8.1"]
|
||||
[metosin/reitit "0.6.0"]
|
||||
[metosin/reitit "0.7.0-alpha1"]
|
||||
[buddy "2.0.0"]]
|
||||
:repl-options {:init-ns example.server})
|
||||
|
|
|
|||
|
|
@ -10,9 +10,9 @@
|
|||
[ring "1.7.1"]
|
||||
[hiccup "1.0.5"]
|
||||
[org.clojure/clojurescript "1.10.439"]
|
||||
[metosin/reitit "0.6.0"]
|
||||
[metosin/reitit-schema "0.6.0"]
|
||||
[metosin/reitit-frontend "0.6.0"]
|
||||
[metosin/reitit "0.7.0-alpha1"]
|
||||
[metosin/reitit-schema "0.7.0-alpha1"]
|
||||
[metosin/reitit-frontend "0.7.0-alpha1"]
|
||||
;; Just for pretty printting the match
|
||||
[fipp "0.6.14"]]
|
||||
|
||||
|
|
|
|||
|
|
@ -10,9 +10,9 @@
|
|||
[ring "1.7.1"]
|
||||
[hiccup "1.0.5"]
|
||||
[org.clojure/clojurescript "1.10.439"]
|
||||
[metosin/reitit "0.6.0"]
|
||||
[metosin/reitit-schema "0.6.0"]
|
||||
[metosin/reitit-frontend "0.6.0"]
|
||||
[metosin/reitit "0.7.0-alpha1"]
|
||||
[metosin/reitit-schema "0.7.0-alpha1"]
|
||||
[metosin/reitit-frontend "0.7.0-alpha1"]
|
||||
;; Just for pretty printting the match
|
||||
[fipp "0.6.14"]]
|
||||
|
||||
|
|
|
|||
|
|
@ -10,9 +10,9 @@
|
|||
[ring "1.7.1"]
|
||||
[hiccup "1.0.5"]
|
||||
[org.clojure/clojurescript "1.10.520"]
|
||||
[metosin/reitit "0.6.0"]
|
||||
[metosin/reitit-spec "0.6.0"]
|
||||
[metosin/reitit-frontend "0.6.0"]
|
||||
[metosin/reitit "0.7.0-alpha1"]
|
||||
[metosin/reitit-spec "0.7.0-alpha1"]
|
||||
[metosin/reitit-frontend "0.7.0-alpha1"]
|
||||
;; Just for pretty printting the match
|
||||
[fipp "0.6.14"]]
|
||||
|
||||
|
|
|
|||
|
|
@ -10,9 +10,9 @@
|
|||
[ring "1.7.1"]
|
||||
[hiccup "1.0.5"]
|
||||
[org.clojure/clojurescript "1.10.520"]
|
||||
[metosin/reitit "0.6.0"]
|
||||
[metosin/reitit-spec "0.6.0"]
|
||||
[metosin/reitit-frontend "0.6.0"]
|
||||
[metosin/reitit "0.7.0-alpha1"]
|
||||
[metosin/reitit-spec "0.7.0-alpha1"]
|
||||
[metosin/reitit-frontend "0.7.0-alpha1"]
|
||||
;; Just for pretty printting the match
|
||||
[fipp "0.6.14"]]
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
(defproject frontend-re-frame "0.1.0-SNAPSHOT"
|
||||
:dependencies [[org.clojure/clojure "1.10.0"]
|
||||
[org.clojure/clojurescript "1.10.520"]
|
||||
[metosin/reitit "0.6.0"]
|
||||
[metosin/reitit "0.7.0-alpha1"]
|
||||
[reagent "0.8.1"]
|
||||
[re-frame "0.10.6"]]
|
||||
|
||||
|
|
|
|||
|
|
@ -10,9 +10,9 @@
|
|||
[ring "1.8.1"]
|
||||
[hiccup "1.0.5"]
|
||||
[org.clojure/clojurescript "1.10.773"]
|
||||
[metosin/reitit "0.6.0"]
|
||||
[metosin/reitit-spec "0.6.0"]
|
||||
[metosin/reitit-frontend "0.6.0"]
|
||||
[metosin/reitit "0.7.0-alpha1"]
|
||||
[metosin/reitit-spec "0.7.0-alpha1"]
|
||||
[metosin/reitit-frontend "0.7.0-alpha1"]
|
||||
;; Just for pretty printting the match
|
||||
[fipp "0.6.23"]]
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,6 @@
|
|||
:dependencies [[org.clojure/clojure "1.10.0"]
|
||||
[ring/ring-jetty-adapter "1.7.1"]
|
||||
[aleph "0.4.7-alpha5"]
|
||||
[metosin/reitit "0.6.0"]
|
||||
[metosin/reitit "0.7.0-alpha1"]
|
||||
[metosin/ring-swagger-ui "5.0.0-alpha.0"]]
|
||||
:repl-options {:init-ns example.server})
|
||||
|
|
|
|||
|
|
@ -5,5 +5,5 @@
|
|||
[funcool/promesa "1.9.0"]
|
||||
[manifold "0.1.8"]
|
||||
[ring/ring-jetty-adapter "1.7.1"]
|
||||
[metosin/reitit "0.6.0"]]
|
||||
[metosin/reitit "0.7.0-alpha1"]]
|
||||
:repl-options {:init-ns example.server})
|
||||
|
|
|
|||
|
|
@ -2,4 +2,4 @@
|
|||
:description "Reitit coercion with vanilla ring"
|
||||
:dependencies [[org.clojure/clojure "1.10.0"]
|
||||
[ring/ring-jetty-adapter "1.7.1"]
|
||||
[metosin/reitit "0.6.0"]])
|
||||
[metosin/reitit "0.7.0-alpha1"]])
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
:dependencies [[org.clojure/clojure "1.10.0"]
|
||||
[io.pedestal/pedestal.service "0.5.5"]
|
||||
[io.pedestal/pedestal.jetty "0.5.5"]
|
||||
[metosin/reitit-malli "0.6.0"]
|
||||
[metosin/reitit-pedestal "0.6.0"]
|
||||
[metosin/reitit "0.6.0"]]
|
||||
[metosin/reitit-malli "0.7.0-alpha1"]
|
||||
[metosin/reitit-pedestal "0.7.0-alpha1"]
|
||||
[metosin/reitit "0.7.0-alpha1"]]
|
||||
:repl-options {:init-ns server})
|
||||
|
|
|
|||
|
|
@ -3,6 +3,6 @@
|
|||
:dependencies [[org.clojure/clojure "1.10.0"]
|
||||
[io.pedestal/pedestal.service "0.5.5"]
|
||||
[io.pedestal/pedestal.jetty "0.5.5"]
|
||||
[metosin/reitit-pedestal "0.6.0"]
|
||||
[metosin/reitit "0.6.0"]]
|
||||
[metosin/reitit-pedestal "0.7.0-alpha1"]
|
||||
[metosin/reitit "0.7.0-alpha1"]]
|
||||
:repl-options {:init-ns example.server})
|
||||
|
|
|
|||
|
|
@ -3,6 +3,6 @@
|
|||
:dependencies [[org.clojure/clojure "1.10.0"]
|
||||
[io.pedestal/pedestal.service "0.5.5"]
|
||||
[io.pedestal/pedestal.jetty "0.5.5"]
|
||||
[metosin/reitit-pedestal "0.6.0"]
|
||||
[metosin/reitit "0.6.0"]]
|
||||
[metosin/reitit-pedestal "0.7.0-alpha1"]
|
||||
[metosin/reitit "0.7.0-alpha1"]]
|
||||
:repl-options {:init-ns example.server})
|
||||
|
|
|
|||
|
|
@ -2,5 +2,5 @@
|
|||
:description "Reitit Ring App"
|
||||
:dependencies [[org.clojure/clojure "1.10.0"]
|
||||
[ring/ring-jetty-adapter "1.7.1"]
|
||||
[metosin/reitit "0.6.0"]]
|
||||
[metosin/reitit "0.7.0-alpha1"]]
|
||||
:repl-options {:init-ns example.server})
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
:description "Reitit Ring App with Integrant"
|
||||
:dependencies [[org.clojure/clojure "1.10.1"]
|
||||
[ring/ring-jetty-adapter "1.7.1"]
|
||||
[metosin/reitit "0.6.0"]
|
||||
[metosin/reitit "0.7.0-alpha1"]
|
||||
[integrant "0.7.0"]]
|
||||
:main example.server
|
||||
:repl-options {:init-ns user}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,6 @@
|
|||
:dependencies [[org.clojure/clojure "1.10.0"]
|
||||
[metosin/jsonista "0.2.6"]
|
||||
[ring/ring-jetty-adapter "1.7.1"]
|
||||
[metosin/reitit "0.6.0"]]
|
||||
[metosin/reitit "0.7.0-alpha1"]]
|
||||
:repl-options {:init-ns example.server}
|
||||
:profiles {:dev {:dependencies [[ring/ring-mock "0.3.2"]]}})
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
:dependencies [[org.clojure/clojure "1.10.0"]
|
||||
[metosin/jsonista "0.2.6"]
|
||||
[ring/ring-jetty-adapter "1.7.1"]
|
||||
[metosin/reitit "0.6.0"]
|
||||
[metosin/reitit "0.7.0-alpha1"]
|
||||
[metosin/ring-swagger-ui "5.0.0-alpha.0"]]
|
||||
:repl-options {:init-ns example.server}
|
||||
:profiles {:dev {:dependencies [[ring/ring-mock "0.3.2"]]}})
|
||||
|
|
|
|||
|
|
@ -2,6 +2,6 @@
|
|||
:description "Reitit Ring App with Swagger"
|
||||
:dependencies [[org.clojure/clojure "1.10.0"]
|
||||
[ring/ring-jetty-adapter "1.7.1"]
|
||||
[metosin/reitit "0.6.0"]]
|
||||
[metosin/reitit "0.7.0-alpha1"]]
|
||||
:repl-options {:init-ns example.server}
|
||||
:profiles {:dev {:dependencies [[ring/ring-mock "0.3.2"]]}})
|
||||
|
|
|
|||
|
|
@ -2,5 +2,5 @@
|
|||
:description "Reitit Ring App with Swagger"
|
||||
:dependencies [[org.clojure/clojure "1.10.0"]
|
||||
[ring/ring-jetty-adapter "1.7.1"]
|
||||
[metosin/reitit "0.6.0"]]
|
||||
[metosin/reitit "0.7.0-alpha1"]]
|
||||
:repl-options {:init-ns example.server})
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-core "0.6.0"
|
||||
(defproject metosin/reitit-core "0.7.0-alpha1"
|
||||
:description "Snappy data-driven router for Clojure(Script)"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
189
modules/reitit-core/src/ctrl/merge.cljc
Normal file
189
modules/reitit-core/src/ctrl/merge.cljc
Normal file
|
|
@ -0,0 +1,189 @@
|
|||
(ns ctrl.merge
|
||||
(:refer-clojure :exclude [merge])
|
||||
(:require [clojure.core :as c]
|
||||
[clojure.set :as set]))
|
||||
|
||||
(defn- meta* [obj]
|
||||
(if #?(:clj (instance? clojure.lang.IObj obj)
|
||||
:cljs (satisfies? IMeta obj))
|
||||
(meta obj)))
|
||||
|
||||
(defn- with-meta* [obj m]
|
||||
(if #?(:clj (instance? clojure.lang.IObj obj)
|
||||
:cljs (satisfies? IWithMeta obj))
|
||||
(with-meta obj m)
|
||||
obj))
|
||||
|
||||
(defn- displace? [obj]
|
||||
(-> obj meta* :displace))
|
||||
|
||||
(defn- replace? [obj]
|
||||
(-> obj meta* :replace))
|
||||
|
||||
(defn- top-displace? [obj]
|
||||
(-> obj meta* :top-displace))
|
||||
|
||||
(defn- different-priority? [left right]
|
||||
(boolean (or (some (some-fn nil? displace? replace?) [left right])
|
||||
(top-displace? left))))
|
||||
|
||||
(defn- remove-top-displace [obj {:keys [::replace-nil]}]
|
||||
(cond replace-nil nil
|
||||
(top-displace? obj) obj
|
||||
:else (vary-meta obj dissoc :top-displace)))
|
||||
|
||||
(defn- pick-prioritized [left right options]
|
||||
(cond (nil? left) right
|
||||
(nil? right) (remove-top-displace left options)
|
||||
|
||||
(top-displace? left) right
|
||||
|
||||
(and (displace? left) ;; Pick the rightmost
|
||||
(displace? right)) ;; if both are marked as displaceable
|
||||
(with-meta* right
|
||||
(c/merge (meta* left) (meta* right)))
|
||||
|
||||
(and (replace? left) ;; Pick the rightmost
|
||||
(replace? right)) ;; if both are marked as replaceable
|
||||
(with-meta* right
|
||||
(c/merge (meta* left) (meta* right)))
|
||||
|
||||
(or (displace? left)
|
||||
(replace? right))
|
||||
(with-meta* right
|
||||
(c/merge (-> left meta* (dissoc :displace))
|
||||
(-> right meta* (dissoc :replace))))
|
||||
|
||||
(or (replace? left)
|
||||
(displace? right))
|
||||
(with-meta* left
|
||||
(c/merge (-> right meta* (dissoc :displace))
|
||||
(-> left meta* (dissoc :replace))))))
|
||||
|
||||
(defn find-custom-merge [path path-map]
|
||||
(letfn [(match [x f] (cond (keyword? f) (= x f) (or (fn? f) (ifn? f)) (f x)))]
|
||||
(reduce (fn [_ [ps f]] (let [match (loop [[p & pr] path, [pp & ppr] ps]
|
||||
(cond (and p pp (match p pp)) (recur pr ppr)
|
||||
(= nil p pp) true))]
|
||||
(when match (reduced f)))) nil path-map)))
|
||||
|
||||
;;
|
||||
;; public api
|
||||
;;
|
||||
|
||||
(defn any [_] true)
|
||||
|
||||
(defn merge
|
||||
([] {})
|
||||
([left] left)
|
||||
([left right] (merge left right nil))
|
||||
([left right {:keys [::path ::path-map] :as options}]
|
||||
(let [custom-merge (find-custom-merge path path-map)]
|
||||
(cond
|
||||
(different-priority? left right)
|
||||
(pick-prioritized left right options)
|
||||
|
||||
custom-merge
|
||||
(custom-merge left right options)
|
||||
|
||||
(and (map? left) (map? right))
|
||||
(let [merge-entry (fn [m e]
|
||||
(let [k (key e) v (val e)]
|
||||
(if (contains? m k)
|
||||
(assoc m k (merge (get m k) v (update options ::path (fnil conj []) k)))
|
||||
(assoc m k v))))
|
||||
merge2 (fn [m1 m2]
|
||||
(reduce merge-entry (or m1 {}) (seq m2)))]
|
||||
(reduce merge2 [left right]))
|
||||
|
||||
(and (set? left) (set? right))
|
||||
(set/union right left)
|
||||
|
||||
(and (coll? left) (coll? right))
|
||||
(if (or (-> left meta :prepend)
|
||||
(-> right meta :prepend))
|
||||
(-> (into (empty left) (concat right left))
|
||||
(with-meta (c/merge (meta left)
|
||||
(select-keys (meta right) [:displace]))))
|
||||
(into (empty left) (concat left right)))
|
||||
|
||||
:else right))))
|
||||
|
||||
;;
|
||||
;; spike
|
||||
;;
|
||||
|
||||
(comment
|
||||
(merge
|
||||
{:parameters {:query {:x 1}}}
|
||||
{:parameters {:query nil}}
|
||||
{::replace-nil true}))
|
||||
|
||||
(ns demo2)
|
||||
|
||||
(require '[reitit.ring :as ring]
|
||||
'[malli.util :as mu]
|
||||
'[reitit.core :as r]
|
||||
'[ctrl.merge :as cm])
|
||||
|
||||
(defn ring-path-map [f]
|
||||
[[[:parameters cm/any] f]
|
||||
[[ring/http-methods :parameters cm/any] f]
|
||||
[[:responses cm/any :body] f]
|
||||
[[ring/http-methods :responses cm/any :body] f]])
|
||||
|
||||
(defn malli-merge [x y _] (mu/merge x y))
|
||||
|
||||
(-> (ring/router
|
||||
["/api" {:parameters {:header [:map ["Api" :string]]}}
|
||||
["/math/:x" {:parameters {:path [:map [:x :int]]
|
||||
:query [:map [:b :string]]
|
||||
:header [:map ["Math" :string]]}
|
||||
:responses {200 {:body [:map [:total :int]]}
|
||||
500 {:description "fail"}}}
|
||||
["/plus/:y" {:get {:parameters {:query ^:replace [:map [:a :int]]
|
||||
:body [:map [:b :int]]
|
||||
:header [:map ["Plus" :string]]
|
||||
:path [:map [:y :int]]}
|
||||
:responses {200 {:body [:map [:total2 :int]]}
|
||||
500 {:description "fail"}}
|
||||
:handler (constantly {:status 200, :body "ok"})}}]]]
|
||||
{:meta-merge #(cm/merge %1 %2 {::cm/path-map (ring-path-map malli-merge)})})
|
||||
(ring/ring-handler)
|
||||
(ring/get-router)
|
||||
(r/compiled-routes)
|
||||
(last)
|
||||
(last)
|
||||
:get
|
||||
:data)
|
||||
;{:parameters {:header [:map
|
||||
; ["Api" :string]
|
||||
; ["Math" :string]
|
||||
; ["Plus" :string]],
|
||||
; :path [:map
|
||||
; [:x :int]
|
||||
; [:y :int]],
|
||||
; :query [:map [:a :int]],
|
||||
; :body [:map [:b :int]]},
|
||||
; :responses {200 {:body [:map
|
||||
; [:total :int]
|
||||
; [:total2 :int]]}
|
||||
; 500 {:description "fail"}},
|
||||
; :handler #object[clojure.core$constantly$fn__5740]}
|
||||
|
||||
(cm/merge
|
||||
{:parameters {:query [:map [:x :int]]}
|
||||
:get {:parameters {:query [:map [:x :int]]}
|
||||
:responses {200 {:body [:map [:total :int]]}}}}
|
||||
{:parameters {:query [:map [:y :int]]}
|
||||
:get {:parameters {:query [:map [:y :int]]}
|
||||
:responses {200 {:body [:map [:total :int]]}}}
|
||||
:post {:parameters {:query [:map [:y :int]]}}}
|
||||
{::cm/path-map [[[:parameters cm/any] malli-merge]
|
||||
[[cm/any :parameters cm/any] malli-merge]
|
||||
[[:responses cm/any :body] malli-merge]
|
||||
[[cm/any :responses cm/any :body] malli-merge]]})
|
||||
;{:parameters {:query [:map [:x :int] [:y :int]]},
|
||||
; :get {:parameters {:query [:map [:x :int] [:y :int]]}
|
||||
; :responses {200 {:body [:map [:total :int]]}}},
|
||||
; :post {:parameters {:query [:map [:y :int]]}}}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-dev "0.6.0"
|
||||
(defproject metosin/reitit-dev "0.7.0-alpha1"
|
||||
:description "Snappy data-driven router for Clojure(Script)"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-frontend "0.6.0"
|
||||
(defproject metosin/reitit-frontend "0.7.0-alpha1"
|
||||
:description "Reitit: Clojurescript frontend routing core"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-http "0.6.0"
|
||||
(defproject metosin/reitit-http "0.7.0-alpha1"
|
||||
:description "Reitit: HTTP routing with interceptors"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-interceptors "0.6.0"
|
||||
(defproject metosin/reitit-interceptors "0.7.0-alpha1"
|
||||
:description "Reitit, common interceptors bundled"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-malli "0.6.0"
|
||||
(defproject metosin/reitit-malli "0.7.0-alpha1"
|
||||
:description "Reitit: Malli coercion"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-middleware "0.6.0"
|
||||
(defproject metosin/reitit-middleware "0.7.0-alpha1"
|
||||
:description "Reitit, common middleware bundled"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-openapi "0.6.0"
|
||||
(defproject metosin/reitit-openapi "0.7.0-alpha1"
|
||||
:description "Reitit: OpenAPI-support"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-pedestal "0.6.0"
|
||||
(defproject metosin/reitit-pedestal "0.7.0-alpha1"
|
||||
:description "Reitit + Pedestal Integration"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-ring "0.6.0"
|
||||
(defproject metosin/reitit-ring "0.7.0-alpha1"
|
||||
:description "Reitit: Ring routing"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-schema "0.6.0"
|
||||
(defproject metosin/reitit-schema "0.7.0-alpha1"
|
||||
:description "Reitit: Plumatic Schema coercion"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-sieppari "0.6.0"
|
||||
(defproject metosin/reitit-sieppari "0.7.0-alpha1"
|
||||
:description "Reitit: Sieppari Interceptors"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-spec "0.6.0"
|
||||
(defproject metosin/reitit-spec "0.7.0-alpha1"
|
||||
:description "Reitit: clojure.spec coercion"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-swagger-ui "0.6.0"
|
||||
(defproject metosin/reitit-swagger-ui "0.7.0-alpha1"
|
||||
:description "Reitit: Swagger-ui support"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-swagger "0.6.0"
|
||||
(defproject metosin/reitit-swagger "0.7.0-alpha1"
|
||||
:description "Reitit: Swagger-support"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit "0.6.0"
|
||||
(defproject metosin/reitit "0.7.0-alpha1"
|
||||
:description "Snappy data-driven router for Clojure(Script)"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
|
|||
34
project.clj
34
project.clj
|
|
@ -1,4 +1,4 @@
|
|||
(defproject metosin/reitit-parent "0.6.0"
|
||||
(defproject metosin/reitit-parent "0.7.0-alpha1"
|
||||
:description "Snappy data-driven router for Clojure(Script)"
|
||||
:url "https://github.com/metosin/reitit"
|
||||
:license {:name "Eclipse Public License"
|
||||
|
|
@ -15,22 +15,22 @@
|
|||
:url "https://github.com/metosin/reitit"}
|
||||
;; TODO: need to verify that the code actually worked with Java1.8, see #242
|
||||
:javac-options ["-Xlint:unchecked" "-target" "1.8" "-source" "1.8"]
|
||||
:managed-dependencies [[metosin/reitit "0.6.0"]
|
||||
[metosin/reitit-core "0.6.0"]
|
||||
[metosin/reitit-dev "0.6.0"]
|
||||
[metosin/reitit-spec "0.6.0"]
|
||||
[metosin/reitit-malli "0.6.0"]
|
||||
[metosin/reitit-schema "0.6.0"]
|
||||
[metosin/reitit-ring "0.6.0"]
|
||||
[metosin/reitit-middleware "0.6.0"]
|
||||
[metosin/reitit-http "0.6.0"]
|
||||
[metosin/reitit-interceptors "0.6.0"]
|
||||
[metosin/reitit-swagger "0.6.0"]
|
||||
[metosin/reitit-openapi "0.6.0"]
|
||||
[metosin/reitit-swagger-ui "0.6.0"]
|
||||
[metosin/reitit-frontend "0.6.0"]
|
||||
[metosin/reitit-sieppari "0.6.0"]
|
||||
[metosin/reitit-pedestal "0.6.0"]
|
||||
:managed-dependencies [[metosin/reitit "0.7.0-alpha1"]
|
||||
[metosin/reitit-core "0.7.0-alpha1"]
|
||||
[metosin/reitit-dev "0.7.0-alpha1"]
|
||||
[metosin/reitit-spec "0.7.0-alpha1"]
|
||||
[metosin/reitit-malli "0.7.0-alpha1"]
|
||||
[metosin/reitit-schema "0.7.0-alpha1"]
|
||||
[metosin/reitit-ring "0.7.0-alpha1"]
|
||||
[metosin/reitit-middleware "0.7.0-alpha1"]
|
||||
[metosin/reitit-http "0.7.0-alpha1"]
|
||||
[metosin/reitit-interceptors "0.7.0-alpha1"]
|
||||
[metosin/reitit-swagger "0.7.0-alpha1"]
|
||||
[metosin/reitit-openapi "0.7.0-alpha1"]
|
||||
[metosin/reitit-swagger-ui "0.7.0-alpha1"]
|
||||
[metosin/reitit-frontend "0.7.0-alpha1"]
|
||||
[metosin/reitit-sieppari "0.7.0-alpha1"]
|
||||
[metosin/reitit-pedestal "0.7.0-alpha1"]
|
||||
[metosin/ring-swagger-ui "4.18.1"]
|
||||
[metosin/spec-tools "0.10.5"]
|
||||
[metosin/schema-tools "0.13.0"]
|
||||
|
|
|
|||
Loading…
Reference in a new issue