Unlike more general of our libraries (like compojure-api and ring-swagger) this project is primarily intended for use in Metosin's projects. Feel free to use, but don't expect full support.
- We might remove features if we think they are not useful anymore
- We will reject PRs and issues about features we wouldn't use ourselves
- The components use clojure.tools.logging
- The components use Schema to validate and coerce their configuration
- Coercion allows using strings from environment variables and system properties easily
- Includes test utilities for
clojure.test
and Midje. - Context is curated value created from interesting parts of the system.
- Passing the whole system down to implementation is inconvenient as the interesting bits of system are somewhere inside the components.
- Follows the semantics of using
(providing (mongo/create (:db env)) [:db])
will publish value of(:db mongo)
as(:db context)
(providing (mongo/create (:db env)) {:mongo :db})
will publish value of(:db mongo)
as(:mongo context)
(providing (mongo/create (:db env)) {:mongo (fn [component] (:db component))})
will publish value of(:db mongo)
as(:mongo context)
- Ring handler can be created using a function taking
system
as argument. This makes it easy to create handler accessing system or context, directly or through middleware.(http-kit/create (:http env) {:fn (fn [system] (let [ctx (palikka.core/create-context system)] (fn [req] {:body ctx})))})
- Idempotent components
Differences to System
- Components log messages
- Context
- Schema validation and coercion for options
(defn base-system [override]
(let [env (m/build-config
(m/resource "config-defaults.edn")
(m/file "./config-local.edn"))
create-handler (fn [system]
(-> (create-handler system)
(wrap-context system)))]
(component/system-map
:mongo (-> (mongo/create (:mongo env))
(providing {:db :db, :gfs :gfs}))
:http (-> (http-kit/create (:http env) {:fn create-handler})
; Though components are accessed through context,
; complete system map is needed for creating the context
(using [:mongo]))
:nrepl (nrepl/create (:nrepl env)))))
This library doesn't depend on libraries used by components, depend on these on your project.
- Http-kit: http-kit
- Mongo: monger
- Database: hikari-cp & jdbc driver for used db, e.g. postgres driver
- Migration status checker: flyway-core
- RabbitMQ: Langohr
- Datomic:
[com.datomic/datomic-free "0.9.5327"]
or Datomic Pro
Copyright © 2015-2016 Metosin Oy
Distributed under the Eclipse Public License, the same as Clojure.