bloopi 0.1.7

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d857610acc3057255b0ed79488f64254cc3cad5d
4
+ data.tar.gz: 1694c4a7969aa2b15c5fd844230eeef983781d9b
5
+ SHA512:
6
+ metadata.gz: eaa2fa45a7f9b2f3b146fe5efeb14ca096c81ec3147d9f8c3d7db5a15f741fafd1840391eebf7c62e6bb22c4b4c3052018f16952333366411763adb9c3bb5e39
7
+ data.tar.gz: cd76ba70980c5023f328b22377875af905b9c8df1ad6c48c1452401b2770b9d85aa290a8089cd930483067027dac6aacfaf9890943991d4f3696cec36ea76494
data/lib/blupee.rb ADDED
@@ -0,0 +1,28 @@
1
+ require_relative "blupee/version"
2
+ require_relative 'blupee/errors'
3
+ require_relative "blupee/configuration"
4
+ require_relative "blupee/http_service"
5
+ require_relative "blupee/http_service/request"
6
+ require_relative "blupee/http_service/response"
7
+ require_relative "blupee/api/auth"
8
+ require_relative "blupee/api/ether"
9
+ require_relative "blupee/api/omise_go"
10
+ require_relative "blupee/api/token"
11
+
12
+ module Blupee
13
+
14
+ class << self
15
+ def configure
16
+ yield config
17
+ end
18
+
19
+ # See Blupee::Configuration.
20
+ def config
21
+ @config ||= Configuration.new
22
+ end
23
+ end
24
+
25
+ def self.make_request(path, args, verb, options = {})
26
+ HTTPService.make_request(HTTPService::Request.new(path: path, args: args, verb: verb, options: options))
27
+ end
28
+ end
@@ -0,0 +1,84 @@
1
+ # OpenSSL and Base64 are required to support signed_request
2
+ require 'openssl'
3
+ require 'base64'
4
+
5
+ module Blupee
6
+ module API
7
+ class Auth
8
+ attr_reader :client_id, :client_secret
9
+
10
+ # Creates a new client.
11
+ #
12
+ # @param client_id [String, Integer] a Blupee client ID
13
+ # @param client_secret a Blupee client secret
14
+ def initialize(client_id = nil, client_secret = nil)
15
+ @client_id = client_id || Blupee.config.client_id
16
+ @client_secret = client_secret || Blupee.config.client_secret
17
+ end
18
+
19
+ # access tokens
20
+
21
+ # Fetches an access token, token expiration, and other info from Blupee.
22
+ # Useful when you've received an OAuth code using the server-side authentication process.
23
+ # @see url_for_oauth_code
24
+ #
25
+ # @note (see #url_for_oauth_code)
26
+ #
27
+ # @param code (see #url_for_access_token)
28
+ # @param options any additional parameters to send to Blupee when redeeming the token
29
+ #
30
+ # @raise Blupee::OAuthTokenRequestError if Blupee returns an error response
31
+ #
32
+ # @return a hash of the access token info returned by Blupee (token, expiration, etc.)
33
+ def get_access_token_info(options = {})
34
+ # convenience method to get a the application's sessionless access token
35
+ get_token_from_server({}, true, options)
36
+ end
37
+
38
+ # Fetches the application's access token (ignoring expiration and other info).
39
+ # @see get_app_access_token_info
40
+ #
41
+ # @param (see #get_app_access_token_info)
42
+ #
43
+ # @return the application access token
44
+ def get_access_token(options = {})
45
+ if info = get_access_token_info(options)
46
+ Blupee.config.access_token = info["access_token"]
47
+ end
48
+ end
49
+
50
+ protected
51
+
52
+ def get_token_from_server(args, post = false, options = {})
53
+ # fetch the result from Blupee's servers
54
+ response = fetch_token_string(args, post, "auth", options)
55
+ parse_access_token(response)
56
+ end
57
+
58
+ def parse_access_token(response_text)
59
+ JSON.parse(response_text)
60
+ rescue JSON::ParserError
61
+ response_text.split("&").inject({}) do |hash, bit|
62
+ key, value = bit.split("=")
63
+ hash.merge!(key => value)
64
+ end
65
+ end
66
+
67
+
68
+ def fetch_token_string(args, post = false, endpoint = "auth", options = {})
69
+ raise ClientError if @client_id == nil
70
+ raise ClientError if @client_secret == nil
71
+ response = Blupee.make_request("/#{endpoint}", {
72
+ :client_id => @client_id,
73
+ :client_secret => @client_secret
74
+ }.merge!(args), post ? "post" : "get", {:use_ssl => true, format: :json}.merge!(options))
75
+
76
+ raise ServerError.new(response.status, response.body) if response.status >= 500
77
+ raise OAuthTokenRequestError.new(response.status, response.body) if response.status >= 400
78
+
79
+ response.body
80
+ end
81
+
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,51 @@
1
+ require 'faraday'
2
+ require 'json'
3
+
4
+ module Blupee
5
+ module API
6
+ class Ether
7
+ attr_reader :coin_symbol, :balance, :wallet, :transaction_hash
8
+
9
+ def initialize(attributes)
10
+ @coin_symbol = attributes["coin_symbol"]
11
+ @balance = attributes["balance"]
12
+ @wallet_address = attributes["wallet_address"]
13
+ end
14
+
15
+ # {:wallet_address=>""}
16
+ def self.balance(args, options = {})
17
+ wallet_address = args[:wallet_address]
18
+ response = Blupee.make_request("/eth/#{wallet_address}", {}, "get", {:use_ssl => true}.merge!(options))
19
+ raise ServerError.new(response.status, response.body) if response.status >= 500
20
+ raise OAuthTokenRequestError.new(response.status, response.body) if response.status >= 400
21
+ response
22
+ end
23
+
24
+
25
+ def self.new_wallet(args, options = {})
26
+ response = Blupee.make_request("/eth/new",
27
+ {}.merge!(args),
28
+ "post",
29
+ {:use_ssl => true,
30
+ format: :json}.merge!(options))
31
+ raise ServerError.new(response.status, response.body) if response.status >= 500
32
+ raise OAuthTokenRequestError.new(response.status, response.body) if response.status >= 400
33
+ response
34
+ end
35
+
36
+ # {:to_address=>"", :from_address=>"", :password=>"", :quantity=>0.001}
37
+ def self.transfer(args, options = {})
38
+ response = Blupee.make_request("/eth/send",
39
+ {}.merge!(args),
40
+ "post",
41
+ {:use_ssl => true,
42
+ format: :json}.merge!(options))
43
+
44
+ raise ServerError.new(response.status, response.body) if response.status >= 500
45
+ raise OAuthTokenRequestError.new(response.status, response.body) if response.status >= 400
46
+ response
47
+ end
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,38 @@
1
+ require 'faraday'
2
+ require 'json'
3
+
4
+ module Blupee
5
+ module API
6
+ class OmiseGo
7
+ attr_reader :coin_symbol, :balance, :wallet, :transaction_hash
8
+
9
+ def initialize(attributes)
10
+ @coin_symbol = attributes["coin_symbol"]
11
+ @balance = attributes["balance"]
12
+ @wallet_address = attributes["wallet_address"]
13
+ end
14
+
15
+ # {:wallet_address=>""}
16
+ def self.balance(args, options = {})
17
+ wallet_address = args[:wallet_address]
18
+ response = Blupee.make_request("/omg/#{wallet_address}", {}, "get", {:use_ssl => true}.merge!(options))
19
+ raise ServerError.new(response.status, response.body) if response.status >= 500
20
+ raise OAuthTokenRequestError.new(response.status, response.body) if response.status >= 400
21
+ response
22
+ end
23
+
24
+ # {:to_address=>"", :from_address=>"", :password=>"", :quantity=>0.001}
25
+ def self.transfer(args, options = {})
26
+ response = Blupee.make_request("/omg/send",
27
+ {}.merge!(args),
28
+ "post",
29
+ {:use_ssl => true,
30
+ format: :json}.merge!(options))
31
+
32
+ raise ServerError.new(response.status, response.body) if response.status >= 500
33
+ raise OAuthTokenRequestError.new(response.status, response.body) if response.status >= 400
34
+ response
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,39 @@
1
+ require 'faraday'
2
+ require 'json'
3
+
4
+ module Blupee
5
+ module API
6
+ class Token
7
+ attr_reader :coin_symbol, :balance, :wallet, :transaction_hash
8
+
9
+ def initialize(attributes)
10
+ @coin_symbol = attributes["coin_symbol"]
11
+ @balance = attributes["balance"]
12
+ @wallet_address = attributes["wallet_address"]
13
+ end
14
+
15
+ # {:contract_id=>"", :wallet_address=>""}
16
+ def self.balance(args, options = {})
17
+ contract_id = args[:contract_id]
18
+ wallet_address = args[:wallet_address]
19
+ response = Blupee.make_request("/token/#{contract_id}/#{wallet_address}", {}, "get", {:use_ssl => true}.merge!(options))
20
+ raise ServerError.new(response.status, response.body) if response.status >= 500
21
+ raise OAuthTokenRequestError.new(response.status, response.body) if response.status >= 400
22
+ response
23
+ end
24
+
25
+ # {:to_address=>"", :from_address=>"", :password=>"", :quantity=>0.001, :contract_address=>""}
26
+ def self.transfer(args, options = {})
27
+ response = Blupee.make_request("/token/send",
28
+ {}.merge!(args),
29
+ "post",
30
+ {:use_ssl => true,
31
+ format: :json}.merge!(options))
32
+
33
+ raise ServerError.new(response.status, response.body) if response.status >= 500
34
+ raise OAuthTokenRequestError.new(response.status, response.body) if response.status >= 400
35
+ response
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,20 @@
1
+ # Global configuration for Blupee.
2
+ class Blupee::Configuration
3
+ # The default access token to be used if none is otherwise supplied.
4
+ attr_accessor :access_token
5
+
6
+ # The default client secret value to be used if none is otherwise supplied.
7
+ attr_accessor :client_secret
8
+
9
+ # The default client ID to use if none is otherwise supplied.
10
+ attr_accessor :client_id
11
+
12
+ attr_accessor :api_server
13
+
14
+ attr_accessor :api_version
15
+
16
+ def initialize
17
+ self.api_server = "api.blupee.io"
18
+ self.api_version = "v1"
19
+ end
20
+ end
@@ -0,0 +1,100 @@
1
+ module Blupee
2
+
3
+ class BlupeeError < StandardError; end
4
+
5
+ module API
6
+
7
+ # The OAuth signature is incomplete, invalid, or using an unsupported algorithm
8
+ class OAuthSignatureError < ::Blupee::BlupeeError; end
9
+
10
+ # Required for realtime updates validation
11
+ class AppSecretNotDefinedError < ::Blupee::BlupeeError; end
12
+
13
+ # Facebook responded with an error to an API request. If the exception contains a nil
14
+ # http_status, then the error was detected before making a call to Facebook. (e.g. missing access token)
15
+ class APIError < ::Blupee::BlupeeError
16
+ attr_accessor :http_status,
17
+ :response_body,
18
+ :error_type,
19
+ :error_code,
20
+ :error_subcode,
21
+ :error_message,
22
+ :error_user_msg,
23
+ :error_user_title,
24
+ :error_trace_id,
25
+ :error_debug,
26
+ :error_rev
27
+
28
+ # Create a new API Error
29
+ #
30
+ # @param http_status [Integer] The HTTP status code of the response
31
+ # @param response_body [String] The response body
32
+ # @param error_info One of the following:
33
+ # [Hash] The error information extracted from the request
34
+ # ("type", "code", "error_subcode", "message")
35
+ # [String] The error description
36
+ # If error_info is nil or not provided, the method will attempt to extract
37
+ # the error info from the response_body
38
+ #
39
+ # @return the newly created APIError
40
+ def initialize(http_status, response_body, error_info = nil)
41
+ if response_body
42
+ self.response_body = response_body.strip
43
+ else
44
+ self.response_body = ''
45
+ end
46
+ self.http_status = http_status
47
+
48
+ if error_info && error_info.is_a?(String)
49
+ message = error_info
50
+ else
51
+ unless error_info
52
+ begin
53
+ error_info = JSON.parse(response_body)['error'] if response_body
54
+ rescue
55
+ end
56
+ error_info ||= {}
57
+ end
58
+
59
+ self.error_type = error_info["type"]
60
+ self.error_message = error_info["message"]
61
+
62
+ self.error_trace_id = error_info["x-blu-trace-id"]
63
+ self.error_debug = error_info["x-blu-debug"]
64
+ self.error_rev = error_info["x-blu-rev"]
65
+
66
+ error_array = []
67
+ %w(type code error_subcode message error_user_title error_user_msg x-blu-trace-id).each do |key|
68
+ error_array << "#{key}: #{error_info[key]}" if error_info[key]
69
+ end
70
+
71
+ if error_array.empty?
72
+ message = self.response_body
73
+ else
74
+ message = error_array.join(', ')
75
+ end
76
+ end
77
+ message += " [HTTP #{http_status}]" if http_status
78
+
79
+ super(message)
80
+ end
81
+ end
82
+
83
+ # Facebook returned an invalid response body
84
+ class BadBlupeeAPIResponse < APIError; end
85
+
86
+ # Facebook responded with an error while attempting to request an access token
87
+ class OAuthTokenRequestError < APIError; end
88
+
89
+ # Any error with a 5xx HTTP status code
90
+ class ServerError < APIError; end
91
+
92
+ # Any error with a 4xx HTTP status code
93
+ class ClientError < APIError; end
94
+
95
+ # All graph API authentication failures.
96
+ class AuthenticationError < ClientError; end
97
+
98
+ end
99
+
100
+ end
@@ -0,0 +1,65 @@
1
+ require 'faraday'
2
+ require_relative 'http_service/request'
3
+ require_relative 'http_service/response'
4
+
5
+ module Blupee
6
+ module HTTPService
7
+ class << self
8
+ # A customized stack of Faraday middleware that will be used to make each request.
9
+ attr_accessor :faraday_middleware
10
+ attr_accessor :http_options
11
+ end
12
+
13
+ @http_options ||= {}
14
+
15
+ # Blupee's default middleware stack.
16
+ # and use whichever adapter has been configured for this application.
17
+ DEFAULT_MIDDLEWARE = Proc.new do |builder|
18
+ builder.request :url_encoded
19
+ builder.adapter Faraday.default_adapter
20
+ end
21
+
22
+ # Makes a request directly to Blupee.
23
+ # @note You'll rarely need to call this method directly.
24
+ #
25
+ #
26
+ # @param request a Blupee::HTTPService::Request object
27
+ #
28
+ # @raise an appropriate connection error if unable to make the request to Blupee
29
+ #
30
+ # @return [Blupee::HTTPService::Response] a response object representing the results from Blupee
31
+ def self.make_request(request)
32
+ # set up our Faraday connection
33
+ conn = Faraday.new(request.server, faraday_options(request.options), &(faraday_middleware || DEFAULT_MIDDLEWARE))
34
+ if request.verb == "post" && request.json?
35
+ # JSON requires a bit more handling
36
+ # remember, all non-GET requests are turned into POSTs, so this covers everything but GETs
37
+ response = conn.post do |req|
38
+ req.path = request.path
39
+ req.headers["Content-Type"] = "application/json"
40
+ req.headers['Bearer'] = Blupee.config.access_token if Blupee.config.access_token
41
+ req.body = request.post_args.to_json
42
+ req
43
+ end
44
+ else
45
+ # response = conn.send(request.verb, request.path, request.post_args)
46
+ response = conn.get do |req|
47
+ req.path = request.path
48
+ req.headers['Bearer'] = Blupee.config.access_token if Blupee.config.access_token
49
+ end
50
+ end
51
+
52
+ # Log URL information
53
+ # Blupee::Utils.debug "#{request.verb.upcase}: #{request.path} params: #{request.raw_args.inspect}"
54
+ Blupee::HTTPService::Response.new(response.status.to_i, response.body, response.headers)
55
+ end
56
+
57
+
58
+ private
59
+
60
+ def self.faraday_options(options)
61
+ valid_options = [:request, :proxy, :ssl, :builder, :url, :parallel_manager, :params, :headers, :builder_class]
62
+ Hash[ options.select { |key,value| valid_options.include?(key) } ]
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,101 @@
1
+ module Blupee
2
+ module HTTPService
3
+ class Request
4
+ attr_reader :raw_path, :raw_args, :raw_verb, :raw_options
5
+
6
+ # @param path the server path for this request
7
+ # @param args
8
+ # @param verb the HTTP method to use.
9
+ # If not get or post, this will be turned into a POST request with the appropriate :method
10
+ # specified in the arguments.
11
+ # @param options various flags to indicate which server to use.
12
+ # @param options
13
+ # @option options :use_ssl force https, even if not needed
14
+ # @option options :json whether or not to send JSON to Blupee
15
+ def initialize(path: path, verb: verb, args: {}, options: {})
16
+ @raw_path = path
17
+ @raw_args = args
18
+ @raw_verb = verb
19
+ @raw_options = options
20
+ end
21
+
22
+ # Determines which type of request to send to Blupee. Blupee natively accepts GETs and POSTs, for others we have to include the method in the post body.
23
+ #
24
+ # @return one of get or post
25
+ def verb
26
+ ["get", "post"].include?(raw_verb) ? raw_verb : "post"
27
+ end
28
+
29
+ # Determines the path to be requested on Blupee, incorporating an API version if specified.
30
+ #
31
+ # @return the original path, with API version if appropriate.
32
+ def path
33
+ # if an api_version is specified and the path does not already contain
34
+ # one, prepend it to the path
35
+ api_version = raw_options[:api_version] || Blupee.config.api_version
36
+ "/#{api_version}/#{raw_path}"
37
+ end
38
+
39
+ # Determines any arguments to be sent in a POST body.
40
+ #
41
+ # @return {} for GET; the provided args for POST; those args with the method parameter for
42
+ # other values
43
+ def post_args
44
+ if raw_verb == "get"
45
+ {}
46
+ elsif raw_verb == "post"
47
+ args
48
+ else
49
+ args.merge(method: raw_verb)
50
+ end
51
+ end
52
+
53
+ def get_args
54
+ raw_verb == "get" ? args : {}
55
+ end
56
+
57
+ # Calculates a set of request options to pass to Faraday.
58
+ #
59
+ # @return a hash combining GET parameters (if appropriate), default options, and
60
+ # any specified for the request.
61
+ def options
62
+ # figure out our options for this request
63
+ add_ssl_options(
64
+ # for GETs, we pass the params to Faraday to encode
65
+ {params: get_args}.merge(HTTPService.http_options).merge(raw_options)
66
+ )
67
+ end
68
+
69
+ # Whether or not this request should use JSON.
70
+ #
71
+ # @return true or false
72
+ def json?
73
+ raw_options[:format] == :json
74
+ end
75
+
76
+ # The address of the appropriate Blupee server.
77
+ #
78
+ # @return a complete server address with protocol
79
+ def server
80
+ uri = "#{options[:use_ssl] ? "https" : "http"}://#{Blupee.config.api_server}"
81
+ end
82
+
83
+ protected
84
+
85
+ # The arguments to include in the request.
86
+ def args
87
+ raw_args
88
+ end
89
+
90
+ def add_ssl_options(opts)
91
+ # require https if there's a token
92
+ return opts unless raw_args["access_token"]
93
+
94
+ {
95
+ use_ssl: true,
96
+ ssl: {verify: true}.merge(opts[:ssl] || {})
97
+ }.merge(opts)
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,20 @@
1
+ module Blupee
2
+ module HTTPService
3
+ class Response
4
+ attr_reader :status, :body, :headers
5
+
6
+ # Creates a new Response object, which standardizes the response received by Blupee API for use within Blupee.
7
+ def initialize(status, body, headers)
8
+ @status = status
9
+ @body = body
10
+ @headers = headers
11
+ end
12
+
13
+ def data
14
+ # quirks_mode is needed because Blupee sometimes returns a raw true or false value --
15
+ # in Ruby 2.4 we can drop that.
16
+ @data ||= JSON.parse(body, quirks_mode: true) unless body.empty?
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,3 @@
1
+ module Blupee
2
+ VERSION = "0.1.7"
3
+ end
metadata ADDED
@@ -0,0 +1,203 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bloopi
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.7
5
+ platform: ruby
6
+ authors:
7
+ - Blupee Inc.
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-11-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 10.4.2
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 12.0.1
37
+ type: :development
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: 10.4.2
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 12.0.1
47
+ - !ruby/object:Gem::Dependency
48
+ name: minitest
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 5.8.3
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 5.10.2
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: 5.8.3
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 5.10.2
67
+ - !ruby/object:Gem::Dependency
68
+ name: vcr
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: 3.0.0
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: 3.0.3
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: 3.0.0
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: 3.0.3
87
+ - !ruby/object:Gem::Dependency
88
+ name: pry
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: 0.10.0
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 0.10.9
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.10.0
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: 0.10.9
107
+ - !ruby/object:Gem::Dependency
108
+ name: webmock
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: 3.1.0
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: 3.1.9
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: 3.1.0
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: 3.1.9
127
+ - !ruby/object:Gem::Dependency
128
+ name: faraday
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: 0.11.0
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: 0.11.0
141
+ - !ruby/object:Gem::Dependency
142
+ name: json
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: '1.8'
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: 1.8.3
151
+ type: :runtime
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - "~>"
156
+ - !ruby/object:Gem::Version
157
+ version: '1.8'
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: 1.8.3
161
+ description: Ethereum, OmiseGo, ERC20 API
162
+ email:
163
+ - admin@blupee.io
164
+ executables: []
165
+ extensions: []
166
+ extra_rdoc_files: []
167
+ files:
168
+ - lib/blupee.rb
169
+ - lib/blupee/api/auth.rb
170
+ - lib/blupee/api/ether.rb
171
+ - lib/blupee/api/omise_go.rb
172
+ - lib/blupee/api/token.rb
173
+ - lib/blupee/configuration.rb
174
+ - lib/blupee/errors.rb
175
+ - lib/blupee/http_service.rb
176
+ - lib/blupee/http_service/request.rb
177
+ - lib/blupee/http_service/response.rb
178
+ - lib/blupee/version.rb
179
+ homepage: https://github.com/fogonthedowns/blupee_ruby
180
+ licenses:
181
+ - MIT
182
+ metadata: {}
183
+ post_install_message:
184
+ rdoc_options: []
185
+ require_paths:
186
+ - lib
187
+ required_ruby_version: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ required_rubygems_version: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - ">="
195
+ - !ruby/object:Gem::Version
196
+ version: '0'
197
+ requirements: []
198
+ rubyforge_project:
199
+ rubygems_version: 2.6.13
200
+ signing_key:
201
+ specification_version: 4
202
+ summary: Gem to wrap Bloopi Ethereum API
203
+ test_files: []