eq_wo_order 0.0.1 → 0.1.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: c72222e497bcf02e6b817a8c298edbd26a48aa00
4
- data.tar.gz: 1204cc00c84d3fd65a9d81fd9f9ecc01085b5e0d
3
+ metadata.gz: bc13907a659560faf9cb2c5b8f8272bd1ae9de28
4
+ data.tar.gz: 84b9da470b6badb48d437afbeb38eb6c3880cbc8
5
5
  SHA512:
6
- metadata.gz: f77cb562692f09028be40f8285e295c14aae7960359d41998c6800da686d7ac0e0fe8c077666bdd12240ad9f988cef77f38cd8dfc0a27f35acc46e592f1a17ab
7
- data.tar.gz: 6420d6b85722d9529a131a952b73e03f38b661ff9fb1dbaa7fd22c1f4a80335cdb0a89d6d333c15602b5ad7e6e9cc952f6b3013e29bace8a972a62119d3ce851
6
+ metadata.gz: 8407e36c00102f950c711a054c40d9c7448051b3867182b01c9aebfe4b68c94c23ea091114407891970b29629b3ab10ee6c82b53c1109a7904304ee867469b11
7
+ data.tar.gz: 7a8a05343889ac2fee08eb6cfd8cf19b7512ca3e9c2dea4dec93db69699b5171a93835e60ee96629c5c48bb02338514e77656ef7ee161ca658ae481b03664213
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
Binary file
data/eq_wo_order.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'eq_wo_order'
3
- s.version = '0.0.1'
3
+ s.version = '0.1.0'
4
4
  s.date = '2016-02-29'
5
5
  s.summary = 'RSpec equality matcher that ignores nested order'
6
6
  s.description = 'RSpec equality matcher that recursively sorts lists, hashes, and lists of hashes before comparing'
data/lib/eq_wo_order.rb CHANGED
@@ -1,5 +1,45 @@
1
1
  RSpec::Matchers.define :eq_wo_order do |expected|
2
2
  match do |actual|
3
- true
3
+ eq_wo_order_base(actual, expected)
4
+ end
5
+
6
+ def eq_wo_order_base(actual, expected)
7
+ if actual.class == Array
8
+ actual_sorted = sort_array_of_hashes_by_all_keys actual
9
+ expected_sorted = sort_array_of_hashes_by_all_keys expected
10
+
11
+ actual_sorted == expected_sorted
12
+ else
13
+ actual == expected
14
+ end
15
+ end
16
+
17
+ def sort_array_of_hashes_by_all_keys(arr)
18
+ sorted_arr = []
19
+
20
+ hash_items = arr.collect { |x| x if x.class == Hash }.compact
21
+ array_items = arr.collect { |x| x if x.class == Array }.compact
22
+ primitive_items = arr.collect { |x| x unless x.class == Hash || x.class == Array }.compact
23
+
24
+ # primitives
25
+ sorted_arr.push primitive_items.sort.flatten
26
+
27
+ # arrays
28
+ sorted_array_items = array_items.collect { |item| sort_array_of_hashes_by_all_keys(item) }
29
+ sorted_arr.push sorted_array_items.flatten
30
+
31
+ # hashes
32
+ intersect_keys(hash_items).each do |key|
33
+ hash_items = hash_items.sort_by { |item| item[key] }
34
+ end
35
+ sorted_arr.push hash_items.flatten
36
+
37
+ sorted_arr
38
+ end
39
+
40
+ def intersect_keys(arr_of_hashes)
41
+ keys = arr_of_hashes.collect { |x| x.keys }
42
+ intersected_keys = keys.reduce(keys.first, :&)
43
+ intersected_keys == nil ? [] : intersected_keys
4
44
  end
5
45
  end
