map 5.4.0 → 5.5.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 (4) hide show
  1. data/lib/map.rb +9 -1
  2. data/map.gemspec +1 -1
  3. data/test/map_test.rb +35 -0
  4. metadata +2 -2
data/lib/map.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  class Map < Hash
3
- Version = '5.4.0' unless defined?(Version)
3
+ Version = '5.5.0' unless defined?(Version)
4
4
  Load = Kernel.method(:load) unless defined?(Load)
5
5
 
6
6
  class << Map
@@ -420,6 +420,14 @@ class Map < Hash
420
420
  self
421
421
  end
422
422
 
423
+ # See: https://github.com/rubinius/rubinius/blob/98c516820d9f78bd63f29dab7d5ec9bc8692064d/kernel/common/hash19.rb#L476-L484
424
+ def keep_if( &block )
425
+ raise RuntimeError.new( "can't modify frozen #{ self.class.name }" ) if frozen?
426
+ return to_enum( :keep_if ) unless block_given?
427
+ each { | key , val | delete key unless yield( key , val ) }
428
+ self
429
+ end
430
+
423
431
  def replace(*args)
424
432
  clear
425
433
  update(*args)
@@ -3,7 +3,7 @@
3
3
 
4
4
  Gem::Specification::new do |spec|
5
5
  spec.name = "map"
6
- spec.version = "5.4.0"
6
+ spec.version = "5.5.0"
7
7
  spec.platform = Gem::Platform::RUBY
8
8
  spec.summary = "map"
9
9
  spec.description = "description: map kicks the ass"
@@ -634,6 +634,41 @@ Testing Map do
634
634
  end
635
635
  end
636
636
 
637
+ ## Map#keep_if tests
638
+ #
639
+ # See: https://github.com/rubyspec/rubyspec/blob/ebd1ea400cb06807dbd6aa481c6c3d7a0b8fc7b4/core/hash/keep_if_spec.rb
640
+ #
641
+ # original failing test
642
+ testing 'that Map#keep_if properly removes k/v pairs for which the passed block evaluates to false' do
643
+ m = Map.new( { 1 => "hi" , 2 => "there" } )
644
+ assert{ !( m.keep_if { |k,v| k == 2 }.keys.include? 1 ) }
645
+ end
646
+
647
+ testing 'yields two arguments: key and value' do
648
+ all_args = []
649
+ m = Map.new( { 1 => 2 , 3 => 4 } )
650
+ m.keep_if { |*args| all_args << args }
651
+ assert{ all_args == [[1, 2], [3, 4]] }
652
+ end
653
+
654
+ testing 'keeps every entry for which block is true and returns self' do
655
+ m = Map.new( { :a => 1 , :b => 2 , :c => 3 , :d => 4 } )
656
+ assert{ m.keep_if { |k,v| v % 2 == 0 }.object_id == m.object_id }
657
+ assert{ m == Map.new( { :b => 2 , :d => 4 } ) }
658
+ end
659
+
660
+ testing 'it raises a RuntimeError if called on a frozen instance' do
661
+ m = Map.new( { :a => 1 } ).freeze
662
+
663
+ assert do
664
+ begin
665
+ m.keep_if { |*_| false }
666
+ rescue Object => e
667
+ e.is_a?( RuntimeError )
668
+ end
669
+ end
670
+ end
671
+
637
672
  protected
638
673
  def new_int_map(n = 1024)
639
674
  map = assert{ Map.new }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: map
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.4.0
4
+ version: 5.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-18 00:00:00.000000000 Z
12
+ date: 2012-03-29 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! 'description: map kicks the ass'
15
15
  email: ara.t.howard@gmail.com