augmented 0.0.1 → 0.1.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.
- checksums.yaml +4 -4
- data/README.md +68 -5
- data/lib/augmented/hashes/mappable.rb +17 -0
- data/lib/augmented/hashes.rb +2 -0
- data/lib/augmented/objects/iffy.rb +34 -0
- data/lib/augmented/objects/tappable.rb +19 -0
- data/lib/augmented/objects.rb +4 -0
- data/lib/augmented/procs/chainable.rb +1 -1
- data/lib/augmented/version.rb +1 -1
- data/test/augmented/hashes/mappable_test.rb +37 -0
- data/test/augmented/objects/iffy_test.rb +47 -0
- data/test/augmented/objects/pickable_test.rb +1 -1
- data/test/augmented/objects/tappable_test.rb +141 -0
- metadata +11 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: c45e4c37723b2e38793bb1476b7be8e8662b8c4a
         | 
| 4 | 
            +
              data.tar.gz: c988abdf0493e83cb1b8406af472649fe6f10d00
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 9e87a5bf8e30edfc41f7364f6b5851bccbbe15cbe1d908d4ad7471793ea4129dfb254ae3963257fc0f61c378e6c96be43be480d8d735864e3923f9c28a43e155
         | 
| 7 | 
            +
              data.tar.gz: 19b0e83ca99b904f0f69614966649e7e26c70210ca6da3862a21ded599e4e934d249b4d08c36e9c3ec71d3d785d6e3861abf5ca72b3ad5accb4368ca9eb3085c
         | 
    
        data/README.md
    CHANGED
    
    | @@ -2,7 +2,7 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            `Augmented` is a library with some core-type utility methods that I frequently find myself copying across projects. It uses refinements instead of class modification for maximum control and an easy sleep at night. 
         | 
| 4 4 |  | 
| 5 | 
            -
            Many of the methods in `Augmented` facilitate a more functional style of programming and cover a few tiny gaps in Ruby's solid functional support.
         | 
| 5 | 
            +
            Many of the methods in `Augmented` facilitate a more functional style of programming and cover a few tiny gaps in Ruby's solid functional support. See more thoughts on this [blog post](http://blog.brunze.com/2015/using-ruby-refinements-fun-flow/).
         | 
| 6 6 |  | 
| 7 7 | 
             
            ## Installation
         | 
| 8 8 |  | 
| @@ -27,18 +27,19 @@ using Augmented | |
| 27 27 | 
             
            You can load all refinements for just one type:
         | 
| 28 28 |  | 
| 29 29 | 
             
            ```ruby
         | 
| 30 | 
            -
            using Augmented:: | 
| 30 | 
            +
            using Augmented::Enumerators
         | 
| 31 31 | 
             
            using Augmented::Hashes
         | 
| 32 | 
            +
            using Augmented::Objects
         | 
| 33 | 
            +
            using Augmented::Procs
         | 
| 32 34 | 
             
            using Augmented::Symbols
         | 
| 33 | 
            -
            # etc.
         | 
| 34 35 | 
             
            ```
         | 
| 35 36 |  | 
| 36 37 | 
             
            Or you can load just the methods you need:
         | 
| 37 38 |  | 
| 38 39 | 
             
            ```ruby
         | 
| 39 40 | 
             
            using Augmented::Objects::Pickable
         | 
| 40 | 
            -
            using Augmented::Symbols::Arguable
         | 
| 41 41 | 
             
            using Augmented::Procs::Chainable
         | 
| 42 | 
            +
            using Augmented::Symbols::Arguable
         | 
| 42 43 | 
             
            # etc.
         | 
| 43 44 | 
             
            ```
         | 
| 44 45 |  | 
| @@ -49,15 +50,41 @@ using Augmented::Procs::Chainable | |
| 49 50 | 
             
            Builds an index of all elements of an enumerator according to the given criterion.
         | 
