moolah 5.2.0 → 5.6.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 +41 -6
 - data/lib/moolah/currency_registry.rb +1 -1
 - data/lib/moolah/money.rb +53 -24
 - data/lib/moolah/version.rb +1 -1
 - metadata +2 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 0cfb80941d30fee4042a1186672a5463fc99d2e0b4700f1ef6138862ce5b7a19
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: ab463d36b7d644ad8f6ec3adb4a1d8104e1348623558997c7f5c66a0133166bc
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: '0889eaa959a7730ddbad5775f94d13b80cd316d5d6abf873d77fa9407cc43e2ab37c4d6f0f66ded04e4e49cb704bc81fa6931214b0864418d3cf70cee7364cf1'
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 6898f7b1ea7d4ce11c885215653cac18149120f845a47f5463994a2bfa2a787f5b30409552771bc87ab57757ce64ac98c53f5df2beb861270e8f7ed73ca9d837
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -1,13 +1,9 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # Moolah
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            TODO: Delete this and the text above, and describe your gem
         
     | 
| 
      
 3 
     | 
    
         
            +
            Moolah is a Money gem that deals with Currency and FX_RATE. It is being used in multiple repos in Hotels/Bookings.
         
     | 
| 
       6 
4 
     | 
    
         | 
| 
       7 
5 
     | 
    
         
             
            ## Installation
         
     | 
| 
       8 
6 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
            Add this line to your application's Gemfile:
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
7 
     | 
    
         
             
            ```ruby
         
     | 
| 
       12 
8 
     | 
    
         
             
            gem 'moolah'
         
     | 
| 
       13 
9 
     | 
    
         
             
            ```
         
     | 
| 
         @@ -20,9 +16,48 @@ Or install it yourself as: 
     | 
|
| 
       20 
16 
     | 
    
         | 
| 
       21 
17 
     | 
    
         
             
                $ gem install moolah
         
     | 
| 
       22 
18 
     | 
    
         | 
| 
      
 19 
     | 
    
         
            +
            ### How to upgrade to version 5
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            For version 5, `fx_rate` is a must field while initializing a Moolah::Money object with different currency other than AUD. 
         
     | 
| 
      
 22 
     | 
    
         
            +
            When you initialize Moolah::Money with AUD as the currency, the fx_rate will be default to 1.0
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            This will break projects that are using older Moolah version expect the project is using AUD as the main currency.
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 27 
     | 
    
         
            +
            gem 'moolah', -> '5.3'
         
     | 
| 
      
 28 
     | 
    
         
            +
            ```
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            ```
         
     | 
| 
      
 31 
     | 
    
         
            +
            $ bundle update moolah
         
     | 
| 
      
 32 
     | 
    
         
            +
            ```
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
       23 
34 
     | 
    
         
             
            ## Usage
         
     | 
| 
       24 
35 
     | 
    
         | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
      
 36 
     | 
    
         
            +
            ### To create a new Moolah::Money object
         
     | 
| 
      
 37 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 38 
     | 
    
         
            +
            Moolah::Money.new(amount: '10', currency: 'AUD', fx_rate: '1.0000')
         
     | 
| 
      
 39 
     | 
    
         
            +
            ```
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            ### To create a AUD dollar Moolah::Money object
         
     | 
| 
      
 42 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 43 
     | 
    
         
            +
            Moolah::Money.in_aud('10')
         
     | 
| 
      
 44 
     | 
    
         
            +
            ```
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            ### To create a zero dollar Moolah::Money object
         
     | 
| 
      
 47 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 48 
     | 
    
         
            +
            Moolah::Money.zero(currency: 'AUD', fx_rate: '1.0000')
         
     | 
| 
      
 49 
     | 
    
         
            +
            ```
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
            ### To display a json format of the Moolah::Money object
         
     | 
| 
      
 52 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 53 
     | 
    
         
            +
            money = Moolah::Money.new(amount: '10', currency: 'AUD', fx_rate: '1.0000')
         
     | 
| 
      
 54 
     | 
    
         
            +
            money.as_json 
         
     | 
