-
Notifications
You must be signed in to change notification settings - Fork 6
/
difform.muse
90 lines (69 loc) · 2.47 KB
/
difform.muse
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#title difform - June 1, 2010
** Diffing Clojure Forms
Start with Stuart Sierra's excellent clojure.walk, (to sort the
maps/sets,) add Tom Faulhaber's wonderful Clojure pretty print, and
finish it off with Neil Fraser's magnificent Java diff library:
http://code.google.com/p/google-diff-match-patch/wiki/API, and you'll
find it's pretty easy to create a function to diff Clojure forms.
Mine's here:
http://github.com/GeorgeJahad/difform
http://clojars.org/difform
Works like this:
<example>
(use 'com.georgejahad.difform)
(difform { 1 2 3 4 5 6} { 5 6 1 2 3 7})
{1 2, 3
- 4
+ 7
, 5 6}
</example>
As you can see, the two forms differ only in the value of key 3, where
it is 4 in the first form and 7 in the second. For a more interesting
example,
<example>
(difform
{:cart {:items [{:new-delivery {:ids ["-1"]}, :old-unit-price "700.00", :product-id "prod-1", :quantity "1", :unit-price "700.00"}], :old-total-dollars "700.00", :purchase? false, :total-dollars "700.00"}, :day "2010-05-18", :event-ids ["1274166000010:some-session-id-1"], :old-id "14", :delivery {:ids [nil]}, :session "some-session-id-1"}
{:day "2010-05-18", :old-id "14", :session "some-session-id-1", :delivery nil, :cart {:purchase? false, :old-total-dollars "1400.00", :total-dollars "1400.00", :items [{:product-id "prod-1", :old-unit-price "700.00", :unit-price "700.00", :quantity "2", :new-delivery {:ids ["-1"]}}]}, :event-ids ["1274166000000:some-session-id-1"]})
</example>
produces the following. Here the values of the quantity,
total-dollars, and a few other fields have changed:
<example>
{:cart
{:items
[{:new-delivery {:ids ["-1"]},
:old-unit-price "700.00",
:product-id "prod-1",
:quantity "
- 1
+ 2
",
:unit-price "700.00"}],
:old-total-dollars "
- 7
+ 14
00.00",
:purchase? false,
:total-dollars "
- 7
+ 14
00.00"},
:day "2010-05-18",
:delivery
- {:ids [
nil
- ]}
,
:event-ids ["1274166
+ 0
0000
- 1
0:some-session-id-1"],
:old-id "14",
:session "some-session-id-1"}
</example>
A very common use is with clojure.test. For example, if clojure test reports you have failed a test like this:
FAIL in (xyz-test) (xyz_spec.clj:7)
expected: (= form1 form2)
Run (difform form1 form2) to see what the exact failure was.
** Comments/Suggestions
Send any comments/suggestions to George Jahad at "george-clojure at blackbirdsystems.net" or to the main clojure mailing list: http://groups.google.com/group/clojure