multi_hash_iterator 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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d7fd2cda2d252b6ceabca391554623650693b922
4
+ data.tar.gz: 8a75902056eab48087f7ce9376cd2b3dce1d6f5a
5
+ SHA512:
6
+ metadata.gz: a6956f72d5bbb6cc44be93e5512efbdd7448240e913d80dc62d94114943b724d1a950abc0b31a7e06d55b33c24984874fbf87316cb059adca7dfe6fcb46dbaff
7
+ data.tar.gz: 9359f88330097077caa3eb4c87cd1f9591f60b1e0608444792d9cda026f1e9a53640f5f2c0fbbb337676ecfc32609a7372bce80d23ad6c5b9a33139b8fb551ac
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ *.swp
3
+ tags
4
+ .yardoc
5
+ doc
data/README.markdown ADDED
@@ -0,0 +1,24 @@
1
+ # multi_hash_iterator
2
+
3
+ Iterate through multiple hashmaps. Values from multiple hashmaps are presented
4
+ in an array. If a hash does not contain a value for that key, a `nil`
5
+ will be used. See Example.
6
+
7
+
8
+ ## Installation
9
+
10
+ gem install multi_hash_iterator
11
+
12
+
13
+ ## Example
14
+
15
+ require 'multi_hash_iterator'
16
+
17
+ h1 = { a: 1, c: 11 }
18
+ h2 = { a: 2, b: 2 }
19
+ h4 = { a: 3, c: 10 }
20
+ multi_hash(h1, h2, h3).each do |k, v|
21
+ # 1st iteration: k = a, v = [1, 2, 3]
22
+ # 2nd iteration: k = c, v = [11, nil, 10]
23
+ # 3rd iteration: k = b, v = [nil, 2, nil]
24
+ end
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ require 'rake/testtask'
2
+
3
+ task :default => "test"
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.description = "Run tests"
7
+ t.name = "test"
8
+ t.pattern = "./test/**/*.rb"
9
+ end
10
+
11
+ desc "Build the gemfile"
12
+ task :build do
13
+ `gem build multi_hash_iterator.gemspec`
14
+ end
@@ -0,0 +1,42 @@
1
+ # Multi Hash allows you to iterate through multiple hashes at the same time.
2
+ # The values will be an array of values from each hash. If a hash contains
3
+ # no value for the key, it will be nil.
4
+ #
5
+ class MultiHash
6
+
7
+ def initialize *hashes
8
+ @hashes = hashes
9
+ @final_hash = {}
10
+ end
11
+
12
+ # Enumerate for each key.
13
+ # Returns an enumerator if block is not present
14
+ #
15
+ def each
16
+ return enum_for(:each) unless block_given?
17
+
18
+ count = @hashes.length
19
+ count.times do |i|
20
+ @hashes[i].each do |key, v|
21
+ next if @final_hash[key]
22
+
23
+ values = [].fill(nil, 0, i)
24
+ values << v
25
+ ((i+1)...count).each do |j|
26
+ values << @hashes[j][key]
27
+ end
28
+
29
+ yield key, values if block_given?
30
+ @final_hash[key] = values
31
+ end
32
+ end
33
+ end
34
+
35
+ end
36
+
37
+
38
+ # Shortcut to do the iteration
39
+ #
40
+ def multi_hash *hashes
41
+ MultiHash.new(*hashes).each
42
+ end
@@ -0,0 +1,21 @@
1
+ require './lib/multi_hash_iterator'
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "multi_hash_iterator"
5
+ s.version = "0.1.0"
6
+ s.authors = ["Albert Tedja"]
7
+ s.email = "nicho_tedja@yahoo.com"
8
+ s.homepage = "https://github.com/atedja/multi_hash_iterator"
9
+ s.summary = "Iterate through multiple hashmaps at once"
10
+ s.description = "multi_hash_iterator allows you iterate through multiple hashmaps at once"
11
+
12
+ s.files = `git ls-files`.split("\n")
13
+ s.test_files = `git ls-files -- {test}/*`.split("\n")
14
+ s.require_paths = ["lib"]
15
+
16
+ s.add_development_dependency 'minitest', '~> 5.3'
17
+ s.add_development_dependency 'mocha', '~> 1.1'
18
+ s.add_development_dependency 'rake', '~> 10.3'
19
+
20
+ s.license = "BSD"
21
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,6 @@
1
+ require './lib/multi-hash-iterator.rb'
2
+
3
+ require 'minitest/autorun'
4
+ require 'minitest/unit'
5
+ require 'mocha/mini_test'
6
+
@@ -0,0 +1,123 @@
1
+ require './test/helper.rb'
2
+
3
+ class TestMultiHashIterator < Minitest::Test
4
+
5
+
6
+ def test_basic
7
+ h1 = { a: 1, b: 2, c: 3 }
8
+ h2 = { a: 2, b: 3 }
9
+ h3 = { b: 4, d: 6 }
10
+ mh = MultiHash.new(h1, h2, h3)
11
+ mh.each do |k, v|
12
+ if k == :a
13
+ assert_equal [1, 2, nil], v
14
+ elsif k == :b
15
+ assert_equal [2, 3, 4], v
16
+ elsif k == :c
17
+ assert_equal [3, nil, nil], v
18
+ elsif k == :d
19
+ assert_equal [nil, nil, 6], v
20
+ else
21
+ raise "not supposed to happen #{k}, #{v}"
22
+ end
23
+ end
24
+
25
+ assert_equal({ a: 1, b: 2, c: 3 }, h1)
26
+ assert_equal({ a: 2, b: 3 }, h2)
27
+ assert_equal({ b: 4, d: 6 }, h3)
28
+ end
29
+
30
+
31
+ def test_compound_values
32
+ h1 = { a: 1, b: 2, c: [100, 200] }
33
+ h2 = { a: 2, b: "foo" }
34
+ h3 = { b: { k: 100, v: 200 }, d: 6 }
35
+ mh = MultiHash.new(h1, h2, h3)
36
+ mh.each do |k, v|
37
+ if k == :a
38
+ assert_equal [1, 2, nil], v
39
+ elsif k == :b
40
+ assert_equal [2, "foo", { k: 100, v: 200 }], v
41
+ elsif k == :c
42
+ assert_equal [[100, 200], nil, nil], v
43
+ elsif k == :d
44
+ assert_equal [nil, nil, 6], v
45
+ else
46
+ raise "not supposed to happen #{k}, #{v}"
47
+ end
48
+ end
49
+
50
+ assert_equal({ a: 1, b: 2, c: [100, 200] }, h1)
51
+ assert_equal({ a: 2, b: "foo" }, h2)
52
+ assert_equal({ b: { k: 100, v: 200 }, d: 6 }, h3)
53
+ end
54
+
55
+
56
+ def test_no_block_should_return_enumerator
57
+ h1 = { a: 1, b: 2, c: 3 }
58
+ h2 = { a: 2, b: 3 }
59
+ h3 = { b: 4, d: 6 }
60
+ mh = MultiHash.new(h1, h2, h3)
61
+ e = mh.each
62
+ assert_equal Enumerator, e.class
63
+ assert_equal [:a, [1, 2, nil]], e.next
64
+ assert_equal [:b, [2, 3, 4]], e.next
65
+ end
66
+
67
+
68
+ def test_enumerator_next
69
+ h1 = { a: 1, b: 2, c: 3 }
70
+ h2 = { a: 2, b: 3 }
71
+ h3 = { b: 4, d: 6 }
72
+ mh = MultiHash.new(h1, h2, h3)
73
+ e = mh.each
74
+ assert_equal [:a, [1, 2, nil]], e.next
75
+ assert_equal [:b, [2, 3, 4]], e.next
76
+ assert_equal [:c, [3, nil, nil]], e.next
77
+ assert_equal [:d, [nil, nil, 6]], e.next
78
+ assert_raises StopIteration do
79
+ e.next
80
+ end
81
+ end
82
+
83
+
84
+ def test_shortcut_function
85
+ h1 = { a: 1, b: 2, c: 3 }
86
+ h2 = { a: 2, b: 3 }
87
+ h3 = { b: 4, d: 6 }
88
+ multi_hash(h1, h2, h3) do |k, v|
89
+ if k == :a
90
+ assert_equal [1, 2, nil], v
91
+ elsif k == :b
92
+ assert_equal [2, 3, 4], v
93
+ elsif k == :c
94
+ assert_equal [3, nil, nil], v
95
+ elsif k == :d
96
+ assert_equal [nil, nil, 6], v
97
+ else
98
+ raise "not supposed to happen #{k}, #{v}"
99
+ end
100
+ end
101
+
102
+ assert_equal({ a: 1, b: 2, c: 3 }, h1)
103
+ assert_equal({ a: 2, b: 3 }, h2)
104
+ assert_equal({ b: 4, d: 6 }, h3)
105
+ end
106
+
107
+
108
+ def test_shortcut_function_with_enumerator_next
109
+ h1 = { a: 1, b: 2, c: 3 }
110
+ h2 = { a: 2, b: 3 }
111
+ h3 = { b: 4, d: 6 }
112
+ e = multi_hash(h1, h2, h3)
113
+ assert_equal [:a, [1, 2, nil]], e.next
114
+ assert_equal [:b, [2, 3, 4]], e.next
115
+ assert_equal [:c, [3, nil, nil]], e.next
116
+ assert_equal [:d, [nil, nil, 6]], e.next
117
+ assert_raises StopIteration do
118
+ e.next
119
+ end
120
+ end
121
+
122
+
123
+ end
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: multi_hash_iterator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Albert Tedja
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-03-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: minitest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mocha
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.3'
55
+ description: multi_hash_iterator allows you iterate through multiple hashmaps at once
56
+ email: nicho_tedja@yahoo.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - ".gitignore"
62
+ - README.markdown
63
+ - Rakefile
64
+ - lib/multi_hash_iterator.rb
65
+ - multi_hash_iterator.gemspec
66
+ - test/helper.rb
67
+ - test/test_multihashiterator.rb
68
+ homepage: https://github.com/atedja/multi_hash_iterator
69
+ licenses:
70
+ - BSD
71
+ metadata: {}
72
+ post_install_message:
73
+ rdoc_options: []
74
+ require_paths:
75
+ - lib
76
+ required_ruby_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ requirements: []
87
+ rubyforge_project:
88
+ rubygems_version: 2.4.5
89
+ signing_key:
90
+ specification_version: 4
91
+ summary: Iterate through multiple hashmaps at once
92
+ test_files: []
93
+ has_rdoc: