shopify-money 3.0.0 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/tests.yml +3 -3
  3. data/.gitignore +2 -1
  4. data/.rubocop.yml +36 -0
  5. data/.ruby-version +1 -1
  6. data/Gemfile +4 -1
  7. data/Gemfile.lock +160 -121
  8. data/Rakefile +2 -2
  9. data/config/currency_historic.yml +44 -2
  10. data/config/currency_iso.yml +38 -64
  11. data/lib/money/allocator.rb +13 -9
  12. data/lib/money/config.rb +8 -0
  13. data/lib/money/core_extensions.rb +2 -1
  14. data/lib/money/currency/loader.rb +4 -3
  15. data/lib/money/currency.rb +12 -3
  16. data/lib/money/deprecations.rb +22 -4
  17. data/lib/money/errors.rb +1 -0
  18. data/lib/money/helpers.rb +2 -1
  19. data/lib/money/money.rb +53 -29
  20. data/lib/money/null_currency.rb +11 -3
  21. data/lib/money/parser/accounting.rb +1 -0
  22. data/lib/money/parser/fuzzy.rb +14 -13
  23. data/lib/money/parser/locale_aware.rb +3 -6
  24. data/lib/money/parser/simple.rb +2 -1
  25. data/lib/money/rails/job_argument_serializer.rb +0 -1
  26. data/lib/money/railtie.rb +5 -3
  27. data/lib/money/splitter.rb +20 -24
  28. data/lib/money/version.rb +2 -1
  29. data/lib/money.rb +1 -0
  30. data/lib/money_column/active_record_hooks.rb +9 -6
  31. data/lib/money_column/active_record_type.rb +7 -4
  32. data/lib/money_column/railtie.rb +2 -1
  33. data/lib/money_column.rb +1 -0
  34. data/lib/rubocop/cop/money/missing_currency.rb +16 -23
  35. data/lib/rubocop/cop/money/zero_money.rb +7 -13
  36. data/lib/shopify-money.rb +1 -0
  37. data/money.gemspec +6 -6
  38. data/spec/config_spec.rb +14 -0
  39. data/spec/money_spec.rb +38 -0
  40. data/spec/rubocop/cop/money/missing_currency_spec.rb +7 -7
  41. data/spec/rubocop/cop/money/zero_money_spec.rb +2 -2
  42. metadata +18 -42
@@ -1,43 +1,44 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Money
3
4
  module Parser
4
5
  class Fuzzy
5
6
  class MoneyFormatError < ArgumentError; end
6
7
 
