From e34047c54dacd94fbef4e8d9c1d61b4f0686c0a9 Mon Sep 17 00:00:00 2001 From: Daniel Compton Date: Fri, 26 Jan 2018 20:31:05 +1300 Subject: [PATCH] Add setting to filter out trace views that aren't interesting --- CHANGELOG.md | 1 + src/day8/re_frame/trace/db.cljs | 5 ++ src/day8/re_frame/trace/events.cljs | 32 +++++++++++++ src/day8/re_frame/trace/metamorphic.cljc | 3 ++ src/day8/re_frame/trace/subs.cljs | 56 +++++++++++++++------- src/day8/re_frame/trace/view/settings.cljs | 48 ++++--------------- src/day8/re_frame/trace/view/traces.cljs | 3 +- 7 files changed, 91 insertions(+), 57 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48c5571..4fe0e7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. This change * Setting to control how many epochs are retained * Setting to reset all epochs * Setting to ignore epochs +* Setting to filter out trace for views from uninteresting namespaces ### Changed diff --git a/src/day8/re_frame/trace/db.cljs b/src/day8/re_frame/trace/db.cljs index 6ec77a2..4f30b92 100644 --- a/src/day8/re_frame/trace/db.cljs +++ b/src/day8/re_frame/trace/db.cljs @@ -12,6 +12,10 @@ external-window? (localstorage/get "external-window?" false) using-trace? (localstorage/get "using-trace?" true) ignored-events (localstorage/get "ignored-events" {}) + filtered-view-trace (localstorage/get "filtered-view-trace" (let [id1 (random-uuid) + id2 (random-uuid)] + {id1 {:id id1 :ns-str "re-com.box" :ns 're-com.box :sort 0} + id2 {:id id2 :ns-str "re-com.input-text" :ns 're-com.input-text :sort 1}})) num-epochs (localstorage/get "retained-epochs" 5) categories (localstorage/get "categories" #{:event :sub/run :sub/create :sub/dispose})] (when using-trace? @@ -20,6 +24,7 @@ (rf/dispatch [:settings/show-panel? show-panel?]) (rf/dispatch [:settings/selected-tab selected-tab]) (rf/dispatch [:settings/set-ignored-events ignored-events]) + (rf/dispatch [:settings/set-filtered-view-trace filtered-view-trace]) (rf/dispatch [:settings/set-number-of-retained-epochs num-epochs]) (when external-window? (rf/dispatch [:global/launch-external])) diff --git a/src/day8/re_frame/trace/events.cljs b/src/day8/re_frame/trace/events.cljs index f69f835..2fc9b65 100644 --- a/src/day8/re_frame/trace/events.cljs +++ b/src/day8/re_frame/trace/events.cljs @@ -194,6 +194,38 @@ (fn [_ [_ ignored-events]] ignored-events)) +(def filtered-view-trace-mw + [(rf/path [:settings :filtered-view-trace]) (rf/after #(localstorage/save! "filtered-view-trace" %))]) + +(rf/reg-event-db + :settings/add-filtered-view-trace + filtered-view-trace-mw + (fn [filtered-view-trace _] + (let [id (random-uuid)] + (assoc filtered-view-trace id {:id id :ns-str "" :ns nil :sort (js/Date.now)})))) + +(rf/reg-event-db + :settings/remove-filtered-view-trace + filtered-view-trace-mw + (fn [filtered-view-trace [_ id]] + (dissoc filtered-view-trace id))) + +(rf/reg-event-db + :settings/update-filtered-view-trace + filtered-view-trace-mw + (fn [filtered-view-trace [_ id ns-str]] + ;; TODO: this won't inform users if they type bad strings in. + (let [event (read-string-maybe ns-str)] + (-> filtered-view-trace + (assoc-in [id :ns-str] ns-str) + (update-in [id :ns] (fn [old-event] (if event event old-event))))))) + +(rf/reg-event-db + :settings/set-filtered-view-trace + filtered-view-trace-mw + (fn [_ [_ ignored-events]] + ignored-events)) + (rf/reg-event-db :settings/low-level-trace [(rf/path [:settings :low-level-trace])] diff --git a/src/day8/re_frame/trace/metamorphic.cljc b/src/day8/re_frame/trace/metamorphic.cljc index 0e7bb00..3c0722d 100644 --- a/src/day8/re_frame/trace/metamorphic.cljc +++ b/src/day8/re_frame/trace/metamorphic.cljc @@ -142,6 +142,9 @@ (defn subscription-not-run? [trace] false) +(defn render? [trace] + (= :render (:op-type trace))) + (defn unchanged-l2-subscription? [sub] ;; TODO: check if value changed (and diff --git a/src/day8/re_frame/trace/subs.cljs b/src/day8/re_frame/trace/subs.cljs index f1a97f5..7ae5375 100644 --- a/src/day8/re_frame/trace/subs.cljs +++ b/src/day8/re_frame/trace/subs.cljs @@ -1,7 +1,8 @@ (ns day8.re-frame.trace.subs (:require [mranderson047.re-frame.v0v10v2.re-frame.core :as rf] [day8.re-frame.trace.metamorphic :as metam] - [day8.re-frame.trace.utils.utils :as utils])) + [day8.re-frame.trace.utils.utils :as utils] + [clojure.string :as str])) (rf/reg-sub :settings/root @@ -46,6 +47,12 @@ (fn [settings] (sort-by :sort (vals (:ignored-events settings))))) +(rf/reg-sub + :settings/filtered-view-trace + :<- [:settings/root] + (fn [settings] + (sort-by :sort (vals (:filtered-view-trace settings))))) + (rf/reg-sub :settings/low-level-trace ;; TODO: filter from traces panel @@ -139,8 +146,23 @@ (count traces))) (rf/reg-sub - :traces/current-event-traces + :traces/all-visible-traces :<- [:traces/all-traces] + :<- [:settings/filtered-view-trace] + (fn [[all-traces filtered-views] _] + (let [munged-ns (->> filtered-views + (map (comp munge :ns-str)) + (set))] + (into [] + ;; Filter out view namespaces we don't care about. + (remove + (fn [trace] (and (metam/render? trace) + (contains? munged-ns (subs (:operation trace) 0 (str/last-index-of (:operation trace) ".")))))) + all-traces)))) + +(rf/reg-sub + :traces/current-event-traces + :<- [:traces/all-visible-traces] :<- [:epochs/beginning-trace-id] :<- [:epochs/ending-trace-id] (fn [[traces beginning ending] _] @@ -354,13 +376,13 @@ :<- [:subs/all-sub-traces] :<- [:app-db/reagent-id] (fn [[traces app-db-id]] - (let [raw (map (fn [trace] (let [pod-type (sub-op-type->type trace) - path-data (get-in trace [:tags :query-v]) + (let [raw (map (fn [trace] (let [pod-type (sub-op-type->type trace) + path-data (get-in trace [:tags :query-v]) ;; TODO: detect layer 2/3 for sub/create and sub/destroy ;; This information needs to be accumulated. - layer (if (some #(= app-db-id %) (get-in trace [:tags :input-signals])) - 2 - 3)] + layer (if (some #(= app-db-id %) (get-in trace [:tags :input-signals])) + 2 + 3)] {:id (str pod-type (get-in trace [:tags :reaction])) :type pod-type :layer layer @@ -379,17 +401,17 @@ (filter #(= :created (:type %))) (map (juxt :path-data identity)) (into {})) - raw (keep (fn [sub] - (case (:type sub) - :created (if-some [re-run-sub (get re-run (:path-data sub))] - (assoc sub :value (:value re-run-sub)) - sub) + raw (keep (fn [sub] + (case (:type sub) + :created (if-some [re-run-sub (get re-run (:path-data sub))] + (assoc sub :value (:value re-run-sub)) + sub) - :re-run (when-not (contains? created (:path-data sub)) - sub) + :re-run (when-not (contains? created (:path-data sub)) + sub) - sub)) - raw) + sub)) + raw) ;; Filter out run if it was created ;; Group together run time @@ -397,7 +419,7 @@ (filter (fn [[k v]] (< 1 v))) (frequencies (map :id raw))) - output (map (fn [sub] (assoc sub :run-times (get run-multiple? (:id sub)))) raw)] + output (map (fn [sub] (assoc sub :run-times (get run-multiple? (:id sub)))) raw)] (sort-by identity subscription-comparator output)))) (rf/reg-sub diff --git a/src/day8/re_frame/trace/view/settings.cljs b/src/day8/re_frame/trace/view/settings.cljs index 89265f6..51ac35b 100644 --- a/src/day8/re_frame/trace/view/settings.cljs +++ b/src/day8/re_frame/trace/view/settings.cljs @@ -15,34 +15,6 @@ (def settings-box-81 (render-css (units/px- common/gs-81 (units/px* 2 settings-box-vertical-padding)))) (def settings-box-131 (render-css (units/px- common/gs-131 (units/px* 2 settings-box-vertical-padding)))) -;; TODO: START ========== LOCAL DATA - REPLACE WITH SUBS AND EVENTS - -(def *ignore-items (r/atom [{:id (gensym) :text ":some/event-id"}])) - -(def *filter-items (r/atom [{:id (gensym) :text "re-com.h-box"} - {:id (gensym) :text "re-com.input-text"}])) - -(defn add-item [*items] - (let [id (gensym)] - (println "Added item" id) - (swap! *items concat [{:id id :text ""}]))) - -(defn delete-item [*items id] - (println "Deleted item" id) - (reset! *items (filterv #(not= id (:id %)) @*items))) - -(defn update-item-field - [*items id field new-val] - (let [f (fn [item] - (if (= id (:id item)) - (do - (println "Updated" field "in" (:id item) "from" (get item field) "to" new-val) - (assoc item field new-val)) - item))] - (reset! *items (mapv f @*items)))) - -;; TODO: END ========== LOCAL DATA - REPLACE WITH SUBS AND EVENTS - (def settings-styles [:#--re-frame-trace-- [:.settings @@ -149,9 +121,8 @@ [:p "Useful if you want to ignore a periodic background polling event."]] settings-box-131] - ;; TODO: filter out view trace - #_[rc/line] - #_[settings-box + [rc/line] + [settings-box [[rc/h-box :align :center :gap horizontal-gap @@ -162,18 +133,19 @@ :label [rc/v-box :align :center :children ["+ namespace"]] - :on-click #(add-item *filter-items)]]] + :on-click #(rf/dispatch [:settings/add-filtered-view-trace])]]] [rc/v-box :width comp-section-width :gap vertical-gap - :children (for [item @*filter-items] - ^{:key (:id item)} + :children (for [item @(rf/subscribe [:settings/filtered-view-trace]) + :let [id (:id item)]] + ^{:key id} [closeable-text-box - :model (:text item) + :model (:ns-str item) :width "343px" - :on-close #(delete-item *filter-items (:id item)) - :on-change #(update-item-field *filter-items (:id item) :text %)])]] - [[:p "Sometimes you want to focus on just your own views, and the trace associated with library views is just noise."] + :on-close #(rf/dispatch [:settings/remove-filtered-view-trace id]) + :on-change #(rf/dispatch [:settings/update-filtered-view-trace id %])])]] + [[:p "Sometimes you want to focus on your own views, and the trace associated with library views is just noise."] [:p "Nominate one or more namespaces."]] settings-box-131] diff --git a/src/day8/re_frame/trace/view/traces.cljs b/src/day8/re_frame/trace/view/traces.cljs index 854970d..a24546e 100644 --- a/src/day8/re_frame/trace/view/traces.cljs +++ b/src/day8/re_frame/trace/view/traces.cljs @@ -89,6 +89,7 @@ trace-detail-expansions (rf/subscribe [:traces/expansions]) beginning (rf/subscribe [:epochs/beginning-trace-id]) end (rf/subscribe [:epochs/ending-trace-id]) + traces (rf/subscribe [:traces/all-traces]) current-traces (rf/subscribe [:traces/current-event-traces]) show-epoch-traces? (rf/subscribe [:traces/show-epoch-traces?])] (fn [] @@ -173,5 +174,3 @@ [:span "(" [:button.text-button {:on-click #(rf/dispatch [:epochs/reset])} "clear"] ")"])] [:th {:style {:text-align "right"}} "meta"]] [:tbody (render-traces visible-traces filter-items filter-input trace-detail-expansions)]]]])))) - -