bitreserve 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +3 -0
  4. data/.travis.yml +13 -0
  5. data/Gemfile +7 -1
  6. data/README.md +5 -0
  7. data/Rakefile +2 -3
  8. data/bitreserve.gemspec +2 -0
  9. data/lib/bitreserve.rb +16 -6
  10. data/lib/bitreserve/api.rb +22 -0
  11. data/lib/bitreserve/api/auth_token.rb +16 -0
  12. data/lib/bitreserve/api/card.rb +36 -0
  13. data/lib/bitreserve/api/contact.rb +34 -0
  14. data/lib/bitreserve/api/endpoints.rb +26 -0
  15. data/lib/bitreserve/api/private_transaction.rb +58 -0
  16. data/lib/bitreserve/api/public_transaction.rb +23 -0
  17. data/lib/bitreserve/api/ticker.rb +23 -0
  18. data/lib/bitreserve/api/transparency.rb +10 -0
  19. data/lib/bitreserve/api/user.rb +23 -0
  20. data/lib/bitreserve/client.rb +22 -0
  21. data/lib/bitreserve/entities/asset.rb +7 -0
  22. data/lib/bitreserve/entities/auth_token.rb +7 -0
  23. data/lib/bitreserve/entities/base_entity.rb +28 -0
  24. data/lib/bitreserve/entities/card.rb +8 -0
  25. data/lib/bitreserve/entities/contact.rb +7 -0
  26. data/lib/bitreserve/entities/phone.rb +7 -0
  27. data/lib/bitreserve/entities/ticker.rb +7 -0
  28. data/lib/bitreserve/entities/transaction.rb +7 -0
  29. data/lib/bitreserve/entities/user.rb +19 -0
  30. data/lib/bitreserve/helpers.rb +23 -0
  31. data/lib/bitreserve/request.rb +31 -14
  32. data/lib/bitreserve/request_data.rb +7 -0
  33. data/lib/bitreserve/version.rb +1 -1
  34. data/spec/fixtures/vcr_cassettes/me.yml +185 -0
  35. data/spec/fixtures/vcr_cassettes/me/card.yml +61 -0
  36. data/spec/fixtures/vcr_cassettes/me/cards.yml +67 -0
  37. data/spec/fixtures/vcr_cassettes/me/contact.yml +61 -0
  38. data/spec/fixtures/vcr_cassettes/me/contacts.yml +61 -0
  39. data/spec/fixtures/vcr_cassettes/me/created_card.yml +61 -0
  40. data/spec/fixtures/vcr_cassettes/me/created_contact.yml +61 -0
  41. data/spec/fixtures/vcr_cassettes/me/phones.yml +61 -0
  42. data/spec/fixtures/vcr_cassettes/me/transactions/cancel.yml +61 -0
  43. data/spec/fixtures/vcr_cassettes/me/transactions/commit.yml +62 -0
  44. data/spec/fixtures/vcr_cassettes/me/transactions/create.yml +61 -0
  45. data/spec/fixtures/vcr_cassettes/me/transactions/create_waiting_cancel.yml +118 -0
  46. data/spec/fixtures/vcr_cassettes/me/transactions/create_waiting_resend.yml +118 -0
  47. data/spec/fixtures/vcr_cassettes/me/transactions/resend.yml +61 -0
  48. data/spec/fixtures/vcr_cassettes/reserve/transaction.yml +60 -0
  49. data/spec/fixtures/vcr_cassettes/reserve/transactions.yml +60 -0
  50. data/spec/fixtures/vcr_cassettes/tickers.yml +60 -0
  51. data/spec/fixtures/vcr_cassettes/transparency.yml +60 -0
  52. data/spec/integration/api/card_spec.rb +47 -0
  53. data/spec/integration/api/contact_spec.rb +53 -0
  54. data/spec/integration/api/private_transactions_spec.rb +74 -0
  55. data/spec/integration/api/public_transaction_spec.rb +34 -0
  56. data/spec/integration/api/ticker_spec.rb +21 -0
  57. data/spec/integration/api/transparency_spec.rb +21 -0
  58. data/spec/integration/api/user_spec.rb +32 -0
  59. data/spec/spec_helper.rb +19 -1
  60. data/spec/support/vcr.rb +8 -0
  61. data/spec/support/webmock.rb +24 -0
  62. data/spec/unit/api/auth_spec.rb +22 -0
  63. data/spec/unit/api/card_spec.rb +47 -0
  64. data/spec/unit/api/contact_spec.rb +53 -0
  65. data/spec/unit/api/private_transaction_spec.rb +114 -0
  66. data/spec/unit/api/public_transaction_spec.rb +34 -0
  67. data/spec/unit/api/ticker_spec.rb +34 -0
  68. data/spec/unit/api/transparency_spec.rb +21 -0
  69. data/spec/unit/api/user_spec.rb +33 -0
  70. data/spec/unit/auth_request_spec.rb +32 -0
  71. data/spec/unit/client_spec.rb +23 -0
  72. data/spec/unit/entities/base_entity_spec.rb +32 -0
  73. data/spec/unit/entities/user_spec.rb +26 -0
  74. data/spec/unit/helper_spec.rb +37 -0
  75. data/spec/unit/request_spec.rb +58 -0
  76. metadata +136 -8
  77. data/lib/bitreserve/endpoints.rb +0 -5
  78. data/lib/bitreserve/ticker.rb +0 -7
  79. data/spec/request_spec.rb +0 -37
  80. data/spec/ticker_spec.rb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ee526dc2c85b5a22331440fb4b1f294ac4e9be57
