Stavka (Ставка) is the high command of your clojure application, which manages configuration from various sources.
- Extensible configuration sources and formats
- Sources:
- Formats:
- Environment variables
(env)
- JVM options (-D)
(options)
- Commandline options with tools.cli parser
(cli args cli-parser)
, enabled whenclojure.tools.cli
on classpath - EDN
(edn)
- JSON
(json)
, enabled whencheshire
on classpath - YAML
(yaml)
, enabled whenclj-yaml
on classpath - Properties
(property)
- Environment variables
- Reloading by
- Watching file system
(watch)
, enabled whenhawk
on classpath - Watching file system
(watch2)
using beholder as backend, enabled whenheholder
on classpath - Polling the source
(poll)
- Watching file system
- Listeners for value changing
(on-change!)
- Type conversion
($l) ($f) ($b) ($s)
Use stavka with component or mount. You can have multiple config instance and manage life-cycle of updater.
(require '[stavka.core :as sta :refer :all])
;; Use stavka with mount
(defstate config
:start
;; load configuration from multiple sources and merge them like
;; clojure.core/merge.
(sta/using
;; using environment variables by default
(env)
;; also load edn from classpath
(edn (classpath "/default.edn"))
;; load another properties from filesystem, and watch is for change
(properties (watch (file "/etc/stavka.properties")))
;; and fetch a remote json configuration. check every 10 seconds
;; for update.
(json (poll (url "http://somehost/configuration/my.json") 10000)))
:stop (stop-updaters! config))
;; Use stavka with component
(defrecord StavkaConfiguration [config]
component/Lifecycle
(start [component]
(assoc component :config
(sta/using
(env)
(edn (classpath "/default.edn"))
(properties (watch (file "/etc/stavka.properties")))
(json (poll (url "http://somehost/configuration/my.json") 10000)))))
(stop [component]
(stop-updaters! config)
(assoc component :config nil)))
export SOME_CONFIG_KEY="some-value"
{:some {:config {:key "some-value"}}}
{
"some": {
"config": {
"key" : "some-value"
}
}
}
some.config.key=some-value
some:
config:
key: some-value
;; get configuration
($ config :some.config.key)
;; get configuration with type convertion
;; $l: as long
;; $f: as double
;; $s: as string
;; $b: as boolean
($l config :some.config.key)
And you can still use stavka globally:
(sta/global!
(env)
(edn (classpath "/default.edn"))
(properties (watch (file "/etc/stavka.properties")))
(json (poll (url "http://somehost/configuration/my.json") 10000)))
;; use double-$ to access global config
($$ :some.config.key)
($$l :some.config.key)
Add change listener on some key when you have updater configured:
(on-change! config :some.config.key
(fn [new-value previous-value]
))
Copyright © 2018 Ning Sun
Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.
I'm now accepting donation on liberapay, if you find my work helpful and want to keep it going.