route-middleware
middleware
Maintenance release, adding several patches from 2.0 branch.
BREAKING: in compojure.api.swagger
, the swagger-ui
and swagger-docs
now take options map with path
key instead of separate optional path & vararg opts.
swagger-routes
and thus be unaffected of this.updated dependencies:
[prismatic/plumbing "0.5.4"] is available but we use "0.5.3"
[compojure "1.6.0"] is available but we use "1.5.2"
[prismatic/schema "1.1.6"] is available but we use "1.1.3"
[ring-middleware-format "0.7.2"] is available but we use "0.7.0"
[metosin/ring-http-response "0.9.0"] is available but we use "0.8.1"
[metosin/ring-swagger "0.24.1"] is available but we use "0.22.14"
[compojure "1.5.2"] is available but we use "1.5.1"
[metosin/ring-http-response "0.8.1"] is available but we use "0.8.0"
[metosin/ring-swagger "0.22.14"] is available but we use "0.22.11"
[metosin/ring-swagger-ui "2.2.8"] is available but we use "2.2.5-0"
:header-params
with resources, #254[frankiesardo/linked "1.2.9"] is available but we use "1.2.7"
[metosin/ring-swagger "0.22.11"] is available but we use "0.22.10"
[metosin/ring-swagger-ui "2.2.5-0"] is available but we use "2.2.2-0"
Lot's of new swagger-bindings from Ring-swagger:
schema.core.defrecord
org.joda.time.LocalTime
s/Any
in body generates empty object instead of nilBundled with latest swagger-ui 2.2.2-0
Updated deps:
[metosin/ring-swagger "0.22.10"] is available but we use "0.22.9"
[metosin/ring-swagger-ui "2.2.2-0"] is available but we use "2.2.1-0"
Bundled with the latest Swagger-ui (2.2.1-0)
Updated deps:
[metosin/ring-swagger-ui "2.2.1-0"] is available but we use "2.1.4-0"
:content-type
of user-defined formats are pushed into Swagger :produces
and :consumes
, thanks to Waldemar.(def custom-json-format
(ring.middleware.format-response/make-encoder cheshire.core/generate-string "application/vnd.vendor.v1+json"))
(api
{:format {:formats [custom-json-format :json :edn]}}
...)
[:api :disable-api-middleware?]
to disable the api-middleware completely. With this set, api
only produces the (reverse) route-tree + set's swagger stuff and sets schema coercions for the api.
(api
{:api {:disable-api-middleware? true}
;; Still available
:swagger {:ui "/api-docs"
:spec "/swagger.json"
:data {:info {:title "api"}}}}
...)
:data
in swagger-routes
can be overridden even if run outside of api
:(def app
(routes
(swagger-routes
{:ui "/api-docs"
:spec "/swagger.json"
:data {:info {:title "Kikka"}
:paths {"/ping" {:get {:summary "ping get"}}}}})
(GET "/ping" [] "pong"))))
:format
option in api-middleware
causes all format-middlewares not to mount:exceptions
option in api-middleware
causes the exception handling to be disabled:coercion
translates to same as setting it to (constantly nil)
(api
{:exceptions nil ;; disable exception handling
:format nil ;; disable ring-middleware-format
:coercion nil} ;; disable all schema-coercion
;; this will be really thrown
(GET "/throw" []
(throw (new RuntimeException))))
[prismatic/schema "1.1.3"] is available but we use "1.1.2"
[frankiesardo/linked "1.2.7"] is available but we use "1.2.6"
fix reflection warning with logging, thanks to Matt K.
Empty contexts (/
) don't accumulate to the path, see https://github.com/weavejester/compojure/issues/125
NOTE: update of ring-http-response
had a breaking change:
updated dependencies:
[compojure "1.5.1"] is available but we use "1.5.0"
[metosin/ring-http-response "0.8.0"] is available but we use "0.7.0"
[cheshire "5.6.3"] is available but we use "5.6.1"
[prismatic/schema "1.1.2"] is available but we use "1.1.1"
[metosin/ring-http-response "0.7.0"] is available but we use "0.6.5"
[metosin/ring-swagger "0.22.9"] is available but we use "0.22.8"
[reloaded.repl "0.2.2"] is available but we use "0.2.1"
[peridot "0.4.4"] is available but we use "0.4.3"
[reloaded.repl "0.2.2"] is available but we use "0.2.1"
Response headers are mapped correctly, fixes #232
updated dependencies:
[metosin/ring-swagger "0.22.8"] is available but we use "0.22.7"
:swagger
.(let [runtime-data {:x-name :boolean
:operationId "echoBoolean"
:description "Ehcoes a boolean"
:parameters {:query {:q s/Bool}}}]
(api
(GET "/route" []
:swagger runtime-data
(ok {:it "works"}))))
:route-params
into :path-params
with resources
(resource
{:parameters {:path-params {:id s/Int}}
:responses {200 {:schema s/Int}}
:handler (fnk [[:path-params id]]
(ok (inc id)))})
[prismatic/schema "1.1.1"] is available but we use "1.1.0"
compojure.api.swgger/validate
to compojure.api.validator/validate
.resource
doesn't define a handler for a given request-method
or for top-level, nil is returned (instead of throwing exeption)context
. Trying to return a compojure.api.routing/Route
from an endpoint like ANY
will throw descriptive (runtime-)exception.(context "/hello" []
(resource
{:description "hello-resource"
:responses {200 {:schema {:message s/Str}}}
:post {:summary "post-hello"
:parameters {:body-params {:name s/Str}}
:handler (fnk [[:body-params name]]
(ok {:message (format "hello, %s!" name)}))}
:get {:summary "get-hello"
:parameters {:query-params {:name s/Str}}
:handler (fnk [[:query-params name]]
(ok {:message (format "hello, %s!" name)}))}}))
{:ui nil, :spec nil}
. Setting up just the spec or ui, doesn't automatically setup the other (like previously):middleware
, fixes #228describe
works with anonymous body-schemas (via ring-swagger 0.22.7
), Fixes #168[metosin/compojure-api "1.1.0" :exclusions [[metosin/scjsv]]]
[metosin/ring-swagger "0.22.7"] is available but we use "0.22.6"
[prismatic/plumbing "0.5.3"] is available but we use "0.5.2"
[cheshire "5.6.1"] is available but we use "5.5.0"
compojure.api.meta
to compojure.api.coerce
.compojure.api.resource/resource
(also in compojure.api.sweet
) for building resource-oriented services
(defn resource
"Creates a nested compojure-api Route from enchanced ring-swagger operations map and options.
By default, applies both request- and response-coercion based on those definitions.
Options:
- **:coercion** A function from request->type->coercion-matcher, used
in resource coercion for :body, :string and :response.
Setting value to `(constantly nil)` disables both request- &
response coercion. See tests and wiki for details.
Enchancements to ring-swagger operations map:
1) :parameters use ring request keys (query-params, path-params, ...) instead of
swagger-params (query, path, ...). This keeps things simple as ring keys are used in
the handler when destructuring the request.
2) at resource root, one can add any ring-swagger operation definitions, which will be
available for all operations, using the following rules:
2.1) :parameters are deep-merged into operation :parameters
2.2) :responses are merged into operation :responses (operation can fully override them)
2.3) all others (:produces, :consumes, :summary,...) are deep-merged by compojure-api
3) special key `:handler` either under operations or at top-level. Value should be a
ring-handler function, responsible for the actual request processing. Handler lookup
order is the following: operations-level, top-level, exception.
4) request-coercion is applied once, using deep-merged parameters for a given
operation or resource-level if only resource-level handler is defined.
5) response-coercion is applied once, using merged responses for a given
operation or resource-level if only resource-level handler is defined.
Note: Swagger operations are generated only from declared operations (:get, :post, ..),
despite the top-level handler could process more operations.
Example:
(resource
{:parameters {:query-params {:x Long}}
:responses {500 {:schema {:reason s/Str}}}
:get {:parameters {:query-params {:y Long}}
:responses {200 {:schema {:total Long}}}
:handler (fn [request]
(ok {:total (+ (-> request :query-params :x)
(-> request :query-params :y))}))}
:post {}
:handler (constantly
(internal-server-error {:reason \"not implemented\"}))})"
([info]
(resource info {}))
([info options]
(let [info (merge-parameters-and-responses info)
root-info (swaggerize (root-info info))
childs (create-childs info)
handler (create-handler info options)]
(routes/create nil nil root-info childs handler))))
[compojure "1.5.0"] is available but we use "1.4.0"
[prismatic/schema "1.1.0"] is available but we use "1.0.5"
[metosin/ring-swagger "0.22.6"] is available but we use "0.22.4"
ex-data
under :response
.
This can be used in logging, "what did the route try to return". Thanks to Tim Gilbert.:default
code if available and response code doesn't match(GET "/" []
:responses {200 {:schema {:ping s/Str}}
:default {:schema {:error s/int}}}
...)
[prismatic/schema "1.0.5"] is available but we use "1.0.4"
:basePath
with swagger-routes
, thanks to Hoxu.[metosin/ring-swagger "0.22.4"] is available but we use "0.22.3"
(defn more-routes [db version]
(routes
(GET "/version" []
(ok {:version version}))
(POST "/thingie" []
(ok (thingie/create db)))))
(defn app [db]
(api
(context "/api/:version" []
:path-params [version :- s/Str]
(more-routes db version)
(GET "/kikka" []
(ok "kukka")))))
BREAKING Vanilla Compojure routes will not produce any swagger-docs (as they do not satisfy the
Routing
protocol. They can still be used for handling request, just without docs.
[:api :invalid-routes-fn]
to declare how to handle routes not satisfying
the Routing
protocol. Default implementation logs invalid routes as WARNINGs.BREAKING compojure.core imports are removed from compojure.api.sweet
:
let-request
, routing
, wrap-routes
BREAKING Asterix (*
) is removed from route macro & function names, as there is no reason to mix compojure-api & compojure route macros.
GET*
=> GET
ANY*
=> ANY
HEAD*
=> HEAD
PATCH*
=> PATCH
DELETE*
=> DELETE
OPTIONS*
=> OPTIONS
POST*
=> PUT
context*
=> context
defroutes*
=> defroutes
BREAKING swagger-docs
and swagger-ui
are no longer in compojure.api.sweet
:swagger
(has no defaults)swagger-routes
function, mounting both the swagger-ui
and swagger-docs
and wiring them together
/
and the swagger-spec to /swagger.json
swagger-ui
& swagger-docs
(need to be separately imported from compojure.api.swagger
).(defapi app
(swagger-routes)
(GET "/ping" []
(ok {:message "pong"})))
(defapi app
{:swagger {:ui "/", :spec "/swagger.json"}}
(GET "/ping" []
(ok {:message "pong"})))
BREAKING: api-level coercion option is now a function of request => type => matcher
as it is documented.
Previously required a type => matcher
map. Options are checked against type => matcher
coercion input, and a
descriptive error is thrown when api is created with the old options format.
BREAKING: Renamed middlewares
to middleware
and :middlewares
key (restructuring) to :middleware
BREAKING: Middleware must be defined as data: both middleware macro and :middleware restructuring take a vector of middleware containing either
[function args]
[[wrap-foo {:opts :bar}]]
[#(wrap-foo % {:opts :bar})]
[(fn [handler] (wrap-foo handler {:opts :bar}))]
BREAKING: (Custom restructuring handlers only) :parameters
key used by restructure-param
has been renamed to :swagger
.
BREAKING public-resource-routes
& public-resources
are removed from compojure.api.middleware
.
BREAKING: compojure.api.legacy
namespace has been removed.
https://github.com/metosin/compojure-api/wiki/Migration-Guide-to-1.0.0
Additional route functions/macros in compojure.api.core
:
routes
& letroutes
, just like in the Compojure, but supporting Routing
undocumented
- works just like routes
but without any route definitions. Can be used to wrap legacy routes which setting the api option to fail on missing docs.top-level api
is now just function, not a macro. It takes an optional options maps and a top-level route function.
Coercer cache is now at api-level with 10000 entries.
Code generated from restructured route macros is much cleaner now
Coercion is on by default for standalone (apiless) endpoints.
(fact "coercion is on for apiless routes"
(let [route (GET "/x" []
:query-params [x :- Long]
(ok))]
(route {:request-method :get :uri "/x" :query-params {}}) => throws))
[backtick "0.3.3"]
Fixed path parameter handling in cases where path parameter is followed by an extension (#196, metosin/ring-swagger#82)
Added compojure.api.exception/with-logging
helper to add logging to exception handlers.
Updated deps:
[metosin/ring-swagger "0.22.3"] is available
[metosin/ring-swagger "0.22.2"] is available
[metosin/ring-swagger-ui "2.1.4-0"] is available
[potemkin "0.4.3"] is available
coercer-cache is now per Route instead beeing global and based on a FIFO size 100 cache. Avoids potential memory leaks when using anonymous coercion matchers (which never hit the cache).
Updated deps:
[prismatic/schema "1.0.4"] is available but we use "1.0.3"
schema
& matcher
-input) for better performance.
api
and reading json-string out.[potemkin "0.4.2"] is available but we use "0.4.1"
[Ring-Swagger "0.22.1"]
clojure.tools.logging
is used with default uncaugt exception handling if it's found
on the classpath. Fixes #172.api
and defapi
produce identical swagger-docs. Fixes #159[metosin/ring-swagger "0.22.1"] is available but we use "0.22.0"
[metosin/ring-swagger-ui "2.1.3-4"] is available but we use "2.1.3-2"
[prismatic/plumbing "0.5.2] is available but we use "0.5.1"
ring-middleware-format
accepts transit options in a new format:;; pre 0.24.0:
(api
{:format {:response-opts {:transit-json {:handlers transit/writers}}
:params-opts {:transit-json {:options {:handlers transit/readers}}}}}
...)
;; 0.24.0 +
(api
{:format {:response-opts {:transit-json {:handlers transit/writers}}
:params-opts {:transit-json {:handlers transit/readers}}}}
...)
swagger-ui
now supports passing arbitrary options to SwaggerUI
(metosin/ring-swagger#67).[prismatic/schema "1.0.3"] is available but we use "0.4.4"
[prismatic/plumbing "0.5.1] is available but we use "0.4.4"
[metosin/schema-tools "0.7.0"] is available but we use "0.5.2"
[metosin/ring-swagger "0.22.0"] is available but we use "0.21.0"
[metosin/ring-swagger-ui "2.1.3-2"] is available but we use "2.1.2"
:query-params [x :- [Long]]
& url ?x=1&x=2&x=3
should result in x
being [1 2 3]
.:validation-errors :error-handler
, :validation-errors :catch-core-errors?
and :exceptions :exception-handler
options have been removed.
:exceptions :handlers
options.context
from compojure.api.sweet
to compojure.api.legacy
. Use context*
instead.[metosin/ring-swagger "0.21.0-SNAPSHOT"] is available but we use "0.20.4"
[compojure "1.4.0"] is available but we use "1.3.4"
[prismatic/schema "0.4.4"] is available but we use "0.4.3"
[metosin/ring-http-response "0.6.5"] is available but we use "0.6.3"
[metosin/schema-tools "0.5.2"] is available but we use "0.5.1"
[metosin/ring-swagger-ui "2.1.2"] is available but we use "2.1.5-M2"
[peridot "0.4.1"] is available but we use "0.4.0"
[metosin/ring-http-response "0.6.3"] is available but we use "0.6.2"
[midje "1.7.0"] is available but we use "1.7.0-SNAPSHOT"
Optional integration with Component.
Use either :components
-option of api-middleware
or wrap-components
-middleware
to associate the components with your API. Then you can use :components
-restructuring
to destructure your components using letk syntax.
fix for #123
support for pluggable coercion, at both api-level & endpoint-level with option :coercion
. See thethe tests.
ring-request->coercion-type->coercion-matcher
allowing protocol-based coercion in the future
** BREAKING**: if you have created custom restructurings using src-coerce
, they will break (nicely at compile-time)new restucturing :swagger
just for swagger-docs. Does not do any coercion.
(GET* "/documented" []
:swagger {:responses {200 {:schema User}
404 {:schema Error
:description "Not Found"} }
:paramerers {:query {:q s/Str}
:body NewUser}}}
...)
[cheshire "5.5.0"] is available but we use "5.4.0"
[backtick "0.3.3"] is available but we use "0.3.2"
[lein-ring "0.9.6"] is available but we use "0.9.4"
:multipart-params
now sets :consumes ["multipart/form-data"]
and :form-params
sets
:consumes ["application/x-www-form-urlencoded"]
compojure.api.upload
namespace.(POST* "/upload" []
:multipart-params [file :- TempFileUpload]
:middlewares [wrap-multipart-params]
(ok (dissoc file :tempfile))))
:responses
. A helpful IllegalArgumentException
will be thrown at compile-time with old models.:responses {400 {:schema ErrorSchema}}
:responses {400 {:schema ErrorSchema, :description "Eror"}}
api-middleware
options with key :ring-swagger
:(defapi app
{:ring-swagger {:ignore-missing-mappings? true}})
(swagger-docs)
(swagger-ui)
...)
path-for
:(fact "bidirectional routing"
(let [app (api
(GET* "/api/pong" []
:name :pong
(ok {:pong "pong"}))
(GET* "/api/ping" []
(moved-permanently (path-for :pong))))]
(fact "path-for resolution"
(let [[status body] (get* app "/api/ping" {})]
status => 200
body => {:pong "pong"}))))
(require '[compojure.api.sweet :refer :all])
(require '[compojure.api.swagger :refer [validate])
(defrecord NonSwaggerRecord [data])
(def app
(validate
(api
(swagger-docs)
(GET* "/ping" []
:return NonSwaggerRecord
(ok (->NonSwaggerRecord "ping"))))))
; clojure.lang.Compiler$CompilerException: java.lang.IllegalArgumentException:
; don't know how to create json-type of: class compojure.api.integration_test.NonSwaggerRecord
[metosin/ring-swagger "0.20.4"] is available but we use "0.20.3"
[metosin/ring-http-response "0.6.2"] is available but we use "0.6.1"
[metosin/ring-swagger-ui "2.1.5-M2"]
[prismatic/plumbing "0.4.4"] is available but we use "0.4.3"
[prismatic/schema "0.4.3"] is available but we use "0.4.2"
with-meta
), fixes #96
(context* "/responses" []
:tags ["responses"]
(GET* "/" []
:query-params [return :- (s/enum :200 :403 :404)]
:responses {403 ^{:message "spiders?"} {:code s/Str} ; old
404 (with-meta {:reason s/Str} {:message "lost?"})} ; new
:return Total
:summary "multiple returns models"
(case return
:200 (ok {:total 42})
:403 (forbidden {:code "forest"})
:404 (not-found {:reason "lost"}))))
compojure.api.core/api
, the work-horse behind compojure.api.core/defapi
.api
, pushed to request via ring-swagger middlewares.
+compojure-api-routes+
littering the handler namespaces.[metosin/ring-swagger "0.20.3"] is available but we use "0.20.2"
[prismatic/plumbing "0.4.3"] is available but we use "0.4.2"
[peridot "0.4.0"] is available but we use "0.3.1"
[compojure "1.3.4"] is available but we use "1.3.3"
[lein-ring "0.9.4"] is available but we use "0.9.3"
[metosin/ring-swagger "0.20.2"] is available but we use "0.20.0"
[prismatic/schema "0.4.2"] is available but we use "0.4.1"
New restructuring for :no-doc
(a boolean) - endpoints with this don't get api documentation.
Fixed #42 - defroutes*
now does namespace resolution for the source
used for route peeling and source linking (the macro magic)
Fixed #91 - defroutes*
are now automatically accessed over a Var for better development flow.
Fixed #89.
Fixed #82.
Fixed #71, ring-swagger-ui is now a dependency.
breaking ring.swagger.json-schema/describe
is now imported into compojure.api.sweet
for easy use. If your code
refers to it directly, you need remove the direct reference.
defapi
or compojure.api.routes/api-root
within that)compojure.api.routes/with-routes
is now compojure.api.routes/api-root
[metosin/ring-swagger-ui "2.1.1-M2"]
to get things pre-configured2.1.1-M2
yourself from the source.:nickname
is now :operationId
:notes
is now :description
swagger-docs
now takes any valid Swagger Spec data in. Using old format gives a warning is to STDOUT.(swagger-docs
{:info {:version "1.0.0"
:title "Sausages"
:description "Sausage description"
:termsOfService "http://helloreverb.com/terms/"
:contact {:name "My API Team"
:email "foo@example.com"
:url "http://www.metosin.fi"}
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}}
:tags [{:name "kikka", :description "kukka"}]})
/api/api-docs
to /swagger.json
.compojure.api.swagger/swaggered
is deprecated - not relevant with 2.0. Works, but prints out a warning to STDOUT
** in 2.0, apis are categorized by Tags, one can set them either to endpoints or to paths:(GET* "/api/pets/" []
:tags ["pet"]
(ok ...))
(context* "/api/pets" []
:tags ["pet"]
(GET* "/" []
:summary "get all pets"
(ok ...)))
[metosin/ring-swagger "0.20.0"] is available but we use "0.19.4"
[prismatic/schema "0.4.1"] is available but we use "0.4.0"
[prismatic/plumbing "0.4.2"] is available but we use "0.4.1"
[prismatic/schema "0.4.1"] is available but we use "0.4.0"
[potemkin "0.3.13"] is available but we use "0.3.12"
[compojure "1.3.3"] is available but we use "1.3.2"
[metosin/ring-swagger "0.19.4"] is available but we use "0.19.3"
2.1.0-M2
- [metosin/ring-swagger-ui "2.1.0-M2-2]
[metosin/ring-swagger "0.19.3"] is available but we use "0.19.2"
:return (s/maybe User)
:responses {200 (s/maybe User)
400 (s/either Cat Dog)}
[metosin/ring-swagger "0.19.2"] is available but we use "0.19.1"
:headers
, thanks to tchagnon!:path-param
allows any keywords, needed for the partial parameter matching with context*
compojure.api.meta/restructure-param
dispatch functions - for the swagger documentation part. See https://github.com/metosin/ring-swagger/blob/master/test/ring/swagger/swagger2_test.clj & https://github.com/metosin/compojure-api/blob/master/src/compojure/api/meta.clj for examples of the new schemas.context*
to allow setting meta-data to mid-routes. Mid-route meta-data are deep-merged into endpoint swagger-definitions at compile-time. At runtime, code is executed in place.(context* "/api/:kikka" []
:summary "summary inherited from context"
:path-params [kikka :- s/Str] ; enforced here at runtime
:query-params [kukka :- s/Str] ; enforced here at runtime
(GET* "/:kakka" []
:path-params [kakka :- s/Str] ; enforced here at runtime
(ok {:kikka kikka
:kukka kukka
:kakka kakka})))
[prismatic/plumbing "0.4.1"] is available but we use "0.3.7"
[potemkin "0.3.12"] is available but we use "0.3.11"
[prismatic/schema "0.4.0"] is available but we use "0.3.7"
[metosin/ring-http-response "0.6.1"] is available but we use "0.6.0"
[metosin/ring-swagger "0.19.0"] is available but we use "0.18.1"
[lein-ring "0.9.3"] is available but we use "0.9.2"
(defapi app
{:format {:formats [:json-kw :yaml-kw :edn :transit-json :transit-msgpack]
:params-opts {}
:response-opts {}}
:validation-errors {:error-handler nil
:catch-core-errors? nil}
:exceptions {:exception-handler default-exception-handler}}
...)
compojure.core/wrap-routes
into compojure.api.sweet
compojure.api.middleware
, ex-info-support
is now parameterizable wrap-exception
[prismatic/plumbing "0.3.7"] is available but we use "0.3.5"
[compojure "1.3.2"] is available but we use "1.3.1"
[prismatic/schema "0.3.7"] is available but we use "0.3.3"
[metosin/ring-swagger "0.18.0"] is available but we use "0.15.0"
[metosin/ring-http-response "0.6.0"] is available but we use "0.5.2"
[metosin/ring-middleware-format "0.6.0"] is available but we use "0.5.0"
ring-middleware-format
[cheshire "5.4.0"] is available but we use "5.3.1"
[metosin/ring-swagger-ui "2.0.24"] is available but we use "2.0.17"
[lein-ring "0.9.0"] is available but we use "0.8.13"
[compojure "1.3.1"] is available but we use "1.2.1"
[metosin/ring-swagger "0.15.0"] is available but we use "0.14.1"
[peridot "0.3.1"] is available but we use "0.3.0"
[prismatic/schema "0.3.3"] is available but we use "0.3.2"
[metosin/ring-http-response "0.5.2"] is available but we use "0.5.1"
[org.tobereplaced/lettercase "1.0.0"]
for camel-casing (see https://github.com/metosin/compojure-api-examples/issues/1#issuecomment-62580504)[metosin/ring-swagger "0.14.1"] is available but we use "0.14.0"
:form-parameters
, thanks to Thomas Whitcomb[prismatic/plumbing "0.3.5"] is available but we use "0.3.3"
[potemkin "0.3.11"] is available but we use "0.3.8"
[compojure "1.2.1"] is available but we use "1.1.9"
[prismatic/schema "0.3.2"] is available but we use "0.2.6"
[metosin/ring-http-response "0.5.1"] is available but we use "0.5.0"
[metosin/ring-swagger "0.14.0"] is available but we use "0.13.0"
[lein-ring "0.8.13"] is available but we use "0.8.11"
:middlewares
broke route parameters:yaml-in-html
and :clojure
from default response formatsclojure.walk
ring-swagger
ring-swagger
hash-map
loses the order if it has enough properties(s/defschema Thingie (ordered-map :a String ...))
~~ring-swagger
:body
and others no langer take description as third param, instead use :body [body (describe Schema "The description")]
describe
works also for Java classes :query-params [x :- (describe Long "first-param")]
(s/defschema Schema {:sub (describe [{:x Long :y String}] "Array of stuff")})
500
instead of 400
, thanks to @phadej!(GET* "/plus" []
:return Long
:query-params [x :- Long {y :- Long 1}]
:summary "x+y with query-parameters. y defaults to 1."
(ok (+ x y)))
:responses
restructuring to (error) return codes and models, thanks to @phadej!(POST* "/number" []
:return Total
:query-params [x :- Long y :- Long]
:responses {403 ^{:message "Underflow"} ErrorEnvelope}
:summary "x-y with body-parameters."
(let [total (- x y)]
(if (>= total 0)
(ok {:total (- x y)})
(forbidden {:message "difference is negative"}))))
s/Uuid
via latest ring-swagger
.compojure.api.meta/restructure-param
:header-params
(fixes #31)[metosin/ring-swagger 0.10.2]
)
String
is supported as Ring doesn't support others
swagger
atom, there is one defined +routes+
var per namespace
compojure.api.core/with-routes
on api root to generate and hold the +routes+
(automatically bundled with defapi
)0.10.1
to get support for s/Keyword
as a nested schema key.middlewares
macro and :middlewares
restructuring now use thread-first to apply middlewares0.9.1
with support for vanilla schema.core/defschema
schemas
defroutes
to compojure.api.legacy
compojure.api.common
: ->Long
, fn->
, fn->>
compojure.api.meta/restructure
(doesn't generate empty lets
& letks
)compojure.api.legacy
ns to have the old Compojure HTTP-method macros (GET
, POST
,...)[prismatic/plumbing "0.3.1"] is available but we use "0.2.2"
[compojure "1.1.8"] is available but we use "1.1.7"
[prismatic/schema "0.2.3"] is available but we use "0.2.2"
[metosin/ring-swagger "0.8.8"] is available but we use "0.8.7"
[peridot "0.3.0"] is available but we use "0.2.2"
[metosin/ring-swagger "0.8.7"]
[metosin/ring-swagger-ui "2.6.16-2"]
updated dependencies:
[compojure "1.1.7"]
[prismatic/schema "0.2.2"]
[metosin/ring-swagger "0.8.5"]
consumes
and produces
are now feed to ring-swagger
based on the installed middlewares.
restructure-param
to receive key, value and the accumulator. Remove the key from accumulator parameters by default. No more alpha.meta
:middlewares
restructuring to support adding middlewares to routes: (DELETE* "/user/:id" []
:middlewares [audit-support (for-roles :admin)]
(ok {:name "Pertti"})))
with-middleware
is renamed to middlewares
& it applies middlewares in reverse orderclojure.walk16
internallyclojure.walk
to clojure.walk16
swagger
atom happens now at runtime, not compile-time. Works with AOT.compojure.api.core
restructuring are now using restructure-param
multimethod to allow external extensions. ALPHA.swaggered
resources are now collected in order+compojure-api-request+
when having both Compojure destructuring & Compojure-api destructuring in place:body-params
(with strict schema):(POST* "/minus" []
:body-params [x :- Long y :- Long]
:summary "x-y with body-parameters"
(ok {:total (- x y)}))
ring-swagger
to 0.8.4
to get better basepath-resolution (with reverse-proxies):path-parameters
and query-parameters
:(GET* "/sum" []
:query-params [x :- Long y :- Long]
:summary "sums x & y query-parameters"
(ok {:total (+ x y)}))
(GET* "/times/:x/:y" []
:path-params [x :- Long y :- Long]
:summary "multiplies x & y path-parameters"
(ok {:total (* x y)}))
swagger-ui
index-redirect work also under a context when running in an legacy app-server. Thanks to Juha Syrjälä for the PR.instanceof?
to match records instead of =
with class. Apps can now be uberwarred with lein ring uberwar
.ring-swagger
to 0.8.3
, generate path-parameters on client sidering-swagger
to 0.8.1
, all JSON-schema generation now done there.ring-http-response
to 0.4.0
compojure.api.core-integration-test
using peridot.core
(context "/api" []
(GET* ["/item/:name" :name #"[a-z/]+"] [name] identity))
GET*
and POST*
. Addeds tests to verify.ring-swagger
to 0.7.3
(GET* "/echo" []
:return Thingie
:query [thingie Thingie]
(ok thingie)) ;; here be coerced thingie
compojure.api.routes/defroutes
is now compojure.api.core/defroutes*
to avoid namespace clashes & promote it's different.compojure.api.core
web methods"compojure.api.core
.Ring-Swagger
to 0.7.2
json-response-support
, thanks to Dmitry BalakhonskiyRing-Swagger
to 0.7.1
giving support for nested Maps: (defmodel Customer {:id String
:address {:street String
:zip Long
:country {:code Long
:name String}}})
compojure.api.core
web methods does now automatic coercion for the bodycompojure.api.core
web methods (POST* "/customer"
:return Customer
:body [customer Customer]
(ok customer))) ;; we have a coerced customer here
ring-swagger
to 0.7.0
schema/maybe
and schema/both
Date
& DateTime
both with and without milliseconds: "2014-02-18T18:25:37.456Z"
& "2014-02-18T18:25:37Z"
swaggered
is stripped out of spaces.ring-swagger
to 0.6.0
swaggered
doesn't have to contain container-element (context
etc.) within, endpoints are ok: (swaggered "ping"
:description "Ping api"
(GET* "/ping" [] (ok {:ping "pong"})))
POST*
and PUT*
now allows model sequences: (POST* "/pizzas" []
:body [pizzas [NewPizza] {:description "new pizzas"}]
(ok (add! pizzas)))
ring-swagger
to 0.5.0
to get support for Data & DateTime.swaggered
can now follow symbols pointing to a compojure.api.routes/defroutes
route definition to allow better route composition.compojure.api.sweet
now uses compojure.api.routes/defroutes
instead of compojure.core/defroutes
Can you improve this documentation? These fine people already did:
Tommi Reiman, Juho Teperi, Miikka Koskinen & Ambrose Bonnaire-SergeantEdit on GitHub
cljdoc is a website building & hosting documentation for Clojure/Script libraries
× close