roth_ira 1.2.0 → 1.2.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 +4 -4
- data/lib/limits.yaml +18 -0
- data/lib/roth_ira.rb +1 -0
- data/lib/roth_ira/version.rb +1 -1
- data/spec/roth_ira_spec.rb +86 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4209f2102ebc933fee5d0e0d6b3c8ccc37884b8b
|
4
|
+
data.tar.gz: 9bac372e285a229dbffed6624f3ba9749487feab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0fc85a36f9aa8043c8e8caf25f7280a1fa54780a612d5c8c6cf5871286bd202f9052299bfe7d5814e5467ed9352a8aaea54db75715cf79b544f098cba4576b69
|
7
|
+
data.tar.gz: 57df9b0da8afc23a1d106c40ebe972d52ca03f84b842d51a986be8d2ce4456a826dc9cfc1484792907e2bf8c964488c8b432aa96ad9fdb35fd039a75d4b65126
|
data/lib/limits.yaml
CHANGED
@@ -53,3 +53,21 @@
|
|
53
53
|
:minimum_phase_out: 400
|
54
54
|
:catch_up_contribution: 1000
|
55
55
|
:catch_up_age: 50
|
56
|
+
2018:
|
57
|
+
:single:
|
58
|
+
:lower_income_limit: 120000
|
59
|
+
:upper_income_limit: 135000
|
60
|
+
:contribution_limit: 5500
|
61
|
+
:minimum_phase_out: 200
|
62
|
+
:head_of_household:
|
63
|
+
:lower_income_limit: 120000
|
64
|
+
:upper_income_limit: 135000
|
65
|
+
:contribution_limit: 5500
|
66
|
+
:minimum_phase_out: 200
|
67
|
+
:married_filing_jointly:
|
68
|
+
:lower_income_limit: 189000
|
69
|
+
:upper_income_limit: 199000
|
70
|
+
:contribution_limit: 11000
|
71
|
+
:minimum_phase_out: 400
|
72
|
+
:catch_up_contribution: 1000
|
73
|
+
:catch_up_age: 50
|
data/lib/roth_ira.rb
CHANGED
@@ -4,6 +4,7 @@ class RothIRA
|
|
4
4
|
attr_reader :age, :agi, :filing_status, :limits, :spouse_age, :year
|
5
5
|
|
6
6
|
def initialize(year)
|
7
|
+
raise(ArgumentError, "Invalid Tax Year #{year}") unless year.between?(2015, 2018)
|
7
8
|
@year = year
|
8
9
|
@limits = YAML.load(File.read(__dir__ + "/limits.yaml"))[year]
|
9
10
|
end
|
data/lib/roth_ira/version.rb
CHANGED
data/spec/roth_ira_spec.rb
CHANGED
@@ -2,7 +2,27 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe RothIRA do
|
4
4
|
it 'should return correct version string' do
|
5
|
-
expect(RothIRA::VERSION).to eq('1.2.
|
5
|
+
expect(RothIRA::VERSION).to eq('1.2.1')
|
6
|
+
end
|
7
|
+
|
8
|
+
context 'Invalid tax years' do
|
9
|
+
it 'should raise an ArgumentError if tax year is before 2015' do
|
10
|
+
expect{RothIRA.new(2014)}.to raise_error ArgumentError
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should raise an ArgumentError if tax year is after 2018' do
|
14
|
+
expect{RothIRA.new(2019)}.to raise_error ArgumentError
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'Valid tax years' do
|
19
|
+
it 'should not raise an ArgumentError if tax year is 2015' do
|
20
|
+
expect{RothIRA.new(2015)}.to_not raise_error
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should not raise an ArgumentError if tax year is 2018' do
|
24
|
+
expect{RothIRA.new(2018)}.to_not raise_error
|
25
|
+
end
|
6
26
|
end
|
7
27
|
|
8
28
|
context 'Tax year 2015' do
|
@@ -311,4 +331,69 @@ describe RothIRA do
|
|
311
331
|
end
|
312
332
|
end
|
313
333
|
end
|
334
|
+
|
335
|
+
context 'Tax year 2018' do
|
336
|
+
let(:roth_ira) { RothIRA.new(2018) }
|
337
|
+
context 'Single' do
|
338
|
+
it 'returns maximum contribution for bottom of income limit' do
|
339
|
+
expect(roth_ira.calculate(120000, :single, 40)).to eq(5500)
|
340
|
+
end
|
341
|
+
|
342
|
+
it 'returns maximum contribution for bottom of income limit with catch-up' do
|
343
|
+
expect(roth_ira.calculate(120000, :single, 50)).to eq(6500)
|
344
|
+
end
|
345
|
+
|
346
|
+
it 'returns zero contribution for top of income limit' do
|
347
|
+
expect(roth_ira.calculate(135000, :single, 40)).to eq(0)
|
348
|
+
end
|
349
|
+
|
350
|
+
it 'returns maximum contribution for bottom of income limit with catch-up' do
|
351
|
+
expect(roth_ira.calculate(135000, :single, 50)).to eq(0)
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
context 'Head of Household' do
|
356
|
+
it 'returns maximum contribution for bottom of income limit' do
|
357
|
+
expect(roth_ira.calculate(120000, :head_of_household, 40)).to eq(5500)
|
358
|
+
end
|
359
|
+
|
360
|
+
it 'returns maximum contribution for bottom of income limit with catch-up' do
|
361
|
+
expect(roth_ira.calculate(120000, :head_of_household, 50)).to eq(6500)
|
362
|
+
end
|
363
|
+
|
364
|
+
it 'returns zero contribution for top of income limit' do
|
365
|
+
expect(roth_ira.calculate(135000, :head_of_household, 40)).to eq(0)
|
366
|
+
end
|
367
|
+
|
368
|
+
it 'returns maximum contribution for bottom of income limit with catch-up' do
|
369
|
+
expect(roth_ira.calculate(135000, :head_of_household, 50)).to eq(0)
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
context 'Married Filing Jointly' do
|
374
|
+
it 'returns maximum contribution for bottom of income limit' do
|
375
|
+
expect(roth_ira.calculate(189000, :married_filing_jointly, 40, 40)).to eq(11000)
|
376
|
+
end
|
377
|
+
|
378
|
+
it 'returns maximum contribution for bottom of income limit with one catch-up' do
|
379
|
+
expect(roth_ira.calculate(189000, :married_filing_jointly, 40, 50)).to eq(12000)
|
380
|
+
end
|
381
|
+
|
382
|
+
it 'returns maximum contribution for bottom of income limit with both catch-up' do
|
383
|
+
expect(roth_ira.calculate(189000, :married_filing_jointly, 50, 50)).to eq(13000)
|
384
|
+
end
|
385
|
+
|
386
|
+
it 'returns zero contribution for top of income limit' do
|
387
|
+
expect(roth_ira.calculate(199000, :married_filing_jointly, 40, 40)).to eq(0)
|
388
|
+
end
|
389
|
+
|
390
|
+
it 'returns maximum contribution for bottom of income limit with one catch-up' do
|
391
|
+
expect(roth_ira.calculate(199000, :married_filing_jointly, 40, 50)).to eq(0)
|
392
|
+
end
|
393
|
+
|
394
|
+
it 'returns maximum contribution for bottom of income limit with both catch-up' do
|
395
|
+
expect(roth_ira.calculate(199000, :married_filing_jointly, 50, 50)).to eq(0)
|
396
|
+
end
|
397
|
+
end
|
398
|
+
end
|
314
399
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roth_ira
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Randall Reed
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -57,7 +57,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
57
57
|
version: '0'
|
58
58
|
requirements: []
|
59
59
|
rubyforge_project:
|
60
|
-
rubygems_version: 2.
|
60
|
+
rubygems_version: 2.6.11
|
61
61
|
signing_key:
|
62
62
|
specification_version: 4
|
63
63
|
summary: Roth IRA Contribution Limit Calculator
|