7
- MARKS = %w[. , · ’ ˙ '] + [' ']
8
+ MARKS = ['.', ',', '·', '', '˙', "'", ' '].freeze
8
9
 
9
10
  ESCAPED_MARKS = Regexp.escape(MARKS.join)
10
11
  ESCAPED_NON_SPACE_MARKS = Regexp.escape((MARKS - [' ']).join)
11
12
  ESCAPED_NON_DOT_MARKS = Regexp.escape((MARKS - ['.']).join)
12
13
  ESCAPED_NON_COMMA_MARKS = Regexp.escape((MARKS - [',']).join)
13
14
 
14
- NUMERIC_REGEX = /(
15
+ NUMERIC_REGEX = %r{(
15
16
  [\+\-]?
16
17
  [\d#{ESCAPED_NON_SPACE_MARKS}][\d#{ESCAPED_MARKS}]*
17
- )/ix
18
+ )}ix
18
19
 
19
20
  # 1,234,567.89
20
- DOT_DECIMAL_REGEX = /\A
21
+ DOT_DECIMAL_REGEX = %r{\A
21
22
  [\+\-]?
22
23
  (?:
23
24
  (?:\d+)
24
25
  (?:[#{ESCAPED_NON_DOT_MARKS}]\d{3})+
25
26
  (?:\.\d{2,})?
26
27
  )
27
- \z/ix
28
+ \z}ix
28
29
 
29
30
  # 1.234.567,89
30
- COMMA_DECIMAL_REGEX = /\A
31
+ COMMA_DECIMAL_REGEX = %r{\A
31
32
  [\+\-]?
32
33
  (?:
33
34
  (?:\d+)
34
35
  (?:[#{ESCAPED_NON_COMMA_MARKS}]\d{3})+
35
36
  (?:\,\d{2,})?
36
37
  )
37
- \z/ix
38
+ \z}ix
38
39
 
39
40
  # 12,34,567.89
40
- INDIAN_NUMERIC_REGEX = /\A
41
+ INDIAN_NUMERIC_REGEX = %r{\A
41
42
  [\+\-]?
42
43
  (?:
43
44
  (?:\d+)
@@ -45,17 +46,17 @@ class Money
45
46
  (?:\,\d{3})
46
47
  (?:\.\d{2})?
47
48
  )
48
- \z/ix
49
+ \z}ix
49
50
 
50
51
  # 1,1123,4567.89
51
- CHINESE_NUMERIC_REGEX = /\A
52
+ CHINESE_NUMERIC_REGEX = %r{\A
52
53
  [\+\-]?
53
54
  (?:
54
55
  (?:\d+)
55
56
  (?:\,\d{4})+
56
57
  (?:\.\d{2})?
57
58
  )
58
- \z/ix
59
+ \z}ix
59
60
 
60
61
  def self.parse(input, currency = nil, **options)
61
62
  new.parse(input, currency, **options)
@@ -111,11 +112,11 @@ class Money
111
112
  # remove end of string mark
112
113
  number.sub!(/[#{ESCAPED_MARKS}]\z/, '')
113
114
 
114
- if amount = number[DOT_DECIMAL_REGEX] || number[INDIAN_NUMERIC_REGEX] || number[CHINESE_NUMERIC_REGEX]
115
+ if (amount = number[DOT_DECIMAL_REGEX] || number[INDIAN_NUMERIC_REGEX] || number[CHINESE_NUMERIC_REGEX])
115
116
  return amount.tr(ESCAPED_NON_DOT_MARKS, '')
116
117
  end
117
118
 
118
- if amount = number[COMMA_DECIMAL_REGEX]
119
+ if (amount = number[COMMA_DECIMAL_REGEX])
119
120
  return amount.tr(ESCAPED_NON_COMMA_MARKS, '').sub(',', '.')
120
121
  end
121
122
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Money
3
4
  module Parser
4
5
  class LocaleAware
@@ -7,18 +8,14 @@ class Money
7
8
  class << self
8
9
  # The +Proc+ called to get the current locale decimal separator. In Rails apps this defaults to the same lookup
9
10
  # ActionView's +number_to_currency+ helper will use to format the monetary amount for display.
10
- def decimal_separator_resolver
11
- @decimal_separator_resolver
12
- end
11
+ attr_reader :decimal_separator_resolver
13
12
 
14
13
  # Set the default +Proc+ to determine the current locale decimal separator.
15
14
  #
16
15
  # @example
17
16
  # Money::Parser::LocaleAware.decimal_separator_resolver =
18
17
  # ->() { MyFormattingLibrary.current_locale.decimal.separator }
19
- def decimal_separator_resolver=(proc)
20
- @decimal_separator_resolver = proc
21
- end
18
+ attr_writer :decimal_separator_resolver
22
19
 
23
20
  # Parses an input string, normalizing some non-ASCII characters to their equivalent ASCII, then discarding any
24
21
  # character that is not a digit, hyphen-minus or the decimal separator. To prevent user confusion, make sure
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Money
3
4
  module Parser
4
5
  class Simple
5
- SIGNED_DECIMAL_MATCHER = /\A-?\d*(?:\.\d*)?\z/.freeze
6
+ SIGNED_DECIMAL_MATCHER = /\A-?\d*(?:\.\d*)?\z/
6
7
 
7
8
  class << self
8
9
  # Parses an input string using BigDecimal, it always expects a dot character as a decimal separator and
@@ -19,4 +19,3 @@ class Money
19
19
  end
20
20
  end
21
21
  end
22
-
data/lib/money/railtie.rb CHANGED
@@ -3,9 +3,11 @@
3
3
  class Money
4
4
  class Railtie < Rails::Railtie
5
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
6
+ ActiveSupport.on_load(:active_job) do
7
+ if defined?(ActiveJob::Serializers)
8
+ require_relative "rails/job_argument_serializer"
9
+ ActiveJob::Serializers.add_serializers(::Money::Rails::JobArgumentSerializer)
10
+ end
9
11
  end
10
12
  end
11
13
 
@@ -11,7 +11,7 @@ class Money
11
11
  @split = nil
12
12
  end
13
13
 
14
- protected attr_writer :split
14
+ protected attr_writer(:split)
15
15
 
16
16
  def split
17
17
  @split ||= begin
@@ -35,19 +35,17 @@ class Money
35
35
  each do |money|
36
36
  return money
37
37
  end
38
+ elsif count >= size
39
+ to_a
38
40
  else
39
- if count >= size
40
- to_a
41
- else
42
- result = Array.new(count)
43
- index = 0
44
- each do |money|
45
- result[index] = money
46
- index += 1
47
- break if index == count
48
- end
49
- result
41
+ result = Array.new(count)
42
+ index = 0
43
+ each do |money|
44
+ result[index] = money
45
+ index += 1
46
+ break if index == count
50
47
  end
48
+ result
51
49
  end
52
50
  end
53
51
 
@@ -56,20 +54,18 @@ class Money
56
54
  reverse_each do |money|
57
55
  return money
58
56
  end
57
+ elsif count >= size
58
+ to_a
59
59
  else
60
- if count >= size
61
- to_a
62
- else
63
- result = Array.new(count)
64
- index = 0
65
- reverse_each do |money|
66
- result[index] = money
67
- index += 1
68
- break if index == count
69
- end
70
- result.reverse!
71
- result
60
+ result = Array.new(count)
61
+ index = 0
62
+ reverse_each do |money|
63
+ result[index] = money
64
+ index += 1
65
+ break if index == count
72
66
  end
67
+ result.reverse!
68
+ result
73
69
  end
74
70
  end
75
71
 
data/lib/money/version.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Money
3
- VERSION = "3.0.0"
4
+ VERSION = "3.0.1"
4
5
  end
data/lib/money.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'money/version'
3
4
  require_relative 'money/parser/fuzzy'
4
5
  require_relative 'money/helpers'
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module MoneyColumn
3
4
  class CurrencyReadOnlyError < StandardError; end
4
5
 
@@ -82,7 +83,7 @@ module MoneyColumn
82
83
  currency_column: currency_column,
83
84
  currency: currency,
84
85
  currency_read_only: currency_read_only,
85
- coerce_null: coerce_null
86
+ coerce_null: coerce_null,
86
87
  )
87
88
 
88
89
  if options[:currency_column]
@@ -96,11 +97,11 @@ module MoneyColumn
96
97
 
97
98
  attribute(column_string, MoneyColumn::ActiveRecordType.new)
98
99
 
99
- define_method column do
100
+ define_method(column) do
100
101
  read_money_attribute(column_string)
101
102
  end
102
103
 
103
- define_method "#{column}=" do |money|
104
+ define_method("#{column}=") do |money|
104
105
  write_money_attribute(column_string, money)
105
106
  end
106
107
  end
@@ -109,8 +110,10 @@ module MoneyColumn
109
110
  private
110
111
 
111
112
  def normalize_money_column_options(options)
112
- raise ArgumentError, 'cannot set both :currency_column and :currency options' if options[:currency] && options[:currency_column]
113
- raise ArgumentError, 'must set one of :currency_column or :currency options' unless options[:currency] || options[:currency_column]
113
+ raise ArgumentError,
114
+ 'cannot set both :currency_column and :currency options' if options[:currency] && options[:currency_column]
115
+ raise ArgumentError,
116
+ 'must set one of :currency_column or :currency options' unless options[:currency] || options[:currency_column]
114
117
 
115
118
  if options[:currency]
116
119
  options[:currency] = Money::Currency.find!(options[:currency]).to_s.freeze
@@ -126,7 +129,7 @@ module MoneyColumn
126
129
  def clear_cache_on_currency_change(currency_column)
127
130
  return if money_column_options.any? { |_, opt| opt[:currency_column] == currency_column }
128
131
 
129
- define_method "#{currency_column}=" do |value|
132
+ define_method("#{currency_column}=") do |value|
130
133
  clear_money_column_cache
131
134
  super(value)
132
135
  end
@@ -1,7 +1,10 @@
1
1
  # frozen_string_literal: true
2
- class MoneyColumn::ActiveRecordType < ActiveRecord::Type::Decimal
3
- def serialize(money)
4
- return nil unless money
5
- super(money.to_d)
2
+
3
+ module MoneyColumn
4
+ class ActiveRecordType < ActiveRecord::Type::Decimal
5
+ def serialize(money)
6
+ return unless money
7
+ super(money.to_d)
8
+ end
6
9
  end
7
10
  end
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module MoneyColumn
3
4
  class Railtie < Rails::Railtie
4
- ActiveSupport.on_load :active_record do
5
+ ActiveSupport.on_load(:active_record) do
5
6
  ActiveRecord::Base.send(:include, MoneyColumn::ActiveRecordHooks)
6
7
  end
7
8
  end
data/lib/money_column.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'money_column/active_record_hooks'
3
4
  require_relative 'money_column/active_record_type'
4
5
  require_relative 'money_column/railtie'
@@ -3,7 +3,8 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Money
6
- class MissingCurrency < Cop
6
+ class MissingCurrency < Base
7
+ extend RuboCop::Cop::AutoCorrector
7
8
  # `Money.new()` without a currency argument cannot guarantee correctness:
8
9
  # - no error raised for cross-currency computation (e.g. 5 CAD + 5 USD)
9
10
  # - #subunits returns wrong values for 0 and 3 decimals currencies
@@ -32,48 +33,40 @@ module RuboCop
32
33
  PATTERN
33
34
 
34
35
  def on_send(node)
36
+ receiver, method, _ = *node
37
+
35
38
  money_new(node) do |amount, currency_arg|
36
39
  return if amount&.splat_type?
37
40
  return if currency_arg
38
41
 
39
- add_offense(node, message: 'Money is missing currency argument')
40
- end
41
-
42
- if to_money_block?(node) || to_money_without_currency?(node)
43
- add_offense(node, message: 'to_money is missing currency argument')
44
- end
45
- end
46
- alias on_csend on_send
47
-
48
- def autocorrect(node)
49
- receiver, method, _ = *node
50
-
51
- lambda do |corrector|
52
- money_new(node) do |amount, currency_arg|
53
- return if currency_arg
54
-
42
+ add_offense(node, message: 'Money is missing currency argument') do |corrector|
55
43
  corrector.replace(
56
44
  node.loc.expression,
57
- "#{receiver.source}.#{method}(#{amount&.source || 0}, #{replacement_currency})"
45
+ "#{receiver.source}.#{method}(#{amount&.source || 0}, #{replacement_currency})",
58
46
  )
59
47
  end
48
+ end
60
49
 
61
- if to_money_without_currency?(node)
62
- corrector.insert_after(node.loc.expression, "(#{replacement_currency})")
63
- elsif to_money_block?(node)
50
+ if to_money_block?(node)
51
+ add_offense(node, message: 'to_money is missing currency argument') do |corrector|
64
52
  corrector.replace(
65
53
  node.loc.expression,
66
- "#{receiver.source}.#{method} { |x| x.to_money(#{replacement_currency}) }"
54
+ "#{receiver.source}.#{method} { |x| x.to_money(#{replacement_currency}) }",
67
55
  )
68
56
  end
57
+ elsif to_money_without_currency?(node)
58
+ add_offense(node, message: 'to_money is missing currency argument') do |corrector|
59
+ corrector.insert_after(node.loc.expression, "(#{replacement_currency})")
60
+ end
69
61
  end
70
62
  end
63
+ alias_method :on_csend, :on_send
71
64
 
72
65
  private
73
66
 
74
67
  def replacement_currency
75
68
  if cop_config['ReplacementCurrency']
76
- "'#{cop_config['ReplacementCurrency']}'"
69
+ "'#{cop_config["ReplacementCurrency"]}'"
77
70
  else
78
71
  'Money::NULL_CURRENCY'
79
72
  end
@@ -3,7 +3,9 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Money
6
- class ZeroMoney < Cop
6
+ class ZeroMoney < Base
7
+ extend RuboCop::Cop::AutoCorrector
8
+
7
9
  # `Money.zero` and it's alias `empty`, with or without currency
8
10
  # argument is removed in favour of the more explicit Money.new
9
11
  # syntax. Supplying it with a real currency is preferred for
@@ -31,21 +33,13 @@ module RuboCop
31
33
  PATTERN
32
34
 
33
35
  def on_send(node)
34
- money_zero(node) do |currency_arg|
35
- add_offense(node, message: format(MSG, currency: replacement_currency(currency_arg)))
36
- end
37
- end
38
-
39
- def autocorrect(node)
40
36
  receiver, _ = *node
41
37
 
42
- lambda do |corrector|
43
- money_zero(node) do |currency_arg|
44
- replacement_currency = replacement_currency(currency_arg)
45
-
38
+ money_zero(node) do |currency_arg|
39
+ add_offense(node, message: format(MSG, currency: replacement_currency(currency_arg))) do |corrector|
46
40
  corrector.replace(
47
41
  node.loc.expression,
48
- "#{receiver.source}.new(0, #{replacement_currency})"
42
+ "#{receiver.source}.new(0, #{replacement_currency(currency_arg)})",
49
43
  )
50
44
  end
51
45
  end
@@ -55,7 +49,7 @@ module RuboCop
55
49
 
56
50
  def replacement_currency(currency_arg)
57
51
  return currency_arg.first.source unless currency_arg.empty?
58
- return "'#{cop_config['ReplacementCurrency']}'" if cop_config['ReplacementCurrency']
52
+ return "'#{cop_config["ReplacementCurrency"]}'" if cop_config['ReplacementCurrency']
59
53
 
60
54
  'Money::NULL_CURRENCY'
61
55
  end
data/lib/shopify-money.rb CHANGED
@@ -1,2 +1,3 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'money'
data/money.gemspec CHANGED
@@ -1,5 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  # frozen_string_literal: true
3
+
3
4
  require_relative "lib/money/version"
4
5
 
5
6
  Gem::Specification.new do |s|
@@ -16,16 +17,15 @@ Gem::Specification.new do |s|
16
17
  s.metadata['allowed_push_host'] = "https://rubygems.org"
17
18
 
18
19
  s.add_development_dependency("bundler")
19
- s.add_development_dependency("simplecov", ">= 0")
20
- s.add_development_dependency("rails", "~> 6.0")
21
- s.add_development_dependency("rspec", "~> 3.2")
22
20
  s.add_development_dependency("database_cleaner", "~> 2.0")
21
+ s.add_development_dependency("rails", "~> 7.2")
22
+ s.add_development_dependency("rspec", "~> 3.2")
23
+ s.add_development_dependency("simplecov", ">= 0")
23
24
  s.add_development_dependency("sqlite3")
24
25
 
25
- s.required_ruby_version = '>= 3.0'
26
+ s.required_ruby_version = '>= 3.1'
26
27
 
27
- s.files = `git ls-files`.split($/)
28
+ s.files = %x(git ls-files).split($/)
28
29
  s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
29
- s.test_files = s.files.grep(%r{^(test|spec|features)/})
30
30
  s.require_paths = ["lib"]
31
31
  end
data/spec/config_spec.rb CHANGED
@@ -2,6 +2,20 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  RSpec.describe "Money::Config" do
5
+ describe 'thread safety' do
6
+ it 'does not share the same config across threads' do
7
+ configure(legacy_deprecations: true, default_currency: 'USD') do
8
+ expect(Money.config.legacy_deprecations).to eq(true)
9
+ expect(Money.default_currency).to eq('USD')
10
+ thread = Thread.new do
11
+ expect(Money.config.legacy_deprecations).to eq(false)
12
+ expect(Money.default_currency).to eq(nil)
13
+ end
14
+ thread.join
15
+ end
16
+ end
17
+ end
18
+
5
19
  describe 'legacy_deprecations' do
6
20
  it "respects the default currency" do
7
21
  configure(default_currency: 'USD', legacy_deprecations: true) do
data/spec/money_spec.rb CHANGED
@@ -62,6 +62,14 @@ RSpec.describe "Money" do
62
62
  end
63
63
  end
64
64
 
65
+ it "#without_legacy_deprecations bypasses the legacy deprecations and gives the real behavior" do
66
+ configure(legacy_deprecations: true) do
67
+ Money.without_legacy_deprecations do
68
+ expect{ Money.new(1, 'USD').to_money('CAD') }.to raise_error(Money::IncompatibleCurrencyError)
69
+ end
70
+ end
71
+ end
72
+
65
73
  it "#to_money raises when changing currency" do
66
74
  expect{ Money.new(1, 'USD').to_money('CAD') }.to raise_error(Money::IncompatibleCurrencyError)
67
75
  end
@@ -385,6 +393,36 @@ RSpec.describe "Money" do
385
393
  expect(JSON.dump(Money.new(1.00, "CAD"))).to eq('{"value":"1.00","currency":"CAD"}')
386
394
  end
387
395
 
396
+ describe ".from_hash" do
397
+ it "is the inverse operation of #to_h" do
398
+ one_cad = Money.new(1, "CAD")
399
+ expect(Money.from_hash(one_cad.to_h)).to eq(one_cad)
400
+ end
401
+
402
+ it "creates Money object from hash with expected keys" do
403
+ expect(Money.from_hash({ value: 1.01, currency: "CAD" })).to eq(Money.new(1.01, "CAD"))
404
+ end
405
+
406
+ it "raises if Hash does not have the expected keys" do
407
+ expect { Money.from_hash({ "val": 1.0 }) }.to raise_error(KeyError)
408
+ end
409
+ end
410
+
411
+ describe ".from_json" do
412
+ it "is the inverse operation of #to_json" do
413
+ one_cad = Money.new(1, "CAD")
414
+ expect(Money.from_json(one_cad.to_json)).to eq(one_cad)
415
+ end
416
+
417
+ it "creates Money object from JSON-encoded string" do
418
+ expect(Money.from_json('{ "value": 1.01, "currency": "CAD" }')).to eq(Money.new(1.01, "CAD"))
419
+ end
420
+
421
+ it "raises if JSON string is malformed" do
422
+ expect { Money.from_json('{ "val": 1.0 }') }.to raise_error(KeyError)
423
+ end
424
+ end
425
+
388
426
  it "supports absolute value" do
389
427
  expect(Money.new(-1.00).abs).to eq(Money.new(1.00))
390
428
  end
@@ -12,7 +12,7 @@ RSpec.describe RuboCop::Cop::Money::MissingCurrency do
12
12
  it 'registers an offense and corrects for Money.new without a currency argument' do
13
13
  expect_offense(<<~RUBY)
14
14
  Money.new(1)
15
- ^^^^^^^^^^^^ Money is missing currency argument
15
+ ^^^^^^^^^^^^ Money/MissingCurrency: Money is missing currency argument
16
16
  RUBY
17
17
 
18
18
  expect_correction(<<~RUBY)
@@ -36,7 +36,7 @@ RSpec.describe RuboCop::Cop::Money::MissingCurrency do
36
36
  it 'registers an offense and corrects for Money.new without a currency argument' do
37
37
  expect_offense(<<~RUBY)
38
38
  Money.new
39
- ^^^^^^^^^ Money is missing currency argument
39
+ ^^^^^^^^^ Money/MissingCurrency: Money is missing currency argument
40
40
  RUBY
41
41
 
42
42
  expect_correction(<<~RUBY)
@@ -47,7 +47,7 @@ RSpec.describe RuboCop::Cop::Money::MissingCurrency do
47
47
  it 'registers an offense and corrects for Money.from_amount without a currency argument' do
48
48
  expect_offense(<<~RUBY)
49
49
  Money.from_amount(1)
50
- ^^^^^^^^^^^^^^^^^^^^ Money is missing currency argument
50
+ ^^^^^^^^^^^^^^^^^^^^ Money/MissingCurrency: Money is missing currency argument
51
51
  RUBY
52
52
 
53
53
  expect_correction(<<~RUBY)
@@ -64,7 +64,7 @@ RSpec.describe RuboCop::Cop::Money::MissingCurrency do
64
64
  it 'registers an offense and corrects for Money.from_cents without a currency argument' do
65
65
  expect_offense(<<~RUBY)
66
66
  Money.from_cents(1)
67
- ^^^^^^^^^^^^^^^^^^^ Money is missing currency argument
67
+ ^^^^^^^^^^^^^^^^^^^ Money/MissingCurrency: Money is missing currency argument
68
68
  RUBY
69
69
 
70
70
  expect_correction(<<~RUBY)
@@ -81,7 +81,7 @@ RSpec.describe RuboCop::Cop::Money::MissingCurrency do
81
81
  it 'registers an offense and corrects for to_money without a currency argument' do
82
82
  expect_offense(<<~RUBY)
83
83
  '1'.to_money
84
- ^^^^^^^^^^^^ to_money is missing currency argument
84
+ ^^^^^^^^^^^^ Money/MissingCurrency: to_money is missing currency argument
85
85
  RUBY
86
86
 
87
87
  expect_correction(<<~RUBY)
@@ -92,7 +92,7 @@ RSpec.describe RuboCop::Cop::Money::MissingCurrency do
92
92
  it 'registers an offense and corrects for safe navigation to_money without a currency argument' do
93
93
  expect_offense(<<~RUBY)
94
94
  item&.to_money
95
- ^^^^^^^^^^^^^^ to_money is missing currency argument
95
+ ^^^^^^^^^^^^^^ Money/MissingCurrency: to_money is missing currency argument
96
96
  RUBY
97
97
 
98
98
  expect_correction(<<~RUBY)
@@ -109,7 +109,7 @@ RSpec.describe RuboCop::Cop::Money::MissingCurrency do
109
109
  it 'registers an offense and corrects for to_money block pass form' do
110
110
  expect_offense(<<~RUBY)
111
111
  ['1'].map(&:to_money)
112
- ^^^^^^^^^^^^^^^^^^^^^ to_money is missing currency argument
112
+ ^^^^^^^^^^^^^^^^^^^^^ Money/MissingCurrency: to_money is missing currency argument
113
113
  RUBY
114
114
 
115
115
  expect_correction(<<~RUBY)
@@ -12,7 +12,7 @@ RSpec.describe RuboCop::Cop::Money::ZeroMoney do
12
12
  it 'registers an offense and corrects Money.zero without currency' do
13
13
  expect_offense(<<~RUBY)
14
14
  Money.zero
15
- ^^^^^^^^^^ Money.zero is removed, use `Money.new(0, Money::NULL_CURRENCY)`.
15
+ ^^^^^^^^^^ Money/ZeroMoney: Money.zero is removed, use `Money.new(0, Money::NULL_CURRENCY)`.
16
16
  RUBY
17
17
 
18
18
  expect_correction(<<~RUBY)
@@ -23,7 +23,7 @@ RSpec.describe RuboCop::Cop::Money::ZeroMoney do
23
23
  it 'registers an offense and corrects Money.zero with currency' do
24
24
  expect_offense(<<~RUBY)
25
25
  Money.zero('CAD')
26
- ^^^^^^^^^^^^^^^^^ Money.zero is removed, use `Money.new(0, 'CAD')`.
26
+ ^^^^^^^^^^^^^^^^^ Money/ZeroMoney: Money.zero is removed, use `Money.new(0, 'CAD')`.
27
27
  RUBY
28
28
 
29
29
  expect_correction(<<~RUBY)