coyodlee 0.1.0 → 0.2.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,32 @@
1
+ module Coyodlee
2
+ module Facades
3
+ class CobrandFacade
4
+ def initialize(request_facade)
5
+ @request_facade = request_facade
6
+ end
7
+
8
+ def login(login_name:, password:)
9
+ body = {
10
+ cobrand: {
11
+ cobrandLogin: login_name,
12
+ cobrandPassword: password,
13
+ locale: 'en_US'
14
+ }
15
+ }.to_json
16
+ headers = { 'Content-Type' => 'application/json', 'Accept' => 'application/json' }
17
+ req = @request_facade.build(:post, 'cobrand/login', headers: headers, body: body)
18
+ @request_facade.execute(req)
19
+ end
20
+
21
+ def logout
22
+ req = @request_facade.build(:post, 'cobrand/logout')
23
+ @request_facade.execute(req)
24
+ end
25
+
26
+ def public_key
27
+ req = @request_facade.build(:get, 'cobrand/publicKey')
28
+ @request_facade.execute(req)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,33 @@
1
+ module Coyodlee
2
+ module Facades
3
+ class HoldingsFacade
4
+ def initialize(request_facade)
5
+ @request_facade = request_facade
6
+ end
7
+
8
+ def all(params={})
9
+ headers = { 'Accept' => 'application/json' }
10
+ req = @request_facade.build(:get, 'holdings', headers: headers, params: params)
11
+ @request_facade.execute(req)
12
+ end
13
+
14
+ def extended_securities_info(params={})
15
+ headers = { 'Accept' => 'application/json' }
16
+ req = @request_facade.build(:get, 'holdings/securities', headers: headers, params: params)
17
+ @request_facade.execute(req)
18
+ end
19
+
20
+ def holding_type_list
21
+ headers = { 'Accept' => 'application/json' }
22
+ req = @request_facade.build(:get, 'holdings/holdingTypeList', headers: headers)
23
+ @request_facade.execute(req)
24
+ end
25
+
26
+ def asset_classification_list
27
+ headers = { 'Accept' => 'application/json' }
28
+ req = @request_facade.build(:get, 'holdings/assetClassificationList', headers: headers)
29
+ @request_facade.execute(req)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,52 @@
1
+ module Coyodlee
2
+ module Facades
3
+ class ProviderAccountsFacade
4
+ def initialize(request_facade)
5
+ @request_facade = request_facade
6
+ end
7
+
8
+ def provider_accounts
9
+ headers = { 'Accept' => 'application/json' }
10
+ req = @request_facade.build(:get, 'providerAccounts', headers: headers)
11
+ @request_facade.execute(req)
12
+ end
13
+
14
+ def verify(body:)
15
+ headers = { 'Accept' => 'application/json' }
16
+ req = @request_facade.build(:put, 'providerAccounts/verification', headers: headers, body: body.to_json)
17
+ @request_facade.execute(req)
18
+ end
19
+
20
+ def verification_status(provider_account_id:)
21
+ headers = { 'Accept' => 'application/json' }
22
+ req = @request_facade.build(:get, "providerAccounts/verification/#{provider_account_id}", headers: headers)
23
+ @request_facade.execute(req)
24
+ end
25
+
26
+ def update(body:)
27
+ headers = { 'Accept' => 'application/json' }
28
+ req = @request_facade.build(:put, 'providerAccounts', headers: headers, body: body.to_json)
29
+ @request_facade.execute(req)
30
+ end
31
+
32
+ def delete(provider_account_id:)
33
+ headers = { 'Accept' => 'application/json' }
34
+ req = @request_facade.build(:delete, "providerAccounts/#{provider_account_id}", headers: headers)
35
+ @request_facade.execute(req)
36
+ end
37
+
38
+ def details(provider_account_id:, params: {})
39
+ headers = { 'Accept' => 'application/json' }
40
+ req = @request_facade.build(:get, "providerAccounts/#{provider_account_id}", headers: headers, params: params)
41
+ @request_facade.execute(req)
42
+ end
43
+
44
+ def add(provider_id:, body:)
45
+ headers = { 'Accept' => 'application/json' }
46
+ params = { 'providerId' => provider_id }
47
+ req = @request_facade.build(:post, "providerAccounts", headers: headers, params: params, body: body)
48
+ @request_facade.execute(req)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,88 @@
1
+ module Coyodlee
2
+ module Facades
3
+ class TransactionsFacade
4
+ def initialize(request_facade)
5
+ @request_facade = request_facade
6
+ end
7
+
8
+ def count(params={})
9
+ headers = { 'Accept' => 'application/json' }
10
+ req = @request_facade.build(:get, 'transactions/count', params: params, headers: headers)
11
+ @request_facade.execute(req)
12
+ end
13
+
14
+ def all(params={})
15
+ headers = { 'Accept' => 'application/json' }
16
+ req = @request_facade.build(:get, 'transactions', params: params, headers: headers)
17
+ @request_facade.execute(req)
18
+ end
19
+
20
+ def categorization_rules
21
+ headers = { 'Accept' => 'application/json' }
22
+ req = @request_facade.build(:get, 'transactions/categories/rules', headers: headers)
23
+ @request_facade.execute(req)
24
+ end
25
+
26
+ def create_categorization_rule(body:)
27
+ headers = { 'Accept' => 'application/json', 'Content-Type' => 'application/json' }
28
+ req = @request_facade.build(:post, 'transactions/categories/rules', headers: headers, body: body.to_json)
29
+ @request_facade.execute(req)
30
+ end
31
+
32
+ def update_categorization_rule(rule_id:, body:)
33
+ headers = { 'Accept' => 'application/json', 'Content-Type' => 'application/json' }
34
+ req = @request_facade.build(:put, "transactions/categories/rules/#{rule_id}", headers: headers, body: body.to_json)
35
+ @request_facade.execute(req)
36
+ end
37
+
38
+ def delete_categorization_rule(rule_id:)
39
+ headers = { 'Accept' => 'application/json' }
40
+ req = @request_facade.build(:put, "transactions/categories/rules/#{rule_id}", headers: headers)
41
+ @request_facade.execute(req)
42
+ end
43
+
44
+ def run_categorization_rule(rule_id:)
45
+ headers = { 'Accept' => 'application/json' }
46
+ req = @request_facade.build(:post, "transactions/categories/rules/#{rule_id}", headers: headers)
47
+ @request_facade.execute(req)
48
+ end
49
+
50
+ def run_all_categorization_rules
51
+ params = { 'action' => 'run' }
52
+ headers = { 'Accept' => 'application/json' }
53
+ req = @request_facade.build(:post, 'transactions/categories/rules', headers: headers, params: params)
54
+ @request_facade.execute(req)
55
+ end
56
+
57
+ def update(transaction_id:, body: {})
58
+ headers = { 'Accept' => 'application/json' }
59
+ req = @request_facade.build(:put, "transactions/#{transaction_id}", headers: headers, body: body)
60
+ @request_facade.execute(req)
61
+ end
62
+
63
+ def category_list
64
+ headers = { 'Accept' => 'application/json' }
65
+ req = @request_facade.build(:get, 'transactions/categories', headers: headers)
66
+ @request_facade.execute(req)
67
+ end
68
+
69
+ def create_category(body:)
70
+ headers = { 'Accept' => 'application/json', 'Content-Type' => 'application/json' }
71
+ req = @request_facade.build(:post, 'transactions/categories', headers: headers, body: body.to_json)
72
+ @request_facade.execute(req)
73
+ end
74
+
75
+ def update_category(body:)
76
+ headers = { 'Accept' => 'application/json', 'Content-Type' => 'application/json' }
77
+ req = @request_facade.build(:put, 'transactions/categories', headers: headers, body: body.to_json)
78
+ @request_facade.execute(req)
79
+ end
80
+
81
+ def delete_category(category_id:)
82
+ headers = { 'Accept' => 'application/json' }
83
+ req = @request_facade.build(:delete, "transactions/categories/#{category_id}", headers: headers)
84
+ @request_facade.execute(req)
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,39 @@
1
+ module Coyodlee
2
+ module Facades
3
+ class UserFacade
4
+ def initialize(request_facade)
5
+ @request_facade = request_facade
6
+ end
7
+
8
+ def login(login_name:, password:)
9
+ headers = { 'Accept' => 'application/json', 'Content-Type' => 'application/json' }
10
+ body = {
11
+ user: {
12
+ loginName: login_name,
13
+ password: password,
14
+ locale: 'en_US'
15
+ }
16
+ }.to_json
17
+ req = @request_facade.build(:post, 'user/login', headers: headers, body: body)
18
+ @request_facade.execute(req)
19
+ end
20
+
21
+ def register(login_name:, password:)
22
+ headers = { 'Accept' => 'application/json' }
23
+ req = @request_facade.build(:post, 'user/logout', headers: headers)
24
+ @request_facade.execute(req)
25
+ end
26
+
27
+ def unregister
28
+ req = @request_facade.build(:delete, 'user/unregister')
29
+ @request_facade.execute(req)
30
+ end
31
+
32
+ def logout(login_name:, password:)
33
+ headers = { 'Accept' => 'application/json' }
34
+ req = @request_facade.build(:post, 'user/logout', headers: headers)
35
+ @request_facade.execute(req)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,46 @@
1
+ require_relative 'session_authorization'
2
+ require_relative 'session_tokens'
3
+ require 'json'
4
+
5
+ module Coyodlee
6
+ class Session
7
+ attr_reader :authorization
8
+ attr_writer :cobrand_session_token_klass
9
+ attr_writer :user_session_token_klass
10
+
11
+ class << self
12
+ def create(request_facade)
13
+ new(request_facade: request_facade,
14
+ session_authorization: SessionAuthorization.new).tap do |session|
15
+ session.cobrand_session_token_klass = CobrandSessionToken
16
+ session.user_session_token_klass = UserSessionToken
17
+ end
18
+ end
19
+ end
20
+
21
+ def initialize(request_facade:, session_authorization:)
22
+ @api = request_facade
23
+ @authorization = session_authorization
24
+ end
25
+
26
+ def login_cobrand(login_name:, password:)
27
+ @api.login_cobrand(login_name: login_name,
28
+ password: password).tap do |res|
29
+ body = JSON.parse(res.body)
30
+ token = body.dig('session', 'cobSession')
31
+ @authorization.authorize_cobrand(@cobrand_session_token_klass.new(token))
32
+ @api.authorize(@authorization)
33
+ end
34
+ end
35
+
36
+ def login_user(login_name:, password:)
37
+ @api.login_user(login_name: login_name,
38
+ password: password).tap do |res|
39
+ body = JSON.parse(res.body)
40
+ token = body.dig('user', 'session', 'userSession')
41
+ @authorization.authorize_user(@user_session_token_klass.new(token))
42
+ @api.authorize(@authorization)
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,25 @@
1
+ require_relative 'session_tokens'
2
+
3
+ module Coyodlee
4
+ class SessionAuthorization
5
+ def initialize(cobrand_session_token: NullSessionToken.new, user_session_token: NullSessionToken.new)
6
+ @cobrand_session_token = cobrand_session_token
7
+ @user_session_token = user_session_token
8
+ end
9
+
10
+ def authorize_cobrand(cobrand_session_token)
11
+ @cobrand_session_token = cobrand_session_token
12
+ end
13
+
14
+ def authorize_user(user_session_token)
15
+ @user_session_token = user_session_token
16
+ end
17
+
18
+ def to_s
19
+ [@cobrand_session_token, @user_session_token]
20
+ .select { |t| t.present? }
21
+ .map(&:to_s)
22
+ .join(',')
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,39 @@
1
+ module Coyodlee
2
+ class NullSessionToken
3
+ def present?
4
+ false
5
+ end
6
+
7
+ def to_s
8
+ ''
9
+ end
10
+ end
11
+
12
+ class UserSessionToken
13
+ def initialize(token='')
14
+ @token = token
15
+ end
16
+
17
+ def present?
18
+ !@token.empty?
19
+ end
20
+
21
+ def to_s
22
+ @token.empty? ? '' : "userSession=#{@token}"
23
+ end
24
+ end
25
+
26
+ class CobrandSessionToken
27
+ def initialize(token='')
28
+ @token = token
29
+ end
30
+
31
+ def present?
32
+ !@token.empty?
33
+ end
34
+
35
+ def to_s
36
+ @token.empty? ? '' : "cobSession=#{@token}"
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,26 @@
1
+ module Coyodlee
2
+ class UriBuilder
3
+ attr_reader :host
4
+
5
+ def initialize(host:, cobrand: 'restserver', version: 'v1')
6
+ @cobrand = cobrand
7
+ @version = version
8
+ @host = host
9
+ @path_prefix = 'ysl'
10
+ end
11
+
12
+ def build(resource_path, query: nil, use_ssl: true)
13
+ uri_builder = use_ssl ? URI::HTTPS : URI::HTTP
14
+ revised_resource_path = if resource_path.start_with?('/')
15
+ resource_path.slice(1..-1)
16
+ else
17
+ resource_path
18
+ end
19
+ path = [@path_prefix, @cobrand, @version, revised_resource_path]
20
+ .compact
21
+ .join('/')
22
+ .prepend('/')
23
+ uri_builder.build(host: @host, path: path, query: query)
24
+ end
25
+ end
26
+ end
@@ -1,3 +1,3 @@
1
1
  module Coyodlee
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coyodlee
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Dyba
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-12-27 00:00:00.000000000 Z
11
+ date: 2018-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rest-client
14
+ name: yajl-ruby
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: 1.3.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.0'
26
+ version: 1.3.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +136,62 @@ dependencies:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: '1.8'
139
+ - !ruby/object:Gem::Dependency
140
+ name: dotenv
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: pry-byebug
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: byebug
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: pry
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
139
195
  description: A Ruby wrapper client for Envestnet's Yodlee API. For details about the
