monetize 1.1.0 → 1.2.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/CHANGELOG.md +1 -0
- data/CONTRIBUTING.md +8 -5
- data/README.md +19 -10
- data/Rakefile +5 -0
- data/lib/collection.rb +58 -0
- data/lib/monetize.rb +8 -1
- data/lib/monetize/core_extensions.rb +2 -0
- data/lib/monetize/core_extensions/hash.rb +7 -0
- data/lib/monetize/core_extensions/nil_class.rb +5 -0
- data/lib/monetize/version.rb +1 -1
- data/spec/core_extensions_spec.rb +47 -1
- data/spec/monetize_spec.rb +37 -0
- metadata +5 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 0da3f5e2bea465f09b1722aeedb65d9d0ff40b65
         | 
| 4 | 
            +
              data.tar.gz: 1dc558e00ac98b0dce9900ff9f4b1d4a1fc25366
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: d56c2152a81bea83158da6cc4021b3668ef60a2396058dfdb11f5bce250467d54ee8c8fe193ccc0e114b96c88fa761879f7285072b9255b3b5b45db08b4c1022
         | 
| 7 | 
            +
              data.tar.gz: 9553d4f65cfad911f9abf46b8d94b4be771981cbdcefd6098b71e06da4b3b143b75cefc52b8ed48e85e5275eab9094b87e5e4b26d86ae3d44349c7b8c8900361
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    
    
        data/CONTRIBUTING.md
    CHANGED
    
    | @@ -5,13 +5,16 @@ | |