| 50 51 |  | 
| 51 52 | 
             
            ```ruby
         | 
| 53 | 
            +
            using Augmented::Enumerators::Indexing
         | 
| 54 | 
            +
             | 
| 52 55 | 
             
            ['a', 'bb', 'ccccc'].to_enum.index_by(&:length)
         | 
| 53 56 | 
             
            # {1=>"a", 2=>"bb", 5=>"ccccc"}
         | 
| 54 57 | 
             
            ```
         | 
| 55 58 |  | 
| 59 | 
            +
            ##### `Hash#map_values`
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            Returns a new hash with the same keys but transformed values.
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            ```ruby
         | 
| 64 | 
            +
            using Augmented::Hashes::Mappable
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            { aa: 11, bb: 22 }.map_values{ |i| i * 3 }
         | 
| 67 | 
            +
            # {:aa=>33, :bb=>66}
         | 
| 68 | 
            +
            ```
         | 
| 69 | 
            +
             | 
| 70 | 
            +
            ##### `Hash#map_keys`
         | 
| 71 | 
            +
             | 
| 72 | 
            +
            Returns a new hash with the same values but transformed keys.
         | 
| 73 | 
            +
             | 
| 74 | 
            +
            ```ruby
         | 
| 75 | 
            +
            using Augmented::Hashes::Mappable
         | 
| 76 | 
            +
             | 
| 77 | 
            +
            { aa: 11, bb: 22 }.map_keys{ |k| k.to_s[0] }
         | 
| 78 | 
            +
            # {"a"=>11, "b"=>22}
         | 
| 79 | 
            +
            ```
         | 
| 80 | 
            +
             | 
| 56 81 | 
             
            ##### `Hash#polymorph`
         | 
| 57 82 |  | 
| 58 | 
            -
            Creates an object from  | 
| 83 | 
            +
            Creates an object from a Hash.
         | 
| 59 84 |  | 
| 60 85 | 
             
            ```ruby
         | 
| 86 | 
            +
            using Augmented::Hashes::Polymorphable
         | 
| 87 | 
            +
             | 
| 61 88 | 
             
            class Sheep
         | 
| 62 89 | 
             
              def initialize attributes
         | 
| 63 90 | 
             
                @sound = attributes[:sound]
         | 
| @@ -77,6 +104,8 @@ end | |
| 77 104 | 
             
            Recursively applies functions to a tree of hashes.
         | 
| 78 105 |  | 
| 79 106 | 
             
            ```ruby
         | 
| 107 | 
            +
            using Augmented::Hashes::Transformable
         | 
| 108 | 
            +
             | 
| 80 109 | 
             
            tree = { lorem: 'ipsum', dolor: [ { sit: 10}, { sit: 20 } ] }
         | 
| 81 110 | 
             
            triple =  -> i { i * 3 }
         | 
| 82 111 |  | 
| @@ -84,11 +113,24 @@ tree.transform({ lorem: :upcase, dolor: { sit: triple } }) | |
| 84 113 | 
             
            # {:lorem=>"IPSUM", :dolor=>[{:sit=>30}, {:sit=>60}]}
         | 
| 85 114 | 
             
            ```
         | 
| 86 115 |  | 
| 116 | 
            +
            ##### `Object#if`, `Object#else`
         | 
| 117 | 
            +
             | 
| 118 | 
            +
            Allows you to conditionally return an object, increasing readability in some situations.
         | 
| 119 | 
            +
             | 
| 120 | 
            +
            ```ruby
         | 
| 121 | 
            +
            using Augmented::Objects::Iffy
         | 
| 122 | 
            +
             | 
| 123 | 
            +
            Person.new.eat toast.if(toast.buttered?).else(muffin)
         | 
| 124 | 
            +
            Person.new.eat toast.if(&:buttered?).else(muffin)
         | 
| 125 | 
            +
            ```
         | 
| 126 | 
            +
             | 
| 87 127 | 
             
            ##### `Object#pick`
         | 
| 88 128 |  | 
| 89 129 | 
             
            Calls a bunch of methods on an object and collects the results.
         | 
