mtgox 0.9.0 → 0.9.1

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
@@ -42,41 +42,46 @@ typing `btc` in your bash shell:
42
42
  [documentation]: http://rdoc.info/gems/mtgox
43
43
 
44
44
  ## Usage Examples
45
- require 'rubygems'
46
- require 'mtgox'
45
+ ```ruby
46
+ require 'rubygems'
47
+ require 'mtgox'
47
48
 
48
- # Fetch the latest price for 1 BTC in USD
49
- puts MtGox.ticker.sell
49
+ # Fetch the latest price for 1 BTC in USD
50
+ puts MtGox.ticker.sell
50
51
 
51
- # Fetch open asks
52
- puts MtGox.asks
52
+ # Fetch open asks
53
+ puts MtGox.asks
53
54
 
54
- # Fetch open bids
55
- puts MtGox.bids
55
+ # Fetch open bids
56
+ puts MtGox.bids
56
57
 
57
- # Fetch the last 48 hours worth of trades (takes a minute)
58
- puts MtGox.trades
58
+ # Fetch the last 48 hours worth of trades (takes a minute)
59
+ puts MtGox.trades
59
60
 
60
- # Certain methods require authentication
61
- MtGox.configure do |config|
62
- config.key = YOUR_MTGOX_KEY
63
- config.secret = YOUR_MTGOX_SECRET
64
- end
61
+ # Certain methods require authentication
62
+ MtGox.configure do |config|
63
+ config.key = YOUR_MTGOX_KEY
64
+ config.secret = YOUR_MTGOX_SECRET
65
+ end
65
66
 
66
- # Fetch your current balance
67
- puts MtGox.balance
67
+ # Fetch your current balance
68
+ puts MtGox.balance
68
69
 
69
- # Place a limit order to buy one bitcoin for $0.011
70
- MtGox.buy! 1.0, 0.011
70
+ # Place a limit order to buy one bitcoin for $0.011
71
+ MtGox.buy! 1.0, 0.011
71
72
 
72
- # Place a limit order to sell one bitcoin for $100
73
- MtGox.sell! 1.0, 100.0
73
+ # Place a limit order to sell one bitcoin for $100
74
+ MtGox.sell! 1.0, 100.0
74
75
 
75
- # Cancel order #1234567890
76
- MtGox.cancel 1234567890
76
+ # Place a market order to sell one bitcoin
77
+ MtGox.sell! 1.0, :market
77
78
 
78
- # Withdraw 1 BTC from your account
79
- MtGox.withdraw! 1.0, "1KxSo9bGBfPVFEtWNLpnUK1bfLNNT4q31L"
79
+ # Cancel order #1234567890
80
+ MtGox.cancel 1234567890
81
+
82
+ # Withdraw 1 BTC from your account
83
+ MtGox.withdraw! 1.0, "1KxSo9bGBfPVFEtWNLpnUK1bfLNNT4q31L"
84
+ ```
80
85
 
81
86
  ## Contributing
82
87
  In the spirit of [free software][free-sw], **everyone** is encouraged to help
@@ -1,15 +1,13 @@
1
1
  require 'mtgox/client'
2
- require 'mtgox/configuration'
3
2
  require 'mtgox/error'
4
3
 
5
4
  module MtGox
6
- extend Configuration
7
5
  class << self
8
6
  # Alias for MtGox::Client.new
9
7
  #
10
8
  # @return [MtGox::Client]
11
9
  def new
12
- MtGox::Client.new
10
+ @client ||= MtGox::Client.new
13
11
  end
14
12
 
15
13
  # Delegate to MtGox::Client
@@ -5,7 +5,8 @@ module MtGox
5
5
  class Ask < Offer
6
6
  include MtGox::Value
7
7
 
8
- def initialize(hash = nil)
8
+ def initialize(client, hash = nil)
9
+ self.client = client
9
10
  if hash
10
11
  self.price = value_currency hash, 'price_int'
11
12
  self.amount = value_bitcoin hash, 'amount_int'
@@ -14,7 +15,7 @@ module MtGox
14
15
  end
15
16
 
16
17
  def eprice
17
- price / (1 - MtGox.commission)
18
+ price / (1 - self.client.commission)
18
19
  end
19
20
 
20
21
  end
@@ -5,7 +5,8 @@ module MtGox
5
5
  class Bid < Offer
6
6
  include MtGox::Value
7
7
 
8
- def initialize(hash = nil)
8
+ def initialize(client, hash = nil)
9
+ self.client = client
9
10
  if hash
10
11
  self.price = value_currency hash, 'price_int'
11
12
  self.amount = value_bitcoin hash, 'amount_int'
@@ -14,7 +15,7 @@ module MtGox
14
15
  end
15
16
 
16
17
  def eprice
17
- price * (1 - MtGox.commission)
18
+ price * (1 - self.client.commission)
18
19
  end
19
20
 
20
21
  end
@@ -11,15 +11,22 @@ require 'mtgox/sell'
11
11
  require 'mtgox/ticker'
12
12
  require 'mtgox/trade'
13
13
  require 'mtgox/value'
14
+ require 'mtgox/lag'
15
+ require 'mtgox/configuration'
14
16
 
15
17
  module MtGox
16
18
  class Client
17
19
  include MtGox::Connection
18
20
  include MtGox::Request
19
21
  include MtGox::Value
22
+ include MtGox::Configuration
20
23
 
21
24
  ORDER_TYPES = {sell: "ask", buy: "bid"}
22
25
 
26
+ def initialize
27
+ reset
28
+ end
29
+
23
30
  # Fetch a deposit address
24
31
  # @authenticated true
25
32
  # @return [String]
@@ -29,6 +36,14 @@ module MtGox
29
36
  post('/api/1/generic/bitcoin/address')['addr']
30
37
  end
31
38
 
39
+ # Get an idKey for subscribing to private channels in WebSocket API
40
+ # @authenticated true
41
+ # @return [String] the idKey to use in your WebSocket client
42
+ # @example
43
+ # MtGox.idkey
44
+ def idkey
45
+ post('/api/1/generic/idkey')
46
+ end
32
47
 
33
48
  # Fetch the latest ticker data
34
49
  #
@@ -43,16 +58,29 @@ module MtGox
43
58
  Ticker.instance.price = value_currency ticker['last_all']
44
59
  Ticker.instance.low = value_currency ticker['low']
45
60
  Ticker.instance.sell = value_currency ticker['sell']
46
- Ticker.instance.volume = value_bitcoin ticker['vol']
61
+ Ticker.instance.volume = value_bitcoin ticker['vol']
47
62
  Ticker.instance.vwap = value_currency ticker['vwap']
48
- Ticker.instance.avg = value_currency ticker['avg']
63
+ Ticker.instance.avg = value_currency ticker['avg']
49
64
  Ticker.instance
50
65
  end
51
66
 
67
+ # Fetch the latest lag data
68
+ #
69
+ # @authenticated false
70
+ # @return [MtGox::Lag]
71
+ # @example
72
+ # MtGox.lag
73
+ def lag
74
+ lag = get('/api/1/generic/order/lag')
75
+ Lag.new(lag['lag'], lag['lag_secs'], lag['lag_text'], lag['length'])
76
+ end
77
+ alias order_lag lag
78
+ alias orderlag lag
79
+
52
80
  # Fetch both bids and asks in one call, for network efficiency
53
81
  #
54
82
  # @authenticated false
55
- # @return [Hash] with keys :asks and :asks, which contain arrays as described in {MtGox::Client#asks} and {MtGox::Clients#bids}
83
+ # @return [Hash] with keys :asks and :bids, which contain arrays as described in {MtGox::Client#asks} and {MtGox::Clients#bids}
56
84
  # @example
57
85
  # MtGox.offers
58
86
  def offers
@@ -60,12 +88,12 @@ module MtGox
60
88
  asks = offers['asks'].sort_by do |ask|
61
89
  ask['price_int'].to_i
62
90
  end.map! do |ask|
63
- Ask.new(ask)
91
+ Ask.new(self, ask)
64
92
  end
65
93
  bids = offers['bids'].sort_by do |bid|
66
94
  -bid['price_int'].to_i
67
95
  end.map! do |bid|
68
- Bid.new(bid)
96
+ Bid.new(self, bid)
69
97
  end
70
98
  {asks: asks, bids: bids}
71
99
  end
@@ -97,10 +125,7 @@ module MtGox
97
125
  # @example
98
126
  # MtGox.min_ask
99
127
  def min_ask
100
- min_ask = asks.first
101
- MinAsk.instance.price = min_ask.price
102
- MinAsk.instance.amount = min_ask.amount
103
- MinAsk.instance
128
+ asks.first
104
129
  end
105
130
 
106
131
  # Fetch the highest priced bid
@@ -110,10 +135,7 @@ module MtGox
110
135
  # @example
111
136
  # MtGox.max_bid
112
137
  def max_bid
113
- max_bid = bids.first
114
- MaxBid.instance.price = max_bid.price
115
- MaxBid.instance.amount = max_bid.amount
116
- MaxBid.instance
138
+ bids.first
117
139
  end
118
140
 
119
141
  # Fetch recent trades
@@ -122,8 +144,10 @@ module MtGox
122
144
  # @return [Array<MtGox::Trade>] an array of trades, sorted in chronological order
123
145
  # @example
124
146
  # MtGox.trades
125
- def trades
126
- get('/api/1/BTCUSD/trades/fetch').sort_by{|trade| trade['date']}.map do |trade|
147
+ # MtGox.trades :since => 12341234
148
+ def trades(opts={})
149
+ get('/api/1/BTCUSD/trades/fetch', opts).
150
+ sort_by{|trade| trade['date']}.map do |trade|
127
151
  Trade.new(trade)
128
152
  end
129
153
  end
@@ -135,7 +159,7 @@ module MtGox
135
159
  # @example
136
160
  # MtGox.balance
137
161
  def balance
138
- parse_balance(post('/api/1/generic/info', {}))
162
+ parse_balance(post('/api/1/generic/info'))
139
163
  end
140
164
 
141
165
  # Fetch your open orders, both buys and sells, for network efficiency
@@ -145,7 +169,7 @@ module MtGox
145
169
  # @example
146
170
  # MtGox.orders
147
171
  def orders
148
- parse_orders post('/api/1/generic/orders', {})
172
+ parse_orders(post('/api/1/generic/orders'))
149
173
  end
150
174
 
151
175
  # Fetch your open buys
@@ -172,26 +196,26 @@ module MtGox
172
196
  #
173
197
  # @authenticated true
174
198
  # @param amount [Numeric] the number of bitcoins to purchase
175
- # @param price [Numeric] the bid price in US dollars
199
+ # @param price [Numeric or Symbol] the bid price in US dollars, or :market if placing a market order
176
200
  # @return [String] order ID for the buy, can be inspected using order_result
177
201
  # @example
178
202
  # # Buy one bitcoin for $0.011
179
203
  # MtGox.buy! 1.0, 0.011
180
204
  def buy!(amount, price)
181
- addorder!(:buy, amount, price)
205
+ add_order!(:buy, amount, price)
182
206
  end
183
207
 
184
208
  # Place a limit order to sell BTC
185
209
  #
186
210
  # @authenticated true
187
211
  # @param amount [Numeric] the number of bitcoins to sell
188
- # @param price [Numeric] the ask price in US dollars
212
+ # @param price [Numeric or Symbol] the ask price in US dollars, or :market if placing a market order
189
213
  # @return [String] order ID for the sell, can be inspected using order_result
190
214
  # @example
191
215
  # # Sell one bitcoin for $100
192
216
  # MtGox.sell! 1.0, 100.0
193
217
  def sell!(amount, price)
194
- addorder!(:sell, amount, price)
218
+ add_order!(:sell, amount, price)
195
219
  end
196
220
 
197
221
  # Create a new order
@@ -199,14 +223,20 @@ module MtGox
199
223
  # @authenticated true
200
224
  # @param type [String] the type of order to create, either "buy" or "sell"
201
225
  # @param amount [Numberic] the number of bitcoins to buy/sell
202
- # @param price [Numeric] the bid/ask price in USD
226
+ # @param price [Numeric or Symbol] the bid/ask price in USD, or :market if placing a market order
203
227
  # @return [String] order ID for the order, can be inspected using order_result
204
228
  # @example
205
229
  # # Sell one bitcoin for $123
206
- # MtGox.addorder! :sell, 1.0, 123.0
207
- def addorder!(type, amount, price)
208
- post('/api/1/BTCUSD/order/add', {type: order_type(type), amount_int: intify(amount,:btc), price_int: intify(price, :usd)})
230
+ # MtGox.add_order! :sell, 1.0, 123.0
231
+ def order!(type, amount, price)
232
+ order = {type: order_type(type), amount_int: intify(amount,:btc)}
233
+ if price != :market
234
+ order[:price_int] = intify(price, :usd)
235
+ end
236
+ post('/api/1/BTCUSD/order/add', order)
209
237
  end
238
+ alias add_order! order!
239
+ alias addorder! order!
210
240
 
211
241
  # Cancel an open order
212
242
  #
@@ -230,16 +260,18 @@ module MtGox
230
260
  args = args['oid']
231
261
  end
232
262
 
233
- orders = post('/api/1/generic/orders', {})
263
+ orders = post('/api/1/generic/orders')
234
264
  order = orders.find{|order| order['oid'] == args.to_s}
235
265
  if order