| 5 5 | 
             
            1. Fork [the repo](https://github.com/RubyMoney/monetize)
         | 
| 6 6 | 
             
            2. Grab dependencies: `bundle install`
         | 
| 7 7 | 
             
            3. Make sure everything is working: `bundle exec rspec spec`
         | 
| 8 | 
            -
            4.  | 
| 9 | 
            -
            5.  | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 8 | 
            +
            4. Create your feature branch (`git checkout -b my-new-feature`)
         | 
| 9 | 
            +
            5. Make your changes
         | 
| 10 | 
            +
            6. Test your changes
         | 
| 11 | 
            +
            7. Commit your changes (`git commit -am 'Add some feature'`)
         | 
| 12 | 
            +
            8. Push to the branch (`git push origin my-new-feature`)
         | 
| 13 | 
            +
            9. Create a Pull Request
         | 
| 14 | 
            +
            10. Celebrate!!!!!
         | 
| 12 15 |  | 
| 13 16 | 
             
            ## Notes
         | 
| 14 17 |  | 
| 15 | 
            -
            When contributing, please make sure to update the CHANGELOG when you submit
         | 
| 18 | 
            +
            When contributing, please make sure to update the [CHANGELOG.md](CHANGELOG.md) when you submit
         | 
| 16 19 | 
             
            your pull request. Upon merging of your first pull request, you will be
         | 
| 17 20 | 
             
            given commit access to the repository.
         | 
    
        data/README.md
    CHANGED
    
    | @@ -26,25 +26,34 @@ Or install it yourself as: | |
| 26 26 | 
             
            ## Usage
         | 
| 27 27 |  | 
| 28 28 | 
             
            ```ruby
         | 
| 29 | 
            -
            Monetize.parse(" | 
| 30 | 
            -
            Monetize.parse(" | 
| 31 | 
            -
            Monetize.parse(" | 
| 29 | 
            +
            Monetize.parse("USD 100") == Money.new(100_00, "USD")
         | 
| 30 | 
            +
            Monetize.parse("EUR 100") == Money.new(100_00, "EUR")
         | 
| 31 | 
            +
            Monetize.parse("GBP 100") == Money.new(100_00, "GBP")
         | 
| 32 32 |  | 
| 33 33 | 
             
            "100".to_money == Money.new(100_00, "USD")
         | 
| 34 34 | 
             
            ```
         | 
| 35 35 |  | 
| 36 | 
            -
            Optionally, enable the ability to assume the currency from a passed symbol.
         | 
| 36 | 
            +
            Optionally, enable the ability to assume the currency from a passed symbol. Otherwise, currency symbols will be ignored, and USD used as the default currency:
         | 
| 37 37 |  | 
| 38 38 | 
             
            ```ruby
         | 
| 39 | 
            +
            Monetize.parse("£100") == Money.new(100_00, "USD")
         | 
| 40 | 
            +
             | 
| 39 41 | 
             
            Monetize.assume_from_symbol = true
         | 
| 40 42 |  | 
| 41 | 
            -
            " | 
| 43 | 
            +
            Monetize.parse("£100") == Money.new(100_00, "GBP")
         | 
| 44 | 
            +
            "€100".to_money == Money.new(100_00, "EUR")
         | 
| 45 | 
            +
            ```
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            Monetize can also parse a list of values, returning an array-like object ([Monetize::Collection](lib/collection.rb)):
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            ```ruby
         | 
| 50 | 
            +
            Monetize.parse_collection("€80/$100") == [Money.new(80_00, "EUR"), Money.new(100_00, "USD")]
         | 
| 51 | 
            +
            Monetize.parse_collection("€80, $100") == [Money.new(80_00, "EUR"), Money.new(100_00, "USD")]
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            # The #range? method detects the presence of a hyphen
         | 
| 54 | 
            +
            Monetize.parse_collection("€80-$100").range? == true
         | 
| 42 55 | 
             
            ```
         | 
| 43 56 |  | 
| 44 57 | 
             
            ## Contributing
         | 
| 45 58 |  | 
| 46 | 
            -
             | 
| 47 | 
            -
            2. Create your feature branch (`git checkout -b my-new-feature`)
         | 
| 48 | 
            -
            3. Commit your changes (`git commit -am 'Add some feature'`)
         | 
| 49 | 
            -
            4. Push to the branch (`git push origin my-new-feature`)
         | 
| 50 | 
            -
            5. Create new Pull Request
         | 
| 59 | 
            +
            See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
         | 
    
        data/Rakefile
    CHANGED
    
    
    
        data/lib/collection.rb
    ADDED
    
    | @@ -0,0 +1,58 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'monetize'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Monetize
         | 
| 6 | 
            +
              class Collection
         | 
| 7 | 
            +
                extend Forwardable
         | 
| 8 | 
            +
                include Enumerable
         | 
| 9 | 
            +
                def_delegators :@list, :[], :each, :last
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                attr_reader :input, :currency, :options
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def self.parse(input, currency = Money.default_currency, options = {})
         | 
| 14 | 
            +
                  new(input, currency, options).parse
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def initialize(input, currency = Money.default_currency, options = {})
         | 
| 18 | 
            +
                  if input.respond_to? :strip
         | 
| 19 | 
            +
                    @input = input.clone.strip
         | 
| 20 | 
            +
                  else
         | 
| 21 | 
            +
                    raise ArgumentError 'Input must be a string'
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  @currency = currency
         | 
| 25 | 
            +
                  @options = options
         | 
| 26 | 
            +
                  @list = []
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                def parse
         | 
| 30 | 
            +
                  if range?
         | 
| 31 | 
            +
                    @list = split_range.map { |fragment| Monetize.parse(fragment, currency, options) }
         | 
| 32 | 
            +
                  else
         | 
| 33 | 
            +
                    @list = split_list.map { |fragment| Monetize.parse(fragment, currency, options) }
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  self
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                def range?
         | 
| 40 | 
            +
                  RANGE_SPLIT =~ input
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                private
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                LIST_SPLIT = %r{[/,]}
         | 
| 46 | 
            +
                RANGE_SPLIT = /-/
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                def split_list
         | 
| 49 | 
            +
                  Array @input.split(LIST_SPLIT)
         | 
| 50 | 
            +
                    .map(&:strip)
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                def split_range
         | 
| 54 | 
            +
                  Array @input.split(RANGE_SPLIT)
         | 
| 55 | 
            +
                    .map(&:strip)
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
              end
         | 
| 58 | 
            +
            end
         | 
    
        data/lib/monetize.rb
    CHANGED
    
    | @@ -3,6 +3,7 @@ | |
| 3 3 | 
             
            require "money"
         | 
| 4 4 | 
             
            require "monetize/core_extensions"
         | 
| 5 5 | 
             
            require "monetize/version"
         | 
| 6 | 
            +
            require "collection"
         | 
| 6 7 |  | 
| 7 8 | 
             
            module Monetize
         | 
| 8 9 |  | 
| @@ -11,7 +12,9 @@ module Monetize | |
| 11 12 | 
             
                "€"    => "EUR",
         | 
| 12 13 | 
             
                "£"    => "GBP",
         | 
| 13 14 | 
             
                "R$"   => "BRL",
         | 
| 14 | 
            -
                "R"    => "ZAR"
         | 
| 15 | 
            +
                "R"    => "ZAR",
         | 
| 16 | 
            +
                "¥"    => "JPY",
         | 
| 17 | 
            +
                "C$"   => "CAD"
         | 
| 15 18 | 
             
              }
         | 
