shopify-money 3.0.3 → 3.1.1

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
  SHA256:
3
- metadata.gz: 1395b621839646adc7561da3b65bdb3ca4fcd13a972be703acec64a9a08daa47
4
- data.tar.gz: 6dfc464f1c15c8eb06734cc988c7d4843d88670fca3d8889307c0b0caffa309e
3
+ metadata.gz: 9a7f2b9021ba467f633adc6c9de99a2506450e64a559e80216b3ec9f4aa0d8b8
4
+ data.tar.gz: 7065a07189dabcefbe4493e9246057c16da5184e63ff152eb63964c7e292f6f0
5
5
  SHA512:
6
- metadata.gz: 6fe1e1d79cd6f9f64b1c3beb0899b44eda823af1360f774caec6c10df22baedf63fa60ee46a1bb551940305ab9a69f737304074c5aa8bd2ab7f67fe72275b657
7
- data.tar.gz: a42890315f7a76a5bcdd24207262619704876e0c9dba2526919f05fd16a1b1f1f53048df2871474cb0c7fae1cc6b542b453c7bbff61c78d428fa4af2bc3b6de4
6
+ metadata.gz: 0b0ccd3b682176447b01ffe0513710fb490621eb9abae6078ea88464012320f766972c7dc71f02dc733fdd9e593199e9f2f594e1155f1e1aa03e5fc9ce9352b3
7
+ data.tar.gz: c92da07d7d83e040ac283b1bf62031077506616ddc6e78dd901472977b5df984db521c135cc550d84aa0902a9d972d2a8c450a9a55ee552e653a3904dc2ac135
data/Gemfile.lock CHANGED
@@ -1,34 +1,34 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- shopify-money (3.0.3)
4
+ shopify-money (3.1.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- actioncable (7.2.1.1)
10
- actionpack (= 7.2.1.1)
11
- activesupport (= 7.2.1.1)
9
+ actioncable (7.2.2.1)
10
+ actionpack (= 7.2.2.1)
11
+ activesupport (= 7.2.2.1)
12
12
  nio4r (~> 2.0)
13
13
  websocket-driver (>= 0.6.1)
14
14
  zeitwerk (~> 2.6)
15
- actionmailbox (7.2.1.1)
16
- actionpack (= 7.2.1.1)
17
- activejob (= 7.2.1.1)
18
- activerecord (= 7.2.1.1)
19
- activestorage (= 7.2.1.1)
20
- activesupport (= 7.2.1.1)
15
+ actionmailbox (7.2.2.1)
16
+ actionpack (= 7.2.2.1)
17
+ activejob (= 7.2.2.1)
18
+ activerecord (= 7.2.2.1)
19
+ activestorage (= 7.2.2.1)
20
+ activesupport (= 7.2.2.1)
21
21
  mail (>= 2.8.0)
22
- actionmailer (7.2.1.1)
23
- actionpack (= 7.2.1.1)
24
- actionview (= 7.2.1.1)
25
- activejob (= 7.2.1.1)
26
- activesupport (= 7.2.1.1)
22
+ actionmailer (7.2.2.1)
23
+ actionpack (= 7.2.2.1)
24
+ actionview (= 7.2.2.1)
25
+ activejob (= 7.2.2.1)
26
+ activesupport (= 7.2.2.1)
27
27
  mail (>= 2.8.0)
28
28
  rails-dom-testing (~> 2.2)
29
- actionpack (7.2.1.1)
30
- actionview (= 7.2.1.1)
31
- activesupport (= 7.2.1.1)
29
+ actionpack (7.2.2.1)
30
+ actionview (= 7.2.2.1)
31
+ activesupport (= 7.2.2.1)
32
32
  nokogiri (>= 1.8.5)
33
33
  racc
34
34
  rack (>= 2.2.4, < 3.2)
@@ -37,36 +37,37 @@ GEM
37
37
  rails-dom-testing (~> 2.2)
38
38
  rails-html-sanitizer (~> 1.6)
39
39
  useragent (~> 0.16)
40
- actiontext (7.2.1.1)
41
- actionpack (= 7.2.1.1)
42
- activerecord (= 7.2.1.1)
43
- activestorage (= 7.2.1.1)
44
- activesupport (= 7.2.1.1)
40
+ actiontext (7.2.2.1)
41
+ actionpack (= 7.2.2.1)
42
+ activerecord (= 7.2.2.1)
43
+ activestorage (= 7.2.2.1)
44
+ activesupport (= 7.2.2.1)
45
45
  globalid (>= 0.6.0)
46
46
  nokogiri (>= 1.8.5)
47
- actionview (7.2.1.1)
48
- activesupport (= 7.2.1.1)
47
+ actionview (7.2.2.1)
48
+ activesupport (= 7.2.2.1)
49
49
  builder (~> 3.1)
50
50
  erubi (~> 1.11)
51
51
  rails-dom-testing (~> 2.2)
52
52
  rails-html-sanitizer (~> 1.6)
53
- activejob (7.2.1.1)
54
- activesupport (= 7.2.1.1)
53
+ activejob (7.2.2.1)
54
+ activesupport (= 7.2.2.1)
55
55
  globalid (>= 0.3.6)
56
- activemodel (7.2.1.1)
57
- activesupport (= 7.2.1.1)
58
- activerecord (7.2.1.1)
59
- activemodel (= 7.2.1.1)
60
- activesupport (= 7.2.1.1)
56
+ activemodel (7.2.2.1)
57
+ activesupport (= 7.2.2.1)
58
+ activerecord (7.2.2.1)
59
+ activemodel (= 7.2.2.1)
60
+ activesupport (= 7.2.2.1)
61
61
  timeout (>= 0.4.0)
62
- activestorage (7.2.1.1)
63
- actionpack (= 7.2.1.1)
64
- activejob (= 7.2.1.1)
65
- activerecord (= 7.2.1.1)
66
- activesupport (= 7.2.1.1)
62
+ activestorage (7.2.2.1)
63
+ actionpack (= 7.2.2.1)
64
+ activejob (= 7.2.2.1)
65
+ activerecord (= 7.2.2.1)
66
+ activesupport (= 7.2.2.1)
67
67
  marcel (~> 1.0)
68
- activesupport (7.2.1.1)
68
+ activesupport (7.2.2.1)
69
69
  base64
70
+ benchmark (>= 0.3)
70
71
  bigdecimal
71
72
  concurrent-ruby (~> 1.0, >= 1.3.1)
72
73
  connection_pool (>= 2.2.5)
@@ -76,14 +77,15 @@ GEM
76
77
  minitest (>= 5.1)
77
78
  securerandom (>= 0.3)
78
79
  tzinfo (~> 2.0, >= 2.0.5)
79
- ast (2.4.2)
80
+ ast (2.4.3)
80
81
  base64 (0.2.0)
81
- bigdecimal (3.1.8)
82
+ benchmark (0.4.0)
83
+ bigdecimal (3.1.9)
82
84
  builder (3.3.0)
83
- byebug (11.1.3)
85
+ byebug (12.0.0)
84
86
  coderay (1.1.3)
85
- concurrent-ruby (1.3.4)
86
- connection_pool (2.4.1)
87
+ concurrent-ruby (1.3.5)
88
+ connection_pool (2.5.0)
87
89
  crass (1.0.6)
88
90
  database_cleaner (2.0.2)
89
91
  database_cleaner-active_record (>= 2, < 3)
@@ -91,23 +93,24 @@ GEM
91
93
  activerecord (>= 5.a)
92
94
  database_cleaner-core (~> 2.0.0)
93
95
  database_cleaner-core (2.0.1)
94
- date (3.3.4)
96
+ date (3.4.1)
95
97
  diff-lcs (1.5.1)
96
98
  docile (1.4.1)
97
99
  drb (2.2.1)
98
- erubi (1.13.0)
100
+ erubi (1.13.1)
99
101
  globalid (1.2.1)
100
102
  activesupport (>= 6.1)
101
- i18n (1.14.6)
103
+ i18n (1.14.7)
102
104
  concurrent-ruby (~> 1.0)
103
- io-console (0.7.2)
104
- irb (1.14.1)
105
+ io-console (0.8.0)
106
+ irb (1.15.2)
107
+ pp (>= 0.6.0)
105
108
  rdoc (>= 4.0.0)
106
109
  reline (>= 0.4.2)
107
110
  json (2.10.2)
108
111
  language_server-protocol (3.17.0.4)
109
112
  lint_roller (1.1.0)
110
- logger (1.6.1)
113
+ logger (1.7.0)
111
114
  loofah (2.24.0)
112
115
  crass (~> 1.0.2)
113
116
  nokogiri (>= 1.12.0)
@@ -120,75 +123,81 @@ GEM
120
123
  method_source (1.1.0)
121
124
  mini_mime (1.1.5)
122
125
  mini_portile2 (2.8.8)
123
- minitest (5.25.1)
124
- net-imap (0.5.0)
126
+ minitest (5.25.5)
127
+ net-imap (0.5.6)
125
128
  date
126
129
  net-protocol
127
130
  net-pop (0.1.2)
128
131
  net-protocol
129
132
  net-protocol (0.2.2)
130
133
  timeout
131
- net-smtp (0.5.0)
134
+ net-smtp (0.5.1)
132
135
  net-protocol
133
- nio4r (2.7.3)
134
- nokogiri (1.18.3)
136
+ nio4r (2.7.4)
137
+ nokogiri (1.18.7)
135
138
  mini_portile2 (~> 2.8.2)
136
139
  racc (~> 1.4)
137
- nokogiri (1.18.3-aarch64-linux-gnu)
140
+ nokogiri (1.18.7-aarch64-linux-gnu)
138
141
  racc (~> 1.4)
139
- nokogiri (1.18.3-arm-linux-gnu)
142
+ nokogiri (1.18.7-arm-linux-gnu)
140
143
  racc (~> 1.4)
141
- nokogiri (1.18.3-arm64-darwin)
144
+ nokogiri (1.18.7-arm64-darwin)
142
145
  racc (~> 1.4)
143
- nokogiri (1.18.3-x86_64-darwin)
146
+ nokogiri (1.18.7-x86_64-darwin)
144
147
  racc (~> 1.4)
145
- nokogiri (1.18.3-x86_64-linux-gnu)
148
+ nokogiri (1.18.7-x86_64-linux-gnu)
146
149
  racc (~> 1.4)
150
+ ostruct (0.6.1)
147
151
  parallel (1.26.3)
148
- parser (3.3.7.1)
152
+ parser (3.3.7.4)
149
153
  ast (~> 2.4.1)
150
154
  racc
151
- pry (0.14.2)
155
+ pp (0.6.2)
156
+ prettyprint
157
+ prettyprint (0.2.0)
158
+ prism (1.4.0)
159
+ pry (0.15.2)
152
160
  coderay (~> 1.1)
153
161
  method_source (~> 1.0)
154
- pry-byebug (3.10.1)
155
- byebug (~> 11.0)
156
- pry (>= 0.13, < 0.15)
157
- psych (5.1.2)
162
+ pry-byebug (3.11.0)
163
+ byebug (~> 12.0)
164
+ pry (>= 0.13, < 0.16)
165
+ psych (5.2.3)
166
+ date
158
167
  stringio
159
168
  racc (1.8.1)
160
- rack (3.1.8)
161
- rack-session (2.0.0)
169
+ rack (3.1.12)
170
+ rack-session (2.1.0)
171
+ base64 (>= 0.1.0)
162
172
  rack (>= 3.0.0)
163
- rack-test (2.1.0)
173
+ rack-test (2.2.0)
164
174
  rack (>= 1.3)
165
- rackup (2.1.0)
175
+ rackup (2.2.1)
166
176
  rack (>= 3)
167
- webrick (~> 1.8)
168
- rails (7.2.1.1)
169
- actioncable (= 7.2.1.1)
170
- actionmailbox (= 7.2.1.1)
171
- actionmailer (= 7.2.1.1)
172
- actionpack (= 7.2.1.1)
173
- actiontext (= 7.2.1.1)
174
- actionview (= 7.2.1.1)
175
- activejob (= 7.2.1.1)
176
- activemodel (= 7.2.1.1)
177
- activerecord (= 7.2.1.1)
178
- activestorage (= 7.2.1.1)
179
- activesupport (= 7.2.1.1)
177
+ rails (7.2.2.1)
178
+ actioncable (= 7.2.2.1)
179
+ actionmailbox (= 7.2.2.1)
180
+ actionmailer (= 7.2.2.1)
181
+ actionpack (= 7.2.2.1)
182
+ actiontext (= 7.2.2.1)
183
+ actionview (= 7.2.2.1)
184
+ activejob (= 7.2.2.1)
185
+ activemodel (= 7.2.2.1)
186
+ activerecord (= 7.2.2.1)
187
+ activestorage (= 7.2.2.1)
188
+ activesupport (= 7.2.2.1)
180
189
  bundler (>= 1.15.0)
181
- railties (= 7.2.1.1)
190
+ railties (= 7.2.2.1)
182
191
  rails-dom-testing (2.2.0)
183
192
  activesupport (>= 5.0.0)
184
193
  minitest
185
194
  nokogiri (>= 1.6)
186
- rails-html-sanitizer (1.6.1)
195
+ rails-html-sanitizer (1.6.2)
187
196
  loofah (~> 2.21)
188
197
  nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
189
- railties (7.2.1.1)
190
- actionpack (= 7.2.1.1)
191
- activesupport (= 7.2.1.1)
198
+ railties (7.2.2.1)
199
+ actionpack (= 7.2.2.1)
200
+ activesupport (= 7.2.2.1)
192
201
  irb (~> 1.13)
193
202
  rackup (>= 1.0.0)
194
203
  rake (>= 12.2)
@@ -196,10 +205,10 @@ GEM
196
205
  zeitwerk (~> 2.6)
197
206
  rainbow (3.1.1)
198
207
  rake (13.2.1)
199
- rdoc (6.7.0)
208
+ rdoc (6.13.1)
200
209
  psych (>= 4.0.0)
201
210
  regexp_parser (2.10.0)
202
- reline (0.5.10)
211
+ reline (0.6.1)
203
212
  io-console (~> 0.5)
204
213
  rspec (3.13.0)
205
214
  rspec-core (~> 3.13.0)
@@ -214,7 +223,7 @@ GEM
214
223
  diff-lcs (>= 1.2.0, < 2.0)
215
224
  rspec-support (~> 3.13.0)
216
225
  rspec-support (3.13.1)
217
- rubocop (1.74.0)
226
+ rubocop (1.75.2)
218
227
  json (~> 2.3)
219
228
  language_server-protocol (~> 3.17.0.2)
220
229
  lint_roller (~> 1.1.0)
@@ -222,44 +231,46 @@ GEM
222
231
  parser (>= 3.3.0.2)
223
232
  rainbow (>= 2.2.2, < 4.0)
224
233
  regexp_parser (>= 2.9.3, < 3.0)
225
- rubocop-ast (>= 1.38.0, < 2.0)
234
+ rubocop-ast (>= 1.44.0, < 2.0)
226
235
  ruby-progressbar (~> 1.7)
227
236
  unicode-display_width (>= 2.4.0, < 4.0)
228
- rubocop-ast (1.39.0)
229
- parser (>= 3.3.1.0)
230
- rubocop-performance (1.22.1)
231
- rubocop (>= 1.48.1, < 2.0)
232
- rubocop-ast (>= 1.31.1, < 2.0)
233
- rubocop-shopify (2.15.1)
234
- rubocop (~> 1.51)
237
+ rubocop-ast (1.44.0)
238
+ parser (>= 3.3.7.2)
239
+ prism (~> 1.4)
240
+ rubocop-performance (1.25.0)
241
+ lint_roller (~> 1.1)
242
+ rubocop (>= 1.75.0, < 2.0)
243
+ rubocop-ast (>= 1.38.0, < 2.0)
244
+ rubocop-shopify (2.16.0)
245
+ rubocop (~> 1.62)
235
246
  ruby-progressbar (1.13.0)
236
- securerandom (0.3.1)
247
+ securerandom (0.4.1)
237
248
  simplecov (0.22.0)
238
249
  docile (~> 1.1)
239
250
  simplecov-html (~> 0.11)
240
251
  simplecov_json_formatter (~> 0.1)
241
252
  simplecov-html (0.13.1)
242
253
  simplecov_json_formatter (0.1.4)
243
- sqlite3 (2.1.1-aarch64-linux-gnu)
244
- sqlite3 (2.1.1-arm-linux-gnu)
245
- sqlite3 (2.1.1-arm64-darwin)
246
- sqlite3 (2.1.1-x86-linux-gnu)
247
- sqlite3 (2.1.1-x86_64-darwin)
248
- sqlite3 (2.1.1-x86_64-linux-gnu)
249
- stringio (3.1.1)
254
+ sqlite3 (2.6.0-aarch64-linux-gnu)
255
+ sqlite3 (2.6.0-arm-linux-gnu)
256
+ sqlite3 (2.6.0-arm64-darwin)
257
+ sqlite3 (2.6.0-x86-linux-gnu)
258
+ sqlite3 (2.6.0-x86_64-darwin)
259
+ sqlite3 (2.6.0-x86_64-linux-gnu)
260
+ stringio (3.1.6)
250
261
  thor (1.3.2)
251
- timeout (0.4.1)
262
+ timeout (0.4.3)
252
263
  tzinfo (2.0.6)
253
264
  concurrent-ruby (~> 1.0)
254
265
  unicode-display_width (3.1.4)
255
266
  unicode-emoji (~> 4.0, >= 4.0.4)
256
267
  unicode-emoji (4.0.4)
257
- useragent (0.16.10)
258
- webrick (1.8.2)
259
- websocket-driver (0.7.6)
268
+ useragent (0.16.11)
269
+ websocket-driver (0.7.7)
270
+ base64
260
271
  websocket-extensions (>= 0.1.0)
261
272
  websocket-extensions (0.1.5)
262
- zeitwerk (2.7.1)
273
+ zeitwerk (2.6.18)
263
274
 
264
275
  PLATFORMS
265
276
  aarch64-linux
@@ -272,6 +283,7 @@ PLATFORMS
272
283
  DEPENDENCIES
273
284
  bundler
274
285
  database_cleaner (~> 2.0)
286
+ ostruct
275
287
  pry-byebug
276
288
  rails (~> 7.2)
277
289
  rspec (~> 3.2)
data/README.md CHANGED
@@ -157,6 +157,14 @@ Money.new(money.value * exchange_rate, "JPY")
157
157
  money.convert_currency(exchange_rate, "JPY")
158
158
  ```
159
159
 
160
+ ### Crypto Currencies
161
+ To enable support for currencies listed in `crypto.yml` use
162
+ ``` ruby
163
+ Money.configure do |config|
164
+ config.experimental_crypto_currencies = true
165
+ end
166
+ ```
167
+
160
168
  ## Money column
161
169
 
162
170
  Since money internally uses BigDecimal it's logical to use a `decimal` column
@@ -237,4 +245,3 @@ To release a new version of the gem, follow these steps:
237
245
 
238
246
  Copyright (c) 2011 Shopify. See LICENSE.txt for
239
247
  further details.
240
-
data/config/crypto.yml ADDED
@@ -0,0 +1,15 @@
1
+ usdc:
2
+ priority: 100
3
+ iso_code: "USDC"
4
+ name: "USD Coin"
5
+ symbol: "USDC"
6
+ disambiguate_symbol: USDC
7
+ alternate_symbols: []
8
+ subunit: Cent
9
+ subunit_to_unit: 100
10
+ symbol_first: false
11
+ html_entity: "$"
12
+ decimal_mark: "."
13
+ thousands_separator: ","
14
+ iso_numeric: ''
15
+ smallest_denomination: 1
data/lib/money/config.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  class Money
4
4
  class Config
5
- attr_accessor :default_currency, :legacy_json_format, :legacy_deprecations
5
+ attr_accessor :default_currency, :legacy_json_format, :legacy_deprecations, :experimental_crypto_currencies
6
6
 
7
7
  def legacy_default_currency!
8
8
  @default_currency ||= Money::NULL_CURRENCY
@@ -16,10 +16,15 @@ class Money
16
16
  @legacy_json_format = true
17
17
  end
18
18
 
19
+ def experimental_crypto_currencies!
20
+ @experimental_crypto_currencies = true
21
+ end
22
+
19
23
  def initialize
20
24
  @default_currency = nil
21
25
  @legacy_json_format = false
22
26
  @legacy_deprecations = false
27
+ @experimental_crypto_currencies = false
23
28
  end
24
29
 
25
30
  def without_legacy_deprecations(&block)
@@ -5,14 +5,20 @@ require 'yaml'
5
5
  class Money
6
6
  class Currency
7
7
  module Loader
8
+ CURRENCY_DATA_PATH = File.expand_path("../../../config", __dir__)
9
+
8
10
  class << self
9
11
  def load_currencies
10
- currency_data_path = File.expand_path("../../../../config", __FILE__)
12
+ currencies = {}
13
+ currencies.merge!(YAML.load_file("#{CURRENCY_DATA_PATH}/currency_historic.yml"))
14
+ currencies.merge!(YAML.load_file("#{CURRENCY_DATA_PATH}/currency_non_iso.yml"))
15
+ currencies.merge!(YAML.load_file("#{CURRENCY_DATA_PATH}/currency_iso.yml"))
16
+ deep_deduplicate!(currencies)
17
+ end
11
18
 
19
+ def load_crypto_currencies
12
20
  currencies = {}
13
- currencies.merge!(YAML.load_file("#{currency_data_path}/currency_historic.yml"))
14
- currencies.merge!(YAML.load_file("#{currency_data_path}/currency_non_iso.yml"))
15
- currencies.merge!(YAML.load_file("#{currency_data_path}/currency_iso.yml"))
21
+ currencies.merge!(YAML.load_file("#{CURRENCY_DATA_PATH}/crypto.yml"))
16
22
  deep_deduplicate!(currencies)
17
23
  end
18
24
 
@@ -26,6 +26,10 @@ class Money
26
26
  def currencies
27
27
  @@currencies ||= Loader.load_currencies
28
28
  end
29
+
30
+ def crypto_currencies
31
+ @@crypto_currencies ||= Loader.load_crypto_currencies
32
+ end
29
33
  end
30
34
 
31
35
  attr_reader :iso_code,
@@ -41,6 +45,7 @@ class Money
41
45
 
42
46
  def initialize(currency_iso)
43
47
  data = self.class.currencies[currency_iso]
48
+ data = self.class.crypto_currencies[currency_iso] if data.nil? && Money.config.experimental_crypto_currencies
44
49
  raise UnknownCurrency, "Invalid iso4217 currency '#{currency_iso}'" unless data
45
50
  @symbol = data['symbol']
46
51
  @disambiguate_symbol = data['disambiguate_symbol'] || data['symbol']
@@ -3,7 +3,7 @@
3
3
  class Money
4
4
  module Parser
5
5
  class Simple
6
- SIGNED_DECIMAL_MATCHER = /\A-?\d*(?:\.\d*)?\z/
6
+ SIGNED_DECIMAL_MATCHER = /\A-?\d+(?:\.\d+)?\z/
7
7
 
8
8
  class << self
9
9
  # Parses an input string using BigDecimal, it always expects a dot character as a decimal separator and
data/lib/money/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Money
4
- VERSION = "3.0.3"
4
+ VERSION = "3.1.1"
5
5
  end
data/money.gemspec CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
18
18
 
19
19
  s.add_development_dependency("bundler")
20
20
  s.add_development_dependency("database_cleaner", "~> 2.0")
21
+ s.add_development_dependency("ostruct")
21
22
  s.add_development_dependency("rails", "~> 7.2")
22
23
  s.add_development_dependency("rspec", "~> 3.2")
23
24
  s.add_development_dependency("simplecov", ">= 0")
data/spec/config_spec.rb CHANGED
@@ -63,4 +63,34 @@ RSpec.describe "Money::Config" do
63
63
  end
64
64
  end
65
65
  end
66
+
67
+ describe 'experimental_crypto_currencies' do
68
+ it 'defaults to false' do
69
+ expect(Money::Config.new.experimental_crypto_currencies).to eq(false)
70
+ end
71
+
72
+ it 'can be set to true' do
73
+ config = Money::Config.new
74
+ config.experimental_crypto_currencies = true
75
+ expect(config.experimental_crypto_currencies).to be(true)
76
+ end
77
+
78
+ it 'can be set to true using the bang method' do
79
+ config = Money::Config.new
80
+ config.experimental_crypto_currencies!
81
+ expect(config.experimental_crypto_currencies).to eq(true)
82
+ end
83
+ end
84
+
85
+ describe 'legacy_json_format' do
86
+ it 'defaults to false' do
87
+ expect(Money::Config.new.legacy_json_format).to eq(false)
88
+ end
89
+
90
+ it 'can be set to true using the bang method' do
91
+ config = Money::Config.new
92
+ config.legacy_json_format!
93
+ expect(config.legacy_json_format).to eq(true)
94
+ end
95
+ end
66
96
  end
@@ -19,4 +19,22 @@ RSpec.describe Money::Currency::Loader do
19
19
  expect(subject.load_currencies['eek']['iso_code']).to eq('EEK')
20
20
  end
21
21
  end
22
+
23
+ describe 'load_crypto_currencies' do
24
+ it 'loads the crypto currency file' do
25
+ expect(subject.load_crypto_currencies['usdc']['iso_code']).to eq('USDC')
26
+ expect(subject.load_crypto_currencies['usdc']['name']).to eq('USD Coin')
27
+ expect(subject.load_crypto_currencies['usdc']['symbol']).to eq('USDC')
28
+ expect(subject.load_crypto_currencies['usdc']['disambiguate_symbol']).to eq('USDC')
29
+ expect(subject.load_crypto_currencies['usdc']['subunit_to_unit']).to eq(100)
30
+ expect(subject.load_crypto_currencies['usdc']['smallest_denomination']).to eq(1)
31
+ end
32
+
33
+ it 'returns frozen and deduplicated data' do
34
+ currencies = subject.load_crypto_currencies
35
+ expect(currencies).to be_frozen
36
+ expect(currencies['usdc']).to be_frozen
37
+ expect(currencies['usdc']['iso_code']).to be_frozen
38
+ end
39
+ end
22
40
  end
@@ -17,6 +17,20 @@ RSpec.describe "Currency" do
17
17
 
18
18
  let(:currency) { Money::Currency.new('usd') }
19
19
 
20
+ let(:mock_crypto_currency) do
21
+ {
22
+ "usdc" => {
23
+ "iso_code" => "USDC",
24
+ "name" => "USD Coin",
25
+ "symbol" => "USDC",
26
+ "disambiguate_symbol" => "USDC",
27
+ "subunit_to_unit" => 100,
28
+ "smallest_denomination" => 1,
29
+ "decimal_mark" => "."
30
+ }
31
+ }
32
+ end
33
+
20
34
  describe ".new" do
21
35
  it "is constructable with a uppercase string" do
22
36
  expect(Money::Currency.new('USD').iso_code).to eq('USD')
@@ -37,6 +51,24 @@ RSpec.describe "Currency" do
37
51
  it "raises when the currency is nil" do
38
52
  expect { Money::Currency.new(nil) }.to raise_error(Money::Currency::UnknownCurrency)
39
53
  end
54
+
55
+ it "looks up crypto currencies when enabled" do
56
+
57
+ allow(Money::Currency).to receive(:currencies).and_return({})
58
+ allow(Money::Currency).to receive(:crypto_currencies).and_return(mock_crypto_currency)
59
+
60
+ configure(experimental_crypto_currencies: true) do
61
+ currency = Money::Currency.new('USDC')
62
+ expect(currency.iso_code).to eq('USDC')
63
+ expect(currency.symbol).to eq('USDC')
64
+ end
65
+ end
66
+
67
+ it "doesn't look up crypto currencies when disabled" do
68
+ configure(experimental_crypto_currencies: false) do
69
+ expect(Money::Currency.find("USDC")).to be_nil
70
+ end
71
+ end
40
72
  end
41
73
 
42
74
  describe ".find" do
@@ -47,6 +79,23 @@ RSpec.describe "Currency" do
47
79
  it "returns a valid currency" do
48
80
  expect(Money::Currency.find('usd')).to eq(Money::Currency.new('usd'))
49
81
  end
82
+
83
+ it "returns a crypto currency when enabled" do
84
+ allow(Money::Currency).to receive(:currencies).and_return({})
85
+ allow(Money::Currency).to receive(:crypto_currencies).and_return(mock_crypto_currency)
86
+
87
+ configure(experimental_crypto_currencies: true) do
88
+ expect(Money::Currency.find('USDC')).not_to eq(nil)
89
+ expect(Money::Currency.find('USDC').symbol).to eq("USDC")
90
+ end
91
+ end
92
+
93
+ it "returns nil for crypto currency when disabled" do
94
+ configure(experimental_crypto_currencies: false) do
95
+ expect(Money.config.experimental_crypto_currencies).to eq(false)
96
+ expect(Money::Currency.find('USDC')).to eq(nil)
97
+ end
98
+ end
50
99
  end
51
100
 
52
101
  describe ".find!" do
@@ -59,6 +108,21 @@ RSpec.describe "Currency" do
59
108
  end
60
109
  end
61
110
 
111
+ describe ".crypto_currencies" do
112
+ it "loads crypto currencies from the loader" do
113
+ old_currencies = Money::Currency.class_variable_get(:@@crypto_currencies) rescue nil
114
+ Money::Currency.class_variable_set(:@@crypto_currencies, nil)
115
+
116
+ allow(Money::Currency::Loader).to receive(:load_crypto_currencies).and_return(mock_crypto_currency)
117
+
118
+ expect(Money::Currency.crypto_currencies).to eq(mock_crypto_currency)
119
+ expect(Money::Currency.crypto_currencies).to eq(mock_crypto_currency) # Second call to verify caching
120
+ expect(Money::Currency::Loader).to have_received(:load_crypto_currencies).once
121
+
122
+ Money::Currency.class_variable_set(:@@crypto_currencies, old_currencies) if old_currencies
123
+ end
124
+ end
125
+
62
126
  CURRENCY_DATA.each do |attribute, value|
63
127
  describe "##{attribute}" do
64
128
  it 'returns the correct value' do
data/spec/spec_helper.rb CHANGED
@@ -12,6 +12,7 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
12
12
  require 'rspec'
13
13
  require 'pry-byebug'
14
14
  require 'database_cleaner'
15
+ require 'ostruct'
15
16
 
16
17
  require 'rails'
17
18
  require 'active_record'
@@ -71,16 +72,20 @@ RSpec::Matchers.define :quack_like do
71
72
  end
72
73
 
73
74
 
74
- def configure(default_currency: nil, legacy_json_format: nil, legacy_deprecations: nil, legacy_default_currency: nil)
75
+ def configure(default_currency: nil, legacy_json_format: nil, legacy_deprecations: nil, legacy_default_currency: nil, experimental_crypto_currencies: nil)
76
+ old_currencies = Money::Currency.class_variable_get(:@@loaded_currencies) rescue {}
77
+ Money::Currency.class_variable_set(:@@loaded_currencies, {})
75
78
  old_config = Money.config
76
79
  Money.config = Money::Config.new.tap do |config|
77
80
  config.default_currency = default_currency if default_currency
78
81
  config.legacy_json_format! if legacy_json_format
79
82
  config.legacy_deprecations! if legacy_deprecations
80
83
  config.legacy_default_currency! if legacy_default_currency
84
+ config.experimental_crypto_currencies! if experimental_crypto_currencies
81
85
  end
82
86
  yield
83
87
  ensure
88
+ Money::Currency.class_variable_set(:@@loaded_currencies, old_currencies)
84
89
  Money.config = old_config
85
90
  end
86
91
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shopify-money
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.3
4
+ version: 3.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify Inc
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-03-24 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: bundler
@@ -37,6 +37,20 @@ dependencies:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
39
  version: '2.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: ostruct
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
40
54
  - !ruby/object:Gem::Dependency
41
55
  name: rails
42
56
  requirement: !ruby/object:Gem::Requirement
@@ -115,6 +129,7 @@ files:
115
129
  - Rakefile
116
130
  - UPGRADING.md
117
131
  - bin/console
132
+ - config/crypto.yml
118
133
  - config/currency_historic.yml
119
134
  - config/currency_iso.yml
120
135
  - config/currency_non_iso.yml
@@ -188,7 +203,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
188
203
  - !ruby/object:Gem::Version
189
204
  version: '0'
190
205
  requirements: []
191
- rubygems_version: 3.6.6
206
+ rubygems_version: 3.6.8
192
207
  specification_version: 4
193
208
  summary: Shopify's money gem
194
209
  test_files: []