acvwilson-currency 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt CHANGED
@@ -15,7 +15,6 @@ lib/currency/config.rb
15
15
  lib/currency/core_extensions.rb
16
16
  lib/currency/currency.rb
17
17
  lib/currency/currency/factory.rb
18
- lib/currency/currency_version.rb
19
18
  lib/currency/exception.rb
20
19
  lib/currency/exchange.rb
21
20
  lib/currency/exchange/rate.rb
data/currency.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{currency}
3
- s.version = "0.6.1"
3
+ s.version = "0.6.2"
4
4
 
5
5
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
6
6
  s.authors = ["Asa Wilson"]
@@ -8,11 +8,11 @@ Gem::Specification.new do |s|
8
8
  s.description = %q{Currency conversions for Ruby}
9
9
  s.email = ["acvwilson@gmail.com"]
10
10
  s.extra_rdoc_files = ["ChangeLog", "COPYING.txt", "LICENSE.txt", "Manifest.txt", "README.txt", "Releases.txt", "TODO.txt"]
11
- s.files = ["COPYING.txt", "currency.gemspec", "examples/ex1.rb", "examples/xe1.rb", "lib/currency/active_record.rb", "lib/currency/config.rb", "lib/currency/core_extensions.rb", "lib/currency/currency/factory.rb", "lib/currency/currency.rb", "lib/currency/currency_version.rb", "lib/currency/exception.rb", "lib/currency/exchange/rate/deriver.rb", "lib/currency/exchange/rate/source/base.rb", "lib/currency/exchange/rate/source/failover.rb", "lib/currency/exchange/rate/source/federal_reserve.rb", "lib/currency/exchange/rate/source/historical/rate.rb", "lib/currency/exchange/rate/source/historical/rate_loader.rb", "lib/currency/exchange/rate/source/historical/writer.rb", "lib/currency/exchange/rate/source/historical.rb", "lib/currency/exchange/rate/source/new_york_fed.rb", "lib/currency/exchange/rate/source/provider.rb", "lib/currency/exchange/rate/source/test.rb", "lib/currency/exchange/rate/source/the_financials.rb", "lib/currency/exchange/rate/source/timed_cache.rb", "lib/currency/exchange/rate/source/xe.rb", "lib/currency/exchange/rate/source.rb", "lib/currency/exchange/rate.rb", "lib/currency/exchange/time_quantitizer.rb", "lib/currency/exchange.rb", "lib/currency/formatter.rb", "lib/currency/macro.rb", "lib/currency/money.rb", "lib/currency/money_helper.rb", "lib/currency/parser.rb", "lib/currency.rb", "LICENSE.txt", "Manifest.txt", "README.txt", "Releases.txt", "spec/ar_spec_helper.rb", "spec/ar_column_spec.rb", "spec/ar_simple_spec.rb", "spec/config_spec.rb", "spec/federal_reserve_spec.rb", "spec/formatter_spec.rb", "spec/historical_writer_spec.rb", "spec/macro_spec.rb", "spec/money_spec.rb", "spec/new_york_fed_spec.rb", "spec/parser_spec.rb", "spec/spec_helper.rb", "spec/time_quantitizer_spec.rb", "spec/timed_cache_spec.rb", "spec/xe_spec.rb", "TODO.txt"]
11
+ s.files = ["COPYING.txt", "currency.gemspec", "examples/ex1.rb", "examples/xe1.rb", "lib/currency/active_record.rb", "lib/currency/config.rb", "lib/currency/core_extensions.rb", "lib/currency/currency/factory.rb", "lib/currency/currency.rb", "lib/currency/exception.rb", "lib/currency/exchange/rate/deriver.rb", "lib/currency/exchange/rate/source/base.rb", "lib/currency/exchange/rate/source/failover.rb", "lib/currency/exchange/rate/source/federal_reserve.rb", "lib/currency/exchange/rate/source/historical/rate.rb", "lib/currency/exchange/rate/source/historical/rate_loader.rb", "lib/currency/exchange/rate/source/historical/writer.rb", "lib/currency/exchange/rate/source/historical.rb", "lib/currency/exchange/rate/source/new_york_fed.rb", "lib/currency/exchange/rate/source/provider.rb", "lib/currency/exchange/rate/source/test.rb", "lib/currency/exchange/rate/source/the_financials.rb", "lib/currency/exchange/rate/source/timed_cache.rb", "lib/currency/exchange/rate/source/xe.rb", "lib/currency/exchange/rate/source.rb", "lib/currency/exchange/rate.rb", "lib/currency/exchange/time_quantitizer.rb", "lib/currency/exchange.rb", "lib/currency/formatter.rb", "lib/currency/macro.rb", "lib/currency/money.rb", "lib/currency/money_helper.rb", "lib/currency/parser.rb", "lib/currency.rb", "LICENSE.txt", "Manifest.txt", "README.txt", "Releases.txt", "spec/ar_spec_helper.rb", "spec/ar_column_spec.rb", "spec/ar_simple_spec.rb", "spec/config_spec.rb", "spec/federal_reserve_spec.rb", "spec/formatter_spec.rb", "spec/historical_writer_spec.rb", "spec/macro_spec.rb", "spec/money_spec.rb", "spec/new_york_fed_spec.rb", "spec/parser_spec.rb", "spec/spec_helper.rb", "spec/time_quantitizer_spec.rb", "spec/timed_cache_spec.rb", "spec/xe_spec.rb", "TODO.txt"]
12
12
  s.has_rdoc = true