| 16 19 |  | 
| 17 20 | 
             
              # Class methods
         | 
| @@ -37,6 +40,10 @@ module Monetize | |
| 37 40 | 
             
                Money.new(fractional, currency)
         | 
| 38 41 | 
             
              end
         | 
| 39 42 |  | 
| 43 | 
            +
              def self.parse_collection(input, currency = Money.default_currency, options = {})
         | 
| 44 | 
            +
                Collection.parse(input, currency, options)
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
             | 
| 40 47 | 
             
              def self.from_string(value, currency = Money.default_currency)
         | 
| 41 48 | 
             
                value = BigDecimal.new(value.to_s)
         | 
| 42 49 | 
             
                from_bigdecimal(value, currency)
         | 
    
        data/lib/monetize/version.rb
    CHANGED
    
    
| @@ -5,6 +5,21 @@ require "monetize" | |
| 5 5 | 
             
            require "monetize/core_extensions"
         | 
| 6 6 |  | 
| 7 7 | 
             
            describe Monetize, "core extensions" do
         | 
| 8 | 
            +
              describe NilClass do
         | 
| 9 | 
            +
                describe "#to_money" do
         | 
| 10 | 
            +
                  it "work as documented" do
         | 
| 11 | 
            +
                    money = nil.to_money
         | 
| 12 | 
            +
                    expect(money.cents).to eq 0
         | 
| 13 | 
            +
                    expect(money.currency).to eq Money.default_currency
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  it "accepts optional currency" do
         | 
| 17 | 
            +
                    expect(nil.to_money('USD')).to eq Money.new(nil, 'USD')
         | 
| 18 | 
            +
                    expect(nil.to_money('EUR')).to eq Money.new(nil, 'EUR')
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
             | 
| 8 23 | 
             
              describe Numeric do
         | 
| 9 24 | 
             
                describe "#to_money" do
         | 
| 10 25 | 
             
                  it "work as documented" do
         | 
| @@ -142,6 +157,38 @@ describe Monetize, "core extensions" do | |
| 142 157 | 
             
                end
         | 
| 143 158 | 
             
              end
         | 
| 144 159 |  | 
| 160 | 
            +
              describe Hash do
         | 
| 161 | 
            +
                describe "#to_money" do
         | 
| 162 | 
            +
             | 
| 163 | 
            +
                  context "when currency is present in hash" do
         | 
| 164 | 
            +
                    subject(:hash){ { cents: 5, currency: "EUR" } }
         | 
| 165 | 
            +
             | 
| 166 | 
            +
                    it "converts Hash to Money using key from hash" do
         | 
| 167 | 
            +
                      expect(hash.to_money).to eq(Money.new(5, "EUR"))
         | 
| 168 | 
            +
                    end
         | 
