money 6.12.0 → 6.13.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 833d36d87efd793fa9e73986df700da145b59578
4
- data.tar.gz: 5fae93b474a739c79e45c18e45b3d652c4f1d4d6
3
+ metadata.gz: 7929d62cf482b5ad0876b0ff4950440cec3051ff
4
+ data.tar.gz: 8b40765349b517c8182f20de9378ad14b76eb863
5
5
  SHA512:
6
- metadata.gz: 77560afc19c7447c654daa551924ee3a0cd84e17a880d64b9d012aefda8fabc23ea100ad229278937817025f986839d9c6112c04cd8b1ee862ca0faf02fe9b4c
7
- data.tar.gz: 8c126aadb1cd5beedff854a8353a46a423296ceccdc8e1f72b7c65016937df8cb643c78c735fa87327bb41838ff12a76919a561e35ad5d3cb3eeca2573b5f526
6
+ metadata.gz: 1bc3a9c7fc84b6c4cd7e78d2dbe7bd666ab25f0715523953751984405f0ae858396e20e7bf0d8199b50c1d94d5947a1d3b0308094f3f2b347f07c93b655b28f1
7
+ data.tar.gz: 1a1dae32b195ccb6a93125fd2526e1c60e24c794cdd26fc08eb6254a1e6f8f4c0aef270ac215d1606b5163f7a1690443230161a75a5e522f72aa824b1f6f2efd
@@ -9,9 +9,11 @@ rvm:
9
9
  - 2.3.7
10
10
  - 2.4.4
11
11
  - 2.5.1
12
+ - 2.6.0
12
13
  - rbx-3
13
14
  - jruby-9.0.5.0
14
- - jruby-9.1.16.0
15
+ - jruby-9.1.17.0
16
+ - jruby-9.2.0.0
15
17
  - ruby-head
16
18
  - jruby-head
17
19
  matrix:
data/AUTHORS CHANGED
@@ -65,6 +65,7 @@ Julien Boyer
65
65
  Kaleem Ullah
66
66
  Kenichi Kamiya
67
67
  Kenn Ejima
68
+ Kenneth Salomon
68
69
  kirillian
69
70
  Laurynas Butkus
70
71
  Marcel Scherf
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 6.13.0
4
+ - Add :format option to the Formatter
5
+ - Add ruby 2.6.0 support
6
+ - Performance improvement (lazy stringify currency keys)
7
+ - Add `Money.locale_backend` for translation lookups
8
+ - Deprecate `use_i18n` flag in favour of `locale_backend = :i18n`
9
+ - Deprecate old formatting rules in favour of `:format`
10
+ - LVL and LTL are no longer used
11
+ - Add `Currency#iso?` for checking if currency is iso or not
12
+ - Relax versions-lock of `i18n` and `rspec` dependencies
13
+ - Add Bitcoin Cash
14
+ - Fix incorrect behaviour of `Currency#find_by_currency_iso` when given empty input
15
+
3
16
  ## 6.12.0
4
17
  - Remove caching of `.empty`/`.zero`
5
18
  - Preserve assigned bank when rounding