140
196
  API endpoints, sign in to https://developer.yodlee.com
141
197
  email:
@@ -154,13 +210,20 @@ files:
154
210
  - bin/console
155
211
  - bin/setup
156
212
  - coyodlee.gemspec
213
+ - examples/demo.rb
157
214
  - lib/coyodlee.rb
158
- - lib/coyodlee/client.rb
159
- - lib/coyodlee/http_wrapper.rb
160
- - lib/coyodlee/sessions.rb
161
- - lib/coyodlee/sessions/cobrand_session.rb
162
- - lib/coyodlee/sessions/user_session.rb
163
- - lib/coyodlee/utils.rb
215
+ - lib/coyodlee/connection.rb
216
+ - lib/coyodlee/facades.rb
217
+ - lib/coyodlee/facades/accounts_facade.rb
218
+ - lib/coyodlee/facades/cobrand_facade.rb
219
+ - lib/coyodlee/facades/holdings_facade.rb
220
+ - lib/coyodlee/facades/provider_accounts_facade.rb
221
+ - lib/coyodlee/facades/transactions_facade.rb
222
+ - lib/coyodlee/facades/user_facade.rb
223
+ - lib/coyodlee/session.rb
224
+ - lib/coyodlee/session_authorization.rb
225
+ - lib/coyodlee/session_tokens.rb
226
+ - lib/coyodlee/uri_builder.rb
164
227
  - lib/coyodlee/version.rb
165
228
  homepage: https://github.com/pennymac/coyodlee
166
229
  licenses:
@@ -182,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
182
245
  version: '0'
183
246
  requirements: []
184
247
  rubyforge_project:
185
- rubygems_version: 2.5.2
248
+ rubygems_version: 2.7.3
186
249
  signing_key:
187
250
  specification_version: 4
188
251
  summary: A Ruby wrapper client for Envestnet's Yodlee API