| 169 | 
            +
                  end
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                  context "when currency is passed as argument" do
         | 
| 172 | 
            +
                    subject(:hash){ { cents: 10 } }
         | 
| 173 | 
            +
             | 
| 174 | 
            +
                    it "converts Hash to Money using passed currency argument" do
         | 
| 175 | 
            +
                      expect(hash.to_money("JPY")).to eq(Money.new(10, "JPY"))
         | 
| 176 | 
            +
                    end
         | 
| 177 | 
            +
                  end
         | 
| 178 | 
            +
             | 
| 179 | 
            +
                  context "when no currency is passed" do
         | 
| 180 | 
            +
                    subject(:hash){ { cents: 123 } }
         | 
| 181 | 
            +
             | 
| 182 | 
            +
                    before { allow(Money).to receive(:default_currency).and_return("USD") }
         | 
| 183 | 
            +
             | 
| 184 | 
            +
                    it "converts Hash to Money using default value" do
         | 
| 185 | 
            +
                      expect(hash.to_money("USD")).to eq(Money.new(123, "USD"))
         | 
| 186 | 
            +
                    end
         | 
| 187 | 
            +
                  end
         | 
| 188 | 
            +
             | 
| 189 | 
            +
                end
         | 
| 190 | 
            +
              end
         | 
| 191 | 
            +
             | 
| 145 192 | 
             
              describe Symbol do
         | 
| 146 193 | 
             
                describe "#to_currency" do
         | 
| 147 194 | 
             
                  it "converts Symbol to Currency" do
         | 
| @@ -159,5 +206,4 @@ describe Monetize, "core extensions" do | |
| 159 206 | 
             
                  end
         | 
| 160 207 | 
             
                end
         | 
| 161 208 | 
             
              end
         | 
| 162 | 
            -
             | 
| 163 209 | 
             
            end
         | 
    
        data/spec/monetize_spec.rb
    CHANGED
    
    | @@ -50,6 +50,14 @@ describe Monetize do | |
| 50 50 | 
             
                      expect(Monetize.parse("R$R9.99")).to eq Money.new(999, 'BRL')
         | 
| 51 51 | 
             
                    end
         | 
| 52 52 |  | 
| 53 | 
            +
                    it "parses formatted inputs with Japanese Yen passed as a symbol" do
         | 
| 54 | 
            +
                      expect(Monetize.parse("¥999")).to eq Money.new(999, 'JPY')
         | 
| 55 | 
            +
                    end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                    it "parses formatted inputs with Canadian Dollar passed as a symbol" do
         | 
| 58 | 
            +
                      expect(Monetize.parse("C$9.99")).to eq Money.new(999, 'CAD')
         | 
| 59 | 
            +
                    end
         | 
| 60 | 
            +
             | 
| 53 61 | 
             
                    it 'should assume default currency if not a recognised symbol' do
         | 
| 54 62 | 
             
                      expect(Monetize.parse("L9.99")).to eq Money.new(999, 'USD')
         | 
| 55 63 | 
             
                    end
         | 
| @@ -62,12 +70,17 @@ describe Monetize do | |
| 62 70 | 
             
                      expect(Monetize.parse("-€9.99")).to eq Money.new(-999, 'EUR')
         | 
| 63 71 | 
             
                      expect(Monetize.parse("-£9.99")).to eq Money.new(-999, 'GBP')
         | 
| 64 72 | 
             
                      expect(Monetize.parse("-R$R9.99")).to eq Money.new(-999, 'BRL')
         | 
| 73 | 
            +
                      expect(Monetize.parse("-¥999")).to eq Money.new(-999, 'JPY')
         | 
| 74 | 
            +
                      expect(Monetize.parse("-C$9.99")).to eq Money.new(-999, 'CAD')
         | 
| 65 75 | 
             
                    end
         | 
| 66 76 |  | 
| 67 77 | 
             
                    it 'parses formatted inputs with plus and GBP passed as symbol' do
         | 
