expedition 0.3.0 → 0.4.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
  SHA1:
3
- metadata.gz: b469b07e45e60d178dbfa91fa63c46c7d3d0f3ea
4
- data.tar.gz: 88fdd81ad47d6d705cf314c72a6b66f0d4dacffe
3
+ metadata.gz: 0cef207a11eed24a6983827999f5035ac80fdcf4
4
+ data.tar.gz: eb87eedfe67d6885d5d65e070027155bbf2fb797
5
5
  SHA512:
6
- metadata.gz: 263182dee4dc4eaf432fb2bd3e1df358d9f90345f8203965e144b27665f354944af9e735ea0c0253c3eeeab4559a852863679f2bb312af54ab261d3b37b6d7e2
7
- data.tar.gz: 05b339be299f3f259dbd023e5899d97c817795d77d2aee47f27ed8addacbbabc6a8197df5a3b7f2d63e8b8e2ef379e00b485d14a22cb26c611eafead42773ddd
6
+ metadata.gz: b9b37bc91c9ef1a071ced968e5b591429b95d430d15ca52d902f1d201d44534efff3610e0c980e215bac31952d3d55f85e61604e3f8305dc992430a378bc1987
7
+ data.tar.gz: 3299a161b09dfd39249d36c4f1652af2552e66f78068b525f84c7730466f7f1c29b3f0b84467919c9bad435edb8f13c04d21190c39e423a32ad1062392677782
data/README.md CHANGED
@@ -34,7 +34,49 @@ Or install it yourself as:
34
34
 
35
35
  ## Usage
36
36
 
37
- TODO: Write usage instructions here
37
+ A client can be initialized with an optional host and port (defaulting to
38
+ `localhost`, port `4028`):
39
+
40
+ ```ruby
41
+ client = Expedition.new(host, port)
42
+ ```
43
+
44
+ Querying is done by calling the method you wish to send:
45
+
46
+ ```ruby
47
+ response = client.pools
48
+ # => #<Expedition::Response ...>
49
+
50
+ response.body
51
+ # => [{"pool"=>0,
52
+ # "url"=>"stratum+tcp://pool.example.com:3333",
53
+ # "status"=>"alive"
54
+ # ...}]
55
+
56
+ response.status
57
+ # => #<Expedition::Status
58
+ # @code=7
59
+ # @description="sgminer 4.1.153",
60
+ # @executed_at=2014-05-13 17:51:53 -0700,
61
+ # @message="1 Pool(s)",
62
+ # @severity=:success>>
63
+
64
+ response.ok?
65
+ # => true
66
+ ```
67
+
68
+ ## Supported API Methods
69
+
70
+ Expedition overrides `#method_missing` to allow sending *any* method to a
71
+ running miner. For convenience and additional sugar, the following methods are
72
+ implemented which offer parsed timestamps, and more consistent responses:
73
+
74
+ * `#devices` - Detailed information about devices.
75
+ * `#metrics` - Detailed statistics for all devices.
76
+ * `#pools` - Pool information and statistics.
77
+
78
+ In need of another method?
79
+ [Open an issue](https://github.com/gevans/expedition/issues/new).
38
80
 
39
81
  ## Contributing
40
82
 
@@ -29,6 +29,12 @@ module Expedition
29
29
  @port = port
30
30
  end
31
31
 
32
+ ##
33
+ # Sends the `devdetails` command, returning an array of devices found in the
34
+ # service's response.
35
+ #
36
+ # @return [Response]
37
+ # An array of devices.
32
38
  def devices
33
39
  send(:devdetails) do |body|
34
40
  body[:devdetails].collect { |attrs|
@@ -39,12 +45,30 @@ module Expedition
39
45
  end
40
46
  end
41
47
 
48
+ ##
49
+ # Sends the `devs` command, returning an array of metrics found in the
50
+ # service's response.
51
+ #
52
+ # @return [Response]
53
+ # An array of metrics.
42
54
  def metrics
43
55
  send(:devs) do |body|
44
56
  body[:devs].collect(&method(:parse_metrics))
45
57
  end
46
58
  end
47
59
 
60
+ ##
61
+ # Sends the `pools` command, returning an array of pools found in the
62
+ # service's response.
63
+ #
64
+ # @return [Response]
65
+ # An array of pools.
66
+ def pools
67
+ send(:pools) do |body|
68
+ body[:pools].collect(&method(:parse_pool))
69
+ end
70
+ end
71
+
48
72
  ##
49
73
  # Sends the supplied `command` with optionally supplied `parameters` to the
50
74
  # service and returns the result, if any.
@@ -61,7 +85,7 @@ module Expedition
61
85
  # @return [Response]
62
86
  # The service's response.
63
87
  def send(command, *parameters, &block)
64
- socket = TCPSocket.new(host, port)
88
+ socket = TCPSocket.open(host, port)
65
89
  socket.puts command_json(command, *parameters)
66
90
 
67
91
  parse(socket.gets, &block)
@@ -97,5 +121,13 @@ module Expedition
97
121
  khs: attrs.delete("khs_#{interval}")
98
122
  )
99
123
  end
124
+
125
+ def parse_pool(attrs)
126
+ attrs.merge!(
127
+ status: attrs[:status].downcase,
128
+ long_poll: attrs[:long_poll] != 'N',
129
+ last_share_time: (Time.at(attrs[:last_share_time]) rescue attrs[:last_share_time]),
130
+ )
131
+ end
100
132
  end # Client
101
133
  end # Expedition
@@ -1,3 +1,3 @@
1
1
  module Expedition
2
- VERSION = '0.3.0'.freeze
2
+ VERSION = '0.4.0'.freeze
3
3
  end
@@ -42,7 +42,7 @@ describe Expedition::Client do
42
42
  end
43
43
 
44
44
  before do
45
- allow(TCPSocket).to receive(:new).with(client.host, client.port).and_return(socket)
45
+ allow(TCPSocket).to receive(:open).and_return(socket)
46
46
  end
47
47
 
48
48
  it 'sends supplied command and parameters to configured host and port' do
@@ -121,7 +121,7 @@ describe Expedition::Client do
121
121
  end
122
122
 
123
123
  before do
124
- allow(TCPSocket).to receive(:new).with(client.host, client.port).and_return(socket)
124
+ allow(TCPSocket).to receive(:open).and_return(socket)
125
125
  allow(socket).to receive(:puts)
126
126
  allow(socket).to receive(:gets).and_return(response)
127
127
  end
@@ -177,7 +177,7 @@ describe Expedition::Client do
177
177
  'STATUS' => 'S',
178
178
  'When' => 1399419744,
179
179
  'Code' => 9,
180
- 'Msg' => '3 GPU(s)',
180
+ 'Msg' => '1 GPU(s)',
181
181
  'Description' => 'sgminer 4.1.153'
182
182
  }
