money-rails 0.8.1 → 0.9.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.
@@ -55,6 +55,23 @@ describe "configuration" do
55
55
  MoneyRails.symbol = nil
56
56
  end
57
57
 
58
+ it "sets the location of the negative sign for formatted output globally" do
59
+ value = Money.new(-12345600, "EUR")
60
+ symbol = Money::Currency.find(:eur).symbol
61
+ value.format.should =~ /#{symbol}-/
62
+
63
+ MoneyRails.sign_before_symbol = false
64
+ value.format.should =~ /#{symbol}-/
65
+ value.format(sign_before_symbol: false).should =~ /#{symbol}-/
66
+
67
+ MoneyRails.sign_before_symbol = true
68
+ value.format.should =~ /-#{symbol}/
69
+ value.format(sign_before_symbol: true).should =~ /-#{symbol}/
70
+
71
+ # Reset global setting
72
+ MoneyRails.sign_before_symbol = nil
73
+ end
74
+
58
75
  it "changes the amount and currency column settings based on the default currency" do
59
76
  old_currency = MoneyRails.default_currency
60
77
  MoneyRails.default_currency = :inr
@@ -79,5 +96,15 @@ describe "configuration" do
79
96
  MoneyRails.default_currency = old_currency
80
97
  end
81
98
 
99
+ it "assigns a default bank" do
100
+ old_bank = MoneyRails.default_bank
101
+
102
+ bank = Money::Bank::VariableExchange.new
103
+ MoneyRails.default_bank = bank
104
+ expect(Money.default_bank).to eq(bank)
105
+
106
+ MoneyRails.default_bank = old_bank
107
+ end
108
+
82
109
  end
83
110
  end
@@ -6,5 +6,5 @@ class DummyProduct < ActiveRecord::Base
6
6
  register_currency :gbp
7
7
 
8
8
  # Use money-rails macros
9
- monetize :price_cents
9
+ monetize :price_cents, :with_model_currency => :currency
10
10
  end
@@ -3,5 +3,6 @@ if defined? Mongoid
3
3
  include Mongoid::Document
4
4
 
5
5
  field :price, :type => Money
6
+ field :price_hash, :type => Hash
6
7
  end
7
8
  end
@@ -2,7 +2,8 @@ class Product < ActiveRecord::Base
2
2
 
3
3
  attr_accessible :price_cents, :discount, :bonus_cents,
4
4
  :price, :discount_value, :bonus, :optional_price_cents, :optional_price,
5
- :sale_price, :sale_price_amount, :sale_price_currency_code
5
+ :sale_price, :sale_price_amount, :sale_price_currency_code,
6
+ :price_in_a_range_cents, :price_in_a_range, :invalid_price_cents
6
7
 
7
8
  # Use USD as model level currency
8
9
  register_currency :usd
@@ -24,10 +25,17 @@ class Product < ActiveRecord::Base
24
25
  :with_model_currency => :sale_price_currency_code
25
26
 
26
27
  monetize :price_in_a_range_cents, :allow_nil => true,
27
- :numericality => {
28
- :greater_than_or_equal_to => 0,
28
+ :subunit_numericality => {
29
+ :greater_than => 0,
29
30
  :less_than_or_equal_to => 10000,
30
- :message => "Must be greater than zero and less than $10k"
31
+ },
32
+ :numericality => {
33
+ :greater_than => 0,
34
+ :less_than_or_equal_to => 100,
35
+ :message => "Must be greater than zero and less than $100"
31
36
  }
32
37
 
38
+ attr_accessor :invalid_price_cents
39
+ monetize :invalid_price_cents, disable_validation: true
40
+
33
41
  end
@@ -2,10 +2,10 @@ class Transaction < ActiveRecord::Base
2
2
 
3
3
  attr_accessible :amount_cents, :currency, :tax_cents, :amount, :tax
4
4
 
5
- monetize :amount_cents
6
- monetize :tax_cents
5
+ monetize :amount_cents, :with_model_currency => :currency
6
+ monetize :tax_cents, :with_model_currency => :currency
7
7
 
8
- monetize :total_cents
8
+ monetize :total_cents, :with_model_currency => :currency
9
9
  def total_cents
10
10
  return amount_cents + tax_cents
11
11
  end
@@ -4,7 +4,9 @@ require File.expand_path('../boot', __FILE__)
4
4
  require "active_record/railtie"
5
5
  require "action_controller/railtie"
6
6
  require "action_mailer/railtie"
7
- require "active_resource/railtie"
7
+ unless Rails::VERSION::MAJOR == 4
8
+ require "active_resource/railtie"
9
+ end
8
10
  require "sprockets/railtie"
9
11
 
10
12
  Bundler.require
@@ -11,9 +11,6 @@ Dummy::Application.configure do
11
11
  config.serve_static_assets = true
12
12
  config.static_cache_control = "public, max-age=3600"
13
13
 
14
- # Log error messages when you accidentally call methods on nil
15
- config.whiny_nils = true
16
-
17
14
  # Show full error reports and disable caching
18
15
  config.consider_all_requests_local = true
19
16
  config.action_controller.perform_caching = false
@@ -10,6 +10,13 @@ if defined?(Mongoid) && ::Mongoid::VERSION =~ /^3(.*)/
10
10
  let!(:priceable_from_hash_with_indifferent_access) {
11
11
  Priceable.create(:price => {:cents=>100, :currency_iso=>"EUR"}.with_indifferent_access)
12
12
  }
13
+ let(:priceable_with_infinite_precision) { Priceable.create(:price => Money.new(BigDecimal.new('100.1'), 'EUR')) }
14
+ let(:priceable_with_hash_field) {
15
+ Priceable.create(:price_hash => {
16
+ :key1 => Money.new(100, "EUR"),
17
+ :key2 => Money.new(200, "USD")
18
+ })
19
+ }
13
20
 
14
21
  context "mongoize" do
15
22
  it "mongoizes correctly a Money object to a hash of cents and currency" do
@@ -36,6 +43,28 @@ if defined?(Mongoid) && ::Mongoid::VERSION =~ /^3(.*)/
36
43
  priceable_from_hash_with_indifferent_access.price.cents.should == 100
37
44
  priceable_from_hash_with_indifferent_access.price.currency.should == Money::Currency.find('EUR')
38
45
  end
46
+
47
+ context "infinite_precision = true" do
48
+ before do
49
+ Money.infinite_precision = true
50
+ end
51
+
52
+ after do
53
+ Money.infinite_precision = false
54
+ end
55
+
56
+ it "mongoizes correctly a Money object to a hash of cents and currency" do
57
+ priceable_with_infinite_precision.price.cents.should == BigDecimal.new('100.1')
58
+ priceable_with_infinite_precision.price.currency.should == Money::Currency.find('EUR')
59
+ end
60
+ end
61
+ end
62
+
63
+ it "serializes correctly a Hash field containing Money objects" do
64
+ priceable_with_hash_field.price_hash[:key1][:cents].should == 100
65
+ priceable_with_hash_field.price_hash[:key2][:cents].should == 200
66
+ priceable_with_hash_field.price_hash[:key1][:currency_iso].should == 'EUR'
67
+ priceable_with_hash_field.price_hash[:key2][:currency_iso].should == 'USD'
39
68
  end
40
69
 
41
70
  context "demongoize" do
@@ -6,6 +6,7 @@ if defined?(Mongoid) && ::Mongoid::VERSION =~ /^2(.*)/
6
6
  let(:priceable) { Priceable.create(:price => Money.new(100, 'EUR')) }
7
7
  let(:priceable_from_num) { Priceable.create(:price => 1) }
8
8
  let(:priceable_from_string) { Priceable.create(:price => '1 EUR' )}
9
+ let(:priceable_with_infinite_precision) { Priceable.create(:price => Money.new(BigDecimal.new('100.1'), 'EUR')) }
9
10
 
10
11
  context "serialize" do
11
12
  it "serializes correctly a Money object to a hash of cents and currency" do
@@ -22,6 +23,21 @@ if defined?(Mongoid) && ::Mongoid::VERSION =~ /^2(.*)/
22
23
  priceable_from_string.price.cents.should == 100
23
24
  priceable_from_string.price.currency.should == Money::Currency.find('EUR')
24
25
  end
26
+
27
+ context "infinite_precision = true" do
28
+ before do
29
+ Money.infinite_precision = true
30
+ end
31
+
32
+ after do
33
+ Money.infinite_precision = false
34
+ end
35
+
36
+ it "mongoizes correctly a Money object to a hash of cents and currency" do
37
+ priceable_with_infinite_precision.price.cents.should == BigDecimal.new('100.1')
38
+ priceable_with_infinite_precision.price.currency.should == Money::Currency.find('EUR')
39
+ end
40
+ end
25
41
  end
26
42
 
27
43
  context "deserialize" do
@@ -16,4 +16,5 @@ RSpec.configure do |config|
16
16
  # automatically. This will be the default behavior in future versions of
17
17
  # rspec-rails.
18
18
  config.infer_base_class_for_anonymous_controllers = false
19
+ config.treat_symbols_as_metadata_keys_with_true_values = true
19
20
  end
@@ -14,17 +14,34 @@ if defined? ActiveRecord
14
14
  end
15
15
 
16
16
  describe "monetize matcher" do
17
-
18
17
  it "matches model attribute without a '_cents' suffix by default" do
19
- monetize(:price_cents).should be_true
18
+ product.should monetize(:price_cents)
20
19
  end
21
20
 
22
21
  it "matches model attribute specified by :as chain" do
23
- monetize(:price_cents).as(:discount_value).should be_true
22
+ product.should monetize(:discount).as(:discount_value)
24
23
  end
25
24
 
26
25
  it "matches model attribute with currency specified by :with_currency chain" do
27
- monetize(:price_cents).with_currency(:gbp).should be_true
26
+ product.should monetize(:bonus_cents).with_currency(:gbp)
27
+ end
28
+
29
+ it "does not match non existed attribute" do
30
+ product.should_not monetize(:price_fake)
31
+ end
32
+
33
+ it "does not match wrong currency iso" do
34
+ product.should_not monetize(:bonus_cents).with_currency(:usd)
35
+ end
36
+
37
+ it "does not match wrong money attribute name" do
38
+ product.should_not monetize(:bonus_cents).as(:bonussss)
39
+ end
40
+
41
+ context "using subject" do
42
+ subject { product }
43
+
44
+ it { should monetize(:price_cents) }
28
45
  end
29
46
  end
30
47
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: money-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-05-07 00:00:00.000000000 Z
14
+ date: 2013-12-31 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: money
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ~>
22
22
  - !ruby/object:Gem::Version
23
- version: 5.1.0
23
+ version: 6.0.0
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
@@ -28,7 +28,7 @@ dependencies:
28
28
  requirements:
29
29
  - - ~>
30
30
  - !ruby/object:Gem::Version
31
- version: 5.1.0
31
+ version: 6.0.0
32
32
  - !ruby/object:Gem::Dependency
33
33
  name: activesupport
34
34
  requirement: !ruby/object:Gem::Requirement