hashdiff 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NzRhMjNjMjJlMDRmMzk4MjM1ZWIxMTlkMmM5MjU0NjAyZDQ2MjdjNg==
5
- data.tar.gz: !binary |-
6
- MzdlMDAxNTk0ZjA4ODNhOWIxNjdiYThhYjNlYjhkODJiYTlhYWJiMQ==
2
+ SHA1:
3
+ metadata.gz: 47874e343c8689f4bef1893d4d855a9e606d96d8
4
+ data.tar.gz: a94c89c5a54b9bbef455ba24abcccefdc19bbae6
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- OGE1NDRmNjA2MThmZDJlZDA1YmI2Nzg2YmQ0OTQyMzVlZGNiZDJiYWQ4Y2Y5
10
- ODdiNDdkYTRlMjZkNWFmNTE5NmEzMjRhYTVjZGY5YTEzZjEyMDA1YmZlY2E2
11
- ZWRiNjFiOTdiNGU4YzRkYTZhZjk0YjMxNWNmN2Q3ODg5MGY5YTU=
12
- data.tar.gz: !binary |-
13
- ZWU1MDBjNTNkZTZjMTRiYzBhOTY2NGY1OGM4OWE0MjI1OGM4ZjM1YzFiMDVk
14
- NGRkNzYxZjc1NzkzODEyMzk4OTgzOWQxMjg3Y2IxYjE3ZDE2ZTFjOGY3ZjJj
15
- MGMxZDNiNDcyNTBmZjM3YWYxZjc4ZTMyNmE4MTAxYTk0NTJlYWQ=
6
+ metadata.gz: 6d24313cccba03484ba19fb169676451850786a3d4683631dba275b4da78731fa5251adfb39b8e3c03b7e1388685fad2d7341028888f8198318a5e7d5b4bcb5e
7
+ data.tar.gz: 62b2ab8565244c3f09f872f00447b837c413f1be2e8275e1f4153e5b3d3fcb1528768f36e0e205d2a24d9742348e70d331a37e40355e79d551f3aa51a411d8b3
@@ -1,6 +1,6 @@
1
+ sudo: false
1
2
  language: ruby
2
3
  rvm:
3
- - 1.8.7
4
4
  - 1.9.3
5
5
  - 2.0.0
6
6
  - 2.1.1
@@ -1,5 +1,9 @@
1
1
  # Change Log
2
2
 
3
+ ## v0.3.1 2016-11-24
4
+
5
+ * fix an error when a hash has mixed types #26
6
+
3
7
  ## v0.3.0 2016-2-11
4
8
 
5
9
  * support `:case_insensitive` option
@@ -127,7 +127,7 @@ module HashDiff
127
127
  added_keys = obj2.keys - obj1.keys
128
128
 
129
129
  # add deleted properties
130
- deleted_keys.sort.each do |k|
130
+ deleted_keys.sort_by{|k,v| k.to_s }.each do |k|
131
131
  custom_result = custom_compare(opts[:comparison], "#{prefix}#{k}", obj1[k], nil)
132
132
 
133
133
  if custom_result
@@ -138,10 +138,10 @@ module HashDiff
138
138
  end
139
139
 
140
140
  # recursive comparison for common keys
141
- common_keys.sort.each {|k| result.concat(diff(obj1[k], obj2[k], opts.merge(:prefix => "#{prefix}#{k}"))) }
141
+ common_keys.sort_by{|k,v| k.to_s }.each {|k| result.concat(diff(obj1[k], obj2[k], opts.merge(:prefix => "#{prefix}#{k}"))) }
142
142
 
143
143
  # added properties
144
- added_keys.sort.each do |k|
144
+ added_keys.sort_by{|k,v| k.to_s }.each do |k|
145
145
  unless obj1.key?(k)
146
146
  custom_result = custom_compare(opts[:comparison], "#{prefix}#{k}", nil, obj2[k])
147
147
 
@@ -55,7 +55,7 @@ module HashDiff
55
55
  # e.g. "a.b[3].c" => ['a', 'b', 3, 'c']
56
56
  def self.decode_property_path(path, delimiter='.')
57
57
  parts = path.split(delimiter).collect do |part|
58
- if part =~ /^(\w*)\[(\d+)\]$/
58
+ if part =~ /^(.*)\[(\d+)\]$/
59
59
  if $1.size > 0
60
60
  [$1, $2.to_i]
61
61
  else
@@ -1,3 +1,3 @@
1
1
  module HashDiff
2
- VERSION = '0.3.0'
2
+ VERSION = '0.3.1'
3
3
  end
@@ -22,6 +22,26 @@ describe HashDiff do
22
22
  diff.should == []
23
23
  end
24
24
 
