modalsupport 0.7.1 → 0.8.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.
- data/VERSION +1 -1
- data/lib/modalsupport/array.rb +11 -0
- data/lib/modalsupport/recursive_map.rb +29 -0
- data/lib/modalsupport.rb +1 -0
- data/modalsupport.gemspec +7 -2
- data/test/test_array_to_h.rb +16 -0
- data/test/test_recursive_map.rb +76 -0
- metadata +10 -5
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.8.0
|
data/lib/modalsupport/array.rb
CHANGED
@@ -27,4 +27,15 @@ class Array
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
+
# create a hash from an array of [key,value] tuples
|
31
|
+
# you can set default or provide a block just as with Hash::new
|
32
|
+
# Note: if you use [key, value1, value2, value#], hash[key] will
|
33
|
+
# be [value1, value2, value#]
|
34
|
+
def to_h(default=nil, &block)
|
35
|
+
# code by Stefan Rusterholz fixed for Ruby 1.9.2; see http://www.ruby-forum.com/topic/138218
|
36
|
+
hash = block_given? ? Hash.new(&block) : Hash.new(default)
|
37
|
+
each { |(key, *value)| hash[key]=value.size>1 ? value : value.first }
|
38
|
+
hash
|
39
|
+
end
|
40
|
+
|
30
41
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module ModalSupport
|
2
|
+
|
3
|
+
module_function
|
4
|
+
|
5
|
+
# Map hashes and arrays recursively. The supplied block is used to map all items (values and container).
|
6
|
+
#
|
7
|
+
# Examples
|
8
|
+
# # double numeric values
|
9
|
+
# recursive_map(:a=>11, :b=>22, :c=>{:x=>100,:y=>200}, :d=>[1,2,3]){|v| v.kind_of?(Numeric) ? v*2 : v}
|
10
|
+
# # => {:a=>22, :b=>44, :c=>{:x=>200,:y=>400}, :d=>[2,4,6]}
|
11
|
+
#
|
12
|
+
# # convert hashes to OpenStructs
|
13
|
+
# recursive_map(:a=>11, :b=>22, :c=>{:x=>100,:y=>200}){|v| v.kind_of?(Hash) ? OpenStruct.new(v) : v}
|
14
|
+
# # => #<OpenStruct b=22, a=11, c=#<OpenStruct x=100, y=200>>
|
15
|
+
def recursive_map(container, &blk)
|
16
|
+
raise ArgumentError, "recursive_map requires a block" if blk.nil?
|
17
|
+
case container
|
18
|
+
when Hash
|
19
|
+
blk[container.map{|k,v|
|
20
|
+
[k, recursive_map(v, &blk)]
|
21
|
+
}.to_h]
|
22
|
+
when Array
|
23
|
+
blk[container.map{|v| recursive_map(v, &blk)}]
|
24
|
+
else
|
25
|
+
blk[container]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/lib/modalsupport.rb
CHANGED
data/modalsupport.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{modalsupport}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.8.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Javier Goizueta"]
|
12
|
-
s.date = %q{2011-02-
|
12
|
+
s.date = %q{2011-02-21}
|
13
13
|
s.description = %q{additional support extensions to ActiveSupport and HoboSupport}
|
14
14
|
s.email = %q{jgoizueta@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
|
|
30
30
|
"lib/modalsupport/full.rb",
|
31
31
|
"lib/modalsupport/mixins/bracket_constructor.rb",
|
32
32
|
"lib/modalsupport/mixins/state_equivalent.rb",
|
33
|
+
"lib/modalsupport/recursive_map.rb",
|
33
34
|
"lib/modalsupport/regexp.rb",
|
34
35
|
"lib/modalsupport/ruby_engine.rb",
|
35
36
|
"lib/modalsupport/ruby_platform.rb",
|
@@ -38,6 +39,7 @@ Gem::Specification.new do |s|
|
|
38
39
|
"modalsupport.gemspec",
|
39
40
|
"test/helper.rb",
|
40
41
|
"test/test_array_index.rb",
|
42
|
+
"test/test_array_to_h.rb",
|
41
43
|
"test/test_bracket_constructor.rb",
|
42
44
|
"test/test_cross_each.rb",
|
43
45
|
"test/test_grep.rb",
|
@@ -45,6 +47,7 @@ Gem::Specification.new do |s|
|
|
45
47
|
"test/test_match.rb",
|
46
48
|
"test/test_paralell_each.rb",
|
47
49
|
"test/test_product.rb",
|
50
|
+
"test/test_recursive_map.rb",
|
48
51
|
"test/test_relative_path.rb",
|
49
52
|
"test/test_rotate.rb",
|
50
53
|
"test/test_slice.rb",
|
@@ -59,6 +62,7 @@ Gem::Specification.new do |s|
|
|
59
62
|
s.test_files = [
|
60
63
|
"test/helper.rb",
|
61
64
|
"test/test_array_index.rb",
|
65
|
+
"test/test_array_to_h.rb",
|
62
66
|
"test/test_bracket_constructor.rb",
|
63
67
|
"test/test_cross_each.rb",
|
64
68
|
"test/test_grep.rb",
|
@@ -66,6 +70,7 @@ Gem::Specification.new do |s|
|
|
66
70
|
"test/test_match.rb",
|
67
71
|
"test/test_paralell_each.rb",
|
68
72
|
"test/test_product.rb",
|
73
|
+
"test/test_recursive_map.rb",
|
69
74
|
"test/test_relative_path.rb",
|
70
75
|
"test/test_rotate.rb",
|
71
76
|
"test/test_slice.rb",
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestArrayIndex < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "Arrays" do
|
6
|
+
|
7
|
+
should "have an to_h method converting key-value pairs to a hash" do
|
8
|
+
assert_respond_to [], :to_h
|
9
|
+
assert_equal({:a=>11, :b=>22}, [[:a,11], [:b,22]].to_h)
|
10
|
+
assert_equal({:a=>11, :b=>[22,33]}, [[:a,11], [:b,22,33]].to_h)
|
11
|
+
assert_equal({1=>nil, 2=>nil, 3=>nil}, [1,2,3].to_h)
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestRecursiveMap < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "recursive_map" do
|
6
|
+
|
7
|
+
setup do
|
8
|
+
@value_doubler = lambda{|v| v.kind_of?(Numeric) ? v*2 : v}
|
9
|
+
@hash_to_array = lambda{|v| v.kind_of?(Hash) ? v.to_a : v}
|
10
|
+
@array_to_string = lambda{|v| v.kind_of?(Array) ? v.inspect : v}
|
11
|
+
end
|
12
|
+
|
13
|
+
should "process values in containers" do
|
14
|
+
assert_equal(
|
15
|
+
{:a=>22, :b=>44},
|
16
|
+
ModalSupport.recursive_map(:a=>11, :b=>22, &@value_doubler)
|
17
|
+
)
|
18
|
+
assert_equal(
|
19
|
+
[22,44],
|
20
|
+
ModalSupport.recursive_map([11,22], &@value_doubler)
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
should "process values in nested containers" do
|
25
|
+
assert_equal(
|
26
|
+
{:a=>22, :b=>44, :c=>{:x=>200,:y=>400}, :d=>[2,4,6]},
|
27
|
+
ModalSupport.recursive_map(:a=>11, :b=>22, :c=>{:x=>100,:y=>200}, :d=>[1,2,3], &@value_doubler)
|
28
|
+
)
|
29
|
+
assert_equal(
|
30
|
+
[22, 44, {:c=>{:x=>200,:y=>400}, :d=>[2,4,6]}],
|
31
|
+
ModalSupport.recursive_map([11, 22, {:c=>{:x=>100,:y=>200}, :d=>[1,2,3]}], &@value_doubler)
|
32
|
+
)
|
33
|
+
end
|
34
|
+
|
35
|
+
should "process values in deeply nested containers" do
|
36
|
+
assert_equal(
|
37
|
+
{:a=>22, :b=>44, :c=>{:x=>200, :y=>400}, :d=>[2, 4, 6, {:zz=>[2000, 4000, {:yy=>{:xx=>6000}}]}]},
|
38
|
+
ModalSupport.recursive_map({:a=>11, :b=>22, :c=>{:x=>100,:y=>200}, :d=>[1,2,3,{:zz=>[1000,2000,{:yy=>{:xx=>3000}}]}]}, &@value_doubler)
|
39
|
+
)
|
40
|
+
assert_equal(
|
41
|
+
[22, 44, {:d=>[2, 4, 6, {:zz=>[2000, 4000, {:yy=>{:xx=>6000}}]}], :b=>44, :c=>{:x=>200, :y=>400}, :a=>22}],
|
42
|
+
ModalSupport.recursive_map([11,22,{:a=>11, :b=>22, :c=>{:x=>100,:y=>200}, :d=>[1,2,3,{:zz=>[1000,2000,{:yy=>{:xx=>3000}}]}]}], &@value_doubler)
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
should "transform containers" do
|
47
|
+
assert_same_elements(
|
48
|
+
[[:a, 11], [:b, 22], [:d, [1, 2, 3]]],
|
49
|
+
ModalSupport.recursive_map(:a=>11, :b=>22, :d=>[1,2,3], &@hash_to_array)
|
50
|
+
)
|
51
|
+
assert_equal(
|
52
|
+
{:a=>11, :b=>22, :d=>[1,2,3].inspect},
|
53
|
+
ModalSupport.recursive_map(:a=>11, :b=>22, :d=>[1,2,3], &@array_to_string)
|
54
|
+
)
|
55
|
+
assert_same_elements(
|
56
|
+
[[:a, 11], [:b, 22], [:c, [[:x, 100], [:y, 200]]], [:d, [1, 2, 3]]],
|
57
|
+
ModalSupport.recursive_map(:a=>11, :b=>22, :c=>{:x=>100,:y=>200}, :d=>[1,2,3], &@hash_to_array)
|
58
|
+
)
|
59
|
+
assert_equal(
|
60
|
+
{:a=>11, :b=>22, :c=>{:x=>100, :y=>200}, :d=>[1,2,3].inspect},
|
61
|
+
ModalSupport.recursive_map(:a=>11, :b=>22, :c=>{:x=>100,:y=>200}, :d=>[1,2,3], &@array_to_string)
|
62
|
+
)
|
63
|
+
ruby_19 do
|
64
|
+
# we only test this in Ruby 1.9 because prior versions don't keep Hash ordering
|
65
|
+
assert_equal(
|
66
|
+
"[111, 222, {:a=>11, :b=>22, :c=>{:x=>100, :y=>200}, :d=>\"[1, 2, 3]\"}]",
|
67
|
+
ModalSupport.recursive_map([111,222,{:a=>11, :b=>22, :c=>{:x=>100,:y=>200}, :d=>[1,2,3]}], &@array_to_string)
|
68
|
+
)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: modalsupport
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 63
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 8
|
9
|
+
- 0
|
10
|
+
version: 0.8.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Javier Goizueta
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-02-
|
18
|
+
date: 2011-02-21 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -55,6 +55,7 @@ files:
|
|
55
55
|
- lib/modalsupport/full.rb
|
56
56
|
- lib/modalsupport/mixins/bracket_constructor.rb
|
57
57
|
- lib/modalsupport/mixins/state_equivalent.rb
|
58
|
+
- lib/modalsupport/recursive_map.rb
|
58
59
|
- lib/modalsupport/regexp.rb
|
59
60
|
- lib/modalsupport/ruby_engine.rb
|
60
61
|
- lib/modalsupport/ruby_platform.rb
|
@@ -63,6 +64,7 @@ files:
|
|
63
64
|
- modalsupport.gemspec
|
64
65
|
- test/helper.rb
|
65
66
|
- test/test_array_index.rb
|
67
|
+
- test/test_array_to_h.rb
|
66
68
|
- test/test_bracket_constructor.rb
|
67
69
|
- test/test_cross_each.rb
|
68
70
|
- test/test_grep.rb
|
@@ -70,6 +72,7 @@ files:
|
|
70
72
|
- test/test_match.rb
|
71
73
|
- test/test_paralell_each.rb
|
72
74
|
- test/test_product.rb
|
75
|
+
- test/test_recursive_map.rb
|
73
76
|
- test/test_relative_path.rb
|
74
77
|
- test/test_rotate.rb
|
75
78
|
- test/test_slice.rb
|
@@ -113,6 +116,7 @@ summary: simple extensions to core classes
|
|
113
116
|
test_files:
|
114
117
|
- test/helper.rb
|
115
118
|
- test/test_array_index.rb
|
119
|
+
- test/test_array_to_h.rb
|
116
120
|
- test/test_bracket_constructor.rb
|
117
121
|
- test/test_cross_each.rb
|
118
122
|
- test/test_grep.rb
|
@@ -120,6 +124,7 @@ test_files:
|
|
120
124
|
- test/test_match.rb
|
121
125
|
- test/test_paralell_each.rb
|
122
126
|
- test/test_product.rb
|
127
|
+
- test/test_recursive_map.rb
|
123
128
|
- test/test_relative_path.rb
|
124
129
|
- test/test_rotate.rb
|
125
130
|
- test/test_slice.rb
|