fine_ants 1.4.0 → 1.5.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.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/lib/fine_ants/adapters/betterment.rb +21 -7
- data/lib/fine_ants/adapters/etrade.rb +46 -0
- data/lib/fine_ants/adapters/strs.rb +65 -0
- data/lib/fine_ants/adapters/vanguard.rb +1 -1
- data/lib/fine_ants/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7a6db23ef2b3811bc70236763970ad82b5aa1549
|
|
4
|
+
data.tar.gz: 1716b20642df703db7145a448d10f7d10b2fa59f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2750ebb301abf3c697d584118b268e93a27c55907471d689b5be3f1e26a1384eaf6b710b3abe616205b4b3eb7c6b826517ce2514b5715f1c25573a35f6a5e150
|
|
7
|
+
data.tar.gz: 5d1747d3d15c4130a442851b8438cf1f9edea6354c8d4da60531a132ce5a4f9b6f6cf598ef03428182360dfa81b3b04ece08d71bdc8a2dbe40a992f89dd44097
|
data/README.md
CHANGED
|
@@ -62,11 +62,13 @@ Right now, FineAnts ships with adapters for:
|
|
|
62
62
|
| [Vanguard Personal Investment](https://personal.vanguard.com/us/hnwnesc/nesc/LoginPage) | `:vanguard` |
|
|
63
63
|
| [PNC Personal Banking](https://www.pnc.com/en/personal-banking.html) | `:pnc` |
|
|
64
64
|
| [Betterment](https://www.betterment.com) | `:betterment` |
|
|
65
|
+
| [E*Trade](https://www.etrade.com) | `:etrade` |
|
|
65
66
|
| [Chase](https://www.chase.com) | `:chase` |
|
|
66
67
|
| [Simple (BBVA)](https://www.simple.com) | `:simple` |
|
|
67
68
|
| [Simple (Bancorp)](https://www.simple.com) | `:simple_bancorp` |
|
|
68
69
|
| [Target REDcard](https://rcam.target.com) | `:target` |
|
|
69
70
|
| [Purdue Federal Credit Union](https://www.purduefed.com) | `:purduefed` |
|
|
71
|
+
| [Ohio State Teacher Retirement System (STRS)](https://www.nrsstrsoh.org) | `:strs` |
|
|
70
72
|
|
|
71
73
|
You can also implement your own adapter and pass it to `FineAnts.download`. The
|
|
72
74
|
expected public contract of an adapter is:
|
|
@@ -13,11 +13,24 @@ module FineAnts
|
|
|
13
13
|
fill_in "web_authentication[email]", :with => @user
|
|
14
14
|
fill_in "web_authentication[password]", :with => @password
|
|
15
15
|
click_button "Log in"
|
|
16
|
+
begin
|
|
17
|
+
find_field "web_second_factor_authentication[verification_code]"
|
|
18
|
+
return false
|
|
19
|
+
rescue Capybara::ElementNotFound
|
|
20
|
+
verify_login!
|
|
21
|
+
return true
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def two_factor_response(answer)
|
|
26
|
+
fill_in "web_second_factor_authentication[verification_code]", :with => answer
|
|
27
|
+
find(".web_second_factor_authentication_trust_device").click
|
|
28
|
+
click_button "Verify"
|
|
16
29
|
verify_login!
|
|
17
30
|
end
|
|
18
31
|
|
|
19
32
|
def download
|
|
20
|
-
accounts = all(".
|
|
33
|
+
accounts = all(".SummaryTable-card")
|
|
21
34
|
accounts.map do |account|
|
|
22
35
|
{
|
|
23
36
|
:adapter => :betterment,
|
|
@@ -27,30 +40,31 @@ module FineAnts
|
|
|
27
40
|
:amount => total_for(account)
|
|
28
41
|
}
|
|
29
42
|
end.tap do
|
|
30
|
-
find(
|
|
31
|
-
|
|
43
|
+
find('.sc-Nav-panelTrigger').click
|
|
44
|
+
find('.sc-Nav-panelTrigger').click
|
|
45
|
+
find('.sc-Nav-panelTrigger .SecondaryNavLogoutAction button', visible: false).click
|
|
32
46
|
end
|
|
33
47
|
end
|
|
34
48
|
|
|
35
49
|
private
|
|
36
50
|
|
|
37
51
|
def verify_login!
|
|
38
|
-
find ".
|
|
52
|
+
find ".Dashboard-summaryCards"
|
|
39
53
|
rescue
|
|
40
54
|
raise FineAnts::LoginFailedError.new
|
|
41
55
|
end
|
|
42
56
|
|
|
43
57
|
def id_for(account)
|
|
44
|
-
link = account.find(".
|
|
58
|
+
link = account.find(".SummaryTable-donutContainer a")
|
|
45
59
|
link[:href].match(/\/app\/goals\/(\d+)\//)[1]
|
|
46
60
|
end
|
|
47
61
|
|
|
48
62
|
def name_for(account)
|
|
49
|
-
"#{account.find(".
|
|
63
|
+
"#{account.find(".SummaryTable-accountName .SummaryTable-label").text} - #{account.find(".SummaryTable-accountName .u-secondaryHeading").text}"
|
|
50
64
|
end
|
|
51
65
|
|
|
52
66
|
def total_for(account)
|
|
53
|
-
total_string = account.find(".
|
|
67
|
+
total_string = account.find(".SummaryTable-rightAlignedText .u-secondaryHeading").text
|
|
54
68
|
BigDecimal.new(total_string.match(/\$(.*)$/)[1].gsub(/,/,''))
|
|
55
69
|
end
|
|
56
70
|
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require "bigdecimal"
|
|
2
|
+
|
|
3
|
+
module FineAnts
|
|
4
|
+
module Adapters
|
|
5
|
+
class Etrade
|
|
6
|
+
def initialize(credentials)
|
|
7
|
+
@user = credentials[:user]
|
|
8
|
+
@password = credentials[:password]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def login
|
|
12
|
+
visit "https://us.etrade.com/e/t/user/login"
|
|
13
|
+
fill_in "User ID", :with => @user
|
|
14
|
+
fill_in "Password", :with => @password
|
|
15
|
+
click_button "Log on"
|
|
16
|
+
verify_login!
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def download
|
|
20
|
+
all("section.account").map do |account|
|
|
21
|
+
{
|
|
22
|
+
:adapter => :etrade,
|
|
23
|
+
:user => @user,
|
|
24
|
+
:id => account.find("#acctNum .number-reveal", :visible => false).text(:all),
|
|
25
|
+
:name => account.find("a.account-id").text,
|
|
26
|
+
:amount => BigDecimal.new(account.find(".table-horizontal .text-right.secondary").text.gsub(/[\$,]/,''))
|
|
27
|
+
}
|
|
28
|
+
end.tap do
|
|
29
|
+
click_link "Log Off"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def verify_login!
|
|
36
|
+
find_link "Log Off"
|
|
37
|
+
rescue
|
|
38
|
+
raise FineAnts::LoginFailedError.new
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
require "bigdecimal"
|
|
2
|
+
|
|
3
|
+
module FineAnts
|
|
4
|
+
module Adapters
|
|
5
|
+
class Strs
|
|
6
|
+
def initialize(credentials)
|
|
7
|
+
@user = credentials[:user]
|
|
8
|
+
@password = credentials[:password]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def login
|
|
12
|
+
visit "https://www.nrsstrsoh.org/iApp/tcm/nrsstrsoh/index.jsp"
|
|
13
|
+
fill_in "Username", :with => @user
|
|
14
|
+
fill_in "Password (Case sensitive)", :with => @password
|
|
15
|
+
click_button "Log In"
|
|
16
|
+
begin
|
|
17
|
+
find_field "contactPoint"
|
|
18
|
+
return false
|
|
19
|
+
rescue Capybara::ElementNotFound
|
|
20
|
+
verify_login!
|
|
21
|
+
return true
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def two_factor_response(answer)
|
|
26
|
+
fill_in "confirmationCode", :with => answer
|
|
27
|
+
find_field("continue").click
|
|
28
|
+
begin
|
|
29
|
+
find "#rememberTrue"
|
|
30
|
+
choose "#rememberTrue"
|
|
31
|
+
find_field("#search").click
|
|
32
|
+
rescue Capybara::ElementNotFound
|
|
33
|
+
end
|
|
34
|
+
verify_login!
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def download
|
|
38
|
+
[
|
|
39
|
+
{
|
|
40
|
+
:adapter => :strs,
|
|
41
|
+
:user => @user,
|
|
42
|
+
:id => find(".plan-info-plan .disabled-phone-link").text,
|
|
43
|
+
:name => find(".plan-info-plan").text,
|
|
44
|
+
:amount => BigDecimal.new(find(".dash-health-alt__total_number").text.gsub(/[\$,]/,''))
|
|
45
|
+
}
|
|
46
|
+
].tap do
|
|
47
|
+
click_link "Log Out"
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
|
|
53
|
+
def verify_login!
|
|
54
|
+
find(".dash-health-alt__current_total_balance")
|
|
55
|
+
rescue
|
|
56
|
+
raise FineAnts::LoginFailedError.new
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
@@ -11,7 +11,7 @@ module FineAnts
|
|
|
11
11
|
def login
|
|
12
12
|
visit "https://personal.vanguard.com/us/hnwnesc/nesc/LoginPage"
|
|
13
13
|
fill_in "LoginForm:USER", :with => @user
|
|
14
|
-
fill_in "LoginForm:PASSWORD", :with => @password
|
|
14
|
+
fill_in "LoginForm:PASSWORD-blocked", :with => @password
|
|
15
15
|
click_button "LoginForm:submitInput"
|
|
16
16
|
begin
|
|
17
17
|
find_field "LoginForm:ANSWER"
|
data/lib/fine_ants/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: fine_ants
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Justin Searls
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2017-
|
|
11
|
+
date: 2017-07-22 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: capybara
|
|
@@ -99,10 +99,12 @@ files:
|
|
|
99
99
|
- lib/fine_ants/adapters.rb
|
|
100
100
|
- lib/fine_ants/adapters/betterment.rb
|
|
101
101
|
- lib/fine_ants/adapters/chase.rb
|
|
102
|
+
- lib/fine_ants/adapters/etrade.rb
|
|
102
103
|
- lib/fine_ants/adapters/pnc.rb
|
|
103
104
|
- lib/fine_ants/adapters/purduefed.rb
|
|
104
105
|
- lib/fine_ants/adapters/simple.rb
|
|
105
106
|
- lib/fine_ants/adapters/simple_bancorp.rb
|
|
107
|
+
- lib/fine_ants/adapters/strs.rb
|
|
106
108
|
- lib/fine_ants/adapters/target.rb
|
|
107
109
|
- lib/fine_ants/adapters/vanguard.rb
|
|
108
110
|
- lib/fine_ants/capybara_setup.rb
|