Skip to content

Commit

Permalink
Add integrant-tools.repl mamespace, add meta-opts-resume function
Browse files Browse the repository at this point in the history
  • Loading branch information
kwrooijen committed Jun 27, 2020
1 parent c19cef4 commit ba1fb74
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 31 deletions.
57 changes: 29 additions & 28 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,40 +10,41 @@ didn't think would fit in core.

### Core

+ [integrant-tools.core/readers](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.core#readers)
+ [integrant-tools.core/derive-unknown](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.core#derive-unknown)
+ [integrant-tools.core/derive-hierarchy](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.core#derive-hierarchy)
+ [integrant-tools.core/derive-composite](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.core#derive-composite)
+ [integrant-tools.core/underive-all](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.core#underive-all)
+ [integrant-tools.core/find-derived-keys](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.core#find-derived-keys)
+ [integrant-tools.core/meta-init](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.core#meta-init)
+ [integrant-tools.core/meta-opts-init](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.core#meta-opts-init)
+ [integrant-tools.core/find-derived-key](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.core#find-derived-key)
+ [integrant-tools.core/find-derived-values](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.core#find-derived-values)
+ [integrant-tools.core/find-derived-value](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.core#find-derived-value)
+ [integrant-tools.core/select-keys](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.core#select-keys)
+ [integrant-tools.core/readers](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.core#readers)
+ [integrant-tools.core/derive-unknown](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.core#derive-unknown)
+ [integrant-tools.core/derive-hierarchy](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.core#derive-hierarchy)
+ [integrant-tools.core/derive-composite](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.core#derive-composite)
+ [integrant-tools.core/underive-all](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.core#underive-all)
+ [integrant-tools.core/find-derived-keys](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.core#find-derived-keys)
+ [integrant-tools.core/meta-init](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.core#meta-init)
+ [integrant-tools.core/meta-opts-init](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.core#meta-opts-init)
+ [integrant-tools.core/meta-opts-resume](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.core#meta-opts-resume)
+ [integrant-tools.core/find-derived-key](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.core#find-derived-key)
+ [integrant-tools.core/find-derived-values](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.core#find-derived-values)
+ [integrant-tools.core/find-derived-value](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.core#find-derived-value)
+ [integrant-tools.core/select-keys](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.core#select-keys)

### EDN

+ [integrant-tools.edn/meta-str](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.edn#meta-str)
+ [integrant-tools.edn/lazy-read](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.edn#lazy-read)
+ [integrant-tools.edn/meta-str](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.edn#meta-str)
+ [integrant-tools.edn/lazy-read](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.edn#lazy-read)

### Keyword

* [integrant-tools.keyword/ancestor?](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.keyword#ancestor?)
* [integrant-tools.keyword/descendant?](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.keyword#descendant?)
* [integrant-tools.keyword/parent?](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.keyword#parent?)
* [integrant-tools.keyword/child?](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.keyword#child?)
* [integrant-tools.keyword/child](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.keyword#child)
* [integrant-tools.keyword/parent](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.keyword#parent)
* [integrant-tools.keyword/ancestor](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.keyword#ancestor)
* [integrant-tools.keyword/descendant](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.keyword#descendant)
* [integrant-tools.keyword/children](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.keyword#children)
* [integrant-tools.keyword/underive-ancestors](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.keyword#underive-ancestors)
* [integrant-tools.keyword/underive-parents](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.keyword#underive-parents)
* [integrant-tools.keyword/underive-descendants](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.keyword#underive-descendants)
* [integrant-tools.keyword/underive-children](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.keyword#underive-children)
* [integrant-tools.keyword/make-child](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.5/api/integrant-tools.keyword#make-child)
* [integrant-tools.keyword/ancestor?](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.keyword#ancestor?)
* [integrant-tools.keyword/descendant?](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.keyword#descendant?)
* [integrant-tools.keyword/parent?](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.keyword#parent?)
* [integrant-tools.keyword/child?](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.keyword#child?)
* [integrant-tools.keyword/child](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.keyword#child)
* [integrant-tools.keyword/parent](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.keyword#parent)
* [integrant-tools.keyword/ancestor](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.keyword#ancestor)
* [integrant-tools.keyword/descendant](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.keyword#descendant)
* [integrant-tools.keyword/children](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.keyword#children)
* [integrant-tools.keyword/underive-ancestors](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.keyword#underive-ancestors)
* [integrant-tools.keyword/underive-parents](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.keyword#underive-parents)
* [integrant-tools.keyword/underive-descendants](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.keyword#underive-descendants)
* [integrant-tools.keyword/underive-children](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.keyword#underive-children)
* [integrant-tools.keyword/make-child](https://cljdoc.org/d/kwrooijen/integrant-tools/0.3.6/api/integrant-tools.keyword#make-child)

## Author / License

Expand Down
2 changes: 1 addition & 1 deletion project.clj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
(defproject kwrooijen/integrant-tools "0.3.5"
(defproject kwrooijen/integrant-tools "0.3.6"
:description "A library with helper functions, reader tags, and init-keys for Integrant"
:url "https://github.com/kwrooijen/integrant-tools"
:license {:name "MIT"}
Expand Down
28 changes: 26 additions & 2 deletions src/integrant_tools/core.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,27 @@
#?(:clj (instance? clojure.lang.IObj v)
:cljs (satisfies? IMeta v)))

(defn- meta-init-key [k opts]
(defn meta-init-key [k opts]
(let [v (ig/init-key k opts)]
(if (and (map? opts)
(meta-value? v))
(vary-meta v merge (meta opts))
v)))

(defn- meta-opts-init-key [k opts]
(defn meta-opts-init-key [k opts]
(let [v (ig/init-key k opts)]
(if (and (map? opts)
(meta-value? v))
(vary-meta v merge opts)
v)))

(defn meta-opts-resume-key [k opts old-value old-impl]
(let [v (ig/resume-key k opts old-value old-impl)]
(if (and (map? opts)
(meta-value? v))
(vary-meta v merge opts)
v)))

(def ^{:doc "Useful Integrant readers
## `it/regex`
Expand Down Expand Up @@ -167,6 +174,23 @@
{:pre [(map? config)]}
(ig/build config keys meta-opts-init-key #'ig/assert-pre-init-spec)))

(defn meta-opts-resume
"Same as ig/resume, but `opts` is merged into the resulting value's
metadata after initialization. This is useful if your resume-key
returns a function, but you want to add extra context to it."
([config system]
(meta-opts-resume config system (keys config)))
([config system keys]
{:pre [(map? config) (map? system) (some-> system meta :integrant.core/origin)]}
(#'ig/halt-missing-keys! config system keys)
(ig/build config keys
(fn [k v]
(if (contains? system k)
(meta-opts-resume-key k v (-> system meta :integrant.core/build (get k)) (system k))
(meta-opts-init-key k v)))
#'ig/assert-pre-init-spec
ig/resolve-key)))

(defn select-keys
"Select all keys from `config` that are a dependency if `keys`"
[config keys]
Expand Down
63 changes: 63 additions & 0 deletions src/integrant_tools/repl.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
(ns integrant-tools.repl
(:require
[integrant.repl.state :as state]
[clojure.tools.namespace.repl :as repl]
[integrant.core :as ig]
[integrant-tools.core :as it]))

(defn- build-system [build wrap-ex]
(try
(build)
(catch clojure.lang.ExceptionInfo ex
(if-let [system (:system (ex-data ex))]
(try
(ig/halt! system)
(catch clojure.lang.ExceptionInfo halt-ex
(throw (wrap-ex ex halt-ex)))))
(throw ex))))

(defn- meta-opts-init-system [config keys]
(build-system
(if keys
#(it/meta-opts-init config keys)
#(it/meta-opts-init config))
#(ex-info "Config failed to init; also failed to halt failed system"
{:init-exception %1}
%2)))

(defn- meta-opts-resume-system [config system]
(build-system
#(it/meta-opts-resume config system)
#(ex-info "Config failed to resume; also failed to halt failed system"
{:resume-exception %1}
%2)))

(defn meta-opts-resume []
(if-let [prep state/preparer]
(let [cfg (prep)]
(alter-var-root #'state/config (constantly cfg))
(alter-var-root #'state/system (fn [sys]
(if sys
(meta-opts-resume-system cfg sys)
(meta-opts-init-system cfg nil))))
:resumed)
(throw (#'integrant.repl/prep-error))))

(defn meta-opts-init
([] (meta-opts-init nil))
([keys]
(alter-var-root #'state/system
(fn [sys]
(#'integrant.repl/halt-system sys)
(meta-opts-init-system state/config keys)))
:initiated))

(defn meta-opts-go
([] (meta-opts-go nil))
([keys]
(integrant.repl/prep)
(meta-opts-init keys)))

(defn meta-opts-reset []
(integrant.repl/suspend)
(repl/refresh :after 'integrant-tools.repl/meta-opts-resume))

0 comments on commit ba1fb74

Please sign in to comment.