rack-mount 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -62,20 +62,20 @@ module Rack::Mount
62
62
  if part.is_a?(Reginald::Group)
63
63
  if index > 0
64
64
  previous = parts[index-1]
65
- if previous.literal?
65
+ if previous.is_a?(Reginald::Character) && previous.literal?
66
66
  boundaries << previous.to_s
67
67
  end
68
68
  end
69
69
 
70
70
  if inside = part[0][0]
71
- if inside.literal?
71
+ if inside.is_a?(Reginald::Character) && inside.literal?
72
72
  boundaries << inside.to_s
73
73
  end
74
74
  end
75
75
 
76
76
  if index < parts.length
77
77
  following = parts[index+1]
78
- if following.literal?
78
+ if following.is_a?(Reginald::Character) && following.literal?
79
79
  boundaries << following.to_s
80
80
  end
81
81
  end
@@ -37,10 +37,10 @@ module Rack::Mount
37
37
  if key.is_a?(Regexp)
38
38
  @fuzz[value] = key
39
39
  if keys.empty?
40
- hash_each_pair { |k, l| l << value if k =~ key }
40
+ @hash.each_pair { |k, l| l << value if k =~ key }
41
41
  self.default << value
42
42
  else
43
- hash_each_pair { |k, _|
43
+ @hash.each_pair { |k, _|
44
44
  if k =~ key
45
45
  args[0] = k
46
46
  super(*args)
@@ -1,22 +1,13 @@
1
+ require 'forwardable'
1
2
  require 'multiset'
2
3
 
3
4
  # Multimap is a generalization of a map or associative array
4
5
  # abstract data type in which more than one value may be associated
5
6
  # with and returned for a given key.
6
- class Multimap < Hash
7
- #--
8
- # Ignore protected aliases back to the original Hash methods
9
- #++
10
- module_eval %{
11
- alias_method :hash_aref, :[]
12
- protected :hash_aref
7
+ class Multimap
8
+ extend Forwardable
13
9
 
14
- alias_method :hash_aset, :[]=
15
- protected :hash_aset
16
-
17
- alias_method :hash_each_pair, :each_pair
18
- protected :hash_each_pair
19
- }
10
+ include Enumerable
20
11
 
21
12
  # call-seq:
22
13
  # Multimap[ [key =>|, value]* ] => multimap
@@ -53,7 +44,8 @@ class Multimap < Hash
53
44
  }
54
45
  end
55
46
 
56
- map = super
47
+ map = new
48
+ map.instance_variable_set(:@hash, Hash[*args])
57
49
  map.default = default
58
50
  map
59
51
  end
@@ -70,20 +62,24 @@ class Multimap < Hash
70
62
  # h["a"] #=> [100].to_set
71
63
  # h["c"] #=> [].to_set
72
64
  def initialize(default = [])
73
- super
65
+ @hash = Hash.new(default)
74
66
  end
75
67
 
76
68
  def initialize_copy(original) #:nodoc:
77
- super
78
- clear
79
- original.each_pair { |key, container| self[key] = container }
80
- self.default = original.default.dup
69
+ @hash = Hash.new(original.default.dup)
70
+ original._internal_hash.each_pair do |key, container|
71
+ @hash[key] = container.dup
72
+ end
81
73
  end
82
74
 
83
- #--
84
- # Setting a default proc is not supported
85
- #++
86
- undef :default_proc
75
+ def_delegators :@hash, :clear, :default, :default=, :empty?,
76
+ :fetch, :has_key?, :key?
77
+
78
+ # Retrieves the <i>value</i> object corresponding to the
79
+ # <i>*keys</i> object.
80
+ def [](key)
81
+ @hash[key]
82
+ end
87
83
 
88
84
  # call-seq:
89
85
  # map[key] = value => value
@@ -118,9 +114,9 @@ class Multimap < Hash
118
114
  # map.delete("a") #=> [100]
119
115
  def delete(key, value = nil)
120
116
  if value
121
- hash_aref(key).delete(value)
117
+ @hash[key].delete(value)
122
118
  else
123
- super(key)
119
+ @hash.delete(key)
124
120
  end
125
121
  end
126
122
 
@@ -157,15 +153,9 @@ class Multimap < Hash
157
153
  #
158
154
  # a is [100]
159
155
  # b is [200, 300]
160
- def each_association
161
- # each_pair
156
+ def each_association(&block)
157
+ @hash.each_pair(&block)
162
158
  end
163
- #--
164
- # Ignore alias_method since the definition above serves
165
- # as its documentation.
166
- #++
167
- remove_method :each_association
168
- module_eval "alias_method :each_association, :each_pair"
169
159
 
170
160
  # call-seq:
171
161
  # map.each_container { |container| block } => map
@@ -248,6 +238,24 @@ class Multimap < Hash
248
238
  end
249
239
  end
250
240
 
241
+ def ==(other) #:nodoc:
242
+ case other
243
+ when Multimap
244
+ @hash == other._internal_hash
245
+ else
246
+ @hash == other
247
+ end
248
+ end
249
+
250
+ def eql?(other) #:nodoc:
251
+ case other
252
+ when Multimap
253
+ @hash.eql?(other._internal_hash)
254
+ else
255
+ @hash.eql?(other)
256
+ end
257
+ end
258
+
251
259
  def freeze #:nodoc:
252
260
  each_container { |container| container.freeze }
253
261
  default.freeze
@@ -283,6 +291,21 @@ class Multimap < Hash
283
291
  invert[value]
284
292
  end
285
293
 
294
+ def delete_if(&block) #:nodoc:
295
+ @hash.delete_if(&block)
296
+ self
297
+ end
298
+
299
+ def reject(&block) #:nodoc:
300
+ dup.delete_if(&block)
301
+ end
302
+
303
+ def reject!(&block) #:nodoc:
304
+ old_size = size
305
+ delete_if(&block)
306
+ old_size == size ? nil : self
307
+ end
308
+
286
309
  # call-seq:
287
310
  # map.replace(other_map) => map
288
311
  #
@@ -295,11 +318,11 @@ class Multimap < Hash
295
318
  def replace(other)
296
319
  case other
297
320
  when Array
298
- super(self.class[self.default, *other])
321
+ @hash.replace(self.class[self.default, *other])
299
322
  when Hash
300
- super(self.class[self.default, other])
323
+ @hash.replace(self.class[self.default, other])
301
324
  when self.class
302
- super
325
+ @hash.replace(other)
303
326
  else
304
327
  raise ArgumentError
305
328
  end
@@ -333,6 +356,12 @@ class Multimap < Hash
333
356
  keys
334
357
  end
335
358
 
359
+ # Returns true if the given key is present in Multimap.
360
+ def include?(key)
361
+ keys.include?(key)
362
+ end
363
+ alias_method :member?, :include?
364
+
336
365
  # call-seq:
337
366
  # map.length => fixnum
338
367
  # map.size => fixnum
@@ -426,7 +455,7 @@ class Multimap < Hash
426
455
  # map = Multimap["a" => 100, "b" => [200, 300]]
427
456
  # map.to_hash #=> { "a" => [100], "b" => [200, 300] }
428
457
  def to_hash
429
- dup
458
+ @hash.dup
430
459
  end
431
460
 
432
461
  # call-seq:
@@ -457,11 +486,20 @@ class Multimap < Hash
457
486
  values
458
487
  end
459
488
 
489
+ # Return an array containing the values associated with the given keys.
490
+ def values_at(*keys)
491
+ @hash.values_at(*keys)
492
+ end
493
+
460
494
  protected
495
+ def _internal_hash #:nodoc:
496
+ @hash
497
+ end
498
+
461
499
  def update_container(key) #:nodoc:
462
- container = hash_aref(key)
500
+ container = @hash[key]
463
501
  container = container.dup if container.equal?(default)
464
502
  container = yield(container)
465
- hash_aset(key, container)
503
+ @hash[key] = container
466
504
  end
467
505
  end
@@ -45,7 +45,7 @@ class NestedMultimap < Multimap
45
45
  # map["a"] #=> [100, 300]
46
46
  # map["c"] #=> [300]
47
47
  def <<(value)
48
- hash_each_pair { |_, container| container << value }
48
+ @hash.each_pair { |_, container| container << value }
49
49
  self.default << value
50
50
  self
51
51
  end
@@ -59,7 +59,7 @@ class NestedMultimap < Multimap
59
59
  def [](*keys)
60
60
  i, l, r, k = 0, keys.length, self, self.class
61
61
  while r.is_a?(k)
62
- r = i < l ? r.hash_aref(keys[i]) : r.default
62
+ r = i < l ? r._internal_hash[keys[i]] : r.default
63
63
  i += 1
64
64
  end
65
65
  r
@@ -83,7 +83,7 @@ class NestedMultimap < Multimap
83
83
  # ["a", "b"] is [100, 101, 102]
84
84
  # "c" is [200]
85
85
  def each_association
86
- super do |key, container|
86
+ super() do |key, container|
87
87
  if container.respond_to?(:each_association)
88
88
  container.each_association do |nested_key, value|
89
89
  yield [key, nested_key].flatten, value
@@ -122,7 +122,7 @@ class NestedMultimap < Multimap
122
122
  end
123
123
  end
124
124
 
125
- hash_each_pair { |_, container| each_container.call(container) }
125
+ @hash.each_pair { |_, container| each_container.call(container) }
126
126
  each_container.call(default)
127
127
 
128
128
  self
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-mount
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Peek
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-23 00:00:00 -06:00
12
+ date: 2009-11-29 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency