synapse_fi 0.0.3 → 0.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: db4628f944245e8f114018422dd581ab76696dc1
4
- data.tar.gz: 2012839aaa6f312aefe8c189d10decd073d35903
3
+ metadata.gz: 8cc51024fe0828282d58774469281168581763a1
4
+ data.tar.gz: d22606acecf1fad82d2fa6dc0cf4ab4a09ca277a
5
5
  SHA512:
6
- metadata.gz: b29bb8ee533e012e3be5e7667f338223d192501a6ad54bf891fb55f4c1ee4d50d16f66e08fda977ab6c619a1721bc475f42e6e7797d2c184d5e90d891d7c7b99
7
- data.tar.gz: 3a9474f1cae6af2b4c33a3968d0c59c210ac13305cb21408c5f12b691699d328ad22412c4a3042251276579927e5839498fb9a9a5175d506c3fa81f273a58210
6
+ metadata.gz: 1306539458898b0f9431f245a6c4dc78c69e9870c9c3a43e476cef037114145ccad809b99a965d4213e7543df88c1298ba5d39e931ccefd5b704c730ccc7a0a4
7
+ data.tar.gz: '08f46888c70fa12e9025171c8553770979d20e48f693849c4081004042fbe324dbe42049f68c34cb765fae657537fb2f5db0a5615a25be434ad9ce878b09cfdc'
data/.gitignore CHANGED
@@ -1,3 +1,3 @@
1
1
  .env
2
- test
2
+ .DS_Store
3
3
 
data/Gemfile CHANGED
@@ -4,3 +4,4 @@ source 'https://rubygems.org'
4
4
 
5
5
  # Specify your gem's dependencies in your *.gemspec file
6
6
  gemspec
7
+
data/Gemfile.lock CHANGED
@@ -1,3 +1,9 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ synapse_fi (0.0.3)
5
+ rest-client (~> 2.0)
6
+
1
7
  GEM
2
8
  remote: https://rubygems.org/
3
9
  specs:
@@ -5,26 +11,25 @@ GEM
5
11
  builder (3.2.3)
6
12
  domain_name (0.5.20180417)
7
13
  unf (>= 0.0.5, < 1.0.0)
8
- dotenv (2.5.0)
14
+ dotenv (2.1.2)
9
15
  http-cookie (1.0.3)
10
16
  domain_name (~> 0.5)
11
17
  mime-types (3.2.2)
12
18
  mime-types-data (~> 3.2015)
13
19
  mime-types-data (3.2018.0812)
14
- minitest (5.11.3)
15
- minitest-reporters (1.3.5)
20
+ minitest (5.8.5)
21
+ minitest-reporters (1.1.19)
16
22
  ansi
17
23
  builder
18
24
  minitest (>= 5.0)
19
25
  ruby-progressbar
20
26
  netrc (0.11.0)
27
+ rake (10.5.0)
21
28
  rest-client (2.0.2)
22
29
  http-cookie (>= 1.0.2, < 2.0)
23
30
  mime-types (>= 1.16, < 4.0)
24
31
  netrc (~> 0.8)
25
32
  ruby-progressbar (1.10.0)
26
- synapse_pay_rest (3.4.3)
27
- rest-client (~> 2.0)
28
33
  unf (0.1.4)
29
34
  unf_ext
30
35
  unf_ext (0.0.7.5)
@@ -34,10 +39,11 @@ PLATFORMS
34
39
 
35
40
  DEPENDENCIES
36
41
  bundler
37
- dotenv
38
- minitest
39
- minitest-reporters
40
- synapse_pay_rest
42
+ dotenv (~> 2.1.1)
43
+ minitest (~> 5.8.2)
44
+ minitest-reporters (~> 1.1.5)
45
+ rake (~> 10.0)
46
+ synapse_fi!
41
47
 
42
48
  BUNDLED WITH
43
49
  1.17.1
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # SynapseFI-Ruby-v2
2
2
 
