Skip to content

Commit bf6a4cd

Browse files
committed
[Inspector] Configure truncation limits
The limits after which the inspector truncates collection members are now configurable. Previously they were hardcoded to 5 and 150 for collection and atom (non-collection) members.
1 parent a233ee6 commit bf6a4cd

File tree

3 files changed

+80
-21
lines changed

3 files changed

+80
-21
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
## master (unreleased)
44

5+
### New features
6+
7+
* [#111](https://github.com/clojure-emacs/orchard/pull/111): [Inspector] Configure truncation limits
8+
9+
### Changes
10+
511
* The _class info cache_ is now initialized silently by default. This results in less confusing output.
612
* You can now `@orchard.java/cache-initializer` for deterministically waiting for this cache workload to complete.
713
* You can control its verbosity by setting `"-Dorchard.initialize-cache.silent=false"` (or `[...]=true`).

src/orchard/inspect.clj

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,18 @@
129129
:page-size new-page-size
130130
:current-page 0)))
131131

132+
(defn set-max-atom-length
133+
"Set the maximum length of atomic collection members before they're truncated."
134+
[inspector max-atom-length]
135+
{:pre [(integer? max-atom-length)]}
136+
(inspect-render (assoc inspector :max-atom-length max-atom-length)))
137+
138+
(defn set-max-coll-size
139+
"Set the maximum number of nested collection members to print before truncating."
140+
[inspector max-coll-size]
141+
{:pre [(integer? max-coll-size)]}
142+
(inspect-render (assoc inspector :max-coll-size max-coll-size)))
143+
132144
(defn eval-and-inspect
133145
"Evaluate the given expression where `v` is bound to the currently inspected
134146
value. Open the evaluation result in the inspector."
@@ -167,16 +179,22 @@
167179
(s/join sep)
168180
(format fmt))))
169181

170-
(defn- short? [coll]
171-
(<= (count coll) 5))
182+
(def ^:private ^:dynamic *max-atom-length* 150)
183+
(def ^:private ^:dynamic *max-coll-size* 5)
172184

173-
(def ^:private truncate-max-length 150)
185+
(defn- short? [coll]
186+
;; Prefer `bounded-count` if available (clojure 1.9+) or fall back to `count`.
187+
(let [len (if-let [bounded-count (some-> (resolve 'clojure.core/bounded-count)
188+
(var-get))]
189+
(bounded-count (inc *max-coll-size*) coll)
190+
(count coll))]
191+
(<= len *max-coll-size*)))
174192

175193
(defn- truncate-string [s]
176194
(when s
177195
(let [len (count s)]
178-
(if (> len truncate-max-length)
179-
(str (subs s 0 (- truncate-max-length 2)) "...")
196+
(if (> len *max-atom-length*)
197+
(str (subs s 0 (max (- *max-atom-length* 3) 0)) "...")
180198
s))))
181199

182200
(defn value-types [value]
@@ -228,33 +246,34 @@
228246
(safe-pr-seq value "[ %s ]"))
229247

230248
(defmethod inspect-value :vector-long [value]
231-
(safe-pr-seq (take 5 value) "[ %s ... ]"))
249+
(safe-pr-seq (take *max-coll-size* value) "[ %s ... ]"))
232250

233251
(defmethod inspect-value :lazy-seq [value]
234-
(let [first-six (take 6 value)]
235-
(if (= (count first-six) 6)
236-
(safe-pr-seq (take 5 value) "( %s ... )")
237-
(safe-pr-seq first-six "( %s )"))))
252+
(let [prefix-length (inc *max-coll-size*)
253+
prefix (take prefix-length value)]
254+
(if (= (count prefix) prefix-length)
255+
(safe-pr-seq (take *max-coll-size* value) "( %s ... )")
256+
(safe-pr-seq prefix "( %s )"))))
238257

239258
(defmethod inspect-value :list [value]
240259
(safe-pr-seq value "( %s )"))
241260

242261
(defmethod inspect-value :list-long [value]
243-
(safe-pr-seq (take 5 value) "( %s ... )"))
262+
(safe-pr-seq (take *max-coll-size* value) "( %s ... )"))
244263

245264
(defmethod inspect-value :set [value]
246265
(safe-pr-seq value "#{ %s }"))
247266

248267
(defmethod inspect-value :set-long [value]
249-
(safe-pr-seq (take 5 value) "#{ %s ... }"))
268+
(safe-pr-seq (take *max-coll-size* value) "#{ %s ... }"))
250269

251270
(defmethod inspect-value :array [value]
252271
(let [ct (.getName (or (.getComponentType (class value)) Object))]
253272
(safe-pr-seq value ", " (str ct "[] { %s }"))))
254273

255274
(defmethod inspect-value :array-long [value]
256275
(let [ct (.getName (or (.getComponentType (class value)) Object))]
257-
(safe-pr-seq (take 5 value) ", " (str ct "[] { %s ... }"))))
276+
(safe-pr-seq (take *max-coll-size* value) ", " (str ct "[] { %s ... }"))))
258277
(defmethod inspect-value java.lang.Class [value]
259278
(pr-str value))
260279

@@ -531,12 +550,15 @@
531550