4
- data.tar.gz: cc95b745aeeea4a0a72f5f6c0fe75cd44b1a977f
3
+ metadata.gz: 22fd7b702c886113b8b2c1c6e382721f4b0c84df
4
+ data.tar.gz: b24e3a7fb9626dbaab357683a2fb3645bac2d64a
5
5
  SHA512:
6
- metadata.gz: 912336aff96c4d53db4e625d16a6691cadb063523ede174e774c26f63fb36bd89099205181cf2d7f2d152547ba96dcb30d8e29bdb84ca383d10ffbd42fccec28
7
- data.tar.gz: 5195b5fce5850ad14487085f41db61219d39a5252189278fc731d9aad6cf19a10d113a3375e061ff1ce8b9aaa4be591a663f5142fe88f821d32f004a8145c3c9
6
+ metadata.gz: cd8989fe44205b5660954800ffd3b1934066d341e4d495e2fb0555bb28f3f8485d956d10eb224365d7417573b63c37d75c51621f2182fb96a9d7f36acc5b08d6
7
+ data.tar.gz: 2eb14790b044dce1b71264fc1267dbfde5637bf17042bc119aaecfb6f852190ee2a4b3361ac383f51925669a7f9657094958fb2d896294e63ede9caa202fd557
data/.gitignore CHANGED
@@ -12,3 +12,6 @@
12
12
  *.o
13
13
  *.a
14
14
  mkmf.log
15
+ .env
16
+ tags
17
+ .tags
data/.rubocop.yml CHANGED
@@ -27,5 +27,8 @@ Style/DotPosition:
27
27
  Style/IfUnlessModifier:
28
28
  Enabled: false
29
29
 
30
+ Style/MultilineOperationIndentation:
31
+ EnforcedStyle: indented
32
+
30
33
  Style/RegexpLiteral:
31
34
  MaxSlashes: 0
data/.travis.yml ADDED
@@ -0,0 +1,13 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.0
4
+ - 2.1.5
5
+ - 2.0.0
6
+ - ruby-head
7
+ - jruby-1.6.8
8
+ - rbx-2.2.10
9
+ matrix:
10
+ allow_failures:
11
+ - rvm: ruby-head
12
+ - rvm: jruby-1.6.8
13
+ - rvm: rbx-2.2.10
data/Gemfile CHANGED
@@ -1,4 +1,10 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in bitreserve.gemspec
4
3
  gemspec