@@ -0,0 +1,97 @@
1
+ require_relative '../../lib/eq_wo_order'
2
+
3
+ describe '#eq_wo_order' do
4
+ describe 'basic types' do
5
+ describe 1 do
6
+ it { is_expected.to eq_wo_order(1) }
7
+ it { is_expected.not_to eq_wo_order(2) }
8
+ end
9
+
10
+ describe 'a' do
11
+ it { is_expected.to eq_wo_order('a') }
12
+ it { is_expected.not_to eq_wo_order('b') }
13
+ end
14
+
15
+ describe true do
16
+ it { is_expected.to eq_wo_order(true) }
17
+ it { is_expected.not_to eq_wo_order(false) }
18
+ end
19
+ end
20
+
21
+ describe 'arrays' do
22
+ describe ['a', 'b'] do
23
+ it { is_expected.to eq_wo_order(['a', 'b']) }
24
+ it { is_expected.to eq_wo_order(['b', 'a']) }
25
+ end
26
+
27
+ describe [1, 2] do
28
+ it { is_expected.to eq_wo_order([1, 2]) }
29
+ it { is_expected.to eq_wo_order([2, 1]) }
30
+ end
31
+
32
+ describe ['a', {b: 'c', d: 'e'}] do
33
+ it { is_expected.to eq_wo_order([{d: 'e', b: 'c'}, 'a']) }
34
+ end
35
+ end
36
+
37
+ describe 'hashes' do
38
+ describe({a: 'b', c: 'd'}) do
39
+ it { is_expected.to eq_wo_order({a: 'b', c: 'd'}) }
40
+ it { is_expected.to eq_wo_order({c: 'd', a: 'b'}) }
41
+ end
42
+
43
+ describe({a: 1, b: 2}) do
44
+ it { is_expected.to eq_wo_order({a: 1, b: 2}) }
45
+ it { is_expected.to eq_wo_order({b: 2, a: 1}) }
46
+ end
47
+ end
48
+
49
+ describe 'arrays of hashes' do
50
+ describe [{a: 1}, {a: 2}] do
51
+ it { is_expected.to eq_wo_order([{a: 2}, {a: 1}]) }
52
+ end
53
+
54
+ describe [{a: 1, b: 1}, {a: 1, b: 2}] do
55
+ it { is_expected.to eq_wo_order([{a: 1, b: 2}, {a: 1, b: 1}]) }
56
+ it { is_expected.not_to eq_wo_order([{a: 1, b: 1}, {a: 1, b: 2, c: 3}]) }
57
+ end
58
+
59
+ describe [{a: 1, b: 1}, {a: 1, b: 2, c: 3}] do
60
+ it { is_expected.not_to eq_wo_order([{a: 1, b: 2}, {a: 1, b: 1}]) }
61
+ end
62
+ end
63
+
64
+ describe 'arrays of arrays' do
65
+ describe [[1, 2]] do
66
+ it { is_expected.to eq_wo_order([[2, 1]]) }
67
+ it { is_expected.not_to eq_wo_order([[2, 1, 3]]) }
68
+ end
69
+
70
+ describe [[1, 2, 3]] do
71
+ it { is_expected.to eq_wo_order([[2, 1, 3]]) }
72
+ it { is_expected.not_to eq_wo_order([[2, 1]]) }
73
+ end
74
+
75
+ describe [[[1, 2]]] do
76
+ it { is_expected.to eq_wo_order([[[2, 1]]]) }
77
+ end
78
+ end
79
+
80
+ describe 'hashes of hashes' do
81
+ describe({a: {b: {c: 'd', e: 'f'}}}) do
82
+ it { is_expected.to eq_wo_order({a: {b: {e: 'f', c: 'd'}}}) }
83
+ end
84
+ end
85
+
86
+ describe 'hashes of arrays' do
87
+ describe({a: [1, 2]}) do
88
+ it { is_expected.to eq_wo_order({a: [2, 1]}) }
89
+ end
90
+ end
91
+
92
+ describe 'deeply nested hashes and arrays' do
93
+ describe [{a: [{b: 'c', d: 'e'}]}, {f: 5}, {g: 'h'}] do
94
+ it { is_expected.to eq_wo_order([{f: 5}, {a: [{d: 'e', b: 'c'}]}, {g: 'h'}]) }
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,4 @@
1
+ RSpec.configure do |c|
2
+ c.order = :random
3
+ c.default_formatter = 'doc'
4
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eq_wo_order
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean de Klerk
@@ -60,14 +60,18 @@ extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
62
  - .gitignore
63
+ - .rspec
63
64
  - CHANGELOG
64
65
  - Gemfile
65
66
  - LICENSE.txt
66
67
  - README.md
67
68
  - Rakefile
69
+ - eq_wo_order-0.0.1.gem
68
70
  - eq_wo_order.gemspec
69
71
  - lib/eq_wo_order.rb
70
72
  - lib/version/version.rb
73
+ - spec/features/eq_wo_order_spec.rb
74
+ - spec/spec_helper.rb
71
75
  homepage: http://rubygems.org/gems/eq_wo_order
72
76
  licenses:
73
77
  - MIT
@@ -92,4 +96,6 @@ rubygems_version: 2.4.8
92
96
  signing_key:
93
97
  specification_version: 4
94
98
  summary: RSpec equality matcher that ignores nested order
95
- test_files: []
99
+ test_files:
100
+ - spec/features/eq_wo_order_spec.rb
101
+ - spec/spec_helper.rb