Skip to content

Commit 94fa994

Browse files
Add support for :orchard/display-as-map meta flag
1 parent 72bbcb7 commit 94fa994

File tree

5 files changed

+51
-38
lines changed

5 files changed

+51
-38
lines changed

src/orchard/inspect.clj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,9 @@
7070
(string? obj) :string
7171
(set? obj) :set
7272
(instance? Map obj) :map
73-
(instance? List obj) :list
73+
(instance? List obj) (if (:orchard/display-as-map (meta obj))
74+
:map
75+
:list)
7476
(var? obj) :var
7577
(instance? Class obj) :class
7678
(instance? clojure.lang.Namespace obj) :namespace

src/orchard/inspect/analytics.clj

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
(into {})))
1818

1919
(defn- *frequencies [coll]
20-
(->> coll
21-
(eduction (take *size-cutoff*))
22-
frequencies
23-
(sort-by second >)
24-
(apply concat)
25-
(apply array-map)))
20+
(with-meta
21+
(->> coll
22+
(eduction (take *size-cutoff*))
23+
frequencies
24+
(sort-by second >))
25+
{:orchard/display-as-map true}))
2626

2727
(definline ^:private inc-if [val condition]
2828
`(cond-> ~val ~condition inc))

src/orchard/pp.clj

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,15 +332,19 @@
332332

333333
clojure.lang.ISeq
334334
(-pprint [this writer opts]
335-
(-pprint-seq this writer opts))
335+
(if (:orchard/display-as-map (meta this))
336+
(-pprint-map this writer opts)
337+
(-pprint-seq this writer opts)))
336338

337339
clojure.lang.IPersistentMap
338340
(-pprint [this writer opts]
339341
(-pprint-map this writer opts))
340342

341343
clojure.lang.IPersistentVector
342344
(-pprint [this writer opts]
343-
(-pprint-coll this writer opts))
345+
(if (:orchard/display-as-map (meta this))
346+
(-pprint-map this writer opts)
347+
(-pprint-coll this writer opts)))
344348

345349
clojure.lang.IPersistentSet
346350
(-pprint [this writer opts]

src/orchard/print.clj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@
1919
TruncatingStringWriter$TotalLimitExceeded))
2020
(:require [clojure.string :as str]))
2121

22+
(defn- display-as-map?
23+
"Special case for printing: when `:orchard/display-as-map` is present on a
24+
sequence, assume it is a sequence of MapEntry objects and display it as a
25+
map."
26+
[x]
27+
(and (instance? List x) (:orchard/display-as-map (meta x))))
28+
2229
(defmulti print
2330
(fn [x _]
2431
(cond
@@ -32,6 +39,7 @@
3239
(instance? Symbol x) :scalar
3340
(instance? IRecord x) :record
3441
(instance? Map x) :map
42+
(display-as-map? x) :persistent-map
3543
(instance? IPersistentVector x) :vector
3644
(instance? List x) :list
3745
(instance? IPersistentSet x) :set

test/orchard/inspect/analytics_test.clj

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,48 +9,47 @@
99

1010
(deftest numbers-test
1111
(is+ {:count 1000
12-
:types {java.lang.Long 1000}
13-
:frequencies map?
12+
:types [[java.lang.Long 1000]]
13+
:frequencies seq?
1414
:numbers {:n 1000, :zeros 1, :max 999, :min 0, :mean 499.5}}
1515
(analytics (range 1000)))
1616

1717
(is+ {:count 100
18-
:types {java.lang.Integer 50, java.lang.Long 50}
19-
:frequencies {0 50, 1 50}
18+
:types [[java.lang.Integer 50] [java.lang.Long 50]]
19+
:frequencies [[0 50] [1 50]]
2020
:numbers {:n 100, :zeros 50, :max 1, :min 0, :mean 0.5}}
2121
(analytics (concat (map int (repeat 50 0)) (repeat 50 1))))
2222

2323
(is+ {:count 6
24-
:types {java.lang.Long 3, nil 3}
25-
:frequencies {nil 3, 0 1, 1 1, 2 1}
24+
:types [[java.lang.Long 3] [nil 3]]
25+
:frequencies [[nil 3] [0 1] [1 1] [2 1]]
2626
:numbers {:n 3, :zeros 1, :max 2, :min 0, :mean 1.0}}
2727
(analytics [0 nil 1 nil 2 nil])))
2828

2929
(deftest strings-test
3030
(is+ {:count 100
31-
:types {java.lang.String 100}
32-
:frequencies map?
31+
:types [[java.lang.String 100]]
32+
:frequencies seq?
3333
:strings {:n 100, :blank 0, :ascii 100, :max-len 2, :min-len 1, :avg-len (approx 1.9)}}
3434
(analytics (map str (range 100))))
3535

3636
(is+ {:count 6,
37-
:types {java.lang.String 5, nil 1}
38-
:frequencies map?
37+
:types [[java.lang.String 5] [nil 1]]
38+
:frequencies seq?
3939
:strings {:n 5, :blank 3, :ascii 4, :max-len 6, :min-len 0, :avg-len (approx 2.8)}}
4040
(analytics [nil "" " " " " "hello" "привіт"])))
4141

4242
(deftest colls-stats
4343
(is+ {:count 20
44-
:types {clojure.lang.LongRange 19, clojure.lang.PersistentList$EmptyList 1}
45-
:frequencies map?
44+
:types [[clojure.lang.LongRange 19] [clojure.lang.PersistentList$EmptyList 1]]
45+
:frequencies seq?
4646
:collections {:n 20, :empty 1, :max-size 19, :min-size 0, :avg-size 9.5}}
4747
(analytics (map range (range 20)))))
4848

4949
(deftest heterogeneous-list-stats
5050
(is+ {:count 90,
51-
:types {java.lang.Long 20, java.lang.Integer 20, java.lang.String 20, clojure.lang.PersistentVector 20, nil 10}
52-
:frequencies {nil 10, [42] 10, [] 10 ;; and others
53-
}
51+
:types (mc/via #(into {} %) {java.lang.Long 20, java.lang.Integer 20, java.lang.String 20, clojure.lang.PersistentVector 20, nil 10})
52+
:frequencies (mc/via #(into {} %) {nil 10, [42] 10, [] 10}) ;; and others
5453
:numbers {:n 40, :zeros 2, :max 19, :min 0, :mean 9.5}
5554
:strings {:n 20, :blank 0, :ascii 20, :max-len 2, :min-len 1, :avg-len 1.5}
5655
:collections {:n 20, :empty 10, :max-size 1, :min-size 0, :avg-size 0.5}}
@@ -63,22 +62,22 @@
6362

6463
(deftest keyvals-test
6564
(is+ {:count 100
66-
:keys {:types {java.lang.Long 100}
67-
:frequencies map?
65+
:keys {:types [[java.lang.Long 100]]
66+
:frequencies seq?
6867
:numbers {:n 100, :zeros 1, :max 99, :min 0, :mean 49.5}}
69-
:values {:types {java.lang.String 100}
70-
:frequencies map?
68+
:values {:types [[java.lang.String 100]]
69+
:frequencies seq?
7170
:strings {:n 100, :blank 0, :ascii 100, :max-len 2, :min-len 1, :avg-len (approx 1.9)}}}
7271
(analytics (zipmap (range 100) (map str (range 100))))))
7372

7473
(deftest list-of-tuples-test
7574
(is+ {:count 100
76-
:tuples [{:types {java.lang.Long 100}
75+
:tuples [{:types [[java.lang.Long 100]]
7776
:numbers {:n 100, :zeros 1, :max 99, :min 0, :mean 49.5}}
78-
{:types {java.lang.String 100}
77+
{:types [[java.lang.String 100]]
7978
:strings {:n 100, :blank 0, :ascii 100, :max-len 2, :min-len 1, :avg-len (approx 1.9)}}
80-
{:types {nil 50, java.lang.Long 50}
81-
:frequencies {nil 50, 42 50}
79+
{:types [[nil 50] [java.lang.Long 50]]
80+
:frequencies [[nil 50] [42 50]]
8281
:numbers {:n 50, :zeros 0, :max 42, :min 42, :mean 42.0}}]}
8382
(analytics (map #(cond-> [% (str %)]
8483
(odd? %) (conj 42))
@@ -87,11 +86,11 @@
8786
(deftest list-of-records-test
8887
(testing "analytics on a list of records analyzes values for each unique key individually"
8988
(is+ {:count 100
90-
:by-key {:s {:types {java.lang.String 100}
91-
:frequencies map?
89+
:by-key {:s {:types [[java.lang.String 100]]
90+
:frequencies seq?
9291
:strings {:n 100, :blank 0, :ascii 50, :max-len 7, :min-len 5, :avg-len (approx 6.4)}}
93-
:kw {:types {nil 66, clojure.lang.Keyword 34}, :frequencies {nil 66, :occasional 34}}
94-
:i {:types {java.lang.Long 100}
92+
:kw {:types [[nil 66] [clojure.lang.Keyword 34]], :frequencies [[nil 66] [:occasional 34]]}
93+
:i {:types [[java.lang.Long 100]]
9594
:numbers {:n 100, :zeros 1, :max 99, :min 0, :mean 49.5}}}}
9695
(analytics (map #(cond-> {:i %
9796
:s (str "test" % (when (even? %) "ї"))}
@@ -122,7 +121,7 @@
122121
(analytics (repeat 100 [1 "test"]))))
123122
(is+ {:cutoff? true
124123
:count 100
125-
:keys {:types {java.lang.Long 100}}
126-
:values {:types {java.lang.Long 100}}}
124+
:keys {:types [[java.lang.Long 100]]}
125+
:values {:types [[java.lang.Long 100]]}}
127126
(binding [orchard.inspect.analytics/*size-cutoff* 100]
128127
(analytics (zipmap (range 200) (range 200)))))))

0 commit comments

Comments
 (0)