From fb45dbbb4ea92954394f01f22a3f43e3205d7149 Mon Sep 17 00:00:00 2001 From: anatoly Date: Sat, 5 Dec 2015 20:31:17 -0500 Subject: [PATCH 01/27] removing dependency on var meta --- src/mount/core.clj | 124 +++++++++++++++++++------------------ test/app/utils/logging.clj | 4 +- 2 files changed, 66 insertions(+), 62 deletions(-) diff --git a/src/mount/core.clj b/src/mount/core.clj index aa7b7f2..6ee78b4 100644 --- a/src/mount/core.clj +++ b/src/mount/core.clj @@ -4,17 +4,15 @@ (defonce ^:private mount-state 42) (defonce ^:private -args (atom :no-args)) ;; mostly for command line args and external files (defonce ^:private state-seq (atom 0)) -(defonce ^:private state-order (atom {})) +(defonce ^:private meta-state (atom {})) (defonce ^:private running (atom {})) ;; to clean dirty states on redefs ;; supporting tools.namespace: (disable-reload!) (alter-meta! *ns* assoc ::load false) ;; to exclude the dependency (defn- make-state-seq [state] - (or (@state-order state) - (let [nseq (swap! state-seq inc)] - (swap! state-order assoc state nseq) - nseq))) + (or (:order (@meta-state state)) + (swap! state-seq inc))) (deftype NotStartedState [state] Object @@ -30,13 +28,13 @@ (IllegalArgumentException. "suspendable state should have a resume function (i.e. missing :resume fn)")))) (defn- with-ns [ns name] - (str ns "/" name)) + (str "#'" ns "/" name)) (defn- pounded? [f] (let [pound "(fn* [] "] ;;TODO: think of a better (i.e. typed) way to distinguish #(f params) from (fn [params] (...))) (.startsWith (str f) pound))) -(defn- unpound [f] +(defn unpound [f] (if (pounded? f) (nth f 2) ;; magic 2 is to get the body => ["fn*" "[]" "(fn body)"] f)) @@ -50,88 +48,91 @@ (when-let [stop (@running state)] (stop))) +;; (!) TODO: this should be private (needs thinking) +;; it is public now, can be called by "defstate" on macro expansion +(defn update-meta! [path v] + (swap! meta-state assoc-in path v)) + (defmacro defstate [state & body] (let [[state params] (macro/name-with-attributes state body) - {:keys [start stop suspend resume] :as lifecycle} (apply hash-map params)] + {:keys [start stop suspend resume] :as lifecycle} (apply hash-map params) + state-name (with-ns *ns* state) + order (make-state-seq state-name) + sym (str state)] (validate lifecycle) - (cleanup-if-dirty (with-ns *ns* state)) + (cleanup-if-dirty state-name) (let [s-meta (cond-> {:mount-state mount-state - :order (make-state-seq (with-ns *ns* state)) - :start `(fn [] ~start) + :order order + :start `(fn [] ~start) :status #{:stopped}} - stop (assoc :stop `(fn [] ~(unpound stop))) + stop (assoc :stop `(fn [] ~stop)) suspend (assoc :suspend `(fn [] ~suspend)) resume (assoc :resume `(fn [] ~resume)))] - `(defonce ~(with-meta state (merge (meta state) s-meta)) - (NotStartedState. ~(str state)))))) + `(do + (defonce ~state (NotStartedState. ~state-name)) + (update-meta! [~state-name] (assoc ~s-meta :var (var ~state))) + (var ~state))))) -(defn- record! [{:keys [ns name]} f done] +(defn- record! [state-name f done] (let [state (f)] - (swap! done conj (ns-resolve ns name)) + (swap! done conj state-name) state)) -(defn- up [var {:keys [ns name start stop resume status] :as state} done] +(defn- up [state {:keys [var start stop resume status]} done] (when-not (:started status) (let [s (try (if (:suspended status) (record! state resume done) (record! state start done)) (catch Throwable t - (throw (RuntimeException. (str "could not start [" name "] due to") t))))] - (intern ns (symbol name) s) - (swap! running assoc (with-ns ns name) stop) - (alter-meta! var assoc :status #{:started})))) + (throw (RuntimeException. (str "could not start [" state "] due to") t))))] + (alter-var-root var (constantly s)) + (swap! running assoc state stop) + (update-meta! [state :status] #{:started})))) -(defn- down [var {:keys [ns name stop status] :as state} done] +(defn- down [state {:keys [var stop status]} done] (when (some status #{:started :suspended}) (when stop (try (record! state stop done) (catch Throwable t - (throw (RuntimeException. (str "could not stop [" name "] due to") t))))) - (intern ns (symbol name) (NotStartedState. name)) ;; (!) if a state does not have :stop when _should_ this might leak - (swap! running dissoc (with-ns ns name)) - (alter-meta! var assoc :status #{:stopped}))) + (throw (RuntimeException. (str "could not stop [" state "] due to") t))))) + (alter-var-root var (constantly (NotStartedState. state))) ;; (!) if a state does not have :stop when _should_ this might leak + (swap! running dissoc state) + (update-meta! [state :status] #{:stopped}))) -(defn- sigstop [var {:keys [ns name suspend resume status] :as state} done] +(defn- sigstop [state {:keys [var resume suspend status]} done] (when (and (:started status) resume) ;; can't have suspend without resume, but the reverse is possible (when suspend ;; don't suspend if there is only resume function (just mark it :suspended?) (let [s (try (record! state suspend done) (catch Throwable t - (throw (RuntimeException. (str "could not suspend [" name "] due to") t))))] - (intern ns (symbol name) s))) - (alter-meta! var assoc :status #{:suspended}))) + (throw (RuntimeException. (str "could not suspend [" state "] due to") t))))] + (alter-var-root var (constantly s)))) + (update-meta! [state :status] #{:suspended}))) -(defn- sigcont [var {:keys [ns name start resume status] :as state} done] +(defn- sigcont [state {:keys [var resume status]} done] (when (instance? NotStartedState var) - (throw (RuntimeException. (str "could not resume [" name "] since it is stoppped (i.e. not suspended)")))) + (throw (RuntimeException. (str "could not resume [" state "] since it is stoppped (i.e. not suspended)")))) (when (:suspended status) (let [s (try (record! state resume done) (catch Throwable t - (throw (RuntimeException. (str "could not resume [" name "] due to") t))))] - (intern ns (symbol name) s) - (alter-meta! var assoc :status #{:started})))) + (throw (RuntimeException. (str "could not resume [" state "] due to") t))))] + (alter-var-root var (constantly s)) + (update-meta! [state :status] #{:started})))) ;;TODO args might need more thinking (defn args [] @-args) -(defn mount-state? [var] - (= (-> var meta :mount-state) - mount-state)) - -(defn find-all-states [] - (->> (all-ns) - (mapcat ns-interns) - (map second) - (filter mount-state?))) +(defn- find-all-states [] + (keys @meta-state)) ;;TODO ns based for now. need to be _state_ based -(defn- add-deps [{:keys [ns] :as state} all] +#_(defn- add-deps [{:keys [ns] :as state} all] (let [refers (ns-refers ns) any (set all) deps (filter (comp any val) refers)] (assoc state :deps deps))) -(defn states-with-deps [] +#_(defn states-with-deps [] (let [all (find-all-states)] (->> (map (comp #(add-deps % all) #(select-keys % [:name :order :ns :status]) @@ -141,10 +142,11 @@ (defn- bring [states fun order] (let [done (atom [])] - (->> states - (sort-by (comp :order meta) order) - (map #(fun % (meta %) done)) - dorun) + (as-> states $ + (map str $) + (select-keys @meta-state $) + (sort-by (comp :order val) order $) + (doseq [[k v] $] (fun k v done))) @done)) (defn- merge-lifecycles @@ -159,23 +161,23 @@ :start start :stop stop :suspend suspend :resume resume))) (defn- rollback! [state] - (let [{:keys [origin]} (meta state)] + (let [{:keys [origin] :as sub} (@meta-state state)] (when origin - (alter-meta! state #(merge-lifecycles % origin))))) + (update-meta! [state] (merge-lifecycles sub origin))))) (defn- substitute! [state with] (let [lifecycle-fns #(select-keys % [:start :stop :suspend :resume :status]) - origin (meta state) - sub (meta with)] - (alter-meta! with assoc :sub? true) - (alter-meta! state #(merge-lifecycles % (lifecycle-fns origin) sub)))) + origin (@meta-state state) + sub (@meta-state with)] + (update-meta! [with :sub?] true) + (update-meta! [state] (merge-lifecycles origin (lifecycle-fns origin) sub)))) (defn- unsub [state] - (when (-> (meta state) :sub?) - (alter-meta! state dissoc :sub?))) + (when (-> (@meta-state state) :sub?) + (update-meta! [state :sub?] nil))) (defn- all-without-subs [] - (remove (comp :sub? meta) (find-all-states))) + (remove (comp :sub? @meta-state) (find-all-states))) (defn start [& states] (let [states (or (seq states) (all-without-subs))] @@ -190,6 +192,7 @@ (defn stop-except [& states] (let [all (set (find-all-states)) + states (map str states) states (remove (set states) all)] (apply stop states))) @@ -201,12 +204,13 @@ (defn start-with [with] (doseq [[from to] with] - (substitute! from to)) + (substitute! (str from) (str to))) (start)) (defn start-without [& states] (if (first states) (let [app (set (all-without-subs)) + states (map str states) without (remove (set states) app)] (apply start without)) (start))) diff --git a/test/app/utils/logging.clj b/test/app/utils/logging.clj index dc0216c..2d8c64d 100644 --- a/test/app/utils/logging.clj +++ b/test/app/utils/logging.clj @@ -26,10 +26,10 @@ :resume (if (status :suspended) ">> resuming"))) (defn log-status [f & args] - (let [{:keys [ns name] :as state} (second args) + (let [{:keys [var] :as state} (second args) action (f-to-action f)] (when-let [taking-over-the-world (whatcha-doing? state action)] - (info (str taking-over-the-world ".. " (ns-resolve ns name)))) + (info (str taking-over-the-world ".. " var))) (apply f args))) (defonce lifecycle-fns From 3d95aa9fc67f8c313cad5de9bbe6069bb0014bf0 Mon Sep 17 00:00:00 2001 From: anatoly Date: Sat, 5 Dec 2015 22:55:51 -0500 Subject: [PATCH 02/27] #10: adding cljc mode (DerefableState). cljs is next. --- src/mount/core.clj | 85 +++++++++++++++++++---------- test/check/fun_with_values_test.clj | 16 +++++- 2 files changed, 70 insertions(+), 31 deletions(-) diff --git a/src/mount/core.clj b/src/mount/core.clj index 6ee78b4..3435fdb 100644 --- a/src/mount/core.clj +++ b/src/mount/core.clj @@ -1,9 +1,9 @@ (ns mount.core (:require [mount.tools.macro :as macro])) -(defonce ^:private mount-state 42) (defonce ^:private -args (atom :no-args)) ;; mostly for command line args and external files (defonce ^:private state-seq (atom 0)) +(defonce ^:private mode (atom :clj)) (defonce ^:private meta-state (atom {})) (defonce ^:private running (atom {})) ;; to clean dirty states on redefs @@ -48,77 +48,102 @@ (when-let [stop (@running state)] (stop))) +(defn current-state [state] + (let [{:keys [inst var]} (@meta-state state)] + (if (= @mode :cljc) + @inst + (var-get var)))) + +(defn alter-state! [{:keys [var inst]} value] + (if (= @mode :cljc) + (reset! inst value) + (alter-var-root var (constantly value)))) + ;; (!) TODO: this should be private (needs thinking) ;; it is public now, can be called by "defstate" on macro expansion (defn update-meta! [path v] (swap! meta-state assoc-in path v)) -(defmacro defstate [state & body] - (let [[state params] (macro/name-with-attributes state body) - {:keys [start stop suspend resume] :as lifecycle} (apply hash-map params) - state-name (with-ns *ns* state) - order (make-state-seq state-name) - sym (str state)] - (validate lifecycle) - (cleanup-if-dirty state-name) - (let [s-meta (cond-> {:mount-state mount-state - :order order - :start `(fn [] ~start) - :status #{:stopped}} - stop (assoc :stop `(fn [] ~stop)) - suspend (assoc :suspend `(fn [] ~suspend)) - resume (assoc :resume `(fn [] ~resume)))] - `(do - (defonce ~state (NotStartedState. ~state-name)) - (update-meta! [~state-name] (assoc ~s-meta :var (var ~state))) - (var ~state))))) - (defn- record! [state-name f done] (let [state (f)] (swap! done conj state-name) state)) -(defn- up [state {:keys [var start stop resume status]} done] +(defn- up [state {:keys [start stop resume status] :as current} done] (when-not (:started status) (let [s (try (if (:suspended status) (record! state resume done) (record! state start done)) (catch Throwable t (throw (RuntimeException. (str "could not start [" state "] due to") t))))] - (alter-var-root var (constantly s)) + (alter-state! current s) (swap! running assoc state stop) (update-meta! [state :status] #{:started})))) -(defn- down [state {:keys [var stop status]} done] +(defn- down [state {:keys [stop status] :as current} done] (when (some status #{:started :suspended}) (when stop (try (record! state stop done) (catch Throwable t (throw (RuntimeException. (str "could not stop [" state "] due to") t))))) - (alter-var-root var (constantly (NotStartedState. state))) ;; (!) if a state does not have :stop when _should_ this might leak + (alter-state! current (NotStartedState. state)) ;; (!) if a state does not have :stop when _should_ this might leak (swap! running dissoc state) (update-meta! [state :status] #{:stopped}))) -(defn- sigstop [state {:keys [var resume suspend status]} done] +(defn- sigstop [state {:keys [resume suspend status] :as current} done] (when (and (:started status) resume) ;; can't have suspend without resume, but the reverse is possible (when suspend ;; don't suspend if there is only resume function (just mark it :suspended?) (let [s (try (record! state suspend done) (catch Throwable t (throw (RuntimeException. (str "could not suspend [" state "] due to") t))))] - (alter-var-root var (constantly s)))) + (alter-state! current s))) (update-meta! [state :status] #{:suspended}))) -(defn- sigcont [state {:keys [var resume status]} done] - (when (instance? NotStartedState var) +(defn- sigcont [state {:keys [resume status] :as current} done] + (when (instance? NotStartedState state) ;; TODO: in ":cljc", if resume is needed, auto start on @ should be disabled (throw (RuntimeException. (str "could not resume [" state "] since it is stoppped (i.e. not suspended)")))) (when (:suspended status) (let [s (try (record! state resume done) (catch Throwable t (throw (RuntimeException. (str "could not resume [" state "] due to") t))))] - (alter-var-root var (constantly s)) + (alter-state! current s) (update-meta! [state :status] #{:started})))) +(deftype DerefableState [name] + clojure.lang.IDeref + (deref [this] + (let [{:keys [status inst] :as state} (@meta-state name)] + (when-not (:started status) + (up name state (atom #{}))) + @inst))) + +(defmacro defstate [state & body] + (let [[state params] (macro/name-with-attributes state body) + {:keys [start stop suspend resume] :as lifecycle} (apply hash-map params) + state-name (with-ns *ns* state) ;; on cljs side (cljs.analyzer/*cljs-ns*) may do it, but still might not be good for :advanced + order (make-state-seq state-name) + sym (str state)] + (validate lifecycle) + (cleanup-if-dirty state-name) + (let [s-meta (cond-> {:order order + :start `(fn [] ~start) + :status #{:stopped}} + stop (assoc :stop `(fn [] ~stop)) + suspend (assoc :suspend `(fn [] ~suspend)) + resume (assoc :resume `(fn [] ~resume)))] + `(do + (defonce ~state (DerefableState. ~state-name)) + (update-meta! [~state-name] (assoc ~s-meta :inst (atom (NotStartedState. ~state-name)) + :var (var ~state))) + (var ~state))))) + +(defn in-cljc-mode [] + (reset! mode :cljc)) + +(defn in-clj-mode [] + (reset! mode :clj)) + ;;TODO args might need more thinking (defn args [] @-args) diff --git a/test/check/fun_with_values_test.clj b/test/check/fun_with_values_test.clj index f1f4772..6f0a89f 100644 --- a/test/check/fun_with_values_test.clj +++ b/test/check/fun_with_values_test.clj @@ -43,6 +43,19 @@ (use-fixtures :each with-fun-and-values) (deftest fun-with-values + (is (= @scalar 42)) + (is (= (@fun) 42)) + (is (= @with-fun 42)) + (is (= (@with-partial 1) 42)) + (is (= (@f-in-f 1) 42)) + (is (= @f-no-args-value 42)) + (is (= (@f-no-args) 42)) + (is (= (@f-args 41 1) 42)) + (is (= (@private-f 1) 42)) + (is (= @f-value 42))) + +(deftest deref-fun-with-values + (mount/in-cljc-mode) (is (= scalar 42)) (is (= (fun) 42)) (is (= with-fun 42)) @@ -52,4 +65,5 @@ (is (= (f-no-args) 42)) (is (= (f-args 41 1) 42)) (is (= (private-f 1) 42)) - (is (= f-value 42))) + (is (= f-value 42)) + (mount/in-clj-mode)) From 26974942686cb709ed0c17a704224c4cfc45fccb Mon Sep 17 00:00:00 2001 From: anatoly Date: Sat, 5 Dec 2015 23:00:13 -0500 Subject: [PATCH 03/27] swapping fun with values (deref vs. values) --- test/check/fun_with_values_test.clj | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/test/check/fun_with_values_test.clj b/test/check/fun_with_values_test.clj index 6f0a89f..6b30eae 100644 --- a/test/check/fun_with_values_test.clj +++ b/test/check/fun_with_values_test.clj @@ -43,19 +43,6 @@ (use-fixtures :each with-fun-and-values) (deftest fun-with-values - (is (= @scalar 42)) - (is (= (@fun) 42)) - (is (= @with-fun 42)) - (is (= (@with-partial 1) 42)) - (is (= (@f-in-f 1) 42)) - (is (= @f-no-args-value 42)) - (is (= (@f-no-args) 42)) - (is (= (@f-args 41 1) 42)) - (is (= (@private-f 1) 42)) - (is (= @f-value 42))) - -(deftest deref-fun-with-values - (mount/in-cljc-mode) (is (= scalar 42)) (is (= (fun) 42)) (is (= with-fun 42)) @@ -65,5 +52,18 @@ (is (= (f-no-args) 42)) (is (= (f-args 41 1) 42)) (is (= (private-f 1) 42)) - (is (= f-value 42)) + (is (= f-value 42))) + +(deftest deref-fun-with-values + (mount/in-cljc-mode) + (is (= @scalar 42)) + (is (= (@fun) 42)) + (is (= @with-fun 42)) + (is (= (@with-partial 1) 42)) + (is (= (@f-in-f 1) 42)) + (is (= @f-no-args-value 42)) + (is (= (@f-no-args) 42)) + (is (= (@f-args 41 1) 42)) + (is (= (@private-f 1) 42)) + (is (= @f-value 42)) (mount/in-clj-mode)) From b07b29f0289aca5a4106855e25cd6247f77f68a6 Mon Sep 17 00:00:00 2001 From: anatoly Date: Sat, 5 Dec 2015 23:59:16 -0500 Subject: [PATCH 04/27] reloading between tests in clj/c modes also "defstate"'s "defonce" is now "def" --- src/mount/core.clj | 2 +- test/check/deref/fun_with_values_test.clj | 58 +++++++++++++++++++++++ test/check/deref/private_fun_test.clj | 16 +++++++ test/check/fun_with_values_test.clj | 14 ------ 4 files changed, 75 insertions(+), 15 deletions(-) create mode 100644 test/check/deref/fun_with_values_test.clj create mode 100644 test/check/deref/private_fun_test.clj diff --git a/src/mount/core.clj b/src/mount/core.clj index 3435fdb..4c2aba9 100644 --- a/src/mount/core.clj +++ b/src/mount/core.clj @@ -133,7 +133,7 @@ suspend (assoc :suspend `(fn [] ~suspend)) resume (assoc :resume `(fn [] ~resume)))] `(do - (defonce ~state (DerefableState. ~state-name)) + (def ~state (DerefableState. ~state-name)) (update-meta! [~state-name] (assoc ~s-meta :inst (atom (NotStartedState. ~state-name)) :var (var ~state))) (var ~state))))) diff --git a/test/check/deref/fun_with_values_test.clj b/test/check/deref/fun_with_values_test.clj new file mode 100644 index 0000000..a71b336 --- /dev/null +++ b/test/check/deref/fun_with_values_test.clj @@ -0,0 +1,58 @@ +(ns check.deref.fun-with-values-test + (:require [mount.core :as mount :refer [defstate]] + [clojure.test :refer :all])) + +(defn f [n] + (fn [m] + (+ n m))) + +(defn g [a b] + (+ a b)) + +(defn- pf [n] + (+ 41 n)) + +(defn fna [] + 42) + +(defstate scalar :start 42) +(defstate fun :start #(inc 41)) +(defstate with-fun :start (inc 41)) +(defstate with-partial :start (partial g 41)) +(defstate f-in-f :start (f 41)) +(defstate f-no-args-value :start (fna)) +(defstate f-no-args :start fna) +(defstate f-args :start g) +(defstate f-value :start (g 41 1)) +(defstate private-f :start pf) + +(defn with-fun-and-values [f] + (mount/in-cljc-mode) + (require :reload 'check.deref.fun-with-values-test) + (mount/start #'check.deref.fun-with-values-test/scalar + #'check.deref.fun-with-values-test/fun + #'check.deref.fun-with-values-test/with-fun + #'check.deref.fun-with-values-test/with-partial + #'check.deref.fun-with-values-test/f-in-f + #'check.deref.fun-with-values-test/f-args + #'check.deref.fun-with-values-test/f-no-args-value + #'check.deref.fun-with-values-test/f-no-args + #'check.deref.fun-with-values-test/private-f + #'check.deref.fun-with-values-test/f-value) + (f) + (mount/stop) + (mount/in-clj-mode)) + +(use-fixtures :each with-fun-and-values) + +(deftest fun-with-values + (is (= @scalar 42)) + (is (= (@fun) 42)) + (is (= @with-fun 42)) + (is (= (@with-partial 1) 42)) + (is (= (@f-in-f 1) 42)) + (is (= @f-no-args-value 42)) + (is (= (@f-no-args) 42)) + (is (= (@f-args 41 1) 42)) + (is (= (@private-f 1) 42)) + (is (= @f-value 42))) diff --git a/test/check/deref/private_fun_test.clj b/test/check/deref/private_fun_test.clj new file mode 100644 index 0000000..4996ff9 --- /dev/null +++ b/test/check/deref/private_fun_test.clj @@ -0,0 +1,16 @@ +(ns check.deref.private-fun-test + (:require [mount.core :as mount :refer [defstate]] + [check.deref.fun-with-values-test :refer [private-f]] + [clojure.test :refer :all])) + +(defn with-fun-and-values [f] + (mount/in-cljc-mode) + (mount/start #'check.deref.fun-with-values-test/private-f) + (f) + (mount/stop) + (mount/in-clj-mode)) + +(use-fixtures :each with-fun-and-values) + +(deftest fun-with-valuesj + (is (= (@private-f 1) 42))) diff --git a/test/check/fun_with_values_test.clj b/test/check/fun_with_values_test.clj index 6b30eae..f1f4772 100644 --- a/test/check/fun_with_values_test.clj +++ b/test/check/fun_with_values_test.clj @@ -53,17 +53,3 @@ (is (= (f-args 41 1) 42)) (is (= (private-f 1) 42)) (is (= f-value 42))) - -(deftest deref-fun-with-values - (mount/in-cljc-mode) - (is (= @scalar 42)) - (is (= (@fun) 42)) - (is (= @with-fun 42)) - (is (= (@with-partial 1) 42)) - (is (= (@f-in-f 1) 42)) - (is (= @f-no-args-value 42)) - (is (= (@f-no-args) 42)) - (is (= (@f-args 41 1) 42)) - (is (= (@private-f 1) 42)) - (is (= @f-value 42)) - (mount/in-clj-mode)) From 57b63ddcaa41a9a6dfba5dce08c9c8f4fa87006f Mon Sep 17 00:00:00 2001 From: anatoly Date: Sun, 6 Dec 2015 00:23:37 -0500 Subject: [PATCH 05/27] hiding "update-meta!" and, and calling it via var (thx @DomKM) --- src/mount/core.clj | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/mount/core.clj b/src/mount/core.clj index 4c2aba9..e35dbc5 100644 --- a/src/mount/core.clj +++ b/src/mount/core.clj @@ -59,9 +59,7 @@ (reset! inst value) (alter-var-root var (constantly value)))) -;; (!) TODO: this should be private (needs thinking) -;; it is public now, can be called by "defstate" on macro expansion -(defn update-meta! [path v] +(defn- update-meta! [path v] (swap! meta-state assoc-in path v)) (defn- record! [state-name f done] @@ -134,8 +132,8 @@ resume (assoc :resume `(fn [] ~resume)))] `(do (def ~state (DerefableState. ~state-name)) - (update-meta! [~state-name] (assoc ~s-meta :inst (atom (NotStartedState. ~state-name)) - :var (var ~state))) + ((var update-meta!) [~state-name] (assoc ~s-meta :inst (atom (NotStartedState. ~state-name)) + :var (var ~state))) (var ~state))))) (defn in-cljc-mode [] From da0922850aaf38caf0173d3ad0284b8213ed5fa0 Mon Sep 17 00:00:00 2001 From: anatoly Date: Sun, 6 Dec 2015 16:16:48 -0500 Subject: [PATCH 06/27] #10: "clj => cljc" with deref support --- src/mount/{core.clj => core.cljc} | 78 ++++++++++++----------- src/mount/tools/cljs.cljs | 9 +++ src/mount/tools/{macro.clj => macro.cljc} | 12 ++++ 3 files changed, 63 insertions(+), 36 deletions(-) rename src/mount/{core.clj => core.cljc} (76%) create mode 100644 src/mount/tools/cljs.cljs rename src/mount/tools/{macro.clj => macro.cljc} (81%) diff --git a/src/mount/core.clj b/src/mount/core.cljc similarity index 76% rename from src/mount/core.clj rename to src/mount/core.cljc index e35dbc5..9a4cf22 100644 --- a/src/mount/core.clj +++ b/src/mount/core.cljc @@ -1,5 +1,6 @@ (ns mount.core - (:require [mount.tools.macro :as macro])) + (:require [mount.tools.macro :refer [on-error throw-runtime] :as macro]) + #?(:cljs [mount.tools.cljs :as cljs])) (defonce ^:private -args (atom :no-args)) ;; mostly for command line args and external files (defonce ^:private state-seq (atom 0)) @@ -8,7 +9,8 @@ (defonce ^:private running (atom {})) ;; to clean dirty states on redefs ;; supporting tools.namespace: (disable-reload!) -(alter-meta! *ns* assoc ::load false) ;; to exclude the dependency +#?(:clj + (alter-meta! *ns* assoc ::load false)) ;; to exclude the dependency (defn- make-state-seq [state] (or (:order (@meta-state state)) @@ -22,17 +24,17 @@ ;;TODO validate the whole lifecycle (defn- validate [{:keys [start stop suspend resume] :as lifecycle}] (cond - (not start) (throw - (IllegalArgumentException. "can't start a stateful thing without a start function. (i.e. missing :start fn)")) - (and suspend (not resume)) (throw - (IllegalArgumentException. "suspendable state should have a resume function (i.e. missing :resume fn)")))) + (not start) (throw-runtime "can't start a stateful thing without a start function. (i.e. missing :start fn)") + (and suspend + (not resume)) (throw-runtime "suspendable state should have a resume function (i.e. missing :resume fn)"))) (defn- with-ns [ns name] (str "#'" ns "/" name)) (defn- pounded? [f] - (let [pound "(fn* [] "] ;;TODO: think of a better (i.e. typed) way to distinguish #(f params) from (fn [params] (...))) - (.startsWith (str f) pound))) + (let [pound "(fn* [] "] ;;TODO: think of a better (i.e. typed) way to distinguish #(f params) from (fn [params] (...))) + #?(:clj (.startsWith (str f) pound) + :cljs (cljs/starts-with? (str f) pound)))) (defn unpound [f] (if (pounded? f) @@ -48,16 +50,26 @@ (when-let [stop (@running state)] (stop))) -(defn current-state [state] - (let [{:keys [inst var]} (@meta-state state)] - (if (= @mode :cljc) - @inst - (var-get var)))) +#?(:clj + (defn current-state [state] + (let [{:keys [inst var]} (@meta-state state)] + (if (= @mode :cljc) + @inst + (var-get var)))) -(defn alter-state! [{:keys [var inst]} value] - (if (= @mode :cljc) - (reset! inst value) - (alter-var-root var (constantly value)))) + :cljs + (defn current-state [state] + (-> (@meta-state state) :inst deref))) + +#?(:clj + (defn alter-state! [{:keys [var inst]} value] + (if (= @mode :cljc) + (reset! inst value) + (alter-var-root var (constantly value)))) + + :cljs + (defn alter-state! [{:keys [inst]} value] + (reset! inst value))) (defn- update-meta! [path v] (swap! meta-state assoc-in path v)) @@ -69,11 +81,10 @@ (defn- up [state {:keys [start stop resume status] :as current} done] (when-not (:started status) - (let [s (try (if (:suspended status) - (record! state resume done) - (record! state start done)) - (catch Throwable t - (throw (RuntimeException. (str "could not start [" state "] due to") t))))] + (let [s (on-error (str "could not start [" state "] due to") + (if (:suspended status) + (record! state resume done) + (record! state start done)))] (alter-state! current s) (swap! running assoc state stop) (update-meta! [state :status] #{:started})))) @@ -81,10 +92,8 @@ (defn- down [state {:keys [stop status] :as current} done] (when (some status #{:started :suspended}) (when stop - (try - (record! state stop done) - (catch Throwable t - (throw (RuntimeException. (str "could not stop [" state "] due to") t))))) + (on-error (str "could not stop [" state "] due to") + (record! state stop done))) (alter-state! current (NotStartedState. state)) ;; (!) if a state does not have :stop when _should_ this might leak (swap! running dissoc state) (update-meta! [state :status] #{:stopped}))) @@ -92,19 +101,15 @@ (defn- sigstop [state {:keys [resume suspend status] :as current} done] (when (and (:started status) resume) ;; can't have suspend without resume, but the reverse is possible (when suspend ;; don't suspend if there is only resume function (just mark it :suspended?) - (let [s (try (record! state suspend done) - (catch Throwable t - (throw (RuntimeException. (str "could not suspend [" state "] due to") t))))] + (let [s (on-error (str "could not suspend [" state "] due to") + (record! state suspend done))] (alter-state! current s))) (update-meta! [state :status] #{:suspended}))) -(defn- sigcont [state {:keys [resume status] :as current} done] - (when (instance? NotStartedState state) ;; TODO: in ":cljc", if resume is needed, auto start on @ should be disabled - (throw (RuntimeException. (str "could not resume [" state "] since it is stoppped (i.e. not suspended)")))) +(defn- sigcont [state {:keys [resume status] :as current} done] (when (:suspended status) - (let [s (try (record! state resume done) - (catch Throwable t - (throw (RuntimeException. (str "could not resume [" state "] due to") t))))] + (let [s (on-error (str "could not resume [" state "] due to") + (record! state resume done))] (alter-state! current s) (update-meta! [state :status] #{:started})))) @@ -119,7 +124,8 @@ (defmacro defstate [state & body] (let [[state params] (macro/name-with-attributes state body) {:keys [start stop suspend resume] :as lifecycle} (apply hash-map params) - state-name (with-ns *ns* state) ;; on cljs side (cljs.analyzer/*cljs-ns*) may do it, but still might not be good for :advanced + state-name (with-ns #?(:clj *ns* + :cljs (cljs/this-ns)) state) ;; on cljs side (cljs.analyzer/*cljs-ns*) may do it, but still might not be good for :advanced order (make-state-seq state-name) sym (str state)] (validate lifecycle) diff --git a/src/mount/tools/cljs.cljs b/src/mount/tools/cljs.cljs new file mode 100644 index 0000000..35f1fc3 --- /dev/null +++ b/src/mount/tools/cljs.cljs @@ -0,0 +1,9 @@ +(ns mount.tools.cljs + (:require [cljs.analyzer :as ana] + [goog.string :as gstring])) + +(defn this-ns [] + ana/*cljs-ns*) + +(defn starts-with? [s pre] + (gstring/startsWith s pre)) diff --git a/src/mount/tools/macro.clj b/src/mount/tools/macro.cljc similarity index 81% rename from src/mount/tools/macro.clj rename to src/mount/tools/macro.cljc index a0b1e1c..22961aa 100644 --- a/src/mount/tools/macro.clj +++ b/src/mount/tools/macro.cljc @@ -1,5 +1,17 @@ (ns mount.tools.macro) +(defmacro on-error [msg f] + `(try + ~f + (catch #?(:clj Throwable + :cljs :default) t# + (throw #?(:clj (RuntimeException. ~msg t#) + :cljs (js/Error (str ~msg (.-stack t#)))))))) + +(defmacro throw-runtime [msg] + `(throw #?(:clj (RuntimeException. ~msg) + :cljs (js/Error (str ~msg))))) + ;; this is a one to one copy from https://github.com/clojure/tools.macro ;; to avoid a lib dependency for a single function From 362036a3b9d1de48ff50c5b000298fe48919a21b Mon Sep 17 00:00:00 2001 From: anatoly Date: Sun, 6 Dec 2015 17:56:31 -0500 Subject: [PATCH 07/27] [#10]: plugin cljs/figwheel; IDeref from cljs --- .gitignore | 3 ++- project.clj | 31 +++++++++++++++++++++++++++---- src/mount/core.cljc | 16 +++++++++++----- test/mount/example/cljs.cljs | 10 ++++++++++ test/resources/public/index.html | 6 ++++++ 5 files changed, 56 insertions(+), 10 deletions(-) create mode 100644 test/mount/example/cljs.cljs create mode 100644 test/resources/public/index.html diff --git a/.gitignore b/.gitignore index e86df66..35a2e79 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,8 @@ pom.xml pom.xml.asc .repl* -dev-resources/ +/dev-resources +/resources/public figwheel_server.log *.jar *.class diff --git a/project.clj b/project.clj index 451b12e..6f646e7 100644 --- a/project.clj +++ b/project.clj @@ -6,13 +6,36 @@ :source-paths ["src"] - :dependencies [[org.clojure/clojure "1.7.0"]] + :dependencies [[org.clojure/clojure "1.7.0"] + [org.clojure/clojurescript "1.7.170"]] :profiles {:dev {:source-paths ["dev" "test/app"] - :dependencies [[yesql "0.5.1"] - [ch.qos.logback/logback-classic "1.1.3"] + :dependencies [[ch.qos.logback/logback-classic "1.1.3"] [org.clojure/tools.logging "0.3.1"] [robert/hooke "1.3.0"] [org.clojure/tools.namespace "0.2.11"] [org.clojure/tools.nrepl "0.2.11"] - [com.datomic/datomic-free "0.9.5327" :exclusions [joda-time]]]}}) + [com.datomic/datomic-free "0.9.5327" :exclusions [joda-time]]] + + :plugins [[lein-cljsbuild "1.1.1"] + [lein-figwheel "0.5.0-2"]] + + :cljsbuild { + :builds [{:id "dev" + :source-paths ["src" "test"] + :figwheel {:on-jsload "mount.example.cljs/on-js-reload" } + + :compiler {:main mount.example.cljs + :asset-path "js/compiled/out" + :output-to "test/resources/public/js/compiled/mount.js" + :output-dir "test/resources/public/js/compiled/out" + :optimizations :none + :source-map true + :source-map-timestamp true + :cache-analysis true }} + {:id "prod" + :source-paths ["src" "test"] + :compiler {:output-to "test/resources/public/js/compiled/mount.js" + :main mount.example.cljs + :optimizations :advanced + :pretty-print false}}]}}}) diff --git a/src/mount/core.cljc b/src/mount/core.cljc index 9a4cf22..4e60235 100644 --- a/src/mount/core.cljc +++ b/src/mount/core.cljc @@ -1,6 +1,9 @@ -(ns mount.core - (:require [mount.tools.macro :refer [on-error throw-runtime] :as macro]) - #?(:cljs [mount.tools.cljs :as cljs])) +(ns #?(:clj mount.core + :cljs ^:figwheel-no-load mount.core) + #?(:clj (:require [mount.tools.macro :refer [on-error throw-runtime] :as macro]) + :cljs (:require [mount.tools.macro :as macro] + [mount.tools.cljs :as cljs])) + #?(:cljs (:require-macros [mount.tools.macro :refer [on-error throw-runtime]]))) (defonce ^:private -args (atom :no-args)) ;; mostly for command line args and external files (defonce ^:private state-seq (atom 0)) @@ -114,8 +117,11 @@ (update-meta! [state :status] #{:started})))) (deftype DerefableState [name] - clojure.lang.IDeref - (deref [this] + #?(:clj clojure.lang.IDeref + :cljs IDeref) + (#?(:clj deref + :cljs -deref) + [_] (let [{:keys [status inst] :as state} (@meta-state name)] (when-not (:started status) (up name state (atom #{}))) diff --git a/test/mount/example/cljs.cljs b/test/mount/example/cljs.cljs new file mode 100644 index 0000000..25361ea --- /dev/null +++ b/test/mount/example/cljs.cljs @@ -0,0 +1,10 @@ +(ns mount.example.cljs + (:require [mount.core :as mount]) + (:require-macros [mount.core :refer [defstate]])) + +(enable-console-print!) + +(println "hi from mount!") + +(defn on-js-reload [] + "reloading js..") diff --git a/test/resources/public/index.html b/test/resources/public/index.html new file mode 100644 index 0000000..f7ca4d9 --- /dev/null +++ b/test/resources/public/index.html @@ -0,0 +1,6 @@ + + + + + + From 87e59dedccfa541729487870d21062738c988f7b Mon Sep 17 00:00:00 2001 From: anatoly Date: Mon, 7 Dec 2015 00:00:52 -0500 Subject: [PATCH 08/27] #10: first pass on cljs support is in --- .gitignore | 2 +- project.clj | 3 +-- test/mount/example/app_config.cljs | 8 ++++++++ test/mount/example/cljs.cljs | 13 ++++++++----- test/mount/example/websockets.cljs | 17 +++++++++++++++++ 5 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 test/mount/example/app_config.cljs create mode 100644 test/mount/example/websockets.cljs diff --git a/.gitignore b/.gitignore index 35a2e79..5c17b56 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ pom.xml pom.xml.asc .repl* /dev-resources -/resources/public +/test/resources/public/js figwheel_server.log *.jar *.class diff --git a/project.clj b/project.clj index 6f646e7..41163a2 100644 --- a/project.clj +++ b/project.clj @@ -23,7 +23,7 @@ :cljsbuild { :builds [{:id "dev" :source-paths ["src" "test"] - :figwheel {:on-jsload "mount.example.cljs/on-js-reload" } + ;; :figwheel {:on-jsload "mount.example.cljs/on-js-reload"} :compiler {:main mount.example.cljs :asset-path "js/compiled/out" @@ -36,6 +36,5 @@ {:id "prod" :source-paths ["src" "test"] :compiler {:output-to "test/resources/public/js/compiled/mount.js" - :main mount.example.cljs :optimizations :advanced :pretty-print false}}]}}}) diff --git a/test/mount/example/app_config.cljs b/test/mount/example/app_config.cljs new file mode 100644 index 0000000..4952209 --- /dev/null +++ b/test/mount/example/app_config.cljs @@ -0,0 +1,8 @@ +(ns mount.example.app-config + (:require-macros [mount.core :refer [defstate]])) + +(defn load-config [path] + (println "loading config from " path " (at least pretending)") + {:system-a {:uri "ws://echo.websocket.org/"}}) + +(defstate config :start (load-config "resources/config.end")) diff --git a/test/mount/example/cljs.cljs b/test/mount/example/cljs.cljs index 25361ea..a7d800f 100644 --- a/test/mount/example/cljs.cljs +++ b/test/mount/example/cljs.cljs @@ -1,10 +1,13 @@ (ns mount.example.cljs - (:require [mount.core :as mount]) - (:require-macros [mount.core :refer [defstate]])) + (:require [mount.core :as mount] + [mount.example.websockets :refer [system-a]])) (enable-console-print!) -(println "hi from mount!") +(println "(mount/start)" (mount/start)) -(defn on-js-reload [] - "reloading js..") +(println "system-a: " @system-a) + +;; time for websocket to connect +(js/setTimeout #(println "(mount/stop)" (mount/stop)) + 500) diff --git a/test/mount/example/websockets.cljs b/test/mount/example/websockets.cljs new file mode 100644 index 0000000..068a492 --- /dev/null +++ b/test/mount/example/websockets.cljs @@ -0,0 +1,17 @@ +(ns mount.example.websockets + (:require [mount.example.app-config :refer [config]]) + (:require-macros [mount.core :refer [defstate]])) + +(defn connect [uri] + (println "connecting to " uri) + (let [ws (js/WebSocket. uri)] + (set! (.-onopen ws) #(println "opening ws @" uri)) + (set! (.-onclose ws) #(println "closing ws @" uri)) + ws)) + +(defn disconnect [ws] + (println "disconnecting " @ws) + (.close @ws)) + +(defstate system-a :start (connect (get-in @config [:system-a :uri])) + :stop (disconnect system-a)) From 7669aa27869b026bf546461aa7a9391040fa5a51 Mon Sep 17 00:00:00 2001 From: anatoly Date: Mon, 7 Dec 2015 00:24:59 -0500 Subject: [PATCH 09/27] #10: cleaning lein cljsbuild targets --- project.clj | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/project.clj b/project.clj index 41163a2..e92ffeb 100644 --- a/project.clj +++ b/project.clj @@ -20,10 +20,13 @@ :plugins [[lein-cljsbuild "1.1.1"] [lein-figwheel "0.5.0-2"]] + :clean-targets ^{:protect false} [:target-path + [:cljsbuild :builds :dev :compiler :output-dir] + [:cljsbuild :builds :prod :compiler :output-to]] :cljsbuild { - :builds [{:id "dev" - :source-paths ["src" "test"] - ;; :figwheel {:on-jsload "mount.example.cljs/on-js-reload"} + :builds {:dev + {:source-paths ["src" "test"] + :figwheel true :compiler {:main mount.example.cljs :asset-path "js/compiled/out" @@ -32,9 +35,9 @@ :optimizations :none :source-map true :source-map-timestamp true - :cache-analysis true }} - {:id "prod" - :source-paths ["src" "test"] + :cache-analysis true}} + :prod + {:source-paths ["src" "test"] :compiler {:output-to "test/resources/public/js/compiled/mount.js" :optimizations :advanced - :pretty-print false}}]}}}) + :pretty-print false}}}}}}) From 03f13d1b71d4bc4d4b2a90e29b15f48a79647bcb Mon Sep 17 00:00:00 2001 From: anatoly Date: Sun, 6 Dec 2015 00:29:21 -0500 Subject: [PATCH 10/27] circle ci: link to 0.1.6 branch --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7a3660b..b1271c1 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ _**Alan J. Perlis** from [Structure and Interpretation of Computer Programs](htt module | branch | status ----------|----------|---------- mount | `master` | [![Circle CI](https://circleci.com/gh/tolitius/mount/tree/master.png?style=svg)](https://circleci.com/gh/tolitius/mount/tree/master) - mount | `0.1.5` | [![Circle CI](https://circleci.com/gh/tolitius/mount/tree/0.1.5.png?style=svg)](https://circleci.com/gh/tolitius/mount/tree/0.1.5) + mount | `0.1.6` | [![Circle CI](https://circleci.com/gh/tolitius/mount/tree/0.1.6.png?style=svg)](https://circleci.com/gh/tolitius/mount/tree/0.1.6) [![Clojars Project](http://clojars.org/mount/latest-version.svg)](http://clojars.org/mount) From d1d14bc710a61c0a4c181ff5509232c73c2f304b Mon Sep 17 00:00:00 2001 From: anatoly Date: Mon, 7 Dec 2015 13:16:53 -0500 Subject: [PATCH 11/27] #10: adding datascript to the cljs example app --- .gitignore | 3 +-- .../public/index.html | 0 project.clj | 14 +++++------ src/mount/core.cljc | 3 +-- test/mount/example/app.cljs | 16 +++++++++++++ test/mount/example/app_config.cljs | 3 ++- test/mount/example/audit_log.cljs | 24 +++++++++++++++++++ test/mount/example/cljs.cljs | 13 ---------- test/mount/example/websockets.cljs | 11 +++++---- 9 files changed, 57 insertions(+), 30 deletions(-) rename {test/resources => dev-resources}/public/index.html (100%) create mode 100644 test/mount/example/app.cljs create mode 100644 test/mount/example/audit_log.cljs delete mode 100644 test/mount/example/cljs.cljs diff --git a/.gitignore b/.gitignore index 5c17b56..f7c8d0f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,8 +4,7 @@ pom.xml pom.xml.asc .repl* -/dev-resources -/test/resources/public/js +/dev-resources/resources/public/js/* figwheel_server.log *.jar *.class diff --git a/test/resources/public/index.html b/dev-resources/public/index.html similarity index 100% rename from test/resources/public/index.html rename to dev-resources/public/index.html diff --git a/project.clj b/project.clj index e92ffeb..100c6a9 100644 --- a/project.clj +++ b/project.clj @@ -10,7 +10,8 @@ [org.clojure/clojurescript "1.7.170"]] :profiles {:dev {:source-paths ["dev" "test/app"] - :dependencies [[ch.qos.logback/logback-classic "1.1.3"] + :dependencies [[datascript "0.13.3"] + [ch.qos.logback/logback-classic "1.1.3"] [org.clojure/tools.logging "0.3.1"] [robert/hooke "1.3.0"] [org.clojure/tools.namespace "0.2.11"] @@ -28,16 +29,15 @@ {:source-paths ["src" "test"] :figwheel true - :compiler {:main mount.example.cljs + :compiler {:main mount.example.app :asset-path "js/compiled/out" - :output-to "test/resources/public/js/compiled/mount.js" - :output-dir "test/resources/public/js/compiled/out" + :output-to "dev-resources/public/js/compiled/mount.js" + :output-dir "dev-resources/public/js/compiled/out" :optimizations :none :source-map true - :source-map-timestamp true - :cache-analysis true}} + :source-map-timestamp true}} :prod {:source-paths ["src" "test"] - :compiler {:output-to "test/resources/public/js/compiled/mount.js" + :compiler {:output-to "dev-resources/public/js/compiled/mount.js" :optimizations :advanced :pretty-print false}}}}}}) diff --git a/src/mount/core.cljc b/src/mount/core.cljc index 4e60235..9e7994c 100644 --- a/src/mount/core.cljc +++ b/src/mount/core.cljc @@ -1,5 +1,4 @@ -(ns #?(:clj mount.core - :cljs ^:figwheel-no-load mount.core) +(ns mount.core #?(:clj (:require [mount.tools.macro :refer [on-error throw-runtime] :as macro]) :cljs (:require [mount.tools.macro :as macro] [mount.tools.cljs :as cljs])) diff --git a/test/mount/example/app.cljs b/test/mount/example/app.cljs new file mode 100644 index 0000000..e0027a8 --- /dev/null +++ b/test/mount/example/app.cljs @@ -0,0 +1,16 @@ +(ns mount.example.app + (:require [mount.core :as mount] + [mount.example.app-config] + [mount.example.websockets] + [mount.example.audit-log :refer [log find-all-logs]])) + +(defn show-log [] + (.write js/document + (interpose "
" (find-all-logs log)))) + +(mount/start) + +;; time for websocket to connect +(js/setTimeout #(do (mount/stop-except "#'mount.example.audit-log/log") + (show-log)) 500) + diff --git a/test/mount/example/app_config.cljs b/test/mount/example/app_config.cljs index 4952209..c3687fc 100644 --- a/test/mount/example/app_config.cljs +++ b/test/mount/example/app_config.cljs @@ -1,8 +1,9 @@ (ns mount.example.app-config + (:require [mount.example.audit-log :refer [audit log]]) (:require-macros [mount.core :refer [defstate]])) (defn load-config [path] - (println "loading config from " path " (at least pretending)") + (audit log :app-config "loading config from '" path "' (at least pretending)") {:system-a {:uri "ws://echo.websocket.org/"}}) (defstate config :start (load-config "resources/config.end")) diff --git a/test/mount/example/audit_log.cljs b/test/mount/example/audit_log.cljs new file mode 100644 index 0000000..1e29ee7 --- /dev/null +++ b/test/mount/example/audit_log.cljs @@ -0,0 +1,24 @@ +(ns mount.example.audit-log + (:require [datascript.core :as d]) + (:require-macros [mount.core :refer [defstate]])) + +(defstate log :start (d/create-conn {})) + +(defn audit [db source & msg] + (d/transact! @db [{:db/id -1 + :source source + :timestamp (js/Date.) + :msg (apply str msg)}])) + +(defn find-source-logs [db source] + (d/q '{:find [?t ?msg] + :in [$ ?s] + :where [[?e :source ?s] + [?e :timestamp ?t] + [?e :msg ?msg]]} + @@db source)) + +(defn find-all-logs [db] + (->> (map :e (d/datoms @@db :aevt :timestamp)) + dedupe + (d/pull-many @@db '[:timestamp :source :msg]))) diff --git a/test/mount/example/cljs.cljs b/test/mount/example/cljs.cljs deleted file mode 100644 index a7d800f..0000000 --- a/test/mount/example/cljs.cljs +++ /dev/null @@ -1,13 +0,0 @@ -(ns mount.example.cljs - (:require [mount.core :as mount] - [mount.example.websockets :refer [system-a]])) - -(enable-console-print!) - -(println "(mount/start)" (mount/start)) - -(println "system-a: " @system-a) - -;; time for websocket to connect -(js/setTimeout #(println "(mount/stop)" (mount/stop)) - 500) diff --git a/test/mount/example/websockets.cljs b/test/mount/example/websockets.cljs index 068a492..df90485 100644 --- a/test/mount/example/websockets.cljs +++ b/test/mount/example/websockets.cljs @@ -1,16 +1,17 @@ (ns mount.example.websockets - (:require [mount.example.app-config :refer [config]]) + (:require [mount.example.app-config :refer [config]] + [mount.example.audit-log :refer [audit log]]) (:require-macros [mount.core :refer [defstate]])) (defn connect [uri] - (println "connecting to " uri) + (audit log :system-a "connecting to '" uri "'") (let [ws (js/WebSocket. uri)] - (set! (.-onopen ws) #(println "opening ws @" uri)) - (set! (.-onclose ws) #(println "closing ws @" uri)) + (set! (.-onopen ws) #(audit log :system-a "opening ws @" uri)) + (set! (.-onclose ws) #(audit log :system-a "closing ws @" uri)) ws)) (defn disconnect [ws] - (println "disconnecting " @ws) + (audit log "disconnecting " @ws) (.close @ws)) (defstate system-a :start (connect (get-in @config [:system-a :uri])) From 8a57f8590fc88dce6867f5e7caa1dabcf08c845e Mon Sep 17 00:00:00 2001 From: anatoly Date: Mon, 7 Dec 2015 15:57:51 -0500 Subject: [PATCH 12/27] #10: formating audit logs (joda/hiccup and friends) --- .gitignore | 2 +- project.clj | 2 ++ test/mount/example/app.cljs | 20 +++++++++++++++----- test/mount/example/audit_log.cljs | 5 +++-- test/mount/example/websockets.cljs | 14 +++++++++----- 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index f7c8d0f..45cf3f2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ pom.xml pom.xml.asc .repl* -/dev-resources/resources/public/js/* +dev-resources/public/js/* figwheel_server.log *.jar *.class diff --git a/project.clj b/project.clj index 100c6a9..36f25f2 100644 --- a/project.clj +++ b/project.clj @@ -11,6 +11,8 @@ :profiles {:dev {:source-paths ["dev" "test/app"] :dependencies [[datascript "0.13.3"] + [hiccups "0.3.0"] + [com.andrewmcveigh/cljs-time "0.3.14"] [ch.qos.logback/logback-classic "1.1.3"] [org.clojure/tools.logging "0.3.1"] [robert/hooke "1.3.0"] diff --git a/test/mount/example/app.cljs b/test/mount/example/app.cljs index e0027a8..20f18c2 100644 --- a/test/mount/example/app.cljs +++ b/test/mount/example/app.cljs @@ -2,15 +2,25 @@ (:require [mount.core :as mount] [mount.example.app-config] [mount.example.websockets] - [mount.example.audit-log :refer [log find-all-logs]])) + [mount.example.audit-log :refer [log find-all-logs]] + [cljs-time.format :refer [unparse formatters]] + [hiccups.runtime :as hiccupsrt]) + (:require-macros [hiccups.core :as hiccups :refer [html]])) + +(defn format-log-event [{:keys [timestamp source msg]}] + (str (unparse (formatters :date-hour-minute-second-fraction) timestamp) + " → [" (name source) "]: " msg)) (defn show-log [] (.write js/document - (interpose "
" (find-all-logs log)))) + (html [:ul (doall (for [e (find-all-logs log)] + [:li (format-log-event e)]))]))) (mount/start) -;; time for websocket to connect -(js/setTimeout #(do (mount/stop-except "#'mount.example.audit-log/log") - (show-log)) 500) +;; time to establish a websocket connection before disconnecting +(js/setTimeout #(mount/stop-except "#'mount.example.audit-log/log") 500) + +;; time to close a connection to show it in audit +(js/setTimeout #(show-log) 1000) diff --git a/test/mount/example/audit_log.cljs b/test/mount/example/audit_log.cljs index 1e29ee7..f4525ec 100644 --- a/test/mount/example/audit_log.cljs +++ b/test/mount/example/audit_log.cljs @@ -1,5 +1,6 @@ (ns mount.example.audit-log - (:require [datascript.core :as d]) + (:require [datascript.core :as d] + [cljs-time.core :refer [now]]) (:require-macros [mount.core :refer [defstate]])) (defstate log :start (d/create-conn {})) @@ -7,7 +8,7 @@ (defn audit [db source & msg] (d/transact! @db [{:db/id -1 :source source - :timestamp (js/Date.) + :timestamp (now) :msg (apply str msg)}])) (defn find-source-logs [db source] diff --git a/test/mount/example/websockets.cljs b/test/mount/example/websockets.cljs index df90485..49cd25a 100644 --- a/test/mount/example/websockets.cljs +++ b/test/mount/example/websockets.cljs @@ -3,16 +3,20 @@ [mount.example.audit-log :refer [audit log]]) (:require-macros [mount.core :refer [defstate]])) +(defn ws-status [ws] + {:url (.-url ws) :ready-state (.-readyState ws)}) + (defn connect [uri] - (audit log :system-a "connecting to '" uri "'") (let [ws (js/WebSocket. uri)] - (set! (.-onopen ws) #(audit log :system-a "opening ws @" uri)) - (set! (.-onclose ws) #(audit log :system-a "closing ws @" uri)) + (audit log :system-a "connecting to " (ws-status ws)) + (set! (.-onopen ws) #(audit log :system-a "opened " (ws-status ws))) + (set! (.-onclose ws) #(audit log :system-a "closed " (ws-status ws))) ws)) (defn disconnect [ws] - (audit log "disconnecting " @ws) - (.close @ws)) + (audit log :system-a "closing " (ws-status @ws)) + (.close @ws) + (audit log :system-a "disconnecting " (ws-status @ws))) (defstate system-a :start (connect (get-in @config [:system-a :uri])) :stop (disconnect system-a)) From 61f54cf12ab2daa43ba0f834a1bf3201c88cb6d0 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Mon, 7 Dec 2015 16:00:35 -0500 Subject: [PATCH 13/27] [docs circle ci]: cljc build link --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b1271c1..2777984 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,8 @@ _**Alan J. Perlis** from [Structure and Interpretation of Computer Programs](htt ----------|----------|---------- mount | `master` | [![Circle CI](https://circleci.com/gh/tolitius/mount/tree/master.png?style=svg)](https://circleci.com/gh/tolitius/mount/tree/master) mount | `0.1.6` | [![Circle CI](https://circleci.com/gh/tolitius/mount/tree/0.1.6.png?style=svg)](https://circleci.com/gh/tolitius/mount/tree/0.1.6) - + mount | `cljc` | [![Circle CI](https://circleci.com/gh/tolitius/mount/tree/cljc.png?style=svg)](https://circleci.com/gh/tolitius/mount/tree/cljc) + [![Clojars Project](http://clojars.org/mount/latest-version.svg)](http://clojars.org/mount) From 8e34001122b11d99d628df947d7cd9b3af8b80a0 Mon Sep 17 00:00:00 2001 From: anatoly Date: Mon, 7 Dec 2015 19:50:03 -0500 Subject: [PATCH 14/27] reorging sample clj/cljs apps. ready for cljs tests --- test/app/config.clj => dev/clj/app/conf.clj | 6 ++--- test/app/app.clj => dev/clj/app/example.clj | 6 ++--- {test => dev/clj}/app/nyse.clj | 6 ++--- {test => dev/clj}/app/utils/datomic.clj | 0 {test => dev/clj}/app/utils/logging.clj | 0 .../example => dev/cljs/app}/audit_log.cljs | 2 +- .../app_config.cljs => dev/cljs/app/conf.cljs | 6 ++--- .../app.cljs => dev/cljs/app/example.cljs | 10 ++++---- .../example => dev/cljs/app}/websockets.cljs | 6 ++--- dev/dev.clj | 9 +++---- {test => dev}/resources/config.edn | 0 .../resources}/public/index.html | 0 project.clj | 12 ++++----- test/check/cleanup_dirty_states_test.clj | 13 ---------- test/clj/mount/cleanup_dirty_states_test.clj | 13 ++++++++++ .../mount}/deref/fun_with_values_test.clj | 24 +++++++++--------- .../mount}/deref/private_fun_test.clj | 6 ++--- .../mount}/fun_with_values_test.clj | 22 ++++++++-------- test/{check => clj/mount}/parts_test.clj | 4 +-- .../{check => clj/mount}/private_fun_test.clj | 6 ++--- test/{check => clj/mount}/start_with_test.clj | 22 ++++++++-------- .../mount}/start_without_test.clj | 10 ++++---- .../{check => clj/mount}/stop_except_test.clj | 16 ++++++------ .../mount}/suspend_resume_test.clj | 25 ++++++++++--------- test/cljs/mount/waiting.for.cljs.tests | 1 + 25 files changed, 112 insertions(+), 113 deletions(-) rename test/app/config.clj => dev/clj/app/conf.clj (73%) rename test/app/app.clj => dev/clj/app/example.clj (95%) rename {test => dev/clj}/app/nyse.clj (80%) rename {test => dev/clj}/app/utils/datomic.clj (100%) rename {test => dev/clj}/app/utils/logging.clj (100%) rename {test/mount/example => dev/cljs/app}/audit_log.cljs (96%) rename test/mount/example/app_config.cljs => dev/cljs/app/conf.cljs (53%) rename test/mount/example/app.cljs => dev/cljs/app/example.cljs (74%) rename {test/mount/example => dev/cljs/app}/websockets.cljs (82%) rename {test => dev}/resources/config.edn (100%) rename {dev-resources => dev/resources}/public/index.html (100%) delete mode 100644 test/check/cleanup_dirty_states_test.clj create mode 100644 test/clj/mount/cleanup_dirty_states_test.clj rename test/{check => clj/mount}/deref/fun_with_values_test.clj (58%) rename test/{check => clj/mount}/deref/private_fun_test.clj (64%) rename test/{check => clj/mount}/fun_with_values_test.clj (62%) rename test/{check => clj/mount}/parts_test.clj (84%) rename test/{check => clj/mount}/private_fun_test.clj (63%) rename test/{check => clj/mount}/start_with_test.clj (69%) rename test/{check => clj/mount}/start_without_test.clj (62%) rename test/{check => clj/mount}/stop_except_test.clj (68%) rename test/{check => clj/mount}/suspend_resume_test.clj (87%) create mode 100644 test/cljs/mount/waiting.for.cljs.tests diff --git a/test/app/config.clj b/dev/clj/app/conf.clj similarity index 73% rename from test/app/config.clj rename to dev/clj/app/conf.clj index 1e18a59..3273a95 100644 --- a/test/app/config.clj +++ b/dev/clj/app/conf.clj @@ -1,4 +1,4 @@ -(ns app.config +(ns app.conf (:require [mount.core :as mount :refer [defstate]] [clojure.edn :as edn] [clojure.tools.logging :refer [info]])) @@ -9,5 +9,5 @@ slurp edn/read-string)) -(defstate app-config - :start (load-config "test/resources/config.edn")) +(defstate config + :start (load-config "dev/resources/config.edn")) diff --git a/test/app/app.clj b/dev/clj/app/example.clj similarity index 95% rename from test/app/app.clj rename to dev/clj/app/example.clj index f529c95..81ffb49 100644 --- a/test/app/app.clj +++ b/dev/clj/app/example.clj @@ -1,9 +1,9 @@ -(ns app +(ns app.example (:require [datomic.api :as d] [clojure.tools.nrepl.server :refer [start-server stop-server]] [mount.core :as mount :refer [defstate]] [app.utils.datomic :refer [touch]] - [app.config :refer [app-config]] + [app.conf :refer [config]] [app.nyse :as nyse])) ;; example on creating a network REPL @@ -11,7 +11,7 @@ (start-server :bind host :port port)) ;; nREPL is just another simple state -(defstate nrepl :start (start-nrepl (:nrepl app-config)) +(defstate nrepl :start (start-nrepl (:nrepl config)) :stop (stop-server nrepl)) ;; datomic schema diff --git a/test/app/nyse.clj b/dev/clj/app/nyse.clj similarity index 80% rename from test/app/nyse.clj rename to dev/clj/app/nyse.clj index 649dfad..f6a8ede 100644 --- a/test/app/nyse.clj +++ b/dev/clj/app/nyse.clj @@ -2,7 +2,7 @@ (:require [mount.core :as mount :refer [defstate]] [datomic.api :as d] [clojure.tools.logging :refer [info]] - [app.config :refer [app-config]])) + [app.conf :refer [config]])) (defn- new-connection [conf] (info "conf: " conf) @@ -17,5 +17,5 @@ (.release conn) ;; usually it's not released, here just to illustrate the access to connection on (stop) (d/delete-database uri))) -(defstate conn :start (new-connection app-config) - :stop (disconnect app-config conn)) +(defstate conn :start (new-connection config) + :stop (disconnect config conn)) diff --git a/test/app/utils/datomic.clj b/dev/clj/app/utils/datomic.clj similarity index 100% rename from test/app/utils/datomic.clj rename to dev/clj/app/utils/datomic.clj diff --git a/test/app/utils/logging.clj b/dev/clj/app/utils/logging.clj similarity index 100% rename from test/app/utils/logging.clj rename to dev/clj/app/utils/logging.clj diff --git a/test/mount/example/audit_log.cljs b/dev/cljs/app/audit_log.cljs similarity index 96% rename from test/mount/example/audit_log.cljs rename to dev/cljs/app/audit_log.cljs index f4525ec..9ce586c 100644 --- a/test/mount/example/audit_log.cljs +++ b/dev/cljs/app/audit_log.cljs @@ -1,4 +1,4 @@ -(ns mount.example.audit-log +(ns app.audit-log (:require [datascript.core :as d] [cljs-time.core :refer [now]]) (:require-macros [mount.core :refer [defstate]])) diff --git a/test/mount/example/app_config.cljs b/dev/cljs/app/conf.cljs similarity index 53% rename from test/mount/example/app_config.cljs rename to dev/cljs/app/conf.cljs index c3687fc..14d0adb 100644 --- a/test/mount/example/app_config.cljs +++ b/dev/cljs/app/conf.cljs @@ -1,9 +1,9 @@ -(ns mount.example.app-config - (:require [mount.example.audit-log :refer [audit log]]) +(ns app.conf + (:require [app.audit-log :refer [audit log]]) (:require-macros [mount.core :refer [defstate]])) (defn load-config [path] - (audit log :app-config "loading config from '" path "' (at least pretending)") + (audit log :app-conf "loading config from '" path "' (at least pretending)") {:system-a {:uri "ws://echo.websocket.org/"}}) (defstate config :start (load-config "resources/config.end")) diff --git a/test/mount/example/app.cljs b/dev/cljs/app/example.cljs similarity index 74% rename from test/mount/example/app.cljs rename to dev/cljs/app/example.cljs index 20f18c2..2b9b475 100644 --- a/test/mount/example/app.cljs +++ b/dev/cljs/app/example.cljs @@ -1,8 +1,8 @@ -(ns mount.example.app +(ns app.example (:require [mount.core :as mount] - [mount.example.app-config] - [mount.example.websockets] - [mount.example.audit-log :refer [log find-all-logs]] + [app.conf] + [app.websockets] + [app.audit-log :refer [log find-all-logs]] [cljs-time.format :refer [unparse formatters]] [hiccups.runtime :as hiccupsrt]) (:require-macros [hiccups.core :as hiccups :refer [html]])) @@ -19,7 +19,7 @@ (mount/start) ;; time to establish a websocket connection before disconnecting -(js/setTimeout #(mount/stop-except "#'mount.example.audit-log/log") 500) +(js/setTimeout #(mount/stop-except "#'app.audit-log/log") 500) ;; time to close a connection to show it in audit (js/setTimeout #(show-log) 1000) diff --git a/test/mount/example/websockets.cljs b/dev/cljs/app/websockets.cljs similarity index 82% rename from test/mount/example/websockets.cljs rename to dev/cljs/app/websockets.cljs index 49cd25a..ae0dc4c 100644 --- a/test/mount/example/websockets.cljs +++ b/dev/cljs/app/websockets.cljs @@ -1,6 +1,6 @@ -(ns mount.example.websockets - (:require [mount.example.app-config :refer [config]] - [mount.example.audit-log :refer [audit log]]) +(ns app.websockets + (:require [app.conf :refer [config]] + [app.audit-log :refer [audit log]]) (:require-macros [mount.core :refer [defstate]])) (defn ws-status [ws] diff --git a/dev/dev.clj b/dev/dev.clj index e74d05b..1982e87 100644 --- a/dev/dev.clj +++ b/dev/dev.clj @@ -10,18 +10,15 @@ [clojure.string :as str] [clojure.test :as test] [clojure.tools.namespace.repl :as tn] - [check.parts-test] - [check.start-with-test] - [check.suspend-resume-test] [mount.core :as mount] [app.utils.logging :refer [with-logging-status]] - [app :refer [create-nyse-schema find-orders add-order]])) ;; <<<< replace this your "app" namespace(s) you want to be available at REPL time + [app.example :refer [create-nyse-schema find-orders add-order]])) ;; <<<< replace this your "app" namespace(s) you want to be available at REPL time (defn start [] (with-logging-status) - (mount/start #'app.config/app-config + (mount/start #'app.conf/config #'app.nyse/conn - #'app/nrepl)) ;; example on how to start app with certain states + #'app.example/nrepl)) ;; example on how to start app with certain states (defn stop [] (mount/stop)) diff --git a/test/resources/config.edn b/dev/resources/config.edn similarity index 100% rename from test/resources/config.edn rename to dev/resources/config.edn diff --git a/dev-resources/public/index.html b/dev/resources/public/index.html similarity index 100% rename from dev-resources/public/index.html rename to dev/resources/public/index.html diff --git a/project.clj b/project.clj index 36f25f2..898a5ba 100644 --- a/project.clj +++ b/project.clj @@ -9,7 +9,7 @@ :dependencies [[org.clojure/clojure "1.7.0"] [org.clojure/clojurescript "1.7.170"]] - :profiles {:dev {:source-paths ["dev" "test/app"] + :profiles {:dev {:source-paths ["dev" "dev/clj" "test/clj"] :dependencies [[datascript "0.13.3"] [hiccups "0.3.0"] [com.andrewmcveigh/cljs-time "0.3.14"] @@ -28,18 +28,18 @@ [:cljsbuild :builds :prod :compiler :output-to]] :cljsbuild { :builds {:dev - {:source-paths ["src" "test"] + {:source-paths ["dev/cljs" "test/cljs"] :figwheel true - :compiler {:main mount.example.app + :compiler {:main app.example :asset-path "js/compiled/out" - :output-to "dev-resources/public/js/compiled/mount.js" - :output-dir "dev-resources/public/js/compiled/out" + :output-to "dev/resources/public/js/compiled/mount.js" + :output-dir "dev/resources/public/js/compiled/out" :optimizations :none :source-map true :source-map-timestamp true}} :prod {:source-paths ["src" "test"] - :compiler {:output-to "dev-resources/public/js/compiled/mount.js" + :compiler {:output-to "dev/resources/public/js/compiled/mount.js" :optimizations :advanced :pretty-print false}}}}}}) diff --git a/test/check/cleanup_dirty_states_test.clj b/test/check/cleanup_dirty_states_test.clj deleted file mode 100644 index 73fd0a8..0000000 --- a/test/check/cleanup_dirty_states_test.clj +++ /dev/null @@ -1,13 +0,0 @@ -(ns check.cleanup_dirty_states_test - (:require [mount.core :as mount] - [app] - [clojure.test :refer :all])) - -(deftest cleanup-dirty-states - (let [_ (mount/start)] - (is (not (.isClosed (:server-socket app/nrepl)))) - (require 'app :reload) - (mount/start) ;; should not result in "BindException Address already in use" since the clean up will stop the previous instance - (is (not (.isClosed (:server-socket app/nrepl)))) - (mount/stop) - (is (instance? mount.core.NotStartedState app/nrepl)))) diff --git a/test/clj/mount/cleanup_dirty_states_test.clj b/test/clj/mount/cleanup_dirty_states_test.clj new file mode 100644 index 0000000..2d62575 --- /dev/null +++ b/test/clj/mount/cleanup_dirty_states_test.clj @@ -0,0 +1,13 @@ +(ns mount.cleanup_dirty_states_test + (:require [mount.core :as mount] + [app.example] + [clojure.test :refer :all])) + +(deftest cleanup-dirty-states + (let [_ (mount/start)] + (is (not (.isClosed (:server-socket app.example/nrepl)))) + (require 'app.example :reload) + (mount/start) ;; should not result in "BindException Address already in use" since the clean up will stop the previous instance + (is (not (.isClosed (:server-socket app.example/nrepl)))) + (mount/stop) + (is (instance? mount.core.NotStartedState app.example/nrepl)))) diff --git a/test/check/deref/fun_with_values_test.clj b/test/clj/mount/deref/fun_with_values_test.clj similarity index 58% rename from test/check/deref/fun_with_values_test.clj rename to test/clj/mount/deref/fun_with_values_test.clj index a71b336..eeb3883 100644 --- a/test/check/deref/fun_with_values_test.clj +++ b/test/clj/mount/deref/fun_with_values_test.clj @@ -1,4 +1,4 @@ -(ns check.deref.fun-with-values-test +(ns mount.deref.fun-with-values-test (:require [mount.core :as mount :refer [defstate]] [clojure.test :refer :all])) @@ -28,17 +28,17 @@ (defn with-fun-and-values [f] (mount/in-cljc-mode) - (require :reload 'check.deref.fun-with-values-test) - (mount/start #'check.deref.fun-with-values-test/scalar - #'check.deref.fun-with-values-test/fun - #'check.deref.fun-with-values-test/with-fun - #'check.deref.fun-with-values-test/with-partial - #'check.deref.fun-with-values-test/f-in-f - #'check.deref.fun-with-values-test/f-args - #'check.deref.fun-with-values-test/f-no-args-value - #'check.deref.fun-with-values-test/f-no-args - #'check.deref.fun-with-values-test/private-f - #'check.deref.fun-with-values-test/f-value) + (require :reload 'mount.deref.fun-with-values-test) + (mount/start #'mount.deref.fun-with-values-test/scalar + #'mount.deref.fun-with-values-test/fun + #'mount.deref.fun-with-values-test/with-fun + #'mount.deref.fun-with-values-test/with-partial + #'mount.deref.fun-with-values-test/f-in-f + #'mount.deref.fun-with-values-test/f-args + #'mount.deref.fun-with-values-test/f-no-args-value + #'mount.deref.fun-with-values-test/f-no-args + #'mount.deref.fun-with-values-test/private-f + #'mount.deref.fun-with-values-test/f-value) (f) (mount/stop) (mount/in-clj-mode)) diff --git a/test/check/deref/private_fun_test.clj b/test/clj/mount/deref/private_fun_test.clj similarity index 64% rename from test/check/deref/private_fun_test.clj rename to test/clj/mount/deref/private_fun_test.clj index 4996ff9..38f1dbe 100644 --- a/test/check/deref/private_fun_test.clj +++ b/test/clj/mount/deref/private_fun_test.clj @@ -1,11 +1,11 @@ -(ns check.deref.private-fun-test +(ns mount.deref.private-fun-test (:require [mount.core :as mount :refer [defstate]] - [check.deref.fun-with-values-test :refer [private-f]] + [mount.deref.fun-with-values-test :refer [private-f]] [clojure.test :refer :all])) (defn with-fun-and-values [f] (mount/in-cljc-mode) - (mount/start #'check.deref.fun-with-values-test/private-f) + (mount/start #'mount.deref.fun-with-values-test/private-f) (f) (mount/stop) (mount/in-clj-mode)) diff --git a/test/check/fun_with_values_test.clj b/test/clj/mount/fun_with_values_test.clj similarity index 62% rename from test/check/fun_with_values_test.clj rename to test/clj/mount/fun_with_values_test.clj index f1f4772..22693ad 100644 --- a/test/check/fun_with_values_test.clj +++ b/test/clj/mount/fun_with_values_test.clj @@ -1,4 +1,4 @@ -(ns check.fun-with-values-test +(ns mount.fun-with-values-test (:require [mount.core :as mount :refer [defstate]] [clojure.test :refer :all])) @@ -27,16 +27,16 @@ (defstate private-f :start pf) (defn with-fun-and-values [f] - (mount/start #'check.fun-with-values-test/scalar - #'check.fun-with-values-test/fun - #'check.fun-with-values-test/with-fun - #'check.fun-with-values-test/with-partial - #'check.fun-with-values-test/f-in-f - #'check.fun-with-values-test/f-args - #'check.fun-with-values-test/f-no-args-value - #'check.fun-with-values-test/f-no-args - #'check.fun-with-values-test/private-f - #'check.fun-with-values-test/f-value) + (mount/start #'mount.fun-with-values-test/scalar + #'mount.fun-with-values-test/fun + #'mount.fun-with-values-test/with-fun + #'mount.fun-with-values-test/with-partial + #'mount.fun-with-values-test/f-in-f + #'mount.fun-with-values-test/f-args + #'mount.fun-with-values-test/f-no-args-value + #'mount.fun-with-values-test/f-no-args + #'mount.fun-with-values-test/private-f + #'mount.fun-with-values-test/f-value) (f) (mount/stop)) diff --git a/test/check/parts_test.clj b/test/clj/mount/parts_test.clj similarity index 84% rename from test/check/parts_test.clj rename to test/clj/mount/parts_test.clj index 53f4b38..c387ce3 100644 --- a/test/check/parts_test.clj +++ b/test/clj/mount/parts_test.clj @@ -1,4 +1,4 @@ -(ns check.parts-test +(ns mount.parts-test (:require [mount.core :as mount :refer [defstate] :as m] [app.nyse :refer [conn]] [clojure.test :refer :all])) @@ -6,7 +6,7 @@ (defstate should-not-start :start #(constantly 42)) (defn with-parts [f] - (m/start #'app.config/app-config #'app.nyse/conn) + (m/start #'app.conf/config #'app.nyse/conn) (f) (m/stop)) diff --git a/test/check/private_fun_test.clj b/test/clj/mount/private_fun_test.clj similarity index 63% rename from test/check/private_fun_test.clj rename to test/clj/mount/private_fun_test.clj index 2f2c413..85cc31c 100644 --- a/test/check/private_fun_test.clj +++ b/test/clj/mount/private_fun_test.clj @@ -1,10 +1,10 @@ -(ns check.private-fun-test +(ns mount.private-fun-test (:require [mount.core :as mount :refer [defstate]] - [check.fun-with-values-test :refer [private-f]] + [mount.fun-with-values-test :refer [private-f]] [clojure.test :refer :all])) (defn with-fun-and-values [f] - (mount/start #'check.fun-with-values-test/private-f) + (mount/start #'mount.fun-with-values-test/private-f) (f) (mount/stop)) diff --git a/test/check/start_with_test.clj b/test/clj/mount/start_with_test.clj similarity index 69% rename from test/check/start_with_test.clj rename to test/clj/mount/start_with_test.clj index 8e362c0..59b0b98 100644 --- a/test/check/start_with_test.clj +++ b/test/clj/mount/start_with_test.clj @@ -1,8 +1,8 @@ -(ns check.start-with-test +(ns mount.start-with-test (:require [mount.core :as mount :refer [defstate]] - [app.config :refer [app-config]] + [app.conf :refer [config]] [app.nyse :refer [conn]] - [app :refer [nrepl]] + [app.example :refer [nrepl]] [clojure.test :refer :all])) (defstate test-conn :start 42 @@ -13,22 +13,22 @@ (deftest start-with (testing "should start with substitutes" - (let [_ (mount/start-with {#'app.nyse/conn #'check.start-with-test/test-conn - #'app/nrepl #'check.start-with-test/test-nrepl})] - (is (map? app-config)) + (let [_ (mount/start-with {#'app.nyse/conn #'mount.start-with-test/test-conn + #'app.example/nrepl #'mount.start-with-test/test-nrepl})] + (is (map? config)) (is (vector? nrepl)) (is (= conn 42)) (mount/stop))) (testing "should not start the substitute itself" - (let [_ (mount/start-with {#'app.nyse/conn #'check.start-with-test/test-conn})] + (let [_ (mount/start-with {#'app.nyse/conn #'mount.start-with-test/test-conn})] (is (instance? mount.core.NotStartedState test-conn)) (is (= conn 42)) (mount/stop))) (testing "should start normally after start-with" (let [_ (mount/start)] - (is (map? app-config)) + (is (map? config)) (is (instance? clojure.tools.nrepl.server.Server nrepl)) (is (instance? datomic.peer.LocalConnection conn)) (is (= test-conn 42)) @@ -36,9 +36,9 @@ (mount/stop))) (testing "should start-without normally after start-with" - (let [_ (mount/start-without #'check.start-with-test/test-conn - #'check.start-with-test/test-nrepl)] - (is (map? app-config)) + (let [_ (mount/start-without #'mount.start-with-test/test-conn + #'mount.start-with-test/test-nrepl)] + (is (map? config)) (is (instance? clojure.tools.nrepl.server.Server nrepl)) (is (instance? datomic.peer.LocalConnection conn)) (is (instance? mount.core.NotStartedState test-conn)) diff --git a/test/check/start_without_test.clj b/test/clj/mount/start_without_test.clj similarity index 62% rename from test/check/start_without_test.clj rename to test/clj/mount/start_without_test.clj index 1459dae..5d9ac77 100644 --- a/test/check/start_without_test.clj +++ b/test/clj/mount/start_without_test.clj @@ -1,18 +1,18 @@ -(ns check.start-without-test +(ns mount.start-without-test (:require [mount.core :as m] - [app.config :refer [app-config]] + [app.conf :refer [config]] [app.nyse :refer [conn]] - [app :refer [nrepl]] + [app.example :refer [nrepl]] [clojure.test :refer :all])) (defn without [f] - (m/start-without #'app.nyse/conn #'app/nrepl) + (m/start-without #'app.nyse/conn #'app.example/nrepl) (f) (m/stop)) (use-fixtures :each without) (deftest start-without-states - (is (map? app-config)) + (is (map? config)) (is (instance? mount.core.NotStartedState nrepl)) (is (instance? mount.core.NotStartedState conn))) diff --git a/test/check/stop_except_test.clj b/test/clj/mount/stop_except_test.clj similarity index 68% rename from test/check/stop_except_test.clj rename to test/clj/mount/stop_except_test.clj index b314c31..bc2c452 100644 --- a/test/check/stop_except_test.clj +++ b/test/clj/mount/stop_except_test.clj @@ -1,31 +1,31 @@ -(ns check.stop-except-test +(ns mount.stop-except-test (:require [mount.core :as mount :refer [defstate]] - [app.config :refer [app-config]] + [app.conf :refer [config]] [app.nyse :refer [conn]] - [app :refer [nrepl]] + [app.example :refer [nrepl]] [clojure.test :refer :all])) (deftest stop-except (testing "should stop all except nrepl" (let [_ (mount/start) - _ (mount/stop-except #'app.nyse/conn #'app.config/app-config)] - (is (map? app-config)) + _ (mount/stop-except #'app.nyse/conn #'app.conf/config)] + (is (map? config)) (is (instance? datomic.peer.LocalConnection conn)) (is (instance? mount.core.NotStartedState nrepl)) (mount/stop))) (testing "should start normally after stop-except" (let [_ (mount/start)] - (is (map? app-config)) + (is (map? config)) (is (instance? clojure.tools.nrepl.server.Server nrepl)) (is (instance? datomic.peer.LocalConnection conn)) (mount/stop))) (testing "should stop all normally after stop-except" (let [_ (mount/start) - _ (mount/stop-except #'app.nyse/conn #'app.config/app-config) + _ (mount/stop-except #'app.nyse/conn #'app.conf/config) _ (mount/stop)] - (is (instance? mount.core.NotStartedState app-config)) + (is (instance? mount.core.NotStartedState config)) (is (instance? mount.core.NotStartedState conn)) (is (instance? mount.core.NotStartedState nrepl))))) diff --git a/test/check/suspend_resume_test.clj b/test/clj/mount/suspend_resume_test.clj similarity index 87% rename from test/check/suspend_resume_test.clj rename to test/clj/mount/suspend_resume_test.clj index eb37ace..d96d389 100644 --- a/test/check/suspend_resume_test.clj +++ b/test/clj/mount/suspend_resume_test.clj @@ -1,8 +1,8 @@ -(ns check.suspend-resume-test +(ns mount.suspend-resume-test (:require [mount.core :as mount :refer [defstate]] - [app.config :refer [app-config]] + [app.conf :refer [config]] [app.nyse :refer [conn]] - [app :refer [nrepl]] + [app.example :refer [nrepl]] [clojure.test :refer :all])) (defn koncat [k s] @@ -32,7 +32,7 @@ (testing "should suspend _only suspendable_ states that are currently started" (let [_ (mount/start) _ (mount/suspend)] - (is (map? app-config)) + (is (map? config)) (is (instance? clojure.tools.nrepl.server.Server nrepl)) (is (instance? datomic.peer.LocalConnection conn)) (is (= web-server :w-suspended)) @@ -40,10 +40,10 @@ (testing "should resume _only suspendable_ states that are currently suspended" (let [_ (mount/start) - _ (mount/stop #'app/nrepl) + _ (mount/stop #'app.example/nrepl) _ (mount/suspend) _ (mount/resume)] - (is (map? app-config)) + (is (map? config)) (is (instance? mount.core.NotStartedState nrepl)) (is (instance? datomic.peer.LocalConnection conn)) (is (= web-server :w-resumed)) @@ -53,7 +53,7 @@ (let [_ (mount/start) _ (mount/suspend) _ (mount/start)] - (is (map? app-config)) + (is (map? config)) (is (instance? clojure.tools.nrepl.server.Server nrepl)) (is (instance? datomic.peer.LocalConnection conn)) (is (= web-server :w-resumed)) @@ -63,7 +63,7 @@ (let [_ (mount/start) _ (mount/suspend) _ (mount/stop)] - (is (instance? mount.core.NotStartedState app-config)) + (is (instance? mount.core.NotStartedState config)) (is (instance? mount.core.NotStartedState nrepl)) (is (instance? mount.core.NotStartedState conn)) (is (instance? mount.core.NotStartedState web-server))))) @@ -74,7 +74,7 @@ (testing "when replacing a non suspendable state with a suspendable one, the later should be able to suspend/resume, the original should not be suspendable after resume and preserve its lifecycle fns after rollback/stop" - (let [_ (mount/start-with {#'app/nrepl #'check.suspend-resume-test/web-server}) + (let [_ (mount/start-with {#'app.example/nrepl #'mount.suspend-resume-test/web-server}) _ (mount/suspend)] (is (= nrepl :w-suspended)) (is (instance? mount.core.NotStartedState web-server)) @@ -91,7 +91,7 @@ (testing "when replacing a suspendable state with a non suspendable one, the later should not be suspendable, the original should still be suspendable and preserve its lifecycle fns after the rollback/stop" - (let [_ (mount/start-with {#'check.suspend-resume-test/web-server #'check.suspend-resume-test/randomizer}) + (let [_ (mount/start-with {#'mount.suspend-resume-test/web-server #'mount.suspend-resume-test/randomizer}) _ (mount/suspend)] (is (integer? web-server)) (is (instance? mount.core.NotStartedState randomizer)) @@ -108,7 +108,7 @@ the original should still be suspended and preserve its lifecycle fns after the rollback/stop" (let [_ (mount/start) _ (mount/suspend) - _ (mount/start-with {#'check.suspend-resume-test/web-server #'app.nyse/conn}) ;; TODO: good to WARN on started states during "start-with" + _ (mount/start-with {#'mount.suspend-resume-test/web-server #'app.nyse/conn}) ;; TODO: good to WARN on started states during "start-with" _ (mount/suspend)] (is (instance? datomic.peer.LocalConnection conn)) (is (= web-server :w-suspended)) ;; since the "conn" does not have a resume method, so web-server was not started @@ -125,7 +125,8 @@ the original should still be suspended and preserve its lifecycle fns after the rollback/stop" (let [_ (mount/start) _ (mount/suspend) - _ (mount/start-with {#'check.suspend-resume-test/web-server #'check.suspend-resume-test/q-listener})] ;; TODO: good to WARN on started states during "start-with" + _ (mount/start-with {#'mount.suspend-resume-test/web-server + #'mount.suspend-resume-test/q-listener})] ;; TODO: good to WARN on started states during "start-with" (is (= q-listener :q-suspended)) (is (= web-server :q-resumed)) (mount/suspend) diff --git a/test/cljs/mount/waiting.for.cljs.tests b/test/cljs/mount/waiting.for.cljs.tests new file mode 100644 index 0000000..a511b1f --- /dev/null +++ b/test/cljs/mount/waiting.for.cljs.tests @@ -0,0 +1 @@ +обещали подвезти From 268162324f870556e1dc206e0fa7036560f88a56 Mon Sep 17 00:00:00 2001 From: anatoly Date: Tue, 8 Dec 2015 00:49:41 -0500 Subject: [PATCH 15/27] starting cljs tests --- .gitignore | 2 +- project.clj | 14 +- test/clj/mount/cleanup_dirty_states_test.clj | 13 -- test/clj/mount/deref/fun_with_values_test.clj | 58 ------- test/clj/mount/deref/private_fun_test.clj | 16 -- test/clj/mount/fun_with_values_test.clj | 55 ------- test/clj/mount/parts_test.clj | 17 --- test/clj/mount/private_fun_test.clj | 14 -- test/clj/mount/start_with_test.clj | 47 ------ test/clj/mount/start_without_test.clj | 18 --- test/clj/mount/stop_except_test.clj | 31 ---- test/clj/mount/suspend_resume_test.clj | 142 ------------------ test/cljs/mount/waiting.for.cljs.tests | 1 - test/mount/test.cljc | 18 +++ test/mount/test/fun_with_values.cljc | 59 ++++++++ test/mount/test/private_fun.cljc | 18 +++ test/mount/test/var/fun_with_values.clj | 59 ++++++++ test/mount/test/var/private_fun.clj | 17 +++ 18 files changed, 184 insertions(+), 415 deletions(-) delete mode 100644 test/clj/mount/cleanup_dirty_states_test.clj delete mode 100644 test/clj/mount/deref/fun_with_values_test.clj delete mode 100644 test/clj/mount/deref/private_fun_test.clj delete mode 100644 test/clj/mount/fun_with_values_test.clj delete mode 100644 test/clj/mount/parts_test.clj delete mode 100644 test/clj/mount/private_fun_test.clj delete mode 100644 test/clj/mount/start_with_test.clj delete mode 100644 test/clj/mount/start_without_test.clj delete mode 100644 test/clj/mount/stop_except_test.clj delete mode 100644 test/clj/mount/suspend_resume_test.clj delete mode 100644 test/cljs/mount/waiting.for.cljs.tests create mode 100644 test/mount/test.cljc create mode 100644 test/mount/test/fun_with_values.cljc create mode 100644 test/mount/test/private_fun.cljc create mode 100644 test/mount/test/var/fun_with_values.clj create mode 100644 test/mount/test/var/private_fun.clj diff --git a/.gitignore b/.gitignore index 45cf3f2..4e92365 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ pom.xml pom.xml.asc .repl* -dev-resources/public/js/* +dev/resources/public/js/* figwheel_server.log *.jar *.class diff --git a/project.clj b/project.clj index 898a5ba..f68866f 100644 --- a/project.clj +++ b/project.clj @@ -9,7 +9,7 @@ :dependencies [[org.clojure/clojure "1.7.0"] [org.clojure/clojurescript "1.7.170"]] - :profiles {:dev {:source-paths ["dev" "dev/clj" "test/clj"] + :profiles {:dev {:source-paths ["dev" "dev/clj" "test"] :dependencies [[datascript "0.13.3"] [hiccups "0.3.0"] [com.andrewmcveigh/cljs-time "0.3.14"] @@ -21,6 +21,7 @@ [com.datomic/datomic-free "0.9.5327" :exclusions [joda-time]]] :plugins [[lein-cljsbuild "1.1.1"] + [lein-doo "0.1.6"] [lein-figwheel "0.5.0-2"]] :clean-targets ^{:protect false} [:target-path @@ -28,7 +29,7 @@ [:cljsbuild :builds :prod :compiler :output-to]] :cljsbuild { :builds {:dev - {:source-paths ["dev/cljs" "test/cljs"] + {:source-paths ["src" "dev/cljs"] :figwheel true :compiler {:main app.example @@ -38,6 +39,15 @@ :optimizations :none :source-map true :source-map-timestamp true}} + :test + {:source-paths ["src" "dev/cljs" "test"] + :compiler {:main mount.test + ;; :asset-path "js/compiled/out" + :output-to "dev/resources/public/js/compiled/mount.js" + :output-dir "dev/resources/public/js/compiled/test" + :optimizations :none + :source-map true + :source-map-timestamp true}} :prod {:source-paths ["src" "test"] :compiler {:output-to "dev/resources/public/js/compiled/mount.js" diff --git a/test/clj/mount/cleanup_dirty_states_test.clj b/test/clj/mount/cleanup_dirty_states_test.clj deleted file mode 100644 index 2d62575..0000000 --- a/test/clj/mount/cleanup_dirty_states_test.clj +++ /dev/null @@ -1,13 +0,0 @@ -(ns mount.cleanup_dirty_states_test - (:require [mount.core :as mount] - [app.example] - [clojure.test :refer :all])) - -(deftest cleanup-dirty-states - (let [_ (mount/start)] - (is (not (.isClosed (:server-socket app.example/nrepl)))) - (require 'app.example :reload) - (mount/start) ;; should not result in "BindException Address already in use" since the clean up will stop the previous instance - (is (not (.isClosed (:server-socket app.example/nrepl)))) - (mount/stop) - (is (instance? mount.core.NotStartedState app.example/nrepl)))) diff --git a/test/clj/mount/deref/fun_with_values_test.clj b/test/clj/mount/deref/fun_with_values_test.clj deleted file mode 100644 index eeb3883..0000000 --- a/test/clj/mount/deref/fun_with_values_test.clj +++ /dev/null @@ -1,58 +0,0 @@ -(ns mount.deref.fun-with-values-test - (:require [mount.core :as mount :refer [defstate]] - [clojure.test :refer :all])) - -(defn f [n] - (fn [m] - (+ n m))) - -(defn g [a b] - (+ a b)) - -(defn- pf [n] - (+ 41 n)) - -(defn fna [] - 42) - -(defstate scalar :start 42) -(defstate fun :start #(inc 41)) -(defstate with-fun :start (inc 41)) -(defstate with-partial :start (partial g 41)) -(defstate f-in-f :start (f 41)) -(defstate f-no-args-value :start (fna)) -(defstate f-no-args :start fna) -(defstate f-args :start g) -(defstate f-value :start (g 41 1)) -(defstate private-f :start pf) - -(defn with-fun-and-values [f] - (mount/in-cljc-mode) - (require :reload 'mount.deref.fun-with-values-test) - (mount/start #'mount.deref.fun-with-values-test/scalar - #'mount.deref.fun-with-values-test/fun - #'mount.deref.fun-with-values-test/with-fun - #'mount.deref.fun-with-values-test/with-partial - #'mount.deref.fun-with-values-test/f-in-f - #'mount.deref.fun-with-values-test/f-args - #'mount.deref.fun-with-values-test/f-no-args-value - #'mount.deref.fun-with-values-test/f-no-args - #'mount.deref.fun-with-values-test/private-f - #'mount.deref.fun-with-values-test/f-value) - (f) - (mount/stop) - (mount/in-clj-mode)) - -(use-fixtures :each with-fun-and-values) - -(deftest fun-with-values - (is (= @scalar 42)) - (is (= (@fun) 42)) - (is (= @with-fun 42)) - (is (= (@with-partial 1) 42)) - (is (= (@f-in-f 1) 42)) - (is (= @f-no-args-value 42)) - (is (= (@f-no-args) 42)) - (is (= (@f-args 41 1) 42)) - (is (= (@private-f 1) 42)) - (is (= @f-value 42))) diff --git a/test/clj/mount/deref/private_fun_test.clj b/test/clj/mount/deref/private_fun_test.clj deleted file mode 100644 index 38f1dbe..0000000 --- a/test/clj/mount/deref/private_fun_test.clj +++ /dev/null @@ -1,16 +0,0 @@ -(ns mount.deref.private-fun-test - (:require [mount.core :as mount :refer [defstate]] - [mount.deref.fun-with-values-test :refer [private-f]] - [clojure.test :refer :all])) - -(defn with-fun-and-values [f] - (mount/in-cljc-mode) - (mount/start #'mount.deref.fun-with-values-test/private-f) - (f) - (mount/stop) - (mount/in-clj-mode)) - -(use-fixtures :each with-fun-and-values) - -(deftest fun-with-valuesj - (is (= (@private-f 1) 42))) diff --git a/test/clj/mount/fun_with_values_test.clj b/test/clj/mount/fun_with_values_test.clj deleted file mode 100644 index 22693ad..0000000 --- a/test/clj/mount/fun_with_values_test.clj +++ /dev/null @@ -1,55 +0,0 @@ -(ns mount.fun-with-values-test - (:require [mount.core :as mount :refer [defstate]] - [clojure.test :refer :all])) - -(defn f [n] - (fn [m] - (+ n m))) - -(defn g [a b] - (+ a b)) - -(defn- pf [n] - (+ 41 n)) - -(defn fna [] - 42) - -(defstate scalar :start 42) -(defstate fun :start #(inc 41)) -(defstate with-fun :start (inc 41)) -(defstate with-partial :start (partial g 41)) -(defstate f-in-f :start (f 41)) -(defstate f-no-args-value :start (fna)) -(defstate f-no-args :start fna) -(defstate f-args :start g) -(defstate f-value :start (g 41 1)) -(defstate private-f :start pf) - -(defn with-fun-and-values [f] - (mount/start #'mount.fun-with-values-test/scalar - #'mount.fun-with-values-test/fun - #'mount.fun-with-values-test/with-fun - #'mount.fun-with-values-test/with-partial - #'mount.fun-with-values-test/f-in-f - #'mount.fun-with-values-test/f-args - #'mount.fun-with-values-test/f-no-args-value - #'mount.fun-with-values-test/f-no-args - #'mount.fun-with-values-test/private-f - #'mount.fun-with-values-test/f-value) - (f) - (mount/stop)) - -(use-fixtures :each with-fun-and-values) - -(deftest fun-with-values - (is (= scalar 42)) - (is (= (fun) 42)) - (is (= with-fun 42)) - (is (= (with-partial 1) 42)) - (is (= (f-in-f 1) 42)) - (is (= f-no-args-value 42)) - (is (= (f-no-args) 42)) - (is (= (f-args 41 1) 42)) - (is (= (private-f 1) 42)) - (is (= f-value 42))) diff --git a/test/clj/mount/parts_test.clj b/test/clj/mount/parts_test.clj deleted file mode 100644 index c387ce3..0000000 --- a/test/clj/mount/parts_test.clj +++ /dev/null @@ -1,17 +0,0 @@ -(ns mount.parts-test - (:require [mount.core :as mount :refer [defstate] :as m] - [app.nyse :refer [conn]] - [clojure.test :refer :all])) - -(defstate should-not-start :start #(constantly 42)) - -(defn with-parts [f] - (m/start #'app.conf/config #'app.nyse/conn) - (f) - (m/stop)) - -(use-fixtures :each with-parts) - -(deftest start-only-parts - (is (instance? datomic.peer.LocalConnection conn)) - (is (instance? mount.core.NotStartedState should-not-start))) diff --git a/test/clj/mount/private_fun_test.clj b/test/clj/mount/private_fun_test.clj deleted file mode 100644 index 85cc31c..0000000 --- a/test/clj/mount/private_fun_test.clj +++ /dev/null @@ -1,14 +0,0 @@ -(ns mount.private-fun-test - (:require [mount.core :as mount :refer [defstate]] - [mount.fun-with-values-test :refer [private-f]] - [clojure.test :refer :all])) - -(defn with-fun-and-values [f] - (mount/start #'mount.fun-with-values-test/private-f) - (f) - (mount/stop)) - -(use-fixtures :each with-fun-and-values) - -(deftest fun-with-valuesj - (is (= (private-f 1) 42))) diff --git a/test/clj/mount/start_with_test.clj b/test/clj/mount/start_with_test.clj deleted file mode 100644 index 59b0b98..0000000 --- a/test/clj/mount/start_with_test.clj +++ /dev/null @@ -1,47 +0,0 @@ -(ns mount.start-with-test - (:require [mount.core :as mount :refer [defstate]] - [app.conf :refer [config]] - [app.nyse :refer [conn]] - [app.example :refer [nrepl]] - [clojure.test :refer :all])) - -(defstate test-conn :start 42 - :stop #(constantly 0)) - -(defstate test-nrepl :start []) - -(deftest start-with - - (testing "should start with substitutes" - (let [_ (mount/start-with {#'app.nyse/conn #'mount.start-with-test/test-conn - #'app.example/nrepl #'mount.start-with-test/test-nrepl})] - (is (map? config)) - (is (vector? nrepl)) - (is (= conn 42)) - (mount/stop))) - - (testing "should not start the substitute itself" - (let [_ (mount/start-with {#'app.nyse/conn #'mount.start-with-test/test-conn})] - (is (instance? mount.core.NotStartedState test-conn)) - (is (= conn 42)) - (mount/stop))) - - (testing "should start normally after start-with" - (let [_ (mount/start)] - (is (map? config)) - (is (instance? clojure.tools.nrepl.server.Server nrepl)) - (is (instance? datomic.peer.LocalConnection conn)) - (is (= test-conn 42)) - (is (vector? test-nrepl)) - (mount/stop))) - - (testing "should start-without normally after start-with" - (let [_ (mount/start-without #'mount.start-with-test/test-conn - #'mount.start-with-test/test-nrepl)] - (is (map? config)) - (is (instance? clojure.tools.nrepl.server.Server nrepl)) - (is (instance? datomic.peer.LocalConnection conn)) - (is (instance? mount.core.NotStartedState test-conn)) - (is (instance? mount.core.NotStartedState test-nrepl)) - (mount/stop)))) - diff --git a/test/clj/mount/start_without_test.clj b/test/clj/mount/start_without_test.clj deleted file mode 100644 index 5d9ac77..0000000 --- a/test/clj/mount/start_without_test.clj +++ /dev/null @@ -1,18 +0,0 @@ -(ns mount.start-without-test - (:require [mount.core :as m] - [app.conf :refer [config]] - [app.nyse :refer [conn]] - [app.example :refer [nrepl]] - [clojure.test :refer :all])) - -(defn without [f] - (m/start-without #'app.nyse/conn #'app.example/nrepl) - (f) - (m/stop)) - -(use-fixtures :each without) - -(deftest start-without-states - (is (map? config)) - (is (instance? mount.core.NotStartedState nrepl)) - (is (instance? mount.core.NotStartedState conn))) diff --git a/test/clj/mount/stop_except_test.clj b/test/clj/mount/stop_except_test.clj deleted file mode 100644 index bc2c452..0000000 --- a/test/clj/mount/stop_except_test.clj +++ /dev/null @@ -1,31 +0,0 @@ -(ns mount.stop-except-test - (:require [mount.core :as mount :refer [defstate]] - [app.conf :refer [config]] - [app.nyse :refer [conn]] - [app.example :refer [nrepl]] - [clojure.test :refer :all])) - -(deftest stop-except - - (testing "should stop all except nrepl" - (let [_ (mount/start) - _ (mount/stop-except #'app.nyse/conn #'app.conf/config)] - (is (map? config)) - (is (instance? datomic.peer.LocalConnection conn)) - (is (instance? mount.core.NotStartedState nrepl)) - (mount/stop))) - - (testing "should start normally after stop-except" - (let [_ (mount/start)] - (is (map? config)) - (is (instance? clojure.tools.nrepl.server.Server nrepl)) - (is (instance? datomic.peer.LocalConnection conn)) - (mount/stop))) - - (testing "should stop all normally after stop-except" - (let [_ (mount/start) - _ (mount/stop-except #'app.nyse/conn #'app.conf/config) - _ (mount/stop)] - (is (instance? mount.core.NotStartedState config)) - (is (instance? mount.core.NotStartedState conn)) - (is (instance? mount.core.NotStartedState nrepl))))) diff --git a/test/clj/mount/suspend_resume_test.clj b/test/clj/mount/suspend_resume_test.clj deleted file mode 100644 index d96d389..0000000 --- a/test/clj/mount/suspend_resume_test.clj +++ /dev/null @@ -1,142 +0,0 @@ -(ns mount.suspend-resume-test - (:require [mount.core :as mount :refer [defstate]] - [app.conf :refer [config]] - [app.nyse :refer [conn]] - [app.example :refer [nrepl]] - [clojure.test :refer :all])) - -(defn koncat [k s] - (-> (name k) - (str "-" (name s)) - keyword)) - -(defn start [s] (koncat s :started)) -(defn stop [s] (koncat s :stopped)) -(defn suspend [s] (koncat s :suspended)) -(defn resume [s] (koncat s :resumed)) - -(defstate web-server :start (start :w) - :stop (stop :w) - :suspend (suspend :w) - :resume (resume :w)) - -(defstate q-listener :start (start :q) - :stop (stop :q) - :suspend (suspend :q) - :resume (resume :q)) - -(defstate randomizer :start (rand-int 42)) - -(deftest suspendable-lifecycle - - (testing "should suspend _only suspendable_ states that are currently started" - (let [_ (mount/start) - _ (mount/suspend)] - (is (map? config)) - (is (instance? clojure.tools.nrepl.server.Server nrepl)) - (is (instance? datomic.peer.LocalConnection conn)) - (is (= web-server :w-suspended)) - (mount/stop))) - - (testing "should resume _only suspendable_ states that are currently suspended" - (let [_ (mount/start) - _ (mount/stop #'app.example/nrepl) - _ (mount/suspend) - _ (mount/resume)] - (is (map? config)) - (is (instance? mount.core.NotStartedState nrepl)) - (is (instance? datomic.peer.LocalConnection conn)) - (is (= web-server :w-resumed)) - (mount/stop))) - - (testing "should start all the states, except the ones that are currently suspended, should resume them instead" - (let [_ (mount/start) - _ (mount/suspend) - _ (mount/start)] - (is (map? config)) - (is (instance? clojure.tools.nrepl.server.Server nrepl)) - (is (instance? datomic.peer.LocalConnection conn)) - (is (= web-server :w-resumed)) - (mount/stop))) - - (testing "should stop all: started and suspended" - (let [_ (mount/start) - _ (mount/suspend) - _ (mount/stop)] - (is (instance? mount.core.NotStartedState config)) - (is (instance? mount.core.NotStartedState nrepl)) - (is (instance? mount.core.NotStartedState conn)) - (is (instance? mount.core.NotStartedState web-server))))) - - -(deftest suspendable-start-with - - (testing "when replacing a non suspendable state with a suspendable one, - the later should be able to suspend/resume, - the original should not be suspendable after resume and preserve its lifecycle fns after rollback/stop" - (let [_ (mount/start-with {#'app.example/nrepl #'mount.suspend-resume-test/web-server}) - _ (mount/suspend)] - (is (= nrepl :w-suspended)) - (is (instance? mount.core.NotStartedState web-server)) - (mount/stop) - (mount/start) - (mount/suspend) - (is (instance? clojure.tools.nrepl.server.Server nrepl)) - (is (= web-server :w-suspended)) - (mount/stop))) - - ;; this is a messy use case, but can still happen especially at REPL time - ;; it also messy, because usually :stop function refers the _original_ state by name (i.e. #(disconnect conn)) - ;; (unchanged/not substituted in its lexical scope), and original state won't be started - (testing "when replacing a suspendable state with a non suspendable one, - the later should not be suspendable, - the original should still be suspendable and preserve its lifecycle fns after the rollback/stop" - (let [_ (mount/start-with {#'mount.suspend-resume-test/web-server #'mount.suspend-resume-test/randomizer}) - _ (mount/suspend)] - (is (integer? web-server)) - (is (instance? mount.core.NotStartedState randomizer)) - (mount/stop) - (mount/start) - (mount/suspend) - (is (integer? randomizer)) - (is (= web-server :w-suspended)) - (mount/stop))) - - ;; this is a messy use case, but can still happen especially at REPL time - (testing "when replacing a suspended state with a non suspendable started one, - the later should not be suspendable, - the original should still be suspended and preserve its lifecycle fns after the rollback/stop" - (let [_ (mount/start) - _ (mount/suspend) - _ (mount/start-with {#'mount.suspend-resume-test/web-server #'app.nyse/conn}) ;; TODO: good to WARN on started states during "start-with" - _ (mount/suspend)] - (is (instance? datomic.peer.LocalConnection conn)) - (is (= web-server :w-suspended)) ;; since the "conn" does not have a resume method, so web-server was not started - (mount/stop) - (mount/start) - (mount/suspend) - (is (instance? datomic.peer.LocalConnection conn)) - (is (= web-server :w-suspended)) - (mount/stop))) - - ;; this is a messy use case, but can still happen especially at REPL time - (testing "when replacing a suspended state with a suspendable one, - the later should be suspendable, - the original should still be suspended and preserve its lifecycle fns after the rollback/stop" - (let [_ (mount/start) - _ (mount/suspend) - _ (mount/start-with {#'mount.suspend-resume-test/web-server - #'mount.suspend-resume-test/q-listener})] ;; TODO: good to WARN on started states during "start-with" - (is (= q-listener :q-suspended)) - (is (= web-server :q-resumed)) - (mount/suspend) - (is (= q-listener :q-suspended)) - (is (= web-server :q-suspended)) - (mount/stop) - (is (instance? mount.core.NotStartedState web-server)) - (is (instance? mount.core.NotStartedState q-listener)) - (mount/start) - (mount/suspend) - (is (= q-listener :q-suspended)) - (is (= web-server :w-suspended)) - (mount/stop)))) diff --git a/test/cljs/mount/waiting.for.cljs.tests b/test/cljs/mount/waiting.for.cljs.tests deleted file mode 100644 index a511b1f..0000000 --- a/test/cljs/mount/waiting.for.cljs.tests +++ /dev/null @@ -1 +0,0 @@ -обещали подвезти diff --git a/test/mount/test.cljc b/test/mount/test.cljc new file mode 100644 index 0000000..96a136d --- /dev/null +++ b/test/mount/test.cljc @@ -0,0 +1,18 @@ +(ns mount.test + (:require + #?@(:cljs [[cljs.test :as t] + [doo.runner :refer-macros [doo-tests]]] + :clj [clojure.test :as t]) + [mount.core :as mount] + + mount.test.fun-with-values + mount.test.private-fun)) + +(mount/in-cljc-mode) + +(doo.runner/doo-tests 'mount.test.fun-with-values + 'mount.test.private-fun) +;; (doo.runner/do-all-tests) + +(defn run-tests [] + (t/run-all-tests #"mount.test.*")) diff --git a/test/mount/test/fun_with_values.cljc b/test/mount/test/fun_with_values.cljc new file mode 100644 index 0000000..61cf200 --- /dev/null +++ b/test/mount/test/fun_with_values.cljc @@ -0,0 +1,59 @@ +(ns mount.test.fun-with-values + (:require + #?@(:cljs [[cljs.test :as t :refer-macros [is are deftest testing use-fixtures]] + [mount.core :as mount :refer-macros [defstate]]] + :clj [[clojure.test :as t :refer [is are deftest testing use-fixtures]] + [mount.core :as mount :refer [defstate]]]))) + +(defn f [n] + (fn [m] + (+ n m))) + +(defn g [a b] + (+ a b)) + +(defn- pf [n] + (+ 41 n)) + +(defn fna [] + 42) + +(defstate scalar :start 42) +(defstate fun :start #(inc 41)) +(defstate with-fun :start (inc 41)) +(defstate with-partial :start (partial g 41)) +(defstate f-in-f :start (f 41)) +(defstate f-no-args-value :start (fna)) +(defstate f-no-args :start fna) +(defstate f-args :start g) +(defstate f-value :start (g 41 1)) +(defstate private-f :start pf) + +(defn start-states [] + (mount/start #'mount.test.fun-with-values/scalar + #'mount.test.fun-with-values/fun + #'mount.test.fun-with-values/with-fun + #'mount.test.fun-with-values/with-partial + #'mount.test.fun-with-values/f-in-f + #'mount.test.fun-with-values/f-args + #'mount.test.fun-with-values/f-no-args-value + #'mount.test.fun-with-values/f-no-args + #'mount.test.fun-with-values/private-f + #'mount.test.fun-with-values/f-value)) + +(use-fixtures :once + #?(:cljs {:before start-states + :after mount/stop} + :clj #((start-states) (%) (mount/stop)))) + +(deftest fun-with-values + (is (= @scalar 42)) + (is (= (@fun) 42)) + (is (= @with-fun 42)) + (is (= (@with-partial 1) 42)) + (is (= (@f-in-f 1) 42)) + (is (= @f-no-args-value 42)) + (is (= (@f-no-args) 42)) + (is (= (@f-args 41 1) 42)) + (is (= (@private-f 1) 42)) + (is (= @f-value 42))) diff --git a/test/mount/test/private_fun.cljc b/test/mount/test/private_fun.cljc new file mode 100644 index 0000000..47ef9a4 --- /dev/null +++ b/test/mount/test/private_fun.cljc @@ -0,0 +1,18 @@ +(ns mount.test.private-fun + (:require + #?@(:cljs [[cljs.test :as t :refer-macros [is are deftest testing use-fixtures]] + [mount.core :as mount :refer-macros [defstate]]] + :clj [[clojure.test :as t :refer [is are deftest testing use-fixtures]] + [mount.core :as mount :refer [defstate]]]) + + [mount.test.fun-with-values :refer [private-f]])) + +(use-fixtures :once + #?(:cljs {:before #(mount/start #'mount.test.fun-with-values/private-f) + :after mount/stop} + :clj #((mount/start #'mount.test.fun-with-values/private-f) + (%) + (mount/stop)))) + +(deftest fun-with-values + (is (= (@private-f 1) 42))) diff --git a/test/mount/test/var/fun_with_values.clj b/test/mount/test/var/fun_with_values.clj new file mode 100644 index 0000000..f6a09a1 --- /dev/null +++ b/test/mount/test/var/fun_with_values.clj @@ -0,0 +1,59 @@ +(ns mount.test.var.fun-with-values + (:require [clojure.test :as t :refer [is are deftest testing use-fixtures]] + [mount.core :as mount :refer [defstate]])) + +(defn f [n] + (fn [m] + (+ n m))) + +(defn g [a b] + (+ a b)) + +(defn- pf [n] + (+ 41 n)) + +(defn fna [] + 42) + +(defstate scalar :start 42) +(defstate fun :start #(inc 41)) +(defstate with-fun :start (inc 41)) +(defstate with-partial :start (partial g 41)) +(defstate f-in-f :start (f 41)) +(defstate f-no-args-value :start (fna)) +(defstate f-no-args :start fna) +(defstate f-args :start g) +(defstate f-value :start (g 41 1)) +(defstate private-f :start pf) + +(defn start-states [] + (mount/in-clj-mode) + (require :reload 'mount.test.var.fun-with-values) + (mount/start #'mount.test.var.fun-with-values/scalar + #'mount.test.var.fun-with-values/fun + #'mount.test.var.fun-with-values/with-fun + #'mount.test.var.fun-with-values/with-partial + #'mount.test.var.fun-with-values/f-in-f + #'mount.test.var.fun-with-values/f-args + #'mount.test.var.fun-with-values/f-no-args-value + #'mount.test.var.fun-with-values/f-no-args + #'mount.test.var.fun-with-values/private-f + #'mount.test.var.fun-with-values/f-value)) + +(defn stop-states [] + (mount/stop) + (mount/in-cljc-mode)) + +(use-fixtures :once #((start-states) (%) (stop-states))) + +(deftest fun-with-values + (is (= scalar 42)) + (is (= (fun) 42)) + (is (= with-fun 42)) + (is (= (with-partial 1) 42)) + (is (= (f-in-f 1) 42)) + (is (= f-no-args-value 42)) + (is (= (f-no-args) 42)) + (is (= (f-args 41 1) 42)) + (is (= (private-f 1) 42)) + (is (= f-value 42))) diff --git a/test/mount/test/var/private_fun.clj b/test/mount/test/var/private_fun.clj new file mode 100644 index 0000000..f00a37d --- /dev/null +++ b/test/mount/test/var/private_fun.clj @@ -0,0 +1,17 @@ +(ns mount.test.var.private-fun + (:require [clojure.test :refer [is are deftest testing use-fixtures]] + [mount.core :as mount :refer [defstate]] + [mount.test.var.fun-with-values :refer [private-f]])) + +(defn in-clj-mode [f] + (mount/in-clj-mode) + (require :reload 'mount.test.var.fun-with-values 'mount.test.var.private-fun) + (mount/start #'mount.test.var.fun-with-values/private-f) + (f) + (mount/stop) + (mount/in-cljc-mode)) + +(use-fixtures :once in-clj-mode) + +(deftest fun-with-values + (is (= (private-f 1) 42))) From f06dc427f090be514d9d3f3e4d43258a2a842c9f Mon Sep 17 00:00:00 2001 From: anatoly Date: Tue, 8 Dec 2015 00:56:34 -0500 Subject: [PATCH 16/27] [cljs tests]: splicing :clj imports --- test/mount/test.cljc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test/mount/test.cljc b/test/mount/test.cljc index 96a136d..b36c5b1 100644 --- a/test/mount/test.cljc +++ b/test/mount/test.cljc @@ -2,7 +2,7 @@ (:require #?@(:cljs [[cljs.test :as t] [doo.runner :refer-macros [doo-tests]]] - :clj [clojure.test :as t]) + :clj [[clojure.test :as t]]) [mount.core :as mount] mount.test.fun-with-values @@ -10,8 +10,10 @@ (mount/in-cljc-mode) -(doo.runner/doo-tests 'mount.test.fun-with-values - 'mount.test.private-fun) +#?(:cljs + (doo-tests 'mount.test.fun-with-values + 'mount.test.private-fun)) + ;; (doo.runner/do-all-tests) (defn run-tests [] From 5fdef469b729c78175b8bbae7ffc38339a23fe5e Mon Sep 17 00:00:00 2001 From: anatoly Date: Tue, 8 Dec 2015 01:19:14 -0500 Subject: [PATCH 17/27] removing deps --- circle.yml | 8 ++++++++ project.clj | 7 ++++--- 2 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 circle.yml diff --git a/circle.yml b/circle.yml new file mode 100644 index 0000000..e2c2bda --- /dev/null +++ b/circle.yml @@ -0,0 +1,8 @@ +machine: + java: + version: oraclejdk8 + +test: + override: + lein do clean, test + lein do clean, doo phantom test once diff --git a/project.clj b/project.clj index f68866f..a58d1d8 100644 --- a/project.clj +++ b/project.clj @@ -6,11 +6,12 @@ :source-paths ["src"] - :dependencies [[org.clojure/clojure "1.7.0"] - [org.clojure/clojurescript "1.7.170"]] + :dependencies [] ;; yep :profiles {:dev {:source-paths ["dev" "dev/clj" "test"] - :dependencies [[datascript "0.13.3"] + :dependencies [[org.clojure/clojure "1.7.0"] + [org.clojure/clojurescript "1.7.170"] + [datascript "0.13.3"] [hiccups "0.3.0"] [com.andrewmcveigh/cljs-time "0.3.14"] [ch.qos.logback/logback-classic "1.1.3"] From f049f4fad62964cdfb239e489cd500643c9193e7 Mon Sep 17 00:00:00 2001 From: anatoly Date: Tue, 8 Dec 2015 01:21:20 -0500 Subject: [PATCH 18/27] circle tets overrides as a list --- circle.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/circle.yml b/circle.yml index e2c2bda..4a5ac96 100644 --- a/circle.yml +++ b/circle.yml @@ -4,5 +4,5 @@ machine: test: override: - lein do clean, test - lein do clean, doo phantom test once + - lein do clean, test + - lein do clean, doo phantom test once From c32f7a892f2da42b44b12d104e9eedc91b57e259 Mon Sep 17 00:00:00 2001 From: anatoly Date: Tue, 8 Dec 2015 22:07:26 -0500 Subject: [PATCH 19/27] cljs var-to-str + parts test --- project.clj | 6 ++-- src/mount/core.cljc | 21 ++++++++--- test/clj/app/conf.clj | 13 +++++++ test/clj/app/example.clj | 65 ++++++++++++++++++++++++++++++++++ test/clj/app/nyse.clj | 21 +++++++++++ test/clj/app/utils/datomic.clj | 11 ++++++ test/clj/app/utils/logging.clj | 46 ++++++++++++++++++++++++ test/mount/test.cljc | 21 ++++++----- test/mount/test/helper.cljc | 11 ++++++ test/mount/test/parts.cljc | 36 +++++++++++++++++++ 10 files changed, 237 insertions(+), 14 deletions(-) create mode 100644 test/clj/app/conf.clj create mode 100644 test/clj/app/example.clj create mode 100644 test/clj/app/nyse.clj create mode 100644 test/clj/app/utils/datomic.clj create mode 100644 test/clj/app/utils/logging.clj create mode 100644 test/mount/test/helper.cljc create mode 100644 test/mount/test/parts.cljc diff --git a/project.clj b/project.clj index a58d1d8..5874693 100644 --- a/project.clj +++ b/project.clj @@ -6,7 +6,7 @@ :source-paths ["src"] - :dependencies [] ;; yep + :dependencies [] ;; for visual clarity :profiles {:dev {:source-paths ["dev" "dev/clj" "test"] :dependencies [[org.clojure/clojure "1.7.0"] @@ -53,4 +53,6 @@ {:source-paths ["src" "test"] :compiler {:output-to "dev/resources/public/js/compiled/mount.js" :optimizations :advanced - :pretty-print false}}}}}}) + :pretty-print false}}}}} + + :test {:source-paths ["dev" "test/clj" "test"]}}) diff --git a/src/mount/core.cljc b/src/mount/core.cljc index 9e7994c..59da9ec 100644 --- a/src/mount/core.cljc +++ b/src/mount/core.cljc @@ -174,10 +174,22 @@ all) (sort-by :order)))) + +#?(:clj + (defn- var-to-str [v] + (str v))) + +#?(:cljs + (defn var-to-str [v] + (if (var? v) + (let [{:keys [ns name]} (meta v)] + (with-ns ns name)) + v))) + (defn- bring [states fun order] (let [done (atom [])] (as-> states $ - (map str $) + (map var-to-str $) (select-keys @meta-state $) (sort-by (comp :order val) order $) (doseq [[k v] $] (fun k v done))) @@ -226,7 +238,7 @@ (defn stop-except [& states] (let [all (set (find-all-states)) - states (map str states) + states (map var-to-str states) states (remove (set states) all)] (apply stop states))) @@ -238,13 +250,14 @@ (defn start-with [with] (doseq [[from to] with] - (substitute! (str from) (str to))) + (substitute! (var-to-str from) + (var-to-str to))) (start)) (defn start-without [& states] (if (first states) (let [app (set (all-without-subs)) - states (map str states) + states (map var-to-str states) without (remove (set states) app)] (apply start without)) (start))) diff --git a/test/clj/app/conf.clj b/test/clj/app/conf.clj new file mode 100644 index 0000000..3273a95 --- /dev/null +++ b/test/clj/app/conf.clj @@ -0,0 +1,13 @@ +(ns app.conf + (:require [mount.core :as mount :refer [defstate]] + [clojure.edn :as edn] + [clojure.tools.logging :refer [info]])) + +(defn load-config [path] + (info "loading config from" path) + (-> path + slurp + edn/read-string)) + +(defstate config + :start (load-config "dev/resources/config.edn")) diff --git a/test/clj/app/example.clj b/test/clj/app/example.clj new file mode 100644 index 0000000..028d406 --- /dev/null +++ b/test/clj/app/example.clj @@ -0,0 +1,65 @@ +(ns app.example + (:require [datomic.api :as d] + [clojure.tools.nrepl.server :refer [start-server stop-server]] + [mount.core :as mount :refer [defstate]] + [app.utils.datomic :refer [touch]] + [app.conf :refer [config]] + [app.nyse :as nyse])) + +;; example on creating a network REPL +(defn- start-nrepl [{:keys [host port]}] + (start-server :bind host :port port)) + +;; nREPL is just another simple state +(defstate nrepl :start (start-nrepl (:nrepl @config)) + :stop (stop-server @nrepl)) + +;; datomic schema +(defn create-schema [conn] + (let [schema [{:db/id #db/id [:db.part/db] + :db/ident :order/symbol + :db/valueType :db.type/string + :db/cardinality :db.cardinality/one + :db/index true + :db.install/_attribute :db.part/db} + + {:db/id #db/id [:db.part/db] + :db/ident :order/bid + :db/valueType :db.type/bigdec + :db/cardinality :db.cardinality/one + :db.install/_attribute :db.part/db} + + {:db/id #db/id [:db.part/db] + :db/ident :order/qty + :db/valueType :db.type/long + :db/cardinality :db.cardinality/one + :db.install/_attribute :db.part/db} + + {:db/id #db/id [:db.part/db] + :db/ident :order/offer + :db/valueType :db.type/bigdec + :db/cardinality :db.cardinality/one + :db.install/_attribute :db.part/db}]] + + @(d/transact conn schema))) + +(defn add-order [ticker bid offer qty] ;; can take connection as param + @(d/transact @nyse/conn [{:db/id (d/tempid :db.part/user) + :order/symbol ticker + :order/bid bid + :order/offer offer + :order/qty qty}])) + + +(defn find-orders [ticker] ;; can take connection as param + (let [orders (d/q '[:find ?e :in $ ?ticker + :where [?e :order/symbol ?ticker]] + (d/db @nyse/conn) ticker)] + (touch @nyse/conn orders))) + +(defn create-nyse-schema [] + (create-schema @nyse/conn)) + +;; example of an app entry point +(defn -main [& args] + (mount/start)) diff --git a/test/clj/app/nyse.clj b/test/clj/app/nyse.clj new file mode 100644 index 0000000..374cba7 --- /dev/null +++ b/test/clj/app/nyse.clj @@ -0,0 +1,21 @@ +(ns app.nyse + (:require [mount.core :as mount :refer [defstate]] + [datomic.api :as d] + [clojure.tools.logging :refer [info]] + [app.conf :refer [config]])) + +(defn- new-connection [conf] + (info "conf: " conf) + (let [uri (get-in @conf [:datomic :uri])] + (info "creating a connection to datomic:" uri) + (d/create-database uri) + (d/connect uri))) + +(defn disconnect [conf conn] + (let [uri (get-in @conf [:datomic :uri])] + (info "disconnecting from " uri) + (.release @conn) ;; usually it's not released, here just to illustrate the access to connection on (stop) + (d/delete-database uri))) + +(defstate conn :start (new-connection config) + :stop (disconnect config conn)) diff --git a/test/clj/app/utils/datomic.clj b/test/clj/app/utils/datomic.clj new file mode 100644 index 0000000..836f9b9 --- /dev/null +++ b/test/clj/app/utils/datomic.clj @@ -0,0 +1,11 @@ +(ns app.utils.datomic + (:require [datomic.api :as d])) + +(defn entity [conn id] + (d/entity (d/db conn) id)) + +(defn touch [conn results] + "takes 'entity ids' results from a query + e.g. '#{[272678883689461] [272678883689462] [272678883689459] [272678883689457]}'" + (let [e (partial entity conn)] + (map #(-> % first e d/touch) results))) diff --git a/test/clj/app/utils/logging.clj b/test/clj/app/utils/logging.clj new file mode 100644 index 0000000..2d8c64d --- /dev/null +++ b/test/clj/app/utils/logging.clj @@ -0,0 +1,46 @@ +(ns app.utils.logging ;; << change to your namespace/path + (:require [mount.core] + [robert.hooke :refer [add-hook clear-hooks]] + [clojure.string :refer [split]] + [clojure.tools.logging :refer [info]])) + +(alter-meta! *ns* assoc ::load false) + +(defn- f-to-action [f] + (let [fname (-> (str f) + (split #"@") + first)] + (case fname + "mount.core$up" :up + "mount.core$down" :down + "mount.core$sigstop" :suspend + "mount.core$sigcont" :resume + :noop))) + +(defn whatcha-doing? [{:keys [status suspend]} action] + (case action + :up (if (status :suspended) ">> resuming" + (if-not (status :started) ">> starting")) + :down (if (or (status :started) (status :suspended)) "<< stopping") + :suspend (if (and (status :started) suspend) "<< suspending") + :resume (if (status :suspended) ">> resuming"))) + +(defn log-status [f & args] + (let [{:keys [var] :as state} (second args) + action (f-to-action f)] + (when-let [taking-over-the-world (whatcha-doing? state action)] + (info (str taking-over-the-world ".. " var))) + (apply f args))) + +(defonce lifecycle-fns + #{#'mount.core/up + #'mount.core/down + #'mount.core/sigstop + #'mount.core/sigcont}) + +(defn without-logging-status [] + (doall (map #(clear-hooks %) lifecycle-fns))) + +(defn with-logging-status [] + (without-logging-status) + (doall (map #(add-hook % log-status) lifecycle-fns))) diff --git a/test/mount/test.cljc b/test/mount/test.cljc index b36c5b1..3fe3b53 100644 --- a/test/mount/test.cljc +++ b/test/mount/test.cljc @@ -3,18 +3,23 @@ #?@(:cljs [[cljs.test :as t] [doo.runner :refer-macros [doo-tests]]] :clj [[clojure.test :as t]]) - [mount.core :as mount] - - mount.test.fun-with-values - mount.test.private-fun)) + mount.core -(mount/in-cljc-mode) + mount.test.fun-with-values + mount.test.private-fun + mount.test.parts + )) + +(mount.core/in-cljc-mode) #?(:cljs - (doo-tests 'mount.test.fun-with-values - 'mount.test.private-fun)) -;; (doo.runner/do-all-tests) + ;; (doo.runner/do-all-tests) + (doo-tests + 'mount.test.fun-with-values + 'mount.test.private-fun + 'mount.test.parts + )) (defn run-tests [] (t/run-all-tests #"mount.test.*")) diff --git a/test/mount/test/helper.cljc b/test/mount/test/helper.cljc new file mode 100644 index 0000000..b85f92a --- /dev/null +++ b/test/mount/test/helper.cljc @@ -0,0 +1,11 @@ +(ns mount.test.helper + (:require mount.core)) + +(defn dval + "returns a value of DerefableState without deref'ing it" + [d] + (-> (@@(var mount.core/meta-state) + #?(:clj (.name d) + :cljs (.-name d))) + :inst + deref)) diff --git a/test/mount/test/parts.cljc b/test/mount/test/parts.cljc new file mode 100644 index 0000000..20a503f --- /dev/null +++ b/test/mount/test/parts.cljc @@ -0,0 +1,36 @@ +(ns mount.test.parts + (:require + #?@(:cljs [[cljs.test :as t :refer-macros [is are deftest testing use-fixtures]] + [mount.core :as mount :refer-macros [defstate]] + [app.websockets :refer [system-a]] + [app.conf :refer [config]] + [app.audit-log :refer [log]]] + :clj [[clojure.test :as t :refer [is are deftest testing use-fixtures]] + [mount.core :as mount :refer [defstate]] + [app.nyse :refer [conn]]]) + [mount.test.helper :refer [dval]])) + +(defstate should-not-start :start (constantly 42)) + +#?(:clj + (defn with-parts [f] + (mount/start #'app.conf/config #'app.nyse/conn) + (f) + (mount/stop))) + +(use-fixtures :once + #?(:cljs {:before #(mount/start #'app.conf/config #'app.audit-log/log) + :after mount/stop} + :clj with-parts)) + +#?(:clj + (deftest start-only-parts + (is (instance? datomic.peer.LocalConnection (dval conn))) + (is (instance? mount.core.NotStartedState (dval should-not-start))))) + +#?(:cljs + (deftest start-only-parts + (is (instance? datascript.db/DB @(dval log))) + (is (map? (dval config))) + (is (instance? mount.core.NotStartedState (dval should-not-start))) + (is (instance? mount.core.NotStartedState (dval system-a))))) From a8ff02c3482c3d5c7489f632e4f16c5f1f5c818c Mon Sep 17 00:00:00 2001 From: anatoly Date: Tue, 8 Dec 2015 22:12:53 -0500 Subject: [PATCH 20/27] test -> dev/cljs for cljs :advanced --- circle.yml | 1 + project.clj | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/circle.yml b/circle.yml index 4a5ac96..b6de089 100644 --- a/circle.yml +++ b/circle.yml @@ -6,3 +6,4 @@ test: override: - lein do clean, test - lein do clean, doo phantom test once + - lein do clean, cljsbuild once prod diff --git a/project.clj b/project.clj index 5874693..05dac38 100644 --- a/project.clj +++ b/project.clj @@ -50,7 +50,7 @@ :source-map true :source-map-timestamp true}} :prod - {:source-paths ["src" "test"] + {:source-paths ["src" "dev/cljs"] :compiler {:output-to "dev/resources/public/js/compiled/mount.js" :optimizations :advanced :pretty-print false}}}}} From 7271ba4f42c4dd0dd5da86d8c5d605b040ca7dd2 Mon Sep 17 00:00:00 2001 From: anatoly Date: Tue, 8 Dec 2015 22:40:23 -0500 Subject: [PATCH 21/27] (mount/in-clj-mode) for dev.clj --- dev/dev.clj | 2 ++ dev/user.clj | 3 +-- project.clj | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dev/dev.clj b/dev/dev.clj index 1982e87..d9c493e 100644 --- a/dev/dev.clj +++ b/dev/dev.clj @@ -42,3 +42,5 @@ [] (stop) (tn/refresh :after 'dev/go)) + +(mount/in-clj-mode) diff --git a/dev/user.clj b/dev/user.clj index a5693f3..058241e 100644 --- a/dev/user.clj +++ b/dev/user.clj @@ -1,4 +1,3 @@ -(defn dev - [] +(defn dev [] (require 'dev) (in-ns 'dev)) diff --git a/project.clj b/project.clj index 05dac38..2818bda 100644 --- a/project.clj +++ b/project.clj @@ -8,7 +8,7 @@ :dependencies [] ;; for visual clarity - :profiles {:dev {:source-paths ["dev" "dev/clj" "test"] + :profiles {:dev {:source-paths ["dev" "dev/clj"] :dependencies [[org.clojure/clojure "1.7.0"] [org.clojure/clojurescript "1.7.170"] [datascript "0.13.3"] From 4b6a4b165801731617fd8ca9b020c54aa3aa3eed Mon Sep 17 00:00:00 2001 From: anatoly Date: Wed, 9 Dec 2015 00:06:23 -0500 Subject: [PATCH 22/27] bringing all the clj tests home. cljs suite next. --- test/mount/test/cleanup_dirty_states.cljc | 21 +++ test/mount/test/start_with.cljc | 54 ++++++++ test/mount/test/start_without.cljc | 30 +++++ test/mount/test/stop_except.cljc | 39 ++++++ test/mount/test/suspend_resume.cljc | 151 ++++++++++++++++++++++ 5 files changed, 295 insertions(+) create mode 100644 test/mount/test/cleanup_dirty_states.cljc create mode 100644 test/mount/test/start_with.cljc create mode 100644 test/mount/test/start_without.cljc create mode 100644 test/mount/test/stop_except.cljc create mode 100644 test/mount/test/suspend_resume.cljc diff --git a/test/mount/test/cleanup_dirty_states.cljc b/test/mount/test/cleanup_dirty_states.cljc new file mode 100644 index 0000000..55a01eb --- /dev/null +++ b/test/mount/test/cleanup_dirty_states.cljc @@ -0,0 +1,21 @@ +(ns mount.test.cleanup_dirty_states + (:require + #?@(:cljs [[cljs.test :as t :refer-macros [is are deftest testing use-fixtures]] + [mount.core :as mount :refer-macros [defstate]] + [app.websockets :refer [system-a]] + [app.conf :refer [config]] + [app.audit-log :refer [log]]] + :clj [[clojure.test :as t :refer [is are deftest testing use-fixtures]] + [mount.core :as mount :refer [defstate]] + [app.example]]) + [mount.test.helper :refer [dval]])) + +#?(:clj + (deftest cleanup-dirty-states + (let [_ (mount/start)] + (is (not (.isClosed (:server-socket (dval app.example/nrepl))))) + (require 'app.example :reload) + (mount/start) ;; should not result in "BindException Address already in use" since the clean up will stop the previous instance + (is (not (.isClosed (:server-socket (dval app.example/nrepl))))) + (mount/stop) + (is (instance? mount.core.NotStartedState (dval app.example/nrepl)))))) diff --git a/test/mount/test/start_with.cljc b/test/mount/test/start_with.cljc new file mode 100644 index 0000000..aa1628a --- /dev/null +++ b/test/mount/test/start_with.cljc @@ -0,0 +1,54 @@ +(ns mount.test.start-with + (:require + #?@(:cljs [[cljs.test :as t :refer-macros [is are deftest testing use-fixtures]] + [mount.core :as mount :refer-macros [defstate]] + [app.websockets :refer [system-a]] + [app.conf :refer [config]] + [app.audit-log :refer [log]]] + :clj [[clojure.test :as t :refer [is are deftest testing use-fixtures]] + [mount.core :as mount :refer [defstate]] + [app.conf :refer [config]] + [app.nyse :refer [conn]] + [app.example :refer [nrepl]]]) + [mount.test.helper :refer [dval]])) + +(defstate test-conn :start 42 + :stop (constantly 0)) + +(defstate test-nrepl :start []) + +#?(:clj + (deftest start-with + + (testing "should start with substitutes" + (let [_ (mount/start-with {#'app.nyse/conn #'mount.test.start-with/test-conn + #'app.example/nrepl #'mount.test.start-with/test-nrepl})] + (is (map? (dval config))) + (is (vector? (dval nrepl))) + (is (= (dval conn) 42)) + (mount/stop))) + + (testing "should not start the substitute itself" + (let [_ (mount/start-with {#'app.nyse/conn #'mount.test.start-with/test-conn})] + (is (instance? mount.core.NotStartedState (dval test-conn))) + (is (= (dval conn) 42)) + (mount/stop))) + + (testing "should start normally after start-with" + (let [_ (mount/start)] + (is (map? (dval config))) + (is (instance? clojure.tools.nrepl.server.Server (dval nrepl))) + (is (instance? datomic.peer.LocalConnection (dval conn))) + (is (= (dval test-conn )42)) + (is (vector? (dval test-nrepl))) + (mount/stop))) + + (testing "should start-without normally after start-with" + (let [_ (mount/start-without #'mount.test.start-with/test-conn + #'mount.test.start-with/test-nrepl)] + (is (map? (dval config))) + (is (instance? clojure.tools.nrepl.server.Server (dval nrepl))) + (is (instance? datomic.peer.LocalConnection (dval conn))) + (is (instance? mount.core.NotStartedState (dval test-conn))) + (is (instance? mount.core.NotStartedState (dval test-nrepl))) + (mount/stop))))) diff --git a/test/mount/test/start_without.cljc b/test/mount/test/start_without.cljc new file mode 100644 index 0000000..c855508 --- /dev/null +++ b/test/mount/test/start_without.cljc @@ -0,0 +1,30 @@ +(ns mount.test.start-without + (:require + #?@(:cljs [[cljs.test :as t :refer-macros [is are deftest testing use-fixtures]] + [mount.core :as mount :refer-macros [defstate]] + [app.websockets :refer [system-a]] + [app.conf :refer [config]] + [app.audit-log :refer [log]]] + :clj [[clojure.test :as t :refer [is are deftest testing use-fixtures]] + [mount.core :as mount :refer [defstate]] + [app.conf :refer [config]] + [app.nyse :refer [conn]] + [app.example :refer [nrepl]]]) + [mount.test.helper :refer [dval]])) + +#?(:clj + (defn without [f] + (mount/start-without #'app.nyse/conn #'app.example/nrepl) + (f) + (mount/stop))) + + (use-fixtures :once + #?(:cljs {:before #(mount/start-without #'app.websockets/system-a #'app.audit-log/log) + :after mount/stop} + :clj without)) + +#?(:clj + (deftest start-without-states + (is (map? (dval config))) + (is (instance? mount.core.NotStartedState (dval nrepl))) + (is (instance? mount.core.NotStartedState (dval conn))))) diff --git a/test/mount/test/stop_except.cljc b/test/mount/test/stop_except.cljc new file mode 100644 index 0000000..22161ad --- /dev/null +++ b/test/mount/test/stop_except.cljc @@ -0,0 +1,39 @@ +(ns mount.test.stop-except + (:require + #?@(:cljs [[cljs.test :as t :refer-macros [is are deftest testing use-fixtures]] + [mount.core :as mount :refer-macros [defstate]] + [app.websockets :refer [system-a]] + [app.conf :refer [config]] + [app.audit-log :refer [log]]] + :clj [[clojure.test :as t :refer [is are deftest testing use-fixtures]] + [mount.core :as mount :refer [defstate]] + [app.conf :refer [config]] + [app.nyse :refer [conn]] + [app.example :refer [nrepl]]]) + [mount.test.helper :refer [dval]])) + +#?(:clj + (deftest stop-except + + (testing "should stop all except nrepl" + (let [_ (mount/start) + _ (mount/stop-except #'app.nyse/conn #'app.conf/config)] + (is (map? (dval config))) + (is (instance? datomic.peer.LocalConnection (dval conn))) + (is (instance? mount.core.NotStartedState (dval nrepl))) + (mount/stop))) + + (testing "should start normally after stop-except" + (let [_ (mount/start)] + (is (map? (dval config))) + (is (instance? clojure.tools.nrepl.server.Server (dval nrepl))) + (is (instance? datomic.peer.LocalConnection (dval conn))) + (mount/stop))) + + (testing "should stop all normally after stop-except" + (let [_ (mount/start) + _ (mount/stop-except #'app.nyse/conn #'app.conf/config) + _ (mount/stop)] + (is (instance? mount.core.NotStartedState (dval config))) + (is (instance? mount.core.NotStartedState (dval conn))) + (is (instance? mount.core.NotStartedState (dval nrepl))))))) diff --git a/test/mount/test/suspend_resume.cljc b/test/mount/test/suspend_resume.cljc new file mode 100644 index 0000000..6bf3849 --- /dev/null +++ b/test/mount/test/suspend_resume.cljc @@ -0,0 +1,151 @@ +(ns mount.test.suspend-resume + (:require + #?@(:cljs [[cljs.test :as t :refer-macros [is are deftest testing use-fixtures]] + [mount.core :as mount :refer-macros [defstate]] + [app.websockets :refer [system-a]] + [app.conf :refer [config]] + [app.audit-log :refer [log]]] + :clj [[clojure.test :as t :refer [is are deftest testing use-fixtures]] + [mount.core :as mount :refer [defstate]] + [app.conf :refer [config]] + [app.nyse :refer [conn]] + [app.example :refer [nrepl]]]) + [mount.test.helper :refer [dval]])) + +(defn koncat [k s] + (-> (name k) + (str "-" (name s)) + keyword)) + +(defn start [s] (koncat s :started)) +(defn stop [s] (koncat s :stopped)) +(defn suspend [s] (koncat s :suspended)) +(defn resume [s] (koncat s :resumed)) + +(defstate web-server :start (start :w) + :stop (stop :w) + :suspend (suspend :w) + :resume (resume :w)) + +(defstate q-listener :start (start :q) + :stop (stop :q) + :suspend (suspend :q) + :resume (resume :q)) + +(defstate randomizer :start (rand-int 42)) + +#?(:clj + (deftest suspendable-lifecycle + + (testing "should suspend _only suspendable_ states that are currently started" + (let [_ (mount/start) + _ (mount/suspend)] + (is (map? (dval config))) + (is (instance? clojure.tools.nrepl.server.Server (dval nrepl))) + (is (instance? datomic.peer.LocalConnection (dval conn))) + (is (= (dval web-server) :w-suspended)) + (mount/stop))) + + (testing "should resume _only suspendable_ states that are currently suspended" + (let [_ (mount/start) + _ (mount/stop #'app.example/nrepl) + _ (mount/suspend) + _ (mount/resume)] + (is (map? (dval config))) + (is (instance? mount.core.NotStartedState (dval nrepl))) + (is (instance? datomic.peer.LocalConnection (dval conn))) + (is (= (dval web-server) :w-resumed)) + (mount/stop))) + + (testing "should start all the states, except the ones that are currently suspended, should resume them instead" + (let [_ (mount/start) + _ (mount/suspend) + _ (mount/start)] + (is (map? (dval config))) + (is (instance? clojure.tools.nrepl.server.Server (dval nrepl))) + (is (instance? datomic.peer.LocalConnection (dval conn))) + (is (= (dval web-server) :w-resumed)) + (mount/stop))) + + (testing "should stop all: started and suspended" + (let [_ (mount/start) + _ (mount/suspend) + _ (mount/stop)] + (is (instance? mount.core.NotStartedState (dval config))) + (is (instance? mount.core.NotStartedState (dval nrepl))) + (is (instance? mount.core.NotStartedState (dval conn))) + (is (instance? mount.core.NotStartedState (dval web-server))))))) + + +#?(:clj + (deftest suspendable-start-with + + (testing "when replacing a non suspendable state with a suspendable one, + the later should be able to suspend/resume, + the original should not be suspendable after resume and preserve its lifecycle fns after rollback/stop" + (let [_ (mount/start-with {#'app.example/nrepl #'mount.test.suspend-resume/web-server}) + _ (mount/suspend)] + (is (= (dval nrepl) :w-suspended)) + (is (instance? mount.core.NotStartedState (dval web-server))) + (mount/stop) + (mount/start) + (mount/suspend) + (is (instance? clojure.tools.nrepl.server.Server (dval nrepl))) + (is (= (dval web-server) :w-suspended)) + (mount/stop))) + + ;; this is a messy use case, but can still happen especially at REPL time + ;; it also messy, because usually :stop function refers the _original_ state by name (i.e. #(disconnect conn)) + ;; (unchanged/not substituted in its lexical scope), and original state won't be started + (testing "when replacing a suspendable state with a non suspendable one, + the later should not be suspendable, + the original should still be suspendable and preserve its lifecycle fns after the rollback/stop" + (let [_ (mount/start-with {#'mount.test.suspend-resume/web-server #'mount.test.suspend-resume/randomizer}) + _ (mount/suspend)] + (is (integer? (dval web-server))) + (is (instance? mount.core.NotStartedState (dval randomizer))) + (mount/stop) + (mount/start) + (mount/suspend) + (is (integer? (dval randomizer))) + (is (= (dval web-server) :w-suspended)) + (mount/stop))) + + ;; this is a messy use case, but can still happen especially at REPL time + (testing "when replacing a suspended state with a non suspendable started one, + the later should not be suspendable, + the original should still be suspended and preserve its lifecycle fns after the rollback/stop" + (let [_ (mount/start) + _ (mount/suspend) + _ (mount/start-with {#'mount.test.suspend-resume/web-server #'app.nyse/conn}) ;; TODO: good to WARN on started states during "start-with" + _ (mount/suspend)] + (is (instance? datomic.peer.LocalConnection (dval conn))) + (is (= (dval web-server) :w-suspended)) ;; since the "conn" does not have a resume method, so web-server was not started + (mount/stop) + (mount/start) + (mount/suspend) + (is (instance? datomic.peer.LocalConnection (dval conn))) + (is (= (dval web-server) :w-suspended)) + (mount/stop))) + + ;; this is a messy use case, but can still happen especially at REPL time + (testing "when replacing a suspended state with a suspendable one, + the later should be suspendable, + the original should still be suspended and preserve its lifecycle fns after the rollback/stop" + (let [_ (mount/start) + _ (mount/suspend) + _ (mount/start-with {#'mount.test.suspend-resume/web-server + #'mount.test.suspend-resume/q-listener})] ;; TODO: good to WARN on started states during "start-with" + (is (= (dval q-listener) :q-suspended)) + (is (= (dval web-server) :q-resumed)) + (mount/suspend) + (is (= (dval q-listener) :q-suspended)) + (is (= (dval web-server) :q-suspended)) + (mount/stop) + (is (instance? mount.core.NotStartedState (dval web-server))) + (is (instance? mount.core.NotStartedState (dval q-listener))) + (mount/start) + (mount/suspend) + (is (= (dval q-listener) :q-suspended)) + (is (= (dval web-server) :w-suspended)) + (mount/stop))))) From 3fc53f747e611e7606cdfff15101286ce12753ed Mon Sep 17 00:00:00 2001 From: anatoly Date: Wed, 9 Dec 2015 22:27:02 -0500 Subject: [PATCH 23/27] cljs tests are in --- test/mount/test.cljc | 10 ++++ test/mount/test/cleanup_dirty_states.cljc | 17 ++++++- test/mount/test/helper.cljc | 9 +++- test/mount/test/start_with.cljc | 43 ++++++++++++++++- test/mount/test/start_without.cljc | 11 ++++- test/mount/test/stop_except.cljc | 29 ++++++++++- test/mount/test/suspend_resume.cljc | 59 +++++++++++++++++++++++ 7 files changed, 170 insertions(+), 8 deletions(-) diff --git a/test/mount/test.cljc b/test/mount/test.cljc index 3fe3b53..b24368d 100644 --- a/test/mount/test.cljc +++ b/test/mount/test.cljc @@ -8,6 +8,11 @@ mount.test.fun-with-values mount.test.private-fun mount.test.parts + mount.test.cleanup-dirty-states + mount.test.stop-except + mount.test.start-without + mount.test.start-with + mount.test.suspend-resume )) (mount.core/in-cljc-mode) @@ -19,6 +24,11 @@ 'mount.test.fun-with-values 'mount.test.private-fun 'mount.test.parts + 'mount.test.cleanup-dirty-states + 'mount.test.stop-except + 'mount.test.start-without + 'mount.test.start-with + 'mount.test.suspend-resume )) (defn run-tests [] diff --git a/test/mount/test/cleanup_dirty_states.cljc b/test/mount/test/cleanup_dirty_states.cljc index 55a01eb..c4fced9 100644 --- a/test/mount/test/cleanup_dirty_states.cljc +++ b/test/mount/test/cleanup_dirty_states.cljc @@ -1,4 +1,4 @@ -(ns mount.test.cleanup_dirty_states +(ns mount.test.cleanup-dirty-states (:require #?@(:cljs [[cljs.test :as t :refer-macros [is are deftest testing use-fixtures]] [mount.core :as mount :refer-macros [defstate]] @@ -8,7 +8,7 @@ :clj [[clojure.test :as t :refer [is are deftest testing use-fixtures]] [mount.core :as mount :refer [defstate]] [app.example]]) - [mount.test.helper :refer [dval]])) + [mount.test.helper :refer [dval helper forty-two]])) #?(:clj (deftest cleanup-dirty-states @@ -19,3 +19,16 @@ (is (not (.isClosed (:server-socket (dval app.example/nrepl))))) (mount/stop) (is (instance? mount.core.NotStartedState (dval app.example/nrepl)))))) + +#?(:cljs + (deftest cleanup-dirty-states + (let [_ (mount/start #'mount.test.helper/helper)] + (is (= :started (dval helper))) + (is (= 42 @forty-two)) + (.require js/goog "mount.test.helper") ;; should have run :stop of `helper` + ;; (is (= :cleaned @forty-two)) ;; TODO: figure out how to reload a namespace properly + ;; (is (instance? mount.core.NotStartedState (dval helper))) + (mount/start #'mount.test.helper/helper) + (is (= :started (dval helper))) + (mount/stop) + (is (instance? mount.core.NotStartedState (dval helper)))))) diff --git a/test/mount/test/helper.cljc b/test/mount/test/helper.cljc index b85f92a..ecc0cff 100644 --- a/test/mount/test/helper.cljc +++ b/test/mount/test/helper.cljc @@ -1,5 +1,7 @@ (ns mount.test.helper - (:require mount.core)) + (:require + #?@(:cljs [[mount.core :as mount :refer-macros [defstate]]] + :clj [[mount.core :as mount :refer [defstate]]]))) (defn dval "returns a value of DerefableState without deref'ing it" @@ -9,3 +11,8 @@ :cljs (.-name d))) :inst deref)) + +(def forty-two (atom 42)) + +(defstate helper :start :started + :stop (reset! forty-two :cleaned)) diff --git a/test/mount/test/start_with.cljc b/test/mount/test/start_with.cljc index aa1628a..7e7a7bd 100644 --- a/test/mount/test/start_with.cljc +++ b/test/mount/test/start_with.cljc @@ -10,13 +10,52 @@ [app.conf :refer [config]] [app.nyse :refer [conn]] [app.example :refer [nrepl]]]) - [mount.test.helper :refer [dval]])) + [mount.test.helper :refer [dval helper]])) (defstate test-conn :start 42 :stop (constantly 0)) (defstate test-nrepl :start []) +#?(:cljs + (deftest start-with + + (testing "should start with substitutes" + (let [_ (mount/start-with {#'app.websockets/system-a #'mount.test.start-with/test-conn + #'mount.test.helper/helper #'mount.test.start-with/test-nrepl})] + (is (map? (dval config))) + (is (vector? (dval helper))) + (is (= (dval system-a) 42)) + (is (instance? datascript.db/DB @(dval log))) + (mount/stop))) + + (testing "should not start the substitute itself" + (let [_ (mount/start-with {#'app.websockets/system-a #'mount.test.start-with/test-conn})] + (is (instance? mount.core.NotStartedState (dval test-conn))) + (is (= 42 (dval system-a))) + (mount/stop))) + + (testing "should start normally after start-with" + (let [_ (mount/start)] + (is (map? (dval config))) + (is (instance? datascript.db/DB @(dval log))) + (is (instance? js/WebSocket (dval system-a))) + (is (= 42 (dval test-conn))) + (is (vector? (dval test-nrepl))) + (is (= :started (dval helper))) + (mount/stop))) + + (testing "should start-without normally after start-with" + (let [_ (mount/start-without #'mount.test.start-with/test-conn + #'mount.test.start-with/test-nrepl)] + (is (map? (dval config))) + (is (instance? datascript.db/DB @(dval log))) + (is (instance? js/WebSocket (dval system-a))) + (is (= :started (dval helper))) + (is (instance? mount.core.NotStartedState (dval test-conn))) + (is (instance? mount.core.NotStartedState (dval test-nrepl))) + (mount/stop))))) + #?(:clj (deftest start-with @@ -39,7 +78,7 @@ (is (map? (dval config))) (is (instance? clojure.tools.nrepl.server.Server (dval nrepl))) (is (instance? datomic.peer.LocalConnection (dval conn))) - (is (= (dval test-conn )42)) + (is (= (dval test-conn) 42)) (is (vector? (dval test-nrepl))) (mount/stop))) diff --git a/test/mount/test/start_without.cljc b/test/mount/test/start_without.cljc index c855508..f6a68d1 100644 --- a/test/mount/test/start_without.cljc +++ b/test/mount/test/start_without.cljc @@ -10,7 +10,7 @@ [app.conf :refer [config]] [app.nyse :refer [conn]] [app.example :refer [nrepl]]]) - [mount.test.helper :refer [dval]])) + [mount.test.helper :refer [dval helper]])) #?(:clj (defn without [f] @@ -19,7 +19,7 @@ (mount/stop))) (use-fixtures :once - #?(:cljs {:before #(mount/start-without #'app.websockets/system-a #'app.audit-log/log) + #?(:cljs {:before #(mount/start-without #'mount.test.helper/helper #'app.websockets/system-a) :after mount/stop} :clj without)) @@ -28,3 +28,10 @@ (is (map? (dval config))) (is (instance? mount.core.NotStartedState (dval nrepl))) (is (instance? mount.core.NotStartedState (dval conn))))) + +#?(:cljs + (deftest start-without-states + (is (map? (dval config))) + (is (instance? datascript.db/DB @(dval log))) + (is (instance? mount.core.NotStartedState (dval helper))) + (is (instance? mount.core.NotStartedState (dval system-a))))) diff --git a/test/mount/test/stop_except.cljc b/test/mount/test/stop_except.cljc index 22161ad..3e61f97 100644 --- a/test/mount/test/stop_except.cljc +++ b/test/mount/test/stop_except.cljc @@ -10,7 +10,34 @@ [app.conf :refer [config]] [app.nyse :refer [conn]] [app.example :refer [nrepl]]]) - [mount.test.helper :refer [dval]])) + [mount.test.helper :refer [dval helper]])) + +#?(:cljs + (deftest stop-except + + (testing "should stop all except nrepl" + (let [_ (mount/start) + _ (mount/stop-except #'app.audit-log/log #'mount.test.helper/helper)] + (is (= :started (dval helper))) + (is (instance? datascript.db/DB @(dval log))) + (is (instance? mount.core.NotStartedState (dval config))) + (is (instance? mount.core.NotStartedState (dval system-a))) + (mount/stop))) + + (testing "should start normally after stop-except" + (let [_ (mount/start)] + (is (map? (dval config))) + (is (instance? js/WebSocket (dval system-a))) + (is (instance? datascript.db/DB @(dval log))) + (mount/stop))) + + (testing "should stop all normally after stop-except" + (let [_ (mount/start) + _ (mount/stop-except #'app.audit-log/log #'mount.test.helper/helper) + _ (mount/stop)] + (is (instance? mount.core.NotStartedState (dval config))) + (is (instance? mount.core.NotStartedState (dval log))) + (is (instance? mount.core.NotStartedState (dval system-a))))))) #?(:clj (deftest stop-except diff --git a/test/mount/test/suspend_resume.cljc b/test/mount/test/suspend_resume.cljc index 6bf3849..ea1fe36 100644 --- a/test/mount/test/suspend_resume.cljc +++ b/test/mount/test/suspend_resume.cljc @@ -34,6 +34,65 @@ (defstate randomizer :start (rand-int 42)) +#?(:cljs + (deftest suspendable-lifecycle + + (testing "should suspend _only suspendable_ states that are currently started" + (let [_ (mount/start) + _ (mount/suspend)] + (is (map? (dval config))) + (is (instance? datascript.db/DB @(dval log))) + (is (instance? js/WebSocket (dval system-a))) + (is (= (dval web-server) :w-suspended)) + (mount/stop))) + + (testing "should resume _only suspendable_ states that are currently suspended" + (let [_ (mount/start) + _ (mount/stop #'app.websockets/system-a) + _ (mount/suspend) + _ (mount/resume)] + (is (map? (dval config))) + (is (instance? mount.core.NotStartedState (dval system-a))) + (is (instance? datascript.db/DB @(dval log))) + (is (= (dval web-server) :w-resumed)) + (mount/stop))) + + (testing "should start all the states, except the ones that are currently suspended, should resume them instead" + (let [_ (mount/start) + _ (mount/suspend) + _ (mount/start)] + (is (map? (dval config))) + (is (instance? js/WebSocket (dval system-a))) + (is (instance? datascript.db/DB @(dval log))) + (is (= (dval web-server) :w-resumed)) + (mount/stop))) + + (testing "should stop all: started and suspended" + (let [_ (mount/start) + _ (mount/suspend) + _ (mount/stop)] + (is (instance? mount.core.NotStartedState (dval config))) + (is (instance? mount.core.NotStartedState (dval system-a))) + (is (instance? mount.core.NotStartedState (dval log))) + (is (instance? mount.core.NotStartedState (dval web-server))))))) + +#?(:cljs + (deftest suspendable-start-with + + (testing "when replacing a non suspendable state with a suspendable one, + the later should be able to suspend/resume, + the original should not be suspendable after resume and preserve its lifecycle fns after rollback/stop" + (let [_ (mount/start-with {#'app.websockets/system-a #'mount.test.suspend-resume/web-server}) + _ (mount/suspend)] + (is (= (dval system-a) :w-suspended)) + (is (instance? mount.core.NotStartedState (dval web-server))) + (mount/stop) + (mount/start) + (mount/suspend) + (is (instance? js/WebSocket (dval system-a))) + (is (= (dval web-server) :w-suspended)) + (mount/stop))))) + #?(:clj (deftest suspendable-lifecycle From 9972893710e71846098799bb1e9696db19b37a59 Mon Sep 17 00:00:00 2001 From: anatoly Date: Wed, 9 Dec 2015 22:41:18 -0500 Subject: [PATCH 24/27] [circle ci]: plugin in "test2junit" --- .gitignore | 1 + circle.yml | 1 + project.clj | 5 ++++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 4e92365..1f14e58 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ pom.xml.asc .repl* dev/resources/public/js/* figwheel_server.log +build.xml *.jar *.class /.lein-* diff --git a/circle.yml b/circle.yml index b6de089..a07a0ea 100644 --- a/circle.yml +++ b/circle.yml @@ -7,3 +7,4 @@ test: - lein do clean, test - lein do clean, doo phantom test once - lein do clean, cljsbuild once prod + - lein test2junit diff --git a/project.clj b/project.clj index 2818bda..1c039ba 100644 --- a/project.clj +++ b/project.clj @@ -23,7 +23,10 @@ :plugins [[lein-cljsbuild "1.1.1"] [lein-doo "0.1.6"] - [lein-figwheel "0.5.0-2"]] + [lein-figwheel "0.5.0-2"] + [test2junit "1.1.3"]] + + :test2junit-output-dir ~(or (System/getenv "CIRCLE_TEST_REPORTS") "target/test2junit") :clean-targets ^{:protect false} [:target-path [:cljsbuild :builds :dev :compiler :output-dir] From 2211491e911738aa3c36647772c67f164010f5ed Mon Sep 17 00:00:00 2001 From: Anatoly Date: Wed, 9 Dec 2015 23:01:29 -0500 Subject: [PATCH 25/27] [docs]: relinking tests --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 2777984..cbb4dab 100644 --- a/README.md +++ b/README.md @@ -152,7 +152,7 @@ this `app-config`, being top level, can be used in other namespaces, including t (defstate conn :start (create-connection app-config)) ``` -[here](https://github.com/tolitius/mount/blob/master/test/app/nyse.clj) +[here](dev/clj/app/nyse.clj) is an example of a Datomic connection that "depends" on a similar `app-config`. ## Value of values @@ -191,7 +191,7 @@ Besides scalar values, lifecycle functions can take anonymous functions, partial (defstate private-f :start pf) ``` -Check out [fun-with-values-test](https://github.com/tolitius/mount/blob/0.1.5/test/check/fun_with_values_test.clj) for more details. +Check out [fun-with-values-test](test/mount/test/fun_with_values.cljc) for more details. ## The Importance of Being Reloadable @@ -207,7 +207,7 @@ dev=> (mount/start) While it is not always necessary, mount lificycle can be easily hooked up to [tools.namespace](https://github.com/clojure/tools.namespace), to make the whole application reloadable with refreshing the app namespaces. -Here is a [dev.clj](https://github.com/tolitius/mount/blob/master/dev/dev.clj) as an example, that sums up to: +Here is a [dev.clj](dev/dev.clj) as an example, that sums up to: ```clojure (defn go [] @@ -244,7 +244,7 @@ dev=> (reset) :ready ``` -You can see examples of start and stop flows in the [example app](https://github.com/tolitius/mount#mount-and-develop). +You can see examples of start and stop flows in the [example app](mount#mount-and-develop). ## Start and Stop Parts of Application @@ -260,7 +260,7 @@ In REPL or during testing it is often very useful to work with / start / stop _o which will only start/stop `app-config` and `conn` (won't start any other states). -Here is an [example](test/check/parts_test.clj) test that uses only two namespaces checking that the third one is not started. +Here is an [example](test/mount/test/parts.cljc) test that uses only two namespaces checking that the third one is not started. ## Start an Application Without Certain States @@ -275,7 +275,7 @@ The `start-without` function can do just that: which will start an application without starting `feed-listener` and `nrepl` states. -Here is an [example](test/check/start_without_test.clj) test that excludes Datomic connection and nREPL from an application on start. +Here is an [example](test/mount/test/start_without.cljc) test that excludes Datomic connection and nREPL from an application on start. ## Swapping Alternate Implementations @@ -298,7 +298,7 @@ One thing to note, whenever is run after `start-with`, it rolls back to an original "state of states", i.e. `#'app.nyse/db` is `#'app.nyse/db` again. So subsequent calls to `(mount/start)` or even to `(mount/start-with {something else})` will start from a clean slate. -Here is an [example](test/check/start_with_test.clj) test that starts an app with mocking Datomic connection and nREPL. +Here is an [example](test/mount/test/start_with.cljc) test that starts an app with mocking Datomic connection and nREPL. ## Stop an Application Except Certain States @@ -449,7 +449,7 @@ The way this is done is via an excellent [robert hooke](https://github.com/techn ## Mount and Develop! -`mount` comes with an example [app](https://github.com/tolitius/mount/tree/master/test/app) +`mount` comes with an example [app](dev/clj/app) that has 3 states: * `config`, loaded from the files and refreshed on each `(reset)` From 0825ad2ed085b73b7ae989b4382ce4e0376e4be3 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Wed, 9 Dec 2015 23:04:17 -0500 Subject: [PATCH 26/27] [docs]: fixed link to an example app --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cbb4dab..5b36726 100644 --- a/README.md +++ b/README.md @@ -244,7 +244,7 @@ dev=> (reset) :ready ``` -You can see examples of start and stop flows in the [example app](mount#mount-and-develop). +You can see examples of start and stop flows in the [example app](README.md#mount-and-develop). ## Start and Stop Parts of Application From c7435cd81a1d6d1b0f59ed75a3bfe94063dbbd81 Mon Sep 17 00:00:00 2001 From: anatoly Date: Thu, 10 Dec 2015 00:30:15 -0500 Subject: [PATCH 27/27] cljs docs --- README.md | 3 + doc/clojurescript.md | 120 +++++++++++++++++++++++++++++++++ doc/img/mount.cljs.example.png | Bin 0 -> 220311 bytes 3 files changed, 123 insertions(+) create mode 100644 doc/clojurescript.md create mode 100644 doc/img/mount.cljs.example.png diff --git a/README.md b/README.md index 5b36726..d0160b9 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,9 @@ _**Alan J. Perlis** from [Structure and Interpretation of Computer Programs](htt - [Plugging into (reset)](#plugging-into-reset) - [Suspendable Example Application](#suspendable-example-application) - [Affected States](#affected-states) + +- [ClojureScript is Clojure](doc/clojurescript.md) + - [Logging](#logging) - [Mount and Develop!](#mount-and-develop) - [Running New York Stock Exchange](#running-new-york-stock-exchange) diff --git a/doc/clojurescript.md b/doc/clojurescript.md new file mode 100644 index 0000000..54b199c --- /dev/null +++ b/doc/clojurescript.md @@ -0,0 +1,120 @@ +## Managing state in ClojureScript + +- [The "Why"](#the-why) +- [Mount Modes](#mount-modes) + - [Just Clojure Mode](#just-clojure-mode) + - [Clojure and ClojureScript Mode](#clojure-_and_-clojurescript-mode) +- [Mounting that ClojureScript](#mounting-that-clojurescript) + - [Using States](#using-states) +- [Thanks](#thanks) + +In case you need to manage state in ClojureScript using mount, _all_ the mount Clojure features are supported in ClojureScript. +Which means all the mount Clojure [documentation](../README.md) is the mount ClojureScript documentation. + +With a slight change in [_mode_](clojurescript.md#mount-modes) ( no change in _mood_ though, just the _mode_ :)). + +### The "Why" + +Since [reader conditionals](http://clojure.org/reader#The%20Reader--Reader%20Conditionals) were added in Clojure 1.7, +it became a lot easier to target both platforms with lots of code reuse. You might have noticed +that most of mount code lives in `.cljc` files. + +The way mount is designed it "mounts" itself to a solid Clojure [namespace API](http://clojure.org/namespaces), +and while `.cljc` helps a lot with targeting Clojure and ClojureScript, JavaScript VM is vastly different from JVM. +Since JavaScript mostly tagrets browsers, mobile devices and IoT, +it is quite importand to [compress](https://github.com/clojure/clojurescript/wiki/Advanced-Compilation) the final result. + +Which means that Clojure namespaces API are not that well supported in ClojureScript, since they get renamed and optimized +during compilation + of course no native namespace support on the JavaScript side +(but that is somewhat solved with [Google Closure](https://closure-library.googlecode.com/git-history/docs/local_closure_goog_base.js.source.html#line428)). + +But. When developing an application in Clojure and ClojureScript, it would only make sense if the API for any library +would be _identical_ for both platforms. It should be transparent for developers whether they use a library in Clojure or ClojureScript. +It is not possible for all libraries (i.e. concurrency, reified Vars, etc.), but we should try to make it possible for most. + +### Mount Modes + +Mount has two modes `clj` and `cljc`. + +#### Just Clojure Mode + +`clj` mode is _default_, and all the APIs are exactly the same as they are in the mount Clojure [documentation](../README.md). + +#### Clojure _and_ ClojureScript Mode + +`cljc` mode is is not default, but it is easy to switch to it: + +```clojure +(mount/in-cljc-mode) +``` + +this sets mount into the `cljc` mode. In this mode mount supports _both_: Clojure and ClojureScript with one difference +from the default `clj` mode: + +> all states are "_derefable_" + +which means in order to use them, you'd need to `@` it. That's where the difference between two modes end. + +Again, `cljc` mode API is _consistent across both_ Clojure and ClojureScript. + +While initially it may sound strange, this approach has very nice properties: + +* Mentally something that you defer (`@`) is associated with a state behind it +* The whole system may start lazily without an explicit call `(mount/start)` +* States may have watchers which is just an idea at this point, but it could be quite useful + +Now as the theory is laid out... + +### Mounting that ClojureScript + +Let's look at the example [ClojureScript app](../dev/cljs/app) that uses mount to manage several states: + +* [Datascript](https://github.com/tonsky/datascript) Database +* Websocket Connection +* Configuration + +In order to run it, just compile `cljs` (in `:advanced` mode, because why not? :)) with: + +```clojure +$ lein do clean, cljsbuild once prod +Compiling ClojureScript... +Compiling "dev/resources/public/js/compiled/mount.js" from ["src" "dev/cljs"]... +Successfully compiled "dev/resources/public/js/compiled/mount.js" in 23.966 seconds. +``` + +And just open a browser at `file:///[path-to-mount]/mount/dev/resources/public/index.html`: + + + +The flow behind the app is quite simple: + +* load config +* open a WebSocket connection +* keep an audit log in Datascript +* call `(mount/stop)` to disconnect + +#### Using States + +A good example of derefing state is here in [websockets.cljs](https://github.com/tolitius/mount/blob/0825ad2ed085b73b7ae989b4382ce4e0376e4be3/dev/cljs/app/websockets.cljs#L21): + +```clojure + +(ns app.websockets + (:require [app.conf :refer [config]] + [app.audit-log :refer [audit log]]) + (:require-macros [mount.core :refer [defstate]])) + +;; ... + +(defstate system-a :start (connect (get-in @config [:system-a :uri])) + :stop (disconnect system-a)) +``` + +notice how config is deferef'ed `@config` in order to use its state. It of course does not have to be deref'ed here, and +can be just passed along to the `connect` function to be `@`ed there instead. + +### Thanks + +I'd like to thank these good people for brainstorming and supporting the idea of Mount in ClojureScript universe: + +[@DomKM](https://github.com/DomKM), [@yogthos](https://github.com/yogthos) and [@edvorg](https://github.com/edvorg) diff --git a/doc/img/mount.cljs.example.png b/doc/img/mount.cljs.example.png new file mode 100644 index 0000000000000000000000000000000000000000..5edad726b703498276928afe62f62438c5db5fec GIT binary patch literal 220311 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
d-5LsAyO#kZ1t10K-jx(ZvQm%1pl~#A29;8 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 h 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 z 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 literal 0 HcmV?d00001