3
- Native API library for SynapsePay REST v3.x
3
+ Native API library for SynapseFI REST v3.x
4
4
 
5
5
  Not all API endpoints are supported.
6
6
 
@@ -32,6 +32,17 @@ $ gem install synapse_fi
32
32
 
33
33
  For minor issues, please open a pull request. For larger changes or features, please email hello@synapsepay.com. Please document and test any public constants/methods.
34
34
 
35
+ ## Running the Test Suite
36
+
37
+ If you haven't already, set the `TEST_CLIENT_ID` and `TEST_CLIENT_SECRET` environment variables in `.env` file .
38
+ Please read and update test files with your user own test id's
39
+
40
+ To run all tests, execute:
41
+
42
+ ```bash
43
+ rake test
44
+ ```
45
+
35
46
  ## License
36
47
 
37
48
  [MIT License](LICENSE)
data/Rakefile CHANGED
@@ -2,8 +2,8 @@ require "bundler/gem_tasks"
2
2
  require "rake/testtask"
3
3
 
4
4
  Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
5
  t.libs << "lib"
6
+ t.libs << "test"
7
7
  t.test_files = FileList['test/*_test.rb']
8
8
  end
9
9
 
@@ -1,4 +1,3 @@
1
- require 'json'
2
1
  require_relative './http_request'
3
2
  require_relative './user'
4
3
  require_relative './users'
@@ -12,8 +11,6 @@ require_relative './subnet'
12
11
  require_relative './subnets'
13
12
  require 'pp'
14
13
 
15
-
16
-
17
14
  module Synapse
18
15
  # Initializes various wrapper settings such as development mode and request
19
16
  # header values
@@ -29,7 +26,6 @@ module Synapse
29
26
  # Alias for #http_client
30
27
  alias_method :client, :http_client
31
28
 
32
-
33
29
  # @param client_id [String] should be stored in environment variable
34
30
  # @param client_secret [String] should be stored in environment variable
35
31
  # @param ip_address [String] user's IP address
@@ -52,7 +48,8 @@ module Synapse
52
48
  fingerprint: fingerprint,
53
49
  ip_address: ip_address,
54
50
  raise_for_202: raise_for_202,
55
- **options)
51
+ **options
52
+ )
56
53
  end
57
54
 
58
55
  # Queries Synapse API to create a new user
@@ -63,14 +60,12 @@ module Synapse
63
60
  def create_user(payload:, **options)
64
61
  response = client.post(user_path,payload, options)
65
62
 
66
- user = User.new(
67
- user_id: response['_id'],
68
- refresh_token: response['refresh_token'],
69
- client: client,
70
- full_dehydrate: "no",
71
- payload: response
72
- )
73
- user
63
+ User.new(user_id: response['_id'],
64
+ refresh_token: response['refresh_token'],
65
+ client: client,
66
+ full_dehydrate: "no",
67
+ payload: response
68
+ )
74
69
  end
75
70
 
76
71
  # Update headers in HTTPClient class
@@ -97,14 +92,12 @@ module Synapse
97
92
  path = user_path(user_id: user_id, full_dehydrate: options[:full_dehydrate])
98
93
  response = client.get(path)
99
94
 
100
- user = User.new(
101
- user_id: response['_id'],
102
- refresh_token: response['refresh_token'],
103
- client: client,
104
- full_dehydrate: options[:full_dehydrate] == "yes" ? true : false,
105
- payload: response
106
- )
107
- user
95
+ User.new(user_id: response['_id'],
96
+ refresh_token: response['refresh_token'],
97
+ client: client,
98
+ full_dehydrate: options[:full_dehydrate] == "yes" ? true : false,
99
+ payload: response
100
+ )
108
101
  end
109
102
 
110
103
  # Queries Synapse API for platform users
@@ -112,16 +105,24 @@ module Synapse
112
105
  # users with matching name/email
113
106
  # @param page [Integer] (optional) response will default to 1