236
- res = post('/api/1/BTCUSD/order/cancel', {oid: order['oid']})
237
- orders.delete_if { |o| o['oid'] == res['oid'] }
266
+ res = post('/api/1/BTCUSD/order/cancel', oid: order['oid'])
267
+ orders.delete_if{|o| o['oid'] == res['oid']}
238
268
  parse_orders(orders)
239
269
  else
240
270
  raise Faraday::Error::ResourceNotFound, {status: 404, headers: {}, body: 'Order not found.'}
241
271
  end
242
272
  end
273
+ alias cancel_order cancel
274
+ alias cancelorder cancel
243
275
 
244
276
  # Transfer bitcoins from your Mt. Gox account into another account
245
277
  #
@@ -259,7 +291,7 @@ module MtGox
259
291
  end
260
292
  end
261
293
 
262
- private
294
+ private
263
295
 
264
296
  def parse_balance(info)
265
297
  balances = []
@@ -291,5 +323,6 @@ module MtGox
291
323
  type
292
324
  end
293
325
  end
326
+
294
327
  end
295
328
  end
@@ -23,13 +23,6 @@ module MtGox
23
23
  yield self
24
24
  end
25
25
 
26
- # Create a hash of options and their values
27
- def options
28
- options = {}
29
- VALID_OPTIONS_KEYS.each{|k| options[k] = send(k)}
30
- options
31
- end
32
-
33
26
  # Reset all configuration options to defaults
34
27
  def reset
35
28
  self.commission = DEFAULT_COMMISSION
@@ -7,7 +7,7 @@ require 'mtgox/version'
7
7
 
8
8
  module MtGox
9
9
  module Connection
10
- private
10
+ private
11
11
 
12
12
  def connection
