shopify-money 1.0.0.pre → 1.0.1.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/config/currency_historic.yml +14 -0
- data/config/currency_iso.yml +22 -4
- data/lib/money/money.rb +20 -9
- data/lib/money/rails/job_argument_serializer.rb +22 -0
- data/lib/money/railtie.rb +12 -0
- data/lib/money/version.rb +1 -1
- data/lib/money.rb +2 -0
- data/spec/money_spec.rb +45 -8
- data/spec/rails/job_argument_serializer_spec.rb +20 -0
- data/spec/rails_spec_helper.rb +11 -0
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae5e66176d7c6e79d5c6346a3ca6915489d3750d7bb67aa68973c52a0198cb3f
|
4
|
+
data.tar.gz: 7219d1edd8665498e64eb06e6212028d8ec559dd5ce9206cbe698e5b1e42d2ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4188d1251f442d347b287b3b3ac69c08f716b149ef9cc8a78f2c8e75fb563524f3818a9b8116cf2d433117a9e66cbb96b428aed9bf8cd9f9e79eaefa94ca5c45
|
7
|
+
data.tar.gz: 9e70a02a0acdf5eca299ad5f4b201b3fb44a98977d972d08db4167938f24793b732a55f25d6ea3585c8c63d92b014bc108083cce1aef1659b65c628f3ab0b27f
|
data/README.md
CHANGED
@@ -73,6 +73,20 @@ mtl:
|
|
73
73
|
thousands_separator: ","
|
74
74
|
iso_numeric: '470'
|
75
75
|
smallest_denomination: 1
|
76
|
+
std:
|
77
|
+
priority: 100
|
78
|
+
iso_code: STD
|
79
|
+
name: São Tomé and Príncipe Dobra
|
80
|
+
symbol: Db
|
81
|
+
alternate_symbols: []
|
82
|
+
subunit: Cêntimo
|
83
|
+
subunit_to_unit: 100
|
84
|
+
symbol_first: false
|
85
|
+
html_entity: ''
|
86
|
+
decimal_mark: "."
|
87
|
+
thousands_separator: ","
|
88
|
+
iso_numeric: '678'
|
89
|
+
smallest_denomination: 10000
|
76
90
|
tmm:
|
77
91
|
priority: 100
|
78
92
|
iso_code: TMM
|
data/config/currency_iso.yml
CHANGED
@@ -2029,9 +2029,9 @@ ssp:
|
|
2029
2029
|
thousands_separator: ","
|
2030
2030
|
iso_numeric: '728'
|
2031
2031
|
smallest_denomination: 5
|
2032
|
-
|
2032
|
+
stn:
|
2033
2033
|
priority: 100
|
2034
|
-
iso_code:
|
2034
|
+
iso_code: STN
|
2035
2035
|
name: São Tomé and Príncipe Dobra
|
2036
2036
|
symbol: Db
|
2037
2037
|
alternate_symbols: []
|
@@ -2041,8 +2041,8 @@ std:
|
|
2041
2041
|
html_entity: ''
|
2042
2042
|
decimal_mark: "."
|
2043
2043
|
thousands_separator: ","
|
2044
|
-
iso_numeric: '
|
2045
|
-
smallest_denomination:
|
2044
|
+
iso_numeric: '930'
|
2045
|
+
smallest_denomination: 1
|
2046
2046
|
svc:
|
2047
2047
|
priority: 100
|
2048
2048
|
iso_code: SVC
|
@@ -2304,6 +2304,24 @@ uzs:
|
|
2304
2304
|
thousands_separator: ","
|
2305
2305
|
iso_numeric: '860'
|
2306
2306
|
smallest_denomination: 100
|
2307
|
+
ved:
|
2308
|
+
priority: 100
|
2309
|
+
iso_code: VED
|
2310
|
+
name: Venezuelan Bolívar soberano
|
2311
|
+
symbol: Bs.D.
|
2312
|
+
alternate_symbols: []
|
2313
|
+
subunit: Céntimo
|
2314
|
+
subunit_to_unit: 100
|
2315
|
+
symbol_first: true
|
2316
|
+
html_entity: ''
|
2317
|
+
decimal_mark: ","
|
2318
|
+
thousands_separator: "."
|
2319
|
+
iso_numeric: '926'
|
2320
|
+
# "On 1 Oct 2021, [...] another (redenomination) happened, but called 'Nueva expresión monetaria',
|
2321
|
+
# or new monetary expression, which removed 6 zeroes from the currency without affecting its denomination."
|
2322
|
+
# The VED has banknotes in denominations of 5, 10, 20, 50, and 100, and coins in 50 céntimos and 1 Bs.D.
|
2323
|
+
# Source: https://en.wikipedia.org/wiki/Venezuelan_bol%C3%ADvar
|
2324
|
+
smallest_denomination: 1
|
2307
2325
|
ves:
|
2308
2326
|
priority: 100
|
2309
2327
|
iso_code: VES
|
data/lib/money/money.rb
CHANGED
@@ -128,12 +128,14 @@ class Money
|
|
128
128
|
|
129
129
|
def +(other)
|
130
130
|
arithmetic(other) do |money|
|
131
|
+
return self if money.value == 0 && !no_currency?
|
131
132
|
Money.new(value + money.value, calculated_currency(money.currency))
|
132
133
|
end
|
133
134
|
end
|
134
135
|
|
135
136
|
def -(other)
|
136
137
|
arithmetic(other) do |money|
|
138
|
+
return self if money.value == 0 && !no_currency?
|
137
139
|
Money.new(value - money.value, calculated_currency(money.currency))
|
138
140
|
end
|
139
141
|
end
|
@@ -146,6 +148,7 @@ class Money
|
|
146
148
|
raise ArgumentError, "Money objects can only be multiplied by a Numeric"
|
147
149
|
end
|
148
150
|
end
|
151
|
+
return self if numeric == 1
|
149
152
|
Money.new(value.to_r * numeric, currency)
|
150
153
|
end
|
151
154
|
|
@@ -219,14 +222,14 @@ class Money
|
|
219
222
|
value
|
220
223
|
end
|
221
224
|
|
222
|
-
def
|
225
|
+
def to_fs(style = nil)
|
223
226
|
units = case style
|
224
227
|
when :legacy_dollars
|
225
228
|
2
|
226
229
|
when :amount, nil
|
227
230
|
currency.minor_units
|
228
231
|
else
|
229
|
-
raise ArgumentError, "Unexpected
|
232
|
+
raise ArgumentError, "Unexpected format: #{style}"
|
230
233
|
end
|
231
234
|
|
232
235
|
rounded_value = value.round(units)
|
@@ -238,17 +241,19 @@ class Money
|
|
238
241
|
sprintf("%s%d.%0#{units}d", sign, rounded_value.truncate, rounded_value.frac * (10 ** units))
|
239
242
|
end
|
240
243
|
end
|
244
|
+
alias_method :to_s, :to_fs
|
245
|
+
alias_method :to_formatted_s, :to_fs
|
241
246
|
|
242
|
-
def to_json(options =
|
243
|
-
if options.delete(:legacy_format) || Money.config.legacy_json_format
|
247
|
+
def to_json(options = nil)
|
248
|
+
if (options.is_a?(Hash) && options.delete(:legacy_format)) || Money.config.legacy_json_format
|
244
249
|
to_s
|
245
250
|
else
|
246
251
|
as_json(options).to_json
|
247
252
|
end
|
248
253
|
end
|
249
254
|
|
250
|
-
def as_json(options =
|
251
|
-
if options.delete(:legacy_format) || Money.config.legacy_json_format
|
255
|
+
def as_json(options = nil)
|
256
|
+
if (options.is_a?(Hash) && options.delete(:legacy_format)) || Money.config.legacy_json_format
|
252
257
|
to_s
|
253
258
|
else
|
254
259
|
{ value: to_s(:amount), currency: currency.to_s }
|
@@ -256,15 +261,21 @@ class Money
|
|
256
261
|
end
|
257
262
|
|
258
263
|
def abs
|
259
|
-
|
264
|
+
abs = value.abs
|
265
|
+
return self if value == abs
|
266
|
+
Money.new(abs, currency)
|
260
267
|
end
|
261
268
|
|
262
269
|
def floor
|
263
|
-
|
270
|
+
floor = value.floor
|
271
|
+
return self if floor == value
|
272
|
+
Money.new(floor, currency)
|
264
273
|
end
|
265
274
|
|
266
275
|
def round(ndigits=0)
|
267
|
-
|
276
|
+
round = value.round(ndigits)
|
277
|
+
return self if round == value
|
278
|
+
Money.new(round, currency)
|
268
279
|
end
|
269
280
|
|
270
281
|
def fraction(rate)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Money
|
4
|
+
module Rails
|
5
|
+
class JobArgumentSerializer < ::ActiveJob::Serializers::ObjectSerializer
|
6
|
+
def serialize(money)
|
7
|
+
super("value" => money.value, "currency" => money.currency.iso_code)
|
8
|
+
end
|
9
|
+
|
10
|
+
def deserialize(hash)
|
11
|
+
Money.new(hash["value"], hash["currency"])
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def klass
|
17
|
+
Money
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Money
|
4
|
+
class Railtie < Rails::Railtie
|
5
|
+
initializer "shopify-money.setup_active_job_serializer" do
|
6
|
+
ActiveSupport.on_load :active_job do
|
7
|
+
require_relative "rails/job_argument_serializer"
|
8
|
+
ActiveJob::Serializers.add_serializers ::Money::Rails::JobArgumentSerializer
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/money/version.rb
CHANGED
data/lib/money.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
require_relative 'money/version'
|
2
3
|
require_relative 'money/money_parser'
|
3
4
|
require_relative 'money/helpers'
|
4
5
|
require_relative 'money/currency'
|
@@ -11,5 +12,6 @@ require_relative 'money/deprecations'
|
|
11
12
|
require_relative 'money/accounting_money_parser'
|
12
13
|
require_relative 'money/core_extensions'
|
13
14
|
require_relative 'money_column' if defined?(ActiveRecord)
|
15
|
+
require_relative 'money/railtie' if defined?(Rails::Railtie)
|
14
16
|
|
15
17
|
require_relative 'rubocop/cop/money' if defined?(RuboCop)
|
data/spec/money_spec.rb
CHANGED
@@ -8,6 +8,10 @@ RSpec.describe "Money" do
|
|
8
8
|
let (:non_fractional_money) { Money.new(1, 'JPY') }
|
9
9
|
let (:zero_money) { Money.new(0) }
|
10
10
|
|
11
|
+
it "has a version" do
|
12
|
+
expect(Money::VERSION).not_to(eq(nil))
|
13
|
+
end
|
14
|
+
|
11
15
|
context "default currency not set" do
|
12
16
|
it "raises an error" do
|
13
17
|
configure(default_currency: nil) do
|
@@ -67,14 +71,14 @@ RSpec.describe "Money" do
|
|
67
71
|
expect(non_fractional_money.to_s).to eq("1")
|
68
72
|
end
|
69
73
|
|
70
|
-
it "
|
71
|
-
expect(amount_money.
|
72
|
-
expect(non_fractional_money.
|
74
|
+
it "to_fs with a legacy_dollars style" do
|
75
|
+
expect(amount_money.to_fs(:legacy_dollars)).to eq("1.23")
|
76
|
+
expect(non_fractional_money.to_fs(:legacy_dollars)).to eq("1.00")
|
73
77
|
end
|
74
78
|
|
75
|
-
it "
|
76
|
-
expect(amount_money.
|
77
|
-
expect(non_fractional_money.
|
79
|
+
it "to_fs with a amount style" do
|
80
|
+
expect(amount_money.to_fs(:amount)).to eq("1.23")
|
81
|
+
expect(non_fractional_money.to_fs(:amount)).to eq("1")
|
78
82
|
end
|
79
83
|
|
80
84
|
it "to_s correctly displays negative numbers" do
|
@@ -100,8 +104,16 @@ RSpec.describe "Money" do
|
|
100
104
|
expect(Money.new("999999999999999999.99", "USD").to_s).to eq("999999999999999999.99")
|
101
105
|
end
|
102
106
|
|
103
|
-
it "
|
104
|
-
expect{ money.
|
107
|
+
it "to_fs raises ArgumentError on unsupported style" do
|
108
|
+
expect{ money.to_fs(:some_weird_style) }.to raise_error(ArgumentError)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "to_fs is aliased as to_s for backward compatibility" do
|
112
|
+
expect(money.method(:to_s)).to eq(money.method(:to_fs))
|
113
|
+
end
|
114
|
+
|
115
|
+
it "to_fs is aliased as to_formatted_s for backward compatibility" do
|
116
|
+
expect(money.method(:to_formatted_s)).to eq(money.method(:to_fs))
|
105
117
|
end
|
106
118
|
|
107
119
|
it "legacy_json_format makes as_json return the legacy format" do
|
@@ -331,6 +343,7 @@ RSpec.describe "Money" do
|
|
331
343
|
|
332
344
|
it "returns value and currency in to_json" do
|
333
345
|
expect(Money.new(1.00).to_json).to eq('{"value":"1.00","currency":"CAD"}')
|
346
|
+
expect(JSON.dump(Money.new(1.00, "CAD"))).to eq('{"value":"1.00","currency":"CAD"}')
|
334
347
|
end
|
335
348
|
|
336
349
|
it "supports absolute value" do
|
@@ -396,6 +409,30 @@ RSpec.describe "Money" do
|
|
396
409
|
end
|
397
410
|
end
|
398
411
|
|
412
|
+
it "does not allocate a new money object when multiplying by 1" do
|
413
|
+
expect((money * 1).object_id).to eq(money.object_id)
|
414
|
+
end
|
415
|
+
|
416
|
+
it "does not allocate a new money object when adding 0" do
|
417
|
+
expect((money + 0).object_id).to eq(money.object_id)
|
418
|
+
end
|
419
|
+
|
420
|
+
it "does not allocate a new money object when subtracting 0" do
|
421
|
+
expect((money - 0).object_id).to eq(money.object_id)
|
422
|
+
end
|
423
|
+
|
424
|
+
it "does not allocate when computing absolute value when already positive" do
|
425
|
+
expect((money.abs).object_id).to eq(money.object_id)
|
426
|
+
end
|
427
|
+
|
428
|
+
it "does not allocate when computing floor value when already floored" do
|
429
|
+
expect((money.floor).object_id).to eq(money.object_id)
|
430
|
+
end
|
431
|
+
|
432
|
+
it "does not allocate when computing floor value when already rounded" do
|
433
|
+
expect((money.round).object_id).to eq(money.object_id)
|
434
|
+
end
|
435
|
+
|
399
436
|
describe "frozen with amount of $1" do
|
400
437
|
let (:money) { Money.new(1.00) }
|
401
438
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rails_spec_helper"
|
4
|
+
|
5
|
+
RSpec.describe Money::Rails::JobArgumentSerializer do
|
6
|
+
it "roundtrip a Money argument returns the same object" do
|
7
|
+
job = MoneyTestJob.new(value: Money.new(10.21, "BRL"))
|
8
|
+
|
9
|
+
serialized_job = job.serialize
|
10
|
+
serialized_value = serialized_job["arguments"][0]["value"]
|
11
|
+
expect(serialized_value["_aj_serialized"]).to eq("Money::Rails::JobArgumentSerializer")
|
12
|
+
expect(serialized_value["value"]).to eq(BigDecimal("10.21"))
|
13
|
+
expect(serialized_value["currency"]).to eq("BRL")
|
14
|
+
|
15
|
+
job2 = MoneyTestJob.deserialize(serialized_job)
|
16
|
+
job2.send(:deserialize_arguments_if_needed)
|
17
|
+
|
18
|
+
expect(job2.arguments.first[:value]).to eq(Money.new(10.21, "BRL"))
|
19
|
+
end
|
20
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shopify-money
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify Inc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-04-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -129,6 +129,8 @@ files:
|
|
129
129
|
- lib/money/money.rb
|
130
130
|
- lib/money/money_parser.rb
|
131
131
|
- lib/money/null_currency.rb
|
132
|
+
- lib/money/rails/job_argument_serializer.rb
|
133
|
+
- lib/money/railtie.rb
|
132
134
|
- lib/money/version.rb
|
133
135
|
- lib/money_column.rb
|
134
136
|
- lib/money_column/active_record_hooks.rb
|
@@ -150,6 +152,8 @@ files:
|
|
150
152
|
- spec/money_parser_spec.rb
|
151
153
|
- spec/money_spec.rb
|
152
154
|
- spec/null_currency_spec.rb
|
155
|
+
- spec/rails/job_argument_serializer_spec.rb
|
156
|
+
- spec/rails_spec_helper.rb
|
153
157
|
- spec/rubocop/cop/money/missing_currency_spec.rb
|
154
158
|
- spec/rubocop/cop/money/zero_money_spec.rb
|
155
159
|
- spec/rubocop_helper.rb
|
@@ -175,7 +179,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
175
179
|
- !ruby/object:Gem::Version
|
176
180
|
version: 1.3.1
|
177
181
|
requirements: []
|
178
|
-
rubygems_version: 3.
|
182
|
+
rubygems_version: 3.2.20
|
179
183
|
signing_key:
|
180
184
|
specification_version: 4
|
181
185
|
summary: Shopify's money gem
|
@@ -191,6 +195,8 @@ test_files:
|
|
191
195
|
- spec/money_parser_spec.rb
|
192
196
|
- spec/money_spec.rb
|
193
197
|
- spec/null_currency_spec.rb
|
198
|
+
- spec/rails/job_argument_serializer_spec.rb
|
199
|
+
- spec/rails_spec_helper.rb
|
194
200
|
- spec/rubocop/cop/money/missing_currency_spec.rb
|
195
201
|
- spec/rubocop/cop/money/zero_money_spec.rb
|
196
202
|
- spec/rubocop_helper.rb
|