multi_hash_iterator 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: