cash 0.1.1 → 0.2.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.
- data/cash.gemspec +1 -1
- data/lib/cash.rb +21 -2
- data/spec/lib/cash_spec.rb +42 -7
- metadata +4 -4
data/cash.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.name = "cash"
|
7
|
-
gem.version = '0.
|
7
|
+
gem.version = '0.2.0'
|
8
8
|
gem.authors = ["Norbert Wojtowicz"]
|
9
9
|
gem.email = ["wojtowicz.norbert@gmail.com"]
|
10
10
|
gem.description = "Money model backed by BigDecimal"
|
data/lib/cash.rb
CHANGED
@@ -33,12 +33,23 @@ class Cash
|
|
33
33
|
fail ArgumentError, "invalid value for StrictDecimal(): #{arg.inspect}"
|
34
34
|
end
|
35
35
|
|
36
|
-
def
|
36
|
+
def pretty_print
|
37
37
|
Format.display(self)
|
38
38
|
end
|
39
39
|
|
40
|
+
def to_s
|
41
|
+
"#{amount_string} #{currency.code}"
|
42
|
+
end
|
43
|
+
|
40
44
|
def inspect
|
41
|
-
"<Cash #{
|
45
|
+
"<Cash #{to_s}>"
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_h
|
49
|
+
{
|
50
|
+
amount: amount_string,
|
51
|
+
currency: currency.code
|
52
|
+
}
|
42
53
|
end
|
43
54
|
|
44
55
|
def amount_string
|
@@ -67,6 +78,14 @@ class Cash
|
|
67
78
|
raise ArgumentError, "cannot multiply #{self.inspect} by #{factor}"
|
68
79
|
end
|
69
80
|
|
81
|
+
def /(factor)
|
82
|
+
factor = StrictDecimal(factor)
|
83
|
+
Cash.new(amount / factor, currency)
|
84
|
+
rescue ArgumentError
|
85
|
+
raise ArgumentError, "cannot divide #{self.inspect} by #{factor}"
|
86
|
+
end
|
87
|
+
|
88
|
+
|
70
89
|
protected
|
71
90
|
|
72
91
|
def equality_state
|
data/spec/lib/cash_spec.rb
CHANGED
@@ -70,23 +70,38 @@ describe Cash do
|
|
70
70
|
end
|
71
71
|
|
72
72
|
describe '#to_s' do
|
73
|
+
it 'displays amount and currency' do
|
74
|
+
Cash.new('100.3', :eur).to_s.should == '100.30 EUR'
|
75
|
+
Cash.new('9999', :usd).to_s.should == '9999.00 USD'
|
76
|
+
Cash.new('.123', :pln).to_s.should == '0.12 PLN'
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'displays correct offset' do
|
80
|
+
Cash.new('123.4567', :jpy).to_s.should == '123 JPY'
|
81
|
+
Cash.new('123.4567', :twd).to_s.should == '123.5 TWD'
|
82
|
+
Cash.new('123.4567', :pln).to_s.should == '123.46 PLN'
|
83
|
+
Cash.new('123.4567', :bhd).to_s.should == '123.457 BHD'
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe '#pretty_print' do
|
73
88
|
it 'displays Euro' do
|
74
|
-
Cash.new('100.3', :eur).
|
89
|
+
Cash.new('100.3', :eur).pretty_print.should == '€100.30'
|
75
90
|
end
|
76
91
|
|
77
92
|
it 'displays Dollar' do
|
78
|
-
Cash.new('9999', :usd).
|
93
|
+
Cash.new('9999', :usd).pretty_print.should == '$9999.00'
|
79
94
|
end
|
80
95
|
|
81
96
|
it 'displays other currencies' do
|
82
|
-
Cash.new('.123', :pln).
|
97
|
+
Cash.new('.123', :pln).pretty_print.should == '0.12 PLN'
|
83
98
|
end
|
84
99
|
|
85
100
|
it 'displays correct offset' do
|
86
|
-
Cash.new('123.4567', :jpy).
|
87
|
-
Cash.new('123.4567', :twd).
|
88
|
-
Cash.new('123.4567', :pln).
|
89
|
-
Cash.new('123.4567', :bhd).
|
101
|
+
Cash.new('123.4567', :jpy).pretty_print.should == '123 JPY'
|
102
|
+
Cash.new('123.4567', :twd).pretty_print.should == '123.5 TWD'
|
103
|
+
Cash.new('123.4567', :pln).pretty_print.should == '123.46 PLN'
|
104
|
+
Cash.new('123.4567', :bhd).pretty_print.should == '123.457 BHD'
|
90
105
|
end
|
91
106
|
end
|
92
107
|
|
@@ -96,6 +111,15 @@ describe Cash do
|
|
96
111
|
end
|
97
112
|
end
|
98
113
|
|
114
|
+
describe '#to_h' do
|
115
|
+
it 'returns serialized hash' do
|
116
|
+
Cash.new('100.3', :eur).to_h.should == {
|
117
|
+
amount: '100.30',
|
118
|
+
currency: 'EUR'
|
119
|
+
}
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
99
123
|
context 'comparable' do
|
100
124
|
describe '#==' do
|
101
125
|
it { Cash.new(1, :usd).should == Cash.new(1, :usd) }
|
@@ -168,6 +192,17 @@ describe Cash do
|
|
168
192
|
expect{ one_usd * one_usd }.to raise_error(ArgumentError)
|
169
193
|
end
|
170
194
|
end
|
195
|
+
|
196
|
+
describe 'division' do
|
197
|
+
it 'divides amount by bigdecimal' do
|
198
|
+
split = one_usd / BigDecimal.new('4')
|
199
|
+
split.should == Cash.new('0.25', 'USD')
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'fails if multiplying cash by cash' do
|
203
|
+
expect{ two_usd / one_usd }.to raise_error(ArgumentError)
|
204
|
+
end
|
205
|
+
end
|
171
206
|
end
|
172
207
|
|
173
208
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-03-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -79,7 +79,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
79
79
|
version: '0'
|
80
80
|
segments:
|
81
81
|
- 0
|
82
|
-
hash:
|
82
|
+
hash: -1365261179025828843
|
83
83
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
84
|
none: false
|
85
85
|
requirements:
|
@@ -88,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
88
88
|
version: '0'
|
89
89
|
segments:
|
90
90
|
- 0
|
91
|
-
hash:
|
91
|
+
hash: -1365261179025828843
|
92
92
|
requirements: []
|
93
93
|
rubyforge_project:
|
94
94
|
rubygems_version: 1.8.23
|