| 
      
 55 
     | 
    
         
            +
            => {
         
     | 
| 
      
 56 
     | 
    
         
            +
                'amount' => '10.00',
         
     | 
| 
      
 57 
     | 
    
         
            +
                'currency' => 'AUD',
         
     | 
| 
      
 58 
     | 
    
         
            +
                'fx_rate' => '1.0000'
         
     | 
| 
      
 59 
     | 
    
         
            +
               }
         
     | 
| 
      
 60 
     | 
    
         
            +
            ```
         
     | 
| 
       26 
61 
     | 
    
         | 
| 
       27 
62 
     | 
    
         
             
            ## Development
         
     | 
| 
       28 
63 
     | 
    
         | 
| 
         @@ -9,7 +9,7 @@ module Moolah 
     | 
|
| 
       9 
9 
     | 
    
         
             
                  def load_csv(file)
         
     | 
| 
       10 
10 
     | 
    
         
             
                    currencies = {}
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
                    CSV.foreach(file, headers: true, header_converters: :symbol, encoding: ' 
     | 
| 
      
 12 
     | 
    
         
            +
                    CSV.foreach(file, headers: true, header_converters: :symbol, encoding: 'UTF-8') do |row|
         
     | 
| 
       13 
13 
     | 
    
         
             
                      code = row[:code]
         
     | 
| 
       14 
14 
     | 
    
         
             
                      currencies[code] = Currency.new(
         
     | 
| 
       15 
15 
     | 
    
         
             
                        name: row[:currency],
         
     | 
    
        data/lib/moolah/money.rb
    CHANGED
    
    | 
         @@ -1,30 +1,57 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'anemic/model'
         
     | 
| 
       2 
2 
     | 
    
         
             
            require 'bigdecimal'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'active_support'
         
     | 
| 
       3 
4 
     | 
    
         | 
| 
       4 
5 
     | 
    
         
             
            module Moolah
         
     | 
| 
       5 
6 
     | 
    
         
             
              class Money
         
     | 
| 
       6 
7 
     | 
    
         
             
                include Anemic::Model
         
     | 
| 
       7 
8 
     | 
    
         
             
                include Comparable
         
     | 
| 
       8 
9 
     | 
    
         | 
| 
      
 10 
     | 
    
         
            +
                delegate :zero?, :positive?, :negative?, to: :amount
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
       9 
12 
     | 
    
         
             
                attribute :amount, BigDecimal, default: BigDecimal(0)
         
     | 
| 
       10 
13 
     | 
    
         
             
                attribute :currency, String
         
     | 
| 
       11 
14 
     | 
    
         
             
                attribute :fx_rate, BigDecimal
         
     | 
| 
       12 
15 
     | 
    
         | 
| 
       13 
16 
     | 
    
         
             
                def initialize(args = {})
         
     | 
| 
       14 
     | 
    
         
            -
                  args 
     | 
| 
      
 17 
     | 
    
         
            +
                  args = args.transform_keys(&:to_sym)
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  args[:currency] = 'AUD' if args[:currency].blank?
         
     | 
| 
       15 
20 
     | 
    
         
             
                  args[:fx_rate] = '1.0000' if args[:currency] == 'AUD'
         
     | 
| 
       16 
21 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
                   
     | 
| 
      
 22 
     | 
    
         
            +
                  if args[:fx_rate].nil?
         
     | 
| 
      
 23 
     | 
    
         
            +
                    # So fx_rate appears as nil as part of the error message
         
     | 
| 
      
 24 
     | 
    
         
            +
                    args[:fx_rate] = nil
         
     | 
| 
      
 25 
     | 
    
         
            +
                    raise ArgumentError, "missing keyword: :fx_rate in #{self.class.name} (#{args.sort.to_h})"
         
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
       18 
27 
     | 
    
         | 
| 
       19 
28 
     | 
    
         
             
                  super(args)
         
     | 
| 
       20 
29 
     | 
    
         
             
                end
         
     | 
| 
       21 
30 
     | 
    
         | 
| 
       22 
31 
     | 
    
         
             
                def self.in_aud(amount)
         
     | 
| 
       23 
     | 
    
         
            -
                   
     | 
| 
      
 32 
     | 
    
         
            +
                  new(amount: amount)
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                def self.zero(currency = 'AUD', fx_rate = nil)
         
     | 
| 
      
 36 
     | 
    
         
            +
                  new(currency: currency, amount: 0, fx_rate: fx_rate)
         
     | 
| 
       24 
37 
     | 
    
         
             
                end
         
     | 
| 
       25 
38 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
                def  
     | 
| 
       27 
     | 
    
         
            -
                  Money.new 
     | 
| 
      
 39 
     | 
    
         
            +
                def to_aud
         
     | 
| 
      
 40 
     | 
    
         
            +
                  return Money.new if fx_rate.zero?
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                  Money.new(amount: amount / fx_rate)
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                def convert_to(other)
         
     | 
| 
      
 46 
     | 
    
         
            +
                  money = other.is_a?(Money) ? other : Money.new(other)
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                  converted = Money.new(
         
     | 
| 
      
 49 
     | 
    
         
            +
                    amount: to_aud.amount * money.fx_rate,
         
     | 
| 
      
 50 
     | 
    
         
            +
                    currency: money.currency,
         
     | 
| 
      
 51 
     | 
    
         
            +
                    fx_rate: money.fx_rate
         
     | 
| 
      
 52 
     | 
    
         
            +
                  )
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                  converted.bankers_rounded
         
     | 
| 
       28 
55 
     | 
    
         
             
                end
         
     | 
| 
       29 
56 
     | 
    
         | 
| 
       30 
57 
     | 
    
         
             
                def formatted(symbol: true, delimit: true)
         
     | 
| 
         @@ -35,6 +62,10 @@ module Moolah 
     | 
|
| 
       35 
62 
     | 
    
         
             
                  formatter.format(symbol: false, delimit: false)
         
     | 
| 
       36 
63 
     | 
    
         
             
                end
         
     | 
| 
       37 
64 
     | 
    
         | 
| 
      
 65 
     | 
    
         
            +
                def formatted_fx_rate
         
     | 
| 
      
 66 
     | 
    
         
            +
                  formatter.format_fx_rate
         
     | 
| 
      
 67 
     | 
    
         
            +
                end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
       38 
69 
     | 
    
         
             
                def amount_in_cents
         
     | 
| 
       39 
70 
     | 
    
         
             
                  (bankers_rounded.amount * 100).to_i
         
     | 
| 
       40 
71 
     | 
    
         
             
                end
         
     | 
| 
         @@ -55,27 +86,31 @@ module Moolah 
     | 
|
| 
       55 
86 
     | 
    
         
             
                  "#{self.class.name} (#{as_json})"
         
     | 
| 
       56 
87 
     | 
    
         
             
                end
         
     | 
| 
       57 
88 
     | 
    
         | 
| 
       58 
     | 
    
         
            -
                def +( 
     | 
| 
       59 
     | 
    
         
            -
                  return self  
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
                   
     | 
| 
      
 89 
     | 
    
         
            +
                def +(other)
         
     | 
| 
      
 90 
     | 
    
         
            +
                  return self if other.nil?
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
                  money = other.is_a?(Money) ? other : Money.new(other)
         
     | 
| 
      
 93 
     | 
    
         
            +
                  raise ArgumentError, "Cannot add currency: #{currency} with given currency: #{money.currency}" if currency != money.currency
         
     | 
| 
      
 94 
     | 
    
         
            +
                  raise ArgumentError, "Cannot add fx rate: #{formatter.format_fx_rate} with given fx rate: #{money.formatted_fx_rate}" if fx_rate != money.fx_rate
         
     | 
| 
       62 
95 
     | 
    
         | 
| 
       63 
96 
     | 
    
         
             
                  Money.new(amount: amount + money.amount, currency: currency, fx_rate: fx_rate)
         
     | 
| 
       64 
97 
     | 
    
         
             
                end
         
     | 
| 
       65 
98 
     | 
    
         | 
| 
       66 
     | 
    
         
            -
                def -( 
     | 
| 
       67 
     | 
    
         
            -
                  return self  
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
                   
     | 
| 
      
 99 
     | 
    
         
            +
                def -(other)
         
     | 
| 
      
 100 
     | 
    
         
            +
                  return self if other.nil?
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
                  money = other.is_a?(Money) ? other : Money.new(other)
         
     | 
| 
      
 103 
     | 
    
         
            +
                  raise ArgumentError, "Cannot subtract currency: #{currency} with given currency: #{money.currency}" if currency != money.currency
         
     | 
| 
      
 104 
     | 
    
         
            +
                  raise ArgumentError, "Cannot subtract fx rate: #{formatter.format_fx_rate} with given fx rate: #{money.formatted_fx_rate}" if fx_rate != money.fx_rate
         
     | 
| 
       70 
105 
     | 
    
         | 
| 
       71 
106 
     | 
    
         
             
                  Money.new(amount: amount - money.amount, currency: currency, fx_rate: fx_rate)
         
     | 
| 
       72 
107 
     | 
    
         
             
                end
         
     | 
| 
       73 
108 
     | 
    
         | 
| 
       74 
     | 
    
         
            -
                def *( 
     | 
| 
      
 109 
     | 
    
         
            +
                def *(_other)
         
     | 
| 
       75 
110 
     | 
    
         
             
                  raise ArgumentError, 'Cannot multiply Money objects due to rounding issues'
         
     | 
| 
       76 
111 
     | 
    
         
             
                end
         
     | 
| 
       77 
112 
     | 
    
         | 
| 
       78 
     | 
    
         
            -
                def /( 
     | 
| 
      
 113 
     | 
    
         
            +
                def /(_other)
         
     | 
| 
       79 
114 
     | 
    
         
             
                  raise ArgumentError, 'Cannot divide Money objects due to rounding issues'
         
     | 
| 
       80 
115 
     | 
    
         
             
                end
         
     | 
| 
       81 
116 
     | 
    
         | 
| 
         @@ -83,21 +118,15 @@ module Moolah 
     | 
|
| 
       83 
118 
     | 
    
         
             
                  Money.new(amount: -amount, currency: currency, fx_rate: fx_rate)
         
     | 
| 
       84 
119 
     | 
    
         
             
                end
         
     | 
| 
       85 
120 
     | 
    
         | 
| 
       86 
     | 
    
         
            -
                def <=>( 
     | 
| 
       87 
     | 
    
         
            -
                   
     | 
| 
       88 
     | 
    
         
            -
                   
     | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
       90 
     | 
    
         
            -
                  amount <=> money.amount
         
     | 
| 
      
 121 
     | 
    
         
            +
                def <=>(other)
         
     | 
| 
      
 122 
     | 
    
         
            +
                  money = other.is_a?(Money) ? other : Money.new(other)
         
     | 
| 
      
 123 
     | 
    
         
            +
                  to_aud.amount <=> money.to_aud.amount
         
     | 
| 
       91 
124 
     | 
    
         
             
                end
         
     | 
| 
       92 
125 
     | 
    
         | 
| 
       93 
126 
     | 
    
         
             
                def bankers_rounded
         
     | 
| 
       94 
127 
     | 
    
         
             
                  Rounder.new(self).bankers_rounded
         
     | 
| 
       95 
128 
     | 
    
         
             
                end
         
     | 
| 
       96 
129 
     | 
    
         | 
| 
       97 
     | 
    
         
            -
                def zero?
         
     | 
| 
       98 
     | 
    
         
            -
                  amount.zero?
         
     | 
| 
       99 
     | 
    
         
            -
                end
         
     | 
| 
       100 
     | 
    
         
            -
             
     | 
| 
       101 
130 
     | 
    
         
             
                def negate
         
     | 
| 
       102 
131 
     | 
    
         
             
                  negated_amount = amount * -1
         
     | 
| 
       103 
132 
     | 
    
         
             
                  negated_amount = 0 if negated_amount.to_s == '-0.0'
         
     | 
    
        data/lib/moolah/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: moolah
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 5. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 5.6.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Marc Lee
         
     | 
| 
         @@ -9,7 +9,7 @@ authors: 
     | 
|
| 
       9 
9 
     | 
    
         
             
            autorequire:
         
     | 
| 
       10 
10 
     | 
    
         
             
            bindir: exe
         
     | 
| 
       11 
11 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       12 
     | 
    
         
            -
            date: 2022-07 
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2022-09-07 00:00:00.000000000 Z
         
     | 
| 
       13 
13 
     | 
    
         
             
            dependencies:
         
     | 
| 
       14 
14 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       15 
15 
     | 
    
         
             
              name: bundler
         
     |