From ee67a746d437b417c39da5c5c04b51e8993d41a3 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 30 Jun 2024 17:55:23 +0300 Subject: [PATCH 1/4] reduce-kv --- modules/reitit-core/src/reitit/impl.cljc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index 70e36119..e7374548 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -23,8 +23,8 @@ (defn -path-vals [m path-map] (letfn [(-path-vals [l p m] - (reduce - (fn [l [k v]] + (reduce-kv + (fn [l k v] (let [p' (conj p k) f (-match p' path-map)] (cond From 49e8d887da0059c2617102511cc2ee0dac5eeca3 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 30 Jun 2024 17:55:47 +0300 Subject: [PATCH 2/4] fixes #679 --- modules/reitit-core/src/reitit/impl.cljc | 18 +++++++++++++++++- test/cljc/reitit/core_test.cljc | 8 ++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index e7374548..a7e318c7 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -34,12 +34,28 @@ l m))] (-path-vals [] [] m))) +(defn -copy-meta [to from] + (letfn [(-with-meta [x m] + (try (with-meta x m) (catch #?(:clj Exception, :cljs js/Error) _))) + (-copy [l p m] + (reduce-kv + (fn [l k v] + (let [p' (conj p k) + m' (meta (get-in from p'))] + (cond + (and m' (not (var? v))) (update-in l p' -with-meta m') + (and (map? v) (not (record? v)) (seq v)) (-copy l p' v) + :else l))) + l m))] + (-copy to [] to))) + (defn -assoc-in-path-vals [c] (reduce (partial apply assoc-in) {} c)) (defn path-update [m path-map] (-> (-path-vals m path-map) - (-assoc-in-path-vals))) + (-assoc-in-path-vals) + (-copy-meta m))) (defn accumulator? [x] (-> x meta ::accumulator)) diff --git a/test/cljc/reitit/core_test.cljc b/test/cljc/reitit/core_test.cljc index 8c9b31c5..d60f2f41 100644 --- a/test/cljc/reitit/core_test.cljc +++ b/test/cljc/reitit/core_test.cljc @@ -442,3 +442,11 @@ (deftest routing-bug-test-538 (let [router (r/router [["/:a"] ["/:b"]] {:conflicts nil})] (is (nil? (r/match-by-path router ""))))) + +(deftest metadata-regression-679 + (is (= ["/context/leaf" {:roles {:foo true}}] + (-> ["/context" {:roles {:foo false :bar true}} + ["/leaf" {:roles ^:replace {:foo true}}]] + (r/router) + (r/routes) + (first))))) From aec024a943f5b1b56dcfd4bdf0bdd230e20b5a89 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 30 Jun 2024 18:29:52 +0300 Subject: [PATCH 3/4] fix --- modules/reitit-core/src/reitit/impl.cljc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index a7e318c7..243ef4f0 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -36,14 +36,16 @@ (defn -copy-meta [to from] (letfn [(-with-meta [x m] - (try (with-meta x m) (catch #?(:clj Exception, :cljs js/Error) _))) + (try (with-meta x m) + (catch #?(:clj Exception, :cljs js/Error) _ x))) (-copy [l p m] (reduce-kv (fn [l k v] (let [p' (conj p k) - m' (meta (get-in from p'))] + m' (when (empty? (meta v)) + (meta (get-in from p')))] (cond - (and m' (not (var? v))) (update-in l p' -with-meta m') + m' (update-in l p' -with-meta m') (and (map? v) (not (record? v)) (seq v)) (-copy l p' v) :else l))) l m))] From e8c3035254119cd5ae19178451e96753ef484600 Mon Sep 17 00:00:00 2001 From: Tommi Reiman Date: Sun, 30 Jun 2024 18:31:14 +0300 Subject: [PATCH 4/4] . --- modules/reitit-core/src/reitit/impl.cljc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/reitit-core/src/reitit/impl.cljc b/modules/reitit-core/src/reitit/impl.cljc index 243ef4f0..164cbb82 100644 --- a/modules/reitit-core/src/reitit/impl.cljc +++ b/modules/reitit-core/src/reitit/impl.cljc @@ -36,14 +36,12 @@ (defn -copy-meta [to from] (letfn [(-with-meta [x m] - (try (with-meta x m) - (catch #?(:clj Exception, :cljs js/Error) _ x))) + (try (with-meta x m) (catch #?(:clj Exception, :cljs js/Error) _ x))) (-copy [l p m] (reduce-kv (fn [l k v] (let [p' (conj p k) - m' (when (empty? (meta v)) - (meta (get-in from p')))] + m' (when (empty? (meta v)) (meta (get-in from p')))] (cond m' (update-in l p' -with-meta m') (and (map? v) (not (record? v)) (seq v)) (-copy l p' v)