monetize 1.9.1 → 1.9.2
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 +4 -0
- data/lib/monetize.rb +6 -3
- data/lib/monetize/parser.rb +16 -35
- data/lib/monetize/version.rb +1 -1
- data/monetize.gemspec +2 -2
- data/spec/core_extensions_spec.rb +24 -1
- data/spec/monetize_spec.rb +14 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e6d46a5e6d4c8b7e1dec430cfeb98a98536bb336
|
4
|
+
data.tar.gz: 523799519e83fca200b5d813a0ca010ab2ae090e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a88d6ce931f8c0d37653c3067a76caa4be8f5adbc10d78e2c1ee5d8b8089163b38926506c5e1a3524192b3d7e745a22f1d48d9773570239ce11f5a0fc122ee1d
|
7
|
+
data.tar.gz: d83465b93fdf95a3cb25ecfa805e694a775dab789766b046076948382cb01f64aeb78484b53e9afa60fd557a317fbfcd3ac51208559693c8196e9228a27c9ea6
|
data/CHANGELOG.md
CHANGED
data/lib/monetize.rb
CHANGED
@@ -31,9 +31,9 @@ module Monetize
|
|
31
31
|
return from_numeric(input, currency) if input.is_a?(Numeric)
|
32
32
|
|
33
33
|
parser = Monetize::Parser.new(input, currency, options)
|
34
|
-
|
34
|
+
amount, currency = parser.parse
|
35
35
|
|
36
|
-
Money.
|
36
|
+
Money.from_amount(amount, currency)
|
37
37
|
rescue Money::Currency::UnknownCurrency => e
|
38
38
|
fail ParseError, e.message
|
39
39
|
end
|
@@ -66,7 +66,10 @@ module Monetize
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def extract_cents(input, currency = Money.default_currency)
|
69
|
-
Monetize
|
69
|
+
warn '[DEPRECATION] Monetize.extract_cents is deprecated. Use Monetize.parse().cents'
|
70
|
+
|
71
|
+
money = parse(input, currency)
|
72
|
+
money.cents if money
|
70
73
|
end
|
71
74
|
end
|
72
75
|
end
|
data/lib/monetize/parser.rb
CHANGED
@@ -29,13 +29,17 @@ module Monetize
|
|
29
29
|
MULTIPLIER_SUFFIXES.default = 0
|
30
30
|
MULTIPLIER_REGEXP = Regexp.new(format('^(.*?\d)(%s)\b([^\d]*)$', MULTIPLIER_SUFFIXES.keys.join('|')), 'i')
|
31
31
|
|
32
|
+
DEFAULT_DECIMAL_MARK = '.'.freeze
|
33
|
+
|
32
34
|
def initialize(input, fallback_currency = Money.default_currency, options = {})
|
33
35
|
@input = input.to_s.strip
|
34
36
|
@fallback_currency = fallback_currency
|
35
37
|
@options = options
|
36
38
|
end
|
37
39
|
|
38
|
-
def
|
40
|
+
def parse
|
41
|
+
currency = Money::Currency.wrap(parse_currency)
|
42
|
+
|
39
43
|
multiplier_exp, input = extract_multiplier
|
40
44
|
|
41
45
|
num = input.gsub(/(?:^#{currency.symbol}|[^\d.,'-]+)/, '')
|
@@ -46,14 +50,16 @@ module Monetize
|
|
46
50
|
|
47
51
|
major, minor = extract_major_minor(num, currency)
|
48
52
|
|
49
|
-
|
53
|
+
amount = BigDecimal([major, minor].join(DEFAULT_DECIMAL_MARK))
|
54
|
+
amount = apply_multiplier(multiplier_exp, amount)
|
55
|
+
amount = apply_sign(negative, amount)
|
50
56
|
|
51
|
-
|
57
|
+
[amount, currency]
|
58
|
+
end
|
52
59
|
|
53
|
-
|
60
|
+
private
|
54
61
|
|
55
|
-
|
56
|
-
end
|
62
|
+
attr_reader :input, :fallback_currency, :options
|
57
63
|
|
58
64
|
def parse_currency
|
59
65
|
computed_currency = nil
|
@@ -63,25 +69,16 @@ module Monetize
|
|
63
69
|
computed_currency || fallback_currency || Money.default_currency
|
64
70
|
end
|
65
71
|
|
66
|
-
private
|
67
|
-
|
68
|
-
attr_reader :input, :fallback_currency, :options
|
69
|
-
|
70
72
|
def assume_from_symbol?
|
71
73
|
options.fetch(:assume_from_symbol) { Monetize.assume_from_symbol }
|
72
74
|
end
|
73
75
|
|
74
|
-
def apply_multiplier(multiplier_exp,
|
75
|
-
|
76
|
-
minor = minor.to_s + ('0' * multiplier_exp)
|
77
|
-
shift = minor[0...multiplier_exp].to_i
|
78
|
-
major += shift
|
79
|
-
minor = (minor[multiplier_exp..-1] || '')
|
80
|
-
[major, minor]
|
76
|
+
def apply_multiplier(multiplier_exp, amount)
|
77
|
+
amount * 10**multiplier_exp
|
81
78
|
end
|
82
79
|
|
83
|
-
def apply_sign(negative,
|
84
|
-
negative ?
|
80
|
+
def apply_sign(negative, amount)
|
81
|
+
negative ? amount * -1 : amount
|
85
82
|
end
|
86
83
|
|
87
84
|
def compute_currency
|
@@ -150,22 +147,6 @@ module Monetize
|
|
150
147
|
CURRENCY_SYMBOLS.keys.map { |key| Regexp.escape(key) }.join('|')
|
151
148
|
end
|
152
149
|
|
153
|
-
def set_minor_precision(minor, currency)
|
154
|
-
if Money.infinite_precision
|
155
|
-
(BigDecimal(minor) / (10**minor.size)) * currency.subunit_to_unit
|
156
|
-
elsif minor.size < currency.decimal_places
|
157
|
-
(minor + ('0' * currency.decimal_places))[0, currency.decimal_places].to_i
|
158
|
-
elsif minor.size > currency.decimal_places
|
159
|
-
if minor[currency.decimal_places, 1].to_i >= 5
|
160
|
-
minor[0, currency.decimal_places].to_i + 1
|
161
|
-
else
|
162
|
-
minor[0, currency.decimal_places].to_i
|
163
|
-
end
|
164
|
-
else
|
165
|
-
minor.to_i
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
150
|
def split_major_minor(num, delimiter)
|
170
151
|
major, minor = num.split(delimiter)
|
171
152
|
[major, minor || '00']
|
data/lib/monetize/version.rb
CHANGED
data/monetize.gemspec
CHANGED
@@ -7,8 +7,8 @@ require 'English'
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
8
|
spec.name = 'monetize'
|
9
9
|
spec.version = Monetize::VERSION
|
10
|
-
spec.authors = ['Shane Emmons']
|
11
|
-
spec.email = ['shane@emmons.io']
|
10
|
+
spec.authors = ['Shane Emmons', 'Anthony Dmitriyev']
|
11
|
+
spec.email = ['shane@emmons.io', 'anthony.dmitriyev@gmail.com']
|
12
12
|
spec.description = 'A library for converting various objects into `Money` objects.'
|
13
13
|
spec.summary = 'A library for converting various objects into `Money` objects.'
|
14
14
|
spec.homepage = 'https://github.com/RubyMoney/monetize'
|
@@ -67,7 +67,8 @@ describe Monetize, 'core extensions' do
|
|
67
67
|
'-1,000' => Money.new(-1_000_00),
|
68
68
|
'1,000.5' => Money.new(1_000_50),
|
69
69
|
'1,000.51' => Money.new(1_000_51),
|
70
|
-
'1,000.505' => Money.new(
|
70
|
+
'1,000.505' => Money.new(1_000_50), # ROUND_HALF_EVEN default bankers rounding
|
71
|
+
'1,000.515' => Money.new(1_000_52), # ROUND_HALF_EVEN default bankers rounding
|
71
72
|
'1,000.504' => Money.new(1_000_50),
|
72
73
|
'1,000.0000' => Money.new(1_000_00),
|
73
74
|
'1,000.5000' => Money.new(1_000_50),
|
@@ -149,6 +150,28 @@ describe Monetize, 'core extensions' do
|
|
149
150
|
expect('1'.to_money('JPY')).to eq Money.new(1, 'JPY')
|
150
151
|
expect('1.5'.to_money('KWD').cents).to eq 1_500
|
151
152
|
end
|
153
|
+
|
154
|
+
it 'respects Money.rounding_mode' do
|
155
|
+
expect('1.009'.to_money).to eq(Money.new(1_01))
|
156
|
+
|
157
|
+
Money.rounding_mode(BigDecimal::ROUND_DOWN) do
|
158
|
+
expect('1.009'.to_money).to eq(Money.new(1_00))
|
159
|
+
end
|
160
|
+
|
161
|
+
expect('1.001'.to_money).to eq(Money.new(1_00))
|
162
|
+
|
163
|
+
Money.rounding_mode(BigDecimal::ROUND_UP) do
|
164
|
+
expect('1.001'.to_money).to eq(Money.new(1_01))
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'produces results similar to Money.from_amount for all the rounding edge cases' do
|
169
|
+
(1_000..1_010).each do |amount|
|
170
|
+
amount = amount.to_f / 1000
|
171
|
+
|
172
|
+
expect(amount.to_s.to_money).to eq(Money.from_amount(amount))
|
173
|
+
end
|
174
|
+
end
|
152
175
|
end
|
153
176
|
|
154
177
|
describe '#to_currency' do
|
data/spec/monetize_spec.rb
CHANGED
@@ -520,6 +520,20 @@ describe Monetize do
|
|
520
520
|
end
|
521
521
|
|
522
522
|
describe '.extract_cents' do
|
523
|
+
it 'is deprecated' do
|
524
|
+
allow(Monetize).to receive(:warn)
|
525
|
+
|
526
|
+
Monetize.extract_cents('100')
|
527
|
+
|
528
|
+
expect(Monetize)
|
529
|
+
.to have_received(:warn)
|
530
|
+
.with('[DEPRECATION] Monetize.extract_cents is deprecated. Use Monetize.parse().cents')
|
531
|
+
end
|
532
|
+
|
533
|
+
it 'extracts cents from a given string' do
|
534
|
+
expect(Monetize.extract_cents('10.99')).to eq(1099)
|
535
|
+
end
|
536
|
+
|
523
537
|
it "correctly treats pipe marks '|' in input (regression test)" do
|
524
538
|
expect(Monetize.extract_cents('100|0')).to eq Monetize.extract_cents('100!0')
|
525
539
|
end
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: monetize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.9.
|
4
|
+
version: 1.9.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shane Emmons
|
8
|
+
- Anthony Dmitriyev
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2019-
|
12
|
+
date: 2019-07-06 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: money
|
@@ -69,6 +70,7 @@ dependencies:
|
|
69
70
|
description: A library for converting various objects into `Money` objects.
|
70
71
|
email:
|
71
72
|
- shane@emmons.io
|
73
|
+
- anthony.dmitriyev@gmail.com
|
72
74
|
executables: []
|
73
75
|
extensions: []
|
74
76
|
extra_rdoc_files: []
|