Skip to content

Commit 9619019

Browse files
[inspect] Introduce support for :view-mode config and inspect-toggle-view-mode op
1 parent 07cf028 commit 9619019

File tree

4 files changed

+89
-7
lines changed

4 files changed

+89
-7
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
* [#877](https://github.com/clojure-emacs/cider-nrepl/pull/877): `inspect-refresh` middleware is now capable of setting all config options that `orchard.inspect` supports.
88
* [#877](https://github.com/clojure-emacs/cider-nrepl/pull/877): Deprecate all `inspect-set-*` middleware ops.
9+
* [#879](https://github.com/clojure-emacs/cider-nrepl/pull/879): Add support for `:view-mode` inspector config and `inspect-toggle-view-mode` op.
910
* Bump `orchard` to [0.26.0](https://github.com/clojure-emacs/orchard/blob/master/CHANGELOG.md#0260-2024-06-30).
1011

1112
## 0.48.0 (2024-05-13)

src/cider/nrepl.clj

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,12 @@ if applicable, and re-render the updated value."
340340
:optional {"page-size" "New page size"
341341
"max-atom-length" "New max length of single rendered value"
342342
"max-coll-size" "New max size of rendered collection"
343-
"max-nested-depth" "New max nested depth of rendered collection"}
343+
"max-nested-depth" "New max nested depth of rendered collection"
344+
"view-mode" "Mode of viewing the value - either `:normal` or `:object`"}
345+
:returns inspector-returns}
346+
"inspect-toggle-view-mode"
347+
{:doc "Toggles the viewing mode of the inspector. This influences the way how inspector is rendering the current value. `:normal` is the default. When view mode is `:object`, any value will be rendered as a Java object (fields shown as is)."
348+
:requires {"session" "The current session"}
344349
:returns inspector-returns}
345350
"inspect-next-page"
346351
{:doc "Jumps to the next page in paginated collection view."

src/cider/nrepl/middleware/inspect.clj

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,20 @@
6262
(doseq [^Class interface (.getInterfaces clazz)]
6363
(info/info 'user (-> interface .getCanonicalName symbol)))))))
6464

65+
(defn- update-if-present [m k update-fn & args]
66+
(if (contains? m k)
67+
(apply update m k update-fn args)
68+
m))
69+
6570
(defn- msg->inspector-config [msg]
6671
(let [config (select-keys msg [:page-size :max-atom-length :max-coll-size
67-
:max-value-length :max-nested-depth :spacious])]
68-
(if (contains? config :spacious)
69-
(update config :spacious #(case %
70-
("false" "nil") false
71-
true))
72-
config)))
72+
:max-value-length :max-nested-depth :spacious
73+
:view-mode])]
74+
(-> config
75+
(update-if-present :spacious #(case %
76+
("false" "nil") false
77+
true))
78+
(update-if-present :view-mode keyword))))
7379

7480
(defn inspect-reply*
7581
[msg value]
@@ -141,6 +147,14 @@
141147
(let [overrides (msg->inspector-config msg)]
142148
(inspector-response msg (swap-inspector! msg #(inspect/refresh % overrides)))))
143149

150+
(defn- toggle-view-mode [{:keys [view-mode] :as inspector}]
151+
(let [toggle-order {:normal :object, :object :normal}
152+
next-view-mode (toggle-order view-mode :normal)]
153+
(inspect/refresh inspector {:view-mode next-view-mode})))
154+
155+
(defn toggle-view-mode-reply [msg]
156+
(inspector-response msg (swap-inspector! msg toggle-view-mode)))
157+
144158
(defn ^:deprecated set-page-size-reply [msg] (refresh-reply msg))
145159
(defn ^:deprecated set-max-atom-length-reply [msg] (refresh-reply msg))
146160
(defn ^:deprecated set-max-coll-size-reply [msg] (refresh-reply msg))
@@ -170,6 +184,7 @@
170184
"inspect-next-page" next-page-reply
171185
"inspect-prev-page" prev-page-reply
172186
"inspect-refresh" refresh-reply
187+
"inspect-toggle-view-mode" toggle-view-mode-reply
173188
"inspect-set-page-size" refresh-reply
174189
"inspect-set-max-atom-length" refresh-reply
175190
"inspect-set-max-coll-size" refresh-reply

test/clj/cider/nrepl/middleware/inspect_test.clj

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,9 @@
164164
(defn value [{:keys [value]}]
165165
(edn/read-string (first value)))
166166

167+
(defn value-skip-header [resp]
168+
(drop 7 (value resp)))
169+
167170
;; integration tests
168171

169172
(deftest nil-integration-test
@@ -676,6 +679,64 @@
676679
(is (string/includes? (extract-text tight)
677680
"\"[[[[[[[[[[1]]]]]]]]]]\""))))))
678681

682+
(def normal-mode-prefix
683+
["--- Contents:"
684+
[:newline]
685+
" " "0" ". " [:value "1" number?]
686+
[:newline]
687+
" " "1" ". " [:value "2" number?]
688+
[:newline]
689+
" " "2" ". " [:value "3" number?]])
690+
691+
(def object-mode-prefix
692+
["--- Instance fields:"
693+
[:newline]
694+
" " [:value "_count" number?] " = " [:value "3" number?]
695+
[:newline]
696+
" " [:value "_first" number?] " = " [:value "1" number?]
697+
[:newline]
698+
" " [:value "_hash" number?] " = " [:value "0" number?]
699+
[:newline]
700+
" " [:value "_hasheq" number?] " = " [:value "0" number?]
701+
[:newline]
702+
" " [:value "_meta" number?] " = " [:value "nil" number?]
703+
[:newline]
704+
" " [:value "_rest" number?] " = " [:value "( 2 3 )" number?]
705+
[:newline]])
706+
707+
(deftest object-view-mode-integration-test
708+
(testing "object view can be enabled to render the value as POJO"
709+
(is (match? (matchers/prefix object-mode-prefix)
710+
(value-skip-header (session/message {:op "eval"
711+
:inspect "true"
712+
:view-mode "object"
713+
:code "(list 1 2 3)"})))))
714+
715+
(testing "object view can be enabled with refresh op"
716+
(session/message {:op "inspect-clear"})
717+
(session/message {:op "eval"
718+
:inspect "true"
719+
:code "(list 1 2 3)"})
720+
(is (match? (matchers/prefix object-mode-prefix)
721+
(value-skip-header (session/message {:op "inspect-refresh"
722+
:view-mode "object"}))))
723+
724+
(testing "goes back to normal when :normal view-mode is passed"
725+
(is (match? (matchers/prefix normal-mode-prefix)
726+
(value-skip-header (session/message {:op "inspect-refresh"
727+
:view-mode "normal"}))))))
728+
729+
(testing "view-mode can be toggled with inspect-toggle-view-mode op"
730+
(session/message {:op "inspect-clear"})
731+
(is (match? (matchers/prefix normal-mode-prefix)
732+
(value-skip-header (session/message {:op "eval"
733+
:inspect "true"
734+
:code "(list 1 2 3)"}))))
735+
(is (match? (matchers/prefix object-mode-prefix)
736+
(value-skip-header (session/message {:op "inspect-toggle-view-mode"}))))
737+
(is (match? (matchers/prefix normal-mode-prefix)
738+
(value-skip-header (session/message {:op "inspect-toggle-view-mode"}))))))
739+
679740
(deftest print-length-independence-test
680741
(testing "*print-length* doesn't break rendering of long collections"
681742
(is (re-find #"showing page: \d+ of \d+"

0 commit comments

Comments
 (0)