4
+
5
+ gem 'pry'
6
+
7
+ group :test do
8
+ gem 'codeclimate-test-reporter', require: false
9
+ gem 'vcr'
10
+ end
data/README.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Bitreserve
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/bitreserve.svg)](http://badge.fury.io/rb/bitreserve)
4
+ [![Build Status](https://travis-ci.org/groupbuddies/bitreserve.svg?branch=master)](https://travis-ci.org/groupbuddies/bitreserve)
5
+ [![Code Climate](https://codeclimate.com/github/groupbuddies/bitreserve/badges/gpa.svg)](https://codeclimate.com/github/groupbuddies/bitreserve)
6
+ [![Test Coverage](https://codeclimate.com/github/groupbuddies/bitreserve/badges/coverage.svg)](https://codeclimate.com/github/groupbuddies/bitreserve)
7
+
3
8
  TODO: Write a gem description
4
9
 
5
10
  ## Installation
data/Rakefile CHANGED
@@ -5,11 +5,10 @@ RuboCop::RakeTask.new
5
5
  RSpec::Core::RakeTask.new(:spec)
6
6
 
7
7
  task :console do
8
- require 'irb'
9
- require 'irb/completion'
8
+ require 'pry'
10
9
  require 'bitreserve'
11
10
  ARGV.clear
12
- IRB.start
11
+ Pry.start
13
12
  end
14
13
 
15
14
  task default: [:rubocop, :spec]
data/bitreserve.gemspec CHANGED
@@ -18,8 +18,10 @@ Gem::Specification.new do |spec|
18
18
  spec.require_paths = ['lib']
19
19
 
20
20
  spec.add_dependency 'httparty', '>= 0.13.3'
21
+ spec.add_dependency 'dotenv'
21
22
 
22
23
  spec.add_development_dependency 'bundler', '~> 1.7'
24
+ spec.add_development_dependency 'climate_control'
23
25
  spec.add_development_dependency 'rake', '~> 10.0'
24
26
  spec.add_development_dependency 'rubocop', '~> 0.27.1'
25
27
  spec.add_development_dependency 'rspec', '~> 3.1.0'
data/lib/bitreserve.rb CHANGED
@@ -1,23 +1,33 @@
1
- require 'net/https'
2
1
  require 'logger'
3
2
  require 'httparty'
3
+ require 'dotenv'
4
+ Dotenv.load
4
5
 
5
6
  require 'bitreserve/version'
6
- require 'bitreserve/endpoints'
7
+ require 'bitreserve/client'
7
8
 
8
9
  module Bitreserve
9
- API_BASE = 'api.bitreserve.org'
10
+ API_BASE = 'https://api.bitreserve.org'
10
11
  ROOT_PATH = File.dirname(__FILE__)
11
12
 
12
13
  @api_base = API_BASE
13
- @api_port = Net::HTTP.https_default_port
14
14
  @api_version = 0
15
15
  @logger = Logger.new(STDOUT)
16
16
 
17
17
  class << self
18
- attr_accessor :api_base, :api_port, :api_version, :logger
18
+ attr_accessor :api_base, :api_version, :logger
19
19
  end
20
20
  end
21
21
 
22
+ require 'bitreserve/helpers'
22
23
  require 'bitreserve/request'
23
- require 'bitreserve/ticker'
24
+ require 'bitreserve/request_data'
25
+ require 'bitreserve/entities/base_entity'
26
+ require 'bitreserve/entities/asset'
27
+ require 'bitreserve/entities/auth_token'
28
+ require 'bitreserve/entities/card'
29
+ require 'bitreserve/entities/contact'
30
+ require 'bitreserve/entities/phone'
31
+ require 'bitreserve/entities/ticker'
32
+ require 'bitreserve/entities/transaction'
33
+ require 'bitreserve/entities/user'
@@ -0,0 +1,22 @@
1
+ require 'bitreserve/api/auth_token'
2
+ require 'bitreserve/api/card'
3
+ require 'bitreserve/api/contact'
4
+ require 'bitreserve/api/endpoints'
5
+ require 'bitreserve/api/private_transaction'
6
+ require 'bitreserve/api/public_transaction'
7
+ require 'bitreserve/api/ticker'
8
+ require 'bitreserve/api/transparency'
9
+ require 'bitreserve/api/user'
10
+
11
+ module Bitreserve
12
+ module API
13
+ include API::AuthToken
14
+ include API::Card
15
+ include API::Contact
16
+ include API::PrivateTransaction
17
+ include API::PublicTransaction
18
+ include API::Ticker
19
+ include API::Transparency
20
+ include API::User
21
+ end
22
+ end
@@ -0,0 +1,16 @@
1
+ module Bitreserve
2
+ module API
3
+ module AuthToken
4
+ def generate_access_token(username: '', password: '')
5
+ request_data = Bitreserve::RequestData.new(
6
+ Endpoints::AUTH,
7
+ Entities::AuthToken,
8
+ authorization_header,
9
+ nil,
10
+ username: username, password: password
11
+ )
12
+ AuthRequest.perform_with_object(:post, request_data)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,36 @@
1
+ module Bitreserve
2
+ module API
3
+ module Card
4
+ def all_cards
5
+ Request.perform_with_objects(:get, cards_request_data)
6
+ end
7
+
8
+ def find_card(id: nil)
9
+ Request.perform_with_object(:get, card_request_data(id))
10
+ end
11
+
12
+ def create_card(label: nil, currency: nil)
13
+ Request.perform_with_object(:post, cards_request_data(label: label, currency: currency))
14
+ end
15
+
16
+ private
17
+
18
+ def cards_request_data(payload = nil)
19
+ RequestData.new(
20
+ Endpoints::CARD,
21
+ Entities::Card,
22
+ authorization_header,
23
+ payload
24
+ )
25
+ end
26
+
27
+ def card_request_data(id)
28
+ RequestData.new(
29
+ Endpoints::CARD + "/#{id}",
30
+ Entities::Card,
31
+ authorization_header
32
+ )
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,34 @@
1
+ module Bitreserve
2
+ module API
3
+ module Contact
4
+ def all_contacts
5
+ request_data = RequestData.new(
6
+ Endpoints::USER_CONTACTS,
7
+ Entities::Contact,
8
+ authorization_header
9
+ )
10
+ Request.perform_with_objects(:get, request_data)
11
+ end
12
+
13
+ def find_contact(id: nil)
14
+ request_data = RequestData.new(
15
+ Endpoints::USER_CONTACTS + "/#{id}",
16
+ Entities::Contact,
17
+ authorization_header
18
+ )
19
+ Request.perform_with_object(:get, request_data)
20
+ end
21
+
22
+ def create_contact(**args)
23
+ request_data = RequestData.new(
24
+ Endpoints::USER_CONTACTS,
25
+ Entities::Contact,
26
+ authorization_header,
27
+ Bitreserve::Helpers.camelized_hash(args)
28
+ )
29
+
30
+ Request.perform_with_object(:post, request_data)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,26 @@
1
+ module Bitreserve
2
+ module Endpoints
3
+ AUTH = '/oauth2/tokens'
4
+ CARD = '/me/cards'
5
+ CARD_PRIVATE_TRANSACTIONS = CARD + '/:card/transactions'
6
+ COMMIT_TRANSACTION = CARD_PRIVATE_TRANSACTIONS + '/:id/commit'
7
+ CANCEL_TRANSACTION = CARD_PRIVATE_TRANSACTIONS + '/:id/cancel'
8
+ RESEND_TRANSACTION = CARD_PRIVATE_TRANSACTIONS + '/:id/resend'
9
+ USER_PRIVATE_TRANSACTIONS = '/me/transactions'
10
+ PUBLIC_TRANSACTIONS = '/reserve/transactions'
11
+ STATS = '/reserve/statistics'
12
+ TICKER = '/ticker'
13
+ TRANSACTIONS = '/reserve/transactions'
14
+ USER = '/me'
15
+ USER_CONTACTS = '/me/contacts'
16
+ USER_PHONES = '/me/phones'
17
+
18
+ def self.with_placeholders(endpoint, substitutions = {})
19
+ new_endpoint = endpoint.dup
20
+ substitutions.each_pair do |placeholder, substitute|
21
+ new_endpoint.gsub!(placeholder, substitute)
22
+ end
23
+ new_endpoint
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,58 @@
1
+ module Bitreserve
2
+ module API
3
+ module PrivateTransaction
4
+ def create_transaction(card_id: nil, currency: nil, amount: 0, destination: nil)
5
+ request_data = RequestData.new(
6
+ Endpoints.with_placeholders(Endpoints::CARD_PRIVATE_TRANSACTIONS, ':card' => card_id),
7
+ Entities::Transaction,
8
+ authorization_header,
9
+ card_id: card_id, denomination: { currency: currency, amount: amount }, destination: destination
10
+ )
11
+ Request.perform_with_object(:post, request_data)
12
+ end
13
+
14
+ def commit_transaction(card_id: nil, transaction_id: nil)
15
+ request_data = transaction_request_data(Endpoints::COMMIT_TRANSACTION, card_id, transaction_id)
16
+ Request.perform_with_object(:post, request_data)
17
+ end
18
+
19
+ def cancel_transaction(card_id: nil, transaction_id: nil)
20
+ request_data = transaction_request_data(Endpoints::CANCEL_TRANSACTION, card_id, transaction_id)
21
+ Request.perform_with_object(:post, request_data)
22
+ end
23
+
24
+ def resend_transaction(card_id: nil, transaction_id: nil)
25
+ request_data = transaction_request_data(Endpoints::RESEND_TRANSACTION, card_id, transaction_id)
26
+ Request.perform_with_object(:post, request_data)
27
+ end
28
+
29
+ def all_user_transactions
30
+ request_data = RequestData.new(
31
+ Endpoints::USER_PRIVATE_TRANSACTIONS,
32
+ Entities::Transaction,
33
+ authorization_header
34
+ )
35
+ Request.perform_with_objects(:get, request_data)
36
+ end
37
+
38
+ def all_card_transactions(card_id: nil)
39
+ request_data = RequestData.new(
40
+ Endpoints.with_placeholders(Endpoints::CARD_PRIVATE_TRANSACTIONS, ':card' => card_id),
41
+ Entities::Transaction,
42
+ authorization_header
43
+ )
44
+ Request.perform_with_objects(:get, request_data)
45
+ end
46
+
47
+ private
48
+
49
+ def transaction_request_data(endpoint, card_id, transaction_id)
50
+ RequestData.new(
51
+ Endpoints.with_placeholders(endpoint, ':card' => card_id, ':id' => transaction_id),
52
+ Entities::Transaction,
53
+ authorization_header
54
+ )
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,23 @@
1
+ module Bitreserve
2
+ module API
3
+ module PublicTransaction
4
+ def all_public_transactions
5
+ request_data = RequestData.new(
6
+ Endpoints::PUBLIC_TRANSACTIONS,
7
+ Entities::Transaction,
8
+ authorization_header
9
+ )
10
+ Request.perform_with_objects(:get, request_data)
11
+ end
12
+
13
+ def find_public_transaction(id: id)
14
+ request_data = RequestData.new(
15
+ Endpoints::PUBLIC_TRANSACTIONS + "/#{id}",
16
+ Entities::Transaction,
17
+ authorization_header
18
+ )
19
+ Request.perform_with_object(:get, request_data)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ module Bitreserve
2
+ module API
3
+ module Ticker
4
+ def all_tickers
5
+ request_data = RequestData.new(
6
+ Endpoints::TICKER,
7
+ Entities::Ticker,
8
+ authorization_header
9
+ )
10
+ Request.perform_with_objects(:get, request_data)
11
+ end
12
+
13
+ def find_ticker(currency: nil)
14
+ request_data = RequestData.new(
15
+ Endpoints::TICKER + "/#{currency}",
16
+ Entities::Ticker,
17
+ authorization_header
18
+ )
19
+ Request.perform_with_objects(:get, request_data)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,10 @@
1
+ module Bitreserve
2
+ module API
3
+ module Transparency
4
+ def statistics
5
+ request_data = RequestData.new(Endpoints::STATS, Entities::Asset, authorization_header)
6
+ Request.perform_with_objects(:get, request_data)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,23 @@
1
+ module Bitreserve
2
+ module API
3
+ module User
4
+ def me
5
+ request_data = RequestData.new(
6
+ Endpoints::USER,
7
+ Entities::User,
8
+ authorization_header
9
+ )
10
+ Request.perform_with_object(:get, request_data)
11
+ end
12
+
13
+ def phones
14
+ request_data = RequestData.new(
15
+ Endpoints::USER_PHONES,
16
+ Entities::Phone,
17
+ authorization_header
18
+ )
19
+ Request.perform_with_objects(:get, request_data)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ require 'bitreserve/api'
2
+
3
+ module Bitreserve
4
+ class Client
5
+ include API
6
+ attr_reader :bearer_token
7
+
8
+ def initialize(token: ENV['BITRESERVE_AUTH_TOKEN'])
9
+ @bearer_token = token
10
+ end
11
+
12
+ def bearer_token?
13
+ !bearer_token.nil?
14
+ end
15
+
16
+ def authorization_header
17
+ return {} unless bearer_token?
18
+
19
+ { 'Authorization' => "Bearer #{bearer_token}" }
20
+ end
21
+ end
22
+ end