map 2.3.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. data/lib/map.rb +54 -22
  2. data/lib/map/struct.rb +1 -1
  3. data/map.gemspec +2 -2
  4. data/test/map_test.rb +32 -0
  5. metadata +4 -5
  6. data/a.rb +0 -9
data/lib/map.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  class Map < Hash
2
- Version = '2.3.0' unless defined?(Version)
2
+ Version = '2.4.0' unless defined?(Version)
3
3
  Load = Kernel.method(:load) unless defined?(Load)
4
4
 
5
5
  class << Map
@@ -85,25 +85,46 @@ class Map < Hash
85
85
 
86
86
  # iterate over arguments in pairs smartly.
87
87
  #
88
- def each_pair(*args)
88
+ def each_pair(*args, &block)
89
89
  size = args.size
90
90
  parity = size % 2 == 0 ? :even : :odd
91
91
  first = args.first
92
92
 
93
- return args if size == 0
93
+ if block.nil?
94
+ result = []
95
+ block = lambda{|*kv| result.push(kv)}
96
+ else
97
+ result = args
98
+ end
99
+
100
+ return result if size == 0
94
101
 
95
- if size == 1 and first.respond_to?(:each_pair)
96
- first.each_pair do |key, val|
97
- yield(key, val)
102
+ if size == 1
103
+ if first.respond_to?(:each_pair)
104
+ first.each_pair do |key, val|
105
+ block.call(key, val)
106
+ end
107
+ return result
98
108
  end
99
- return args
100
- end
101
109
 
102
- if size == 1 and first.respond_to?(:each_slice)
103
- first.each_slice(2) do |key, val|
104
- yield(key, val)
110
+ if first.respond_to?(:each_slice)
111
+ first.each_slice(2) do |key, val|
112
+ block.call(key, val)
113
+ end
114
+ return result
115
+ end
116
+
117
+ conversion_methods.each do |method|
118
+ if first.respond_to?(method)
119
+ first = first.send(method)
120
+ first.each_pair do |key, val|
121
+ block.call(key, val)
122
+ end
123
+ return result
124
+ end
105
125
  end
106
- return args
126
+
127
+ raise(ArgumentError, 'odd number of arguments for Map')
107
128
  end
108
129
 
109
130
  array_of_pairs = args.all?{|a| a.is_a?(Array) and a.size == 2}
@@ -111,13 +132,13 @@ class Map < Hash
111
132
  if array_of_pairs
112
133
  args.each do |pair|
113
134
  key, val, *ignored = pair
114
- yield(key, val)
135
+ block.call(key, val)
115
136
  end
116
137
  else
117
138
  0.step(args.size - 1, 2) do |a|
118
139
  key = args[a]
119
140
  val = args[a + 1]
120
- yield(key, val)
141
+ block.call(key, val)
121
142
  end
122
143
  end
123
144
 
@@ -127,12 +148,14 @@ class Map < Hash
127
148
  alias_method '[]', 'new'
128
149
  end
129
150
 
130
- Dynamic = lambda do
131
- conversion_methods.reverse_each do |method|
132
- add_conversion_method!(method)
151
+ unless defined?(Dynamic)
152
+ Dynamic = lambda do
153
+ conversion_methods.reverse_each do |method|
154
+ add_conversion_method!(method)
155
+ end
133
156
  end
157
+ module_eval(&Dynamic)
134
158
  end
135
- module_eval(&Dynamic)
136
159
 
137
160
 
138
161
  # instance constructor
@@ -178,30 +201,39 @@ class Map < Hash
178
201
  self.class
179
202
  end
180
203
 
181
- def map_for(hash)
204
+ def Map.map_for(hash)
182
205
  map = klass.coerce(hash)
183
206
  map.default = hash.default
184
207
  map
185
208
  end
209
+ def map_for(hash)
210
+ klass.map_for(hash)
211
+ end
186
212
 
187
- def convert_key(key)
213
+ def Map.convert_key(key)
188
214
  key.kind_of?(Symbol) ? key.to_s : key
189
215
  end
216
+ def convert_key(key)
217
+ klass.convert_key(key)
218
+ end
190
219
 
191
- def convert_value(value)
220
+ def Map.convert_value(value)
192
221
  conversion_methods.each do |method|
193
222
  return value.send(method) if value.respond_to?(method)