data/README.md CHANGED
@@ -5,7 +5,6 @@
5
5
  [![Code Climate](https://codeclimate.com/github/RubyMoney/money.svg)](https://codeclimate.com/github/RubyMoney/money)
6
6
  [![Coverage Status](https://coveralls.io/repos/RubyMoney/money/badge.svg?branch=master)](https://coveralls.io/r/RubyMoney/money?branch=master)
7
7
  [![Inline docs](https://inch-ci.org/github/RubyMoney/money.svg)](https://inch-ci.org/github/RubyMoney/money)
8
- [![Dependency Status](https://gemnasium.com/RubyMoney/money.svg)](https://gemnasium.com/RubyMoney/money)
9
8
  [![License](https://img.shields.io/github/license/RubyMoney/money.svg)](https://opensource.org/licenses/MIT)
10
9
 
11
10
  :warning: Please read the [migration notes](#migration-notes) before upgrading to a new major version.
@@ -199,7 +198,7 @@ using:
199
198
  Money.default_currency = Money::Currency.new("CAD")
200
199
  ```
201
200
 
202
- If you use Rails, then `environment.rb` is a very good place to put this.
201
+ If you use [Rails](https://github.com/RubyMoney/money/tree/master#ruby-on-rails), then `config/initializers/money.rb` is a very good place to put this.
203
202
 
204
203
  ### Currency Exponent
205
204
 
@@ -399,34 +398,40 @@ To integrate money in a Rails application use [money-rails](https://github.com/R
399
398
 
400
399
  For deprecated methods of integrating with Rails, check [the wiki](https://github.com/RubyMoney/money/wiki).
401
400
 
402
- ## I18n
401
+ ## Localization
403
402
 
404
- If you want thousands seperator and decimal mark to be same across all
405
- currencies this can be defined in your `I18n` translation files.
403
+ In order to localize formatting you can use `I18n` gem:
406
404
 
407
- In an rails application this may look like:
405
+ ```ruby
406
+ Money.locale_backend = :i18n
407
+ ```
408
+
409
+ With this enabled a thousands seperator and a decimal mark will get looked up in your `I18n` translation files. In a Rails application this may look like:
408
410
 
409
411
  ```yml
410
412
  # config/locale/en.yml
411
413
  en:
412
- number:
413
- format:
414
- delimiter: ","
415
- separator: "."
416
- # or
417
414
  number:
418
415
  currency:
419
416
  format:
420
417
  delimiter: ","
421
418
  separator: "."
419
+ # falling back to
420
+ number:
421
+ format:
422
+ delimiter: ","
423
+ separator: "."
422
424
  ```
423
425
 
424
426
  For this example `Money.new(123456789, "SEK").format` will return `1,234,567.89
425
- kr` which otherwise will return `1 234 567,89 kr`.
427
+ kr` which otherwise would have returned `1 234 567,89 kr`.
428
+
429
+ This will work seamlessly with [rails-i18n](https://github.com/svenfuchs/rails-i18n) gem that already has a lot of locales defined.
430
+
431
+ If you wish to disable this feature and use defaults instead:
426
432
 
427
- If you wish to disable this feature:
428
433
  ``` ruby
429
- Money.use_i18n = false
434
+ Money.locale_backend = nil
430
435
  ```
431
436
 
432
437
  ## Collection
@@ -436,7 +441,7 @@ for improved performance and accuracy.
436
441
 
437
442
  ### Troubleshooting
438
443
 
439
- If you get a runtime error such as:
444
+ If you don't have some locale and don't want to get a runtime error such as:
440
445
 
441
446
  I18n::InvalidLocale: :en is not a valid locale
442
447
 
@@ -30,6 +30,36 @@
30
30
  "iso_numeric": "288",
31
31
  "smallest_denomination": 1
32
32
  },
33
+ "ltl": {
34
+ "priority": 100,
35
+ "iso_code": "LTL",
36
+ "name": "Lithuanian Litas",
37
+ "symbol": "Lt",
38
+ "alternate_symbols": [],
39
+ "subunit": "Centas",
40
+ "subunit_to_unit": 100,
41
+ "symbol_first": false,
42
+ "html_entity": "",
43
+ "decimal_mark": ".",
44
+ "thousands_separator": ",",
45
+ "iso_numeric": "440",
46
+ "smallest_denomination": 1
47
+ },
48
+ "lvl": {
49
+ "priority": 100,
50
+ "iso_code": "LVL",
51
+ "name": "Latvian Lats",
52
+ "symbol": "Ls",
53
+ "alternate_symbols": [],
54
+ "subunit": "Santīms",
55
+ "subunit_to_unit": 100,
56
+ "symbol_first": true,
57
+ "html_entity": "",
58
+ "decimal_mark": ".",
59
+ "thousands_separator": ",",
60
+ "iso_numeric": "428",
61
+ "smallest_denomination": 1
62
+ },
33
63
  "mtl": {
34
64
  "priority": 100,
35
65
  "iso_code": "MTL",
@@ -1291,36 +1291,6 @@
1291
1291
  "iso_numeric": "426",
1292
1292
  "smallest_denomination": 1
1293
1293
  },
1294
- "ltl": {
1295
- "priority": 100,
1296
- "iso_code": "LTL",
1297
- "name": "Lithuanian Litas",
1298
- "symbol": "Lt",
1299
- "alternate_symbols": [],
1300
- "subunit": "Centas",
1301
- "subunit_to_unit": 100,
1302
- "symbol_first": false,
1303
- "html_entity": "",
1304
- "decimal_mark": ".",
1305
- "thousands_separator": ",",
1306
- "iso_numeric": "440",
1307
- "smallest_denomination": 1
1308
- },
1309
- "lvl": {
1310
- "priority": 100,
1311
- "iso_code": "LVL",
1312
- "name": "Latvian Lats",
1313
- "symbol": "Ls",
1314
- "alternate_symbols": [],
1315
- "subunit": "Santīms",
1316
- "subunit_to_unit": 100,
1317
- "symbol_first": true,
1318
- "html_entity": "",
1319
- "decimal_mark": ".",
1320
- "thousands_separator": ",",
1321
- "iso_numeric": "428",
1322
- "smallest_denomination": 1
1323
- },
1324
1294
  "lyd": {
1325
1295
  "priority": 100,
1326
1296
  "iso_code": "LYD",
@@ -1,4 +1,20 @@
1
1
  {
2
+ "bch": {
3
+ "priority": 100,
4
+ "iso_code": "BCH",
5
+ "name": "Bitcoin Cash",
6
+ "symbol": "₿",
7
+ "disambiguate_symbol": "₿CH",
8
+ "alternate_symbols": ["BCH"],
9
+ "subunit": "Satoshi",
10
+ "subunit_to_unit": 100000000,
11
+ "symbol_first": false,
12
+ "html_entity": "₿",
13
+ "decimal_mark": ".",
14
+ "thousands_separator": ",",
15
+ "iso_numeric": "",
16
+ "smallest_denomination": 1
17
+ },
2
18
  "btc": {
3
19
  "priority": 100,
4
20
  "iso_code": "BTC",
@@ -79,7 +79,8 @@ class Money
79
79
  # Money::Currency.find_by_iso_numeric('001') #=> nil
80
80
  def find_by_iso_numeric(num)
81
81
  num = num.to_s
82
- id, _ = self.table.find{|key, currency| currency[:iso_numeric] == num}
82
+ return if num.empty?
83
+ id, _ = self.table.find { |key, currency| currency[:iso_numeric] == num }
83
84
  new(id)
84
85
  rescue UnknownCurrency
85
86
  nil
@@ -170,13 +171,13 @@ class Money
170
171
  key = curr.fetch(:iso_code).downcase.to_sym
171
172
  @@mutex.synchronize { _instances.delete(key.to_s) }
172
173
  @table[key] = curr
173
- @stringified_keys = stringify_keys
174
+ @stringified_keys = nil
174
175
  end
175
176
 
176
177
  # Inherit a new currency from existing one
177
178
  #
178
179
  # @param parent_iso_code [String] the international 3-letter code as defined
179
- # @param curr [Hash] See {register} method for hash structure
180
+ # @param curr [Hash] See {register} method for hash structure
180
181
  def inherit(parent_iso_code, curr)
181
182
  parent_iso_code = parent_iso_code.downcase.to_sym
182
183
  curr = @table.fetch(parent_iso_code, {}).merge(curr)
@@ -197,11 +198,10 @@ class Money
197
198
  key = curr.downcase.to_sym
198
199
  end
199
200
  existed = @table.delete(key)
200
- @stringified_keys = stringify_keys if existed
201
+ @stringified_keys = nil if existed
201
202
  existed ? true : false
202
203
  end
203
204
 
204
-
205
205
  def each
206
206
  all.each { |c| yield(c) }
207
207
  end
@@ -401,6 +401,17 @@ class Money
401
401
  !!@symbol_first
402
402
  end
403
403
 
404
+ # Returns if a code currency is ISO.
405
+ #
406
+ # @return [Boolean]
407
+ #
408
+ # @example
409
+ # Money::Currency.new(:usd).iso?
410
+ #
411
+ def iso?
412
+ iso_numeric && iso_numeric != ''
413
+ end
414
+
404
415
  # Returns the relation between subunit and unit as a base 10 exponent.
405
416
  #
406
417
  # Note that MGA and MRO are exceptions and are rounded to 1
@@ -0,0 +1,7 @@
1
+ require 'money/locale_backend/errors'
2
+
3
+ class Money
4
+ module LocaleBackend
5
+ class Base; end
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ class Money
2
+ module LocaleBackend
3
+ class NotSupported < StandardError; end
4
+ class Unknown < ArgumentError; end
5
+ end
6
+ end
@@ -0,0 +1,24 @@
1
+ require 'money/locale_backend/base'
2
+
3
+ class Money
4
+ module LocaleBackend
5
+ class I18n < Base
6
+ KEY_MAP = {
7
+ thousands_separator: :delimiter,
8
+ decimal_mark: :separator
9
+ }.freeze
10
+
11
+ def initialize
12
+ raise NotSupported, 'I18n not found' unless defined?(::I18n)
13
+ end
14
+
15
+ def lookup(key, _)
16
+ i18n_key = KEY_MAP[key]
17
+
18
+ ::I18n.t i18n_key, scope: 'number.currency.format', raise: true
19
+ rescue ::I18n::MissingTranslationData
20
+ ::I18n.t i18n_key, scope: 'number.format', default: nil
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ require 'money/locale_backend/base'
2
+ require 'money/locale_backend/i18n'
3
+
4
+ class Money
5
+ module LocaleBackend
6
+ class Legacy < Base
7
+ def initialize
8
+ raise NotSupported, 'I18n not found' if Money.use_i18n && !defined?(::I18n)
9
+ end
10
+
11
+ def lookup(key, currency)
12
+ if Money.use_i18n
13
+ warn '[DEPRECATION] `use_i18n` is deprecated - use `Money.locale_backend = :i18n` instead'
14
+
15
+ i18n_backend.lookup(key, nil) || currency.public_send(key)
16
+ else
17
+ currency.public_send(key)
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def i18n_backend
24
+ @i18n_backend ||= Money::LocaleBackend::I18n.new
25
+ end
26
+ end
27
+ end
28
+ end
@@ -5,6 +5,7 @@ require "money/money/arithmetic"
5
5
  require "money/money/constructors"
6
6
  require "money/money/formatter"
7
7
  require "money/money/allocation"
8
+ require "money/money/locale_backend"
8
9
 
9
10
  # "Money is any object or record that is generally accepted as payment for
10
11
  # goods and services and repayment of debts in a given socio-economic context
@@ -120,7 +121,8 @@ class Money
120
121
  # @return [Integer] Use this to specify precision for converting Rational
121
122
  # to BigDecimal
122
123
  attr_accessor :default_bank, :default_formatting_rules,
123
- :use_i18n, :infinite_precision, :conversion_precision
124
+ :use_i18n, :infinite_precision, :conversion_precision,
125
+ :locale_backend
124
126
 
125
127
  # @attr_writer rounding_mode Use this to specify the rounding mode
126
128
  #
@@ -141,6 +143,18 @@ class Money
141
143
  end
142
144
  end
143
145
 
146
+ def self.locale_backend=(value)
147
+ @locale_backend = value ? LocaleBackend.find(value) : nil
148
+ end
149
+
150
+ def self.use_i18n=(value)
151
+ if value
152
+ warn '[DEPRECATION] `use_i18n` is deprecated - use `Money.locale_backend = :i18n` instead'
153
+ end
154
+
155
+ @use_i18n = value
156
+ end
157
+
144
158
  def self.setup_defaults
145
159
  # Set the default bank for creating new +Money+ objects.
146
160
  self.default_bank = Bank::VariableExchange.instance
@@ -149,7 +163,10 @@ class Money
149
163
  self.default_currency = Currency.new("USD")
150
164
 
151
165
  # Default to using i18n
152
- self.use_i18n = true
166
+ @use_i18n = true
167
+
168
+ # Default to using legacy locale backend
169
+ self.locale_backend = :legacy
153
170
 
154
171
  # Default to not using infinite precision cents
155
172
  self.infinite_precision = false
@@ -179,7 +196,7 @@ class Money
179
196
  # fee = Money.rounding_mode(BigDecimal::ROUND_HALF_UP) do
180
197
  # Money.new(1200) * BigDecimal('0.029')
181
198
  # end
182
- def self.rounding_mode(mode=nil)
199
+ def self.rounding_mode(mode = nil)
183
200
  if mode.nil?
184
201
  Thread.current[:money_rounding_mode] || @rounding_mode
185
202
  else
@@ -540,7 +557,8 @@ class Money
540
557
  # @return [String]
541
558
  #
542
559
  def thousands_separator
543
- Money::Formatter.new(self, {}).thousands_separator
560
+ (locale_backend && locale_backend.lookup(:thousands_separator, currency)) ||
561
+ Money::Formatter::DEFAULTS[:thousands_separator]
544
562
  end
545
563
 
546
564
  # Returns a decimal mark according to the locale
@@ -548,7 +566,8 @@ class Money
548
566
  # @return [String]
549
567
  #
550
568
  def decimal_mark
551
- Money::Formatter.new(self, {}).decimal_mark
569
+ (locale_backend && locale_backend.lookup(:decimal_mark, currency)) ||
570
+ Money::Formatter::DEFAULTS[:decimal_mark]
552
571
  end
553
572
 
554
573
  private
@@ -568,4 +587,8 @@ class Money
568
587
  value.round(0, self.class.rounding_mode).to_i
569
588
  end
570
589
  end
590
+
591
+ def locale_backend
592
+ self.class.locale_backend
593
+ end
571
594
  end
@@ -3,6 +3,11 @@ require 'money/money/formatting_rules'
3
3
 
4
4
  class Money
5
5
  class Formatter
6
+ DEFAULTS = {
7
+ thousands_separator: '',
8
+ decimal_mark: '.'
9
+ }.freeze
10
+
6
11
  # Creates a formatted price string according to several rules.
7
12
  #
8
13
  # @param [Hash] rules The options used to format the string.
@@ -203,6 +208,13 @@ class Money
203
208
  # Money.new(89000, :btc).format(drop_trailing_zeros: true) #=> B⃦0.00089
204
209
  # Money.new(110, :usd).format(drop_trailing_zeros: true) #=> $1.1
205
210
  #
211
+ # @option rules [String] :format (nil) Provide a template for formatting. `%u` will be replaced
212
+ # with the symbol (if present) and `%n` will be replaced with the number.
213
+ #
214
+ # @example
215
+ # Money.new(10000, "USD").format(format: '%u %n') #=> "$ 100.00"
216
+ # Money.new(10000, "USD").format(format: '<span>%u%n</span>') #=> "<span>$100.00</span>"
217
+ #
206
218
  # Note that the default rules can be defined through {Money.default_formatting_rules} hash.
207
219
  #
208
220
  # @see Money.default_formatting_rules Money.default_formatting_rules for more information.
@@ -214,15 +226,27 @@ class Money
214
226
 
215
227
  def to_s
216
228
  return free_text if show_free_text?
229
+ result = format_number
230
+ formatted = append_sign(result)
231
+ append_currency_symbol(formatted)
232
+ end
217
233
 
218
- if rules[:html]
219
- warn "[DEPRECATION] `html` is deprecated - use `html_wrap` instead. Please note that `html_wrap` will wrap all parts of currency and if you use `with_currency` option, currency element class changes from `currency` to `money-currency`."
220
- end
234
+ def thousands_separator
235
+ lookup :thousands_separator
236
+ end
221
237
 
222
- if rules[:html_wrap_symbol]
223
- warn "[DEPRECATION] `html_wrap_symbol` is deprecated - use `html_wrap` instead. Please note that `html_wrap` will wrap all parts of currency."
224
- end
238
+ def decimal_mark
239
+ lookup :decimal_mark
240
+ end
225
241
 
242
+ alias_method :delimiter, :thousands_separator
243
+ alias_method :separator, :decimal_mark
244
+
245
+ private
246
+
247
+ attr_reader :money, :currency, :rules
248
+
249
+ def format_number
226
250
  whole_part, decimal_part = extract_whole_and_decimal_parts
227
251
 
228
252
  # Format whole and decimal parts separately
@@ -230,16 +254,22 @@ class Money
230
254
  whole_part = format_whole_part(whole_part)
231
255
 
232
256
  # Assemble the final formatted amount
233
- formatted = if rules[:html_wrap]
257
+ if rules[:html_wrap]
234
258
  if decimal_part.nil?
235
259
  html_wrap(whole_part, "whole")
236
260
  else
237
- [html_wrap(whole_part, "whole"), html_wrap(decimal_mark, "decimal-mark"), html_wrap(decimal_part, "decimal")].join
261
+ [
262
+ html_wrap(whole_part, "whole"),
263
+ html_wrap(decimal_mark, "decimal-mark"),
264
+ html_wrap(decimal_part, "decimal")
265
+ ].join
238
266
  end
239
267
  else
240
268
  [whole_part, decimal_part].compact.join(decimal_mark)
241
269
  end
270
+ end
242
271
 
272
+ def append_sign(formatted_number)
243
273
  sign = money.negative? ? '-' : ''
244
274
 
245
275
  if rules[:sign_positive] == true && money.positive?
@@ -259,56 +289,30 @@ class Money
259
289
  elsif rules[:html_wrap]
260
290
  symbol_value = html_wrap(symbol_value, "currency-symbol")
261
291
  end
262
- symbol_position = symbol_position_from(rules)
263
292
 
264
- formatted = if symbol_position == :before
265
- symbol_space = rules[:symbol_before_without_space] === false ? " " : ""
266
- "#{sign_before}#{symbol_value}#{symbol_space}#{sign}#{formatted}"
267
- else
268
- symbol_space = rules[:symbol_after_without_space] ? "" : " "
269
- "#{sign_before}#{sign}#{formatted}#{symbol_space}#{symbol_value}"
270
- end
293
+ rules[:format]
294
+ .gsub('%u', [sign_before, symbol_value].join)
295
+ .gsub('%n', [sign, formatted_number].join)
271
296
  else
272
- formatted="#{sign_before}#{sign}#{formatted}"
297
+ formatted_number = "#{sign_before}#{sign}#{formatted_number}"
273
298
  end
299
+ end
274
300
 
301
+ def append_currency_symbol(formatted_number)
275
302
  if rules[:with_currency]
276
- formatted << " "
303
+ formatted_number << " "
277
304
 
278
305
  if rules[:html]
279
- formatted << "<span class=\"currency\">#{currency.to_s}</span>"
306
+ formatted_number << "<span class=\"currency\">#{currency.to_s}</span>"
280
307
  elsif rules[:html_wrap]
281
- formatted << html_wrap(currency.to_s, "currency")
308
+ formatted_number << html_wrap(currency.to_s, "currency")
282
309
  else
283
- formatted << currency.to_s
310
+ formatted_number << currency.to_s
284
311
  end
285
312
  end
286
- formatted
287
- end
288
-
289
- def thousands_separator
290
- if rules.has_key?(:thousands_separator)
291
- rules[:thousands_separator] || ''
292
- else
293
- i18n_format_for(:thousands_separator, :delimiter, ',')
294
- end
295
- end
296
-
297
- def decimal_mark
298
- if rules.has_key?(:decimal_mark)
299
- rules[:decimal_mark] || '.'
300
- else
301
- i18n_format_for(:decimal_mark, :separator, '.')
302
- end
313
+ formatted_number
303
314
  end
304
315
 
305
- alias_method :delimiter, :thousands_separator
306
- alias_method :separator, :decimal_mark
307
-
308
- private
309
-
310
- attr_reader :money, :currency, :rules
311
-
312
316
  def show_free_text?
313
317
  money.zero? && rules[:display_free]
314
318
  end
@@ -322,15 +326,8 @@ class Money
322
326
  end
323
327
 
324
328
  def format_whole_part(value)
325
- # Determine thousands_separator
326
- thousands_separator_value = if rules.has_key?(:thousands_separator)
327
- rules[:thousands_separator] || ''
328
- else
329
- thousands_separator
330
- end
331
-
332
329
  # Apply thousands_separator
333
- value.gsub regexp_format, "\\1#{thousands_separator_value}"
330
+ value.gsub regexp_format, "\\1#{thousands_separator}"
334
331
  end
335
332
 
336
333
  def extract_whole_and_decimal_parts
@@ -360,16 +357,10 @@ class Money
360
357
  value.empty? ? nil : value
361
358
  end
362
359
 
363
- def i18n_format_for(method, name, character)
364
- if Money.use_i18n
365
- begin
366
- I18n.t name, scope: "number.currency.format", raise: true
367
- rescue I18n::MissingTranslationData
368
- I18n.t name, scope: "number.format", default: (currency.send(method) || character)
369
- end
370
- else
371
- currency.send(method) || character
372
- end
360
+ def lookup(key)
361
+ return rules[key] || DEFAULTS[key] if rules.has_key?(key)
362
+
363
+ (Money.locale_backend && Money.locale_backend.lookup(key, currency)) || DEFAULTS[key]
373
364
  end
374
365
 
375
366
  def regexp_format
@@ -402,19 +393,5 @@ class Money
402
393
  money.symbol
403
394
  end
404
395
  end
405
-
406
- def symbol_position_from(rules)
407
- if rules.has_key?(:symbol_position)
408
- if [:before, :after].include?(rules[:symbol_position])
409
- return rules[:symbol_position]
410
- else
411
- raise ArgumentError, ":symbol_position must be ':before' or ':after'"
412
- end
413
- elsif currency.symbol_first?
414
- :before
415
- else
416
- :after
417
- end
418
- end
419
396
  end
420
397
  end
@@ -11,6 +11,9 @@ class Money
11
11
  @rules = default_formatting_rules.merge(@rules) unless @rules[:ignore_defaults]
12
12
  @rules = localize_formatting_rules(@rules)
13
13
  @rules = translate_formatting_rules(@rules) if @rules[:translate]
14
+ @rules[:format] ||= determine_format_from_formatting_rules(@rules)
15
+
16
+ warn_about_deprecated_rules(@rules)
14
17
  end
15
18
 
16
19
  def [](key)
@@ -62,10 +65,56 @@ class Money
62
65
  def localize_formatting_rules(rules)
63
66
  if currency.iso_code == "JPY" && I18n.locale == :ja
64
67
  rules[:symbol] = "円" unless rules[:symbol] == false
65
- rules[:symbol_position] = :after
66
- rules[:symbol_after_without_space] = true
68
+ rules[:format] = '%n%u'
67
69
  end
68
70
  rules
69
71
  end
72
+
73
+ def determine_format_from_formatting_rules(rules)
74
+ symbol_position = symbol_position_from(rules)
75
+
76
+ if symbol_position == :before
77
+ rules.fetch(:symbol_before_without_space, true) ? '%u%n' : '%u %n'
78
+ else
79
+ rules[:symbol_after_without_space] ? '%n%u' : '%n %u'
80
+ end
81
+ end
82
+
83
+ def symbol_position_from(rules)
84
+ if rules.has_key?(:symbol_position)
85
+ if [:before, :after].include?(rules[:symbol_position])
86
+ return rules[:symbol_position]
87
+ else
88
+ raise ArgumentError, ":symbol_position must be ':before' or ':after'"
89
+ end
90
+ elsif currency.symbol_first?
91
+ :before
92
+ else
93
+ :after
94
+ end
95
+ end
96
+
97
+ def warn_about_deprecated_rules(rules)
98
+ if rules.has_key?(:symbol_position)
99
+ warn '[DEPRECATION] `symbol_position:` option is deprecated - use `format` to specify the formatting template.'
100
+ end
101
+
102
+ if rules.has_key?(:symbol_before_without_space)
103
+ warn '[DEPRECATION] `symbol_before_without_space:` option is deprecated - use `format` to specify the formatting template.'
104
+ end
105
+
106
+ if rules.has_key?(:symbol_after_without_space)
107
+ warn '[DEPRECATION] `symbol_after_without_space:` option is deprecated - use `format` to specify the formatting template.'
108
+ end
109
+
110
+ if rules.has_key?(:html)
111
+ warn "[DEPRECATION] `html` is deprecated - use `html_wrap` instead. Please note that `html_wrap` will wrap all parts of currency and if you use `with_currency` option, currency element class changes from `currency` to `money-currency`."
112
+ end
113
+
114
+ if rules.has_key?(:html_wrap_symbol)
115
+ warn "[DEPRECATION] `html_wrap_symbol` is deprecated - use `html_wrap` instead. Please note that `html_wrap` will wrap all parts of currency."
116
+ end
117
+
118
+ end
70
119
  end
71
120
  end
@@ -0,0 +1,20 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'money/locale_backend/errors'
4
+ require 'money/locale_backend/legacy'
5
+ require 'money/locale_backend/i18n'
6
+
7
+ class Money
8
+ module LocaleBackend
9
+ BACKENDS = {
10
+ legacy: Money::LocaleBackend::Legacy,
11
+ i18n: Money::LocaleBackend::I18n
12
+ }.freeze
13
+
14
+ def self.find(name)
15
+ raise Unknown, "Unknown locale backend: #{name}" unless BACKENDS.key?(name)
16
+
17
+ BACKENDS[name].new
18
+ end
19
+ end
20
+ end
@@ -1,3 +1,3 @@
1
1
  class Money
2
- VERSION = '6.12.0'
2
+ VERSION = '6.13.0'
3
3
  end
@@ -14,11 +14,11 @@ Gem::Specification.new do |s|
14
14
  s.description = "A Ruby Library for dealing with money and currency conversion."
15
15
  s.license = "MIT"
16
16
 
17
- s.add_dependency 'i18n', [">= 0.6.4", '< 1.1']
17
+ s.add_dependency 'i18n', [">= 0.6.4", '<= 2']
18
18
 
19
19
  s.add_development_dependency "bundler", "~> 1.3"
20
20
  s.add_development_dependency "rake"
21
- s.add_development_dependency "rspec", "~> 3.4.0"
21
+ s.add_development_dependency "rspec", "~> 3.4"
22
22
  s.add_development_dependency "yard", "~> 0.9.11"
23
23
  s.add_development_dependency "kramdown", "~> 1.1"
24
24
 
@@ -26,4 +26,10 @@ Gem::Specification.new do |s|
26
26
  s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
27
27
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
28
28
  s.require_paths = ["lib"]
29
+
30
+ if s.respond_to?(:metadata)
31
+ s.metadata['changelog_uri'] = 'https://github.com/RubyMoney/money/blob/master/CHANGELOG.md'
32
+ s.metadata['source_code_uri'] = 'https://github.com/RubyMoney/money/'
33
+ s.metadata['bug_tracker_uri'] = 'https://github.com/RubyMoney/money/issues'
34
+ end
29
35
  end
@@ -59,6 +59,11 @@ class Money
59
59
  expect(Currency.find_by_iso_numeric('non iso 4217 numeric code')).to be_nil
60
60
  expect(Currency.find_by_iso_numeric(0)).to be_nil
61
61
  end
62
+
63
+ it "returns nil when given empty input" do
64
+ expect(Currency.find_by_iso_numeric('')).to be_nil
65
+ expect(Currency.find_by_iso_numeric(nil)).to be_nil
66
+ end
62
67
  end
63
68
 
64
69
  describe ".wrap" do
@@ -321,6 +326,16 @@ class Money
321
326
  end
322
327
  end
323
328
 
329
+ describe "#iso?" do
330
+ it "returns true for iso currency" do
331
+ expect(Money::Currency.new(:eur).iso?).to be true
332
+ end
333
+
334
+ it "returns false if the currency is not iso" do
335
+ expect(Money::Currency.new(:btc).iso?).to be false
336
+ end
337
+ end
338
+
324
339
  describe "#to_s" do
325
340
  it "works as documented" do
326
341
  expect(Currency.new(:usd).to_s).to eq("USD")
@@ -0,0 +1,62 @@
1
+ # encoding: utf-8
2
+
3
+ describe Money::LocaleBackend::I18n do
4
+ describe '#initialize' do
5
+ it 'raises an error when I18n is not defined' do
6
+ hide_const('I18n')
7
+
8
+ expect { described_class.new }.to raise_error(Money::LocaleBackend::NotSupported)
9
+ end
10
+ end
11
+
12
+ describe '#lookup' do
13
+ after do
14
+ reset_i18n
15
+ I18n.locale = :en
16
+ end
17
+
18
+ subject { described_class.new }
19
+
20
+ context 'with number.currency.format defined' do
21
+ before do
22
+ I18n.locale = :de
23
+ I18n.backend.store_translations(:de, number: {
24
+ currency: { format: { delimiter: '.', separator: ',' } }
25
+ })
26
+ end
27
+
28
+ it 'returns thousands_separator based on the current locale' do
29
+ expect(subject.lookup(:thousands_separator, nil)).to eq('.')
30
+ end
31
+
32
+ it 'returns decimal_mark based on the current locale' do
33
+ expect(subject.lookup(:decimal_mark, nil)).to eq(',')
34
+ end
35
+ end
36
+
37
+ context 'with number.format defined' do
38
+ before do
39
+ I18n.locale = :de
40
+ I18n.backend.store_translations(:de, number: { format: { delimiter: '.', separator: ',' } })
41
+ end
42
+
43
+ it 'returns thousands_separator based on the current locale' do
44
+ expect(subject.lookup(:thousands_separator, nil)).to eq('.')
45
+ end
46
+
47
+ it 'returns decimal_mark based on the current locale' do
48
+ expect(subject.lookup(:decimal_mark, nil)).to eq(',')
49
+ end
50
+ end
51
+
52
+ context 'with no translation defined' do
53
+ it 'returns thousands_separator based on the current locale' do
54
+ expect(subject.lookup(:thousands_separator, nil)).to eq(nil)
55
+ end
56
+
57
+ it 'returns decimal_mark based on the current locale' do
58
+ expect(subject.lookup(:decimal_mark, nil)).to eq(nil)
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,74 @@
1
+ # encoding: utf-8
2
+
3
+ describe Money::LocaleBackend::Legacy do
4
+ after { Money.use_i18n = true }
5
+
6
+ describe '#initialize' do
7
+ it 'raises an error when use_i18n is true and I18n is not defined' do
8
+ Money.use_i18n = true
9
+ hide_const('I18n')
10
+
11
+ expect { described_class.new }.to raise_error(Money::LocaleBackend::NotSupported)
12
+ end
13
+
14
+ it 'does not raise error when use_i18n is false and I18n is not defined' do
15
+ Money.use_i18n = false
16
+ hide_const('I18n')
17
+
18
+ expect { described_class.new }.not_to raise_error
19
+ end
20
+ end
21
+
22
+ describe '#lookup' do
23
+ subject { described_class.new }
24
+ let(:currency) { Money::Currency.new('USD') }
25
+
26
+ context 'use_i18n is true and i18n lookup is successful' do
27
+ before do
28
+ allow(subject.send(:i18n_backend))
29
+ .to receive(:lookup)
30
+ .with(:thousands_separator, nil)
31
+ .and_return('.')
32
+
33
+ allow(subject.send(:i18n_backend))
34
+ .to receive(:lookup)
35
+ .with(:decimal_mark, nil)
36
+ .and_return(',')
37
+ end
38
+
39
+ it 'returns thousands_separator from I18n' do
40
+ expect(subject.lookup(:thousands_separator, currency)).to eq('.')
41
+ end
42
+
43
+ it 'returns decimal_mark based from I18n' do
44
+ expect(subject.lookup(:decimal_mark, currency)).to eq(',')
45
+ end
46
+ end
47
+
48
+ context 'use_i18n is true but i18n lookup is unsuccessful' do
49
+ before do
50
+ allow(subject.send(:i18n_backend)).to receive(:lookup).and_return(nil)
51
+ end
52
+
53
+ it 'returns thousands_separator as defined in currency' do
54
+ expect(subject.lookup(:thousands_separator, currency)).to eq(',')
55
+ end
56
+
57
+ it 'returns decimal_mark based as defined in currency' do
58
+ expect(subject.lookup(:decimal_mark, currency)).to eq('.')
59
+ end
60
+ end
61
+
62
+ context 'use_i18n is false' do
63
+ before { Money.use_i18n = false }
64
+
65
+ it 'returns thousands_separator as defined in currency' do
66
+ expect(subject.lookup(:thousands_separator, currency)).to eq(',')
67
+ end
68
+
69
+ it 'returns decimal_mark based as defined in currency' do
70
+ expect(subject.lookup(:decimal_mark, currency)).to eq('.')
71
+ end
72
+ end
73
+ end
74
+ end
@@ -18,6 +18,19 @@ describe Money, "formatting" do
18
18
  end
19
19
  end
20
20
 
21
+ context 'without locale_backend' do
22
+ before { Money.locale_backend = nil }
23
+ after { Money.locale_backend = :legacy }
24
+
25
+ subject(:money) { Money.new(1099_99, 'USD') }
26
+
27
+ it 'falls back to using defaults' do
28
+ expect(money.thousands_separator).to eq('')
29
+ expect(money.decimal_mark).to eq('.')
30
+ expect(money.format).to eq('$1099.99')
31
+ end
32
+ end
33
+
21
34
  context "with i18n but use_i18n = false" do
22
35
  before :each do
23
36
  reset_i18n
@@ -661,6 +674,42 @@ describe Money, "formatting" do
661
674
  end
662
675
  end
663
676
 
677
+ describe ':format option' do
678
+ let(:money) { Money.new(99_99, 'USD') }
679
+
680
+ it 'uses provided format as a template' do
681
+ expect(money.format(format: '%n')).to eq('99.99')
682
+ expect(money.format(format: '%u')).to eq('$')
683
+ expect(money.format(format: '%u%n')).to eq('$99.99')
684
+ expect(money.format(format: '%n%u')).to eq('99.99$')
685
+ expect(money.format(format: '%u %n')).to eq('$ 99.99')
686
+ expect(money.format(format: 'Your balance is: %u%n')).to eq('Your balance is: $99.99')
687
+ end
688
+
689
+ it 'ignores :symbol_position in favour of format' do
690
+ expect(money.format(format: '%u%n', symbol_position: :after)).to eq('$99.99')
691
+ expect(money.format(format: '%n%u', symbol_position: :before)).to eq('99.99$')
692
+ end
693
+
694
+ it 'ignores :symbol_before_without_space in favour of format' do
695
+ expect(money.format(format: '%u %n', symbol_position: :before, symbol_before_without_space: true)).to eq('$ 99.99')
696
+ expect(money.format(format: '%u%n', symbol_position: :before, symbol_before_without_space: false)).to eq('$99.99')
697
+ end
698
+
699
+ it 'ignores :symbol_after_without_space in favour of format' do
700
+ expect(money.format(format: '%n %u', symbol_position: :after, symbol_after_without_space: true)).to eq('99.99 $')
701
+ expect(money.format(format: '%n%u', symbol_position: :after, symbol_after_without_space: false)).to eq('99.99$')
702
+ end
703
+
704
+ it 'works with sign' do
705
+ money = Money.new(-99_99, 'USD')
706
+
707
+ expect(money.format(format: '%n%u', sign_before_symbol: false)).to eq('-99.99$')
708
+ expect(money.format(format: '%u%n', sign_before_symbol: false)).to eq('$-99.99')
709
+ expect(money.format(format: '%u%n', sign_before_symbol: true)).to eq('-$99.99')
710
+ end
711
+ end
712
+
664
713
  context "when the monetary value is 0" do
665
714
  let(:money) { Money.us_dollar(0) }
666
715
 
@@ -730,6 +779,7 @@ describe Money, "formatting" do
730
779
  expect(Money.new(1999_98, "DKK").format).to eq("1.999,98 kr.")
731
780
  expect(Money.new(1999_98, "NOK").format).to eq("1.999,98 kr")
732
781
  expect(Money.new(1999_98, "SEK").format).to eq("1 999,98 kr")
782
+ expect(Money.new(1999_98, "BCH").format).to eq("0.00199998 ₿")
733
783
  end
734
784
 
735
785
  it "returns ambiguous signs when disambiguate is false" do
@@ -738,6 +788,7 @@ describe Money, "formatting" do
738
788
  expect(Money.new(1999_98, "DKK").format(disambiguate: false)).to eq("1.999,98 kr.")
739
789
  expect(Money.new(1999_98, "NOK").format(disambiguate: false)).to eq("1.999,98 kr")
740
790
  expect(Money.new(1999_98, "SEK").format(disambiguate: false)).to eq("1 999,98 kr")
791
+ expect(Money.new(1999_98, "BCH").format(disambiguate: false)).to eq("0.00199998 ₿")
741
792
  end
742
793
 
743
794
  it "returns disambiguate signs when disambiguate: true" do
@@ -746,6 +797,7 @@ describe Money, "formatting" do
746
797
  expect(Money.new(1999_98, "DKK").format(disambiguate: true)).to eq("1.999,98 DKK")
747
798
  expect(Money.new(1999_98, "NOK").format(disambiguate: true)).to eq("1.999,98 NOK")
748
799
  expect(Money.new(1999_98, "SEK").format(disambiguate: true)).to eq("1 999,98 SEK")
800
+ expect(Money.new(1999_98, "BCH").format(disambiguate: true)).to eq("0.00199998 ₿CH")
749
801
  end
750
802
 
751
803
  it "returns disambiguate signs when disambiguate: true and symbol: true" do
@@ -754,6 +806,7 @@ describe Money, "formatting" do
754
806
  expect(Money.new(1999_98, "DKK").format(disambiguate: true, symbol: true)).to eq("1.999,98 DKK")
755
807
  expect(Money.new(1999_98, "NOK").format(disambiguate: true, symbol: true)).to eq("1.999,98 NOK")
756
808
  expect(Money.new(1999_98, "SEK").format(disambiguate: true, symbol: true)).to eq("1 999,98 SEK")
809
+ expect(Money.new(1999_98, "BCH").format(disambiguate: true, symbol: true)).to eq("0.00199998 ₿CH")
757
810
  end
758
811
 
759
812
  it "returns no signs when disambiguate: true and symbol: false" do
@@ -762,6 +815,7 @@ describe Money, "formatting" do
762
815
  expect(Money.new(1999_98, "DKK").format(disambiguate: true, symbol: false)).to eq("1.999,98")
763
816
  expect(Money.new(1999_98, "NOK").format(disambiguate: true, symbol: false)).to eq("1.999,98")
764
817
  expect(Money.new(1999_98, "SEK").format(disambiguate: true, symbol: false)).to eq("1 999,98")
818
+ expect(Money.new(1999_98, "BCH").format(disambiguate: true, symbol: false)).to eq("0.00199998")
765
819
  end
766
820
 
767
821
  it "should never return an ambiguous format with disambiguate: true" do
@@ -779,15 +833,21 @@ describe Money, "formatting" do
779
833
  describe ":drop_trailing_zeros option" do
780
834
  specify "(drop_trailing_zeros: true) works as documented" do
781
835
  expect(Money.new(89000, "BTC").format(drop_trailing_zeros: true, symbol: false)).to eq "0.00089"
836
+ expect(Money.new(89000, "BCH").format(drop_trailing_zeros: true, symbol: false)).to eq "0.00089"
782
837
  expect(Money.new(100089000, "BTC").format(drop_trailing_zeros: true, symbol: false)).to eq "1.00089"
838
+ expect(Money.new(100089000, "BCH").format(drop_trailing_zeros: true, symbol: false)).to eq "1.00089"
783
839
  expect(Money.new(100000000, "BTC").format(drop_trailing_zeros: true, symbol: false)).to eq "1"
840
+ expect(Money.new(100000000, "BCH").format(drop_trailing_zeros: true, symbol: false)).to eq "1"
784
841
  expect(Money.new(110, "AUD").format(drop_trailing_zeros: true, symbol: false)).to eq "1.1"
785
842
  end
786
843
 
787
844
  specify "(drop_trailing_zeros: false) works as documented" do
788
845
  expect(Money.new(89000, "BTC").format(drop_trailing_zeros: false, symbol: false)).to eq "0.00089000"
846
+ expect(Money.new(89000, "BCH").format(drop_trailing_zeros: false, symbol: false)).to eq "0.00089000"
789
847
  expect(Money.new(100089000, "BTC").format(drop_trailing_zeros: false, symbol: false)).to eq "1.00089000"
848
+ expect(Money.new(100089000, "BCH").format(drop_trailing_zeros: false, symbol: false)).to eq "1.00089000"
790
849
  expect(Money.new(100000000, "BTC").format(drop_trailing_zeros: false, symbol: false)).to eq "1.00000000"
850
+ expect(Money.new(100000000, "BCH").format(drop_trailing_zeros: false, symbol: false)).to eq "1.00000000"
791
851
  expect(Money.new(110, "AUD").format(drop_trailing_zeros: false, symbol: false)).to eq "1.10"
792
852
  end
793
853
  end
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+
3
+ describe Money::LocaleBackend do
4
+ describe '.find' do
5
+ it 'returns an initialized backend' do
6
+ expect(described_class.find(:legacy)).to be_a(Money::LocaleBackend::Legacy)
7
+ expect(described_class.find(:i18n)).to be_a(Money::LocaleBackend::I18n)
8
+ end
9
+
10
+ it 'raises an error if a backend is unknown' do
11
+ expect { described_class.find(:foo) }.to raise_error(Money::LocaleBackend::Unknown)
12
+ end
13
+ end
14
+ end
@@ -1,6 +1,22 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  describe Money do
4
+ describe '.locale_backend' do
5
+ after { Money.locale_backend = :legacy }
6
+
7
+ it 'sets the locale_backend' do
8
+ Money.locale_backend = :i18n
9
+
10
+ expect(Money.locale_backend).to be_a(Money::LocaleBackend::I18n)
11
+ end
12
+
13
+ it 'sets the locale_backend to nil' do
14
+ Money.locale_backend = nil
15
+
16
+ expect(Money.locale_backend).to eq(nil)
17
+ end
18
+ end
19
+
4
20
  describe ".new" do
5
21
  let(:initializing_value) { 1 }
6
22
  subject(:money) { Money.new(initializing_value) }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: money
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.12.0
4
+ version: 6.13.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: 2018-07-12 00:00:00.000000000 Z
11
+ date: 2018-10-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: i18n
@@ -17,9 +17,9 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 0.6.4
20
- - - "<"
20
+ - - "<="
21
21
  - !ruby/object:Gem::Version
22
- version: '1.1'
22
+ version: '2'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -27,9 +27,9 @@ dependencies:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
29
  version: 0.6.4
30
- - - "<"
30
+ - - "<="
31
31
  - !ruby/object:Gem::Version
32
- version: '1.1'
32
+ version: '2'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: bundler
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -64,14 +64,14 @@ dependencies:
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: 3.4.0
67
+ version: '3.4'
68
68
  type: :development
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: 3.4.0
74
+ version: '3.4'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: yard
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -128,12 +128,17 @@ files:
128
128
  - lib/money/currency.rb
129
129
  - lib/money/currency/heuristics.rb
130
130
  - lib/money/currency/loader.rb
131
+ - lib/money/locale_backend/base.rb
132
+ - lib/money/locale_backend/errors.rb
133
+ - lib/money/locale_backend/i18n.rb
134
+ - lib/money/locale_backend/legacy.rb
131
135
  - lib/money/money.rb
132
136
  - lib/money/money/allocation.rb
133
137
  - lib/money/money/arithmetic.rb
134
138
  - lib/money/money/constructors.rb
135
139
  - lib/money/money/formatter.rb
136
140
  - lib/money/money/formatting_rules.rb
141
+ - lib/money/money/locale_backend.rb
137
142
  - lib/money/rates_store/memory.rb
138
143
  - lib/money/version.rb
139
144
  - money.gemspec
@@ -143,10 +148,13 @@ files:
143
148
  - spec/currency/heuristics_spec.rb
144
149
  - spec/currency/loader_spec.rb
145
150
  - spec/currency_spec.rb
151
+ - spec/locale_backend/i18n_spec.rb
152
+ - spec/locale_backend/legacy_spec.rb
146
153
  - spec/money/allocation_spec.rb
147
154
  - spec/money/arithmetic_spec.rb
148
155
  - spec/money/constructors_spec.rb
149
156
  - spec/money/formatting_spec.rb
157
+ - spec/money/locale_backend_spec.rb
150
158
  - spec/money_spec.rb
151
159
  - spec/rates_store/memory_spec.rb
152
160
  - spec/spec_helper.rb
@@ -154,7 +162,10 @@ files:
154
162
  homepage: https://rubymoney.github.io/money
155
163
  licenses:
156
164
  - MIT
157
- metadata: {}
165
+ metadata:
166
+ changelog_uri: https://github.com/RubyMoney/money/blob/master/CHANGELOG.md
167
+ source_code_uri: https://github.com/RubyMoney/money/
168
+ bug_tracker_uri: https://github.com/RubyMoney/money/issues
158
169
  post_install_message:
159
170
  rdoc_options: []
160
171
  require_paths:
@@ -182,10 +193,13 @@ test_files:
182
193
  - spec/currency/heuristics_spec.rb
183
194
  - spec/currency/loader_spec.rb
184
195
  - spec/currency_spec.rb
196
+ - spec/locale_backend/i18n_spec.rb
197
+ - spec/locale_backend/legacy_spec.rb
185
198
  - spec/money/allocation_spec.rb
186
199
  - spec/money/arithmetic_spec.rb
187
200
  - spec/money/constructors_spec.rb
188
201
  - spec/money/formatting_spec.rb
202
+ - spec/money/locale_backend_spec.rb
189
203
  - spec/money_spec.rb
190
204
  - spec/rates_store/memory_spec.rb
191
205
  - spec/spec_helper.rb