bitcoiner 0.1.4 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c8b326189cb7c4f1e425fd8dfcd12f97783e037e1abffbe7d5eb4368ffb42224
4
- data.tar.gz: dd6fecf9b9c01128978787faeff03ce729bb7251541806ccc96fa5183c36a577
3
+ metadata.gz: b4a84139151cf83af5599d9d7aad6cfbff0c40e2e183fcc5d39e00115093eb45
4
+ data.tar.gz: b54b667929c479018b2831f5b6be02316abbbbbe9fd75a1fad83c9b3a12891f0
5
5
  SHA512:
6
- metadata.gz: 4ee8f5ad16d9267c87bb9cd4bc88332a807682f5243c707729e7ad16e57a275ffd55e2639cec64b04533ebc7f8e3edbb1bb7cb4a1addd7320e8ad18fdedbd49a
7
- data.tar.gz: d48a75b3f378c77de02fb8f4c0f95291a5bc6b27750a0d364182312c126ca16a20ddee19b8128c74cdb967407562df8d72198aa1265a5a0f02a400a9488acb3d
6
+ metadata.gz: 05545c028dfdcca567226137d98b3a99fbf090d356839b053d305ee0b9f73176cc10b432598a0c72cf16a0028592c7b60ae8feefd8d865ec616f547da0698645
7
+ data.tar.gz: 322bf855b007f5b7c4a94dc3e4b5f51d580a7a94463b06e799d0e8cb7e3d3da354a9b9ab0094b70df8d03d5d40eff194ca0f56c8e6b3b853fd20a8213a30420d
@@ -1,5 +1,5 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.4.2
5
- before_install: gem install bundler -v 1.16.1
4
+ - 2.6.0
5
+ before_install: gem install bundler -v 2.0.2
@@ -0,0 +1,9 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [0.2.0]
8
+ ### Added
9
+ - Log requests if logger is set
data/README.md CHANGED
@@ -88,6 +88,17 @@ tiny_wings.address
88
88
  # => "1KV5khnHbbHF2nNQkk7Pe5nPndEj43U27r"
