money 3.1.0.pre3 → 3.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.
data/CHANGELOG.md ADDED
@@ -0,0 +1,196 @@
1
+ Money 3.1.0
2
+ ===========
3
+
4
+ Features
5
+ --------
6
+ - Implemented `Money::Bank::Base`.
7
+ ([#issue/14](http://github.com/RubyMoney/money/issues/14))
8
+ - Added `Money::Bank::Base#exchange_with`.
9
+ - Deprecated `Money::Bank::Base#exchange`. Deprecation target set to Money
10
+ 3.2.0.
11
+ - Implented `Money::Bank::VariableExchange`
12
+ - Deprecated `Money::VariableExchangeBank`. Deprecation target set to Money
13
+ 3.2.0.
14
+ - Deprecate `Money::SYMBOLS`, `Money::SEPARATORS` and `Money::DELIMITERS`.
15
+ Deprecation target set to Money 3.2.0.
16
+ ([#issue/16](http://github.com/RubyMoney/money/issues/16))
17
+ - Implemented `#has` for `Money` and `Money::Currency`.
18
+ - Refactored test suite to conform to RSpec conventions.
19
+ - Moved project from [FooBarWidget](http://github.com/FooBarWidget) to
20
+ [RubyMoney](http://github.com/RubyMoney)
21
+ - Added Simone Carletti to list of authors.
22
+ - Moved `@rounding_method` from `Money::Bank::VariableExchange` to
23
+ `Money::Bank::Base`.
24
+ ([#issue/18](http://github.com/RubyMoney/money/issues/18))
25
+ - Added `#setup` to `Money::Bank::Base`. Called from `#initialize`.
26
+ ([#issue/19](http://github.com/RubyMoney/money/issues/19))
27
+ - Added [google_currency](http://github.com/RubyMoney/google_currency) to list
28
+ of Currency Exchange Implementations.
29
+ - Added `#export_rates` to `Money::Bank::VariableExchange`.
30
+ ([#issue/21](http://github.com/RubyMoney/money/issues/21))
31
+ - Added `#import_rates` to `Money::Bank::VariableExchange`.
32
+ ([#issue/21](http://github.com/RubyMoney/money/issues/21))
33
+ - Removed dependency on Jeweler.
34
+ - Replaced usage of hanna with yardoc.
35
+ - Rewrote/reformatted all documentation.
36
+
37
+ Bugfixes
38
+ --------
39
+ - Fixed incorrect URLs in documentation.
40
+ ([#issue/17](http://github.com/RubyMoney/money/issues/17))
41
+ - Updated `:subunit_to_unit` for HKD from 10 to 100.
42
+ ([#issue/20](http://github.com/RubyMoney/money/issues/20))
43
+ - Updated Ghanaian Cedi to use correct ISO Code, GHS.
44
+ ([#issue/22](http://github.com/RubyMoney/money/issues/22))
45
+ - Make `default` rake task call `spec`.
46
+ ([#issue/23](http://github.com/RubyMoney/money/issues/23))
47
+
48
+ Money 3.1.0.pre3
49
+ ================
50
+
51
+ Features
52
+ --------
53
+ - Added [google_currency](http://github.com/RubyMoney/google_currency) to list
54
+ of Currency Exchange Implementations.
55
+ - Added `#export_rates` to `Money::Bank::VariableExchange`.
56
+ ([#issue/21](http://github.com/RubyMoney/money/issues/21))
57
+ - Added `#import_rates` to `Money::Bank::VariableExchange`.
58
+ ([#issue/21](http://github.com/RubyMoney/money/issues/21))
59
+
60
+ Bugfixes
61
+ --------
62
+ - Updated `:subunit_to_unit` for HKD from 10 to 100.
63
+ ([#issue/20](http://github.com/RubyMoney/money/issues/20))
64
+
65
+ Money 3.1.0.pre2
66
+ ================
67
+
68
+ Features
69
+ --------
70
+ - Moved `@rounding_method` from `Money::Bank::VariableExchange` to
71
+ `Money::Bank::Base`.
72
+ ([#issue/18](http://github.com/RubyMoney/money/issues/18))
73
+ - Added `#setup` to `Money::Bank::Base`. Called from `#initialize`.
74
+ ([#issue/19](http://github.com/RubyMoney/money/issues/19))
75
+
76
+ Bugfixes
77
+ --------
78
+ - Fixed incorrect URLs in documentation.
79
+ ([#issue/17](http://github.com/RubyMoney/money/issues/17))
80
+
81
+ Money 3.1.0.pre1
82
+ ================
83
+
84
+ Features
85
+ --------
86
+ - Implemented `Money::Bank::Base`.
87
+ ([#issue/14](http://github.com/RubyMoney/money/issues/14))
88
+ - Added `Money::Bank::Base#exchange_with`.
89
+ - Deprecated `Money::Bank::Base#exchange`. Deprecation target set to Money
90
+ 3.2.0.
91
+ - Implented `Money::Bank::VariableExchange`
92
+ - Deprecated `Money::VariableExchangeBank`. Deprecation target set to Money
93
+ 3.2.0.
94
+ - Deprecate `Money::SYMBOLS`, `Money::SEPARATORS` and `Money::DELIMITERS`.
95
+ Deprecation target set to Money 3.2.0.
96
+ ([#issue/16](http://github.com/RubyMoney/money/issues/16))
97
+ - Implemented `#has` for `Money` and `Money::Currency`.
98
+ - Refactored test suite to conform to RSpec conventions.
99
+ - Moved project from [FooBarWidget](http://github.com/FooBarWidget) to
100
+ [RubyMoney](http://github.com/RubyMoney)
101
+ - Added Simone Carletti to list of authors.
102
+
103
+ Bugfixes
104
+ --------
105
+ - Fixed rounding error in `Numeric#to_money`.
106
+ ([#issue/15](http://github.com/RubyMoney/money/issues/15))
107
+
108
+ Money 3.0.5
109
+ ===========
110
+
111
+ Features
112
+ --------
113
+ - Added `Money#abs`.
114
+ - Added ability to pass a block to `VariableExchangeBank#new` or `#exchange`,
115
+ specifying a custom truncation method
116
+ - Added optional `currency` argument to` Numeric#to_money`.
117
+ ([#issue/11](http://github.com/RubyMoney/money/issues/11))
118
+ - Added optional `currency` argument to `String#to_money`.
119
+ ([#issue/11](http://github.com/RubyMoney/money/issues/11))
120
+ - Use '¤' as the default currency symbol.
121
+ ([#issue/10](http://github.com/RubyMoney/money/issues/10))
122
+
123
+ Bugfixes
124
+ --------
125
+ - Updated `Currency#subunit_to_unit` documentation (it's an integer not a
126
+ string).
127
+ - Fixed issue when exchanging currencies with different `:subunit_to_unit`
128
+ values.
129
+ - `Numeric#to_money` now respects `:subunit_to_unit`.
130
+ ([#issue/12](http://github.com/RubyMoney/money/issues/12))
131
+
132
+ Money 3.0.4
133
+ ===========
134
+
135
+ Features
136
+ --------
137
+ - Use `:subunit_to_unit` in `#to_s`, `#to_f` and `#format`.
138
+ - Deprecated `Money#SEPARATORS` and `Money#DELIMITERS`.
139
+
140
+ Bugfixes
141
+ --------
142
+ - Updated `#exchange` to avoid floating point rounding errors.
143
+ - Added `:separator` and `:delimiter` to `Currency`
144
+ - Updated the attributes of the Chilean Peso.
145
+
146
+ Money 3.0.3
147
+ ===========
148
+
149
+ Features
150
+ --------
151
+ - Added `#currency_as_string` and `#currency_as_string=` for easier
152
+ integration with ActiveRecord/Rails
153
+
154
+ Money 3.0.2
155
+ ===========
156
+
157
+ Features
158
+ --------
159
+ - Added `#div`, `#divmod`, `#modulo`, `#%` and `#remainder` to `Money`.
160
+
161
+ Money 3.0.1
162
+ ===========
163
+
164
+ Features
165
+ --------
166
+ - Added `#eql?` to `Money`
167
+ - Updated `Numeric#to_money` to work with all children of `Numeric` (i.e.
168
+ `BigDecimal`, `Integer`, `Fixnum`, `Float`, etc)
169
+
170
+ Money 3.0.0
171
+ ===========
172
+
173
+ Features
174
+ --------
175
+ - Version Bump due to compatibility changes with ActiveRecord. See
176
+ conversation
177
+ [here](http://github.com/RubyMoney/money/issues#issue/4/comment/224880)
178
+ for more information.
179
+
180
+ Money 2.3.0
181
+ ===========
182
+
183
+ Features
184
+ --------
185
+ - Currency is now represented by a `Currency` Object instead of a `String`.
186
+
187
+ Money 2.2.0
188
+ ===========
189
+
190
+ Features
191
+ --------
192
+ - Can now divide two Money objects by one another using `#/`.
193
+ - Can now convert a Money object to a float using `#to_f`.
194
+ - Users can now specify Separators and Delimiters when using `#format`.
195
+ - Support for Brazilian Real `Money.new(1_00, :BRL)`
196
+ - Migrated to Jeweler
data/README.md ADDED
@@ -0,0 +1,217 @@
1
+ # RubyMoney - Money
2
+
3
+ ## Introduction
4
+
5
+ This library aids one in handling money and different currencies.
6
+
7
+ ### Features
8
+
9
+ - Provides a `Money` class which encapsulates all information about an certain
10
+ amount of money, such as its value and its currency.
11
+ - Provides a `Money::Currency` class which encapsulates all information about
12
+ a monetary unit.
13
+ - Represents monetary values as integers, in cents. This avoids floating point
14
+ rounding errors.
15
+ - Represents currency as `Money::Currency` instances providing an high level of
16
+ flexibility.
17
+ - Provides APIs for exchanging money from one currency to another.
18
+ - Has the ability to parse a money and currency strings
19
+ into the corresponding Money/Currency object.
20
+
21
+ ### Resources
22
+
23
+ - [Website](http://money.rubyforge.org)
24
+ - [API Documentation](http://money.rubyforge.org)
25
+ - [Git Repository](http://github.com/RubyMoney/money)
26
+
27
+ ## Downloading
28
+
29
+ Install stable releases with the following command:
30
+
31
+ gem install money
32
+
33
+ The development version (hosted on Github) can be installed with:
34
+
35
+ git clone git://github.com/RubyMoney/money.git
36
+ cd money
37
+ rake install
38
+
39
+ ## Usage
40
+
41
+ require 'money'
42
+
43
+ # 10.00 USD
44
+ money = Money.new(1000, "USD")
45
+ money.cents #=> 1000
46
+ money.currency #=> Currency.new("USD")
47
+
48
+ # Comparisons
49
+ Money.new(1000, "USD") == Money.new(1000, "USD") #=> true
50
+ Money.new(1000, "USD") == Money.new(100, "USD") #=> false
51
+ Money.new(1000, "USD") == Money.new(1000, "EUR") #=> false
52
+ Money.new(1000, "USD") != Money.new(1000, "EUR") #=> true
53
+
54
+ # Arithmetic
55
+ Money.new(1000, "USD") + Money.new(500, "USD") == Money.new(1500, "USD")
56
+ Money.new(1000, "USD") - Money.new(200, "USD") == Money.new(800, "USD")
57
+ Money.new(1000, "USD") / 5 == Money.new(200, "USD")
58
+ Money.new(1000, "USD") * 5 == Money.new(5000, "USD")
59
+
60
+ # Currency conversions
61
+ some_code_to_setup_exchange_rates
62
+ Money.new(1000, "USD").exchange_to("EUR") == Money.new(some_value, "EUR")
63
+
64
+ ## Currency
65
+
66
+ Currencies are consistently represented as instances of `Money::Currency`.
67
+ The most part of `Money` APIs allows you to supply either a `String` or a
68
+ `Money::Currency`.
69
+
70
+ Money.new(1000, "USD") == Money.new(900, Currency.new("USD"))
71
+ Money.new(1000, "EUR").currency == Currency.new("EUR")
72
+
73
+ A `Money::Currency` instance holds all the information about the currency,
74
+ including the currency symbol, name and much more.
75
+
76
+ currency = Money.new(1000, "USD").currency
77
+ currency.iso_code #=> "USD"
78
+ currency.name #=> "United States Dollar"
79
+
80
+ To define a new `Money::Currency` simply add a new item to the
81
+ `Money::Currency::TABLE` hash, where the key is the identifier for the currency
82
+ object and the value is a hash containing all the currency attributes.
83
+
84
+ Money::Currency::TABLE[:USD] = {
85
+ :priority => 1,
86
+ :iso_code => "USD",
87
+ :name => "United States Dollar",
88
+ :symbol => "$",
89
+ :subunit => "Cent"
90
+ :subunit_to_unit => 100,
91
+ :separator => ".",
92
+ :delimiter => ","
93
+ }
94
+
95
+ The pre-defined set of attributes includes:
96
+
97
+ - `:priority` a numerical value you can use to sort/group the currency list
98
+ - `:iso_code` the international 3-letter code as defined by the ISO 4217 standard
99
+ - `:name` the currency name
100
+ - `:symbol` the currency symbol (UTF-8 encoded)
101
+ - `:subunit` the name of the fractional monetary unit
102
+ - `:subunit_to_unit` the proportion between the unit and the subunit
103
+ - `:separator` character between the whole and fraction amounts
104
+ - `:delimiter` character between each thousands place
105
+
106
+ All attributes are optional. Some attributes, such as `:symbol`, are used by
107
+ the Money class to print out a representation of the object. Other attributes,
108
+ such as `:name` or `:priority`, exist to provide a basic API you can take
109
+ advantage of to build your application.
110
+
111
+ ### :priority
112
+
113
+ The priority attribute is an arbitrary numerical value you can assign to the
114
+ `Money::Currency` and use in sorting/grouping operation.
115
+
116
+ For instance, let's assume your Rails application needs to render a currency
117
+ selector like the one available
118
+ [here](http://finance.yahoo.com/currency-converter/). You can create a couple of
119
+ custom methods to return the list of major currencies and all currencies as
120
+ follows:
121
+
122
+ # Returns an array of currency id where
123
+ # priority < 10
124
+ def major_currencies(hash)
125
+ hash.inject([]) do |array, (id, attributes)|
126
+ priority = attributes[:priority]
127
+ if priority && priority < 10
128
+ array[priority] ||= []
129
+ array[priority] << id
130
+ end
131
+ array
132
+ end.compact.flatten
133
+ end
134
+
135
+ # Returns an array of all currency id
136
+ def all_currencies(hash)
137
+ hash.keys
138
+ end
139
+
140
+ major_currencies(Money::Currency::TABLE)
141
+ # => [ :usd, :eur, :bgp, :cad ]
142
+
143
+ all_currencies(Money::Currency::TABLE)
144
+ # => [ :aed, :afn, all, ... ]
145
+
146
+ ### Default Currency
147
+
148
+ By default `Money` defaults to USD as its currency. This can be overwritten
149
+ using:
150
+
151
+ Money.default_currency = Money::Currency.new("CAD")
152
+
153
+ If you use Rails, then `environment.rb` is a very good place to put this.
154
+
155
+ ## Currency Exchange
156
+
157
+ Exchanging money is performed through an exchange bank object. The default
158
+ exchange bank object requires one to manually specify the exchange rate. Here's
159
+ an example of how it works:
160
+
161
+ Money.add_rate("USD", "CAD", 1.24515)
162
+ Money.add_rate("CAD", "USD", 0.803115)
163
+
164
+ Money.us_dollar(100).exchange_to("CAD") # => Money.new(124, "CAD")
165
+ Money.ca_dollar(100).exchange_to("USD") # => Money.new(80, "USD")
166
+
167
+ Comparison and arithmetic operations work as expected:
168
+
169
+ Money.new(1000, "USD") <=> Money.new(900, "USD") # => 1; 9.00 USD is smaller
170
+ Money.new(1000, "EUR") + Money.new(10, "EUR") == Money.new(1010, "EUR")
171
+
172
+ Money.add_rate("USD", "EUR", 0.5)
173
+ Money.new(1000, "EUR") + Money.new(1000, "USD") == Money.new(1500, "EUR")
174
+
175
+ There is nothing stopping you from creating bank objects which scrapes
176
+ [XE](http://www.xe.com) for the current rates or just returns `rand(2)`:
177
+
178
+ Money.default_bank = ExchangeBankWhichScrapesXeDotCom.new
179
+
180
+ ### Upcoming Changes
181
+
182
+ Starting in v3.1.0 we will be making two changes to the exchange process. First
183
+ a new `Bank::Base` class will be available. This will allow users to more
184
+ easily create custom `Bank` classes. Secondly the default `#exchange` method
185
+ will be depreciated and a new `#exchange_with` method will be used. Currently
186
+ `#exchange` passes the `cents` attribute. `#exchange_with` will pass the
187
+ actual `Money` object instead.
188
+
189
+ ### Implementations
190
+
191
+ The following is a list of Money.gem compatible currency exchange rate
192
+ implementations.
193
+
194
+ - [eu_central_bank](http://github.com/RubyMoney/eu_central_bank)
195
+ - [google_currency](http://github.com/RubyMoney/google_currency)
196
+
197
+ ## Ruby on Rails
198
+
199
+ Use the `compose_of` helper to let Active Record deal with embedding the money
200
+ object in your models. The following example requires a `cents` and a
201
+ `currency` field.
202
+
203
+ composed_of :price,
204
+ :class_name => "Money",
205
+ :mapping => [%w(cents cents), %w(currency currency_as_string)],
206
+ :constructor => Proc.new { |cents, currency| Money.new(cents || 0, currency || Money.default_currency) }
207
+
208
+ For Money 2.2.x and previous versions, simply use the following `composed_of`
209
+ definition:
210
+
211
+ composed_of :price,
212
+ :class_name => "Money",
213
+ :mapping => [%w(cents cents), %w(currency currency)],
214
+ :constructor => Proc.new { |cents, currency| Money.new(cents || 0, currency || Money.default_currency) }
215
+
216
+ For further details read the full discussion
217
+ [here](http://github.com/RubyMoney/money/issues/4#comment_224880).
@@ -1,6 +1,8 @@
1
1
  require 'thread'
2
2
 
3
3
  class Money
4
+ # Provides classes that aid in the ability of exchange one currency with
5
+ # another.
4
6
  module Bank
5
7
 
6
8
  # The lowest Money::Bank error class.
@@ -14,37 +16,59 @@ class Money
14
16
  end
15
17
 
16
18
 
19
+ # Money::Bank::Base is the basic interface for creating a money exchange
20
+ # object, also called Bank.
17
21
  #
18
- # Money::Bank::Base is the basic interface for creating a money exchange object,
19
- # also called Bank.
22
+ # A Bank is responsible for storing exchange rates, take a Money object as
23
+ # input and returns the corresponding Money object converted into an other
24
+ # currency.
20
25
  #
21
- # A Bank is responsible for storing exchange rates,
22
- # take a Money object as input and returns the corresponding Money object
23
- # converted into an other currency.
26
+ # This class exists for aiding in the creating of other classes to exchange
27
+ # money between different currencies. When creating a subclass you will
28
+ # need to implement the following methods to exchange money between
29
+ # currencies:
24
30
  #
25
- # This class exists for aiding in the creating of other classes to exchange money between
26
- # different currencies. When creating a subclass you will need to implement
27
- # the following methods to exchange money between currencies:
28
- #
29
- # * #exchange_with(Money) # => Money
31
+ # - #exchange_with(Money) #=> Money
30
32
  #
31
33
  # See Money::Bank::VariableExchange for a real example.
32
34
  #
33
- # Also, you can extend Money::Bank::VariableExchange
34
- # instead of Money::Bank::Base if your bank implementation
35
- # needs to store rates internally.
35
+ # Also, you can extend +Money::Bank::VariableExchange+ instead of
36
+ # +Money::Bank::Base+ if your bank implementation needs to store rates
37
+ # internally.
36
38
  #
39
+ # @abstract Subclass and override +#exchange_with+ to implement a custom
40
+ # +Money::Bank+ class. You can also override +#setup+ instead of
41
+ # +#initialize+ to setup initial variables, etc.
37
42
  class Base
38
43
 
39
44
  # Returns the singleton instance of the Base bank.
45
+ #
46
+ # @return [Money::Bank::Base]
40
47
  def self.instance
41
48
  @@singleton ||= self.new
42
49
  end
43
50
 
51
+ # The rounding method to use when exchanging rates.
52
+ #
53
+ # @return [Proc]
44
54
  attr_reader :rounding_method
45
55
 
46
- # Initializes a new Money::Bank::Base object. An optional block can be
47
- # passed to dictate the rounding method that +exchange_with+ can use.
56
+ # Initializes a new +Money::Bank::Base+ object. An optional block can be
57
+ # passed to dictate the rounding method that +#exchange_with+ can use.
58
+ #
59
+ # @yield [n] Optional block to use when rounding after exchanging one
60
+ # currency for another.
61
+ # @yieldparam [Float] n The resulting float after exchanging one currency
62
+ # for another.
63
+ # @yieldreturn [Integer]
64
+ #
65
+ # @return [Money::Bank::Base]
66
+ #
67
+ # @example
68
+ # Money::Bank::Base.new #=> #<Money::Bank::Base @rounding_method=nil>
69
+ # Money::Bank::Base.new {|n|
70
+ # n.floor
71
+ # } #=> #<Money::Bank::Base @round_method=#<Proc>>
48
72
  def initialize(&block)
49
73
  @rounding_method = block
50
74
  setup
@@ -52,14 +76,16 @@ class Money
52
76
 
53
77
  # Called after initialize. Subclasses can use this method to setup
54
78
  # variables, etc that they normally would in +#initialize+.
79
+ #
80
+ # @abstract Subclass and override +#setup+ to implement a custom
81
+ # +Money::Bank+ class.
82
+ #
83
+ # @return [self]
55
84
  def setup
56
85
  end
57
86
 
58
87
  # @deprecated +#exchange+ will be removed in v3.2.0, use +#exchange_with+
59
- #
60
- # Exchanges the given amount of cents in +from_currency+ to +to_currency+.
61
- #
62
- # Returns the amount of cents in +to_currency+ as an integer, rounded down.
88
+ # @see Money::Bank::Base#exchange_with
63
89
  def exchange(cents, from_currency, to_currency, &block)
64
90
  Money.deprecate "`Money::Bank::Base#exchange' will be removed in v3.2.0, use #exchange_with instead"
65
91
  exchange_with(Money.new(cents, from_currency), to_currency, &block).cents
@@ -68,30 +94,45 @@ class Money
68
94
  # Exchanges the given +Money+ object to a new +Money+ object in
69
95
  # +to_currency+.
70
96
  #
71
- # You should implement this in a subclass,
72
- # otherwise it will throw a NotImplementedError as a reminder.
97
+ # @abstract Subclass and override +#exchange_with+ to implement a custom
98
+ # +Money::Bank+ class.
99
+ #
100
+ # @raise NotImplementedError
101
+ #
102
+ # @param [Money] from The +Money+ object to exchange from.
103
+ # @param [Money::Currency, String, Symbol] to_currency The currency
104
+ # string or object to exchange to.
105
+ # @yield [n] Optional block to use to round the result after making
106
+ # the exchange.
107
+ # @yieldparam [Float] n The result after exchanging from one currency to
108
+ # the other.
109
+ # @yieldreturn [Integer]
73
110
  #
74
- # Returns a new +Money+ object.
75
- # Raises <tt>NotImplementedError</tt>.
111
+ # @return [Money]
76
112
  def exchange_with(from, to_currency, &block)
77
113
  raise NotImplementedError, "#exchange_with must be implemented"
78
114
  end
79
115
 
80
116
 
81
- # Given two currency strings or object,
82
- # checks whether they're both the same currency.
117
+ # Given two currency strings or object, checks whether they're both the
118
+ # same currency. Return +true+ if the currencies are the same, +false+
119
+ # otherwise.
83
120
  #
84
- # same_currency?("usd", "USD") # => true
85
- # same_currency?("usd", "EUR") # => false
86
- # same_currency?("usd", Currency.new("USD") # => true
87
- # same_currency?("usd", "USD") # => true
121
+ # @param [Money::Currency, String, Symbol] currency1 The first currency
122
+ # to compare.
123
+ # @param [Money::Currency, String, Symbol] currency2 The second currency
124
+ # to compare.
88
125
  #
89
- # Return +true+ if the currencies are the same, +false+ otherwise.
126
+ # @return [Boolean]
127
+ #
128
+ # @example
129
+ # same_currency?("usd", "USD") #=> true
130
+ # same_currency?("usd", "EUR") #=> false
131
+ # same_currency?("usd", Currency.new("USD") #=> true
132
+ # same_currency?("usd", "USD") #=> true
90
133
  def same_currency?(currency1, currency2)
91
134
  Currency.wrap(currency1) == Currency.wrap(currency2)
92
135
  end
93
-
94
136
  end
95
-
96
137
  end
97
138
  end