114
107
  # @param per_page [Integer] (optional) response will default to 20
115
- # @note users created this way are not automatically OAuthed
116
108
  # @return [Array<Synapse::Users>]
117
109
  def get_users(**options)
118
110
  path = user_path(options)
119
111
  response = client.get(path)
120
112
  return [] if response["users"].empty?
121
- users = response["users"].map { |user_data| User.new(user_id: user_data['_id'], refresh_token: user_data['refresh_token'], client: client, full_dehydrate: "no", payload: user_data)}
122
- users = Users.new(limit: response["limit"], page: response["page"], page_count: response["page_count"], user_count: response["user_count"], payload: users, http_client: client)
123
-
124
- users
113
+ users = response["users"].map { |user_data| User.new(user_id: user_data['_id'],
114
+ refresh_token: user_data['refresh_token'],
115
+ client: client,
116
+ full_dehydrate: "no",
117
+ payload: user_data
118
+ )}
119
+ Users.new(limit: response["limit"],
120
+ page: response["page"],
121
+ page_count: response["page_count"],
122
+ user_count: response["user_count"],
123
+ payload: users,
124
+ http_client: client
125
+ )
125
126
  end
126
127
 
127
128
  # Queries Synapse for all transactions on platform
@@ -141,9 +142,12 @@ module Synapse
141
142
 
142
143
  return [] if trans["trans"].empty?
143
144
  response = trans["trans"].map { |trans_data| Transaction.new(trans_id: trans_data['_id'], payload: trans_data)}
144
- trans = Transactions.new(limit: trans["limit"], page: trans["page"], page_count: trans["page_count"], trans_count: trans["trans_count"], payload: response)
145
- trans
146
-
145
+ Transactions.new(limit: trans["limit"],
146
+ page: trans["page"],
147
+ page_count: trans["page_count"],
148
+ trans_count: trans["trans_count"],
149
+ payload: response
150
+ )
147
151
  end
148
152
 
149
153
  # Queries Synapse API for all nodes belonging to platform
@@ -160,8 +164,17 @@ module Synapse
160
164
  nodes = client.get(path)
161
165
 
162
166
  return [] if nodes["nodes"].empty?
163
- response = nodes["nodes"].map { |node_data| Node.new(node_id: node_data['_id'], user_id: node_data['user_id'], payload: node_data, full_dehydrate: "no")}
164
- nodes = Nodes.new(limit: nodes["limit"], page: nodes["page"], page_count: nodes["page_count"], nodes_count: nodes["node_count"], payload: response)
167
+ response = nodes["nodes"].map { |node_data| Node.new(node_id: node_data['_id'],
168
+ user_id: node_data['user_id'],
169
+ payload: node_data,
170
+ full_dehydrate: "no"
171
+ )}
172
+ Nodes.new(limit: nodes["limit"],
173
+ page: nodes["page"],
174
+ page_count: nodes["page_count"],
175
+ nodes_count: nodes["node_count"],
176
+ payload: response
177
+ )
165
178
  end
166
179
 
167
180
  # Queries Synapse API for all institutions available for bank logins
@@ -173,18 +186,12 @@ module Synapse
173
186
  end
174
187
 
175
188
  # Queries Synapse API to create a webhook subscriptions for platform
176
- # @param scope [Array<String>]
189
+ # @param scope [Hash]
177
190
  # @param idempotency_key [String] (optional)
178
- # @param url [String]
179
191
  # @see https://docs.synapsefi.com/docs/create-subscription
180
192
  # @return [Synapse::Subscription]
181
- def create_subscriptions(scope:, url:, **options)
182
- payload = {
183
- 'scope' => scope,
184
- 'url' => url,
185
- }
186
-
187
- response = client.post(subscriptions_path , payload, options)
193
+ def create_subscriptions(scope:, **options)
194
+ response = client.post(subscriptions_path , scope, options)
188
195
 