25
+ it "should be able to diff two equal hashes with mixed key types" do
26
+ a = { 'a' => 1, :b => 1 }
27
+ diff = HashDiff.diff(a, a)
28
+ diff.should == []
29
+ end
30
+
31
+ it "should be able to diff if mixed key types are removed" do
32
+ a = { 'a' => 1, :b => 1 }
33
+ b = {}
34
+ diff = HashDiff.diff(a, b)
35
+ diff.should == [["-", "a", 1], ["-", "b", 1]]
36
+ end
37
+
38
+ it "should be able to diff if mixed key types are added" do
39
+ a = { 'a' => 1, :b => 1 }
40
+ b = {}
41
+ diff = HashDiff.diff(b, a)
42
+ diff.should == [["+", "a", 1], ["+", "b", 1]]
43
+ end
44
+
25
45
  it "should be able to diff two hashes with equivalent numerics, when strict is false" do
26
46
  diff = HashDiff.diff({ 'a' => 2.0, 'b' => 2 }, { 'a' => 2, 'b' => 2.0 }, :strict => false)
27
47
  diff.should == []
@@ -61,6 +61,18 @@ describe HashDiff do
61
61
  HashDiff.unpatch!(b, diff).should == a
62
62
  end
63
63
 
64
+ it "should be able to patch array under hash key with non-word characters" do
65
+ a = {"a" => 1, "b-b" => [1, 2]}
66
+ b = {"a" => 1, "b-b" => [2, 1]}
67
+ diff = HashDiff.diff(a, b)
68
+
69
+ HashDiff.patch!(a, diff).should == b
70
+
71
+ a = {"a" => 1, "b-b" => [1, 2]}
72
+ b = {"a" => 1, "b-b" => [2, 1]}
73
+ HashDiff.unpatch!(b, diff).should == a
74
+ end
75
+
64
76
  it "should be able to patch hash value removal" do
65
77
  a = {"a" => 1, "b" => {"b1" => 1, "b2" =>2}}
66
78
  b = {"a" => 1}
@@ -133,4 +145,17 @@ describe HashDiff do
133
145
  HashDiff.unpatch!(b, diff).should == a
134
146
  end
135
147
 
148
+ it "should be able to patch hash value removal with custom delimiter" do
149
+ a = {"a" => 1, "b" => {"b1" => 1, "b2" =>2}}
150
+ b = {"a" => 1, "b" => {"b1" => 3} }
151
+ diff = HashDiff.diff(a, b, :delimiter => "\n")
152
+
153
+ HashDiff.patch!(a, diff, :delimiter => "\n").should == b
154
+
155
+ a = {"a" => 1, "b" => {"b1" => 1, "b2" =>2}}
156
+ b = {"a" => 1, "b" => {"b1" => 3} }
157
+ HashDiff.unpatch!(b, diff, :delimiter => "\n").should == a
158
+ end
159
+
160
+
136
161
  end
@@ -14,64 +14,64 @@ describe HashDiff do
14
14
  it "should be able to tell similiar hash" do
