coinrpc 1.0.3 → 3.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e6758d40043fc3414515ea9a7e9e772bb2a1e4fc4aa7fa29eff8e0b81d85254
4
- data.tar.gz: d9be85a33cc6844570370b8613a5067857ff10ae1646eed3bad7409a29d970a2
3
+ metadata.gz: a3493555e3ce9e403bbd0d884396b0c6ccf803f7757e8a6bbab45408df54dfc6
4
+ data.tar.gz: 35e3547a5fe14792629730f271c0e6148bae8be395f82b76ff5a49994629d299
5
5
  SHA512:
6
- metadata.gz: e6a72814efa91ef47cb65d4444b9fcaf870be25026b1e423b30603720d2b070ad2cee9899ba6f96e4c883c516257873e7e3d6cb0812e78f86acca06d377be713
7
- data.tar.gz: 7790d3f541b1d516e2c6e6285ee42acb63074731a9664059802cd0184a0f1ebc2b5e97d3dd297097e097a7e2813b13a4402aa1a55747daf6e1930b8862291efe
6
+ metadata.gz: 8849abd81ed97fadc7ce19778cef998b64536af4142cbf0e249d4eea777e386f565a5dc26ccb766cd78d670a627f8dc2b946880f8f24f122a474157b8d11b363
7
+ data.tar.gz: db827e4d80c96fc4dddcc79e1fea46c2f69aab1aa6afbad68222616c5c91ac21651d39a60853cb85024f22a8c0fbeae56d56c18f9a362b38f653862e06be3b7d
data/README.md CHANGED
@@ -6,7 +6,7 @@ A simple client for Bitcoin Core style RPC. Supports batch requests.
6
6
 
7
7
  Add this line to your application's Gemfile:
8
8
 
9
- gem 'coinrpc'
9
+ gem "coinrpc"
10
10
 
11
11
  And then execute:
12
12
 
@@ -19,7 +19,7 @@ Or install it yourself as:
19
19
  ## Usage
20
20
 
21
21
  ```
22
- require 'coinrpc'
22
+ require "coinrpc"
23
23
  client = CoinRPC::Client.new("http://username:password@hostname:port")
24
24
  puts client.getblockchaininfo
25
25
  ```
@@ -27,13 +27,13 @@ Or install it yourself as:
27
27
  Responses will contain coin values as BigDecimals:
28
28
 
29
29
  ```
30
- puts client.getrawtransaction(txid)['vout'].first['value'].to_s("F")
30
+ puts client.getrawtransaction(txid)["vout"].first["value"].to_s("F")
31
31
  ```
32
32
 
33
33
  ## Contributing
34
34
 
