bitreserve 0.0.3 → 0.1.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.
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