15
15
  a = {'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5}
16
16
  b = {'a' => 1, 'b' => 2, 'c' => 3, 'e' => 5}
17
- HashDiff.similar?(a, b).should be_true
18
- HashDiff.similar?(a, b, :similarity => 1).should be_false
17
+ HashDiff.similar?(a, b).should be true
18
+ HashDiff.similar?(a, b, :similarity => 1).should be false
19
19
  end
20
20
 
21
21
  it "should be able to tell similiar hash with values within tolerance" do
22
22
  a = {'a' => 1.5, 'b' => 2.25, 'c' => 3, 'd' => 4, 'e' => 5}
23
23
  b = {'a' => 1.503, 'b' => 2.22, 'c' => 3, 'e' => 5}
24
- HashDiff.similar?(a, b, :numeric_tolerance => 0.05).should be_true
25
- HashDiff.similar?(a, b).should be_false
24
+ HashDiff.similar?(a, b, :numeric_tolerance => 0.05).should be true
25
+ HashDiff.similar?(a, b).should be false
26
26
  end
27
27
 
28
28
  it "should be able to tell numbers and strings" do
29
- HashDiff.similar?(1, 2).should be_false
30
- HashDiff.similar?("a", "b").should be_false
31
- HashDiff.similar?("a", [1, 2, 3]).should be_false
32
- HashDiff.similar?(1, {'a' => 1, 'b' => 2, 'c' => 3, 'e' => 5}).should be_false
29
+ HashDiff.similar?(1, 2).should be false
30
+ HashDiff.similar?("a", "b").should be false
31
+ HashDiff.similar?("a", [1, 2, 3]).should be false
32
+ HashDiff.similar?(1, {'a' => 1, 'b' => 2, 'c' => 3, 'e' => 5}).should be false
33
33
  end
34
34
 
35
35
  it "should be able to tell true when similarity == 0.5" do
36
36
  a = {"value" => "New1", "onclick" => "CreateNewDoc()"}
37
37
  b = {"value" => "New", "onclick" => "CreateNewDoc()"}
38
38
 
39
- HashDiff.similar?(a, b, :similarity => 0.5).should be_true
39
+ HashDiff.similar?(a, b, :similarity => 0.5).should be true
40
40
  end
41
41
 
42
42
  it "should be able to tell false when similarity == 0.5" do
43
43
  a = {"value" => "New1", "onclick" => "open()"}
44
44
  b = {"value" => "New", "onclick" => "CreateNewDoc()"}
45
45
 
46
- HashDiff.similar?(a, b, :similarity => 0.5).should be_false
46
+ HashDiff.similar?(a, b, :similarity => 0.5).should be false
47
47
  end
48
48
 
49
49
  describe '.compare_values' do
50
50
  it "should compare numeric values exactly when no tolerance" do
51
- expect(HashDiff.compare_values(10.004, 10.003)).to be_false
51
+ expect(HashDiff.compare_values(10.004, 10.003)).to be false
52
52
  end
53
53
 
54
54
  it "should allow tolerance with numeric values" do
55
- expect(HashDiff.compare_values(10.004, 10.003, :numeric_tolerance => 0.01)).to be_true
55
+ expect(HashDiff.compare_values(10.004, 10.003, :numeric_tolerance => 0.01)).to be true
56
56
  end
57
57
 
58
58
  it "should compare other objects with or without tolerance" do
59
- expect(HashDiff.compare_values('hats', 'ninjas')).to be_false
60
- expect(HashDiff.compare_values('hats', 'ninjas', :numeric_tolerance => 0.01)).to be_false
61
- expect(HashDiff.compare_values('horse', 'horse')).to be_true
59
+ expect(HashDiff.compare_values('hats', 'ninjas')).to be false
60
+ expect(HashDiff.compare_values('hats', 'ninjas', :numeric_tolerance => 0.01)).to be false
61
+ expect(HashDiff.compare_values('horse', 'horse')).to be true
62
62
  end
63
63
 
64
64
  it 'should compare strings exactly by default' do
65
- expect(HashDiff.compare_values(' horse', 'horse')).to be_false
66
- expect(HashDiff.compare_values('horse', 'Horse')).to be_false
65
+ expect(HashDiff.compare_values(' horse', 'horse')).to be false
66
+ expect(HashDiff.compare_values('horse', 'Horse')).to be false
67
67
  end
68
68
 
69
69
  it 'should strip strings before comparing when requested' do
70
- expect(HashDiff.compare_values(' horse', 'horse', :strip => true)).to be_true
70
+ expect(HashDiff.compare_values(' horse', 'horse', :strip => true)).to be true
71
71
  end
72
72
 
73
73
  it "should ignore string case when requested" do
74
- expect(HashDiff.compare_values('horse', 'Horse', :case_insensitive => true)).to be_true
74
+ expect(HashDiff.compare_values('horse', 'Horse', :case_insensitive => true)).to be true
75
75
  end
76
76
 
77
77
  end
metadata CHANGED
@@ -1,69 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hashdiff
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Liu Fengyun
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-11 00:00:00.000000000 Z
11
+ date: 2016-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '2.0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: yard
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ! '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bluecloth
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ! '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ! '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
- description: ! ' HashDiff is a diff lib to compute the smallest difference between
56
- two hashes. '
55
+ description: " HashDiff is a diff lib to compute the smallest difference between two
56
+ hashes. "
57
57
  email:
58
58
  - liufengyunchina@gmail.com
59
59
  executables: []
60
60
  extensions: []
61
61
  extra_rdoc_files: []
62
62
  files:
63
- - .gitignore
64
- - .rspec
65
- - .travis.yml
66
- - .yardopts
63
+ - ".gitignore"
64
+ - ".rspec"
65
+ - ".travis.yml"
66
+ - ".yardopts"
67
67
  - Gemfile
68
68
  - LICENSE
69
69
  - README.md
@@ -93,17 +93,17 @@ require_paths:
93
93
  - lib
94
94
  required_ruby_version: !ruby/object:Gem::Requirement
95
95
  requirements:
96
- - - ! '>='
96
+ - - ">="
97
97
  - !ruby/object:Gem::Version
98
98
  version: 1.8.7
99
99
  required_rubygems_version: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ! '>='
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  requirements: []
105
105
  rubyforge_project:
106
- rubygems_version: 2.4.8
106
+ rubygems_version: 2.5.1
107
107
  signing_key:
108
108
  specification_version: 4
109
109
  summary: HashDiff is a diff lib to compute the smallest difference between two hashes.