189
196
  Subscription.new(subscription_id: response["_id"], url: response["url"], payload: response)
190
197
  end
@@ -197,11 +204,17 @@ module Synapse
197
204
  subscriptions = client.get(subscriptions_path(options))
198
205
 
199
206
  return [] if subscriptions["subscriptions"].empty?
200
- response = subscriptions["subscriptions"].map { |subscription_data| Subscription.new(subscription_id: subscription_data["_id"], url: subscription_data["url"], payload: subscription_data)}
201
- subscriptions = Subscriptions.new(limit: subscriptions["limit"], page: subscriptions["page"], page_count: subscriptions["page_count"], subscriptions_count: subscriptions["subscription_count"], payload: response)
207
+ response = subscriptions["subscriptions"].map { |subscription_data| Subscription.new(subscription_id: subscription_data["_id"],
208
+ url: subscription_data["url"],
209
+ payload: subscription_data)}
210
+ Subscriptions.new(limit: subscriptions["limit"],
211
+ page: subscriptions["page"],
212
+ page_count: subscriptions["page_count"],
213
+ subscriptions_count: subscriptions["subscription_count"],
214
+ payload: response
215
+ )
202
216
  end
203
217
 
204
-
205
218
  # Queries Synapse API for a subscription by subscription_id
206
219
  # @param subscription_id [String]
207
220
  # @return [Synapse::Subscription]
@@ -211,34 +224,30 @@ module Synapse
211
224
  Subscription.new(subscription_id: response["_id"], url: response["url"], payload: response)
212
225
  end
213
226
 
214
- # updates subscription platform subscription
227
+ # Updates subscription platform subscription
215
228
  # @param subscription_id [String]
216
- # @param is_active [boolean]
217
- # @param url [String]
218
- # @param scope [Array<String>]
229
+ # @param body [Hash]
219
230
  # see https://docs.synapsefi.com/docs/update-subscription
220
231
  # @return [Synapse::Subscription]
221
- def update_subscriptions(subscription_id:, url:nil, scope:nil, is_active:nil)
232
+ def update_subscriptions(subscription_id:, body:)
222
233
  path = subscriptions_path + "/#{subscription_id}"
223
234
 
224
- payload = {}
225
-
226
- payload["url"] = url if url
227
- payload["scope"] = scope if scope
228
- payload["is_active"] = is_active if is_active
229
-
230
- response = client.patch(path, payload)
235
+ response = client.patch(path, body)
231
236
  Subscription.new(subscription_id: response["_id"], url: response["url"], payload: response)
232
237
  end
233
238
 
239
+ # Returns all of the webhooks belonging to client
240
+ # @return [Hash]
241
+ def webhook_logs()
242
+ path = subscriptions_path + "/logs"
243
+ client.get(path)
244
+ end
234
245
 
235
246
  # Issues public key for client
236
- # @param client [Synapse::Client]
237
247
  # @param scope [String]
238
248
  # @see https://docs.synapsefi.com/docs/issuing-public-key
239
249
  # @note valid scope "OAUTH|POST,USERS|POST,USERS|GET,USER|GET,USER|PATCH,SUBSCRIPTIONS|GET,SUBSCRIPTIONS|POST,SUBSCRIPTION|GET,SUBSCRIPTION|PATCH,CLIENT|REPORTS,CLIENT|CONTROLS"
240
250
  def issue_public_key(scope:)
241
- raise ArgumentError, 'scope must be a string' unless scope.is_a?(String)
242
251
  path = '/client?issue_public_key=YES'
243
252
  path += "&scope=#{scope}"
244
253
  response = client.get(path)
@@ -293,9 +302,7 @@ module Synapse
293
302
  data
294
303
  end
295
304
 
296
-
297
305
  private
298
-
299
306
  def user_path(user_id: nil, **options)
300
307
  path = "/users"
301
308
  path += "/#{user_id}" if user_id
@@ -16,28 +16,12 @@ module Synapse
16
16
  # Raised on the HTTP status code 402
