From 256ed8c42f08440ae1f3ad18d09f8e6181c9d452 Mon Sep 17 00:00:00 2001 From: Zane Wolfgang Pickett Date: Wed, 24 Apr 2024 20:57:02 +0200 Subject: [PATCH] Allow nil to be used as a default_currency --- lib/money/currency.rb | 3 +++ lib/money/money.rb | 7 +++++-- spec/money_spec.rb | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/money/currency.rb b/lib/money/currency.rb index b4e682b55b..d745fa6380 100644 --- a/lib/money/currency.rb +++ b/lib/money/currency.rb @@ -33,6 +33,9 @@ def initialize(method, currency, attribute) # Thrown when an unknown currency is requested. class UnknownCurrency < ArgumentError; end + # Thrown when currency is not provided. + class NoCurrency < ArgumentError; end + class << self def new(id) id = id.to_s.downcase diff --git a/lib/money/money.rb b/lib/money/money.rb index faa0d269db..76d4ddde6b 100644 --- a/lib/money/money.rb +++ b/lib/money/money.rb @@ -156,7 +156,9 @@ def self.default_currency @using_deprecated_default_currency = false end - if @default_currency.respond_to?(:call) + if @default_currency.nil? + nil + elsif @default_currency.respond_to?(:call) Money::Currency.new(@default_currency.call) else Money::Currency.new(@default_currency) @@ -338,7 +340,7 @@ class << self # Money.new(100, "USD") #=> # # Money.new(100, "EUR") #=> # # - def initialize( obj, currency = Money.default_currency, options = {}) + def initialize(obj, currency = Money.default_currency, options = {}) # For backwards compatability, if options is not a Hash, treat it as a bank parameter unless options.is_a?(Hash) options = { bank: options } @@ -352,6 +354,7 @@ def initialize( obj, currency = Money.default_currency, options = {}) # BigDecimal can be Infinity and NaN, money of that amount does not make sense raise ArgumentError, 'must be initialized with a finite value' unless @fractional.finite? + raise Currency::NoCurrency, 'must be provide a currency' if @currency.nil? end # Assuming using a currency using dollars: diff --git a/spec/money_spec.rb b/spec/money_spec.rb index bfba7b5255..1c0edd98ac 100644 --- a/spec/money_spec.rb +++ b/spec/money_spec.rb @@ -70,6 +70,21 @@ it "should have the default currency" do expect(money.currency).to eq Money.default_currency end + + context 'without a default' do + around do |example| + default_currency = Money.default_currency + Money.default_currency = nil + + example.run + + Money.default_currency = default_currency + end + + it 'should throw an NoCurrency Error' do + expect { money }.to raise_error(Money::Currency::NoCurrency) + end + end end context 'given a currency is provided' do