refinance 1.0.0 → 1.0.1

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2b891ac8019babc3e1e7dddeeca467eab9d4b23f
4
+ data.tar.gz: c1afcdc0ac1014dee2e3f0bc11621f5308caa28b
5
+ SHA512:
6
+ metadata.gz: 118220872ce33ab4b8d3d5a16b690c78af2d90d907021fb7ddbf57b8e7965abd67f99ff58b781a4e06ac12e998e56a845d217d7e48c754ec1c02aa36a9c7a592
7
+ data.tar.gz: f2b738e5e698945af6219359d62da8274e5826b8448860915ee608c1da4f026584b442a894c08d8d3b6adbf880d0975dedfe40affc0a2c5b79436feb19145a05
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-2013 reInteractive Pty Ltd
1
+ Copyright (c) 2012-2014 reInteractive Pty Ltd
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -5,17 +5,178 @@ Currently, it contains algorithms for calculating the properties of ordinary
5
5
  annuities: principal, interest rate, number of payment periods, and payment
6
6
  amount.
7
7
 
8
- The algorithms are simple rather than fast and numerically robust. Thanks to
9
- duck typing, they work with both BigDecimals and Floats. At present, they deal
10
- only with _annuities immediate_ (in which the interest is accumulated _before_
11
- the payment), not _annuities due_ (in which the interest is accumulated _after_
12
- the payment). There are many opportunities for extension and improvement.
8
+ ## Introduction
9
+
10
+ Refinance does calculations related to
11
+ [annuities](http://en.wikipedia.org/wiki/Annuity_%28finance_theory%29) in
12
+ finance theory. In general, an annuity is a finite series of regular payments;
13
+ an installment loan for a car is an example that might be familiar to you.
14
+
15
+ Refinance allows you to answer questions like these:
16
+
17
+ 1. Say you have a car loan and are paying a fixed amount each month to pay it
18
+ off. If you got a reduced interest rate, exactly how much lower would your
19
+ monthly payments be?
20
+
21
+ 2. If you get a reduced interest rate but continue to pay the same monthly
22
+ payments, exactly how much shorter will the loan duration be?
23
+
24
+ 3. Say you want to borrow money to buy a car. If your bank will lend you money
25
+ at an X% annual interest rate, and you're willing to make monthly payments as
26
+ high as $Y, how expensive of a car can you buy?
27
+
28
+ 4. Say you're making monthly payments of $X to pay off a $Y loan. What interest
29
+ rate are you being charged?
30
+
31
+ 5. Say your loan has an interest rate of X% per month. What is its effective
32
+ _annual_ interest rate?
33
+
34
+ Annuities have four defining properties (at least for our purposes), and the
35
+ first four questions above provide examples of each: The first question is
36
+ asking for the annuity's _periodic payment amount_. The second is asking for
37
+ the _number of remaining payments_. The third is asking for the _principal_.
38
+ And the fourth is asking for the _interest rate_.
39
+
40
+ In general, if you know three of those properties, Refinance can calculate
41
+ the fourth.
42
+
43
+ The fifth question is about converting an interest rate. Perhaps you think this
44
+ is trivial: if you're paying 1% per month, then it's equivalent to paying 12%
45
+ per year, right? Wrong. It's more like 12.68%. You need to account for the
46
+ effects of [compound interest](http://en.wikipedia.org/wiki/Compound_interest).
47
+
48
+
49
+ ## Usage example
50
+
51
+ I'll use [Example 2 from Stan Brown's paper](http://oakroadsystems.com/math/loan.htm#Sample2):
52
+
53
+ > You are buying a $250,000 house, with 10% down, on a 30-year mortgage at a
54
+ > fixed rate of 7.8%. What is the monthly payment?
55
+
56
+ We want to calculate the monthly payment, so we'll use the method
57
+ Refinance::Annuities.payment. That method requires three arguments: the
58
+ interest rate (per month, since we're calculating the monthly payment), the
59
+ total number of monthly payments, and the principal. These are easy to
60
+ determine from the example:
61
+
62
+ * The interest rate is 7.8%, but there are two things to note here. First, 7.8%
63
+ is a [nominal annual rate](http://en.wikipedia.org/wiki/Nominal_interest_rate),
64
+ and we want the monthly interest rate. So we divide 7.8% by 12 (because there
65
+ are 12 months in a year) and get 0.65%. Second, the method wants the argument
66
+ in decimal form, not percent form, so 0.65% becomes 0.0065.
67
+
68
+ * The loan lasts 30 years, and we want the number of payment periods -- that
69
+ is, the number of months. 30 years is 360 months.
70
+
71
+ * The house's purchase price is $250,000, and we're making a 10% down payment,
72
+ so the loan's principal will be 90% of $250,000, or $225,000.
73
+
74
+ Now we can call the method:
75
+
76
+ Refinance::Annuities.payment 0.0065, 360.0, 225000.0
77
+
78
+ (You can name the arguments "interest rate", "periods", and "principal". For
79
+ this and related methods, the arguments go in alphabetical order.)
80
+
81
+ The return value is 1619.7086268909618. So the monthly payment is about
82
+ $1,619.71.
83
+
84
+
85
+ ## API
86
+
87
+ Here's a summary of the public-facing methods provided by this library. They
88
+ are all stateless "functions".
89
+
90
+ Arguments to these methods are not directly converted to a particular numeric
91
+ type; they can be any objects that support the necessary mathematical methods.
92
+ Instances of Float and BigDecimal will work for real-valued arguments.
93
+
94
+ Interest rates must be in decimal form, not percent form.
95
+
96
+
97
+ ### Refinance::Annuities.interest_rate
98
+
99
+ This method calculates an annuity's interest rate over its payment period. The
100
+ result will be given as a decimal number, not as a percent. There is no
101
+ closed-form solution for this, so the answer is iteratively approximated with
102
+ the
103
+ [Newton-Raphson method](http://en.wikipedia.org/wiki/Newton-raphson_method).
104
+
105
+ Arguments:
106
+
107
+ 1. The periodic payment amount.
108
+ 2. The total number of payment periods.
109
+ 3. The principal.
110
+ 4. (Optional) The initial guess at the interest rate.
111
+ 5. (Optional) The precision; the algorithm will stop if the magnitude of the
112
+ last improvement was less than this.
113
+ 6. (Optional) The maximum number of decimal places. After each iteration, the
114
+ guess will be rounded to this many decimal places.
115
+ 7. (Optional) The maximum number of iterations to allow.
116
+
117
+
118
+ ### Refinance::Annuities.payment
119
+
120
+ This method calculates an annuity's periodic payment amount.
121
+
122
+ Arguments:
123
+
124
+ 1. The interest rate over one payment period.
125
+ 2. The total number of payment periods.
126
+ 3. The principal.
127
+
128
+
129
+ ### Refinance::Annuities.periods
130
+
131
+ This method calculates the total number of payment periods for an annuity.
132
+
133
+ Arguments:
134
+
135
+ 1. The interest rate over one payment period.
136
+ 2. The periodic payment amount.
137
+ 3. The principal.
138
+
139
+
140
+ ### Refinance::Annuities.principal
141
+
142
+ This method calculates the principal of an annuity.
143
+
144
+ Arguments:
145
+
146
+ 1. The interest rate over one payment period.
147
+ 2. The periodic payment amount.
148
+ 3. The total number of payment periods.
149
+
150
+
151
+ ### Refinance::Annuities.effective_interest_rate
152
+
153
+ This method calculates the effective annual interest rate.
154
+
155
+ Arguments:
156
+
157
+ 1. The nominal annual interest rate.
158
+ 2. The number of compounding periods per year.
159
+
160
+
161
+ ## Implementation
162
+
163
+ The algorithms are simple rather than fast and
164
+ [numerically stable](http://en.wikipedia.org/wiki/Numerical_stability). At
165
+ present, they deal only with _annuities immediate_ (in which the interest is
166
+ accumulated _before_ the payment), not _annuities due_ (in which the interest
167
+ is accumulated _after_ the payment).
168
+
13
169
 
14
170
  ## Requirements
15
171
 
16
- This library is tested with versions 1.9.3 and 2.0.0 of MRI (Matz's Ruby
17
- Interpreter). It also works with version 1.9.2 if you only use Float, not
18
- BigDecimal, for floating-point values.
172
+ This library is tested with the following versions of MRI (Matz's Ruby
173
+ Interpreter): 1.9.3, 2.0.0, 2.1.0, 2.1.1, and 2.1.2.
174
+
175
+ If you wish you to use BigDecimal, we recommend using the
176
+ [bigdecimal gem](https://rubygems.org/gems/bigdecimal) instead of the version
177
+ of BigDecimal that ships in the standard library. Refinance's test suite does
178
+ not pass with the version of BigDecimal that ships with MRI 2.1.0.
179
+
19
180
 
20
181
  ## Installation
21
182
 
@@ -31,6 +192,7 @@ Or install it yourself as:
31
192
 
32
193
  $ gem install refinance
33
194
 
195
+
34
196
  ## Contributing
35
197
 
36
198
  1. Fork it
@@ -39,15 +201,17 @@ Or install it yourself as:
39
201
  4. Push to the branch (`git push origin my-new-feature`)
40
202
  5. Create new Pull Request
41
203
 
204
+
42
205
  ## Authorship and copyright information
43
206
 
44
207
  This software was written by [reInteractive](http://reinteractive.net/), a
45
208
  software consulting company in Sydney, Australia. It is distributed under the
46
209
  MIT License; see LICENSE.txt for details.
47
210
 
211
+
48
212
  ## Acknowledgements
49
213
 
50
- Thanks to Stan Brown for his paper _[Loan or Investment
51
- Formulas](http://oakroadsystems.com/math/loan.htm)_. It is an excellent
52
- introduction to the mathematics of annuities, and we used some of its examples
53
- as test cases.
214
+ Thanks to Stan Brown for his paper
215
+ _[Loan or Investment Formulas](http://oakroadsystems.com/math/loan.htm)_. It is
216
+ an excellent introduction to the mathematics of annuities, and we used some of
217
+ its examples as test cases.
@@ -1,3 +1,3 @@
1
1
  module Refinance
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
data/refinance.gemspec CHANGED
@@ -1,24 +1,26 @@
1
- # -*- encoding: utf-8 -*-
1
+ # coding: utf-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'refinance/version'
5
5
 
6
- Gem::Specification.new do |gem|
7
- gem.name = "refinance"
8
- gem.version = Refinance::VERSION
9
- gem.authors = ["reInteractive"]
10
- gem.email = ["enquiries@reinteractive.net"]
11
- gem.description = %q{A collection of finance algorithms related to annuities.}
12
- gem.summary = %q{Simple annuity algorithms}
13
- gem.homepage = "https://github.com/reinteractive-open/refinance"
14
- gem.license = "MIT"
15
- gem.required_ruby_version = ">= 1.9.3"
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'refinance'
8
+ spec.version = Refinance::VERSION
9
+ spec.author = 'reInteractive'
10
+ spec.email = 'enquiries@reinteractive.net'
11
+ spec.description = %q{A collection of finance algorithms related to annuities.}
12
+ spec.summary = %q{Simple annuity algorithms}
13
+ spec.homepage = 'https://github.com/reinteractive-open/refinance'
14
+ spec.license = 'MIT'
15
+ spec.required_ruby_version = '>= 1.9.3'
16
+ spec.platform = Gem::Platform::RUBY
16
17
 
17
- gem.files = `git ls-files`.split($/)
18
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
19
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
20
- gem.require_paths = ["lib"]
18
+ spec.files = `git ls-files -z`.split("\x0")
19
+ spec.executables = spec.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
20
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
+ spec.require_paths = ["lib"]
21
22
 
22
- gem.add_development_dependency 'rake', '10.0.4'
23
- gem.add_development_dependency 'minitest', '4.7.4'
23
+ spec.add_development_dependency 'rake', '10.3.2'
24
+ spec.add_development_dependency 'minitest', '5.3.5'
25
+ spec.add_development_dependency 'bigdecimal', '1.2.5'
24
26
  end
@@ -0,0 +1,57 @@
1
+ module AnnuitiesHelper
2
+ def assert_improve_interest_rate options
3
+ actual = Refinance::Annuities.improve_interest_rate(
4
+ options.fetch(:payment),
5
+ options.fetch(:periods),
6
+ options.fetch(:principal),
7
+ options.fetch(:guess))
8
+
9
+ assert_in_delta options.fetch(:expected), actual, options.fetch(:delta)
10
+ end
11
+
12
+ def assert_interest_rate_stops_if_improvement_is_small options
13
+ actual = Refinance::Annuities.interest_rate(options.fetch(:payment),
14
+ options.fetch(:periods), options.fetch(:principal),
15
+ options.fetch(:guess), options.fetch(:precision))
16
+
17
+ assert_in_delta options.fetch(:expected), actual, options.fetch(:delta)
18
+ end
19
+
20
+ def assert_interest_rate_does_multiple_iterations options
21
+ actual = Refinance::Annuities.interest_rate(options.fetch(:payment),
22
+ options.fetch(:periods), options.fetch(:principal),
23
+ options.fetch(:guess), options.fetch(:precision),
24
+ options.fetch(:max_decimals), options.fetch(:max_iterations))
25
+
26
+ assert_in_delta options.fetch(:expected), actual, options.fetch(:delta)
27
+ end
28
+
29
+ def assert_payment options
30
+ actual = Refinance::Annuities.payment(options.fetch(:interest_rate),
31
+ options.fetch(:periods), options.fetch(:principal))
32
+
33
+ assert_in_delta options.fetch(:expected), actual, options.fetch(:delta)
34
+ end
35
+
36
+ def assert_periods options
37
+ actual = Refinance::Annuities.periods(options.fetch(:interest_rate),
38
+ options.fetch(:payment), options.fetch(:principal))
39
+
40
+ assert_in_delta options.fetch(:expected), actual, options.fetch(:delta)
41
+ end
42
+
43
+ def assert_principal options
44
+ actual = Refinance::Annuities.principal(options.fetch(:interest_rate),
45
+ options.fetch(:payment), options.fetch(:periods))
46
+
47
+ assert_in_delta options.fetch(:expected), actual, options.fetch(:delta)
48
+ end
49
+
50
+ def assert_effective_interest_rate options
51
+ actual = Refinance::Annuities.effective_interest_rate(
52
+ options.fetch(:nominal_annual_interest_rate),
53
+ options.fetch(:compounding_periods_per_year))
54
+
55
+ assert_in_delta options.fetch(:expected), actual, options.fetch(:delta)
56
+ end
57
+ end
@@ -1,7 +1,7 @@
1
1
  require 'test_helper'
2
- require 'bigdecimal'
3
2
 
4
- class BigDecimalAnnuitiesTest < AnnuitiesTest
3
+ class BigDecimalAnnuitiesTest < Minitest::Test
4
+ include AnnuitiesHelper
5
5
 
6
6
  def test_improve_interest_rate
7
7
  # Based on Example 6 in http://oakroadsystems.com/math/loan.htm .
@@ -31,6 +31,13 @@ class BigDecimalAnnuitiesTest < AnnuitiesTest
31
31
  delta: BigDecimal.new('0.0000000001')
32
32
  end
33
33
 
34
+ def test_interest_rate_stops_if_max_iterations_reached
35
+ expected = BigDecimal.new('0.42')
36
+ actual = Refinance::Annuities.interest_rate(0, 0, 0, expected, 0, 1, 0)
37
+
38
+ assert_equal expected, actual
39
+ end
40
+
34
41
  def test_payment
35
42
  # Based on Example 2 in http://oakroadsystems.com/math/loan.htm .
36
43
  assert_payment interest_rate: BigDecimal.new('0.0065'),
@@ -1,6 +1,7 @@
1
1
  require 'test_helper'
2
2
 
3
- class FloatAnnuitiesTest < AnnuitiesTest
3
+ class FloatAnnuitiesTest < Minitest::Test
4
+ include AnnuitiesHelper
4
5
 
5
6
  def test_improve_interest_rate
6
7
  # Based on Example 6 in http://oakroadsystems.com/math/loan.htm .
@@ -24,7 +25,15 @@ class FloatAnnuitiesTest < AnnuitiesTest
24
25
  delta: 0.0000000001
25
26
  end
26
27
 
28
+ def test_interest_rate_stops_if_max_iterations_reached
29
+ expected = 0.42
30
+ actual = Refinance::Annuities.interest_rate(0, 0, 0, expected, 0, 1, 0)
31
+
32
+ assert_equal expected, actual
33
+ end
34
+
27
35
  def test_payment
36
+ # Based on Example 2 in http://oakroadsystems.com/math/loan.htm .
28
37
  assert_payment interest_rate: 0.0065, periods: 360.0, principal: 225000.0,
29
38
  expected: 1619.708627, delta: 0.000001
30
39
  end
@@ -1,18 +1,11 @@
1
1
  require 'test_helper'
2
2
 
3
- class RefinanceTest < Minitest::Unit::TestCase
3
+ class RefinanceTest < Minitest::Test
4
4
  def test_refinance_is_a_module
5
- assert_kind_of Module, ::Refinance
5
+ assert_kind_of ::Module, ::Refinance
6
6
  end
7
7
 
8
8
  def test_version_is_a_string
9
- assert_kind_of String, ::Refinance::VERSION
10
- end
11
-
12
- def test_interest_rate_stops_if_max_iterations_reached
13
- expected = 0.42
14
- actual = Refinance::Annuities.interest_rate(0, 0, 0, expected, 0, 1, 0)
15
-
16
- assert_equal expected, actual
9
+ assert_kind_of ::String, ::Refinance::VERSION
17
10
  end
18
11
  end
data/test/test_helper.rb CHANGED
@@ -1,60 +1,4 @@
1
1
  require 'minitest/autorun'
2
+ require 'bigdecimal'
2
3
  require 'refinance'
3
-
4
- class AnnuitiesTest < Minitest::Unit::TestCase
5
- def assert_improve_interest_rate options
6
- actual = Refinance::Annuities.improve_interest_rate(
7
- options.fetch(:payment),
8
- options.fetch(:periods),
9
- options.fetch(:principal),
10
- options.fetch(:guess))
11
-
12
- assert_in_delta options.fetch(:expected), actual, options.fetch(:delta)
13
- end
14
-
15
- def assert_interest_rate_stops_if_improvement_is_small options
16
- actual = Refinance::Annuities.interest_rate(options.fetch(:payment),
17
- options.fetch(:periods), options.fetch(:principal),
18
- options.fetch(:guess), options.fetch(:precision))
19
-
20
- assert_in_delta options.fetch(:expected), actual, options.fetch(:delta)
21
- end
22
-
23
- def assert_interest_rate_does_multiple_iterations options
24
- actual = Refinance::Annuities.interest_rate(options.fetch(:payment),
25
- options.fetch(:periods), options.fetch(:principal),
26
- options.fetch(:guess), options.fetch(:precision),
27
- options.fetch(:max_decimals), options.fetch(:max_iterations))
28
-
29
- assert_in_delta options.fetch(:expected), actual, options.fetch(:delta)
30
- end
31
-
32
- def assert_payment options
33
- actual = Refinance::Annuities.payment(options.fetch(:interest_rate),
34
- options.fetch(:periods), options.fetch(:principal))
35
-
36
- assert_in_delta options.fetch(:expected), actual, options.fetch(:delta)
37
- end
38
-
39
- def assert_periods options
40
- actual = Refinance::Annuities.periods(options.fetch(:interest_rate),
41
- options.fetch(:payment), options.fetch(:principal))
42
-
43
- assert_in_delta options.fetch(:expected), actual, options.fetch(:delta)
44
- end
45
-
46
- def assert_principal options
47
- actual = Refinance::Annuities.principal(options.fetch(:interest_rate),
48
- options.fetch(:payment), options.fetch(:periods))
49
-
50
- assert_in_delta options.fetch(:expected), actual, options.fetch(:delta)
51
- end
52
-
53
- def assert_effective_interest_rate options
54
- actual = Refinance::Annuities.effective_interest_rate(
55
- options.fetch(:nominal_annual_interest_rate),
56
- options.fetch(:compounding_periods_per_year))
57
-
58
- assert_in_delta options.fetch(:expected), actual, options.fetch(:delta)
59
- end
60
- end
4
+ require 'annuities_helper'
metadata CHANGED
@@ -1,56 +1,64 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: refinance
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
5
- prerelease:
4
+ version: 1.0.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - reInteractive
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-05-03 00:00:00.000000000 Z
11
+ date: 2014-06-23 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rake
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - '='
20
18
  - !ruby/object:Gem::Version
21
- version: 10.0.4
19
+ version: 10.3.2
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - '='
28
25
  - !ruby/object:Gem::Version
29
- version: 10.0.4
26
+ version: 10.3.2
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: minitest
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - '='
36
32
  - !ruby/object:Gem::Version
37
- version: 4.7.4
33
+ version: 5.3.5
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - '='
44
39
  - !ruby/object:Gem::Version
45
- version: 4.7.4
40
+ version: 5.3.5
41
+ - !ruby/object:Gem::Dependency
42
+ name: bigdecimal
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.2.5
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.2.5
46
55
  description: A collection of finance algorithms related to annuities.
47
- email:
48
- - enquiries@reinteractive.net
56
+ email: enquiries@reinteractive.net
49
57
  executables: []
50
58
  extensions: []
51
59
  extra_rdoc_files: []
52
60
  files:
53
- - .gitignore
61
+ - ".gitignore"
54
62
  - Gemfile
55
63
  - LICENSE.txt
56
64
  - README.md
@@ -59,6 +67,7 @@ files:
59
67
  - lib/refinance/annuities.rb
60
68
  - lib/refinance/version.rb
61
69
  - refinance.gemspec
70
+ - test/annuities_helper.rb
62
71
  - test/bigdecimal_annuities_test.rb
63
72
  - test/float_annuities_test.rb
64
73
  - test/refinance_test.rb
@@ -66,32 +75,29 @@ files:
66
75
  homepage: https://github.com/reinteractive-open/refinance
67
76
  licenses:
68
77
  - MIT
78
+ metadata: {}
69
79
  post_install_message:
70
80
  rdoc_options: []
71
81
  require_paths:
72
82
  - lib
73
83
  required_ruby_version: !ruby/object:Gem::Requirement
74
- none: false
75
84
  requirements:
76
- - - ! '>='
85
+ - - ">="
77
86
  - !ruby/object:Gem::Version
78
87
  version: 1.9.3
79
88
  required_rubygems_version: !ruby/object:Gem::Requirement
80
- none: false
81
89
  requirements:
82
- - - ! '>='
90
+ - - ">="
83
91
  - !ruby/object:Gem::Version
84
92
  version: '0'
85
- segments:
86
- - 0
87
- hash: 1916847891747794597
88
93
  requirements: []
89
94
  rubyforge_project:
90
- rubygems_version: 1.8.25
95
+ rubygems_version: 2.2.2
91
96
  signing_key:
92
- specification_version: 3
97
+ specification_version: 4
93
98
  summary: Simple annuity algorithms
94
99
  test_files:
100
+ - test/annuities_helper.rb
95
101
  - test/bigdecimal_annuities_test.rb
96
102
  - test/float_annuities_test.rb
97
103
  - test/refinance_test.rb