17
17
  RequestDeclined = Class.new(ClientError)
18
18
 
19
- # Raised on the HTTP status code 403
20
- # Forbidden = Class.new(ClientError)
21
- # '403' => Synapse::Error::Forbidden,
22
-
23
19
  # Raised on the HTTP status code 404
24
20
  NotFound = Class.new(ClientError)
25
21
 
26
- # Raised on the HTTP status code 406
27
- # NotAcceptable = Class.new(ClientError)
28
- # '406' => Synapse::Error::NotAcceptable,
29
-
30
22
  # Raised on the HTTP status code 409
31
23
  Conflict = Class.new(ClientError)
32
24
 
33
- # Raised on the HTTP status code 415
34
- # UnsupportedMediaType = Class.new(ClientError)
35
- # '415' => Synapse::Error::UnsupportedMediaType,
36
-
37
- # Raised on the HTTP status code 422
38
- # UnprocessableEntity = Class.new(ClientError)
39
- # '422' => Synapse::Error::UnprocessableEntity,
40
-
41
25
  # Raised on the HTTP status code 429
42
26
  TooManyRequests = Class.new(ClientError)
43
27
 
@@ -47,21 +31,10 @@ module Synapse
47
31
  # Raised on the HTTP status code 500
48
32
  InternalServerError = Class.new(ServerError)
49
33
 
50
- # Raised on the HTTP status code 502
51
- # BadGateway = Class.new(ServerError)
52
- # '502' => Synapse::Error::BadGateway,
53
-
54
34
  # Raised on the HTTP status code 503
55
35
  ServiceUnavailable = Class.new(ServerError)
56
36
 
57
- # Raised on the HTTP status code 504
58
- # GatewayTimeout = Class.new(ServerError)
59
- # '504' => Synapse::Error::GatewayTimeout
60
-
61
37
  # HTTP status code to Error subclass mapping
62
- #
63
- # @todo doesn't do well when there's an html response from nginx for bad gateway/timeout
64
-
65
38
  ERRORS = {
66
39
  '202' => Synapse::Error::Accepted,
67
40
  '400' => Synapse::Error::BadRequest,
@@ -1,7 +1,6 @@
1
1
  require 'rest-client'
2
2
  require 'open-uri'
3
3
  require 'json'
4
- require_relative './error'
5
4
 
6
5
  module Synapse
7
6
  # Wrapper for HTTP requests using RestClient.
@@ -93,7 +92,12 @@ module Synapse
93
92
  headers = headers.merge({'X-SP-IDEMPOTENCY-KEY' => options[:idempotency_key]})
94
93
  end
95
94
 
96
- response = with_error_handling { RestClient::Request.execute(:method => :post, :url => full_url(path), :payload => payload.to_json, :headers => headers, :timeout => 300) }
95
+ response = with_error_handling { RestClient::Request.execute(:method => :post,
96
+ :url => full_url(path),
97
+ :payload => payload.to_json,
98
+ :headers => headers,
99
+ :timeout => 300
100
+ ) }
97
101
  puts 'RESPONSE:', JSON.parse(response) if @logging
98
102
  response = JSON.parse(response)
99
103
 
@@ -148,7 +152,12 @@ module Synapse
148
152
  # @return [Hash] API response
149
153
  # @raise [Synapse::Error] subclass depends on HTTP response
150
154
  def patch(path, payload)
151
- response = with_error_handling {RestClient::Request.execute(:method => :patch, :url => full_url(path), :payload => payload.to_json, :headers => headers, :timeout => 300)}
155
+ response = with_error_handling {RestClient::Request.execute(:method => :patch,
156
+ :url => full_url(path),
157
+ :payload => payload.to_json,
158
+ :headers => headers,
159
+ :timeout => 300
160
+ )}
152
161
  p 'RESPONSE:', JSON.parse(response) if @logging
153
162
  response = JSON.parse(response)
154
163