183
183
  ],
@@ -221,7 +221,7 @@ describe Expedition::Client do
221
221
  end
222
222
 
223
223
  before do
224
- allow(TCPSocket).to receive(:new).with(client.host, client.port).and_return(socket)
224
+ allow(TCPSocket).to receive(:open).and_return(socket)
225
225
  allow(socket).to receive(:puts)
226
226
  allow(socket).to receive(:gets).and_return(response)
227
227
  end
@@ -262,4 +262,109 @@ describe Expedition::Client do
262
262
  ])
263
263
  end
264
264
  end
265
+
266
+ describe '#pools' do
267
+
268
+ subject(:pools) do
269
+ client.pools
270
+ end
271
+
272
+ let(:client) do
273
+ described_class.new
274
+ end
275
+
276
+ let(:socket) do
277
+ double(TCPSocket)
278
+ end
279
+
280
+ let(:response) do
281
+ {
282
+ 'STATUS' => [
283
+ {
284
+ 'STATUS' => 'S',
285
+ 'When' => 1400026784,
286
+ 'Code' => 7,
287
+ 'Msg' => '1 Pool(s)',
288
+ 'Description' => 'sgminer 4.1.153'
289
+ }
290
+ ],
291
+ 'POOLS' => [
292
+ {
293
+ 'POOL' => 0,
294
+ 'URL' => 'stratum+tcp://us-west2.multipool.us:3352',
295
+ 'Status' => 'Alive',
296
+ 'Priority' => 0,
297
+ 'Quota' => 1,
298
+ 'Long Poll' => 'N',
299
+ 'Getworks' => 31,
300
+ 'Accepted' => 413,
301
+ 'Rejected' => 0,
302
+ 'Works' => 206,
303
+ 'Discarded' => 1256,
304
+ 'Stale' => 0,
305
+ 'Get Failures' => 0,
306
+ 'Remote Failures' => 0,
307
+ 'User' => 'nobody',
308
+ 'Last Share Time' => 1400026781,
309
+ 'Diff1 Shares' => 52523,
310
+ 'Proxy Type' => '',
311
+ 'Proxy' => '',
312
+ 'Difficulty Accepted' => 52864.0,
313
+ 'Difficulty Rejected' => 0.0,
314
+ 'Difficulty Stale' => 0.0,
315
+ 'Last Share Difficulty' => 128.0,
316
+ 'Has Stratum' => true,
317
+ 'Stratum Active' => true,
318
+ 'Stratum URL' => 'us-west2.multipool.us',
319
+ 'Has GBT' => false,
320
+ 'Best Share' => 22673,
321
+ 'Pool Rejected%' => 0.0,
322
+ 'Pool Stale%' => 0.0
323
+ }
324
+ ],
325
+ 'id' => 1
326
+ }.to_json
327
+ end
328
+
329
+ before do
330
+ allow(TCPSocket).to receive(:open).and_return(socket)
331
+ allow(socket).to receive(:puts)
332
+ allow(socket).to receive(:gets).and_return(response)
333
+ end
334
+
335
+ specify do
336
+ expect(pools.body).to eq([
337
+ 'pool' => 0,
338
+ 'url' => 'stratum+tcp://us-west2.multipool.us:3352',
339
+ 'status' => 'alive',
340
+ 'priority' => 0,
341
+ 'quota' => 1,
342
+ 'long_poll' => false,
343
+ 'getworks' => 31,
344
+ 'accepted' => 413,
345
+ 'rejected' => 0,
346
+ 'works' => 206,
347
+ 'discarded' => 1256,
348
+ 'stale' => 0,
349
+ 'get_failures' => 0,
350
+ 'remote_failures' => 0,
351
+ 'user' => 'nobody',
352
+ 'last_share_time' => Time.utc(2014, 05, 14, 0, 19, 41),
353
+ 'diff1_shares' => 52523,
354
+ 'proxy_type' => '',
355
+ 'proxy' => '',
356
+ 'difficulty_accepted' => 52864.0,
357
+ 'difficulty_rejected' => 0.0,
358
+ 'difficulty_stale' => 0.0,
359
+ 'last_share_difficulty' => 128.0,
360
+ 'has_stratum' => true,
361
+ 'stratum_active' => true,
362
+ 'stratum_url' => 'us-west2.multipool.us',
363
+ 'has_gbt' => false,
364
+ 'best_share' => 22673,
365
+ 'pool_rejected_percent' => 0.0,
366
+ 'pool_stale_percent' => 0.0
367
+ ])
368
+ end
369
+ end
265
370
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: expedition
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gabe Evans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-08 00:00:00.000000000 Z
11
+ date: 2014-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json