| 90 130 |  | 
| 91 131 | 
             
            ```ruby
         | 
| 132 | 
            +
            using Augmented::Objects::Pickable
         | 
| 133 | 
            +
             | 
| 92 134 | 
             
            class MyThing
         | 
| 93 135 | 
             
              def lorem; 'hello'; end
         | 
| 94 136 | 
             
              def ipsum; 'cruel'; end
         | 
| @@ -104,15 +146,30 @@ MyThing.new.pick :lorem, :dolor | |
| 104 146 | 
             
            Appends a bunch of singleton methods to an object.
         | 
| 105 147 |  | 
| 106 148 | 
             
            ```ruby
         | 
| 149 | 
            +
            using Augmented::Objects::Tackable
         | 
| 150 | 
            +
             | 
| 107 151 | 
             
            Object.new.tack(id: 11, greet: -> { puts "hello I'm #{id}" }).greet
         | 
| 108 152 | 
             
            # hello I'm 11
         | 
| 109 153 | 
             
            ```
         | 
| 110 154 |  | 
| 155 | 
            +
            ##### `Object#tap_if`, `Object#tap_unless`
         | 
| 156 | 
            +
             | 
| 157 | 
            +
            Like [`tap`](http://ruby-doc.org/core-2.2.3/Object.html#method-i-tap) but only executes the block according to the condition.
         | 
| 158 | 
            +
             | 
| 159 | 
            +
            ```ruby
         | 
| 160 | 
            +
            using Augmented::Objects::Tappable
         | 
| 161 | 
            +
             | 
| 162 | 
            +
            toast.tap_if(toast.warm?){ |toast| toast.butter }.eat
         | 
| 163 | 
            +
            toast.tap_if(:warm?.to_proc){ |toast| toast.butter }.eat
         | 
| 164 | 
            +
            ```
         | 
| 165 | 
            +
             | 
| 111 166 | 
             
            ##### `Object#thru`
         | 
| 112 167 |  | 
| 113 168 | 
             
            Applies a function to an object and returns the result.
         | 
| 114 169 |  | 
| 115 170 | 
             
            ```ruby
         | 
| 171 | 
            +
            using Augmented::Objects::Thru
         | 
| 172 | 
            +
             | 
| 116 173 | 
             
            filter_words = -> s { s.gsub(/bad/, '').squeeze(' ').strip }
         | 
| 117 174 |  | 
| 118 175 | 
             
            'BAD WORDS, BAD WORDS'.downcase.thru(&filter_words).capitalize
         | 
| @@ -124,6 +181,8 @@ filter_words = -> s { s.gsub(/bad/, '').squeeze(' ').strip } | |
| 124 181 | 
             
            Chains several procs together so they execute from left to right.
         | 
| 125 182 |  | 
| 126 183 | 
             
            ```ruby
         | 
| 184 | 
            +
            using Augmented::Procs::Chainable
         | 
| 185 | 
            +
             | 
| 127 186 | 
             
            sub_two = -> i { i - 2 }
         | 
| 128 187 | 
             
            triple = -> i { i * 3 }
         | 
| 129 188 | 
             
            add_twenty = -> i { i + 20 }
         | 
| @@ -137,6 +196,8 @@ add_twenty = -> i { i + 20 } | |
| 137 196 | 
             
            Like [`Symbol#to_proc`](http://ruby-doc.org/core-2.3.0/Symbol.html#method-i-to_proc) but allows you to pass some arguments along.
         | 
| 138 197 |  | 
| 139 198 | 
             
            ```ruby
         | 
| 199 | 
            +
            using Augmented::Symbols::Arguable
         | 
| 200 | 
            +
             | 
| 140 201 | 
             
            class Eleven
         | 
| 141 202 | 
             
              def add_many *others
         | 
| 142 203 | 
             
                11 + others.reduce(0, :+)
         | 
| @@ -152,6 +213,8 @@ end | |
| 152 213 | 
             
            Creates functions that compare an object's attribute.
         | 
| 153 214 |  | 
| 154 215 | 
             
            ```ruby
         | 
| 216 | 
            +
            using Augmented::Symbols::Comparing
         | 
| 217 | 
            +
             | 
| 155 218 | 
             
            class User
         | 
| 156 219 | 
             
              def initialize name
         | 
| 157 220 | 
             
                @name = name
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            module Augmented
         | 
| 2 | 
            +
              module Hashes
         | 
| 3 | 
            +
                module Mappable
         | 
| 4 | 
            +
                  refine Hash do
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                    def map_values
         | 
| 7 | 
            +
                      self.each_with_object({}){ |(key, value), result| result[key] = yield value, key, self }
         | 
| 8 | 
            +
                    end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                    def map_keys
         | 
| 11 | 
            +
                      self.each_with_object({}){ |(key, value), result| result[yield key, value, self] = value }
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
            end
         | 
    
        data/lib/augmented/hashes.rb
    CHANGED
    
    
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            module Augmented
         | 
| 2 | 
            +
              module Objects
         | 
| 3 | 
            +
                module Iffy
         | 
| 4 | 
            +
                  refine Object do
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                    def if condition = self
         | 
| 7 | 
            +
                      self if (block_given? ? yield(self) : condition)
         | 
| 8 | 
            +
                    end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                    def else *_
         | 
| 11 | 
            +
                      self
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  refine NilClass do
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    def else alternative
         | 
| 19 | 
            +
                      alternative
         | 
| 20 | 
            +
                    end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  refine FalseClass do
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    def else alternative
         | 
| 27 | 
            +
                      alternative
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            module Augmented
         | 
| 2 | 
            +
              module Objects
         | 
| 3 | 
            +
                module Tappable
         | 
| 4 | 
            +
                  refine Object do
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                    def tap_if condition, &block
         | 
| 7 | 
            +
                      do_tap = condition.respond_to?(:call) ? condition.call(self) : condition
         | 
| 8 | 
            +
                      do_tap ? self.tap(&block) : self
         | 
| 9 | 
            +
                    end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                    def tap_unless condition, &block
         | 
| 12 | 
            +
                      skip_tap = condition.respond_to?(:call) ? condition.call(self) : condition
         | 
| 13 | 
            +
                      skip_tap ? self : self.tap(&block)
         | 
| 14 | 
            +
                    end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
            end
         | 
    
        data/lib/augmented/objects.rb
    CHANGED
    
    | @@ -1,11 +1,15 @@ | |
| 1 | 
            +
            require 'augmented/objects/iffy'
         | 
| 1 2 | 
             
            require 'augmented/objects/pickable'
         | 
| 2 3 | 
             
            require 'augmented/objects/tackable'
         | 
| 4 | 
            +
            require 'augmented/objects/tappable'
         | 
| 3 5 | 
             
            require 'augmented/objects/thru'
         | 
| 4 6 |  | 
| 5 7 | 
             
            module Augmented
         | 
| 6 8 | 
             
              module Objects
         | 
| 9 | 
            +
                include Iffy
         | 
| 7 10 | 
             
                include Pickable
         | 
| 8 11 | 
             
                include Tackable
         | 
| 12 | 
            +
                include Tappable
         | 
| 9 13 | 
             
                include Thru
         | 
| 10 14 | 
             
              end
         | 
| 11 15 | 
             
            end
         | 
    
        data/lib/augmented/version.rb
    CHANGED
    
    
| @@ -0,0 +1,37 @@ | |
| 1 | 
            +
            require 'minitest/autorun'
         | 
| 2 | 
            +
            require 'augmented/hashes/mappable'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe Augmented::Hashes::Mappable do
         | 
| 5 | 
            +
              using Augmented::Hashes::Mappable
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              describe '#map_values' do
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                it 'returns a new hash with the same keys but transformed values' do
         | 
| 10 | 
            +
                  { aa: 11, bb: 22 }.map_values{ |i| i * 3 }.must_equal({ aa: 33, bb: 66 })
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                it 'also provides the key and hash to the tranformer function as additional arguments' do
         | 
| 14 | 
            +
                  hash = { aa: 11, bb: 22 }
         | 
| 15 | 
            +
                  result = hash.map_values{ |i, key, h| [key, h.object_id] }
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  result.values.must_equal [[:aa, hash.object_id], [:bb, hash.object_id]]
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              describe '#map_keys' do
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                it 'returns a new hash with the same values but transformed keys' do
         | 
| 25 | 
            +
                  { aa: 11, bb: 22 }.map_keys{ |k| k.to_s[0] }.must_equal({ 'a' => 11, 'b' => 22 })
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                it 'also provides the value and hash to the tranformer function as additional arguments' do
         | 
| 29 | 
            +
                  hash = { aa: 11, bb: 22 }
         | 
| 30 | 
            +
                  result = hash.map_keys{ |k, value, h| [value, h.object_id] }
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  result.keys.must_equal [[11, hash.object_id], [22, hash.object_id]]
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            end
         | 
| @@ -0,0 +1,47 @@ | |
| 1 | 
            +
            require 'minitest/autorun'
         | 
| 2 | 
            +
            require 'augmented/objects/iffy'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe Augmented::Objects::Iffy do
         | 
| 5 | 
            +
              using Augmented::Objects::Iffy
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              describe '#if' do
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                it 'returns the object if the condition evaluates to truish' do
         | 
| 10 | 
            +
                  subject = 'abc'
         | 
| 11 | 
            +
                  condition = -> subj { subj.length == 3 }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  subject.if(true).must_be_same_as subject
         | 
| 14 | 
            +
                  subject.if(Object.new).must_be_same_as subject
         | 
| 15 | 
            +
                  subject.if(&condition).must_be_same_as subject
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                it 'returns nil if the condition evaluates to falsy' do
         | 
| 19 | 
            +
                  subject = 'abc'
         | 
| 20 | 
            +
                  condition = -> subj { subj.length == 0 }
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  subject.if(false).must_be_same_as nil
         | 
| 23 | 
            +
                  subject.if(nil).must_be_same_as nil
         | 
| 24 | 
            +
                  subject.if(&condition).must_be_same_as nil
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              describe '#else' do
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                it 'returns the alternative if the object is falsy' do
         | 
| 32 | 
            +
                  alternative = Object.new
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  false.else(alternative).must_be_same_as alternative
         | 
| 35 | 
            +
                  nil.else(alternative).must_be_same_as alternative
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                it 'returns the object if the object is truish' do
         | 
| 39 | 
            +
                  subject = Object.new
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  true.else(123).must_be_same_as true
         | 
| 42 | 
            +
                  subject.else(123).must_be_same_as subject
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            end
         | 
| @@ -7,7 +7,7 @@ describe Augmented::Objects::Pickable do | |
| 7 7 |  | 
| 8 8 | 
             
              describe '#pick' do
         | 
| 9 9 |  | 
| 10 | 
            -
                it 'returns  | 
| 10 | 
            +
                it 'returns a hash with the results of invoking the list of picks in the target' do
         | 
| 11 11 | 
             
                  target = OpenStruct.new aaa: 111, bbb: 222, ccc: 333
         | 
| 12 12 |  | 
| 13 13 | 
             
                  target.pick(:aaa, :ccc).must_equal({ aaa: 111, ccc: 333 })
         | 
| @@ -0,0 +1,141 @@ | |
| 1 | 
            +
            require 'minitest/autorun'
         | 
| 2 | 
            +
            require 'augmented/objects/tappable'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe Augmented::Objects::Tappable do
         | 
| 5 | 
            +
              using Augmented::Objects::Tappable
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              describe '#tap_if' do
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                it 'executes block if condition is truish' do
         | 
| 10 | 
            +
                  subject = 'abc'
         | 
| 11 | 
            +
                  test = nil
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  subject.tap_if(true) { |subj| test = subj.upcase }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  test.must_equal 'ABC'
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  subject.tap_if(Object.new) { |subj| test = subj.reverse }
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  test.must_equal 'cba'
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                it 'does not execute block if condition is falsy' do
         | 
| 23 | 
            +
                  subject = 'abc'
         | 
| 24 | 
            +
                  test = nil
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  subject.tap_if(false) { |subj| test = subj.upcase }
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  test.must_equal nil
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  subject.tap_if(nil) { |subj| test = subj.upcase }
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  test.must_equal nil
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                it 'executes block if condition evaluates to truish' do
         | 
| 36 | 
            +
                  subject = 'abc'
         | 
| 37 | 
            +
                  test = nil
         | 
| 38 | 
            +
                  condition_1 = -> subj { subj.length == 3 }
         | 
| 39 | 
            +
                  condition_2 = -> subj { subj.length }
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  subject.tap_if(condition_1) { |subj| test = subj.upcase }
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  test.must_equal 'ABC'
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                  subject.tap_if(condition_2) { |subj| test = subj.reverse }
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  test.must_equal 'cba'
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                it 'does not execute block if condition evaluates to falsy' do
         | 
| 51 | 
            +
                  subject = 'abc'
         | 
| 52 | 
            +
                  test = nil
         | 
| 53 | 
            +
                  condition_1 = -> subj { subj.length == 0 }
         | 
| 54 | 
            +
                  condition_2 = -> subj { nil }
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                  subject.tap_if(condition_1) { |subj| test = subj.upcase }
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  test.must_equal nil
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  subject.tap_if(condition_2) { |subj| test = subj.upcase }
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  test.must_equal nil
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                it 'always returns the object' do
         | 
| 66 | 
            +
                  subject = 'abc'
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                  subject.tap_if(true){}.must_be_same_as subject
         | 
| 69 | 
            +
                  subject.tap_if(false){}.must_be_same_as subject
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
              describe '#tap_unless' do
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                it 'executes block if condition is falsy' do
         | 
| 77 | 
            +
                  subject = 'abc'
         | 
| 78 | 
            +
                  test = nil
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                  subject.tap_unless(false) { |subj| test = subj.upcase }
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                  test.must_equal 'ABC'
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                  subject.tap_unless(nil) { |subj| test = subj.reverse }
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                  test.must_equal 'cba'
         | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                it 'does not execute block if condition is truish' do
         | 
| 90 | 
            +
                  subject = 'abc'
         | 
| 91 | 
            +
                  test = nil
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                  subject.tap_unless(true) { |subj| test = subj.upcase }
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                  test.must_equal nil
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                  subject.tap_unless(Object.new) { |subj| test = subj.upcase }
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                  test.must_equal nil
         | 
| 100 | 
            +
                end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                it 'executes block if condition evaluates to falsy' do
         | 
| 103 | 
            +
                  subject = 'abc'
         | 
| 104 | 
            +
                  test = nil
         | 
| 105 | 
            +
                  condition_1 = -> subj { subj.length == 0 }
         | 
| 106 | 
            +
                  condition_2 = -> subj { nil }
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                  subject.tap_unless(condition_1) { |subj| test = subj.upcase }
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                  test.must_equal 'ABC'
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                  subject.tap_unless(condition_2) { |subj| test = subj.reverse }
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                  test.must_equal 'cba'
         | 
| 115 | 
            +
                end
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                it 'does not execute block if condition evaluates to truish' do
         | 
| 118 | 
            +
                  subject = 'abc'
         | 
| 119 | 
            +
                  test = nil
         | 
| 120 | 
            +
                  condition_1 = -> subj { subj.length == 3 }
         | 
| 121 | 
            +
                  condition_2 = -> subj { subj.length }
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                  subject.tap_unless(condition_1) { |subj| test = subj.upcase }
         | 
| 124 | 
            +
             | 
| 125 | 
            +
                  test.must_equal nil
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                  subject.tap_unless(condition_2) { |subj| test = subj.upcase }
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                  test.must_equal nil
         | 
| 130 | 
            +
                end
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                it 'always returns the object' do
         | 
| 133 | 
            +
                  subject = 'abc'
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                  subject.tap_unless(true){}.must_be_same_as subject
         | 
| 136 | 
            +
                  subject.tap_unless(false){}.must_be_same_as subject
         | 
| 137 | 
            +
                end
         | 
| 138 | 
            +
             | 
| 139 | 
            +
              end
         | 
| 140 | 
            +
             | 
| 141 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: augmented
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0 | 
| 4 | 
            +
              version: 0.1.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - bruno
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2016- | 
| 11 | 
            +
            date: 2016-03-05 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -56,11 +56,14 @@ files: | |
| 56 56 | 
             
            - lib/augmented/enumerators.rb
         | 
| 57 57 | 
             
            - lib/augmented/enumerators/indexing.rb
         | 
| 58 58 | 
             
            - lib/augmented/hashes.rb
         | 
| 59 | 
            +
            - lib/augmented/hashes/mappable.rb
         | 
| 59 60 | 
             
            - lib/augmented/hashes/polymorphable.rb
         | 
| 60 61 | 
             
            - lib/augmented/hashes/transformable.rb
         | 
| 61 62 | 
             
            - lib/augmented/objects.rb
         | 
| 63 | 
            +
            - lib/augmented/objects/iffy.rb
         | 
| 62 64 | 
             
            - lib/augmented/objects/pickable.rb
         | 
| 63 65 | 
             
            - lib/augmented/objects/tackable.rb
         | 
| 66 | 
            +
            - lib/augmented/objects/tappable.rb
         | 
| 64 67 | 
             
            - lib/augmented/objects/thru.rb
         | 
| 65 68 | 
             
            - lib/augmented/procs.rb
         | 
| 66 69 | 
             
            - lib/augmented/procs/chainable.rb
         | 
| @@ -69,10 +72,13 @@ files: | |
| 69 72 | 
             
            - lib/augmented/symbols/comparing.rb
         | 
| 70 73 | 
             
            - lib/augmented/version.rb
         | 
| 71 74 | 
             
            - test/augmented/enumerators/indexing_test.rb
         | 
| 75 | 
            +
            - test/augmented/hashes/mappable_test.rb
         | 
| 72 76 | 
             
            - test/augmented/hashes/polymorphable_test.rb
         | 
| 73 77 | 
             
            - test/augmented/hashes/transformable_test.rb
         | 
| 78 | 
            +
            - test/augmented/objects/iffy_test.rb
         | 
| 74 79 | 
             
            - test/augmented/objects/pickable_test.rb
         | 
| 75 80 | 
             
            - test/augmented/objects/tackable_test.rb
         | 
| 81 | 
            +
            - test/augmented/objects/tappable_test.rb
         | 
| 76 82 | 
             
            - test/augmented/objects/thru_test.rb
         | 
| 77 83 | 
             
            - test/augmented/procs/chainable_test.rb
         | 
| 78 84 | 
             
            - test/augmented/symbols/arguable_test.rb
         | 
| @@ -103,10 +109,13 @@ specification_version: 4 | |
| 103 109 | 
             
            summary: Useful extra methods for some Ruby core types.
         | 
| 104 110 | 
             
            test_files:
         | 
| 105 111 | 
             
            - test/augmented/enumerators/indexing_test.rb
         | 
| 112 | 
            +
            - test/augmented/hashes/mappable_test.rb
         | 
| 106 113 | 
             
            - test/augmented/hashes/polymorphable_test.rb
         | 
| 107 114 | 
             
            - test/augmented/hashes/transformable_test.rb
         | 
| 115 | 
            +
            - test/augmented/objects/iffy_test.rb
         | 
| 108 116 | 
             
            - test/augmented/objects/pickable_test.rb
         | 
| 109 117 | 
             
            - test/augmented/objects/tackable_test.rb
         | 
| 118 | 
            +
            - test/augmented/objects/tappable_test.rb
         | 
| 110 119 | 
             
            - test/augmented/objects/thru_test.rb
         | 
| 111 120 | 
             
            - test/augmented/procs/chainable_test.rb
         | 
| 112 121 | 
             
            - test/augmented/symbols/arguable_test.rb
         |