13
13
  options = {
@@ -0,0 +1,12 @@
1
+ module MtGox
2
+ class Lag
3
+ attr_accessor :microseconds, :seconds, :text, :length
4
+
5
+ def initialize(lag=nil, lag_secs=nil, lag_text=nil, length=nil)
6
+ self.microseconds = lag.to_i
7
+ self.seconds = lag_secs.to_f
8
+ self.text = lag_text
9
+ self.length = length.to_i
10
+ end
11
+ end
12
+ end
@@ -1,10 +1,8 @@
1
1
  require 'mtgox/ask'
2
2
  require 'mtgox/price_ticker'
3
- require 'singleton'
4
3
 
5
4
  module MtGox
6
5
  class MinAsk < Ask
7
- include Singleton
8
6
  include PriceTicker
9
7
  end
10
8
  end
@@ -1,5 +1,5 @@
1
1
  module MtGox
2
2
  class Offer
3
- attr_accessor :amount, :price, :timestamp
3
+ attr_accessor :amount, :price, :timestamp, :client
4
4
  end
5
5
  end
@@ -10,7 +10,7 @@ module MtGox
10
10
  request(:post, path, options)
11
11
  end
12
12
 
13
- private
13
+ private
14
14
 
15
15
  def request(method, path, options)
16
16
  response = connection.send(method) do |request|
@@ -33,10 +33,10 @@ module MtGox
33
33
  def headers(request)
34
34
  signature = Base64.strict_encode64(
35
35
  OpenSSL::HMAC.digest 'sha512',
36
- Base64.decode64(MtGox.secret),
36
+ Base64.decode64(secret),
37
37
  request
38
38
  )
39
- {'Rest-Key' => MtGox.key, 'Rest-Sign' => signature}
39
+ {'Rest-Key' => key, 'Rest-Sign' => signature}
40
40
  end
41
41
 
42
42
  def body_from_options(options)
@@ -13,7 +13,7 @@ module MtGox
13
13
 
14
14
  # @return [Integer]
15
15
  def self.patch
16
- 0
16
+ 1
17
17
  end
18
18
 
19
19
  # @return [String, NilClass]
@@ -1,7 +1,7 @@
1
1
  {
2
- "return": {
3
- "qid": "09354767-455f-412e-9a0c-efb7bb98c958g",
4
- "oid": "fda8917a-63d3-4415-b827-758408013690"
5
- },
6
- "result": "success"
2
+ "return": {
3
+ "qid": "09354767-455f-412e-9a0c-efb7bb98c958g",
4
+ "oid": "fda8917a-63d3-4415-b827-758408013690"
5
+ },
6
+ "result": "success"
7
7
  }
@@ -0,0 +1,4 @@
1
+ {
2
+ "return": "YCKvmyU4QsaHEqM/AvKlqAAAAABRbR5y0vCn1roteQx/Ux/lyLF27X8Em1e4AN/2etPECzIT6dU",
3
+ "result": "success"
4
+ }
@@ -0,0 +1 @@
1
+ {"result":"success","return":{"lag":535998,"lag_secs":0.535998,"lag_text":"0.535998 seconds","length":"3"}}
@@ -40,20 +40,20 @@ end
40
40
 
41
41
  module MtGox
42
42
  module Request
43
- private
43
+ private
44
44
  def add_nonce(options)
45
45
  options.merge!({nonce: 1321745961249676})
46
46
  end
47
47
  end
48
48
  end
49
49
 
50
- def test_headers(body=test_body)
50
+ def test_headers(client, body=test_body)
51
51
  signature = Base64.strict_encode64(
52
52
  OpenSSL::HMAC.digest 'sha512',
53
- Base64.decode64(MtGox.secret),
53
+ Base64.decode64(client.secret),
54
54
  body
55
55
  )
56
- {'Rest-Key' => MtGox.key, 'Rest-Sign' => signature}
56
+ {'Rest-Key' => client.key, 'Rest-Sign' => signature}
57
57
  end
58
58
 
59
59
  def test_body(options={})
@@ -3,7 +3,7 @@ require 'helper'
3
3
  describe MtGox::Client do
4
4
  before do
5
5
  @client = MtGox::Client.new
6
- MtGox.configure do |config|
6
+ @client.configure do |config|
7
7
  config.key = "key"
8
8
  config.secret = "secret"
9
9
  end
@@ -12,7 +12,7 @@ describe MtGox::Client do
12
12
  describe '#address' do
13
13
  before do
14
14
  stub_post('/api/1/generic/bitcoin/address').
15
- to_return(status: 200, body: fixture('address.json'))
15
+ to_return(body: fixture('address.json'))
16
16
  end
17
17
 
18
18
  it "should fetch a deposit address" do
@@ -23,10 +23,24 @@ describe MtGox::Client do
23
23
  end
24
24
  end
25
25
 
26
+ describe '#idkey' do
27
+ before do
28
+ stub_post('/api/1/generic/idkey').
29
+ to_return(body: fixture('idkey.json'))
30
+ end
31
+
32
+ it "should fetch an idkey suitable to WS Api usage" do
33
+ key = @client.idkey
34
+ a_post('/api/1/generic/idkey').
35
+ should have_been_made
36
+ key.should == 'YCKvmyU4QsaHEqM/AvKlqAAAAABRbR5y0vCn1roteQx/Ux/lyLF27X8Em1e4AN/2etPECzIT6dU'
37
+ end
38
+ end
39
+
26
40
  describe '#ticker' do
27
41
  before do
28
42
  stub_get('/api/1/BTCUSD/ticker').
29
- to_return(status: 200, body: fixture('ticker.json'))
43
+ to_return(body: fixture('ticker.json'))
30
44
  end
31
45
 
32
46
  it "should fetch the ticker" do
@@ -42,12 +56,40 @@ describe MtGox::Client do
42
56
  ticker.vwap.should == 5.61048
43
57
  ticker.avg.should == 5.56112
44
58
  end
59
+
60
+ it "should fetch the ticker and keep previous price" do
61
+ ticker = @client.ticker
62
+ ticker = @client.ticker
63
+ a_get('/api/1/BTCUSD/ticker').
64
+ should have_been_made.twice
65
+ ticker.up?.should == false
66
+ ticker.down?.should == false
67
+ ticker.changed?.should == false
68
+ ticker.unchanged?.should == true
69
+ end
70
+ end
71
+
72
+ describe '#lag' do
73
+ before do
74
+ stub_get('/api/1/generic/order/lag').
75
+ to_return(status:200, body: fixture('lag.json'))
76
+ end
77
+
78
+ it "should fetch the lag" do
79
+ lag = @client.lag
80
+ a_get('/api/1/generic/order/lag').
81
+ should have_been_made
82
+ lag.microseconds.should == 535998
83
+ lag.seconds.should == 0.535998
84
+ lag.text.should == "0.535998 seconds"
85
+ lag.length.should == 3
86
+ end
45
87
  end
46
88
 
47
89
  describe 'depth methods' do
48
90
  before :each do
49
91
  stub_get('/api/1/BTCUSD/depth/fetch').
50
- to_return(status: 200, body: fixture('depth.json'))
92
+ to_return(body: fixture('depth.json'))
51
93
  end
52
94
 
53
95
  describe '#asks' do
@@ -124,7 +166,7 @@ describe MtGox::Client do
124
166
  describe '#trades' do
125
167
  before do
126
168
  stub_get('/api/1/BTCUSD/trades/fetch').
127
- to_return(status: 200, body: fixture('trades.json'))
169
+ to_return(body: fixture('trades.json'))
128
170
  end
129
171
 
130
172
  it "should fetch trades" do
@@ -138,17 +180,35 @@ describe MtGox::Client do
138
180
  end
139
181
  end
140
182
 
183
+ describe '#trades :since' do
184
+ before do
185
+ trades = MultiJson.load(fixture('trades.json'))
186
+ stub_get('/api/1/BTCUSD/trades/fetch?since=1365780002144150').
187
+ to_return(body: MultiJson.dump({result: 'success', return: trades['return'].select{|t| t['tid'] >= '1365780002144150'}}))
188
+ end
189
+
190
+ it "should fetch trades since an id" do
191
+ trades = @client.trades :since => 1365780002144150
192
+ #puts trades.inspect
193
+ a_get('/api/1/BTCUSD/trades/fetch?since=1365780002144150').
194
+ should have_been_made
195
+ trades.first.price.should == 72.98274
196
+ trades.first.amount.should == 11.76583944
197
+ trades.first.id.should == 1365780002144150
198
+ end
199
+ end
200
+
141
201
  describe '#balance' do
142
202
  before do
143
203
  stub_post('/api/1/generic/info').
144
- with(body: test_body, headers: test_headers).
145
- to_return(status: 200, body: fixture('info.json'))
204
+ with(body: test_body, headers: test_headers(@client)).
205
+ to_return(body: fixture('info.json'))
146
206
  end
147
207
 
148
208
  it "should fetch balance" do
149
209
  balance = @client.balance
150
210
  a_post("/api/1/generic/info").
151
- with(body: test_body, headers: test_headers).
211
+ with(body: test_body, headers: test_headers(@client)).
152
212
  should have_been_made
153
213
  balance.first.currency.should == "BTC"
154
214
  balance.first.amount.should == 42.0
@@ -160,15 +220,15 @@ describe MtGox::Client do
160
220
  describe "order methods" do
161
221
  before :each do
162
222
  stub_post('/api/1/generic/orders').
163
- with(body: test_body, headers: test_headers).
164
- to_return(status: 200, body: fixture('orders.json'))
223
+ with(body: test_body, headers: test_headers(@client)).
224
+ to_return(body: fixture('orders.json'))
165
225
  end
166
226
 
167
227
  describe "#buys" do
168
228
  it "should fetch orders" do
169
229
  buys = @client.buys
170
230
  a_post("/api/1/generic/orders").
171
- with(body: test_body, headers: test_headers).
231
+ with(body: test_body, headers: test_headers(@client)).
172
232
  should have_been_made
173
233
  buys.last.price.should == 7
174
234
  buys.last.date.should == Time.utc(2011, 6, 27, 18, 20, 38)
@@ -179,7 +239,7 @@ describe MtGox::Client do
179
239
  it "should fetch sells" do
180
240
  sells = @client.sells
181
241
  a_post("/api/1/generic/orders").
182
- with(body: test_body, headers: test_headers).
242
+ with(body: test_body, headers: test_headers(@client)).
183
243
  should have_been_made
184
244
  sells.last.price.should == 99.0
185
245
  sells.last.date.should == Time.utc(2011, 6, 27, 18, 20, 20)
@@ -190,7 +250,7 @@ describe MtGox::Client do
190
250
  it "should fetch both buys and sells, with only one call" do
191
251
  orders = @client.orders
192
252
  a_post("/api/1/generic/orders").
193
- with(body: test_body, headers: test_headers).
253
+ with(body: test_body, headers: test_headers(@client)).
194
254
  should have_been_made
195
255
  orders[:buys].last.price.should == 7.0
196
256
  orders[:buys].last.date.should == Time.utc(2011, 6, 27, 18, 20, 38)
@@ -203,16 +263,30 @@ describe MtGox::Client do
203
263
  describe "#buy!" do
204
264
  before do
205
265
  body = test_body({"type" => "bid", "amount_int" => "88000000", "price_int" => "89000"})
266
+ body_market = test_body({"type" => "bid", "amount_int" => "88000000"})
267
+
268
+ stub_post('/api/1/BTCUSD/order/add').
269
+ with(body: body, headers: test_headers(@client, body)).
270
+ to_return(body: fixture('buy.json'))
206
271
  stub_post('/api/1/BTCUSD/order/add').
207
- with(body: body, headers: test_headers(body)).
208
- to_return(status: 200, body: fixture('buy.json'))
272
+ with(body: body_market, headers: test_headers(@client, body_market)).
273
+ to_return(body: fixture('buy.json'))
209
274
  end
210
275
 
211
276
  it "should place a bid" do
212
277
  buy = @client.buy!(0.88, 0.89)
213
278
  body = test_body({"type" => "bid", "amount_int" => "88000000", "price_int" => "89000"})
214
279
  a_post("/api/1/BTCUSD/order/add").
215
- with(body: body, headers: test_headers(body)).
280
+ with(body: body, headers: test_headers(@client, body)).
281
+ should have_been_made
282
+ buy.should == "490a214f-9a30-449f-acb8-780f9046502f"
283
+ end
284
+
285
+ it "should place a market bid" do
286
+ buy = @client.buy!(0.88, :market)
287
+ body_market = test_body({"type" => "bid", "amount_int" => "88000000"})
288
+ a_post("/api/1/BTCUSD/order/add").
289
+ with(body: body_market, headers: test_headers(@client, body_market)).
216
290
  should have_been_made
217
291
  buy.should == "490a214f-9a30-449f-acb8-780f9046502f"
218
292
  end
@@ -221,16 +295,30 @@ describe MtGox::Client do
221
295
  describe "#sell!" do
222
296
  before do
223
297
  body = test_body({"type" => "ask", "amount_int" => "88000000", "price_int" => "8900000"})
298
+ body_market = test_body({"type" => "ask", "amount_int" => "88000000"})
299
+
300
+ stub_post('/api/1/BTCUSD/order/add').
301
+ with(body: body, headers: test_headers(@client, body)).
302
+ to_return(body: fixture('sell.json'))
224
303
  stub_post('/api/1/BTCUSD/order/add').
225
- with(body: body, headers: test_headers(body)).
226
- to_return(status: 200, body: fixture('sell.json'))
304
+ with(body: body_market, headers: test_headers(@client, body_market)).
305
+ to_return(body: fixture('sell.json'))
227
306
  end
228
307
 
229
308
  it "should place an ask" do
230
309
  body = test_body({"type" => "ask", "amount_int" => "88000000", "price_int" => "8900000"})
231
310
  sell = @client.sell!(0.88, 89.0)
232
311
  a_post("/api/1/BTCUSD/order/add").
233
- with(body: body, headers: test_headers(body)).
312
+ with(body: body, headers: test_headers(@client, body)).
313
+ should have_been_made
314
+ sell.should == "a20329fe-c0d5-4378-b204-79a7800d41e7"
315
+ end
316
+
317
+ it "should place a market ask" do
318
+ body_market = test_body({"type" => "ask", "amount_int" => "88000000"})
319
+ sell = @client.sell!(0.88, :market)
320
+ a_post("/api/1/BTCUSD/order/add").
321
+ with(body: body_market, headers: test_headers(@client, body_market)).
234
322
  should have_been_made
235
323
  sell.should == "a20329fe-c0d5-4378-b204-79a7800d41e7"
236
324
  end
@@ -240,11 +328,11 @@ describe MtGox::Client do
240
328
  before do
241
329
  cancel_body = test_body({"oid" => "fda8917a-63d3-4415-b827-758408013690"})
242
330
  stub_post('/api/1/generic/orders').
243
- with(body: test_body, headers: test_headers).
244
- to_return(status: 200, body: fixture('orders.json'))
331
+ with(body: test_body, headers: test_headers(@client)).
332
+ to_return(body: fixture('orders.json'))
245
333
  stub_post('/api/1/BTCUSD/order/cancel').
246
- with(body: cancel_body, headers: test_headers(cancel_body)).
247
- to_return(status: 200, body: fixture('cancel.json'))
334
+ with(body: cancel_body, headers: test_headers(@client, cancel_body)).
335
+ to_return(body: fixture('cancel.json'))
248
336
  end
249
337
 
250
338
  context "with a valid oid passed" do
@@ -252,10 +340,10 @@ describe MtGox::Client do
252
340
  cancel = @client.cancel("fda8917a-63d3-4415-b827-758408013690")
253
341
  cancel_body = test_body({"oid" => "fda8917a-63d3-4415-b827-758408013690"})
254
342
  a_post("/api/1/generic/orders").
255
- with(body: test_body, headers: test_headers).
343
+ with(body: test_body, headers: test_headers(@client)).
256
344
  should have_been_made.once
257
345
  a_post('/api/1/BTCUSD/order/cancel').
258
- with(body: cancel_body, headers: test_headers(cancel_body)).
346
+ with(body: cancel_body, headers: test_headers(@client, cancel_body)).
259
347
  should have_been_made
260
348
  cancel[:buys].length.should == 0
261
349
  end
@@ -272,7 +360,7 @@ describe MtGox::Client do
272
360
  cancel = @client.cancel({'oid' => "fda8917a-63d3-4415-b827-758408013690", 'type' => 2})
273
361
  body = test_body({"oid" => "fda8917a-63d3-4415-b827-758408013690"})
274
362
  a_post('/api/1/BTCUSD/order/cancel').
275
- with(body: body, headers: test_headers(body)).
363
+ with(body: body, headers: test_headers(@client, body)).
276
364
  should have_been_made
277
365
  cancel[:buys].length.should == 0
278
366
  cancel[:sells].last.price.should == 99.0
@@ -285,15 +373,15 @@ describe MtGox::Client do
285
373
  before do
286
374
  body = test_body({"amount_int" => "100000000", "address" => "1KxSo9bGBfPVFEtWNLpnUK1bfLNNT4q31L"})
287
375
  stub_post('/api/1/generic/bitcoin/send_simple').
288
- with(body: body, headers: test_headers(body)).
289
- to_return(status: 200, body: fixture('withdraw.json'))
376
+ with(body: body, headers: test_headers(@client, body)).
377
+ to_return(body: fixture('withdraw.json'))
290
378
  end
291
379
 
292
380
  it "should withdraw funds" do
293
381
  withdraw = @client.withdraw!(1.0, "1KxSo9bGBfPVFEtWNLpnUK1bfLNNT4q31L")
294
382
  body = test_body({"amount_int" => "100000000", "address" => "1KxSo9bGBfPVFEtWNLpnUK1bfLNNT4q31L"})
295
383
  a_post("/api/1/generic/bitcoin/send_simple").
296
- with(body: body, headers: test_headers(body)).
384
+ with(body: body, headers: test_headers(@client, body)).
297
385
  should have_been_made
298
386
  withdraw.should == "311295deadbeef390a13c038e2b8ba77feebdaed2c1a59e6e0bdf001656e1314"
299
387
  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: 0.9.0
4
+ version: 0.9.1
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-04-15 00:00:00.000000000 Z
39
+ date: 2013-05-06 00:00:00.000000000 Z
40
40
  dependencies:
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: faraday
@@ -116,6 +116,7 @@ files:
116
116
  - lib/mtgox/configuration.rb
117
117
  - lib/mtgox/connection.rb
118
118
  - lib/mtgox/error.rb
119
+ - lib/mtgox/lag.rb
119
120
  - lib/mtgox/max_bid.rb
120
121
  - lib/mtgox/min_ask.rb
121
122
  - lib/mtgox/offer.rb
@@ -135,7 +136,9 @@ files:
135
136
  - spec/fixtures/cancel.json
136
137
  - spec/fixtures/depth.json
137
138
  - spec/fixtures/error.json
139
+ - spec/fixtures/idkey.json
138
140
  - spec/fixtures/info.json
141
+ - spec/fixtures/lag.json
139
142
  - spec/fixtures/mysql_error
140
143
  - spec/fixtures/orders.json
141
144
  - spec/fixtures/sell.json
@@ -177,7 +180,9 @@ test_files:
177
180
  - spec/fixtures/cancel.json
178
181
  - spec/fixtures/depth.json
179
182
  - spec/fixtures/error.json
183
+ - spec/fixtures/idkey.json
180
184
  - spec/fixtures/info.json
185
+ - spec/fixtures/lag.json
181
186
  - spec/fixtures/mysql_error
182
187
  - spec/fixtures/orders.json
183
188
  - spec/fixtures/sell.json
metadata.gz.sig CHANGED
@@ -1,2 +1,3 @@
1
-
2
- �#��\Ŕ}�O����&?cN�׸��y�Iű ,��n�ߊ�͛�����c�^��}&�� )���u��zV8O\a���lm诅ݪ6W�؜⾜I�]�y��X�V:;l�j-/�/�o��4A��� ���or���5@/*�|׼��)dX�|>����i�@����R��������� ܩ�
1
+ ��O�^�(�QC@����Sf�q���5;� �:�Ώ]�:��٩�̼��N^�vTR�l��6��>x�SI2VȘi������1�}\�����⧾��K�z
2
+ ��L��=T���k���m|�A�U�$�� E��}>�\i*���s���m=����֍���v���~����o���E�&�1fNn&P�Q[�� *�\_E���~�+V_[s(G(� ���Ǥ�y��\�޿
3
+ h��G�.��c