35
35
  1. Fork it ( https://github.com/doersf/coinrpc/fork )
36
36
  2. Create your feature branch (`git checkout -b my-new-feature`)
37
- 3. Commit your changes (`git commit -am 'Add some feature'`)
37
+ 3. Commit your changes (`git commit -am "Add some feature"`)
38
38
  4. Push to the branch (`git push origin my-new-feature`)
39
39
  5. Create a new Pull Request
data/coinrpc.gemspec CHANGED
@@ -1,6 +1,6 @@
1
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path("../lib", __FILE__)
2
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require 'coinrpc/version'
3
+ require "coinrpc/version"
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "coinrpc"
@@ -17,11 +17,11 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.required_ruby_version = ">= 2.4", "< 3.2"
20
+ spec.required_ruby_version = ">= 2.6", "< 3.2"
21
21
 
22
22
  spec.add_development_dependency "bundler", ">= 1.6", "< 3.0"
23
23
  spec.add_development_dependency "rake", ">= 13.0", "< 14.0"
24
24
  spec.add_runtime_dependency "json", "~> 2.0", ">= 2.3.1", "< 3.0"
25
25
  spec.add_runtime_dependency "oj", ">= 3.10", "< 4.0"
26
- spec.add_runtime_dependency "http", ">= 4.4", "< 5.1"
26
+ spec.add_runtime_dependency "typhoeus", ">= 1.0", "< 2.0"
27
27
  end
@@ -1,3 +1,3 @@
1
1
  module CoinRPC
2
- VERSION = "1.0.3"
2
+ VERSION = "3.0.0".freeze
3
3
  end
data/lib/coinrpc.rb CHANGED
@@ -1,69 +1,74 @@
1
- require 'http'
2
- require 'oj'
3
- require 'json'
4
- require 'coinrpc/version'
1
+ require "uri"
2
+ require "typhoeus"
3
+ require "oj"
4
+ require "json"
5
+ require "securerandom"
6
+ require "coinrpc/version"
5
7
 
6
8
  # let OJ mimic JSON
7
9
  Oj.mimic_JSON
8
10
 
9
11
  module CoinRPC
12
+
13
+ class TimeoutError < Exception; end
14
+ class UnsuccessfulError < Exception; end
15
+ class NoResponseError < Exception; end
16
+
10
17
  class Client
18
+
19
+ JSONRPC_V1_1 = "1.1".freeze
20
+ JSONRPC_V2_0 = "2.0".freeze
21
+ TIMEOUT = 60.freeze
22
+
11
23
  def initialize(url)
12
24
 
13
25
  urinfo = URI.parse(url)
14
26
 
15
- @client = HTTP.persistent("http://#{urinfo.host}:#{urinfo.port}").timeout(60).basic_auth({:user => urinfo.user, :pass => urinfo.password})
16
- @id = rand(1000000)
17
-
27
+ @options = {:timeout => TIMEOUT, :userpwd => "#{urinfo.user}:#{urinfo.password}", :headers => {"User-Agent" => "CoinRPC/#{CoinRPC::VERSION}"}}.freeze
28
+ @url = "http://#{urinfo.host}:#{urinfo.port}/".freeze
29
+
18
30
  end
19
-
31
+
32
+ def random_id
33
+ SecureRandom.hex(4).to_i(16)
34
+ end
35
+
20
36
  def method_missing(method, *args)
21
37
 
22
- @id += 1
23
-
24
38
  fixed_method = method.to_s.gsub(/\_/,"").freeze
25
-
26
39
  post_data = nil
27
40
 
28
- if args.first.is_a?(Array) and args.first.size > 0 then
41
+ if args[0].is_a?(Array) and args[0].size > 0 then
29
42
  # batch request
30
-
31
- post_data = []
32
-
33
- args.each do |arg|
34
- @id += 1
35
- post_data << ({:jsonrpc => "2.0", :method => fixed_method, :params => arg, :id => @id})
36
- end
37
-
43
+ post_data = args.map{|arg| {:jsonrpc => JSONRPC_V2_0, :method => fixed_method, :params => arg, :id => random_id} }
38
44
  else
39
-
40
- post_data = ({
41
- :method => fixed_method,
42
- :params => args,
43
- :jsonrpc => "1.1",
44
- :id => @id
45
- })
46
-
45
+ post_data = {:method => fixed_method, :params => args, :jsonrpc => JSONRPC_V1_1, :id => random_id}
47
46
  end
48
47
 
49
- return api_call(post_data)
48
+ api_call(post_data)
50
49
 
51
50
  end
52
51
 
53
52
  private
54
53
  def api_call(params)
55
54
 
56
- response = @client.post("/", :body => Oj.dump(params, mode: :compat)).to_s
55
+ response = Typhoeus::Request.post(@url, :body => Oj.dump(params, :mode => :compat), **@options)
56
+
57
+ raise CoinRPC::TimeoutError if response.timed_out?
58
+ raise CoinRPC::NoResponseError if response.code.eql?(0)
59
+ raise CoinRPC::UnsuccessfulError unless response.success?
57
60
 
58
61
  # this won't work without Oj.mimic_JSON
59
- result = Oj.strict_load(response, :decimal_class => BigDecimal)
62
+ result = Oj.strict_load(response.body, :decimal_class => BigDecimal)
60
63
 
61
- raise result['error']['message'] if !result.is_a?(Array) and result['error']
62
-
63
- return result['result'] if result.is_a?(Hash)
64
+ raise result["error"]["message"] if result.is_a?(Hash) and !result["error"].nil?
64
65
 
65
- # batch call
66
- return result.map{|r| r['result'] || r['error']}
66
+ if result.is_a?(Hash) then
67
+ result["result"]
68
+ else
69
+ # batch call
70
+ result.map{|r| r["result"] || r["error"]}
71
+ end
67
72
 
68
73
  end
69
74
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coinrpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Atif Nazir
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-26 00:00:00.000000000 Z
11
+ date: 2022-09-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -97,25 +97,25 @@ dependencies:
97
97
  - !ruby/object:Gem::Version
98
98
  version: '4.0'
99
99
  - !ruby/object:Gem::Dependency
100
- name: http
100
+ name: typhoeus
101
101
  requirement: !ruby/object:Gem::Requirement
102
102
  requirements:
103
103
  - - ">="
104
104
  - !ruby/object:Gem::Version
105
- version: '4.4'
105
+ version: '1.0'
106
106
  - - "<"
107
107
  - !ruby/object:Gem::Version
108
- version: '5.1'
108
+ version: '2.0'
109
109
  type: :runtime
110
110
  prerelease: false
111
111
  version_requirements: !ruby/object:Gem::Requirement
112
112
  requirements:
113
113
  - - ">="
114
114
  - !ruby/object:Gem::Version
115
- version: '4.4'
115
+ version: '1.0'
116
116
  - - "<"
117
117
  - !ruby/object:Gem::Version
118
- version: '5.1'
118
+ version: '2.0'
119
119
  description: This Ruby Gem is a fast RPC client for Bitcoin Core style software, including
120
120
  Dogecoin, Litecoin, and other similar software that implements Bitcoin Core RPC
121
121
  interfaces.
@@ -145,7 +145,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
145
145
  requirements:
146
146
  - - ">="
147
147
  - !ruby/object:Gem::Version
148
- version: '2.4'
148
+ version: '2.6'
149
149
  - - "<"
150
150
  - !ruby/object:Gem::Version
151
151
  version: '3.2'
@@ -155,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
155
  - !ruby/object:Gem::Version
156
156
  version: '0'
157
157
  requirements: []
158
- rubygems_version: 3.3.3
158
+ rubygems_version: 3.3.7
159
159
  signing_key:
160
160
  specification_version: 4
161
161
  summary: A fast RPC client for Bitcoin Core style software.