bitcoiner 0.1.4 → 0.2.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: 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.