mirror of
https://github.com/penpot/penpot.git
synced 2025-08-07 14:38:33 +02:00
🔧 add groups handling v2
This commit is contained in:
parent
e2ff6f7ba6
commit
3a4ec32f8e
3 changed files with 766 additions and 219 deletions
|
@ -57,6 +57,54 @@
|
||||||
#?(:cljs (instance? lkm/LinkedMap o)
|
#?(:cljs (instance? lkm/LinkedMap o)
|
||||||
:clj (instance? LinkedMap o)))
|
:clj (instance? LinkedMap o)))
|
||||||
|
|
||||||
|
(defn oassoc
|
||||||
|
[o & kvs]
|
||||||
|
(apply assoc (or o (ordered-map)) kvs))
|
||||||
|
|
||||||
|
(defn oassoc-in
|
||||||
|
[o [k & ks] v]
|
||||||
|
(if ks
|
||||||
|
(oassoc o k (oassoc-in (get o k) ks v))
|
||||||
|
(oassoc o k v)))
|
||||||
|
|
||||||
|
#_(defn oupdate-in
|
||||||
|
[m ks f & args]
|
||||||
|
(let [up (fn up [m ks f args]
|
||||||
|
(let [[k & ks] ks]
|
||||||
|
(if ks
|
||||||
|
(oassoc m k (up (get m k) ks f args))
|
||||||
|
(oassoc m k (apply f (get m k) args)))))]
|
||||||
|
(up m ks f args)))
|
||||||
|
|
||||||
|
(declare index-of)
|
||||||
|
|
||||||
|
#_(defn oassoc-before
|
||||||
|
"Assoc a k v pair, in the order position just before the other key"
|
||||||
|
[o k v before-k]
|
||||||
|
(if-let [index (index-of (keys o) before-k)]
|
||||||
|
(-> (ordered-map)
|
||||||
|
(into (take index o))
|
||||||
|
(assoc k v)
|
||||||
|
(into (drop index o)))
|
||||||
|
(oassoc o k v)))
|
||||||
|
|
||||||
|
(defn oassoc-in-before
|
||||||
|
[o [old-k & old-ks] [k & ks] v]
|
||||||
|
(if-let [index (index-of (keys o) old-k)]
|
||||||
|
(let [new-v (if ks
|
||||||
|
(oassoc-in-before (get o k) old-ks ks v)
|
||||||
|
v)]
|
||||||
|
(if (= k old-k)
|
||||||
|
(-> (ordered-map)
|
||||||
|
(into (take index o))
|
||||||
|
(assoc k new-v)
|
||||||
|
(into (drop (inc index) o)))
|
||||||
|
(-> (ordered-map)
|
||||||
|
(into (take index o))
|
||||||
|
(assoc k new-v)
|
||||||
|
(into (drop index o)))))
|
||||||
|
(oassoc-in o (cons k ks) v)))
|
||||||
|
|
||||||
(defn vec2
|
(defn vec2
|
||||||
"Creates a optimized vector compatible type of length 2 backed
|
"Creates a optimized vector compatible type of length 2 backed
|
||||||
internally with MapEntry impl because it has faster access method
|
internally with MapEntry impl because it has faster access method
|
||||||
|
@ -564,6 +612,7 @@
|
||||||
new-elems
|
new-elems
|
||||||
(remove p? after))))
|
(remove p? after))))
|
||||||
|
|
||||||
|
;; TODO: remove this
|
||||||
(defn addm-at-index
|
(defn addm-at-index
|
||||||
"Insert an element in an ordered map at an arbitrary index"
|
"Insert an element in an ordered map at an arbitrary index"
|
||||||
[coll index key element]
|
[coll index key element]
|
||||||
|
|
|
@ -15,6 +15,86 @@
|
||||||
[cuerdas.core :as str]
|
[cuerdas.core :as str]
|
||||||
#?(:clj [app.common.fressian :as fres])))
|
#?(:clj [app.common.fressian :as fres])))
|
||||||
|
|
||||||
|
;; === Groups handling
|
||||||
|
|
||||||
|
(def schema:groupable-item
|
||||||
|
[:map {:title "Groupable item"}
|
||||||
|
[:name :string]])
|
||||||
|
|
||||||
|
(def valid-groupable-item?
|
||||||
|
(sm/validator schema:groupable-item))
|
||||||
|
|
||||||
|
(defn split-path
|
||||||
|
"Decompose a string in the form 'one.two.three' into a vector of strings, removing spaces."
|
||||||
|
[path separator]
|
||||||
|
(let [xf (comp (map str/trim)
|
||||||
|
(remove str/empty?))]
|
||||||
|
(->> (str/split path separator)
|
||||||
|
(into [] xf))))
|
||||||
|
|
||||||
|
(defn join-path
|
||||||
|
"Regenerate a path as a string, from a vector."
|
||||||
|
[path separator]
|
||||||
|
(str/join separator path))
|
||||||
|
|
||||||
|
(defn group-item
|
||||||
|
"Add a group to the item name, in the form group.name."
|
||||||
|
[item group-name separator]
|
||||||
|
(dm/assert!
|
||||||
|
"expected groupable item"
|
||||||
|
(valid-groupable-item? item))
|
||||||
|
(update item :name #(str group-name separator %)))
|
||||||
|
|
||||||
|
(defn ungroup-item
|
||||||
|
"Remove the first group from the item name."
|
||||||
|
[item separator]
|
||||||
|
(dm/assert!
|
||||||
|
"expected groupable item"
|
||||||
|
(valid-groupable-item? item))
|
||||||
|
(update item :name #(-> %
|
||||||
|
(split-path separator)
|
||||||
|
(rest)
|
||||||
|
(join-path separator))))
|
||||||
|
|
||||||
|
(defn get-path
|
||||||
|
"Get the groups part of the name as a vector. E.g. group.subgroup.name -> ['group' 'subrgoup']"
|
||||||
|
[item separator]
|
||||||
|
(dm/assert!
|
||||||
|
"expected groupable item"
|
||||||
|
(valid-groupable-item? item))
|
||||||
|
(split-path (:name item) separator))
|
||||||
|
|
||||||
|
(defn get-groups-str
|
||||||
|
"Get the groups part of the name. E.g. group.subgroup.name -> group.subrgoup"
|
||||||
|
[item separator]
|
||||||
|
(-> (get-path item separator)
|
||||||
|
(butlast)
|
||||||
|
(join-path separator)))
|
||||||
|
|
||||||
|
(defn get-final-name
|
||||||
|
"Get the final part of the name. E.g. group.subgroup.name -> name"
|
||||||
|
[item separator]
|
||||||
|
(dm/assert!
|
||||||
|
"expected groupable item"
|
||||||
|
(valid-groupable-item? item))
|
||||||
|
(-> (:name item)
|
||||||
|
(split-path separator)
|
||||||
|
(last)))
|
||||||
|
|
||||||
|
(defn group?
|
||||||
|
"Check if a node of the grouping tree is a group or a final item."
|
||||||
|
[item]
|
||||||
|
(d/ordered-map? item))
|
||||||
|
|
||||||
|
(defn get-children
|
||||||
|
"Get all children of a group of a grouping tree. Each child is
|
||||||
|
a tuple [name item], where item "
|
||||||
|
[group]
|
||||||
|
(dm/assert!
|
||||||
|
"expected group node"
|
||||||
|
(group? group))
|
||||||
|
(seq group))
|
||||||
|
|
||||||
;; === Token
|
;; === Token
|
||||||
|
|
||||||
(defrecord Token [name type value description modified-at])
|
(defrecord Token [name type value description modified-at])
|
||||||
|
@ -22,10 +102,10 @@
|
||||||
(def schema:token
|
(def schema:token
|
||||||
[:and
|
[:and
|
||||||
[:map {:title "Token"}
|
[:map {:title "Token"}
|
||||||
[:name cto/token-name-ref] ;; not necessary to have uuid
|
[:name cto/token-name-ref] ;; not necessary to have uuid
|
||||||
[:type [::sm/one-of cto/token-types]]
|
[:type [::sm/one-of cto/token-types]]
|
||||||
[:value :any]
|
[:value :any]
|
||||||
[:description [:maybe :string]] ;; defrecord always have the attributes, even with nil value
|
[:description [:maybe :string]] ;; defrecord always have the attributes, even with nil value
|
||||||
[:modified-at ::sm/inst]]
|
[:modified-at ::sm/inst]]
|
||||||
[:fn (partial instance? Token)]])
|
[:fn (partial instance? Token)]])
|
||||||
|
|
||||||
|
@ -62,42 +142,56 @@
|
||||||
ITokenSet
|
ITokenSet
|
||||||
(add-token [_ token]
|
(add-token [_ token]
|
||||||
(dm/assert! "expected valid token" (check-token! token))
|
(dm/assert! "expected valid token" (check-token! token))
|
||||||
(TokenSet. name
|
(let [path (split-path (:name token) ".")]
|
||||||
description
|
(TokenSet. name
|
||||||
(dt/now)
|
description
|
||||||
(assoc tokens (:name token) token)))
|
(dt/now)
|
||||||
|
(d/oassoc-in tokens path token))))
|
||||||
|
|
||||||
(update-token [this token-name f]
|
(update-token [this token-name f]
|
||||||
(if-let [token (get tokens token-name)]
|
(let [path (split-path token-name ".")
|
||||||
(let [token' (-> (make-token (f token))
|
token (get-in tokens path)]
|
||||||
(assoc :modified-at (dt/now)))]
|
(if token
|
||||||
(check-token! token')
|
(let [token' (-> (make-token (f token))
|
||||||
(TokenSet. name
|
(assoc :modified-at (dt/now)))
|
||||||
description
|
path' (get-path token' ".")]
|
||||||
(dt/now)
|
(check-token! token')
|
||||||
(if (= (:name token) (:name token'))
|
(TokenSet. name
|
||||||
(assoc tokens (:name token') token')
|
description
|
||||||
(let [index (d/index-of (keys tokens) (:name token))]
|
(dt/now)
|
||||||
|
(if (= (:name token) (:name token'))
|
||||||
|
(d/oassoc-in tokens path token')
|
||||||
(-> tokens
|
(-> tokens
|
||||||
(dissoc (:name token))
|
(d/oassoc-in-before path path' token')
|
||||||
(d/addm-at-index index (:name token') token'))))))
|
(d/dissoc-in path)))))
|
||||||
this))
|
this)))
|
||||||
|
|
||||||
(delete-token [_ token-name]
|
(delete-token [_ token-name]
|
||||||
(TokenSet. name
|
(let [path (split-path token-name ".")]
|
||||||
description
|
(TokenSet. name
|
||||||
(dt/now)
|
description
|
||||||
(dissoc tokens token-name)))
|
(dt/now)
|
||||||
|
(d/dissoc-in tokens path))))
|
||||||
|
|
||||||
(get-tokens [_]
|
(get-tokens [_]
|
||||||
(vals tokens)))
|
(->> (tree-seq d/ordered-map? vals tokens)
|
||||||
|
(filter (partial instance? Token)))))
|
||||||
|
|
||||||
|
(def schema:token-node
|
||||||
|
[:schema {:registry {::node [:or ::token
|
||||||
|
[:and
|
||||||
|
[:map-of {:gen/max 5} :string [:ref ::node]]
|
||||||
|
[:fn d/ordered-map?]]]}}
|
||||||
|
[:ref ::node]])
|
||||||
|
|
||||||
|
(sm/register! ::token-node schema:token-node)
|
||||||
|
|
||||||
(def schema:token-set
|
(def schema:token-set
|
||||||
[:and [:map {:title "TokenSet"}
|
[:and [:map {:title "TokenSet"}
|
||||||
[:name :string]
|
[:name :string]
|
||||||
[:description [:maybe :string]]
|
[:description [:maybe :string]]
|
||||||
[:modified-at ::sm/inst]
|
[:modified-at ::sm/inst]
|
||||||
[:tokens [:and [:map-of {:gen/max 5} :string ::token]
|
[:tokens [:and [:map-of {:gen/max 5} :string ::token-node]
|
||||||
[:fn d/ordered-map?]]]]
|
[:fn d/ordered-map?]]]]
|
||||||
[:fn (partial instance? TokenSet)]])
|
[:fn (partial instance? TokenSet)]])
|
||||||
|
|
||||||
|
@ -140,6 +234,7 @@
|
||||||
(update-set [_ set-name f] "modify a set in the ilbrary")
|
(update-set [_ set-name f] "modify a set in the ilbrary")
|
||||||
(delete-set [_ set-name] "delete a set in the library")
|
(delete-set [_ set-name] "delete a set in the library")
|
||||||
(set-count [_] "get the total number if sets in the library")
|
(set-count [_] "get the total number if sets in the library")
|
||||||
|
(get-set-tree [_] "get a nested tree of all sets in the library")
|
||||||
(get-sets [_] "get an ordered sequence of all sets in the library")
|
(get-sets [_] "get an ordered sequence of all sets in the library")
|
||||||
(get-set [_ set-name] "get one set looking for name")
|
(get-set [_ set-name] "get one set looking for name")
|
||||||
(get-set-group [_ set-group-path] "get the attributes of a set group"))
|
(get-set-group [_ set-group-path] "get the attributes of a set group"))
|
||||||
|
@ -215,6 +310,7 @@
|
||||||
(update-theme [_ theme-name f] "modify a theme in the ilbrary")
|
(update-theme [_ theme-name f] "modify a theme in the ilbrary")
|
||||||
(delete-theme [_ theme-name] "delete a theme in the library")
|
(delete-theme [_ theme-name] "delete a theme in the library")
|
||||||
(theme-count [_] "get the total number if themes in the library")
|
(theme-count [_] "get the total number if themes in the library")
|
||||||
|
(get-theme-tree [_] "get a nested tree of all themes in the library")
|
||||||
(get-themes [_] "get an ordered sequence of all themes in the library")
|
(get-themes [_] "get an ordered sequence of all themes in the library")
|
||||||
(get-theme [_ theme-name] "get one theme looking for name"))
|
(get-theme [_ theme-name] "get one theme looking for name"))
|
||||||
|
|
||||||
|
@ -242,8 +338,6 @@
|
||||||
(toggle-set-in-theme [_ theme-name set-name] "toggle a set used / not used in a theme")
|
(toggle-set-in-theme [_ theme-name set-name] "toggle a set used / not used in a theme")
|
||||||
(validate [_]))
|
(validate [_]))
|
||||||
|
|
||||||
(declare get-path)
|
|
||||||
|
|
||||||
(deftype TokensLib [sets set-groups themes]
|
(deftype TokensLib [sets set-groups themes]
|
||||||
;; NOTE: This is only for debug purposes, pending to properly
|
;; NOTE: This is only for debug purposes, pending to properly
|
||||||
;; implement the toString and alternative printing.
|
;; implement the toString and alternative printing.
|
||||||
|
@ -260,41 +354,50 @@
|
||||||
ITokenSets
|
ITokenSets
|
||||||
(add-set [_ token-set]
|
(add-set [_ token-set]
|
||||||
(dm/assert! "expected valid token set" (check-token-set! token-set))
|
(dm/assert! "expected valid token set" (check-token-set! token-set))
|
||||||
(let [path (get-path token-set)]
|
(let [path (get-path token-set "/")
|
||||||
(TokensLib. (assoc sets (:name token-set) token-set)
|
groups-str (get-groups-str token-set "/")]
|
||||||
|
(TokensLib. (d/oassoc-in sets path token-set)
|
||||||
(cond-> set-groups
|
(cond-> set-groups
|
||||||
(seq path)
|
(not (str/empty? groups-str))
|
||||||
(assoc path (make-token-set-group)))
|
(assoc groups-str (make-token-set-group)))
|
||||||
themes)))
|
themes)))
|
||||||
|
|
||||||
(update-set [this set-name f]
|
(update-set [this set-name f]
|
||||||
(if-let [set (get sets set-name)]
|
(let [path (split-path set-name "/")
|
||||||
(let [set' (-> (make-token-set (f set))
|
set (get-in sets path)]
|
||||||
(assoc :modified-at (dt/now)))]
|
(if set
|
||||||
(check-token-set! set')
|
(let [set' (-> (make-token-set (f set))
|
||||||
(TokensLib. (if (= (:name set) (:name set'))
|
(assoc :modified-at (dt/now)))
|
||||||
(assoc sets (:name set') set')
|
path' (get-path set' "/")]
|
||||||
(let [index (d/index-of (keys sets) (:name set))]
|
(check-token-set! set')
|
||||||
|
(TokensLib. (if (= (:name set) (:name set'))
|
||||||
|
(d/oassoc-in sets path set')
|
||||||
(-> sets
|
(-> sets
|
||||||
(dissoc (:name set))
|
(d/oassoc-in-before path path' set')
|
||||||
(d/addm-at-index index (:name set') set'))))
|
(d/dissoc-in path)))
|
||||||
set-groups ;; TODO update set-groups as needed
|
set-groups ;; TODO update set-groups as needed
|
||||||
themes))
|
themes))
|
||||||
this))
|
this)))
|
||||||
|
|
||||||
(delete-set [_ set-name]
|
(delete-set [_ set-name]
|
||||||
(TokensLib. (dissoc sets set-name)
|
(let [path (split-path set-name "/")]
|
||||||
set-groups ;; TODO remove set-group if needed
|
(TokensLib. (d/dissoc-in sets path)
|
||||||
themes))
|
set-groups ;; TODO remove set-group if needed
|
||||||
|
themes)))
|
||||||
|
|
||||||
(set-count [_]
|
(get-set-tree [_]
|
||||||
(count sets))
|
sets)
|
||||||
|
|
||||||
(get-sets [_]
|
(get-sets [_]
|
||||||
(vals sets))
|
(->> (tree-seq d/ordered-map? vals sets)
|
||||||
|
(filter (partial instance? TokenSet))))
|
||||||
|
|
||||||
|
(set-count [this]
|
||||||
|
(count (get-sets this)))
|
||||||
|
|
||||||
(get-set [_ set-name]
|
(get-set [_ set-name]
|
||||||
(get sets set-name))
|
(let [path (split-path set-name "/")]
|
||||||
|
(get-in sets path)))
|
||||||
|
|
||||||
(get-set-group [_ set-group-path]
|
(get-set-group [_ set-group-path]
|
||||||
(get set-groups set-group-path))
|
(get set-groups set-group-path))
|
||||||
|
@ -302,38 +405,47 @@
|
||||||
ITokenThemes
|
ITokenThemes
|
||||||
(add-theme [_ token-theme]
|
(add-theme [_ token-theme]
|
||||||
(dm/assert! "expected valid token theme" (check-token-theme! token-theme))
|
(dm/assert! "expected valid token theme" (check-token-theme! token-theme))
|
||||||
(TokensLib. sets
|
(let [path (get-path token-theme "/")]
|
||||||
set-groups
|
(TokensLib. sets
|
||||||
(assoc themes (:name token-theme) token-theme)))
|
set-groups
|
||||||
|
(d/oassoc-in themes path token-theme))))
|
||||||
|
|
||||||
(update-theme [this theme-name f]
|
(update-theme [this theme-name f]
|
||||||
(if-let [theme (get themes theme-name)]
|
(let [path (split-path theme-name "/")
|
||||||
(let [theme' (-> (make-token-theme (f theme))
|
theme (get-in themes path)]
|
||||||
(assoc :modified-at (dt/now)))]
|
(if theme
|
||||||
(check-token-theme! theme')
|
(let [theme' (-> (make-token-theme (f theme))
|
||||||
(TokensLib. sets
|
(assoc :modified-at (dt/now)))
|
||||||
set-groups
|
path' (get-path theme' "/")]
|
||||||
(if (= (:name theme) (:name theme'))
|
(check-token-theme! theme')
|
||||||
(assoc themes (:name theme') theme')
|
(TokensLib. sets
|
||||||
(let [index (d/index-of (keys themes) (:name theme))]
|
set-groups
|
||||||
|
(if (= (:name theme) (:name theme'))
|
||||||
|
(d/oassoc-in themes path theme')
|
||||||
(-> themes
|
(-> themes
|
||||||
(dissoc (:name theme))
|
(d/oassoc-in-before path path' theme')
|
||||||
(d/addm-at-index index (:name theme') theme'))))))
|
(d/dissoc-in path)))))
|
||||||
this))
|
this)))
|
||||||
|
|
||||||
(delete-theme [_ theme-name]
|
(delete-theme [_ theme-name]
|
||||||
(TokensLib. sets
|
(let [path (split-path theme-name "/")]
|
||||||
set-groups
|
(TokensLib. sets
|
||||||
(dissoc themes theme-name)))
|
set-groups
|
||||||
|
(d/dissoc-in themes path))))
|
||||||
|
|
||||||
(theme-count [_]
|
(get-theme-tree [_]
|
||||||
(count themes))
|
themes)
|
||||||
|
|
||||||
(get-themes [_]
|
(get-themes [_]
|
||||||
(vals themes))
|
(->> (tree-seq d/ordered-map? vals themes)
|
||||||
|
(filter (partial instance? TokenTheme))))
|
||||||
|
|
||||||
|
(theme-count [this]
|
||||||
|
(count (get-themes this)))
|
||||||
|
|
||||||
(get-theme [_ theme-name]
|
(get-theme [_ theme-name]
|
||||||
(get themes theme-name))
|
(let [path (split-path theme-name "/")]
|
||||||
|
(get-in themes path)))
|
||||||
|
|
||||||
ITokensLib
|
ITokensLib
|
||||||
(add-token-in-set [this set-name token]
|
(add-token-in-set [this set-name token]
|
||||||
|
@ -478,90 +590,3 @@
|
||||||
set-groups (fres/read-object! r)
|
set-groups (fres/read-object! r)
|
||||||
themes (fres/read-object! r)]
|
themes (fres/read-object! r)]
|
||||||
(->TokensLib sets set-groups themes)))}))
|
(->TokensLib sets set-groups themes)))}))
|
||||||
|
|
||||||
;; === Groups handling
|
|
||||||
|
|
||||||
(def schema:groupable-item
|
|
||||||
[:map {:title "Groupable item"}
|
|
||||||
[:name :string]])
|
|
||||||
|
|
||||||
(def valid-groupable-item?
|
|
||||||
(sm/validator schema:groupable-item))
|
|
||||||
|
|
||||||
(defn split-path
|
|
||||||
"Decompose a string in the form 'one.two.three' into a vector of strings, removing spaces."
|
|
||||||
[path]
|
|
||||||
(let [xf (comp (map str/trim)
|
|
||||||
(remove str/empty?))]
|
|
||||||
(->> (str/split path ".")
|
|
||||||
(into [] xf))))
|
|
||||||
|
|
||||||
(defn join-path
|
|
||||||
"Regenerate a path as a string, from a vector."
|
|
||||||
[path-vec]
|
|
||||||
(str/join "." path-vec))
|
|
||||||
|
|
||||||
(defn group-item
|
|
||||||
"Add a group to the item name, in the form group.name."
|
|
||||||
[item group-name]
|
|
||||||
(dm/assert!
|
|
||||||
"expected groupable item"
|
|
||||||
(valid-groupable-item? item))
|
|
||||||
(update item :name #(str group-name "." %)))
|
|
||||||
|
|
||||||
(defn ungroup-item
|
|
||||||
"Remove the first group from the item name."
|
|
||||||
[item]
|
|
||||||
(dm/assert!
|
|
||||||
"expected groupable item"
|
|
||||||
(valid-groupable-item? item))
|
|
||||||
(update item :name #(-> %
|
|
||||||
(split-path)
|
|
||||||
(rest)
|
|
||||||
(join-path))))
|
|
||||||
|
|
||||||
(defn get-path
|
|
||||||
"Get the groups part of the name. E.g. group.subgroup.name -> group.subrgoup"
|
|
||||||
[item]
|
|
||||||
(dm/assert!
|
|
||||||
"expected groupable item"
|
|
||||||
(valid-groupable-item? item))
|
|
||||||
(-> (:name item)
|
|
||||||
(split-path)
|
|
||||||
(butlast)
|
|
||||||
(join-path)))
|
|
||||||
|
|
||||||
(defn get-final-name
|
|
||||||
"Get the final part of the name. E.g. group.subgroup.name -> name"
|
|
||||||
[item]
|
|
||||||
(dm/assert!
|
|
||||||
"expected groupable item"
|
|
||||||
(valid-groupable-item? item))
|
|
||||||
(-> (:name item)
|
|
||||||
(split-path)
|
|
||||||
(last)))
|
|
||||||
|
|
||||||
(defn group-items
|
|
||||||
"Convert a sequence of items in a nested structure like this:
|
|
||||||
|
|
||||||
{'': [itemA itemB]
|
|
||||||
'group1': {'': [item1A item1B]
|
|
||||||
'subgroup11': {'': [item11A item11B item11C]}
|
|
||||||
'subgroup12': {'': [item12A]}}
|
|
||||||
'group2': {'subgroup21': {'': [item21A]}}}
|
|
||||||
"
|
|
||||||
[items & {:keys [reverse-sort?]}]
|
|
||||||
(when (seq items)
|
|
||||||
(reduce (fn [groups item]
|
|
||||||
(let [pathv (split-path (:name item))]
|
|
||||||
(update-in groups
|
|
||||||
pathv
|
|
||||||
(fn [group]
|
|
||||||
(if group
|
|
||||||
(cons group item)
|
|
||||||
item)))))
|
|
||||||
(sorted-map-by (fn [key1 key2] ;; TODO: this does not work well with ordered-map
|
|
||||||
(if reverse-sort? ;; we need to think a bit more of this
|
|
||||||
(compare key2 key1)
|
|
||||||
(compare key1 key2))))
|
|
||||||
items)))
|
|
||||||
|
|
|
@ -130,10 +130,10 @@
|
||||||
|
|
||||||
(t/deftest add-token-set-with-group
|
(t/deftest add-token-set-with-group
|
||||||
(let [tokens-lib (ctob/make-tokens-lib)
|
(let [tokens-lib (ctob/make-tokens-lib)
|
||||||
token-set (ctob/make-token-set :name "test-group.test-token-set")
|
token-set (ctob/make-token-set :name "test-group/test-token-set")
|
||||||
tokens-lib' (ctob/add-set tokens-lib token-set)
|
tokens-lib' (ctob/add-set tokens-lib token-set)
|
||||||
|
|
||||||
set-group (ctob/get-set-group tokens-lib' "test-group")]
|
set-group (ctob/get-set-group tokens-lib' "test-group")]
|
||||||
|
|
||||||
(t/is (= (:attr1 set-group) "one"))
|
(t/is (= (:attr1 set-group) "one"))
|
||||||
(t/is (= (:attr2 set-group) "two"))))
|
(t/is (= (:attr2 set-group) "two"))))
|
||||||
|
@ -423,8 +423,8 @@
|
||||||
(t/testing "grouping"
|
(t/testing "grouping"
|
||||||
(t/deftest split-and-join
|
(t/deftest split-and-join
|
||||||
(let [name "group.subgroup.name"
|
(let [name "group.subgroup.name"
|
||||||
path (ctob/split-path name)
|
path (ctob/split-path name ".")
|
||||||
name' (ctob/join-path path)]
|
name' (ctob/join-path path ".")]
|
||||||
(t/is (= (first path) "group"))
|
(t/is (= (first path) "group"))
|
||||||
(t/is (= (second path) "subgroup"))
|
(t/is (= (second path) "subgroup"))
|
||||||
(t/is (= (nth path 2) "name"))
|
(t/is (= (nth path 2) "name"))
|
||||||
|
@ -432,7 +432,7 @@
|
||||||
|
|
||||||
(t/deftest remove-spaces
|
(t/deftest remove-spaces
|
||||||
(let [name "group . subgroup . name"
|
(let [name "group . subgroup . name"
|
||||||
path (ctob/split-path name)]
|
path (ctob/split-path name ".")]
|
||||||
(t/is (= (first path) "group"))
|
(t/is (= (first path) "group"))
|
||||||
(t/is (= (second path) "subgroup"))
|
(t/is (= (second path) "subgroup"))
|
||||||
(t/is (= (nth path 2) "name"))))
|
(t/is (= (nth path 2) "name"))))
|
||||||
|
@ -441,82 +441,555 @@
|
||||||
(let [token1 (ctob/make-token :name "token1" :type :boolean :value true)
|
(let [token1 (ctob/make-token :name "token1" :type :boolean :value true)
|
||||||
token2 (ctob/make-token :name "some group.token2" :type :boolean :value true)
|
token2 (ctob/make-token :name "some group.token2" :type :boolean :value true)
|
||||||
|
|
||||||
token1' (ctob/group-item token1 "big group")
|
token1' (ctob/group-item token1 "big group" ".")
|
||||||
token2' (ctob/group-item token2 "big group")
|
token2' (ctob/group-item token2 "big group" ".")
|
||||||
token1'' (ctob/ungroup-item token1')
|
token1'' (ctob/ungroup-item token1' ".")
|
||||||
token2'' (ctob/ungroup-item token2')]
|
token2'' (ctob/ungroup-item token2' ".")]
|
||||||
(t/is (= (:name token1') "big group.token1"))
|
(t/is (= (:name token1') "big group.token1"))
|
||||||
(t/is (= (:name token2') "big group.some group.token2"))
|
(t/is (= (:name token2') "big group.some group.token2"))
|
||||||
(t/is (= (:name token1'') "token1"))
|
(t/is (= (:name token1'') "token1"))
|
||||||
(t/is (= (:name token2'') "some group.token2"))))
|
(t/is (= (:name token2'') "some group.token2"))))
|
||||||
|
|
||||||
(t/deftest get-path
|
(t/deftest get-groups-str
|
||||||
(let [token1 (ctob/make-token :name "token1" :type :boolean :value true)
|
(let [token1 (ctob/make-token :name "token1" :type :boolean :value true)
|
||||||
token2 (ctob/make-token :name "some-group.token2" :type :boolean :value true)
|
token2 (ctob/make-token :name "some-group.token2" :type :boolean :value true)
|
||||||
token3 (ctob/make-token :name "some-group.some-subgroup.token3" :type :boolean :value true)]
|
token3 (ctob/make-token :name "some-group.some-subgroup.token3" :type :boolean :value true)]
|
||||||
(t/is (= (ctob/get-path token1) ""))
|
(t/is (= (ctob/get-groups-str token1 ".") ""))
|
||||||
(t/is (= (ctob/get-path token2) "some-group"))
|
(t/is (= (ctob/get-groups-str token2 ".") "some-group"))
|
||||||
(t/is (= (ctob/get-path token3) "some-group.some-subgroup"))))
|
(t/is (= (ctob/get-groups-str token3 ".") "some-group.some-subgroup"))))
|
||||||
|
|
||||||
(t/deftest get-final-name
|
(t/deftest get-final-name
|
||||||
(let [token1 (ctob/make-token :name "token1" :type :boolean :value true)
|
(let [token1 (ctob/make-token :name "token1" :type :boolean :value true)
|
||||||
token2 (ctob/make-token :name "some-group.token2" :type :boolean :value true)
|
token2 (ctob/make-token :name "some-group.token2" :type :boolean :value true)
|
||||||
token3 (ctob/make-token :name "some-group.some-subgroup.token3" :type :boolean :value true)]
|
token3 (ctob/make-token :name "some-group.some-subgroup.token3" :type :boolean :value true)]
|
||||||
(t/is (= (ctob/get-final-name token1) "token1"))
|
(t/is (= (ctob/get-final-name token1 ".") "token1"))
|
||||||
(t/is (= (ctob/get-final-name token2) "token2"))
|
(t/is (= (ctob/get-final-name token2 ".") "token2"))
|
||||||
(t/is (= (ctob/get-final-name token3) "token3"))))
|
(t/is (= (ctob/get-final-name token3 ".") "token3"))))
|
||||||
|
|
||||||
(t/deftest group-items
|
(t/testing "grouped tokens"
|
||||||
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
(t/deftest grouped-tokens
|
||||||
(ctob/add-set (ctob/make-token-set :name "token-set1"))
|
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||||
(ctob/add-set (ctob/make-token-set :name "sgroup1.token-set2"))
|
(ctob/add-set (ctob/make-token-set :name "test-token-set"))
|
||||||
(ctob/add-set (ctob/make-token-set :name "sgroup1.token-set3"))
|
(ctob/add-token-in-set "test-token-set"
|
||||||
(ctob/add-set (ctob/make-token-set :name "sgroup1.ssubgroup1.token-set4"))
|
(ctob/make-token :name "token1"
|
||||||
(ctob/add-set (ctob/make-token-set :name "sgroup2.token-set5"))
|
|
||||||
(ctob/add-token-in-set "sgroup2.token-set5"
|
|
||||||
(ctob/make-token :name "tgroup1.tsubgroup1.token1"
|
|
||||||
:type :boolean
|
:type :boolean
|
||||||
:value true))
|
:value true))
|
||||||
(ctob/add-token-in-set "sgroup2.token-set5"
|
(ctob/add-token-in-set "test-token-set"
|
||||||
(ctob/make-token :name "tgroup1.tsubgroup1.token2"
|
(ctob/make-token :name "group1.token2"
|
||||||
|
:type :boolean
|
||||||
|
:value true))
|
||||||
|
(ctob/add-token-in-set "test-token-set"
|
||||||
|
(ctob/make-token :name "group1.token3"
|
||||||
|
:type :boolean
|
||||||
|
:value true))
|
||||||
|
(ctob/add-token-in-set "test-token-set"
|
||||||
|
(ctob/make-token :name "group1.subgroup11.token4"
|
||||||
|
:type :boolean
|
||||||
|
:value true))
|
||||||
|
(ctob/add-token-in-set "test-token-set"
|
||||||
|
(ctob/make-token :name "group2.token5"
|
||||||
:type :boolean
|
:type :boolean
|
||||||
:value true)))
|
:value true)))
|
||||||
sets (ctob/get-sets tokens-lib)
|
|
||||||
set (ctob/get-set tokens-lib "sgroup2.token-set5")
|
|
||||||
tokens (ctob/get-tokens set)
|
|
||||||
|
|
||||||
set-groups (ctob/group-items sets)
|
set (ctob/get-set tokens-lib "test-token-set")
|
||||||
|
tokens-list (ctob/get-tokens set)
|
||||||
|
|
||||||
token-set1 (get set-groups "token-set1")
|
tokens-tree (:tokens set)
|
||||||
sgroup1 (get set-groups "sgroup1")
|
|
||||||
token-set2 (get sgroup1 "token-set2")
|
|
||||||
token-set3 (get sgroup1 "token-set3")
|
|
||||||
ssubgroup1 (get sgroup1 "ssubgroup1")
|
|
||||||
token-set4 (get ssubgroup1 "token-set4")
|
|
||||||
sgroup2 (get set-groups "sgroup2")
|
|
||||||
token-set5 (get sgroup2 "token-set5")
|
|
||||||
|
|
||||||
|
[node-token1 node-group1 node-group2]
|
||||||
|
(ctob/get-children tokens-tree)
|
||||||
|
|
||||||
token-groups (ctob/group-items tokens)
|
[node-token2 node-token3 node-subgroup11]
|
||||||
tgroup1 (get token-groups "tgroup1")
|
(ctob/get-children (second node-group1))
|
||||||
tsubgroup1 (get tgroup1 "tsubgroup1")
|
|
||||||
token1 (get tsubgroup1 "token1")
|
|
||||||
token2 (get tsubgroup1 "token2")]
|
|
||||||
|
|
||||||
;; {"sgroup1"
|
[node-token4]
|
||||||
;; {"token-set2" {:name "sgroup1.token-set2" ...}
|
(ctob/get-children (second node-subgroup11))
|
||||||
;; "token-set3" {:name "sgroup1.token-set3" ...}
|
|
||||||
;; "ssubgroup1"
|
|
||||||
;; {"token-set4" {:name "sgroup1.ssubgroup1.token-set4" ...}}}
|
|
||||||
;; "sgroup2"
|
|
||||||
;; {"token-set5" {:name "sgroup2.token-set5" ...}}
|
|
||||||
;; "token-set1" {:name "token-set1" ...}}
|
|
||||||
|
|
||||||
(t/is (= (:name token-set1) "token-set1"))
|
[node-token5]
|
||||||
(t/is (= (:name token-set2) "sgroup1.token-set2"))
|
(ctob/get-children (second node-group2))]
|
||||||
(t/is (= (:name token-set3) "sgroup1.token-set3"))
|
|
||||||
(t/is (= (:name token-set4) "sgroup1.ssubgroup1.token-set4"))
|
|
||||||
(t/is (= (:name token-set5) "sgroup2.token-set5"))
|
|
||||||
|
|
||||||
(t/is (= (:name token1) "tgroup1.tsubgroup1.token1"))
|
(t/is (= (count tokens-list) 5))
|
||||||
(t/is (= (:name token2) "tgroup1.tsubgroup1.token2")))))
|
(t/is (= (:name (nth tokens-list 0)) "token1"))
|
||||||
|
(t/is (= (:name (nth tokens-list 1)) "group1.token2"))
|
||||||
|
(t/is (= (:name (nth tokens-list 2)) "group1.token3"))
|
||||||
|
(t/is (= (:name (nth tokens-list 3)) "group1.subgroup11.token4"))
|
||||||
|
(t/is (= (:name (nth tokens-list 4)) "group2.token5"))
|
||||||
|
|
||||||
|
(t/is (= (first node-token1) "token1"))
|
||||||
|
(t/is (= (ctob/group? (second node-token1)) false))
|
||||||
|
(t/is (= (:name (second node-token1)) "token1"))
|
||||||
|
|
||||||
|
(t/is (= (first node-group1) "group1"))
|
||||||
|
(t/is (= (ctob/group? (second node-group1)) true))
|
||||||
|
(t/is (= (count (second node-group1)) 3))
|
||||||
|
|
||||||
|
(t/is (= (first node-token2) "token2"))
|
||||||
|
(t/is (= (ctob/group? (second node-token2)) false))
|
||||||
|
(t/is (= (:name (second node-token2)) "group1.token2"))
|
||||||
|
|
||||||
|
(t/is (= (first node-token3) "token3"))
|
||||||
|
(t/is (= (ctob/group? (second node-token3)) false))
|
||||||
|
(t/is (= (:name (second node-token3)) "group1.token3"))
|
||||||
|
|
||||||
|
(t/is (= (first node-subgroup11) "subgroup11"))
|
||||||
|
(t/is (= (ctob/group? (second node-subgroup11)) true))
|
||||||
|
(t/is (= (count (second node-subgroup11)) 1))
|
||||||
|
|
||||||
|
(t/is (= (first node-token4) "token4"))
|
||||||
|
(t/is (= (ctob/group? (second node-token4)) false))
|
||||||
|
(t/is (= (:name (second node-token4)) "group1.subgroup11.token4"))
|
||||||
|
|
||||||
|
(t/is (= (first node-token5) "token5"))
|
||||||
|
(t/is (= (ctob/group? (second node-token5)) false))
|
||||||
|
(t/is (= (:name (second node-token5)) "group2.token5"))))
|
||||||
|
|
||||||
|
(t/deftest update-token-in-groups
|
||||||
|
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "test-token-set"))
|
||||||
|
(ctob/add-token-in-set "test-token-set"
|
||||||
|
(ctob/make-token :name "test-token-1"
|
||||||
|
:type :boolean
|
||||||
|
:value true))
|
||||||
|
(ctob/add-token-in-set "test-token-set"
|
||||||
|
(ctob/make-token :name "group1.test-token-2"
|
||||||
|
:type :boolean
|
||||||
|
:value true))
|
||||||
|
(ctob/add-token-in-set "test-token-set"
|
||||||
|
(ctob/make-token :name "group1.test-token-3"
|
||||||
|
:type :boolean
|
||||||
|
:value true)))
|
||||||
|
|
||||||
|
tokens-lib' (-> tokens-lib
|
||||||
|
(ctob/update-token-in-set "test-token-set" "group1.test-token-2"
|
||||||
|
(fn [token]
|
||||||
|
(assoc token
|
||||||
|
:description "some description"
|
||||||
|
:value false))))
|
||||||
|
|
||||||
|
token-set (ctob/get-set tokens-lib "test-token-set")
|
||||||
|
token-set' (ctob/get-set tokens-lib' "test-token-set")
|
||||||
|
group1' (get-in token-set' [:tokens "group1"])
|
||||||
|
token (get-in token-set [:tokens "group1" "test-token-2"])
|
||||||
|
token' (get-in token-set' [:tokens "group1" "test-token-2"])]
|
||||||
|
|
||||||
|
(t/is (= (ctob/set-count tokens-lib') 1))
|
||||||
|
(t/is (= (count group1') 2))
|
||||||
|
(t/is (= (d/index-of (keys group1') "test-token-2") 0))
|
||||||
|
(t/is (= (:name token') "group1.test-token-2"))
|
||||||
|
(t/is (= (:description token') "some description"))
|
||||||
|
(t/is (= (:value token') false))
|
||||||
|
(t/is (dt/is-after? (:modified-at token-set') (:modified-at token-set)))
|
||||||
|
(t/is (dt/is-after? (:modified-at token') (:modified-at token)))))
|
||||||
|
|
||||||
|
(t/deftest rename-token-in-groups
|
||||||
|
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "test-token-set"))
|
||||||
|
(ctob/add-token-in-set "test-token-set"
|
||||||
|
(ctob/make-token :name "test-token-1"
|
||||||
|
:type :boolean
|
||||||
|
:value true))
|
||||||
|
(ctob/add-token-in-set "test-token-set"
|
||||||
|
(ctob/make-token :name "group1.test-token-2"
|
||||||
|
:type :boolean
|
||||||
|
:value true))
|
||||||
|
(ctob/add-token-in-set "test-token-set"
|
||||||
|
(ctob/make-token :name "group1.test-token-3"
|
||||||
|
:type :boolean
|
||||||
|
:value true)))
|
||||||
|
|
||||||
|
tokens-lib' (-> tokens-lib
|
||||||
|
(ctob/update-token-in-set "test-token-set" "group1.test-token-2"
|
||||||
|
(fn [token]
|
||||||
|
(assoc token
|
||||||
|
:name "group1.updated-name"))))
|
||||||
|
|
||||||
|
token-set (ctob/get-set tokens-lib "test-token-set")
|
||||||
|
token-set' (ctob/get-set tokens-lib' "test-token-set")
|
||||||
|
group1' (get-in token-set' [:tokens "group1"])
|
||||||
|
token (get-in token-set [:tokens "group1" "test-token-2"])
|
||||||
|
token' (get-in token-set' [:tokens "group1" "updated-name"])]
|
||||||
|
|
||||||
|
(t/is (= (ctob/set-count tokens-lib') 1))
|
||||||
|
(t/is (= (count group1') 2))
|
||||||
|
(t/is (= (d/index-of (keys group1') "updated-name") 0))
|
||||||
|
(t/is (= (:name token') "group1.updated-name"))
|
||||||
|
(t/is (= (:description token') nil))
|
||||||
|
(t/is (= (:value token') true))
|
||||||
|
(t/is (dt/is-after? (:modified-at token-set') (:modified-at token-set)))
|
||||||
|
(t/is (dt/is-after? (:modified-at token') (:modified-at token)))))
|
||||||
|
|
||||||
|
(t/deftest move-token-of-group
|
||||||
|
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "test-token-set"))
|
||||||
|
(ctob/add-token-in-set "test-token-set"
|
||||||
|
(ctob/make-token :name "test-token-1"
|
||||||
|
:type :boolean
|
||||||
|
:value true))
|
||||||
|
(ctob/add-token-in-set "test-token-set"
|
||||||
|
(ctob/make-token :name "group1.test-token-2"
|
||||||
|
:type :boolean
|
||||||
|
:value true))
|
||||||
|
(ctob/add-token-in-set "test-token-set"
|
||||||
|
(ctob/make-token :name "group1.test-token-3"
|
||||||
|
:type :boolean
|
||||||
|
:value true)))
|
||||||
|
|
||||||
|
tokens-lib' (-> tokens-lib
|
||||||
|
(ctob/update-token-in-set "test-token-set" "group1.test-token-2"
|
||||||
|
(fn [token]
|
||||||
|
(assoc token
|
||||||
|
:name "group2.updated-name"))))
|
||||||
|
|
||||||
|
token-set (ctob/get-set tokens-lib "test-token-set")
|
||||||
|
token-set' (ctob/get-set tokens-lib' "test-token-set")
|
||||||
|
group1' (get-in token-set' [:tokens "group1"])
|
||||||
|
group2' (get-in token-set' [:tokens "group2"])
|
||||||
|
token (get-in token-set [:tokens "group1" "test-token-2"])
|
||||||
|
token' (get-in token-set' [:tokens "group2" "updated-name"])]
|
||||||
|
|
||||||
|
(t/is (= (ctob/set-count tokens-lib') 1))
|
||||||
|
(t/is (= (count group1') 1))
|
||||||
|
(t/is (= (count group2') 1))
|
||||||
|
(t/is (= (d/index-of (keys group2') "updated-name") 0))
|
||||||
|
(t/is (= (:name token') "group2.updated-name"))
|
||||||
|
(t/is (= (:description token') nil))
|
||||||
|
(t/is (= (:value token') true))
|
||||||
|
(t/is (dt/is-after? (:modified-at token-set') (:modified-at token-set)))
|
||||||
|
(t/is (dt/is-after? (:modified-at token') (:modified-at token)))))
|
||||||
|
|
||||||
|
(t/deftest delete-token-in-group
|
||||||
|
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "test-token-set"))
|
||||||
|
(ctob/add-token-in-set "test-token-set"
|
||||||
|
(ctob/make-token :name "test-token-1"
|
||||||
|
:type :boolean
|
||||||
|
:value true))
|
||||||
|
(ctob/add-token-in-set "test-token-set"
|
||||||
|
(ctob/make-token :name "group1.test-token-2"
|
||||||
|
:type :boolean
|
||||||
|
:value true)))
|
||||||
|
tokens-lib' (-> tokens-lib
|
||||||
|
(ctob/delete-token-from-set "test-token-set" "group1.test-token-2"))
|
||||||
|
|
||||||
|
token-set (ctob/get-set tokens-lib "test-token-set")
|
||||||
|
token-set' (ctob/get-set tokens-lib' "test-token-set")
|
||||||
|
token' (get-in token-set' [:tokens "group1" "test-token-2"])]
|
||||||
|
|
||||||
|
(t/is (= (ctob/set-count tokens-lib') 1))
|
||||||
|
(t/is (= (count (:tokens token-set')) 1))
|
||||||
|
(t/is (nil? token'))
|
||||||
|
(t/is (dt/is-after? (:modified-at token-set') (:modified-at token-set))))))
|
||||||
|
|
||||||
|
(t/testing "grouped sets"
|
||||||
|
(t/deftest grouped-sets
|
||||||
|
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "token-set-1"))
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "group1/token-set-2"))
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "group1/token-set-3"))
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "group1/subgroup11/token-set-4"))
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "group2/token-set-5")))
|
||||||
|
|
||||||
|
sets-list (ctob/get-sets tokens-lib)
|
||||||
|
|
||||||
|
sets-tree (ctob/get-set-tree tokens-lib)
|
||||||
|
|
||||||
|
[node-set1 node-group1 node-group2]
|
||||||
|
(ctob/get-children sets-tree)
|
||||||
|
|
||||||
|
[node-set2 node-set3 node-subgroup11]
|
||||||
|
(ctob/get-children (second node-group1))
|
||||||
|
|
||||||
|
[node-set4]
|
||||||
|
(ctob/get-children (second node-subgroup11))
|
||||||
|
|
||||||
|
[node-set5]
|
||||||
|
(ctob/get-children (second node-group2))]
|
||||||
|
|
||||||
|
(t/is (= (count sets-list) 5))
|
||||||
|
(t/is (= (:name (nth sets-list 0)) "token-set-1"))
|
||||||
|
(t/is (= (:name (nth sets-list 1)) "group1/token-set-2"))
|
||||||
|
(t/is (= (:name (nth sets-list 2)) "group1/token-set-3"))
|
||||||
|
(t/is (= (:name (nth sets-list 3)) "group1/subgroup11/token-set-4"))
|
||||||
|
(t/is (= (:name (nth sets-list 4)) "group2/token-set-5"))
|
||||||
|
|
||||||
|
(t/is (= (first node-set1) "token-set-1"))
|
||||||
|
(t/is (= (ctob/group? (second node-set1)) false))
|
||||||
|
(t/is (= (:name (second node-set1)) "token-set-1"))
|
||||||
|
|
||||||
|
(t/is (= (first node-group1) "group1"))
|
||||||
|
(t/is (= (ctob/group? (second node-group1)) true))
|
||||||
|
(t/is (= (count (second node-group1)) 3))
|
||||||
|
|
||||||
|
(t/is (= (first node-set2) "token-set-2"))
|
||||||
|
(t/is (= (ctob/group? (second node-set2)) false))
|
||||||
|
(t/is (= (:name (second node-set2)) "group1/token-set-2"))
|
||||||
|
|
||||||
|
(t/is (= (first node-set3) "token-set-3"))
|
||||||
|
(t/is (= (ctob/group? (second node-set3)) false))
|
||||||
|
(t/is (= (:name (second node-set3)) "group1/token-set-3"))
|
||||||
|
|
||||||
|
(t/is (= (first node-subgroup11) "subgroup11"))
|
||||||
|
(t/is (= (ctob/group? (second node-subgroup11)) true))
|
||||||
|
(t/is (= (count (second node-subgroup11)) 1))
|
||||||
|
|
||||||
|
(t/is (= (first node-set4) "token-set-4"))
|
||||||
|
(t/is (= (ctob/group? (second node-set4)) false))
|
||||||
|
(t/is (= (:name (second node-set4)) "group1/subgroup11/token-set-4"))
|
||||||
|
|
||||||
|
(t/is (= (first node-set5) "token-set-5"))
|
||||||
|
(t/is (= (ctob/group? (second node-set5)) false))
|
||||||
|
(t/is (= (:name (second node-set5)) "group2/token-set-5"))))
|
||||||
|
|
||||||
|
(t/deftest update-set-in-groups
|
||||||
|
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "token-set-1"))
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "group1/token-set-2"))
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "group1/token-set-3"))
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "group1/subgroup11/token-set-4"))
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "group2/token-set-5")))
|
||||||
|
|
||||||
|
tokens-lib' (-> tokens-lib
|
||||||
|
(ctob/update-set "group1/token-set-2"
|
||||||
|
(fn [token-set]
|
||||||
|
(assoc token-set :description "some description"))))
|
||||||
|
|
||||||
|
sets-tree (ctob/get-set-tree tokens-lib)
|
||||||
|
sets-tree' (ctob/get-set-tree tokens-lib')
|
||||||
|
group1' (get sets-tree' "group1")
|
||||||
|
token-set (get-in sets-tree ["group1" "token-set-2"])
|
||||||
|
token-set' (get-in sets-tree' ["group1" "token-set-2"])]
|
||||||
|
|
||||||
|
(t/is (= (ctob/set-count tokens-lib') 5))
|
||||||
|
(t/is (= (count group1') 3))
|
||||||
|
(t/is (= (d/index-of (keys group1') "token-set-2") 0))
|
||||||
|
(t/is (= (:name token-set') "group1/token-set-2"))
|
||||||
|
(t/is (= (:description token-set') "some description"))
|
||||||
|
(t/is (dt/is-after? (:modified-at token-set') (:modified-at token-set)))))
|
||||||
|
|
||||||
|
(t/deftest rename-set-in-groups
|
||||||
|
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "token-set-1"))
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "group1/token-set-2"))
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "group1/token-set-3"))
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "group1/subgroup11/token-set-4"))
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "group2/token-set-5")))
|
||||||
|
|
||||||
|
tokens-lib' (-> tokens-lib
|
||||||
|
(ctob/update-set "group1/token-set-2"
|
||||||
|
(fn [token-set]
|
||||||
|
(assoc token-set
|
||||||
|
:name "group1/updated-name"))))
|
||||||
|
|
||||||
|
sets-tree (ctob/get-set-tree tokens-lib)
|
||||||
|
sets-tree' (ctob/get-set-tree tokens-lib')
|
||||||
|
group1' (get sets-tree' "group1")
|
||||||
|
token-set (get-in sets-tree ["group1" "token-set-2"])
|
||||||
|
token-set' (get-in sets-tree' ["group1" "updated-name"])]
|
||||||
|
|
||||||
|
(t/is (= (ctob/set-count tokens-lib') 5))
|
||||||
|
(t/is (= (count group1') 3))
|
||||||
|
(t/is (= (d/index-of (keys group1') "updated-name") 0))
|
||||||
|
(t/is (= (:name token-set') "group1/updated-name"))
|
||||||
|
(t/is (= (:description token-set') nil))
|
||||||
|
(t/is (dt/is-after? (:modified-at token-set') (:modified-at token-set)))))
|
||||||
|
|
||||||
|
(t/deftest move-set-of-group
|
||||||
|
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "token-set-1"))
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "group1/token-set-2"))
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "group1/token-set-3"))
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "group1/subgroup11/token-set-4"))
|
||||||
|
#_(ctob/add-set (ctob/make-token-set :name "group2/token-set-5")))
|
||||||
|
|
||||||
|
tokens-lib' (-> tokens-lib
|
||||||
|
(ctob/update-set "group1/token-set-2"
|
||||||
|
(fn [token-set]
|
||||||
|
(assoc token-set
|
||||||
|
:name "group2/updated-name"))))
|
||||||
|
|
||||||
|
sets-tree (ctob/get-set-tree tokens-lib)
|
||||||
|
sets-tree' (ctob/get-set-tree tokens-lib')
|
||||||
|
group1' (get sets-tree' "group1")
|
||||||
|
group2' (get sets-tree' "group2")
|
||||||
|
token-set (get-in sets-tree ["group1" "token-set-2"])
|
||||||
|
token-set' (get-in sets-tree' ["group2" "updated-name"])]
|
||||||
|
|
||||||
|
(t/is (= (ctob/set-count tokens-lib') 4))
|
||||||
|
(t/is (= (count group1') 2))
|
||||||
|
(t/is (= (count group2') 1))
|
||||||
|
(t/is (= (d/index-of (keys group2') "updated-name") 0))
|
||||||
|
(t/is (= (:name token-set') "group2/updated-name"))
|
||||||
|
(t/is (= (:description token-set') nil))
|
||||||
|
(t/is (dt/is-after? (:modified-at token-set') (:modified-at token-set)))))
|
||||||
|
|
||||||
|
(t/deftest delete-set-in-group
|
||||||
|
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "token-set-1"))
|
||||||
|
(ctob/add-set (ctob/make-token-set :name "group1/token-set-2")))
|
||||||
|
|
||||||
|
tokens-lib' (-> tokens-lib
|
||||||
|
(ctob/delete-set "group1/token-set-2"))
|
||||||
|
|
||||||
|
sets-tree' (ctob/get-set-tree tokens-lib')
|
||||||
|
token-set' (get-in sets-tree' ["group1" "token-set-2"])]
|
||||||
|
|
||||||
|
(t/is (= (ctob/set-count tokens-lib') 1))
|
||||||
|
(t/is (= (count sets-tree') 1))
|
||||||
|
(t/is (nil? token-set')))))
|
||||||
|
|
||||||
|
(t/testing "grouped themes"
|
||||||
|
(t/deftest grouped-themes
|
||||||
|
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "token-theme-1"))
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "group1/token-theme-2"))
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "group1/token-theme-3"))
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "group1/subgroup11/token-theme-4"))
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "group2/token-theme-5")))
|
||||||
|
|
||||||
|
themes-list (ctob/get-themes tokens-lib)
|
||||||
|
|
||||||
|
themes-tree (ctob/get-theme-tree tokens-lib)
|
||||||
|
|
||||||
|
[node-theme1 node-group1 node-group2]
|
||||||
|
(ctob/get-children themes-tree)
|
||||||
|
|
||||||
|
[node-theme2 node-theme3 node-subgroup11]
|
||||||
|
(ctob/get-children (second node-group1))
|
||||||
|
|
||||||
|
[node-theme4]
|
||||||
|
(ctob/get-children (second node-subgroup11))
|
||||||
|
|
||||||
|
[node-theme5]
|
||||||
|
(ctob/get-children (second node-group2))]
|
||||||
|
|
||||||
|
(t/is (= (count themes-list) 5))
|
||||||
|
(t/is (= (:name (nth themes-list 0)) "token-theme-1"))
|
||||||
|
(t/is (= (:name (nth themes-list 1)) "group1/token-theme-2"))
|
||||||
|
(t/is (= (:name (nth themes-list 2)) "group1/token-theme-3"))
|
||||||
|
(t/is (= (:name (nth themes-list 3)) "group1/subgroup11/token-theme-4"))
|
||||||
|
(t/is (= (:name (nth themes-list 4)) "group2/token-theme-5"))
|
||||||
|
|
||||||
|
(t/is (= (first node-theme1) "token-theme-1"))
|
||||||
|
(t/is (= (ctob/group? (second node-theme1)) false))
|
||||||
|
(t/is (= (:name (second node-theme1)) "token-theme-1"))
|
||||||
|
|
||||||
|
(t/is (= (first node-group1) "group1"))
|
||||||
|
(t/is (= (ctob/group? (second node-group1)) true))
|
||||||
|
(t/is (= (count (second node-group1)) 3))
|
||||||
|
|
||||||
|
(t/is (= (first node-theme2) "token-theme-2"))
|
||||||
|
(t/is (= (ctob/group? (second node-theme2)) false))
|
||||||
|
(t/is (= (:name (second node-theme2)) "group1/token-theme-2"))
|
||||||
|
|
||||||
|
(t/is (= (first node-theme3) "token-theme-3"))
|
||||||
|
(t/is (= (ctob/group? (second node-theme3)) false))
|
||||||
|
(t/is (= (:name (second node-theme3)) "group1/token-theme-3"))
|
||||||
|
|
||||||
|
(t/is (= (first node-subgroup11) "subgroup11"))
|
||||||
|
(t/is (= (ctob/group? (second node-subgroup11)) true))
|
||||||
|
(t/is (= (count (second node-subgroup11)) 1))
|
||||||
|
|
||||||
|
(t/is (= (first node-theme4) "token-theme-4"))
|
||||||
|
(t/is (= (ctob/group? (second node-theme4)) false))
|
||||||
|
(t/is (= (:name (second node-theme4)) "group1/subgroup11/token-theme-4"))
|
||||||
|
|
||||||
|
(t/is (= (first node-theme5) "token-theme-5"))
|
||||||
|
(t/is (= (ctob/group? (second node-theme5)) false))
|
||||||
|
(t/is (= (:name (second node-theme5)) "group2/token-theme-5"))))
|
||||||
|
|
||||||
|
(t/deftest update-theme-in-groups
|
||||||
|
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "token-theme-1"))
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "group1/token-theme-2"))
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "group1/token-theme-3"))
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "group1/subgroup11/token-theme-4"))
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "group2/token-theme-5")))
|
||||||
|
|
||||||
|
tokens-lib' (-> tokens-lib
|
||||||
|
(ctob/update-theme "group1/token-theme-2"
|
||||||
|
(fn [token-theme]
|
||||||
|
(assoc token-theme :description "some description"))))
|
||||||
|
|
||||||
|
themes-tree (ctob/get-theme-tree tokens-lib)
|
||||||
|
themes-tree' (ctob/get-theme-tree tokens-lib')
|
||||||
|
group1' (get themes-tree' "group1")
|
||||||
|
token-theme (get-in themes-tree ["group1" "token-theme-2"])
|
||||||
|
token-theme' (get-in themes-tree' ["group1" "token-theme-2"])]
|
||||||
|
|
||||||
|
(t/is (= (ctob/theme-count tokens-lib') 5))
|
||||||
|
(t/is (= (count group1') 3))
|
||||||
|
(t/is (= (d/index-of (keys group1') "token-theme-2") 0))
|
||||||
|
(t/is (= (:name token-theme') "group1/token-theme-2"))
|
||||||
|
(t/is (= (:description token-theme') "some description"))
|
||||||
|
(t/is (dt/is-after? (:modified-at token-theme') (:modified-at token-theme)))))
|
||||||
|
|
||||||
|
(t/deftest rename-theme-in-groups
|
||||||
|
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "token-theme-1"))
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "group1/token-theme-2"))
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "group1/token-theme-3"))
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "group1/subgroup11/token-theme-4"))
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "group2/token-theme-5")))
|
||||||
|
|
||||||
|
tokens-lib' (-> tokens-lib
|
||||||
|
(ctob/update-theme "group1/token-theme-2"
|
||||||
|
(fn [token-theme]
|
||||||
|
(assoc token-theme
|
||||||
|
:name "group1/updated-name"))))
|
||||||
|
|
||||||
|
themes-tree (ctob/get-theme-tree tokens-lib)
|
||||||
|
themes-tree' (ctob/get-theme-tree tokens-lib')
|
||||||
|
group1' (get themes-tree' "group1")
|
||||||
|
token-theme (get-in themes-tree ["group1" "token-theme-2"])
|
||||||
|
token-theme' (get-in themes-tree' ["group1" "updated-name"])]
|
||||||
|
|
||||||
|
(t/is (= (ctob/theme-count tokens-lib') 5))
|
||||||
|
(t/is (= (count group1') 3))
|
||||||
|
(t/is (= (d/index-of (keys group1') "updated-name") 0))
|
||||||
|
(t/is (= (:name token-theme') "group1/updated-name"))
|
||||||
|
(t/is (= (:description token-theme') nil))
|
||||||
|
(t/is (dt/is-after? (:modified-at token-theme') (:modified-at token-theme)))))
|
||||||
|
|
||||||
|
(t/deftest move-theme-of-group
|
||||||
|
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "token-theme-1"))
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "group1/token-theme-2"))
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "group1/token-theme-3"))
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "group1/subgroup11/token-theme-4"))
|
||||||
|
#_(ctob/add-theme (ctob/make-token-theme :name "group2/token-theme-5")))
|
||||||
|
|
||||||
|
tokens-lib' (-> tokens-lib
|
||||||
|
(ctob/update-theme "group1/token-theme-2"
|
||||||
|
(fn [token-theme]
|
||||||
|
(assoc token-theme
|
||||||
|
:name "group2/updated-name"))))
|
||||||
|
|
||||||
|
themes-tree (ctob/get-theme-tree tokens-lib)
|
||||||
|
themes-tree' (ctob/get-theme-tree tokens-lib')
|
||||||
|
group1' (get themes-tree' "group1")
|
||||||
|
group2' (get themes-tree' "group2")
|
||||||
|
token-theme (get-in themes-tree ["group1" "token-theme-2"])
|
||||||
|
token-theme' (get-in themes-tree' ["group2" "updated-name"])]
|
||||||
|
|
||||||
|
(t/is (= (ctob/theme-count tokens-lib') 4))
|
||||||
|
(t/is (= (count group1') 2))
|
||||||
|
(t/is (= (count group2') 1))
|
||||||
|
(t/is (= (d/index-of (keys group2') "updated-name") 0))
|
||||||
|
(t/is (= (:name token-theme') "group2/updated-name"))
|
||||||
|
(t/is (= (:description token-theme') nil))
|
||||||
|
(t/is (dt/is-after? (:modified-at token-theme') (:modified-at token-theme)))))
|
||||||
|
|
||||||
|
(t/deftest delete-theme-in-group
|
||||||
|
(let [tokens-lib (-> (ctob/make-tokens-lib)
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "token-theme-1"))
|
||||||
|
(ctob/add-theme (ctob/make-token-theme :name "group1/token-theme-2")))
|
||||||
|
|
||||||
|
tokens-lib' (-> tokens-lib
|
||||||
|
(ctob/delete-theme "group1/token-theme-2"))
|
||||||
|
|
||||||
|
themes-tree' (ctob/get-theme-tree tokens-lib')
|
||||||
|
token-theme' (get-in themes-tree' ["group1" "token-theme-2"])]
|
||||||
|
|
||||||
|
(t/is (= (ctob/theme-count tokens-lib') 1))
|
||||||
|
(t/is (= (count themes-tree') 1))
|
||||||
|
(t/is (nil? token-theme'))))))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue