easy_rails_money 0.0.9.pre → 0.0.9.pre1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +26 -0
- data/README.md +2 -0
- data/lib/easy_rails_money/active_record/money_dsl.rb +6 -1
- data/lib/easy_rails_money/active_record.rb +3 -1
- data/lib/easy_rails_money/money_validator.rb +9 -0
- data/lib/easy_rails_money/version.rb +1 -1
- data/spec/active_record/currency_persistence_spec.rb +2 -2
- data/spec/active_record/migration_spec.rb +3 -3
- data/spec/active_record/validates_money_spec.rb +27 -7
- data/spec/active_record_spec_helper.rb +2 -2
- data/spec/loan_model_spec_helper.rb +1 -1
- data/spec/loan_with_currency_model_spec_helper.rb +1 -1
- data/spec/migration_factory_spec_helper.rb +7 -7
- metadata +2 -4
- data/spec/loan_with_currency_and_validation_model_spec_helper.rb +0 -12
data/CHANGELOG.md
CHANGED
@@ -57,3 +57,29 @@
|
|
57
57
|
holds true
|
58
58
|
api is changed. previously #currency and #single_currency
|
59
59
|
gave a Money::Currency object. now is is a String
|
60
|
+
|
61
|
+
## 0.0.9.pre
|
62
|
+
- add ActiveRecord::Base.validates_money
|
63
|
+
it validates that currency is in an allowed list
|
64
|
+
and money is stored as a number or can be nil
|
65
|
+
- api change: if we set currency (when it is a single currency)
|
66
|
+
as nil. the other money columns are set to nil
|
67
|
+
this is done because technically, Money has a default_currency
|
68
|
+
so we can persist a Money object without the currency
|
69
|
+
but that can change over time and we want to be explicit
|
70
|
+
|
71
|
+
## 0.0.9.pre1
|
72
|
+
- https://github.com/deepak/easy_rails_money/pull/1
|
73
|
+
when currency is set to nil, the money columns are set to nil as
|
74
|
+
well (see changelog for 0.0.9.pre above)
|
75
|
+
that code was buggy. so is a column was named "amount_funded"
|
76
|
+
it would give the setter as "amountfunded=" rather than
|
77
|
+
"amount_funded=".
|
78
|
+
git sha1: c1d9f6a8160d5a075e78f625f177f6716715c637
|
79
|
+
- bugfix: validates_money was failing if allowed_currency was not passed
|
80
|
+
the syntax is
|
81
|
+
validates_money :principal, :repaid, :amount_funded, :allow_nil => false, :allowed_currency => %w[inr usd sgd]
|
82
|
+
if we do not pass the last argument allowed_currency then it should
|
83
|
+
validate that it is a legal Money::Currency
|
84
|
+
that was not happenning because the Rails includes validations
|
85
|
+
does not compare Symbols and strings
|
data/README.md
CHANGED
@@ -383,3 +383,5 @@ loan_usd.currency # equals Money::Currency.new(:usd)
|
|
383
383
|
15. document. methods defined inside activerecord's scope
|
384
384
|
move to a helper, no that its namespace is not polluted
|
385
385
|
16. two specs tagged with fixme in validates_money_spec failing
|
386
|
+
17. a version of inclusion_in validator that can compare
|
387
|
+
Symbol and string
|
@@ -8,7 +8,7 @@ module EasyRailsMoney
|
|
8
8
|
|
9
9
|
included do
|
10
10
|
def money_attributes
|
11
|
-
attributes.keys.select {|x| x =~ /^(.+)_money/ }.map {|x| x.split('_')[0..-2].join }
|
11
|
+
attributes.keys.select {|x| x =~ /^(.+)_money/ }.map {|x| x.split('_')[0..-2].join('_') }
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -78,6 +78,11 @@ module EasyRailsMoney
|
|
78
78
|
|
79
79
|
define_method "currency=" do |value|
|
80
80
|
if value.nil?
|
81
|
+
# if we set currency (when it is a single currency)
|
82
|
+
# as nil. the other money columns are set to nil
|
83
|
+
# this is done because technically, Money has a default_currency
|
84
|
+
# so we can persist a Money object without the currency
|
85
|
+
# but that can change over time and we want to be explicit
|
81
86
|
money_attributes.map do |name|
|
82
87
|
send "#{name}=", nil
|
83
88
|
end
|
@@ -21,8 +21,10 @@ class ActiveRecord::Base
|
|
21
21
|
validates "#{column_name}_money", :numericality => { only_integer: true, greater_than_or_equal_to: 0 }, :allow_nil => options[:allow_nil]
|
22
22
|
end
|
23
23
|
|
24
|
-
allowed_currency = options[:allowed_currency] ||
|
24
|
+
allowed_currency = options[:allowed_currency] || EasyRailsMoney::MoneyValidator.currency_list
|
25
25
|
if single_currency?
|
26
|
+
# TODO: a version of inclusion_in validator that can compare
|
27
|
+
# Symbol and string
|
26
28
|
validates :currency, :inclusion => { in: allowed_currency }, :allow_nil => options[:allow_nil]
|
27
29
|
else
|
28
30
|
args.each do |column_name|
|
@@ -7,6 +7,15 @@ module EasyRailsMoney
|
|
7
7
|
# only allow_nil is passed around (as it was needed). test for other
|
8
8
|
# like if and unless as well
|
9
9
|
class MoneyValidator < ActiveModel::EachValidator
|
10
|
+
|
11
|
+
class << self
|
12
|
+
attr_writer :currency_list
|
13
|
+
|
14
|
+
def currency_list
|
15
|
+
@currency_list ||= Money::Currency.table.keys.map(&:to_s)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
10
19
|
def validate_each(record, attribute, value)
|
11
20
|
if options[:allow_nil]
|
12
21
|
return if value.nil?
|
@@ -48,7 +48,7 @@ describe "Currency Persistence" do
|
|
48
48
|
loan = loan_model.new
|
49
49
|
loan.principal = 100.to_money(@currency)
|
50
50
|
loan.repaid = 50.to_money(@currency)
|
51
|
-
loan.
|
51
|
+
loan.amount_funded = 10.to_money(@currency)
|
52
52
|
loan
|
53
53
|
}
|
54
54
|
|
@@ -80,7 +80,7 @@ describe "Currency Persistence" do
|
|
80
80
|
loan.currency = @currency
|
81
81
|
loan.principal = 100 * 100
|
82
82
|
loan.repaid = 50 * 100
|
83
|
-
loan.
|
83
|
+
loan.amount_funded = 10 * 100
|
84
84
|
loan
|
85
85
|
}
|
86
86
|
|
@@ -36,7 +36,7 @@ EOF
|
|
36
36
|
<<-EOF.strip_spaces
|
37
37
|
create_table "loans", :force => true do |t|
|
38
38
|
t.string "name"
|
39
|
-
t.integer "
|
39
|
+
t.integer "amount_funded_money"
|
40
40
|
t.integer "principal_money"
|
41
41
|
t.integer "repaid_money"
|
42
42
|
t.string "currency"
|
@@ -48,8 +48,8 @@ EOF
|
|
48
48
|
<<-EOF.strip_spaces
|
49
49
|
create_table "loans", :force => true do |t|
|
50
50
|
t.string "name"
|
51
|
-
t.string "
|
52
|
-
t.integer "
|
51
|
+
t.string "amount_funded_currency"
|
52
|
+
t.integer "amount_funded_money"
|
53
53
|
t.string "principal_currency"
|
54
54
|
t.integer "principal_money"
|
55
55
|
t.string "repaid_currency"
|
@@ -18,21 +18,21 @@ describe "Validation" do
|
|
18
18
|
|
19
19
|
EasyRailsMoney::MoneyValidator.any_instance.should_receive(:validate_each).with(subject, :principal, subject.principal)
|
20
20
|
EasyRailsMoney::MoneyValidator.any_instance.should_receive(:validate_each).with(subject, :repaid, subject.repaid)
|
21
|
-
EasyRailsMoney::MoneyValidator.any_instance.should_receive(:validate_each).with(subject, :
|
21
|
+
EasyRailsMoney::MoneyValidator.any_instance.should_receive(:validate_each).with(subject, :amount_funded, subject.amount_funded)
|
22
22
|
end
|
23
23
|
|
24
24
|
context "do not allow nil" do
|
25
25
|
let(:subject) do
|
26
26
|
model = loan_model
|
27
27
|
model.instance_eval {
|
28
|
-
validates_money :principal, :repaid, :
|
28
|
+
validates_money :principal, :repaid, :amount_funded, :allow_nil => false, :allowed_currency => %w[inr usd sgd]
|
29
29
|
}
|
30
30
|
|
31
31
|
loan = model.new
|
32
32
|
loan.name = "loan having some values"
|
33
33
|
loan.principal = 100 * 100
|
34
34
|
loan.repaid = 50 * 100
|
35
|
-
loan.
|
35
|
+
loan.amount_funded = 10 * 100
|
36
36
|
loan
|
37
37
|
end
|
38
38
|
|
@@ -54,8 +54,7 @@ describe "Validation" do
|
|
54
54
|
expect(subject.attributes["currency"]).to be_nil
|
55
55
|
add_expectations subject, false
|
56
56
|
expect(subject).not_to be_valid
|
57
|
-
|
58
|
-
expect(subject.errors.messages).to eq(:principal_money=>["is not a number"], :repaid_money=>["is not a number"], :npa_money=>["is not a number"], :currency=>["is not included in the list"])
|
57
|
+
expect(subject.errors.messages).to eq(:principal_money=>["is not a number"], :repaid_money=>["is not a number"], :amount_funded_money=>["is not a number"], :currency=>["is not included in the list"])
|
59
58
|
end
|
60
59
|
end # context "do not allow nil"
|
61
60
|
|
@@ -63,14 +62,14 @@ describe "Validation" do
|
|
63
62
|
let(:subject) do
|
64
63
|
model = loan_model
|
65
64
|
model.instance_eval {
|
66
|
-
validates_money :principal, :repaid, :
|
65
|
+
validates_money :principal, :repaid, :amount_funded, :allow_nil => true, :allowed_currency => %w[inr usd sgd]
|
67
66
|
}
|
68
67
|
|
69
68
|
loan = model.new
|
70
69
|
loan.name = "loan having nil values"
|
71
70
|
loan.principal = nil
|
72
71
|
loan.repaid = nil
|
73
|
-
loan.
|
72
|
+
loan.amount_funded = nil
|
74
73
|
loan
|
75
74
|
end
|
76
75
|
|
@@ -90,6 +89,27 @@ describe "Validation" do
|
|
90
89
|
end
|
91
90
|
end # context "allow nil"
|
92
91
|
|
92
|
+
context "no allowed currency" do
|
93
|
+
let(:subject) do
|
94
|
+
model = loan_model
|
95
|
+
model.instance_eval {
|
96
|
+
validates_money :principal, :repaid, :amount_funded, :allow_nil => false
|
97
|
+
}
|
98
|
+
|
99
|
+
loan = model.new
|
100
|
+
loan.name = "loan having some values and all currencies allowed"
|
101
|
+
loan.principal = 100 * 100
|
102
|
+
loan.repaid = 50 * 100
|
103
|
+
loan.amount_funded = 10 * 100
|
104
|
+
loan
|
105
|
+
end
|
106
|
+
|
107
|
+
it "is valid when it is a Money object" do
|
108
|
+
add_expectations subject, false
|
109
|
+
expect(subject).to be_valid
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
93
113
|
pending "check lower-level validations"
|
94
114
|
end
|
95
115
|
end
|
@@ -9,7 +9,7 @@ module CreateTableDefinition
|
|
9
9
|
t.string :name
|
10
10
|
t.money :principal
|
11
11
|
t.money :repaid
|
12
|
-
t.money :
|
12
|
+
t.money :amount_funded
|
13
13
|
t.currency
|
14
14
|
end
|
15
15
|
end
|
@@ -23,7 +23,7 @@ module CreateTableDefinition
|
|
23
23
|
t.string :name
|
24
24
|
t.money :principal
|
25
25
|
t.money :repaid
|
26
|
-
t.money :
|
26
|
+
t.money :amount_funded
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -22,7 +22,7 @@ module SchemaStatements
|
|
22
22
|
t.string :name
|
23
23
|
t.currency
|
24
24
|
end
|
25
|
-
add_money :loans, :principal, :repaid, :
|
25
|
+
add_money :loans, :principal, :repaid, :amount_funded
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -30,7 +30,7 @@ module SchemaStatements
|
|
30
30
|
class RemoveMoneyColumnsFromLoan < ActiveRecord::Migration
|
31
31
|
def change
|
32
32
|
suppress_messages do
|
33
|
-
remove_money :loans, :principal, :repaid, :
|
33
|
+
remove_money :loans, :principal, :repaid, :amount_funded
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
@@ -38,7 +38,7 @@ module SchemaStatements
|
|
38
38
|
class RemoveMoneyColumnsExceptPrincipalFromLoan < ActiveRecord::Migration
|
39
39
|
def change
|
40
40
|
suppress_messages do
|
41
|
-
remove_money :loans, :repaid, :
|
41
|
+
remove_money :loans, :repaid, :amount_funded
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
@@ -105,7 +105,7 @@ module ChangeTable
|
|
105
105
|
def change
|
106
106
|
suppress_messages do
|
107
107
|
change_table :loans, force: true do |t|
|
108
|
-
t.remove_money :principal, :repaid, :
|
108
|
+
t.remove_money :principal, :repaid, :amount_funded
|
109
109
|
end
|
110
110
|
end
|
111
111
|
end
|
@@ -115,7 +115,7 @@ module ChangeTable
|
|
115
115
|
def change
|
116
116
|
suppress_messages do
|
117
117
|
change_table :loans, force: true do |t|
|
118
|
-
t.remove_money :repaid, :
|
118
|
+
t.remove_money :repaid, :amount_funded
|
119
119
|
end
|
120
120
|
end
|
121
121
|
end
|
@@ -164,7 +164,7 @@ module CreateTableDefinition
|
|
164
164
|
t.currency
|
165
165
|
t.money :principal
|
166
166
|
t.money :repaid
|
167
|
-
t.money :
|
167
|
+
t.money :amount_funded
|
168
168
|
end
|
169
169
|
end
|
170
170
|
end
|
@@ -178,7 +178,7 @@ module CreateTableDefinition
|
|
178
178
|
t.money :principal
|
179
179
|
t.money :repaid
|
180
180
|
t.currency
|
181
|
-
t.money :
|
181
|
+
t.money :amount_funded
|
182
182
|
end
|
183
183
|
end
|
184
184
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: easy_rails_money
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.9.
|
4
|
+
version: 0.0.9.pre1
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -204,7 +204,6 @@ files:
|
|
204
204
|
- spec/active_record_spec_helper.rb
|
205
205
|
- spec/configuration_spec.rb
|
206
206
|
- spec/loan_model_spec_helper.rb
|
207
|
-
- spec/loan_with_currency_and_validation_model_spec_helper.rb
|
208
207
|
- spec/loan_with_currency_model_spec_helper.rb
|
209
208
|
- spec/migration_factory_spec_helper.rb
|
210
209
|
- spec/simplecov_helper.rb
|
@@ -247,7 +246,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
247
246
|
version: '0'
|
248
247
|
segments:
|
249
248
|
- 0
|
250
|
-
hash:
|
249
|
+
hash: 176891542328036616
|
251
250
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
252
251
|
none: false
|
253
252
|
requirements:
|
@@ -268,7 +267,6 @@ test_files:
|
|
268
267
|
- spec/active_record_spec_helper.rb
|
269
268
|
- spec/configuration_spec.rb
|
270
269
|
- spec/loan_model_spec_helper.rb
|
271
|
-
- spec/loan_with_currency_and_validation_model_spec_helper.rb
|
272
270
|
- spec/loan_with_currency_model_spec_helper.rb
|
273
271
|
- spec/migration_factory_spec_helper.rb
|
274
272
|
- spec/simplecov_helper.rb
|
@@ -1,12 +0,0 @@
|
|
1
|
-
class LoanWithCurrencyAndValidation < ActiveRecord::Base
|
2
|
-
self.table_name = "loans"
|
3
|
-
attr_accessible :name
|
4
|
-
|
5
|
-
with_currency(:inr) do
|
6
|
-
money :principal
|
7
|
-
money :repaid
|
8
|
-
money :npa
|
9
|
-
end
|
10
|
-
|
11
|
-
validates_money :principal, :repaid, :npa, :allow_nil => true, :allowed_currency => %w[inr usd sgd]
|
12
|
-
end
|