bitreserve 1.1.0 → 1.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.
- 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:
|