rexle-diff 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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