shopify-money 1.2.1 → 1.3.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
  SHA256:
3
- metadata.gz: de174294a88067d61cfcf9321bc62fc3de2b4c265e089d07ff8bedca30ce782a
4
- data.tar.gz: 9cb65f619cf3ceb3054437c3ede664d9fa949859af7858e1f280d82f983cdace
3
+ metadata.gz: 968f61cd2788112e0310dad876e0100eef9bdc375b39d10b7a34e98cb23650fc
4
+ data.tar.gz: 279e00665cf1561add517a797afc0d732410813233da3dfe6c09225de9108445
5
5
  SHA512:
6
- metadata.gz: cfd7348a2506689d46b70eebb613c4ebdb3ef33ad31ae361d130c4348691f90049a66a50920f96c9f39f532bfe3fc0901c939a6d2e0be6d90d6d045165209f37
7
- data.tar.gz: 729391b98fbbfc671726cedd35d6ee13afed28f6b88b98d825eb6cae23cc968de72437fdacf51bf5f68dbaf3aabf4f84d296709764031ce83128a4010012a1b7
6
+ metadata.gz: 5abf64ebc32b62bbb31906b977a05e66362dc68453c454efedfe0c83ae5743454c526882fbec437f4874d36ae5d384947c64175a8d50fba0fb339c58d77500c5
7
+ data.tar.gz: 76a439a0dca761dc12b3fd44e90737aee88fe26f11ed20af1ab9eba45ce20d6fa55265c9130ee034548d5b799621eef4d328808ca12fcfdcca6b02e258a496b4
data/README.md CHANGED
@@ -1,20 +1,17 @@
1
1
  # money
2
2
 
