mirror of
https://github.com/status-im/pluto.git
synced 2025-02-23 16:08:14 +00:00
No more registry functions in pluto
Signed-off-by: Julien Eluard <julien.eluard@gmail.com>
This commit is contained in:
parent
f1c904d309
commit
5fe6ac05c1
@ -1,4 +1,4 @@
|
|||||||
(defproject status-im/pluto "iteration-3"
|
(defproject status-im/pluto "iteration-4-SNAPSHOT"
|
||||||
:dependencies [[org.clojure/clojure "1.9.0"]
|
:dependencies [[org.clojure/clojure "1.9.0"]
|
||||||
[org.clojure/clojurescript "1.10.238"]
|
[org.clojure/clojurescript "1.10.238"]
|
||||||
[org.clojure/tools.reader "1.2.1"]
|
[org.clojure/tools.reader "1.2.1"]
|
||||||
|
@ -1,59 +0,0 @@
|
|||||||
(ns pluto.registry
|
|
||||||
(:refer-clojure :exclude [remove])
|
|
||||||
(:require [clojure.spec.alpha :as spec]
|
|
||||||
[clojure.set :as set]
|
|
||||||
[clojure.string :as string]
|
|
||||||
[pluto.reader.hooks :as hooks]
|
|
||||||
[pluto.utils :as utils]))
|
|
||||||
|
|
||||||
(spec/def :registry/registry (spec/map-of string? :registry/extension))
|
|
||||||
|
|
||||||
(spec/def :registry/state #{:active :inactive})
|
|
||||||
|
|
||||||
(spec/def :registry/data any?)
|
|
||||||
|
|
||||||
(spec/def :registry/extension (spec/keys :req-un [:registry/state :registry/data]))
|
|
||||||
|
|
||||||
;; TODO move to a protocol and provide default re-frame implementation
|
|
||||||
|
|
||||||
(defn add
|
|
||||||
"Takes parsed data and coeffects map, adds extension to registry with `:inactive` initial state."
|
|
||||||
[parsed-data {:keys [db]}]
|
|
||||||
(let [extension-key (get-in parsed-data ['meta :name])]
|
|
||||||
{:db (assoc-in db [:registry extension-key] {:state :inactive
|
|
||||||
:data parsed-data})}))
|
|
||||||
|
|
||||||
(def ^:private state->new-state {:active :inactive
|
|
||||||
:inactive :active})
|
|
||||||
|
|
||||||
(defn- switch [new-state extension-key {:keys [db] :as cofx}]
|
|
||||||
(when-let [{:keys [state data]} (get-in db [:registry extension-key])]
|
|
||||||
(when-not (= state new-state)
|
|
||||||
(apply utils/merge-fx cofx
|
|
||||||
(constantly {:db (assoc-in db [:registry extension-key :state] (get state->new-state state))})
|
|
||||||
(mapcat (fn [[app-hook extension-hooks]]
|
|
||||||
(map (fn [[hook-id {:keys [hook-ref parsed]}]]
|
|
||||||
(if (= :active new-state)
|
|
||||||
(partial hooks/hook-in (:hook hook-ref) hook-id parsed)
|
|
||||||
(partial hooks/unhook (:hook hook-ref) hook-id parsed)))
|
|
||||||
extension-hooks))
|
|
||||||
(:hooks data))))))
|
|
||||||
|
|
||||||
(def activate
|
|
||||||
"Takes extension key and activates it by turning on all hooks. Extension state is switched to active."
|
|
||||||
(partial switch :active))
|
|
||||||
|
|
||||||
(def deactivate
|
|
||||||
"Takes extension key and de-activates it by turning off all hooks. Extension state is switched to inactive."
|
|
||||||
(partial switch :inactive))
|
|
||||||
|
|
||||||
(defn remove
|
|
||||||
"Removes extension from extension map altogether, if the extension is in active state, deactives it first."
|
|
||||||
[extension-key {:keys [db] :as cofx}]
|
|
||||||
(when-let [{:keys [state]} (get-in db [:registry extension-key])]
|
|
||||||
(if (= :inactive state)
|
|
||||||
{:db (update db :registry dissoc extension-key)}
|
|
||||||
(utils/merge-fx cofx
|
|
||||||
(partial deactivate extension-key)
|
|
||||||
(fn [{:keys [db]}]
|
|
||||||
{:db (update db :registry dissoc extension-key)})))))
|
|
@ -28,17 +28,3 @@
|
|||||||
(defn interpolate [values s]
|
(defn interpolate [values s]
|
||||||
(reduce-kv #(string/replace %1 (str "${" (str %2) "}") (str %3))
|
(reduce-kv #(string/replace %1 (str "${" (str %2) "}") (str %3))
|
||||||
s values))
|
s values))
|
||||||
|
|
||||||
(defn- update-db [cofx {:keys [db] :as fx}]
|
|
||||||
(if db (assoc cofx :db db) cofx))
|
|
||||||
|
|
||||||
;; TODO(janherich): we have similar function in `status-react` - it's probably worth to push such things
|
|
||||||
;; into some `re-frame-helpers` library, together with collection of generic, app agnostic co-effects/effects
|
|
||||||
;; like `now`/`random-id` co-effects or `http` call effect
|
|
||||||
(defn merge-fx
|
|
||||||
([cofx & fx-fns]
|
|
||||||
(first (reduce (fn [[fx cofx] fx-fn]
|
|
||||||
(let [new-fx (fx-fn cofx)]
|
|
||||||
[(merge fx new-fx) (update-db cofx new-fx)]))
|
|
||||||
[{} cofx]
|
|
||||||
fx-fns))))
|
|
||||||
|
@ -1,69 +0,0 @@
|
|||||||
(ns pluto.registry-test
|
|
||||||
(:refer-clojure :exclude [read])
|
|
||||||
(:require [clojure.test :refer [is deftest testing]]
|
|
||||||
[pluto.reader.hooks :as hooks]
|
|
||||||
[pluto.registry :as registry]
|
|
||||||
[pluto.utils :as utils]))
|
|
||||||
|
|
||||||
(def parsed-data {'meta {:name "test"}
|
|
||||||
:hooks {:main {:a {:parsed {:name "tester"}
|
|
||||||
:hook-ref {:properties {:name :string}
|
|
||||||
:hook
|
|
||||||
(reify hooks/Hook
|
|
||||||
(hook-in [_ id properties {:keys [db]}]
|
|
||||||
{:db (assoc-in db [:main id] properties)})
|
|
||||||
(unhook [_ id _ {:keys [db]}]
|
|
||||||
{:db (update db :main dissoc id)}))}}}}})
|
|
||||||
|
|
||||||
(deftest add-test
|
|
||||||
(testing "Correctly adds extension"
|
|
||||||
(is (= {:db {:registry {"test" {:state :inactive
|
|
||||||
:data parsed-data}}}}
|
|
||||||
(registry/add parsed-data {:db {}}))))
|
|
||||||
(testing "Correctly adds new extension without touching existing one"
|
|
||||||
(is (= {:db {:registry {"test" {:state :inactive
|
|
||||||
:data parsed-data}
|
|
||||||
"old" {:state :active}}}}
|
|
||||||
(registry/add parsed-data {:db {:registry {"old" {:state :active}}}})))))
|
|
||||||
|
|
||||||
(deftest activate-test
|
|
||||||
(testing "When extension is not present, do nothing"
|
|
||||||
(is (= nil (registry/activate "test" {:db {}}))))
|
|
||||||
(testing "When extension is present and activated, state is correctly switched + all app hooks are hooked-in"
|
|
||||||
(is (= {:db {:registry {"test" {:state :active
|
|
||||||
:data parsed-data}}
|
|
||||||
:main {:a {:name "tester"}}}}
|
|
||||||
(utils/merge-fx {:db {}}
|
|
||||||
(partial registry/add parsed-data)
|
|
||||||
(partial registry/activate "test")))))
|
|
||||||
(testing "When extension is already activated, do nothing"
|
|
||||||
(is (= nil (registry/activate "test" {:db {:registry {"test" {:state :active}}}})))))
|
|
||||||
|
|
||||||
(deftest deactivate-test
|
|
||||||
(testing "When extension is not present, do nothing"
|
|
||||||
(is (= nil (registry/deactivate "test" {:db {}}))))
|
|
||||||
(testing "When extension is present and deactivated, state is correctly switched + all app hooks are unhooked"
|
|
||||||
(is (= {:db {:registry {"test" {:state :inactive
|
|
||||||
:data parsed-data}}
|
|
||||||
:main {}}}
|
|
||||||
(utils/merge-fx {:db {}}
|
|
||||||
(partial registry/add parsed-data)
|
|
||||||
(partial registry/activate "test")
|
|
||||||
(partial registry/deactivate "test")))))
|
|
||||||
(testing "When extension is already deactivated, do nothing"
|
|
||||||
(is (= nil (registry/deactivate "test" {:db {:registry {"test" {:state :inactive}}}})))))
|
|
||||||
|
|
||||||
(deftest remove-test
|
|
||||||
(testing "When extension is not present, do nothing"
|
|
||||||
(is (= nil (registry/remove "test" {:db {}}))))
|
|
||||||
(testing "When extension is present and inactive, remove it"
|
|
||||||
(is (= {:db {:registry {}}}
|
|
||||||
(registry/remove "test"
|
|
||||||
{:db {:registry {"test" {:state :inactive}}}}))))
|
|
||||||
(testing "When extension is present and active, remove it + produce unhook effects"
|
|
||||||
(is (= {:db {:registry {}
|
|
||||||
:main {}}}
|
|
||||||
(utils/merge-fx {:db {}}
|
|
||||||
(partial registry/add parsed-data)
|
|
||||||
(partial registry/activate "test")
|
|
||||||
(partial registry/remove "test"))))))
|
|
@ -3,21 +3,6 @@
|
|||||||
(:require [clojure.test :refer [is deftest testing]]
|
(:require [clojure.test :refer [is deftest testing]]
|
||||||
[pluto.utils :as utils]))
|
[pluto.utils :as utils]))
|
||||||
|
|
||||||
(deftest merge-fx-test
|
|
||||||
(testing "Correctly merges results of multiple effect producing functions"
|
|
||||||
(is (= {:db {:a 2
|
|
||||||
:b 1}
|
|
||||||
:fire-missile true}
|
|
||||||
(utils/merge-fx {:db {:a 0}
|
|
||||||
:now "current-time"}
|
|
||||||
(fn [{:keys [db]}]
|
|
||||||
{:db (update db :a inc)})
|
|
||||||
(fn [{:keys [db]}]
|
|
||||||
{:db (-> db
|
|
||||||
(update :a inc)
|
|
||||||
(assoc :b 1))})
|
|
||||||
(constantly {:fire-missile true}))))))
|
|
||||||
|
|
||||||
#?(:clj
|
#?(:clj
|
||||||
(defmacro slurp [file]
|
(defmacro slurp [file]
|
||||||
(clojure.core/slurp file)))
|
(clojure.core/slurp file)))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user