532551
(defn inspect-render
533552
([inspector] (inspect-render inspector (:value inspector)))
534-
([inspector value] (-> (reset-index inspector)
535-
(assoc :rendered [])
536-
(assoc :value value)
537-
(render-reference)
538-
(inspect value)
539-
(render-path))))
553+
([inspector value]
554+
(binding [*max-atom-length* (or (:max-atom-length inspector) *max-atom-length*)
555+
*max-coll-size* (or (:max-coll-size inspector) *max-coll-size*)]
556+
(-> (reset-index inspector)
557+
(assoc :rendered [])
558+
(assoc :value value)
559+
(render-reference)
560+
(inspect value)
561+
(render-path)))))
540562

541563
;; Get a human readable printout of rendered sequence
542564
(defmulti inspect-print-component first)

test/orchard/inspect_test.clj

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
(def inspect-result-with-nil ["(\"Class\" \": \" (:value \"clojure.lang.PersistentVector\" 0) (:newline) \"Contents: \" (:newline) \" \" \"0\" \". \" (:value \"1\" 1) (:newline) \" \" \"1\" \". \" (:value \"2\" 2) (:newline) \" \" \"2\" \". \" (:value \"nil\" 3) (:newline) \" \" \"3\" \". \" (:value \"3\" 4) (:newline))"])
1919

20+
(def inspect-result-configure-length ["(\"Class\" \": \" (:value \"clojure.lang.PersistentVector\" 0) (:newline) \"Contents: \" (:newline) \" \" \"0\" \". \" (:value \"[ 1... 2222 333 ... ]\" 1) (:newline))"])
21+
2022
(def eval-and-inspect-result ["(\"Class\" \": \" (:value \"java.lang.String\" 0) (:newline) \"Value: \" \"\\\"1001\\\"\")"])
2123

2224
(def java-hashmap-inspect-result ["(\"Class\" \": \" (:value \"java.util.HashMap\" 0) (:newline) \"Contents: \" (:newline) \" \" (:value \":b\" 1) \" = \" (:value \"2\" 2) (:newline) \" \" (:value \":c\" 3) \" = \" (:value \"3\" 4) (:newline) \" \" (:value \":a\" 5) \" = \" (:value \"1\" 6) (:newline))"])
@@ -27,7 +29,7 @@
2729
(def long-vector (vec (range 70)))
2830
(def long-map (zipmap (range 70) (range 70)))
2931
(def long-nested-coll (vec (map #(range (* % 10) (+ (* % 10) 80)) (range 200))))
30-
(def truncated-string (str "\"" (apply str (repeat 147 "a")) "..."))
32+
(def truncated-string (str "\"" (apply str (repeat 146 "a")) "..."))
3133

3234
(defn inspect
3335
[value]
@@ -264,13 +266,42 @@
264266
"{ :a 1, :b 2 }" (java.util.HashMap. {:a 1 :b 2})
265267
"long[] { 1, 2, 3, 4 }" (long-array [1 2 3 4])
266268
"java.lang.Long[] { 0, 1, 2, 3, 4 ... }" (into-array Long (range 10))
267-
"#<MyTestType test1>" (MyTestType. "test1"))))
269+
"#<MyTestType test1>" (MyTestType. "test1")))
270+
271+
(testing "inspect-value adjust length and size"
272+
(binding [inspect/*max-atom-length* 6
273+
inspect/*max-coll-size* 2]
274+
(are [result form] (= result (inspect/inspect-value form))
275+
"1" 1
276+
"nil" nil
277+
"\"2\"" "2"
278+
":ab..." :abc/def
279+
"( :a :b )" '(:a :b)
280+
"[ 1 2 ... ]" [1 2 3]
281+
"{ :a 1, :b 2 }" {:a 1 :b 2}
282+
"( 1 1 ... )" (repeat 1)
283+
"[ ( 1 1 ... ) ]" [(repeat 1)]
284+
"{ :a { ( 0 1 ... ) \"ab..., ... } }" {:a {(range 10) "abcdefg", 2 3, 4 5, 6 7, 8 9, 10 11}}
285+
"java.lang.Long[] { 0, 1 ... }" (into-array Long (range 10))))
286+
(binding [inspect/*max-coll-size* 6]
287+
(are [result form] (= result (inspect/inspect-value form))
288+
"[ ( 1 1 1 1 1 1 ... ) ]" [(repeat 1)]
289+
"{ :a { ( 0 1 2 3 4 5 ... ) 1, 2 3, 4 5, 6 7, 8 9, 10 11 } }" {:a {(range 10) 1, 2 3, 4 5, 6 7, 8 9, 10 11}}))))
268290

269291
(deftest inspect-coll-test
270292
(testing "inspect :coll prints contents of the coll"
271293
(is (= inspect-result-with-nil
272294
(render (inspect/start (inspect/fresh) [1 2 nil 3]))))))
273295

296+
(deftest inspect-configure-length-test
297+
(testing "inspect respects :max-atom-length and :max-coll-size configuration"
298+
(is (= inspect-result-configure-length
299+
(render (-> (inspect/fresh)
300+
(assoc :max-atom-length 4
301+
:max-coll-size 3)
302+
(inspect/start [[111111 2222 333 44 5]])))))))
303+
304+
274305
(deftest inspect-java-hashmap-test
275306
(testing "inspecting java.util.Map descendendants prints a key-value coll"
276307
(is (= java-hashmap-inspect-result

0 commit comments

Comments
 (0)