| 68 78 | 
             
                      expect(Monetize.parse("+€9.99")).to eq Money.new(999, 'EUR')
         | 
| 69 79 | 
             
                      expect(Monetize.parse("+£9.99")).to eq Money.new(999, 'GBP')
         | 
| 70 80 | 
             
                      expect(Monetize.parse("+R$R9.99")).to eq Money.new(999, 'BRL')
         | 
| 81 | 
            +
                      expect(Monetize.parse("+¥999")).to eq Money.new(999, 'JPY')
         | 
| 82 | 
            +
                      expect(Monetize.parse("+C$9.99")).to eq Money.new(999, 'CAD')
         | 
| 83 | 
            +
             | 
| 71 84 | 
             
                    end
         | 
| 72 85 |  | 
| 73 86 | 
             
                    it 'parses formatted inputs with currency symbol and postfix minus sign' do
         | 
| @@ -208,6 +221,30 @@ describe Monetize do | |
| 208 221 | 
             
                end
         | 
| 209 222 | 
             
              end
         | 
| 210 223 |  | 
| 224 | 
            +
              describe ".parse_collection" do
         | 
| 225 | 
            +
                it "parses into a Money::Collection" do
         | 
| 226 | 
            +
                  expect(Monetize.parse_collection("$7")).to be_a Monetize::Collection
         | 
| 227 | 
            +
                end
         | 
| 228 | 
            +
             | 
| 229 | 
            +
                it "parses comma separated values" do
         | 
| 230 | 
            +
                  collection = Monetize.parse_collection("$5, $7")
         | 
| 231 | 
            +
                  expect(collection.first).to eq Monetize.parse("$5")
         | 
| 232 | 
            +
                  expect(collection.last).to eq Monetize.parse("$7")
         | 
| 233 | 
            +
                end
         | 
| 234 | 
            +
             | 
| 235 | 
            +
                it "parses slash separated values" do
         | 
| 236 | 
            +
                  collection = Monetize.parse_collection("£4.50/€6")
         | 
| 237 | 
            +
                  expect(collection.first).to eq Monetize.parse("£4.50")
         | 
| 238 | 
            +
                  expect(collection.last).to eq Monetize.parse("€6")
         | 
| 239 | 
            +
                end
         | 
| 240 | 
            +
             | 
| 241 | 
            +
                it "parses hyphens as ranges" do
         | 
| 242 | 
            +
                  collection = Monetize.parse_collection("$4 - $10")
         | 
| 243 | 
            +
                  expect(collection.first).to eq Monetize.parse("$4")
         | 
| 244 | 
            +
                  expect(collection.last).to eq Monetize.parse("$10")
         | 
| 245 | 
            +
                end
         | 
| 246 | 
            +
              end
         | 
| 247 | 
            +
             | 
| 211 248 | 
             
              describe ".from_string" do
         | 
| 212 249 | 
             
                it "converts given amount to cents" do
         | 
| 213 250 | 
             
                  expect(Monetize.from_string("1")).to eq Money.new(1_00)
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: monetize
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.2.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Shane Emmons
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2015-04-03 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: money
         | 
| @@ -82,8 +82,11 @@ files: | |
| 82 82 | 
             
            - LICENSE.txt
         | 
| 83 83 | 
             
            - README.md
         | 
| 84 84 | 
             
            - Rakefile
         | 
| 85 | 
            +
            - lib/collection.rb
         | 
| 85 86 | 
             
            - lib/monetize.rb
         | 
| 86 87 | 
             
            - lib/monetize/core_extensions.rb
         | 
| 88 | 
            +
            - lib/monetize/core_extensions/hash.rb
         | 
| 89 | 
            +
            - lib/monetize/core_extensions/nil_class.rb
         | 
| 87 90 | 
             
            - lib/monetize/core_extensions/numeric.rb
         | 
| 88 91 | 
             
            - lib/monetize/core_extensions/string.rb
         | 
| 89 92 | 
             
            - lib/monetize/core_extensions/symbol.rb
         |