map 2.3.0 → 2.4.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.
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}