194
223
  end
195
224
 
196
225
  case value
197
226
  when Hash
198
- klass.coerce(value)
227
+ coerce(value)
199
228
  when Array
200
229
  value.map{|v| convert_value(v)}
201
230
  else
202
231
  value
203
232
  end
204
233
  end
234
+ def convert_value(value)
235
+ klass.convert_value(value)
236
+ end
205
237
  alias_method('convert_val', 'convert_value')
206
238
 
207
239
  def convert(key, val)
@@ -23,7 +23,7 @@ class Map
23
23
  value.is_a?(Map) ? value.struct : value
24
24
  end
25
25
 
26
- Keys = lambda{|*keys| keys.flatten!; keys.compact!; keys.map!{|key| key.to_s}}
26
+ Keys = lambda{|*keys| keys.flatten!; keys.compact!; keys.map!{|key| key.to_s}} unless defined?(Keys)
27
27
 
28
28
  delegates = %w(
29
29
  inspect
@@ -3,12 +3,12 @@
3
3
 
4
4
  Gem::Specification::new do |spec|
5
5
  spec.name = "map"
6
- spec.version = "2.3.0"
6
+ spec.version = "2.4.0"
7
7
  spec.platform = Gem::Platform::RUBY
8
8
  spec.summary = "map"
9
9
  spec.description = "description: map kicks the ass"
10
10
 
11
- spec.files = ["a.rb", "lib", "lib/map", "lib/map/options.rb", "lib/map/struct.rb", "lib/map.rb", "map.gemspec", "Rakefile", "README", "test", "test/lib", "test/lib/testing.rb", "test/map_test.rb", "TODO"]
11
+ spec.files = ["lib", "lib/map", "lib/map/options.rb", "lib/map/struct.rb", "lib/map.rb", "map.gemspec", "Rakefile", "README", "test", "test/lib", "test/lib/testing.rb", "test/map_test.rb", "TODO"]
12
12
  spec.executables = []
13
13
 
14
14
  spec.require_path = "lib"
@@ -330,6 +330,38 @@ Testing Map do
330
330
  end
331
331
  end
332
332
 
333
+ testing 'that Map.each_pair works on arrays' do
334
+ array = %w( a b c )
335
+ each_pair = Map.each_pair(array)
336
+ assert{ each_pair == [['a', 'b'], ['c', nil]] }
337
+ end
338
+
339
+ testing 'that Map.each_pair works on hashes' do
340
+ hash = {'a' => 'b', 'c' => nil}
341
+ each_pair = Map.each_pair(hash)
342
+ assert{ each_pair == [['a', 'b'], ['c', nil]] }
343
+ end
344
+
345
+ testing 'that Map.each_pair works on things which respond_to conversion methods' do
346
+ object = Object.new
347
+ def object.to_map
348
+ {'a' => 'b', 'c' => nil}
349
+ end
350
+ each_pair = Map.each_pair(object)
351
+ assert{ each_pair == [['a', 'b'], ['c', nil]] }
352
+ end
353
+
354
+ testing 'that Map.each_pair blows up on non-hash, non-array, non-convertable objects' do
355
+ object = Object.new
356
+ result =
357
+ begin
358
+ Map.each_pair(object)
359
+ rescue => e
360
+ e
361
+ end
362
+ assert{ result.is_a?(Exception) }
363
+ end
364
+
333
365
  protected
334
366
  def new_int_map(n = 1024)
335
367
  map = assert{ Map.new }
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: map
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
4
+ hash: 31
5
5
  prerelease:
6
6
  segments:
7
7
  - 2
8
- - 3
8
+ - 4
9
9
  - 0
10
- version: 2.3.0
10
+ version: 2.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ara T. Howard
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-31 00:00:00 -07:00
18
+ date: 2011-02-09 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -28,7 +28,6 @@ extensions: []
28
28
  extra_rdoc_files: []
29
29
 
30
30
  files:
31
- - a.rb
32
31
  - lib/map/options.rb
33
32
  - lib/map/struct.rb
34
33
  - lib/map.rb
data/a.rb DELETED
@@ -1,9 +0,0 @@
1
-
2
- class M < ::Map
3
- def initialize(arg)
4
- @arg = arg
5
- end
6
- end
7
-
8
- m = M.new(42)
9
- m.update :k => {:a => :b}