rexle-diff 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 001ec36394b57727b838ce4baf166ff74ffed624
4
- data.tar.gz: 2af7396aea078de89284c0ab6e94a4c02d74816a
3
+ metadata.gz: 29374bab7b8b1f1a56d26f25227809b43c817ff6
4
+ data.tar.gz: 03b5815ca6d1c9fb2c1f1b4966e556b09ad86510
5
5
  SHA512:
6
- metadata.gz: 0d30e6217e40dc88f8214608b45a61e4f9e960f6fa18a1818d549fe2e14f3703a4be22fffdf644fd01be8cb405daa386b0c54e2717d182a6ab867a872149b05e
7
- data.tar.gz: 190b118c745cf16b0d3e54598c3ea54fdc5d0baa04f4a36a318042a0f77fd4bfb19bf3f45fa1661e072c91fda7d8184fb3044d7fa7e10dd1e3f5ef3f331500db
6
+ metadata.gz: 53a8debbe17451b8cb20dd85b9a342787b923758ba55e27850d9026bd562645f240c235fcfdc90acab4f1b2e24100a7425ba569f26820e868f27a183814a3c0c
7
+ data.tar.gz: ac71487a7823a562c1f834ca693370d933bb2c5b77575ce756f988f6343f14595ce571513db15e4e51a1e867e3ee2baea45023071a55a35788de8f5d890e8d36
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/lib/rexle-diff.rb CHANGED
@@ -3,84 +3,60 @@
3
3
  # file: rexle-diff.rb
4
4
 
5
5
  require 'rexle'
6
+ require 'digest/md5'
6
7
 
7
8
 
8
9
  class RexleDiff
9
10
 
10
11
  attr_reader :to_doc
11
12
 
12
- def initialize(source1, source2, ignore_removed: true)
13
+ def initialize(source1, source2)
13
14
 
14
- a = timestamp(Rexle.new(source1)).to_a
15
- a2 = RexleParser.new(source2).to_a
15
+ doc1, doc2 = Rexle.new(source1), Rexle.new(source2)
16
+ compare(doc1.root, doc2.root)
16
17
 
17
- compare(a, a2)
18
-
19
- @to_doc = Rexle.new(a2)
18
+ @to_doc = doc2
20
19
  end
21
20
 
22
21
  private
23
22
 
24
- def names_values(c)
23
+
24
+ def hashedxml(node)
25
25
 
26
- c.inject([[],[]]) {|r, x| r.first << x[0]; r.last << x[2]; r }
27
-
26
+ node.elements.map do |element|
27
+ h = Digest::MD5.new << element.xml
28
+ h.to_s
29
+ end
28
30
  end
29
31
 
30
- def added(values, values2, names, names2)
31
-
32
- values_added_or_changed = values2 - values
33
- names_added_or_changed = names - names2
34
-
35
- values_indexes = values_added_or_changed.map {|x| values2.index x}
36
- names_indexes = names_added_or_changed.map {|x| names.index x}
37
-
38
- values_indexes | names_indexes
32
+ def added(hxlist, hxlist2)
33
+
34
+ added_or_changed = hxlist2 - hxlist
35
+ indexes = added_or_changed.map {|x| hxlist2.index x}
36
+ indexes
39
37
 
40
- end
38
+ end
41
39
 
42
- def array_index(a,i)
43
- a2 = a.select{|x| x.is_a? Array}
44
- a.index a2[i]
45
- end
46
-
47
- def compare(a, a2)
40
+ def compare(node, node2)
48
41
 
49
- _, _, _, *raw_c = a
50
- c = raw_c.select{|x| x.is_a? Array}
51
- names, values = names_values(c)
52
-
53
- _, _, _, *raw_c2 = a2
54
- c2 = raw_c2.select{|x| x.is_a? Array}
55
- names2, values2 = names_values(c2)
56
-
57
- added_indexes = added(values, values2, names, names2)
42
+ hxlist, hxlist2 = hashedxml(node), hashedxml(node2)
43
+
44
+ added_indexes = added(hxlist, hxlist2)
58
45
 
59
46
  added_indexes.each do |i|
60
-
61
- offset = array_index(a2, i)
62
- next unless offset
63
-
64
- a2[offset][1].merge!(created: Time.now.to_s, last_modified: Time.now.to_s)
47
+ node2.elements[i+1].attributes\
48
+ .merge!(created: Time.now.to_s, last_modified: Time.now.to_s)
65
49
  end
66
50
 
67
- # we need to know the deleted index
68
- deleted_indexes = deleted(values, values2)
51
+ deleted_indexes = deleted(hxlist, hxlist2)
69
52
 
70
- unchanged_indexes = unchanged(values, values2, names, names2)
53
+ unchanged_indexes = unchanged(hxlist, hxlist2)
71
54
 
72
- # check the child element if any
73
-
74
55
  unchanged_indexes.each do |i, i2|
75
-
76
- names.each do |name|
77
-
78
- offset = array_index(a, i)
79
- offset2 = array_index(a2, i2)
80
- a2[offset2][1].merge!(a[offset][1])
81
-
82
- compare(c[i],c2[i2]) if c[i].length > 3
83
- end
56
+
57
+ node2.elements[i2+1].attributes[:created] ||= Time.now.to_s
58
+ compare(node.elements[i+1], node2.elements[i2+1]) if node.elements[i+1].has_elements?
59
+
84
60
  end
85
61
 
86
62
  end
@@ -91,28 +67,14 @@ class RexleDiff
91
67
  indexes = result.map {|x| list.index x}
92
68
 
93
69
  end
94
-
95
- def timestamp(doc)
96
-
97
- doc.root.traverse do |x|
98
- x.attributes[:created] = Time.now.to_s unless x.attributes[:created]
99
- end
100
-
101
- return doc
102
- end
103
70
 
104
- def unchanged(values, values2, names, names2)
105
-
106
- result = values & values2
107
- indexes = result.map {|x| values.index x}
108
- indexes2 = result.map {|x| values2.index x}
109
-
110
- names_result = names & names2
111
- name_indexes = names_result.map {|x| names.index x}
112
- name_indexes2 = names_result.map {|x| names2.index x}
71
+ def unchanged(list, list2)
113
72
 
73
+ result = list & list2
74
+ indexes = result.map {|x| list.index x}
75
+ indexes2 = result.map {|x| list2.index x}
114
76
 
115
- (indexes | name_indexes).zip(indexes2 | name_indexes2)
77
+ indexes.zip(indexes2)
116
78
 
117
79
  end
118
80
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rexle-diff
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -42,7 +42,7 @@ dependencies:
42
42
  version: '1.2'
43
43
  - - ">="
44
44
  - !ruby/object:Gem::Version
45
- version: 1.2.23
45
+ version: 1.2.24
46
46
  type: :runtime
47
47
  prerelease: false
48
48
  version_requirements: !ruby/object:Gem::Requirement
@@ -52,7 +52,7 @@ dependencies:
52
52
  version: '1.2'
53
53
  - - ">="
54
54
  - !ruby/object:Gem::Version
55
- version: 1.2.23
55
+ version: 1.2.24
56
56
  description:
57
57
  email: james@r0bertson.co.uk
58
58
  executables: []
metadata.gz.sig CHANGED
Binary file