atrium-ruby 0.5.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 +4 -4
- data/.rubocop.yml +3 -1
- data/README.md +52 -0
- data/lib/atrium.rb +1 -0
- data/lib/atrium/account.rb +38 -12
- data/lib/atrium/member.rb +53 -19
- data/lib/atrium/pageable.rb +74 -0
- data/lib/atrium/transaction.rb +19 -7
- data/lib/atrium/user.rb +68 -24
- data/lib/atrium/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 938771555b9c5477b1eb655e1296636cf3df04c4
|
4
|
+
data.tar.gz: 19370f5a2dbb896cf12a026c65033169a2d5d767
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 06ff6b39928d2c63450e4e5d3f0dcf14490140a018b4452561bdf4e5f3b2ae9972a5bc1813d05d6ea26f7f9244a317e1316b5b48f40c1b35b74488efa0f31f30
|
7
|
+
data.tar.gz: e0444f11d6993852243ee8fc6f0b975d75d03673b94cdb765133543d63d6d5052af53e986a3998292c18416da634402ff12ef39c47de4ae15537db9df52ffc10
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
@@ -11,6 +11,58 @@ end
|
|
11
11
|
|
12
12
|
From there, you can start using some basic class methods to make calls for data. See our [full documentation](https://atrium.mx.com/documentation) for more details.
|
13
13
|
|
14
|
+
## Examples
|
15
|
+
|
16
|
+
### Pagination
|
17
|
+
|
18
|
+
The following demonstrates how you can read data back from the API in a memory efficient way using built-in pagination
|
19
|
+
helpers. You can also specify query parameters such as `from_date` and `to_date`.
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
::Atrium::User.list_each do |user|
|
23
|
+
user.each_member do |member|
|
24
|
+
puts member.name
|
25
|
+
puts member.accounts.total_entries
|
26
|
+
|
27
|
+
member.each_account do |account|
|
28
|
+
puts account.name
|
29
|
+
puts account.transactions.total_entries
|
30
|
+
|
31
|
+
account.each_transaction do |transaction|
|
32
|
+
puts transaction.description
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
user.each_account do |account|
|
38
|
+
puts account.name
|
39
|
+
puts account.transactions.total_entries
|
40
|
+
|
41
|
+
account.each_transaction do |transaction|
|
42
|
+
puts transaction.description
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
user.each_transaction do |transaction|
|
47
|
+
puts transaction.description
|
48
|
+
end
|
49
|
+
end
|
50
|
+
```
|
51
|
+
|
52
|
+
### Date Range
|
53
|
+
|
54
|
+
You can specify `from_date` and `to_date` to limit or widen your search. For example:
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
from_date = ::Date.new(2017, 02, 18)
|
58
|
+
to_date = ::Date.new(2017, 03, 18)
|
59
|
+
params = {:from_date => from_date, :to_date => to_date}
|
60
|
+
|
61
|
+
::Atrium::Transaction.list_each(:user_guid => "USR-123", :query_params => params) do |transaction|
|
62
|
+
puts transaction.description
|
63
|
+
end
|
64
|
+
```
|
65
|
+
|
14
66
|
## Installation
|
15
67
|
|
16
68
|
Add this line to your application's Gemfile:
|
data/lib/atrium.rb
CHANGED
data/lib/atrium/account.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Atrium
|
2
2
|
class Account
|
3
|
+
extend ::Atrium::Pageable
|
3
4
|
include ::ActiveAttr::Model
|
4
5
|
|
5
6
|
# ATTRIBUTES
|
@@ -32,13 +33,19 @@ module Atrium
|
|
32
33
|
attribute :updated_at
|
33
34
|
attribute :user_guid
|
34
35
|
|
35
|
-
def self.list(
|
36
|
-
|
37
|
-
|
36
|
+
def self.list(options = {})
|
37
|
+
options = _account_pagination_options(options)
|
38
|
+
paginate(options)
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.list_each(options = {})
|
42
|
+
options = _account_pagination_options(options)
|
43
|
+
paginate_each(options) { |account| yield account }
|
44
|
+
end
|
38
45
|
|
39
|
-
|
40
|
-
|
41
|
-
|
46
|
+
def self.list_in_batches(options = {})
|
47
|
+
options = _account_pagination_options(options)
|
48
|
+
paginate_in_batches(options) { |batch| yield batch }
|
42
49
|
end
|
43
50
|
|
44
51
|
def self.read(user_guid:, account_guid:)
|
@@ -49,13 +56,32 @@ module Atrium
|
|
49
56
|
::Atrium::Account.new(account_params)
|
50
57
|
end
|
51
58
|
|
52
|
-
def transactions
|
53
|
-
|
54
|
-
|
59
|
+
def transactions(options = {})
|
60
|
+
options = _transaction_pagination_options(options)
|
61
|
+
self.class.paginate(options)
|
62
|
+
end
|
63
|
+
|
64
|
+
def each_transaction(options = {})
|
65
|
+
options = _transaction_pagination_options(options)
|
66
|
+
self.class.paginate_each(options) { |account| yield account }
|
67
|
+
end
|
55
68
|
|
56
|
-
|
57
|
-
|
58
|
-
|
69
|
+
def transactions_in_batches(options = {})
|
70
|
+
options = _transaction_pagination_options(options)
|
71
|
+
self.class.paginate_in_batches(options) { |batch| yield batch }
|
72
|
+
end
|
73
|
+
|
74
|
+
def self._account_pagination_options(options)
|
75
|
+
user_guid = options.fetch(:user_guid)
|
76
|
+
endpoint = "/users/#{user_guid}/accounts"
|
77
|
+
options.merge(:endpoint => endpoint, :resource => "accounts")
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
def _transaction_pagination_options(options)
|
83
|
+
endpoint = "/users/#{user_guid}/accounts/#{guid}/transactions"
|
84
|
+
options.merge(:endpoint => endpoint, :resource => "transactions", :klass => ::Atrium::Transaction)
|
59
85
|
end
|
60
86
|
end
|
61
87
|
end
|
data/lib/atrium/member.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Atrium
|
2
2
|
class Member
|
3
|
+
extend ::Atrium::Pageable
|
3
4
|
include ::ActiveAttr::Model
|
4
|
-
include ::ActiveAttr::Attributes
|
5
5
|
|
6
6
|
attribute :aggregated_at
|
7
7
|
attribute :guid
|
@@ -25,13 +25,19 @@ module Atrium
|
|
25
25
|
::Atrium::Member.new(member_params)
|
26
26
|
end
|
27
27
|
|
28
|
-
def self.list(
|
29
|
-
|
30
|
-
|
28
|
+
def self.list(options = {})
|
29
|
+
options = _member_pagination_options(options)
|
30
|
+
paginate(options)
|
31
|
+
end
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
|
33
|
+
def self.list_each(options = {})
|
34
|
+
options = _member_pagination_options(options)
|
35
|
+
paginate_each(options) { |member| yield member }
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.list_in_batches(options = {})
|
39
|
+
options = _member_pagination_options(options)
|
40
|
+
paginate_in_batches(options) { |batch| yield batch }
|
35
41
|
end
|
36
42
|
|
37
43
|
def self.read(user_guid:, member_guid:)
|
@@ -45,13 +51,19 @@ module Atrium
|
|
45
51
|
##
|
46
52
|
# INSTANCE METHODS
|
47
53
|
#
|
48
|
-
def accounts
|
49
|
-
|
50
|
-
|
54
|
+
def accounts(options = {})
|
55
|
+
options = _account_pagination_options(options)
|
56
|
+
self.class.paginate(options)
|
57
|
+
end
|
51
58
|
|
52
|
-
|
53
|
-
|
54
|
-
|
59
|
+
def each_account(options = {})
|
60
|
+
options = _account_pagination_options(options)
|
61
|
+
self.class.paginate_each(options) { |account| yield account }
|
62
|
+
end
|
63
|
+
|
64
|
+
def accounts_in_batches(options = {})
|
65
|
+
options = _account_pagination_options(options)
|
66
|
+
self.class.paginate_in_batches(options) { |batch| yield batch }
|
55
67
|
end
|
56
68
|
|
57
69
|
def aggregate
|
@@ -120,13 +132,25 @@ module Atrium
|
|
120
132
|
self
|
121
133
|
end
|
122
134
|
|
123
|
-
def transactions
|
124
|
-
|
125
|
-
|
135
|
+
def transactions(options = {})
|
136
|
+
options = _transaction_pagination_options(options)
|
137
|
+
self.class.paginate(options)
|
138
|
+
end
|
126
139
|
|
127
|
-
|
128
|
-
|
129
|
-
|
140
|
+
def each_transaction(options = {})
|
141
|
+
options = _transaction_pagination_options(options)
|
142
|
+
self.class.paginate_each(options) { |transaction| yield transaction }
|
143
|
+
end
|
144
|
+
|
145
|
+
def transactions_in_batches(options = {})
|
146
|
+
options = _transaction_pagination_options(options)
|
147
|
+
self.class.paginate_in_batches(options) { |batch| yield batch }
|
148
|
+
end
|
149
|
+
|
150
|
+
def self._member_pagination_options(options)
|
151
|
+
user_guid = options.fetch(:user_guid)
|
152
|
+
endpoint = "/users/#{user_guid}/members"
|
153
|
+
options.merge(:endpoint => endpoint, :resource => "members")
|
130
154
|
end
|
131
155
|
|
132
156
|
##
|
@@ -147,6 +171,11 @@ module Atrium
|
|
147
171
|
##
|
148
172
|
# PRIVATE INSTANCE METHODS
|
149
173
|
#
|
174
|
+
def _account_pagination_options(options)
|
175
|
+
endpoint = "/users/#{user_guid}/members/#{guid}/accounts"
|
176
|
+
options.merge(:endpoint => endpoint, :resource => "accounts", :klass => ::Atrium::Account)
|
177
|
+
end
|
178
|
+
|
150
179
|
def member_body(params)
|
151
180
|
{
|
152
181
|
:member => {
|
@@ -165,5 +194,10 @@ module Atrium
|
|
165
194
|
}
|
166
195
|
}
|
167
196
|
end
|
197
|
+
|
198
|
+
def _transaction_pagination_options(options)
|
199
|
+
endpoint = "/users/#{user_guid}/members/#{guid}/transactions"
|
200
|
+
options.merge(:endpoint => endpoint, :resource => "transactions", :klass => ::Atrium::Transaction)
|
201
|
+
end
|
168
202
|
end
|
169
203
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Atrium
|
2
|
+
class PaginationBatch < ::Array
|
3
|
+
attr_accessor :total_pages, :total_entries, :current_page, :records_per_page
|
4
|
+
end
|
5
|
+
|
6
|
+
module Pageable
|
7
|
+
DEFAULT_RECORDS_PER_PAGE = 25
|
8
|
+
|
9
|
+
def make_get_request(endpoint, query_params)
|
10
|
+
uri = endpoint + "?" + ::URI.encode_www_form(query_params.sort)
|
11
|
+
::Atrium.client.make_request(:get, uri)
|
12
|
+
end
|
13
|
+
|
14
|
+
def paginate(options = {})
|
15
|
+
records_per_page = options.fetch(:records_per_page, DEFAULT_RECORDS_PER_PAGE)
|
16
|
+
results = PaginationBatch.new
|
17
|
+
paginate_in_batches(options.merge(:limit => records_per_page)) do |batch|
|
18
|
+
results = batch
|
19
|
+
end
|
20
|
+
results
|
21
|
+
end
|
22
|
+
|
23
|
+
def paginate_each(options = {})
|
24
|
+
paginate_in_batches(options) do |batch|
|
25
|
+
batch.each do |record|
|
26
|
+
yield record
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def paginate_in_batches(options = {})
|
32
|
+
fail ::ArgumentError, "A block is required" unless block_given?
|
33
|
+
|
34
|
+
endpoint = options.fetch(:endpoint)
|
35
|
+
resource = options.fetch(:resource)
|
36
|
+
klass = options.fetch(:klass, self)
|
37
|
+
|
38
|
+
query_params = options.fetch(:query_params, {})
|
39
|
+
limit = options.fetch(:limit, nil)
|
40
|
+
current_page = options.fetch(:initial_page, 1)
|
41
|
+
records_per_page = options.fetch(:records_per_page, DEFAULT_RECORDS_PER_PAGE)
|
42
|
+
|
43
|
+
pagination_info_query_params = query_params.merge(:records_per_page => records_per_page)
|
44
|
+
pagination = pagination_info(endpoint, pagination_info_query_params)
|
45
|
+
total_pages = pagination["total_pages"]
|
46
|
+
total_entries = pagination["total_entries"]
|
47
|
+
# "total_pages > 1" check exists since some query_params only return 1 page
|
48
|
+
total_pages = limit / records_per_page if limit.present? && total_pages > 1
|
49
|
+
|
50
|
+
until current_page > total_pages
|
51
|
+
params = query_params.merge(:page => current_page, :records_per_page => records_per_page)
|
52
|
+
response = make_get_request(endpoint, params)
|
53
|
+
|
54
|
+
records = response[resource].map { |attributes| klass.new(attributes) }
|
55
|
+
|
56
|
+
batch = ::Atrium::PaginationBatch.new(records)
|
57
|
+
batch.total_pages = total_pages
|
58
|
+
batch.total_entries = total_entries
|
59
|
+
batch.current_page = current_page
|
60
|
+
batch.records_per_page = records_per_page
|
61
|
+
yield batch
|
62
|
+
|
63
|
+
current_page += 1
|
64
|
+
end
|
65
|
+
|
66
|
+
nil
|
67
|
+
end
|
68
|
+
|
69
|
+
def pagination_info(endpoint, query_params)
|
70
|
+
response = make_get_request(endpoint, query_params.merge(:page => 1))
|
71
|
+
response["pagination"]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/lib/atrium/transaction.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Atrium
|
2
2
|
class Transaction
|
3
|
+
extend ::Atrium::Pageable
|
3
4
|
include ::ActiveAttr::Model
|
4
5
|
|
5
6
|
attribute :account_guid
|
@@ -31,20 +32,31 @@ module Atrium
|
|
31
32
|
attribute :updated_at
|
32
33
|
attribute :user_guid
|
33
34
|
|
34
|
-
def self.list(
|
35
|
-
|
36
|
-
|
35
|
+
def self.list(options = {})
|
36
|
+
options = _transaction_pagination_options(options)
|
37
|
+
paginate(options)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.list_each(options = {})
|
41
|
+
options = _transaction_pagination_options(options)
|
42
|
+
paginate_each(options) { |transaction| yield transaction }
|
43
|
+
end
|
37
44
|
|
38
|
-
|
39
|
-
|
40
|
-
|
45
|
+
def self.list_in_batches(options = {})
|
46
|
+
options = _transaction_pagination_options(options)
|
47
|
+
paginate_in_batches(options) { |batch| yield batch }
|
41
48
|
end
|
42
49
|
|
43
50
|
def self.read(user_guid:, transaction_guid:)
|
44
51
|
endpoint = "/users/#{user_guid}/transactions/#{transaction_guid}"
|
45
52
|
raw_transaction = ::Atrium.client.make_request(:get, endpoint)
|
46
|
-
|
47
53
|
::Atrium::Transaction.new(raw_transaction["transaction"])
|
48
54
|
end
|
55
|
+
|
56
|
+
def self._transaction_pagination_options(options)
|
57
|
+
user_guid = options.fetch(:user_guid)
|
58
|
+
endpoint = "/users/#{user_guid}/transactions"
|
59
|
+
options.merge(:endpoint => endpoint, :resource => "transactions")
|
60
|
+
end
|
49
61
|
end
|
50
62
|
end
|
data/lib/atrium/user.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module Atrium
|
2
2
|
class User
|
3
|
+
extend ::Atrium::Pageable
|
3
4
|
include ::ActiveAttr::Model
|
4
5
|
|
5
6
|
# ATTRIBUTES
|
@@ -20,13 +21,19 @@ module Atrium
|
|
20
21
|
::Atrium::User.new(user_params)
|
21
22
|
end
|
22
23
|
|
23
|
-
def self.list
|
24
|
-
|
25
|
-
|
24
|
+
def self.list(options = {})
|
25
|
+
options = _user_pagination_options(options)
|
26
|
+
paginate(options)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.list_each(options = {})
|
30
|
+
options = _user_pagination_options(options)
|
31
|
+
paginate_each(options) { |user| yield user }
|
32
|
+
end
|
26
33
|
|
27
|
-
|
28
|
-
|
29
|
-
|
34
|
+
def self.list_in_batches(options = {})
|
35
|
+
options = _user_pagination_options(options)
|
36
|
+
paginate_in_batches(options) { |batch| yield batch }
|
30
37
|
end
|
31
38
|
|
32
39
|
def self.read(guid:)
|
@@ -40,13 +47,19 @@ module Atrium
|
|
40
47
|
##
|
41
48
|
# INSTANCE METHODS
|
42
49
|
#
|
43
|
-
def accounts
|
44
|
-
|
45
|
-
|
50
|
+
def accounts(options = {})
|
51
|
+
options = _account_pagination_options(options)
|
52
|
+
self.class.paginate(options)
|
53
|
+
end
|
46
54
|
|
47
|
-
|
48
|
-
|
49
|
-
|
55
|
+
def each_account(options = {})
|
56
|
+
options = _account_pagination_options(options)
|
57
|
+
self.class.paginate_each(options) { |account| yield account }
|
58
|
+
end
|
59
|
+
|
60
|
+
def accounts_in_batches(options = {})
|
61
|
+
options = _account_pagination_options(options)
|
62
|
+
self.class.paginate_in_batches(options) { |batch| yield batch }
|
50
63
|
end
|
51
64
|
|
52
65
|
def delete
|
@@ -56,22 +69,34 @@ module Atrium
|
|
56
69
|
self
|
57
70
|
end
|
58
71
|
|
59
|
-
def members
|
60
|
-
|
61
|
-
|
72
|
+
def members(options = {})
|
73
|
+
options = _member_pagination_options(options)
|
74
|
+
self.class.paginate(options)
|
75
|
+
end
|
62
76
|
|
63
|
-
|
64
|
-
|
65
|
-
|
77
|
+
def each_member(options = {})
|
78
|
+
options = _member_pagination_options(options)
|
79
|
+
self.class.paginate_each(options) { |member| yield member }
|
66
80
|
end
|
67
81
|
|
68
|
-
def
|
69
|
-
|
70
|
-
|
82
|
+
def members_in_batches(options = {})
|
83
|
+
options = _member_pagination_options(options)
|
84
|
+
self.class.paginate_in_batches(options) { |batch| yield batch }
|
85
|
+
end
|
71
86
|
|
72
|
-
|
73
|
-
|
74
|
-
|
87
|
+
def transactions(options = {})
|
88
|
+
options = _transaction_pagination_options(options)
|
89
|
+
self.class.paginate(options)
|
90
|
+
end
|
91
|
+
|
92
|
+
def each_transaction(options = {})
|
93
|
+
options = _transaction_pagination_options(options)
|
94
|
+
self.class.paginate_each(options) { |transaction| yield transaction }
|
95
|
+
end
|
96
|
+
|
97
|
+
def transactions_in_batches(options = {})
|
98
|
+
options = _transaction_pagination_options(options)
|
99
|
+
self.class.paginate_in_batches(options) { |batch| yield batch }
|
75
100
|
end
|
76
101
|
|
77
102
|
def update(params)
|
@@ -84,8 +109,27 @@ module Atrium
|
|
84
109
|
self
|
85
110
|
end
|
86
111
|
|
112
|
+
def self._user_pagination_options(options)
|
113
|
+
options.merge(:endpoint => "/users", :resource => "users")
|
114
|
+
end
|
115
|
+
|
87
116
|
private
|
88
117
|
|
118
|
+
def _account_pagination_options(options)
|
119
|
+
endpoint = "/users/#{guid}/accounts"
|
120
|
+
options.merge(:endpoint => endpoint, :resource => "accounts", :klass => ::Atrium::Account)
|
121
|
+
end
|
122
|
+
|
123
|
+
def _member_pagination_options(options)
|
124
|
+
endpoint = "/users/#{guid}/members"
|
125
|
+
options.merge(:endpoint => endpoint, :resource => "members", :klass => ::Atrium::Member)
|
126
|
+
end
|
127
|
+
|
128
|
+
def _transaction_pagination_options(options)
|
129
|
+
endpoint = "/users/#{guid}/transactions"
|
130
|
+
options.merge(:endpoint => endpoint, :resource => "transactions", :klass => ::Atrium::Transaction)
|
131
|
+
end
|
132
|
+
|
89
133
|
def update_params(params)
|
90
134
|
{
|
91
135
|
:user => params
|
data/lib/atrium/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: atrium-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jon Carstens, Dan Jones, Zach Toolson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active_attr
|
@@ -176,6 +176,7 @@ files:
|
|
176
176
|
- lib/atrium/error.rb
|
177
177
|
- lib/atrium/institution.rb
|
178
178
|
- lib/atrium/member.rb
|
179
|
+
- lib/atrium/pageable.rb
|
179
180
|
- lib/atrium/paginate.rb
|
180
181
|
- lib/atrium/ruby.rb
|
181
182
|
- lib/atrium/transaction.rb
|
@@ -201,7 +202,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
201
202
|
version: '0'
|
202
203
|
requirements: []
|
203
204
|
rubyforge_project:
|
204
|
-
rubygems_version: 2.
|
205
|
+
rubygems_version: 2.6.13
|
205
206
|
signing_key:
|
206
207
|
specification_version: 4
|
207
208
|
summary: Ruby wrapper for the Atrium API by MX
|