3
- [![tests](https://github.com/Shopify/money/workflows/tests/badge.svg)](https://github.com/Shopify/money/actions?query=workflow%3Atests+branch%3Amaster)
3
+ [![tests](https://github.com/Shopify/money/workflows/tests/badge.svg)](https://github.com/Shopify/money/actions?query=workflow%3Atests+branch%3Amain)
4
4
 
5
5
 
6
6
  money_column expects a DECIMAL(21,3) database field.
7
7
 
8
8
  ### Features
9
9
 
10
- - Keeps value in decimal
11
- - Provides a `Money` class which encapsulates all information about an certain
12
- amount of money, such as its value and its currency.
13
- - Provides a `Money::Currency` class which encapsulates all information about
14
- a monetary unit.
15
- - Does NOT provides APIs for exchanging money from one currency to another.
16
- - wont lose pennies during division!
17
- - Money::NullCurrency for no currency support
10
+ - Provides a `Money` class which encapsulates all information about a certain amount of money, such as its value and its currency.
11
+ - Provides a `Money::Currency` class which encapsulates all information about a monetary unit.
12
+ - Represents monetary values as decimals. No need to convert your amounts every time you use them. Easily understand the data in your DB.
13
+ - Does NOT provide APIs for exchanging money from one currency to another.
14
+ - Will not lose pennies during divisions
18
15
 
19
16
  ## Installation
20
17
 
@@ -22,7 +19,7 @@ money_column expects a DECIMAL(21,3) database field.
22
19
 
23
20
  ## Upgrading to v1.0
24
21
 
25
- see instructions and breaking changes: https://github.com/Shopify/money/blob/master/UPGRADING.md
22
+ see instructions and breaking changes: https://github.com/Shopify/money/blob/main/UPGRADING.md
26
23
 
27
24
  ## Usage
28
25
 
@@ -171,7 +168,7 @@ Money/UnsafeToMoney:
171
168
 
172
169
  ## Contributing to money
173
170
 
174
- - Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
171
+ - Check out the latest main to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
175
172
  - Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
176
173
  - Fork the project
177
174
  - Start a feature/bugfix branch
@@ -14,6 +14,14 @@ end
14
14
  # '100.37'.to_money => #<Money @cents=10037>
15
15
  class String
16
16
  def to_money(currency = nil)
17
- Money::Parser::Fuzzy.parse(self, currency)
17
+ if Money.config.legacy_deprecations
18
+ Money::Parser::Fuzzy.parse(self, currency).tap do |money|
19
+ message = "`#{self}.to_money` will behave like `Money.new` and raise on the next release. " \
20
+ "To parse user input, do so on the browser and use the user's locale."
21
+ Money.deprecate(message) if money.value != BigDecimal(self, exception: false)
22
+ end
23
+ else
24
+ Money.new(self, currency)
25
+ end
18
26
  end
19
27
  end
@@ -3,7 +3,10 @@ Money.class_eval do
3
3
  ACTIVE_SUPPORT_DEFINED = defined?(ActiveSupport)
4
4
 
5
5
  def self.active_support_deprecator
6
- @active_support_deprecator ||= ActiveSupport::Deprecation.new('1.0.0', 'Shopify/Money')
6
+ @active_support_deprecator ||= begin
7
+ next_major_version = Money::VERSION.split(".").first.to_i + 1
8
+ ActiveSupport::Deprecation.new("#{next_major_version}.0.0", "Shopify/Money")
9
+ end
7
10
  end
8
11
 
9
12
  def self.deprecate(message)
data/lib/money/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  class Money
3
- VERSION = "1.2.1"
3
+ VERSION = "1.3.0"
4
4
  end
@@ -32,7 +32,8 @@ module RuboCop
32
32
  PATTERN
33
33
 
34
34
  def on_send(node)
35
- money_new(node) do |_amount, currency_arg|
35
+ money_new(node) do |amount, currency_arg|
36
+ return if amount&.splat_type?
36
37
  return if currency_arg
37
38
 
38
39
  add_offense(node, message: 'Money is missing currency argument')
@@ -16,7 +16,7 @@ module RuboCop
16
16
 
17
17
  def on_send(node)
18
18
  return unless node.method?(:to_money)
19
- return if node.receiver.is_a?(AST::NumericNode)
19
+ return if node.receiver.nil? || node.receiver.is_a?(AST::NumericNode)
20
20
 
21
21
  add_offense(node, location: :selector)
22
22
  end
@@ -43,8 +43,26 @@ RSpec.describe String do
43
43
  it_should_behave_like "an object supporting to_money"
44
44
 
45
45
  it "parses an empty string to Money.zero" do
46
- expect(''.to_money).to eq(Money.new(0, Money::NULL_CURRENCY))
47
- expect(' '.to_money).to eq(Money.new(0, Money::NULL_CURRENCY))
46
+ expect("".to_money("USD")).to eq(Money.new(0, "USD"))
47
+
48
+ configure(legacy_deprecations: true) do
49
+ expect(Money).to receive(:deprecate).once
50
+ expect(" ".to_money("CAD")).to eq(Money.new(0, "CAD"))
51
+ end
52
+ end
53
+
54
+ it "#to_money to handle thousands delimiters" do
55
+ configure(legacy_deprecations: true) do
56
+ expect(Money).to receive(:deprecate).exactly(4).times
57
+ expect("29.000".to_money("USD")).to eq(Money.new("29000", "USD"))
58
+ expect("29.000,00".to_money("USD")).to eq(Money.new("29000", "USD"))
59
+ expect("29,000".to_money("USD")).to eq(Money.new("29000", "USD"))
60
+ expect("29,000.00".to_money("USD")).to eq(Money.new("29000", "USD"))
61
+ end
62
+ end
63
+
64
+ it "#to_money should behave like Money.new with three decimal places amounts" do
65
+ expect("29.000".to_money("USD")).to eq(Money.new("29.00", "USD"))
48
66
  end
49
67
  end
50
68
 
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe "deprecations" do
5
+ it "has the deprecation_horizon as the next major release" do
6
+ allow(Money).to receive(:const_get).with('VERSION').and_return("1.2.3")
7
+ expect(Money.active_support_deprecator.deprecation_horizon).to eq("2.0.0")
8
+ end
9
+ end
@@ -26,6 +26,13 @@ RSpec.describe RuboCop::Cop::Money::MissingCurrency do
26
26
  RUBY
27
27
  end
28
28
 
29
+ it 'does not register an offense for Money.new with splat argument' do
30
+ expect_no_offenses(<<~RUBY)
31
+ value_and_currency = [1, 'CAD']
32
+ Money.new(*value_and_currency)
33
+ RUBY
34
+ end
35
+
29
36
  it 'registers an offense and corrects for Money.new without a currency argument' do
30
37
  expect_offense(<<~RUBY)
31
38
  Money.new
@@ -53,5 +53,11 @@ RSpec.describe RuboCop::Cop::Money::UnsafeToMoney do
53
53
  Money.new(obj.money, 'USD')
54
54
  RUBY
55
55
  end
56
+
57
+ it 'does not register an offense for receiver-less calls' do
58
+ expect_no_offenses(<<~RUBY)
59
+ a = to_money
60
+ RUBY
61
+ end
56
62
  end
57
63
  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.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify Inc
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-20 00:00:00.000000000 Z
11
+ date: 2023-08-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -149,6 +149,7 @@ files:
149
149
  - spec/core_extensions_spec.rb
150
150
  - spec/currency/loader_spec.rb
151
151
  - spec/currency_spec.rb
152
+ - spec/deprecations_spec.rb
152
153
  - spec/helpers_spec.rb
153
154
  - spec/money_column_spec.rb
154
155
  - spec/money_spec.rb
@@ -185,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
185
186
  - !ruby/object:Gem::Version
186
187
  version: '0'
187
188
  requirements: []
188
- rubygems_version: 3.4.14
189
+ rubygems_version: 3.4.17
189
190
  signing_key:
190
191
  specification_version: 4
191
192
  summary: Shopify's money gem
@@ -195,6 +196,7 @@ test_files:
195
196
  - spec/core_extensions_spec.rb
196
197
  - spec/currency/loader_spec.rb
197
198
  - spec/currency_spec.rb
199
+ - spec/deprecations_spec.rb
198
200
  - spec/helpers_spec.rb
199
201
  - spec/money_column_spec.rb
200
202
  - spec/money_spec.rb