89
89
  ```
90
90
 
91
+ ### Logging
92
+
93
+ You may log requests (responses aren't logged) by setting a logger:
94
+
95
+ ```
96
+ logger = Logger.new(STDOUT)
97
+ client = Bitcoiner::Client.new('username', 'password', 'http://a.c', {
98
+ logger: logger,
99
+ })
100
+ ```
101
+
91
102
  ## License
92
103
 
93
104
  Released under the MIT license. See LICENSE.txt for details.
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.add_dependency 'addressable'
23
23
  spec.add_dependency 'typhoeus', '~> 1.3.0'
24
24
 
25
- spec.add_development_dependency 'bundler', '~> 1.16'
25
+ spec.add_development_dependency 'bundler', '~> 2.0'
26
26
  spec.add_development_dependency 'minitest', '~> 5.0'
27
27
  spec.add_development_dependency 'mocha', '~> 1.1.0'
28
28
  spec.add_development_dependency 'rake', '~> 10.0'
@@ -2,15 +2,21 @@
2
2
 
3
3
  module Bitcoiner
4
4
  class Client
5
- attr_accessor :endpoint, :username, :password
6
5
 
7
- def initialize(user, pass, host)
6
+ DEFAULT_ID = 'jsonrpc'.freeze
7
+ LOG_PREFIX = "[bitcoiner]".freeze
8
+
9
+ attr_accessor :endpoint, :username, :password, :logger
10
+
11
+ def initialize(user, pass, host, logger: nil)
8
12
  uri = Addressable::URI.heuristic_parse(host)
9
13
  self.username = uri.user || user
10
14
  self.password = uri.password || pass
11
15
  uri.user = uri.password = nil
12
16
 
13
17
  self.endpoint = uri.to_s
18
+
19
+ self.logger = logger
14
20
  end
15
21
 
16
22
  def balance
@@ -24,54 +30,69 @@ module Bitcoiner
24
30
 
25
31
  def request(method_or_array_of_methods, *args)
26
32
  if method_or_array_of_methods.is_a?(Array)
27
- post_body = method_or_array_of_methods.map do |m|
28
- {
29
- 'method' => m[0],
30
- 'params' => m[1],
31
- 'id' => 'jsonrpc'
32
- }
33
- end
33
+ log("#{method_or_array_of_methods}")
34
+ batch_request(method_or_array_of_methods)
34
35
  else
35
- post_body = {
36
- 'method' => method_or_array_of_methods,
37
- 'params' => args,
38
- 'id' => 'jsonrpc'
39
- }
36
+ log("#{method_or_array_of_methods}; args: #{args.inspect}")
37
+ single_request(method_or_array_of_methods, *args)
40
38
  end
39
+ end
40
+
41
+ def inspect
42
+ "#<Bitcoiner::Client #{endpoint.inspect} #{username}:#{password} >"
43
+ end
44
+
45
+ class JSONRPCError < RuntimeError; end
46
+
47
+ private
48
+
49
+ def post(body)
50
+ msg = {
51
+ endpoint: endpoint,
52
+ username: username,
53
+ body: body.to_json,
54
+ }.to_s
55
+ log(msg)
41
56
 
42
- response = Typhoeus.post(
57
+ Typhoeus.post(
43
58
  endpoint,
44
59
  userpwd: [username, password].join(":"),
45
- body: post_body.to_json,
60
+ body: body.to_json,
46
61
  )
62
+ end
47
63
 
48
- parsed_response = parse_body(response)
49
-
50
- if parsed_response.is_a?(Hash)
51
- raise JSONRPCError, parsed_response['error'] if parsed_response['error']
52
- return parsed_response['result']
64
+ def batch_request(methods_and_args)
65
+ post_body = methods_and_args.map do |method, args|
66
+ { 'method' => method, 'params' => args, 'id' => DEFAULT_ID }
53
67
  end
54
-
55
- parsed_response
68
+ response = post(post_body)
69
+ parse_body(response)
56
70
  end
57
71
 
58
- def inspect
59
- "#<Bitcoiner::Client #{endpoint.inspect} #{username}:#{password} >"
60
- end
72
+ def single_request(method, *args)
73
+ post_body = { 'method' => method, 'params' => args, 'id' => DEFAULT_ID }
74
+ response = post(post_body)
75
+ parsed_response = parse_body(response)
61
76
 
62
- class JSONRPCError < RuntimeError; end
77
+ raise JSONRPCError, parsed_response['error'] if parsed_response['error']
63
78
 
64
- private
79
+ parsed_response['result']
80
+ end
65
81
 
66
82
  def parse_body(response)
67
83
  if response.success?
68
84
  JSON.parse(response.body)
69
85
  else
70
- error_message = %i[code return_code].map do |attr|
71
- "#{attr}: `#{response.send(attr)}`"
72
- end.join(', ')
73
- raise JSONRPCError, "unsuccessful response; #{error_message}"
86
+ error_messages = %i[code return_code].each_with_object({}) do |attr, hash|
87
+ hash[attr] = response.send(attr)
88
+ end
89
+ error_messages[:body] = response.body
90
+ raise JSONRPCError, error_messages.map {|k, v| "#{k}: `#{v}`"}.join("; ")
74
91
  end
75
92
  end
93
+
94
+ def log(msg)
95
+ self.logger.info("#{LOG_PREFIX} #{msg}") if self.logger
96
+ end
76
97
  end
77
98
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bitcoiner
4
- VERSION = '0.1.4'
4
+ VERSION = '0.2.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitcoiner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryce Kerley
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-11-14 00:00:00.000000000 Z
12
+ date: 2019-07-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: addressable
@@ -45,14 +45,14 @@ dependencies:
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '1.16'
48
+ version: '2.0'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '1.16'
55
+ version: '2.0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: minitest
58
58
  requirement: !ruby/object:Gem::Requirement
@@ -119,6 +119,7 @@ extra_rdoc_files: []
119
119
  files:
120
120
  - ".gitignore"
121
121
  - ".travis.yml"
122
+ - CHANGELOG.md
122
123
  - Gemfile
123
124
  - LICENSE.txt
124
125
  - README.md
@@ -148,8 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
148
149
  - !ruby/object:Gem::Version
149
150
  version: '0'
150
151
  requirements: []
151
- rubyforge_project:
152
- rubygems_version: 2.7.8
152
+ rubygems_version: 3.0.4
153
153
  signing_key:
154
154
  specification_version: 4
155
155
  summary: Control the bitcoin nework client over JSON-RPC.