juxt/modular.co-dependency

Name: modular.co-dependency

Owner: JUXT

Description: Co-dependency support for com.stuartsierra.component

Created: 2015-03-19 12:29:10.0

Updated: 2015-03-27 13:11:31.0

Pushed: 2015-12-18 10:48:08.0

Homepage: null

Size: 26

Language: Clojure

GitHub Committers

UserMost Recent Commit# Commits

Other Committers

UserEmailMost Recent Commit# Commits

README

juxt.modular/co-dependency

Releases and Dependency Information
t.modular/co-dependency "0.2.0"]
Usage
Add co-dependency to your project dependencies
project your-project "your-version"
..
dependencies [[juxt.modular/co-dependency "0.2.0"]]
..

Add component and co-dependency to your ns:
your-app-ns
require [com.stuartsierra.component :refer (using)]
        [modular.component.co-dependency :refer (co-using)]))
Define your system

Same as you do with stuartsierra/component lib but adding co-dependencies with co-dependency/co-using fn In this case :b depends on :a and :a co-depends on :b

n system-1 []
ap->System1 {:a (-> (component-a)
                    (co-using [:b]))
             :b (-> (component-b)
                    (using [:a]))
             :c (-> (component-c)
                    (using [:a :b]))
             :d (-> (component-d)
                    (using {:b :b :c :c}))
             :e (component-e)})
Start your system
 system-started-with-co-deps (co-dependency/start-system (system-1)))
Retrieving co-dependencies values
 a (-> system-started-with-co-deps :a))
 a-from-b (:a @(-> system-started-with-co-deps :a :b)))
hecking identity equality
ert (= a a-from-b))
Using stuartsierra reloaded workflow

If you use stuartsierra “reloaded” workflow then update original stuartsierra dev/start function by:

n start
tarts the current development system."

lter-var-root #'system co-dependency/start-system))
Do you need more help?

Follow the test provided to learn how to use it :)

Drawbacks

In contrast with normal dependencies that you get using clojure map functions

pendency-key component)
 dependency

when you want to retrieve a co-dependency you need to deref the co-dependency value

o-dependency-key component)
 co-dependency
Co-dependencies are NOT bound during a component's start phase.

Co-dependencies are bound after a component's start phase. Therefore, a component's co-dependencies will not be accessible, even via a dereference of the co-dependency, during a component's start.

Re-read that last paragraph until you understand that you cannot make use of a co-dependency's data until after the start phase of a given component. You can make use of a co-dependency's data after the component has been fully started, which usually means in a function (such as a Ring handler).

The penalty for not understanding this point is days spent figuring out why you can't see a co-dependency's data. It's because you're still trying to access this data within the start phase of your component. Don't do this. Defer the lookup until after the entire start phase of your system has completed.

License

Copyright © 2014 Juan Antonio Ruz (juxt.pro)

Distributed under the Eclipse Public License, the same as Clojure


This work is supported by the National Institutes of Health's National Center for Advancing Translational Sciences, Grant Number U24TR002306. This work is solely the responsibility of the creators and does not necessarily represent the official views of the National Institutes of Health.