bitreserve 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +43 -5
- data/lib/bitreserve/api/private_transaction.rb +4 -4
- data/lib/bitreserve/api/public_transaction.rb +2 -2
- data/lib/bitreserve/client.rb +2 -0
- data/lib/bitreserve/entities/base_entity.rb +14 -4
- data/lib/bitreserve/pagination.rb +9 -0
- data/lib/bitreserve/request.rb +19 -9
- data/lib/bitreserve/version.rb +1 -1
- data/spec/integration/api/public_transaction_spec.rb +1 -0
- data/spec/unit/api/private_transaction_spec.rb +2 -2
- data/spec/unit/api/public_transaction_spec.rb +1 -1
- data/spec/unit/entities/base_entity_spec.rb +1 -1
- data/spec/unit/request_spec.rb +2 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3bbbbdb0761739cd6c5e1d66a3f0ac5dfa71c498
|
4
|
+
data.tar.gz: d12bcb0e633a3a04665b17d7b778838645d584d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e07529048a9d805f6b22460e26f89defe5f7da1b6fe71d3dc49b7b20c3018bac0df8cf0a0b834e59a0191d2c8ded7a7ea99438d4cdb033d3c992de2a4e43a38
|
7
|
+
data.tar.gz: dbd7039f5765587738de721d3dd48d67b3f942948abfa8fd63bea919baa380682c5eafcf98c997237a61131387a769a1236032a7722674978fb8d6889e303eec
|
data/README.md
CHANGED
@@ -43,6 +43,7 @@ Or install it yourself as:
|
|
43
43
|
* [Contacts](#contacts)
|
44
44
|
* [Users](#users)
|
45
45
|
* [Transparency](#transparency)
|
46
|
+
* [Pagination](#pagination)
|
46
47
|
* [Contributing](#contributing)
|
47
48
|
|
48
49
|
# Usage
|
@@ -63,6 +64,9 @@ client. Here's how you can do that.
|
|
63
64
|
|
64
65
|
## Personal Access Token
|
65
66
|
|
67
|
+
If you don't have a PAT, learn how to generate one
|
68
|
+
[here](#basic-authentication).
|
69
|
+
|
66
70
|
If you already have a token, you can use it by setting an environment variable,
|
67
71
|
or by passing it when instantiating the client.
|
68
72
|
|
@@ -99,11 +103,24 @@ Bitreserve's API.
|
|
99
103
|
|
100
104
|
### OAuth2
|
101
105
|
|
102
|
-
**NOT SUPPORTED YET**
|
106
|
+
**NOT SUPPORTED BY BITRESERVE YET**
|
103
107
|
|
104
108
|
### Basic Authentication
|
105
109
|
|
106
|
-
|
110
|
+
[*Bireserve documentation on basic authentication*](https://developer.bitreserve.org/api/v0/#basic-authentication)
|
111
|
+
|
112
|
+
The only thing you need, in order to use basic authentication is a Personal
|
113
|
+
Access Token, everything else is transparent to you. If you already have a
|
114
|
+
token, see how to use it [here](#personal-access-token).
|
115
|
+
|
116
|
+
```ruby
|
117
|
+
client.generate_access_token(username: 'your-bitreserve-username', password:
|
118
|
+
'your-bitreserve-password', otp: 'a-valid-bitreserve-otp')
|
119
|
+
```
|
120
|
+
|
121
|
+
To generate a valid OTP you can install [Authy](https://www.authy.com/), follow
|
122
|
+
it's set up process and choose bitreserve. You should be prompted with a set of
|
123
|
+
numbers, which is your OTP (it only lasts 30 seconds, so you have to be quick).
|
107
124
|
|
108
125
|
## Tickers
|
109
126
|
|
@@ -151,13 +168,15 @@ You can interact with both the authenticated user's and public transactions.
|
|
151
168
|
|
152
169
|
### Public Transactions
|
153
170
|
|
154
|
-
**Return the public view of all transactions in the reserve
|
171
|
+
**Return the public view of all transactions in the reserve (supports
|
172
|
+
[Pagination](#pagination)):**
|
155
173
|
|
156
174
|
```ruby
|
157
175
|
client.all_public_transactions
|
158
176
|
```
|
159
177
|
|
160
|
-
**Return the public view of a specific transaction
|
178
|
+
**Return the public view of a specific transaction (supports
|
179
|
+
[Pagination](#pagination)):**
|
161
180
|
|
162
181
|
```ruby
|
163
182
|
client.find_public_transactions(id: 'a97bb994-6e24-4a89-b653-e0a6d0bcf634')
|
@@ -193,7 +212,8 @@ client.resend_transaction(card_id: 'a6d35fcd-xxxx-9c9d1dda6d57', transaction_id:
|
|
193
212
|
'd51b4e4e-9827-40fb-8763-e0ea2880085b')
|
194
213
|
```
|
195
214
|
|
196
|
-
**Return all transactions associated with the user
|
215
|
+
**Return all transactions associated with the user (supports
|
216
|
+
[Pagination](#pagination)):**
|
197
217
|
|
198
218
|
```ruby
|
199
219
|
client.all_user_transactions
|
@@ -254,6 +274,24 @@ client.phones
|
|
254
274
|
client.statistics
|
255
275
|
```
|
256
276
|
|
277
|
+
## Pagination
|
278
|
+
|
279
|
+
[*Bitreserve documentation on pagination*](https://developer.bitreserve.org/api/v0/#pagination)
|
280
|
+
|
281
|
+
All endpoints that support pagination take a `range` attribute, in which you can
|
282
|
+
specify the first and last indexes for the items you wish to retrieve.
|
283
|
+
|
284
|
+
The response will look exactly like an `Array`, but with a method called
|
285
|
+
`total_items`, that returns the total number of items of that type that
|
286
|
+
Bitreserve knows of.
|
287
|
+
|
288
|
+
```ruby
|
289
|
+
client = Bitreserve::Client.new token: 'XXX'
|
290
|
+
client.all_public_transactions.size # 5
|
291
|
+
client.all_public_transactions.total_size # 21110
|
292
|
+
client.all_public_transactions(range: (5..20)).size # 16
|
293
|
+
```
|
294
|
+
|
257
295
|
# Contributing
|
258
296
|
|
259
297
|
1. Fork it ( https://github.com/groupbuddies/bitreserve/fork )
|
@@ -26,20 +26,20 @@ module Bitreserve
|
|
26
26
|
Request.perform_with_object(:post, request_data)
|
27
27
|
end
|
28
28
|
|
29
|
-
def all_user_transactions
|
29
|
+
def all_user_transactions(range: (0..4))
|
30
30
|
request_data = RequestData.new(
|
31
31
|
Endpoints::USER_PRIVATE_TRANSACTIONS,
|
32
32
|
Entities::Transaction,
|
33
|
-
authorization_header
|
33
|
+
authorization_header.merge(pagination_header_for_range(range))
|
34
34
|
)
|
35
35
|
Request.perform_with_objects(:get, request_data)
|
36
36
|
end
|
37
37
|
|
38
|
-
def all_card_transactions(card_id: nil)
|
38
|
+
def all_card_transactions(card_id: nil, range: (0..4))
|
39
39
|
request_data = RequestData.new(
|
40
40
|
Endpoints.with_placeholders(Endpoints::CARD_PRIVATE_TRANSACTIONS, ':card' => card_id),
|
41
41
|
Entities::Transaction,
|
42
|
-
authorization_header
|
42
|
+
authorization_header.merge(pagination_header_for_range(range))
|
43
43
|
)
|
44
44
|
Request.perform_with_objects(:get, request_data)
|
45
45
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module Bitreserve
|
2
2
|
module API
|
3
3
|
module PublicTransaction
|
4
|
-
def all_public_transactions
|
4
|
+
def all_public_transactions(range: (0..4))
|
5
5
|
request_data = RequestData.new(
|
6
6
|
Endpoints::PUBLIC_TRANSACTIONS,
|
7
7
|
Entities::Transaction,
|
8
|
-
authorization_header
|
8
|
+
authorization_header.merge(pagination_header_for_range(range))
|
9
9
|
)
|
10
10
|
Request.perform_with_objects(:get, request_data)
|
11
11
|
end
|
data/lib/bitreserve/client.rb
CHANGED
@@ -3,15 +3,25 @@ module Bitreserve
|
|
3
3
|
class BaseEntity
|
4
4
|
include Virtus.model
|
5
5
|
|
6
|
-
def self.from_collection(entities)
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
def self.from_collection(entities, content_range)
|
7
|
+
total_size = (content_range && content_range.split('/')[1]) || entities.size
|
8
|
+
items = entities.map { |entity| new(entity) }
|
9
|
+
|
10
|
+
PaginatedCollection.new(items, total_size)
|
10
11
|
end
|
11
12
|
|
12
13
|
def initialize(attributes = {})
|
13
14
|
super(Bitreserve::Helpers.underscored_hash(attributes))
|
14
15
|
end
|
16
|
+
|
17
|
+
class PaginatedCollection < Array
|
18
|
+
attr_reader :total_size
|
19
|
+
|
20
|
+
def initialize(items, total_size)
|
21
|
+
super(items)
|
22
|
+
@total_size = total_size.to_i
|
23
|
+
end
|
24
|
+
end
|
15
25
|
end
|
16
26
|
end
|
17
27
|
end
|
data/lib/bitreserve/request.rb
CHANGED
@@ -1,22 +1,24 @@
|
|
1
1
|
module Bitreserve
|
2
2
|
class Request
|
3
|
+
class APIError < StandardError; end
|
4
|
+
|
3
5
|
include ::HTTParty
|
4
6
|
base_uri "#{Bitreserve.api_base}/v#{Bitreserve.api_version}"
|
5
7
|
|
6
8
|
def self.perform_with_objects(http_method, request_data)
|
7
9
|
response = new(request_data).public_send(http_method)
|
8
|
-
|
10
|
+
|
11
|
+
with_valid_response(response) do
|
12
|
+
request_data.entity.from_collection(response.parsed_response, response.headers['content-range'])
|
13
|
+
end
|
9
14
|
end
|
10
15
|
|
11
16
|
def self.perform_with_object(http_method, request_data)
|
12
17
|
response = new(request_data).public_send(http_method)
|
13
|
-
check_error(response) || request_data.entity.new(response)
|
14
|
-
end
|
15
18
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
Entities::Error.new(response)
|
19
|
+
with_valid_response(response) do
|
20
|
+
request_data.entity.new(response.parsed_response)
|
21
|
+
end
|
20
22
|
end
|
21
23
|
|
22
24
|
def initialize(request_data)
|
@@ -28,19 +30,27 @@ module Bitreserve
|
|
28
30
|
def get
|
29
31
|
response = self.class.get(path, options)
|
30
32
|
log_request_info(:get, response)
|
31
|
-
response
|
33
|
+
response
|
32
34
|
end
|
33
35
|
|
34
36
|
def post
|
35
37
|
response = self.class.post(path, options)
|
36
38
|
log_request_info(:post, response)
|
37
|
-
response
|
39
|
+
response
|
38
40
|
end
|
39
41
|
|
40
42
|
private
|
41
43
|
|
42
44
|
attr_reader :path, :data, :auth, :headers
|
43
45
|
|
46
|
+
def self.with_valid_response(response)
|
47
|
+
if response.is_a?(Hash) && response['error']
|
48
|
+
Entities::Error.new(response)
|
49
|
+
else
|
50
|
+
yield
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
44
54
|
def options
|
45
55
|
{ body: data, headers: headers }.
|
46
56
|
reject { |_k, v| v.nil? }
|
data/lib/bitreserve/version.rb
CHANGED
@@ -11,6 +11,7 @@ module Bitreserve
|
|
11
11
|
transactions = client.all_public_transactions
|
12
12
|
|
13
13
|
expect(transactions).to be_a(Array)
|
14
|
+
expect(transactions.total_size).to eq 2
|
14
15
|
expect(transactions.first).to be_a(Entities::Transaction)
|
15
16
|
expect(transactions.first.id).to be_a(String)
|
16
17
|
end
|
@@ -82,7 +82,7 @@ module Bitreserve
|
|
82
82
|
request_data = RequestData.new(
|
83
83
|
Endpoints::USER_PRIVATE_TRANSACTIONS,
|
84
84
|
Entities::Transaction,
|
85
|
-
client.authorization_header
|
85
|
+
client.authorization_header.merge(client.pagination_header_for_range(0..4))
|
86
86
|
)
|
87
87
|
allow(Request).to receive(:perform_with_objects)
|
88
88
|
|
@@ -99,7 +99,7 @@ module Bitreserve
|
|
99
99
|
request_data = RequestData.new(
|
100
100
|
Endpoints.with_placeholders(Endpoints::CARD_PRIVATE_TRANSACTIONS, ':card' => card_id),
|
101
101
|
Entities::Transaction,
|
102
|
-
client.authorization_header
|
102
|
+
client.authorization_header.merge(client.pagination_header_for_range(0..4))
|
103
103
|
)
|
104
104
|
allow(Request).to receive(:perform_with_objects)
|
105
105
|
|
@@ -7,7 +7,7 @@ module Bitreserve
|
|
7
7
|
|
8
8
|
context '#all_public_transactions' do
|
9
9
|
it 'gets all public transactions' do
|
10
|
-
request_data = RequestData.new(Endpoints::PUBLIC_TRANSACTIONS, Entities::Transaction, client.authorization_header)
|
10
|
+
request_data = RequestData.new(Endpoints::PUBLIC_TRANSACTIONS, Entities::Transaction, client.authorization_header.merge(client.pagination_header_for_range(0..4)))
|
11
11
|
allow(Request).to receive(:perform_with_objects)
|
12
12
|
|
13
13
|
client.all_public_transactions
|
data/spec/unit/request_spec.rb
CHANGED
@@ -3,7 +3,8 @@ require 'spec_helper'
|
|
3
3
|
module Bitreserve
|
4
4
|
shared_examples 'perform request method' do |method_name|
|
5
5
|
let(:object_class) { double('ObjectClass', new: nil, from_collection: nil) }
|
6
|
-
let(:
|
6
|
+
let(:response) { double('Response', code: 200, parsed_response: '', headers: {}) }
|
7
|
+
let(:request) { spy('request', get: response, post: response) }
|
7
8
|
let(:client) { Client.new }
|
8
9
|
|
9
10
|
context ".#{method_name}" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bitreserve
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Group Buddies
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -175,6 +175,7 @@ files:
|
|
175
175
|
- lib/bitreserve/entities/transaction.rb
|
176
176
|
- lib/bitreserve/entities/user.rb
|
177
177
|
- lib/bitreserve/helpers.rb
|
178
|
+
- lib/bitreserve/pagination.rb
|
178
179
|
- lib/bitreserve/request.rb
|
179
180
|
- lib/bitreserve/request_data.rb
|
180
181
|
- lib/bitreserve/version.rb
|
@@ -240,7 +241,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
240
241
|
version: '0'
|
241
242
|
requirements: []
|
242
243
|
rubyforge_project:
|
243
|
-
rubygems_version: 2.4.
|
244
|
+
rubygems_version: 2.4.5
|
244
245
|
signing_key:
|
245
246
|
specification_version: 4
|
246
247
|
summary: A wrapper for the bitreserve API
|
@@ -287,4 +288,3 @@ test_files:
|
|
287
288
|
- spec/unit/entities/base_entity_spec.rb
|
288
289
|
- spec/unit/helper_spec.rb
|
289
290
|
- spec/unit/request_spec.rb
|
290
|
-
has_rdoc:
|