Skip to content

Commit f763175

Browse files
pdbrownbbatsov
authored andcommitted
[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 399129d commit f763175

File tree

3 files changed

+81
-21
lines changed

3 files changed

+81
-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: 43 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,24 @@
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 [;; NOTE can't name this `bounded-count` because eastwood's
188+
;; :local-shadows-var warning can't be suppressed.
189+
bounded-count-fn (some-> (resolve 'clojure.core/bounded-count)
190+
(var-get))]
191+
(bounded-count-fn (inc *max-coll-size*) coll)
192+
(count coll))]
193+
(<= len *max-coll-size*)))
174194

175195
(defn- truncate-string [s]
176196
(when s
177197
(let [len (count s)]
178-
(if (> len truncate-max-length)
179-
(str (subs s 0 (- truncate-max-length 2)) "...")
198+
(if (> len *max-atom-length*)
199+
(str (subs s 0 (max (- *max-atom-length* 3) 0)) "...")
180200
s))))
181201

182202
(defn value-types [value]
@@ -228,33 +248,34 @@
228248
(safe-pr-seq value "[ %s ]"))
229249

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

233253
(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 )"))))
254+
(let [prefix-length (inc *max-coll-size*)
255+
prefix (take prefix-length value)]
256+
(if (= (count prefix) prefix-length)
257+
(safe-pr-seq (take *max-coll-size* value) "( %s ... )")
258+
(safe-pr-seq prefix "( %s )"))))
238259

239260
(defmethod inspect-value :list [value]
240261
(safe-pr-seq value "( %s )"))
241262

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

245266
(defmethod inspect-value :set [value]
246267
(safe-pr-seq value "#{ %s }"))
247268

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

251272
(defmethod inspect-value :array [value]
252273
(let [ct (.getName (or (.getComponentType (class value)) Object))]
253274
(safe-pr-seq value ", " (str ct "[] { %s }"))))
254275

255276
(defmethod inspect-value :array-long [value]
256277
(let [ct (.getName (or (.getComponentType (class value)) Object))]
257-
(safe-pr-seq (take 5 value) ", " (str ct "[] { %s ... }"))))
278+
(safe-pr-seq (take *max-coll-size* value) ", " (str ct "[] { %s ... }"))))
258279
(defmethod inspect-value java.lang.Class [value]
259280
(pr-str value))
260281

@@ -523,12 +544,15 @@
523544

524545
(defn inspect-render
525546
([inspector] (inspect-render inspector (:value inspector)))
526-
([inspector value] (-> (reset-index inspector)
527-
(assoc :rendered [])
528-
(assoc :value value)
529-
(render-reference)
530-
(inspect value)
531-
(render-path))))
547+
([inspector value]
548+
(binding [*max-atom-length* (or (:max-atom-length inspector) *max-atom-length*)
549+
*max-coll-size* (or (:max-coll-size inspector) *max-coll-size*)]
550+
(-> (reset-index inspector)
551+
(assoc :rendered [])
552+
(assoc :value value)
553+
(render-reference)
554+
(inspect value)
555+
(render-path)))))
532556

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

test/orchard/inspect_test.clj

Lines changed: 32 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,41 @@
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+
274304
(deftest inspect-java-hashmap-test
275305
(testing "inspecting java.util.Map descendendants prints a key-value coll"
276306
(is (= java-hashmap-inspect-result

0 commit comments

Comments
 (0)