bitodeme 0.1.0 → 0.1.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/.gitignore +1 -0
- data/Gemfile +2 -2
- data/Gemfile.lock +58 -0
- data/Rakefile +1 -1
- data/bitodeme.gemspec +1 -1
- data/lib/bitodeme/auth.rb +71 -0
- data/lib/bitodeme/configuration.rb +18 -0
- data/lib/bitodeme/conn.rb +43 -0
- data/lib/bitodeme/resources/base.rb +77 -0
- data/lib/bitodeme/resources/currency.rb +34 -0
- data/lib/bitodeme/resources/deposit.rb +26 -0
- data/lib/bitodeme/resources/fund.rb +36 -0
- data/lib/bitodeme/resources/fund_address.rb +39 -0
- data/lib/bitodeme/resources/invoice.rb +82 -0
- data/lib/bitodeme/resources/transaction_log.rb +41 -0
- data/lib/bitodeme/resources/withdrawal.rb +65 -0
- data/lib/bitodeme/validation_error.rb +8 -0
- data/lib/bitodeme/version.rb +1 -1
- data/lib/bitodeme.rb +13 -13
- metadata +26 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b98888019e9878b395b47c1dc8b36810b9c045f7
|
4
|
+
data.tar.gz: fd71b503b3f8ef66e88e7c7eabd60c0bcfc6633e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 836f05b8fe05f6160a8f348ad0bb84b8497d42883a2b680a9eff5ca9ba7be25837aa0850c72d450114d9c80918019787441974fe6a65a90f9ca5aedaad241abd
|
7
|
+
data.tar.gz: cd37897158f7ef590acf6949f8d20260be048956bb6e46dbf6a238c346adccd52864a128a169504de5dcc66c5c04ffba149f67378bb1294463ed40e3275673e1
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
3
|
+
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
4
4
|
|
5
5
|
# Specify your gem's dependencies in bitodeme.gemspec
|
6
6
|
gemspec
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
bitodeme (0.1.0)
|
5
|
+
dotenv (~> 2.2, >= 2.2)
|
6
|
+
faraday (~> 0.13)
|
7
|
+
faraday_middleware (~> 0.12)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
coderay (1.1.2)
|
13
|
+
diff-lcs (1.3)
|
14
|
+
docile (1.1.5)
|
15
|
+
dotenv (2.2.1)
|
16
|
+
faraday (0.13.1)
|
17
|
+
multipart-post (>= 1.2, < 3)
|
18
|
+
faraday_middleware (0.12.2)
|
19
|
+
faraday (>= 0.7.4, < 1.0)
|
20
|
+
json (2.1.0)
|
21
|
+
method_source (0.9.0)
|
22
|
+
multipart-post (2.0.0)
|
23
|
+
pry (0.11.3)
|
24
|
+
coderay (~> 1.1.0)
|
25
|
+
method_source (~> 0.9.0)
|
26
|
+
rake (10.5.0)
|
27
|
+
rspec (3.7.0)
|
28
|
+
rspec-core (~> 3.7.0)
|
29
|
+
rspec-expectations (~> 3.7.0)
|
30
|
+
rspec-mocks (~> 3.7.0)
|
31
|
+
rspec-core (3.7.0)
|
32
|
+
rspec-support (~> 3.7.0)
|
33
|
+
rspec-expectations (3.7.0)
|
34
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
35
|
+
rspec-support (~> 3.7.0)
|
36
|
+
rspec-mocks (3.7.0)
|
37
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
38
|
+
rspec-support (~> 3.7.0)
|
39
|
+
rspec-support (3.7.0)
|
40
|
+
simplecov (0.15.1)
|
41
|
+
docile (~> 1.1.0)
|
42
|
+
json (>= 1.8, < 3)
|
43
|
+
simplecov-html (~> 0.10.0)
|
44
|
+
simplecov-html (0.10.2)
|
45
|
+
|
46
|
+
PLATFORMS
|
47
|
+
ruby
|
48
|
+
|
49
|
+
DEPENDENCIES
|
50
|
+
bitodeme!
|
51
|
+
bundler (~> 1.14)
|
52
|
+
pry (~> 0.11)
|
53
|
+
rake (~> 10.0)
|
54
|
+
rspec (~> 3.0)
|
55
|
+
simplecov (~> 0.15)
|
56
|
+
|
57
|
+
BUNDLED WITH
|
58
|
+
1.16.0
|
data/Rakefile
CHANGED
data/bitodeme.gemspec
CHANGED
@@ -20,10 +20,10 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
|
22
22
|
spec.add_development_dependency 'bundler', '~> 1.14'
|
23
|
+
spec.add_development_dependency 'pry', '~> 0.11'
|
23
24
|
spec.add_development_dependency 'rake', '~> 10.0'
|
24
25
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
25
26
|
spec.add_development_dependency 'simplecov', '~> 0.15'
|
26
|
-
spec.add_development_dependency 'pry', '~> 0.11'
|
27
27
|
|
28
28
|
spec.add_dependency 'dotenv', '~> 2.2', '>= 2.2'
|
29
29
|
spec.add_dependency 'faraday', '~> 0.13'
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
module Bitodeme
|
4
|
+
# OAuth2 client credentials authenticator for Bitodeme
|
5
|
+
class Auth
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@expires_at = 0
|
10
|
+
end
|
11
|
+
|
12
|
+
# Valid access token for Bitodeme endpoints
|
13
|
+
def token
|
14
|
+
reset_token if expired?
|
15
|
+
access_token
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
USER_AGENT = "Ruby / Bitodeme v#{Bitodeme::VERSION}".freeze
|
21
|
+
GRANT_TYPE = 'client_credentials'.freeze
|
22
|
+
AUTH_ENDPOINT = '/api/v1/tokens'.freeze
|
23
|
+
|
24
|
+
def_delegators :Bitodeme, :config
|
25
|
+
def_delegators :config, :hostname, :client_id, :client_secret
|
26
|
+
|
27
|
+
attr_reader :access_token, :expires_at
|
28
|
+
|
29
|
+
def expired?
|
30
|
+
Time.now.to_i > expires_at
|
31
|
+
end
|
32
|
+
|
33
|
+
def reset_token
|
34
|
+
token = authenticate.fetch('token', {})
|
35
|
+
@access_token = token.fetch('value', '')
|
36
|
+
@expires_at = token.fetch('expires_at', 0)
|
37
|
+
end
|
38
|
+
|
39
|
+
def authenticate
|
40
|
+
conn.post(AUTH_ENDPOINT, auth_body).body
|
41
|
+
end
|
42
|
+
|
43
|
+
def conn
|
44
|
+
@conn ||= Faraday.new(faraday_opts) do |faraday|
|
45
|
+
faraday.request :json
|
46
|
+
faraday.response :logger
|
47
|
+
faraday.response :json, content_type: /\bjson$/
|
48
|
+
faraday.adapter Faraday.default_adapter
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def faraday_opts
|
53
|
+
{
|
54
|
+
url: "https://#{hostname}",
|
55
|
+
headers: { 'User-Agent' => USER_AGENT }
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
def auth_body
|
60
|
+
@auth_body ||= { token: auth_params }
|
61
|
+
end
|
62
|
+
|
63
|
+
def auth_params
|
64
|
+
{
|
65
|
+
client_id: client_id,
|
66
|
+
client_secret: client_secret,
|
67
|
+
grant_type: GRANT_TYPE
|
68
|
+
}
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module Bitodeme
|
4
|
+
# Configuration for Bitodeme
|
5
|
+
class Configuration
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
attr_reader :hostname,
|
9
|
+
:client_id,
|
10
|
+
:client_secret
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@hostname = ENV['BITODEME_HOSTNAME']
|
14
|
+
@client_id = ENV['BITODEME_CLIENT_ID']
|
15
|
+
@client_secret = ENV['BITODEME_CLIENT_SECRET']
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Bitodeme
|
5
|
+
# HTTP Connection for Bitodeme
|
6
|
+
class Conn
|
7
|
+
include Singleton
|
8
|
+
|
9
|
+
private_class_method :new
|
10
|
+
|
11
|
+
USER_AGENT = "Ruby / Bitodeme v#{Bitodeme::VERSION}".freeze
|
12
|
+
|
13
|
+
def self.build
|
14
|
+
@conn ||= new.send(:conn)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
attr_reader :auth, :hostname
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
@auth = Bitodeme::Auth.new
|
23
|
+
@hostname = Bitodeme.config.hostname
|
24
|
+
end
|
25
|
+
|
26
|
+
def conn
|
27
|
+
Faraday.new(faraday_opts) do |faraday|
|
28
|
+
faraday.request :oauth2, auth.token, token_type: :bearer
|
29
|
+
faraday.request :json
|
30
|
+
faraday.response :logger
|
31
|
+
faraday.response :json, content_type: /\bjson$/
|
32
|
+
faraday.adapter Faraday.default_adapter
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def faraday_opts
|
37
|
+
@faraday_opts ||= {
|
38
|
+
url: "https://#{hostname}",
|
39
|
+
headers: { 'User-Agent' => USER_AGENT }
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
module Bitodeme
|
4
|
+
module Resource
|
5
|
+
# Base class for all Bitodeme resources
|
6
|
+
class Base
|
7
|
+
extend SingleForwardable
|
8
|
+
|
9
|
+
def_delegators :conn, :post, :get, :put, :delete
|
10
|
+
|
11
|
+
class << self
|
12
|
+
private
|
13
|
+
|
14
|
+
def conn
|
15
|
+
Bitodeme::Conn.build
|
16
|
+
end
|
17
|
+
|
18
|
+
def _find(collection, resource, id)
|
19
|
+
get("/api/v1/#{collection}/#{id}").body.fetch(resource, {}) || {}
|
20
|
+
end
|
21
|
+
|
22
|
+
def _all(collection, page: 1, per_page: 50, since: 0)
|
23
|
+
query_params = { page: page, per_page: per_page, since: since }
|
24
|
+
get("/api/v1/#{collection}", query_params).body.fetch(collection, [])
|
25
|
+
end
|
26
|
+
|
27
|
+
def _update(collection, resource, id, data)
|
28
|
+
put("/api/v1/#{collection}/#{id}", data).body.fetch(resource, data)
|
29
|
+
end
|
30
|
+
|
31
|
+
def _create(collection, resource, data)
|
32
|
+
post("/api/v1/#{collection}", data).body.fetch(resource, data)
|
33
|
+
end
|
34
|
+
|
35
|
+
def _delete(collection, id)
|
36
|
+
delete("/api/v1/#{collection}/#{id}").body
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_h
|
41
|
+
hash = {}
|
42
|
+
attrs.each do |attr|
|
43
|
+
val = instance_variable_get(:"@#{attr}")
|
44
|
+
hash[attr.to_sym] = val unless val.nil?
|
45
|
+
end
|
46
|
+
hash
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def initialize(attrs:, params:)
|
52
|
+
attrs.each do |attr|
|
53
|
+
instance_variable_set(
|
54
|
+
"@#{attr}",
|
55
|
+
params.fetch(attr.to_s, params.fetch(attr.to_sym, nil))
|
56
|
+
)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def attrs
|
61
|
+
methods - klass_methods - excluded_attrs
|
62
|
+
end
|
63
|
+
|
64
|
+
def klass_methods
|
65
|
+
self.class.methods - [:name]
|
66
|
+
end
|
67
|
+
|
68
|
+
def excluded_attrs
|
69
|
+
%i[to_h validate]
|
70
|
+
end
|
71
|
+
|
72
|
+
def raise_for(attr)
|
73
|
+
raise Bitodeme::ValidationError.new(attr, send(:"#{attr}"))
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Bitodeme
|
2
|
+
module Resource
|
3
|
+
# Currency resource
|
4
|
+
class Currency < Base
|
5
|
+
private_class_method :new
|
6
|
+
|
7
|
+
attr_reader :withdrawable,
|
8
|
+
:withdraw_fee,
|
9
|
+
:updated_at,
|
10
|
+
:name,
|
11
|
+
:min_withdrawable_amount,
|
12
|
+
:min_depositable_amount,
|
13
|
+
:exchangeable,
|
14
|
+
:depositable,
|
15
|
+
:deposit_fee,
|
16
|
+
:current_status,
|
17
|
+
:created_at,
|
18
|
+
:code
|
19
|
+
|
20
|
+
class << self
|
21
|
+
def all(options = {})
|
22
|
+
items = _all('currencies', options)
|
23
|
+
items.map { |item| new(item) }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def initialize(params)
|
30
|
+
super(attrs: attrs, params: params)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Bitodeme
|
2
|
+
module Resource
|
3
|
+
# Deposit resource
|
4
|
+
class Deposit < Base
|
5
|
+
private_class_method :new
|
6
|
+
|
7
|
+
attr_reader :id
|
8
|
+
|
9
|
+
class << self
|
10
|
+
PLURAL = 'deposits'.freeze
|
11
|
+
SINGULAR = 'deposit'.freeze
|
12
|
+
|
13
|
+
def all(options = {})
|
14
|
+
items = _all(PLURAL, options)
|
15
|
+
items.map { |item| new(item) }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def initialize(params)
|
22
|
+
super(attrs: attrs, params: params)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Bitodeme
|
2
|
+
module Resource
|
3
|
+
# Fund resource
|
4
|
+
class Fund < Base
|
5
|
+
private_class_method :new
|
6
|
+
|
7
|
+
attr_reader :account_id,
|
8
|
+
:amount,
|
9
|
+
:currency_code,
|
10
|
+
:current_status,
|
11
|
+
:id,
|
12
|
+
:updated_at
|
13
|
+
|
14
|
+
class << self
|
15
|
+
PLURAL = 'funds'.freeze
|
16
|
+
SINGULAR = 'fund'.freeze
|
17
|
+
|
18
|
+
def find(code)
|
19
|
+
item = _find(PLURAL, SINGULAR, code)
|
20
|
+
new(item)
|
21
|
+
end
|
22
|
+
|
23
|
+
def all(options = {})
|
24
|
+
items = _all(PLURAL, options)
|
25
|
+
items.map { |item| new(item) }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def initialize(params)
|
32
|
+
super(attrs: attrs, params: params)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Bitodeme
|
2
|
+
module Resource
|
3
|
+
# FundAddress resource
|
4
|
+
class FundAddress < Base
|
5
|
+
private_class_method :new
|
6
|
+
|
7
|
+
attr_reader :account_id,
|
8
|
+
:address,
|
9
|
+
:created_at,
|
10
|
+
:currency_code,
|
11
|
+
:current_status,
|
12
|
+
:fund_id,
|
13
|
+
:id,
|
14
|
+
:is_temporary,
|
15
|
+
:updated_at
|
16
|
+
|
17
|
+
class << self
|
18
|
+
PLURAL = 'fund_addresses'.freeze
|
19
|
+
SINGULAR = 'fund_address'.freeze
|
20
|
+
|
21
|
+
def find(code)
|
22
|
+
item = _find(PLURAL, SINGULAR, code)
|
23
|
+
new(item)
|
24
|
+
end
|
25
|
+
|
26
|
+
def all(options = {})
|
27
|
+
items = _all(PLURAL, options)
|
28
|
+
items.map { |item| new(item) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def initialize(params)
|
35
|
+
super(attrs: attrs, params: params)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module Bitodeme
|
2
|
+
module Resource
|
3
|
+
# Invoice resource
|
4
|
+
class Invoice < Base
|
5
|
+
private_class_method :new
|
6
|
+
|
7
|
+
attr_reader :account_id,
|
8
|
+
:address,
|
9
|
+
:amount,
|
10
|
+
:created_at,
|
11
|
+
:currency_code,
|
12
|
+
:current_status,
|
13
|
+
:deleted_at,
|
14
|
+
:description,
|
15
|
+
:external_id,
|
16
|
+
:id,
|
17
|
+
:name,
|
18
|
+
:original_amount,
|
19
|
+
:original_currency_code,
|
20
|
+
:purchasable,
|
21
|
+
:updated_at
|
22
|
+
|
23
|
+
class << self
|
24
|
+
PLURAL = 'invoices'.freeze
|
25
|
+
SINGULAR = 'invoice'.freeze
|
26
|
+
|
27
|
+
def build(params)
|
28
|
+
new(params).validate
|
29
|
+
end
|
30
|
+
|
31
|
+
def find(code)
|
32
|
+
item = _find(PLURAL, SINGULAR, code)
|
33
|
+
new(item)
|
34
|
+
end
|
35
|
+
|
36
|
+
def create(invoice)
|
37
|
+
raise_for('invoice', invoice) unless invoice.is_a?(Invoice)
|
38
|
+
item = _create(PLURAL, SINGULAR, invoice: invoice.to_h)
|
39
|
+
new(item)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def raise_for(attr, val)
|
45
|
+
raise Bitodeme::ValidationError.new(attr, val)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def validate
|
50
|
+
validate_original_amount
|
51
|
+
validate_original_currency_code
|
52
|
+
validate_external_id
|
53
|
+
validate_purchasable
|
54
|
+
self
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def validate_original_amount
|
60
|
+
return if /^\d{0,8}(\.\d{1,8})?$/.match?(original_amount.to_s)
|
61
|
+
raise_for('original_amount')
|
62
|
+
end
|
63
|
+
|
64
|
+
def validate_original_currency_code
|
65
|
+
return if /^[a-zA-Z]{3}$/.match?(original_currency_code.to_s)
|
66
|
+
raise_for('original_currency_code')
|
67
|
+
end
|
68
|
+
|
69
|
+
def validate_external_id
|
70
|
+
raise_for('external_id') unless external_id.is_a?(String)
|
71
|
+
end
|
72
|
+
|
73
|
+
def validate_purchasable
|
74
|
+
raise_for('purchasable') unless purchasable.is_a?(Hash)
|
75
|
+
end
|
76
|
+
|
77
|
+
def initialize(params)
|
78
|
+
super(attrs: attrs, params: params)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Bitodeme
|
2
|
+
module Resource
|
3
|
+
# TransactionLog resource
|
4
|
+
class TransactionLog < Base
|
5
|
+
private_class_method :new
|
6
|
+
|
7
|
+
attr_reader :account_id,
|
8
|
+
:amount,
|
9
|
+
:created_at,
|
10
|
+
:currency_code,
|
11
|
+
:current_status,
|
12
|
+
:description,
|
13
|
+
:fund_id,
|
14
|
+
:id,
|
15
|
+
:transactable_id,
|
16
|
+
:transactable_type,
|
17
|
+
:updated_at
|
18
|
+
|
19
|
+
class << self
|
20
|
+
PLURAL = 'transaction_logs'.freeze
|
21
|
+
SINGULAR = 'transaction_log'.freeze
|
22
|
+
|
23
|
+
def find(code)
|
24
|
+
item = _find(PLURAL, SINGULAR, code)
|
25
|
+
new(item)
|
26
|
+
end
|
27
|
+
|
28
|
+
def all(options = {})
|
29
|
+
items = _all(PLURAL, options)
|
30
|
+
items.map { |item| new(item) }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def initialize(params)
|
37
|
+
super(attrs: attrs, params: params)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Bitodeme
|
2
|
+
module Resource
|
3
|
+
# Withdrawal resource
|
4
|
+
class Withdrawal < Base
|
5
|
+
private_class_method :new
|
6
|
+
|
7
|
+
attr_reader :address,
|
8
|
+
:amount,
|
9
|
+
:fund_id,
|
10
|
+
:otp_value
|
11
|
+
|
12
|
+
class << self
|
13
|
+
PLURAL = 'withdrawals'.freeze
|
14
|
+
SINGULAR = 'withdrawal'.freeze
|
15
|
+
|
16
|
+
def build(params)
|
17
|
+
new(params).validate
|
18
|
+
end
|
19
|
+
|
20
|
+
def create(withdrawal)
|
21
|
+
raise_for('withdrawal') unless withdrawal.is_a?(Withdrawal)
|
22
|
+
item = _create(PLURAL, SINGULAR, withdrawal: withdrawal.to_h)
|
23
|
+
new(item)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def raise_for(attr, val)
|
29
|
+
raise Bitodeme::ValidationError.new(attr, val)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def validate
|
34
|
+
validate_address
|
35
|
+
validate_amount
|
36
|
+
validate_fund_id
|
37
|
+
validate_otp_value
|
38
|
+
self
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def initialize(params)
|
44
|
+
super(attrs: attrs, params: params)
|
45
|
+
end
|
46
|
+
|
47
|
+
def validate_address
|
48
|
+
raise_for('address') unless address.is_a?(String)
|
49
|
+
end
|
50
|
+
|
51
|
+
# TODO: Validate with UUID format
|
52
|
+
def validate_fund_id
|
53
|
+
raise_for('fund_id') unless fund_id.is_a?(String)
|
54
|
+
end
|
55
|
+
|
56
|
+
def validate_amount
|
57
|
+
raise_for('amount') unless /^\d{0,8}(\.\d{1,8})?$/.match?(amount.to_s)
|
58
|
+
end
|
59
|
+
|
60
|
+
def validate_otp_value
|
61
|
+
raise_for('otp_value') unless /^\d{6}$/.match?(otp_value.to_s)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/bitodeme/version.rb
CHANGED
data/lib/bitodeme.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'faraday'
|
3
3
|
require 'faraday_middleware'
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
4
|
+
require_relative 'bitodeme/version'
|
5
|
+
require_relative 'bitodeme/validation_error'
|
6
|
+
require_relative 'bitodeme/configuration'
|
7
|
+
require_relative 'bitodeme/auth'
|
8
|
+
require_relative 'bitodeme/conn'
|
9
|
+
require_relative 'bitodeme/resources/base'
|
10
|
+
require_relative 'bitodeme/resources/currency'
|
11
|
+
require_relative 'bitodeme/resources/deposit'
|
12
|
+
require_relative 'bitodeme/resources/fund'
|
13
|
+
require_relative 'bitodeme/resources/fund_address'
|
14
|
+
require_relative 'bitodeme/resources/invoice'
|
15
|
+
require_relative 'bitodeme/resources/transaction_log'
|
16
|
+
require_relative 'bitodeme/resources/withdrawal'
|
17
17
|
|
18
18
|
# Base module for Bitodome Client
|
19
19
|
module Bitodeme
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bitodeme
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bitodeme Integrations Team
|
@@ -25,61 +25,61 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.14'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: pry
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0.11'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0.11'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '10.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '10.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0
|
61
|
+
version: '3.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0
|
68
|
+
version: '3.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: simplecov
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0.
|
75
|
+
version: '0.15'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0.
|
82
|
+
version: '0.15'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: dotenv
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -139,6 +139,7 @@ files:
|
|
139
139
|
- ".rspec"
|
140
140
|
- ".travis.yml"
|
141
141
|
- Gemfile
|
142
|
+
- Gemfile.lock
|
142
143
|
- LICENSE.txt
|
143
144
|
- README.md
|
144
145
|
- Rakefile
|
@@ -146,6 +147,18 @@ files:
|
|
146
147
|
- bin/setup
|
147
148
|
- bitodeme.gemspec
|
148
149
|
- lib/bitodeme.rb
|
150
|
+
- lib/bitodeme/auth.rb
|
151
|
+
- lib/bitodeme/configuration.rb
|
152
|
+
- lib/bitodeme/conn.rb
|
153
|
+
- lib/bitodeme/resources/base.rb
|
154
|
+
- lib/bitodeme/resources/currency.rb
|
155
|
+
- lib/bitodeme/resources/deposit.rb
|
156
|
+
- lib/bitodeme/resources/fund.rb
|
157
|
+
- lib/bitodeme/resources/fund_address.rb
|
158
|
+
- lib/bitodeme/resources/invoice.rb
|
159
|
+
- lib/bitodeme/resources/transaction_log.rb
|
160
|
+
- lib/bitodeme/resources/withdrawal.rb
|
161
|
+
- lib/bitodeme/validation_error.rb
|
149
162
|
- lib/bitodeme/version.rb
|
150
163
|
homepage: https://github.com/bitodeme-integrations/bitodeme_rb
|
151
164
|
licenses:
|