mtgox 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -22,7 +22,7 @@ To ensure the code you're installing hasn't been tampered with, it's
22
22
  recommended that you verify the signature. To do this, you need to add my
23
23
  public key as a trusted certificate (you only need to do this once):
24
24
 
25
- gem cert --add <(curl -Ls https://gist.github.com/sferik/4701180/raw/public_cert.pem)
25
+ gem cert --add <(curl -Ls https://raw.github.com/sferik/mtgox/master/certs/sferik.pem)
26
26
 
27
27
  Then, install the gem with the high security trust policy:
28
28
 
@@ -81,6 +81,9 @@ MtGox.cancel 1234567890
81
81
 
82
82
  # Withdraw 1 BTC from your account
83
83
  MtGox.withdraw! 1.0, "1KxSo9bGBfPVFEtWNLpnUK1bfLNNT4q31L"
84
+
85
+ # Switch to sending 'tonce' rather than 'nonce'
86
+ MtGox.nonce_type = :tonce
84
87
  ```
85
88
 
86
89
  ## Contributing
@@ -13,6 +13,7 @@ require 'mtgox/trade'
13
13
  require 'mtgox/value'
14
14
  require 'mtgox/lag'
15
15
  require 'mtgox/configuration'
16
+ require 'mtgox/order_result'
16
17
 
17
18
  module MtGox
18
19
  class Client
@@ -291,6 +292,16 @@ module MtGox
291
292
  end
292
293
  end
293
294
 
295
+ # Fetch information about a particular transaction
296
+ #
297
+ # @authenticated true
298
+ # @param offer_type [String] 'bid' or 'ask'
299
+ # @param order_id [String] the order id
300
+ # @return [OrderResult]
301
+ def order_result(offer_type, order_id)
302
+ OrderResult.new(post('/api/1/generic/order/result', {type: offer_type, order: order_id}))
303
+ end
304
+
294
305
  private
295
306
 
296
307
  def parse_balance(info)
@@ -8,9 +8,11 @@ module MtGox
8
8
  :commission,
9
9
  :key,
10
10
  :secret,
11
+ :nonce_type
11
12
  ]
12
13
 
13
14
  DEFAULT_COMMISSION = BigDecimal('0.0065').freeze
15
+ DEFAULT_NONCE_TYPE = :nonce
14
16
 
15
17
  attr_accessor *VALID_OPTIONS_KEYS
16
18
 
@@ -27,9 +29,13 @@ module MtGox
27
29
  # Reset all configuration options to defaults
28
30
  def reset
29
31
  self.commission = DEFAULT_COMMISSION
30
- self.key = nil
31
- self.secret = nil
32
+ self.key = nil
33
+ self.secret = nil
32
34
  self
33
35
  end
36
+
37
+ def nonce_type
38
+ @nonce_type || DEFAULT_NONCE_TYPE
39
+ end
34
40
  end
35
41
  end
@@ -0,0 +1,49 @@
1
+ module MtGox
2
+ class OrderResult
3
+ include Value
4
+
5
+ def initialize(json)
6
+ @json = json
7
+ end
8
+
9
+ def id
10
+ @json["order_id"]
11
+ end
12
+
13
+ def trades
14
+ @json["trades"].map{|t| Trade.new(coerce_trade(t)) }
15
+ end
16
+
17
+ def total_spent
18
+ to_decimal "total_spent", @json
19
+ end
20
+
21
+ def total_amount
22
+ to_decimal "total_amount", @json
23
+ end
24
+
25
+ def avg_cost
26
+ to_decimal "avg_cost", @json
27
+ end
28
+
29
+ private
30
+
31
+ def to_decimal(key, json)
32
+ data = json.fetch(key)
33
+ decimalify(data["value_int"], currency_lookup[data["currency"]])
34
+ end
35
+
36
+ def currency_lookup
37
+ { "USD" => :usd, "BTC" => :btc, "JPY" => :jpy }
38
+ end
39
+
40
+ def coerce_trade(hash)
41
+ {
42
+ "tid" => hash["trade_id"],
43
+ "date" => Time.parse(hash["date"] + " UTC"),
44
+ "amount" => to_decimal("amount", hash).to_s,
45
+ "price" => to_decimal("price", hash).to_s
46
+ }
47
+ end
48
+ end
49
+ end
@@ -44,7 +44,7 @@ module MtGox
44
44
  end
45
45
 
46
46
  def add_nonce(options)
47
- options.merge!({nonce: (Time.now.to_f * 1000000).to_i})
47
+ options.merge!({self.nonce_type => (Time.now.to_f * 1000000).to_i})
48
48
  end
49
49
  end
50
50
  end
@@ -9,7 +9,7 @@ module MtGox
9
9
 
10
10
  # @return [Integer]
11
11
  def minor
12
- 0
12
+ 1
13
13
  end
14
14
 
15
15
  # @return [Integer]
@@ -0,0 +1,60 @@
1
+ {
2
+ "result":"success",
3
+ "return":
4
+ {
5
+ "order_id":"Zda8917a-63d3-4415-b827-758408013691",
6
+ "trades":[
7
+ {
8
+ "trade_id":"1375134017519310",
9
+ "primary":"Y",
10
+ "currency":"USD",
11
+ "type":"ask",
12
+ "properties":"limit",
13
+ "item":"BTC",
14
+ "amount":{
15
+ "value":"0.10000000",
16
+ "value_int":"10000000",
17
+ "display":"0.10000000 BTC",
18
+ "display_short":"0.10 BTC",
19
+ "currency":"BTC"
20
+ },
21
+ "price":{
22
+ "value":"100.83227",
23
+ "value_int":"10083227",
24
+ "display":"$100.83227",
25
+ "display_short":"$100.83",
26
+ "currency":"USD"
27
+ },
28
+ "spent":{
29
+ "value":"10.08323",
30
+ "value_int":"1008323",
31
+ "display":"$10.08323",
32
+ "display_short":"$10.08",
33
+ "currency":"USD"
34
+ },
35
+ "date":"2013-07-29 21:40:17"
36
+ }
37
+ ],
38
+ "total_amount":{
39
+ "value":"0.10000000",
40
+ "value_int":"10000000",
41
+ "display":"0.10000000 BTC",
42
+ "display_short":"0.10 BTC",
43
+ "currency":"BTC"
44
+ },
45
+ "total_spent":{
46
+ "value":"10.08323",
47
+ "value_int":"1008323",
48
+ "display":"$10.08323",
49
+ "display_short":"$10.08",
50
+ "currency":"USD"
51
+ },
52
+ "avg_cost":{
53
+ "value":"100.83230",
54
+ "value_int":"10083230",
55
+ "display":"$100.83230",
56
+ "display_short":"$100.83",
57
+ "currency":"USD"
58
+ }
59
+ }
60
+ }
@@ -49,7 +49,7 @@ module MtGox
49
49
  module Request
50
50
  private
51
51
  def add_nonce(options)
52
- options.merge!({nonce: 1321745961249676})
52
+ options.merge!({self.nonce_type => 1321745961249676})
53
53
  end
54
54
  end
55
55
  end
@@ -358,4 +358,41 @@ describe MtGox::Client do
358
358
  }.to raise_error(MtGox::FilthyRichError)
359
359
  end
360
360
  end
361
+
362
+ describe "nonce_type" do
363
+ before do
364
+ stub_post('/api/1/generic/bitcoin/address').
365
+ to_return(body: fixture('address.json'))
366
+ end
367
+
368
+ it "uses nonce by default" do
369
+ address = @client.address
370
+ expect(a_post('/api/1/generic/bitcoin/address').with(nonce: 1321745961249676)).to have_been_made
371
+ end
372
+
373
+ it "is capable of using tonce" do
374
+ @client.nonce_type = :tonce
375
+ address = @client.address
376
+ expect(a_post('/api/1/generic/bitcoin/address').with(tonce: 1321745961249676)).to have_been_made
377
+ end
378
+ end
379
+
380
+ describe "#order_result" do
381
+ context "for a valid order id" do
382
+ let(:order_id) { "Zda8917a-63d3-4415-b827-758408013691" }
383
+ let(:body) { test_body({"type" => "bid", "order" => order_id}) }
384
+
385
+ before do
386
+ stub_post('/api/1/generic/order/result').
387
+ with(body: body, headers: test_headers(@client, body)).
388
+ to_return(body: fixture('order_result.json'))
389
+ end
390
+
391
+ it "returns an order result" do
392
+ order_result = @client.order_result("bid", order_id)
393
+ expect(a_post("/api/1/generic/order/result").with(body: body, headers: test_headers(@client, body))).to have_been_made
394
+ expect(order_result.id).to eq order_id
395
+ end
396
+ end
397
+ end
361
398
  end
@@ -0,0 +1,34 @@
1
+ require 'helper'
2
+
3
+ describe MtGox::OrderResult do
4
+ let(:json) { JSON.parse(File.read(fixture("order_result.json")))["return"] }
5
+ subject { described_class.new(json) }
6
+
7
+ describe '#total_spent' do
8
+ it "returns a decimal" do
9
+ expect(subject.total_spent).to eq BigDecimal.new('10.08323')
10
+ end
11
+ end
12
+
13
+ describe '#total_amount' do
14
+ it "returns a decimal" do
15
+ expect(subject.total_amount).to eq BigDecimal.new('0.10')
16
+ end
17
+ end
18
+
19
+ describe '#avg_cost' do
20
+ it "returns a decimal" do
21
+ expect(subject.avg_cost).to eq BigDecimal.new('100.83230')
22
+ end
23
+ end
24
+
25
+ describe "#trades" do
26
+ it "returns an array of Trade objects" do
27
+ trade = subject.trades.first
28
+ expect(trade.id).to eq 1375134017519310
29
+ expect(trade.date).to eq Time.parse('2013-07-29 21:40:17 UTC')
30
+ expect(trade.amount).to eq BigDecimal.new("0.10000000")
31
+ expect(trade.price).to eq BigDecimal.new("100.83227")
32
+ end
33
+ end
34
+ end
@@ -17,6 +17,14 @@ describe MtGox do
17
17
  expect(MtGox.key).to eq "key"
18
18
  expect(MtGox.secret).to eq "secret"
19
19
  end
20
+
21
+ it "allows setting nonce type" do
22
+ expect(MtGox.nonce_type).to eq(:nonce)
23
+ MtGox.configure do |config|
24
+ config.nonce_type = :tonce
25
+ end
26
+ expect(MtGox.nonce_type).to eq(:tonce)
27
+ end
20
28
  end
21
29
 
22
30
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mtgox
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -36,7 +36,7 @@ cert_chain:
36
36
  U0xxV3ZRUnNCbHlwSGZoczZKSnVMbHlaUEdoVTNSL3YKU2YzbFZLcEJDV2dS
37
37
  cEdUdnk0NVhWcEIrNTl5MzNQSm1FdVExUFRFT1l2UXlhbzlVS01BQWFBTi83
38
38
  cVdRdGpsMApobHc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
39
- date: 2013-05-12 00:00:00.000000000 Z
39
+ date: 2013-08-06 00:00:00.000000000 Z
40
40
  dependencies:
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: faraday
@@ -127,6 +127,7 @@ files:
127
127
  - lib/mtgox/min_ask.rb
128
128
  - lib/mtgox/offer.rb
129
129
  - lib/mtgox/order.rb
130
+ - lib/mtgox/order_result.rb
130
131
  - lib/mtgox/price_ticker.rb
131
132
  - lib/mtgox/request.rb
132
133
  - lib/mtgox/response/parse_json.rb
@@ -146,6 +147,7 @@ files:
146
147
  - spec/fixtures/info.json
147
148
  - spec/fixtures/lag.json
148
149
  - spec/fixtures/mysql_error
150
+ - spec/fixtures/order_result.json
149
151
  - spec/fixtures/orders.json
150
152
  - spec/fixtures/sell.json
151
153
  - spec/fixtures/ticker.json
@@ -154,6 +156,7 @@ files:
154
156
  - spec/fixtures/withdraw.json
155
157
  - spec/helper.rb
156
158
  - spec/mtgox/client_spec.rb
159
+ - spec/mtgox/order_result_spec.rb
157
160
  - spec/mtgox_spec.rb
158
161
  homepage: https://github.com/sferik/mtgox
159
162
  licenses: []
@@ -190,6 +193,7 @@ test_files:
190
193
  - spec/fixtures/info.json
191
194
  - spec/fixtures/lag.json
192
195
  - spec/fixtures/mysql_error
196
+ - spec/fixtures/order_result.json
193
197
  - spec/fixtures/orders.json
194
198
  - spec/fixtures/sell.json
195
199
  - spec/fixtures/ticker.json
@@ -198,5 +202,6 @@ test_files:
198
202
  - spec/fixtures/withdraw.json
199
203
  - spec/helper.rb
200
204
  - spec/mtgox/client_spec.rb
205
+ - spec/mtgox/order_result_spec.rb
201
206
  - spec/mtgox_spec.rb
202
207
  has_rdoc:
metadata.gz.sig CHANGED
Binary file