13
13
  s.homepage = %q{http://currency.rubyforge.org/}
14
14
  s.rdoc_options = ["--main", "README.txt"]
15
15
  s.require_paths = ["lib"]
16
16
  s.rubygems_version = %q{1.2.0}
17
17
  s.summary = %q{#{s.name} #{s.version}}
18
- end
18
+ end
@@ -139,7 +139,7 @@ module Currency::ActiveRecord
139
139
  attr_name = attr_name.to_s
140
140
  opts[:class] = self
141
141
  opts[:table] = self.table_name
142
- opts[:attr_name] = attr_name.intern
142
+ opts[:attr_name] = attr_name.to_sym
143
143
  ::ActiveRecord::Base.register_money_attribute(opts)
144
144
 
145
145
  column = opts[:column] || opts[:attr_name]
@@ -204,7 +204,6 @@ end_eval
204
204
  validate << "\nvalidates_numericality_of :#{attr_name}#{validate_allow_nil}\n"
205
205
  validate << "\nvalidates_format_of :#{currency_column}, :with => /^[A-Z][A-Z][A-Z]$/#{validate_allow_nil}\n" if currency_column
206
206
 
207
-
208
207
  alias_accessor ||= ''
209
208
 
210
209
  module_eval (opts[:module_eval] = x = <<-"end_eval"), __FILE__, __LINE__
@@ -225,7 +224,7 @@ def #{attr_name}
225
224
  end
226
225
 
227
226
  def #{attr_name}=(value)
228
- if value.nil?
227
+ if value.nil? || value.to_s.strip == ''
229
228
  #{attr_name}_money = nil
230
229
  elsif value.kind_of?(Integer) || value.kind_of?(String) || value.kind_of?(Float)
231
230
  #{attr_name}_money = ::Currency::Money(value, #{currency})
@@ -238,7 +237,7 @@ def #{attr_name}=(value)
238
237
  raise ::Currency::Exception::InvalidMoneyValue, value
239
238
  end
240
239
 
241
- @#{attr_name} = #{attr_name}_money
240
+ @#{attr_name} = #{attr_name}_money # TODO: Really needed? Isn't the write_attribute enough?
242
241
 
243
242
  write_attribute(:#{column}, #{attr_name}_money.nil? ? nil : #{money_rep})
244
243
  #{write_time}
@@ -58,9 +58,9 @@ class Currency::Money
58
58
  else
59
59
  m = ::Currency::Parser.default.parse(x)
60
60
  end
61
- @currency = m.currency unless @currency
62
- @time = m.time if m.time
63
- @rep = m.rep
61
+ @currency = m.currency if m && !@currency
62
+ @time = m.time if m && m.time
63
+ @rep = m.nil?? 0 : m.rep
64
64
  else
65
65
  @currency = ::Currency::Currency.default unless @currency
66
66
  @rep = x.Money_rep(@currency)
@@ -46,6 +46,8 @@ class Currency::Parser
46
46
 
47
47
 
48
48
  def _parse(str) # :nodoc:
49
+ return nil if str.to_s.strip == ''
50
+
49
51
  x = str
50
52
 
51
53
  # Get currency.
@@ -70,6 +72,7 @@ class Currency::Parser
70
72
  end
71
73
  x = md.pre_match + md.post_match
72
74
  end
75
+
73
76
  # Default time
74
77
  time ||= @time
75
78
  time = Time.new if time == :now
@@ -108,35 +111,35 @@ class Currency::Parser
108
111
  if md = /^([-+]?\d+)\.?$/.match(x)
109
112
  # $stderr.puts "'#{self}'.parse(#{str}) => EXACT"
110
113
  x = ::Currency::Money.new_rep(md[1].to_i * currency.scale, currency, @time)
111
-
114
+
112
115
  # Match: fractional Currency value.
113
116
  elsif md = /^([-+]?)(\d*)\.(\d+)$/.match(x)
114
117
  sign = md[1]
115
118
  whole = md[2]
116
119
  part = md[3]
117
-
120
+
118
121
  # $stderr.puts "'#{self}'.parse(#{str}) => DECIMAL (#{sign} #{whole} . #{part})"
119
-
122
+
120
123
  if part.length != currency.scale
121
-
124
+
122
125
  # Pad decimal places with additional '0'
123
126
  while part.length < currency.scale_exp
124
127
  part << '0'
125
128
  end
126
-
129
+
127
130
  # Truncate to Currency's decimal size.
128
131
  part = part[0 ... currency.scale_exp]
129
-
132
+
130
133
  # $stderr.puts " => INEXACT DECIMAL '#{whole}'"
131
134
  end
132
-
135
+
133
136
  # Put the string back together:
134
137
  # #{sign}#{whole}#{part}
135
138
  whole = sign + whole + part
136
139
  # $stderr.puts " => REP = #{whole}"
137
-
140
+
138
141
  x = whole.to_i
139
-
142
+
140
143
  x = ::Currency::Money.new_rep(x, currency, time)
141
144
  else
142
145
  # $stderr.puts "'#{self}'.parse(#{str}) => ??? '#{x}'"
data/lib/currency.rb CHANGED
@@ -118,13 +118,13 @@ module Currency
118
118
  #
119
119
  # See Money#new.
120
120
  def self.Money(*opts)
121
+ return nil if opts.to_s.strip == ''
121
122
  Money.new(*opts)
122
123
  end
123
124
  end
124
125
 
125
126
  $:.unshift(File.expand_path(File.dirname(__FILE__))) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
126
127
 
127
- require 'currency/currency_version'
128
128
  require 'currency/config'
129
129
  require 'currency/exception'
130
130
  require 'currency/money'
data/spec/money_spec.rb CHANGED
@@ -3,14 +3,33 @@ require File.dirname(__FILE__) + '/spec_helper'
3
3
 
4
4
  describe Currency::Money do
5
5
 
6
- it "create" do
6
+ before :all do
7
+ Currency::Config.configure do |config|
8
+ config.scale_exp = 6
9
+ end
10
+
11
+ end
12
+
13
+ def zero_money
14
+ @zero_money ||= Currency::Money.new(0)
15
+ end
16
+
17
+ def negative_money
18
+ @negative_money ||= Currency::Money.new(-1.00, :USD)
19
+ end
20
+
21
+ def positive_money
22
+ @positive_money ||= Currency::Money.new(2.99, :USD)
23
+ end
24
+
25
+ it "creates Monies" do
7
26
  m = Currency::Money.new(1.99)
8
27
  m.should be_kind_of(Currency::Money)
9
28
  Currency::Currency.default.should == m.currency
10
29
  :USD.should == m.currency.code
11
30
  end
12
31
 
13
- describe "object money method" do
32
+ describe "Converts different objects to Money with the 'money' method" do
14
33
  it "works with a float" do
15
34
  m = 1.99.money(:USD)
16
35
  m.should be_kind_of(Currency::Money)
@@ -38,45 +57,46 @@ describe Currency::Money do
38
57
  :EUR.should == m.currency.code
39
58
  m.rep.should == 45990000
40
59
  end
60
+
61
+ describe "deals with voids" do
62
+ it "does not raise with an empty string" do
63
+ lambda{
64
+ Currency::Money.new('')
65
+ }.should_not raise_error
66
+ end
67
+
68
+ it "considers the empty string to be nil " do
69
+ Currency::Money.new('').should be_nil
70
+ end
71
+ end
41
72
  end
42
73
 
43
- def zero_money
44
- @zero_money ||= Currency::Money.new(0)
45
- end
46
-
47
- it "zero" do
74
+ it "deals with zero in the least surprising way" do
48
75
  zero_money.negative?.should_not == true
49
76
  zero_money.zero?.should_not == nil
50
77
  zero_money.positive?.should_not == true
51
78
  end
52
79
 
53
- def negative_money
54
- @negative_money ||= Currency::Money.new(-1.00, :USD)
55
- end
56
-
57
- it "negative" do
80
+ it "deals with negatives in the least surprising way" do
58
81
  negative_money.negative?.should_not == nil
59
82
  negative_money.zero?.should_not == true
60
83
  negative_money.positive?.should_not == true
61
84
  end
62
85
 
63
- def positive_money
64
- @positive_money ||= Currency::Money.new(2.99, :USD)
65
- end
66
- it "positive" do
86
+ it "deals with positive numbers in the least surprising way" do
67
87
  positive_money.negative?.should_not == true
68
88
  positive_money.zero?.should_not == true
69
89
  positive_money.positive?.should_not == nil
70
90
  end
71
91
 
72
- it "relational" do
92
+ it "can do comparisons between monies" do
73
93
  n = negative_money
74
94
  z = zero_money
75
95
  p = positive_money
76
96
 
77
- (n.should < p)
78
- (n > p).should_not == true
79
- (p < n).should_not == true
97
+ negative_money.should < positive_money
98
+ (negative_money > positive_money).should_not be_true
99
+ (positive_money < negative_money).should_not be_true
80
100
  (p.should > n)
81
101
  (p != n).should_not == nil
82
102
 
data/spec/parser_spec.rb CHANGED
@@ -1,105 +1,105 @@
1
1
  # Copyright (C) 2006-2007 Kurt Stephens <ruby-currency(at)umleta.com>
2
2
  # See LICENSE.txt for details.
3
+ require File.dirname(__FILE__) + '/spec_helper'
3
4
 
4
- require 'test/test_base'
5
- require 'currency'
6
-
7
- module Currency
8
-
9
- class ParserTest < TestBase
5
+ describe Currency::Parser do
10
6
  before do
11
- super
12
7
  @parser = ::Currency::Currency.USD.parser_or_default
13
8
  end
14
9
 
15
- ############################################
16
- # Simple stuff.
17
- #
18
-
19
- it "default" do
20
-
10
+ describe "is great at parsing strings" do
11
+ it "can use a string that uses the thousands-separator (comma)" do
12
+ @parser.parse("1234567.89").rep.should == 123456789
13
+ @parser.parse("1,234,567.89").rep.should == 123456789
14
+ end
15
+
16
+
17
+ it "parses cents" do
18
+ @parser.parse("1234567.89").rep.should == 123456789
19
+ @parser.parse("1234567").rep.should == 123456700
20
+ @parser.parse("1234567.").rep.should == 123456700
21
+ @parser.parse("1234567.8").rep.should == 123456780
22
+ @parser.parse("1234567.891").rep.should == 123456789
23
+ @parser.parse("-1234567").rep.should == -123456700
24
+ @parser.parse("+1234567").rep.should == 123456700
25
+ end
21
26
  end
22
27
 
23
-
24
- it "thousands" do
25
- @parser.parse("1234567.89").rep.should == 123456789
26
- assert_equal 123456789, @parser.parse("1,234,567.89").rep
28
+ describe "can convert the right hand side argument" do
29
+ it "converts the right hand argument to the left hand side currency if needed" do
30
+ m = "123.45 USD".money + "100 CAD"
31
+ m.should_not == nil
32
+ m.rep.should == ("123.45".money(:USD) + "100 CAD".money(:USD)).rep
33
+ end
34
+
35
+ it "uses the left hand sides currency if the right hand side argument does provide currency info" do
36
+ m = "123.45 USD".money
37
+ (m + 100).rep.should == (m + "100".money(:USD)).rep
38
+ end
27
39
  end
28
40
 
41
+ describe "can use the inspect method as a serialization of self" do
42
+ it "can recreate a money object by using a .inspect-string" do
43
+ ::Currency::Currency.default = :USD
44
+ m = ::Currency::Money("1234567.89", :CAD)
45
+ m2 = ::Currency::Money(m.inspect)
29
46
 
30
- it "cents" do
31
- @parser.parse("1234567.89").rep.should == 123456789
32
- @parser.parse("1234567").rep.should == 123456700
33
- @parser.parse("1234567.").rep.should == 123456700
34
- @parser.parse("1234567.8").rep.should == 123456780
35
- @parser.parse("1234567.891").rep.should == 123456789
36
- @parser.parse("-1234567").rep.should == -123456700
37
- @parser.parse("+1234567").rep.should == 123456700
38
- end
47
+ m2.rep.should == m.rep
48
+ m2.currency.should == m.currency
39
49
 
50
+ m2.inspect.should == m.inspect
51
+ end
40
52
 
41
- it "misc" do
42
- m = "123.45 USD".money + "100 CAD".should_not == nil
43
- (m.rep == 200.45).should_not == true
44
- end
45
53
 
54
+ it "can recreate a money objectby using a .inspect-string and keep the time parameter as well" do
55
+ ::Currency::Currency.default = :USD
56
+ time = Time.now.getutc
57
+ m = ::Currency::Money("1234567.89", :CAD, time)
58
+ m.time.should_not == nil
46
59
 
47
- it "round trip" do
48
- ::Currency::Currency.default = :USD
49
- m = ::Currency::Money("1234567.89", :CAD).should_not == nil
50
- m2 = ::Currency::Money(m.inspect).should_not == nil
51
- m2.rep.should == m.rep
52
- m2.currency.should == m.currency
53
- m2.time.should == nil
54
- m2.inspect.should == m.inspect
55
- end
60
+ m2 = ::Currency::Money(m.inspect)
61
+ m2.time.should_not == nil
56
62
 
63
+ m.should_not be(m2)
57
64
 
58
- it "round trip time" do
59
- ::Currency::Currency.default = :USD
60
- time = Time.now.getutc
61
- m = ::Currency::Money("1234567.89", :CAD, time).should_not == nil
62
- m.time.should_not == nil
63
- m2 = ::Currency::Money(m.inspect).should_not == nil
64
- m2.time.should_not == nil
65
- m2.rep.should == m.rep
66
- m2.currency.should == m.currency
67
- m2.time.to_i.should == m.time.to_i
68
- m2.inspect.should == m.inspect
65
+ m2.rep.should == m.rep
66
+ m2.currency.should == m.currency
67
+ m2.time.to_i.should == m.time.to_i
68
+ m2.inspect.should == m.inspect
69
+ end
69
70
  end
70
71
 
72
+ describe "deals with time when creating money objects" do
73
+ before do
74
+ @parser = ::Currency::Parser.new
75
+ end
76
+
77
+ it "can parse even though the parser time is nil" do
78
+ @parser.time = nil
71
79
 
72
- it "time nil" do
73
- parser = ::Currency::Parser.new
74
- parser.time = nil
80
+ m = @parser.parse("$1234.55")
81
+ m.time.should == nil
82
+ end
75
83
 
76
- m = parser.parse("$1234.55").should_not == nil
77
- m.time.should == nil
78
- end
79
84
 
85
+ it "parses money strings into money object using the parsers time" do
86
+ @parser.time = Time.now
80
87
 
81
- it "time" do
82
- parser = ::Currency::Parser.new
83
- parser.time = Time.new
88
+ m = @parser.parse("$1234.55")
89
+ m.time.should == @parser.time
90
+ end
84
91
 
85
- m = parser.parse("$1234.55").should_not == nil
86
- m.time.should == parser.time
87
- end
88
92
 
93
+ it "when re-initializing a money object, the time is also re-initialized" do
94
+ @parser.time = :now
89
95
 
90
- it "time now" do
91
- parser = ::Currency::Parser.new
92
- parser.time = :now
96
+ m = @parser.parse("$1234.55")
97
+ m1_time = m.time
93
98
 
94
- m = parser.parse("$1234.55").should_not == nil
95
- m1_time = m.time.should_not == nil
99
+ m = @parser.parse("$1234.55")
100
+ m2_time = m.time
96
101
 
97
- m = parser.parse("$1234.55").should_not == nil
98
- m2_time = m.time.should_not == nil
99
-
100
- assert_not_equal m1_time, m2_time
102
+ m1_time.should_not == m2_time
103
+ end
101
104
  end
102
105
  end
103
-
104
- end # module
105
-
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acvwilson-currency
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Asa Wilson
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-12-01 05:56:33.845186 -08:00
12
+ date: 2008-12-01 08:54:17.132058 -08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -38,7 +38,6 @@ files:
38
38
  - lib/currency/core_extensions.rb
39
39
  - lib/currency/currency/factory.rb
40
40
  - lib/currency/currency.rb
41
- - lib/currency/currency_version.rb
42
41
  - lib/currency/exception.rb
43
42
  - lib/currency/exchange/rate/deriver.rb
44
43
  - lib/currency/exchange/rate/source/base.rb
@@ -1,6 +0,0 @@
1
- module Currency
2
- CurrencyVersion = '0.4.11'
3
- end
4
- # DO NOT EDIT
5
- # This file is auto-generated by build scripts.
6
- # See: rake update_version