easy_money 0.1.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.
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Allen Fair
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,108 @@
1
+ = Easy Money!
2
+
3
+ A Ruby mixin library to add simple money display and editing using data stored as an integer in
4
+ cents or other precision or currency.
5
+ Easy Money is a simpler alternative to the "money" gem, and easier to use, hence the name.
6
+
7
+ Float types are not good for storing and computing financial data because of rounding and conversion
8
+ between floats and decimal precision and slower performance compared to integer arithmetic. Integers
9
+ are preferred in this case, with a dollar amount ($1.00) stored as cents (100) internally.
10
+
11
+
12
+ Easy Money will also handle any float data stored as integer in the database for this reason, such
13
+ as FM Radio Frequencies (88.1 FM) or an NTRP Tennis Rating (4.5).
14
+
15
+ == Quick Start
16
+ Easy Money works in any Ruby class, it does not require Active Record or other ORM.
17
+ Its default setting allow it to work on US Dollar amounts stored in cents, but is easily configured.
18
+
19
+ First, install this from gemcutter
20
+ gem install easy_money
21
+
22
+ Next, you need to configure your app to use it, by either:
23
+ require 'rubygems' # Rails application, no framework
24
+ require 'easy_money' #
25
+
26
+ config.gem 'easy_money' # Rails 2.x, in your ./config/environment.rb
27
+
28
+ gem 'easy_money' # Rails 3.x, in your ./Gemfile
29
+
30
+ Mixin the EasyMoney module into the (model) class you need, and declare the
31
+ attributes (columns) you wish you have the easy_money helpers
32
+
33
+ class Ledger
34
+ include EasyMoney
35
+ attr_accessor :amount, :euro # Integer value of cents
36
+ easy_money :amount # Creates amount_money() and amount_money=() methods
37
+ easy_money :amount, :units=>"dollars", :unit=>'$', :negative=>'%.2f CR'
38
+ # Creates amount_dollars() and amount_dollars=() methods
39
+ end
40
+
41
+ ledger = Ledger.new
42
+ ledger.amount = 100 # 100 cents = $1.00
43
+ ledger.amount_money #=> "1.00"
44
+ ledger.amount_money = "-123.45"
45
+ ledger.amount #=> -12345 (cents)
46
+ ledger.amount_money(:negative=>'%.2f CR', :zero=>'Free') # Uses these formats
47
+ ledger.amount_dollars #=> "$123.45 CR"
48
+
49
+ # Track the bets of the Gamesters of Triskelion on their drill thrall competitions.
50
+ class ProviderWagers < ActiveRecord::Base
51
+ include EasyMoney
52
+ easy_money :quatloos, :units=>'quatloos', :precision=>3,
53
+ :zero=>'even', :nil=>'no bet', :negative=>'%.3f Loss', :unit=>'Q',
54
+ :negative_regex=>/^(-?)(.+\d)\s*Loss/i
55
+ # creates amount_quatloos(), amount_quatloos=()
56
+ end
57
+
58
+ # in your views
59
+ <%= f.text_field :amount_quatloos %> # -12000 => "Q12.000 Loss"
60
+
61
+ Options for Easy Money calls:
62
+ * :money_method - Use this as the alternative name to the money-access methods
63
+ * :units - Use this as an alternative suffix name to the money methods ('dollars' gives 'xx_dollars')
64
+ * :precision - The number of digits implied after the decimal, default is 2
65
+ * :separator - The character to use after the integer part, default is '.'
66
+ * :delimiter - The character to use between every 3 digits of the integer part, default none
67
+ * :positive - The sprintf format to use for positive numbers, default is based on precision
68
+ * :negative - The sprintf format to use for negative numbers, default is same as :positive
69
+ * :zero - The sprintf format to use for zero, default is same as :positive
70
+ * :nil - The sprintf format to use for nil values, default none
71
+ * :unit - Prepend this to the front of the money value, say '$', default none
72
+ * :blank - Return this value when the money string is empty or has no digits on assignment
73
+ * :negative_regex - A Regular Expression used to determine if a number is negative (and without a - sign), defaults to having a "CR" after the number
74
+
75
+ == Easy Money Formatters
76
+ You can also call or build your own custom conversions. Ensure that
77
+ you can convert between the integer and money forms if you need to.
78
+
79
+ The "money" type is a string, sutitable for human editing, and will convert back into
80
+ integer type. If you override the formatting options, test that your money result
81
+ string will convert properly back to the original integer value.
82
+
83
+ include EasyMoney
84
+ ...
85
+ puts EasyMoney.money_to_integer( money_string, :option=>value, ... )
86
+ puts EasyMoney.integer_to_money( cents_integer, :option=>value, ... )
87
+ puts EasyMoney.integer_to_float( cents_integer, :option=>value, ... )
88
+ puts EasyMoney.float_to_integer( money_float, :option=>value, ... )
89
+
90
+ EasyMoney.integer_to_float( nil, blank:0.0 ) #=> 0.0 [Ruby 1.9.1 Syntax]
91
+ EasyMoney.integer_to_float( 12345, :precision=>3 ) #=> 12.345
92
+ EasyMoney.float_to_integer(12.345111, :precision=>3 ) #=> 12345
93
+
94
+ The options to these methods are the same as the #easy_money declarations
95
+
96
+
97
+ == To Do
98
+
99
+ * Validate Money string format
100
+ * Global configuration for currency settings
101
+ * Explore rounding vs. truncation issues
102
+ * Use a Locale and I18n on money formatting, without introducing dependencies (perhaps by injection)?
103
+ * Explore inegration of Rails' NumberHelper methods, but not require ActionView
104
+ * Custom converters (useful for say, converting bytes to Gigabytes)?
105
+
106
+ == Copyright
107
+
108
+ Copyright (c) 2010 Allen Fair. See LICENSE for details.
@@ -0,0 +1,52 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "easy_money"
8
+ gem.summary = %Q{Easy Money handling for Rails/ActiveRecord}
9
+ gem.description = %Q{Easy Money handling for Rails/ActiveRecord}
10
+ gem.email = "allen.fair@gmail.com"
11
+ gem.homepage = "http://github.com/afair/easy_money"
12
+ gem.authors = ["Allen Fair"]
13
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
14
+ end
15
+ Jeweler::GemcutterTasks.new
16
+ rescue LoadError
17
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
18
+ end
19
+
20
+ require 'rake/testtask'
21
+ Rake::TestTask.new(:test) do |test|
22
+ test.libs << 'lib' << 'test'
23
+ test.pattern = 'test/**/test_*.rb'
24
+ test.verbose = true
25
+ end
26
+
27
+ begin
28
+ require 'rcov/rcovtask'
29
+ Rcov::RcovTask.new do |test|
30
+ test.libs << 'test'
31
+ test.pattern = 'test/**/test_*.rb'
32
+ test.verbose = true
33
+ end
34
+ rescue LoadError
35
+ task :rcov do
36
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
37
+ end
38
+ end
39
+
40
+ task :test => :check_dependencies
41
+
42
+ task :default => :test
43
+
44
+ require 'rake/rdoctask'
45
+ Rake::RDocTask.new do |rdoc|
46
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
47
+
48
+ rdoc.rdoc_dir = 'rdoc'
49
+ rdoc.title = "easy_money #{version}"
50
+ rdoc.rdoc_files.include('README*')
51
+ rdoc.rdoc_files.include('lib/**/*.rb')
52
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,51 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{easy_money}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Allen Fair"]
12
+ s.date = %q{2010-02-23}
13
+ s.description = %q{Easy Money handling for Rails/ActiveRecord}
14
+ s.email = %q{allen.fair@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "easy_money.gemspec",
27
+ "lib/easy_money.rb",
28
+ "test/helper.rb",
29
+ "test/test_easy_money.rb"
30
+ ]
31
+ s.homepage = %q{http://github.com/afair/easy_money}
32
+ s.rdoc_options = ["--charset=UTF-8"]
33
+ s.require_paths = ["lib"]
34
+ s.rubygems_version = %q{1.3.6}
35
+ s.summary = %q{Easy Money handling for Rails/ActiveRecord}
36
+ s.test_files = [
37
+ "test/helper.rb",
38
+ "test/test_easy_money.rb"
39
+ ]
40
+
41
+ if s.respond_to? :specification_version then
42
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
43
+ s.specification_version = 3
44
+
45
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
46
+ else
47
+ end
48
+ else
49
+ end
50
+ end
51
+
@@ -0,0 +1,124 @@
1
+ # EasyMoney - Ruby class mixin library to add money helpers to attribute/methods
2
+ module EasyMoney
3
+
4
+ def self.included(base) #:nodoc:
5
+ base.extend( ClassMethods )
6
+ end
7
+
8
+ module ClassMethods
9
+
10
+ # Creates an money instance method for the given method, named "#{method}_money" which returns
11
+ # a formatted money string, and a #{method}_money= method used to set an edited money string.
12
+ # The original method stores the value as integer (cents, or other precision/currency setting). Options:
13
+ # * :money_method - Use this as the alternative name to the money-access methods
14
+ # * :units - Use this as an alternative suffix name to the money methods ('dollars' gives 'xx_dollars')
15
+ # * :precision - The number of digits implied after the decimal, default is 2
16
+ # * :separator - The character to use after the integer part, default is '.'
17
+ # * :delimiter - The character to use between every 3 digits of the integer part, default none
18
+ # * :positive - The sprintf format to use for positive numbers, default is based on precision
19
+ # * :negative - The sprintf format to use for negative numbers, default is same as :positive
20
+ # * :zero - The sprintf format to use for zero, default is same as :positive
21
+ # * :nil - The sprintf format to use for nil values, default none
22
+ # * :unit - Prepend this to the front of the money value, say '$', default none
23
+ # * :blank - Return this value when the money string is empty or has no digits on assignment
24
+ # * :negative_regex - A Regular Expression used to determine if a number is negative (and without a - sign)
25
+ #
26
+ def easy_money(method, *args)
27
+ opt = args.last.is_a?(Hash) ? args.pop : {}
28
+ money_method = opt.delete(:money_method) || "#{method}_#{opt.delete(:units)||'money'}"
29
+
30
+ class_eval %Q(
31
+ def #{money_method}(*args)
32
+ opt = args.last.is_a?(Hash) ? args.pop : {}
33
+ EasyMoney.integer_to_money( #{method}, #{opt.inspect}.merge(opt))
34
+ end
35
+
36
+ def #{money_method}=(v, *args)
37
+ opt = args.last.is_a?(Hash) ? args.pop : {}
38
+ self.#{method} = EasyMoney.money_to_integer( v, #{opt.inspect}.merge(opt))
39
+ end
40
+ )
41
+ end
42
+ end
43
+
44
+ # Returns the money string of the given integer value. Uses relevant options from #easy_money
45
+ def self.integer_to_money(value, *args)
46
+ opt = args.last.is_a?(Hash) ? args.pop : {}
47
+ opt[:positive] ||= "%.#{opt[:precision]||2}f"
48
+ pattern =
49
+ if value.nil?
50
+ value = 0
51
+ opt[:nil] || opt[:positive]
52
+ else
53
+ case value <=> 0
54
+ when 1 then opt[:positive]
55
+ when 0 then opt[:zero] || opt[:positive]
56
+ else
57
+ value = -value if opt[:negative] && opt[:negative] != opt[:positive]
58
+ opt[:negative] || opt[:positive]
59
+ end
60
+ end
61
+ value = self.format_money( value, pattern, opt)
62
+ value = opt[:unit]+value if opt[:unit]
63
+ value.gsub!(/\./,opt[:separator]) if opt[:separator]
64
+ if opt[:delimiter] && (m = value.match(/^(\D*)(\d+)(.*)/))
65
+ # Adapted From Rails' ActionView::Helpers::NumberHelper
66
+ n = m[2].gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{opt[:delimiter]}")
67
+ value=m[1]+n+m[3]
68
+ end
69
+ value
70
+ end
71
+
72
+ def self.integer_to_float(value, *args)
73
+ opt = args.last.is_a?(Hash) ? args.pop : {}
74
+ return (opt[:blank]||nil) if value.nil?
75
+ value = 1.0 * value / (10**(opt[:precision]||2))
76
+ end
77
+
78
+ # Returns the integer of the given money string. Uses relevant options from #easy_money
79
+ def self.money_to_integer(value, *args)
80
+ opt = args.last.is_a?(Hash) ? args.pop : {}
81
+ value.gsub!(opt[:delimiter],'') if opt[:delimiter]
82
+ value.gsub!(opt[:separator],'.') if opt[:separator]
83
+ value.gsub!(/^[^\d\.\-\,]+/,'')
84
+ return (opt[:blank]||nil) unless value =~ /\d/
85
+ m = value.to_s.match(opt[:negative_regex]||/^(-?)(.+\d)\s*cr/i)
86
+ value = value.match(/^-/) ? m[2] : "-#{m[2]}" if m && m[2]
87
+
88
+ # Money string ("123.45") to proper integer withough passing through the float transformation
89
+ match = value.match(/(-?\d*)\.?(\d*)/)
90
+ return 0 unless match
91
+ value = match[1].to_i * (10 ** (opt[:precision]||2))
92
+ cents = match[2]
93
+ cents = cents + '0' while cents.length < (opt[:precision]||2)
94
+ cents = cents.to_s[0,opt[:precision]||2]
95
+ value += cents.to_i * (value<0 ? -1 : 1)
96
+ value
97
+ end
98
+
99
+ # Returns the integer (cents) value from a Float
100
+ def self.float_to_integer(value, *args)
101
+ opt = args.last.is_a?(Hash) ? args.pop : {}
102
+ return (opt[:blank]||nil) if value.nil?
103
+ value = (value.to_f*(10**((opt[:precision]||2)+1))).to_i/10 # helps rounding 4.56 -> 455 ouch!
104
+ end
105
+
106
+ # Replacing the sprintf function to deal with money as float. "... %[flags]m ..."
107
+ def self.format_money(value, pattern="%.2m", *args)
108
+ opt = args.last.is_a?(Hash) ? args.pop : {}
109
+ sign = value < 0 ? -1 : 1
110
+ dollars, cents = value.abs.divmod( 10 ** (opt[:precision]||2))
111
+ dollars *= sign
112
+ parts = pattern.match(/^(.*)%([-\. \d+0]*)[fm](.*)/)
113
+ return pattern unless parts
114
+ intdec = parts[2].match(/(.*)\.(\d*)/)
115
+ dprec, cprec = intdec ? [intdec[1], intdec[2]] : ['', '']
116
+ dollars = sprintf("%#{dprec}d", dollars)
117
+ cents = '0' + cents.to_s while cents.to_s.length < (opt[:precision]||2)
118
+ cents = cents.to_s[0,cprec.to_i]
119
+ cents = cents + '0' while cents.length < cprec.to_i
120
+ value = parts[1] + "#{(dollars.to_i==0 && sign==-1) ? '-' : '' }#{dollars}#{cents>' '? '.':''}#{cents}" + parts[3]
121
+ value
122
+ end
123
+
124
+ end
@@ -0,0 +1,16 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+
4
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ require 'easy_money'
7
+
8
+ class Test::Unit::TestCase
9
+ end
10
+
11
+ class Sample
12
+ include EasyMoney
13
+ attr_accessor :price, :balance
14
+ easy_money :price
15
+ easy_money :balance
16
+ end
@@ -0,0 +1,87 @@
1
+ require 'helper'
2
+
3
+ class TestEasyMoney < Test::Unit::TestCase
4
+
5
+ def test_include
6
+ sample = Sample.new
7
+ flunk "no price_money method" unless sample.respond_to?(:price_money)
8
+ flunk "no price_money= method" unless sample.respond_to?(:price_money=)
9
+ end
10
+
11
+ def test_method_money
12
+ s = Sample.new
13
+ [ 10000, 123456, 0, -1 -9876 ].each do |p|
14
+ s.price = p
15
+ m = s.price_money
16
+ s.price_money = m
17
+ flunk "Assignment error: p=#{p} m=#{m} price=#{s.price}" unless s.price = p
18
+ end
19
+ end
20
+
21
+ def test_method_money=
22
+ s = Sample.new
23
+ { "0.00"=>0, "12.34"=>1234, "-1.2345"=>-123, "12"=>1200, "4.56CR"=>-456 }.each do |m,p|
24
+ s.price_money = m
25
+ flunk "Assignment error: p=#{p} m=#{m} price=#{s.price}" unless s.price = p
26
+ end
27
+ end
28
+
29
+ def test_integer_to_money
30
+ assert EasyMoney.integer_to_money(123) == '1.23'
31
+ assert EasyMoney.integer_to_money(-12333) == '-123.33'
32
+ assert EasyMoney.integer_to_money(0) == '0.00'
33
+ assert EasyMoney.integer_to_money(nil, :nil=>'?') == '?'
34
+ assert EasyMoney.integer_to_money(-1, :negative=>'%.2f CR') == '0.01 CR'
35
+ assert EasyMoney.integer_to_money(0, :zero=>'free') == 'free'
36
+ assert EasyMoney.integer_to_money(100, :unit=>'$') == '$1.00'
37
+ assert EasyMoney.integer_to_money(100, :separator=>',') == '1,00'
38
+ assert EasyMoney.integer_to_money(12345678900, :separator=>',', :delimiter=>'.') == '123.456.789,00'
39
+ assert EasyMoney.integer_to_money(333, :precision=>3) == '0.333'
40
+ assert EasyMoney.integer_to_money(111, :precision=>1) == '11.1'
41
+ assert EasyMoney.integer_to_money(111, :precision=>0) == '111'
42
+ end
43
+
44
+ def test_money_to_integer
45
+ assert EasyMoney.money_to_integer('1.23' ) == 123
46
+ assert EasyMoney.money_to_integer('0.00' ) == 0
47
+ assert EasyMoney.money_to_integer('-1.23' ) == -123
48
+ assert EasyMoney.money_to_integer('1.23 CR' ) == -123
49
+ assert EasyMoney.money_to_integer('$-2.34 CR' ) == 234
50
+ assert EasyMoney.money_to_integer(' 1.234' ) == 123
51
+ assert EasyMoney.money_to_integer('$1' ) == 100
52
+ assert EasyMoney.money_to_integer('1' ) == 100
53
+ assert EasyMoney.money_to_integer('' ) == nil
54
+ assert EasyMoney.money_to_integer('1,00', :separator=>',',:delimiter=>'.') == 100
55
+ assert EasyMoney.money_to_integer('$123.456.789,00 CR', :separator=>',',:delimiter=>'.') == -12345678900
56
+ assert EasyMoney.money_to_integer('4.44', :precision=>4 ) == 44400
57
+ assert EasyMoney.money_to_integer('4.44', :precision=>0 ) == 4
58
+ end
59
+
60
+ def test_float_to_integer
61
+ assert EasyMoney.float_to_integer(1.00 ) == 100
62
+ assert EasyMoney.float_to_integer(1.001 ) == 100
63
+ assert EasyMoney.float_to_integer(-1.23 ) == -123
64
+ assert EasyMoney.float_to_integer(9.0 ) == 900
65
+ assert EasyMoney.float_to_integer(nil ) == nil
66
+ assert EasyMoney.float_to_integer(0.00 ) == 0
67
+ end
68
+
69
+ def test_integer_to_float
70
+ assert EasyMoney.integer_to_float(1 ) == 0.01
71
+ assert EasyMoney.integer_to_float(0 ) == 0.0
72
+ assert EasyMoney.integer_to_float(-100 ) == -1.00
73
+ assert EasyMoney.integer_to_float(nil ) == nil
74
+ assert EasyMoney.integer_to_float(9999888, :precision=>3 ) == 9999.888
75
+ end
76
+
77
+ def test_format_money
78
+ assert EasyMoney.format_money(12345) == '123.45'
79
+ assert EasyMoney.format_money(12345, "%07.2m") == '0000123.45'
80
+ assert EasyMoney.format_money(12345, "%07.3m") == '0000123.450'
81
+ assert EasyMoney.format_money(12345, "%m") == '123'
82
+ assert EasyMoney.format_money(12345, "free") == 'free'
83
+ assert EasyMoney.format_money(-12345) == '-123.45'
84
+ assert EasyMoney.format_money(-12345, "%07.1m") == '-000123.4'
85
+ assert EasyMoney.format_money(-1) == '-0.01'
86
+ end
87
+ end
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: easy_money
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Allen Fair
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-02-23 00:00:00 -05:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: Easy Money handling for Rails/ActiveRecord
22
+ email: allen.fair@gmail.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files:
28
+ - LICENSE
29
+ - README.rdoc
30
+ files:
31
+ - .document
32
+ - .gitignore
33
+ - LICENSE
34
+ - README.rdoc
35
+ - Rakefile
36
+ - VERSION
37
+ - easy_money.gemspec
38
+ - lib/easy_money.rb
39
+ - test/helper.rb
40
+ - test/test_easy_money.rb
41
+ has_rdoc: true
42
+ homepage: http://github.com/afair/easy_money
43
+ licenses: []
44
+
45
+ post_install_message:
46
+ rdoc_options:
47
+ - --charset=UTF-8
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ segments:
55
+ - 0
56
+ version: "0"
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ segments:
62
+ - 0
63
+ version: "0"
64
+ requirements: []
65
+
66
+ rubyforge_project:
67
+ rubygems_version: 1.3.6
68
+ signing_key:
69
+ specification_version: 3
70
+ summary: Easy Money handling for Rails/ActiveRecord
71
+ test_files:
72
+ - test/helper.rb
73
+ - test/test_easy_money.rb