ib-ruby 0.5.21 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/HISTORY +8 -0
  2. data/README.md +46 -27
  3. data/TODO +13 -2
  4. data/VERSION +1 -1
  5. data/bin/generic_data.rb +26 -0
  6. data/bin/place_order +1 -1
  7. data/lib/ib-ruby/connection.rb +126 -65
  8. data/lib/ib-ruby/messages/incoming.rb +3 -3
  9. data/lib/ib-ruby/models/bar.rb +11 -11
  10. data/lib/ib-ruby/models/combo_leg.rb +23 -29
  11. data/lib/ib-ruby/models/contract/bag.rb +34 -2
  12. data/lib/ib-ruby/models/contract/option.rb +2 -2
  13. data/lib/ib-ruby/models/contract.rb +151 -197
  14. data/lib/ib-ruby/models/execution.rb +27 -45
  15. data/lib/ib-ruby/models/model.rb +10 -4
  16. data/lib/ib-ruby/models/model_properties.rb +63 -0
  17. data/lib/ib-ruby/models/order.rb +274 -320
  18. data/lib/ib-ruby/symbols/stocks.rb +11 -5
  19. data/spec/account_helper.rb +80 -0
  20. data/spec/ib-ruby/connection_spec.rb +195 -52
  21. data/spec/ib-ruby/messages/incoming_spec.rb +4 -4
  22. data/spec/ib-ruby/models/combo_leg_spec.rb +1 -0
  23. data/spec/ib-ruby/models/contract_spec.rb +1 -1
  24. data/spec/ib-ruby/models/execution_spec.rb +73 -0
  25. data/spec/integration/account_info_spec.rb +12 -59
  26. data/spec/integration/contract_info_spec.rb +23 -37
  27. data/spec/integration/depth_data_spec.rb +4 -4
  28. data/spec/integration/historic_data_spec.rb +15 -27
  29. data/spec/integration/market_data_spec.rb +74 -61
  30. data/spec/integration/option_data_spec.rb +5 -48
  31. data/spec/integration/orders/execution_spec.rb +26 -31
  32. data/spec/integration/orders/open_order +2 -0
  33. data/spec/integration/orders/placement_spec.rb +28 -28
  34. data/spec/integration/orders/valid_ids_spec.rb +11 -11
  35. data/spec/integration_helper.rb +46 -32
  36. data/spec/message_helper.rb +4 -38
  37. data/spec/spec_helper.rb +2 -3
  38. metadata +9 -2
@@ -7,19 +7,20 @@ describe "Orders", :connected => true, :integration => true do
7
7
  context "Placing wrong order", :slow => true do
8
8
 
9
9
  before(:all) do
10
- connect_and_receive :NextValidID, :Alert, :OpenOrder, :OrderStatus
11
- wait_for { received? :NextValidID }
10
+ @ib = IB::Connection.new OPTS[:connection].merge(:logger => mock_logger)
11
+
12
+ @ib.wait_for :NextValidId
12
13
 
13
14
  place_order IB::Symbols::Stocks[:wfc],
14
15
  :limit_price => 9.131313 # Weird non-acceptable price
15
- wait_for 1
16
+ @ib.wait_for 1
16
17
  end
17
18
 
18
19
  after(:all) { close_connection }
19
20
 
20
21
  it 'does not place new Order' do
21
- @received[:OpenOrder].should be_empty
22
- @received[:OrderStatus].should be_empty
22
+ @ib.received[:OpenOrder].should be_empty
23
+ @ib.received[:OrderStatus].should be_empty
23
24
  end
24
25
 
25
26
  it 'still changes client`s next_order_id' do
@@ -28,7 +29,7 @@ describe "Orders", :connected => true, :integration => true do
28
29
  end
29
30
 
30
31
  context 'received :Alert message' do
31
- subject { @received[:Alert].last }
32
+ subject { @ib.received[:Alert].last }
32
33
 
33
34
  it { should be_an IB::Messages::Incoming::Alert }
34
35
  it { should be_error }
@@ -40,12 +41,12 @@ describe "Orders", :connected => true, :integration => true do
40
41
 
41
42
  context "Off-market stock order" do
42
43
  before(:all) do
43
- connect_and_receive :NextValidID, :Alert, :OpenOrder, :OrderStatus, :OpenOrderEnd
44
- wait_for { received? :NextValidID }
44
+ @ib = IB::Connection.new OPTS[:connection].merge(:logger => mock_logger)
45
+ @ib.wait_for :NextValidId
45
46
 
46
47
  place_order IB::Symbols::Stocks[:wfc],
47
48
  :limit_price => 9.13 # Set acceptable price
48
- wait_for { @received[:OpenOrder].size > 2 && @received[:OpenOrder].size > 1 }
49
+ @ib.wait_for [:OpenOrder, 3], [:OrderStatus, 2]
49
50
  end
50
51
 
51
52
  after(:all) { close_connection }
@@ -58,8 +59,8 @@ describe "Orders", :connected => true, :integration => true do
58
59
  @ib.next_order_id.should == @order_id_before + 1
59
60
  end
60
61
 
61
- it { @received[:OpenOrder].should have_at_least(1).open_order_message }
62
- it { @received[:OrderStatus].should have_at_least(1).status_message }
62
+ it { @ib.received[:OpenOrder].should have_at_least(1).open_order_message }
63
+ it { @ib.received[:OrderStatus].should have_at_least(1).status_message }
63
64
 
64
65
  it 'receives confirmation of Order submission' do
65
66
  open_order_should_be /Submitted/ # ()Pre)Submitted
@@ -69,9 +70,8 @@ describe "Orders", :connected => true, :integration => true do
69
70
 
70
71
  context "Retrieving placed orders" do
71
72
  before(:all) do
72
- @ib.send_message :RequestAllOpenOrders
73
-
74
- wait_for { received?(:OpenOrderEnd) }
73
+ @ib.send_message :RequestOpenOrders
74
+ @ib.wait_for :OpenOrderEnd
75
75
  end
76
76
 
77
77
  after(:all) { clean_connection } # Clear logs and message collector
@@ -80,10 +80,10 @@ describe "Orders", :connected => true, :integration => true do
80
80
  @ib.next_order_id.should == @order_id_after
81
81
  end
82
82
 
83
- it { @received[:OpenOrder].should have_exactly(1).open_order_message }
84
- it { @received[:OrderStatus].should have_exactly(1).status_message }
85
- it { @received[:OpenOrderEnd].should have_exactly(1).order_end_message }
86
- it { @received[:Alert].should have_exactly(0).alert_messages }
83
+ it { @ib.received[:OpenOrder].should have_exactly(1).open_order_message }
84
+ it { @ib.received[:OrderStatus].should have_exactly(1).status_message }
85
+ it { @ib.received[:OpenOrderEnd].should have_exactly(1).order_end_message }
86
+ it { @ib.received[:Alert].should have_exactly(0).alert_messages }
87
87
 
88
88
  it 'receives OpenOrder and OrderStatus for placed order' do
89
89
  open_order_should_be /Submitted/
@@ -95,7 +95,7 @@ describe "Orders", :connected => true, :integration => true do
95
95
  before(:all) do
96
96
  @ib.cancel_order @order_id_placed
97
97
 
98
- wait_for { received?(:OrderStatus) && received?(:Alert) }
98
+ @ib.wait_for :OrderStatus, :Alert
99
99
  end
100
100
 
101
101
  after(:all) { clean_connection } # Clear logs and message collector
@@ -105,18 +105,18 @@ describe "Orders", :connected => true, :integration => true do
105
105
  end
106
106
 
107
107
  it 'does not receive OpenOrder message' do
108
- received?(:OpenOrder).should be_false
108
+ @ib.received?(:OpenOrder).should be_false
109
109
  end
110
110
 
111
- it { @received[:OrderStatus].should have_exactly(1).status_message }
112
- it { @received[:Alert].should have_exactly(1).alert_message }
111
+ it { @ib.received[:OrderStatus].should have_exactly(1).status_message }
112
+ it { @ib.received[:Alert].should have_exactly(1).alert_message }
113
113
 
114
114
  it 'receives cancellation Order Status' do
115
115
  order_status_should_be /Cancel/ # Cancelled / PendingCancel
116
116
  end
117
117
 
118
118
  it 'receives Order cancelled Alert' do
119
- alert = @received[:Alert].first
119
+ alert = @ib.received[:Alert].first
120
120
  alert.should be_an IB::Messages::Incoming::Alert
121
121
  alert.message.should =~ /Order Canceled - reason:/
122
122
  end
@@ -126,22 +126,22 @@ describe "Orders", :connected => true, :integration => true do
126
126
  before(:all) do
127
127
  @ib.cancel_order rand(99999999)
128
128
 
129
- wait_for { received?(:Alert) }
129
+ @ib.wait_for :Alert
130
130
  end
131
131
 
132
- it { @received[:Alert].should have_exactly(1).alert_message }
132
+ it { @ib.received[:Alert].should have_exactly(1).alert_message }
133
133
 
134
134
  it 'does not increase client`s next_order_id further' do
135
135
  @ib.next_order_id.should == @order_id_after
136
136
  end
137
137
 
138
138
  it 'does not receive Order messages' do
139
- received?(:OrderStatus).should be_false
140
- received?(:OpenOrder).should be_false
139
+ @ib.received?(:OrderStatus).should be_false
140
+ @ib.received?(:OpenOrder).should be_false
141
141
  end
142
142
 
143
143
  it 'receives unable to find Order Alert' do
144
- alert = @received[:Alert].first
144
+ alert = @ib.received[:Alert].first
145
145
  alert.should be_an IB::Messages::Incoming::Alert
146
146
  alert.message.should =~ /Can't find order with id =/
147
147
  end
@@ -1,14 +1,14 @@
1
1
  require 'integration_helper'
2
2
 
3
3
  shared_examples_for 'Received single id' do
4
- subject { @received[:NextValidID].first }
4
+ subject { @ib.received[:NextValidId].first }
5
5
 
6
6
  after(:all) { clean_connection }
7
7
 
8
- it { @received[:NextValidID].should have_exactly(1).message }
8
+ it { @ib.received[:NextValidId].should have_exactly(1).message }
9
9
 
10
10
  it 'receives next valid for Order placement' do
11
- subject.should be_an IB::Messages::Incoming::NextValidID
11
+ subject.should be_an IB::Messages::Incoming::NextValidId
12
12
  subject.order_id.should be_an Integer
13
13
  @id[:at_connect] ||= subject.order_id # just assign once
14
14
  end
@@ -19,7 +19,7 @@ shared_examples_for 'Received single id' do
19
19
  end
20
20
 
21
21
  shared_examples_for 'Received single id after request' do
22
- subject { @received[:NextValidID].first }
22
+ subject { @ib.received[:NextValidId].first }
23
23
 
24
24
  it_behaves_like 'Received single id'
25
25
 
@@ -28,7 +28,7 @@ shared_examples_for 'Received single id after request' do
28
28
  end
29
29
 
30
30
  it 'does not receive :OpenOrderEnd message' do
31
- @received[:OpenOrderEnd].should be_empty
31
+ @ib.received[:OpenOrderEnd].should be_empty
32
32
  end
33
33
 
34
34
  it 'does not reconnect to server' do
@@ -40,8 +40,8 @@ describe 'Ids valid for Order placement', :connected => true, :integration => tr
40
40
 
41
41
  before(:all) do
42
42
  verify_account
43
- connect_and_receive :NextValidID, :OpenOrderEnd, :Alert
44
- wait_for(2) { received? :OpenOrderEnd }
43
+ @ib = IB::Connection.new OPTS[:connection].merge(:logger => mock_logger)
44
+ @ib.wait_for 3, :OpenOrderEnd, :NextValidId
45
45
  @id = {} # Moving id between contexts. Feels dirty.
46
46
  end
47
47
 
@@ -51,10 +51,10 @@ describe 'Ids valid for Order placement', :connected => true, :integration => tr
51
51
 
52
52
  it_behaves_like 'Received single id'
53
53
 
54
- it { @received[:OpenOrderEnd].should have_exactly(1).message }
54
+ it { @ib.received[:OpenOrderEnd].should have_exactly(1).message }
55
55
 
56
56
  it 'receives also :OpenOrderEnd message' do
57
- @received[:OpenOrderEnd].first.should be_an IB::Messages::Incoming::OpenOrderEnd
57
+ @ib.received[:OpenOrderEnd].first.should be_an IB::Messages::Incoming::OpenOrderEnd
58
58
  end
59
59
 
60
60
  it 'logs connection notification' do
@@ -65,7 +65,7 @@ describe 'Ids valid for Order placement', :connected => true, :integration => tr
65
65
  context 'Requesting valid order id' do
66
66
  before(:all) do
67
67
  @ib.send_message :RequestIds
68
- wait_for 1 # sec
68
+ @ib.wait_for :NextValidId
69
69
  end
70
70
 
71
71
  it_behaves_like 'Received single id after request'
@@ -74,7 +74,7 @@ describe 'Ids valid for Order placement', :connected => true, :integration => tr
74
74
  context 'Requested number of valid ids is just silently ignored by TWS' do
75
75
  before(:all) do
76
76
  @ib.send_message :RequestIds, :number => 5
77
- wait_for 1 # sec
77
+ @ib.wait_for :NextValidId
78
78
  end
79
79
 
80
80
  it_behaves_like 'Received single id after request'
@@ -1,31 +1,47 @@
1
1
  require 'message_helper'
2
+ require 'account_helper'
3
+
4
+ shared_examples_for 'Received Market Data' do
5
+ context "received :Alert message " do
6
+ subject { @ib.received[:Alert].first }
7
+
8
+ it { should be_an IB::Messages::Incoming::Alert }
9
+ it { should be_warning }
10
+ it { should_not be_error }
11
+ its(:code) { should be_an Integer }
12
+ its(:message) { should =~ /Market data farm connection is OK/ }
13
+ its(:to_human) { should =~ /TWS Warning/ }
14
+ end
2
15
 
3
- # Make sure integration tests are only run against the pre-configured PAPER ACCOUNT
4
- def verify_account
5
- return OPTS[:account_verified] if OPTS[:account_verified]
6
-
7
- puts
8
- puts 'WARNING: MAKE SURE TO RUN INTEGRATION TESTS AGAINST IB PAPER ACCOUNT ONLY!'
9
- puts 'WARNING: FINANCIAL LOSSES MAY RESULT IF YOU RUN TESTS WITH REAL IB ACCOUNT!'
10
- puts 'WARNING: YOU HAVE BEEN WARNED!'
11
- puts
12
- puts 'Configure your connection to IB PAPER ACCOUNT in spec/spec_helper.rb'
13
- puts
14
-
15
- account = OPTS[:connection][:account] || OPTS[:connection][:account_name]
16
- raise "Please configure IB PAPER ACCOUNT in spec/spec_helper.rb" unless account
17
-
18
- connect_and_receive :AccountValue
19
- @ib.send_message :RequestAccountData, :subscribe => true
20
-
21
- wait_for { received? :AccountValue }
22
- raise "Unable to verify IB PAPER ACCOUNT" unless received? :AccountValue
23
-
24
- received = @received[:AccountValue].first.account_name
25
- raise "Connected to wrong account #{received}, expected #{account}" if account != received
16
+ context "received :TickPrice message" do
17
+ subject { @ib.received[:TickPrice].first }
18
+
19
+ it { should be_an IB::Messages::Incoming::TickPrice }
20
+ its(:tick_type) { should be_an Integer }
21
+ its(:type) { should be_a Symbol }
22
+ its(:price) { should be_a Float }
23
+ its(:size) { should be_an Integer }
24
+ its(:data) { should be_a Hash }
25
+ its(:ticker_id) { should == 456 } # ticker_id
26
+ its(:to_human) { should =~ /TickPrice/ }
27
+ end
26
28
 
27
- close_connection
28
- OPTS[:account_verified] = true
29
+ context "received :TickSize message", :if => :us_trading_hours do
30
+ before(:all) do
31
+ @ib.wait_for 3, :TickSize
32
+ end
33
+
34
+ subject { @ib.received[:TickSize].first }
35
+
36
+ it { should be_an IB::Messages::Incoming::TickSize }
37
+ its(:type) { should_not be_nil }
38
+ its(:data) { should be_a Hash }
39
+ its(:tick_type) { should be_an Integer }
40
+ its(:type) { should be_a Symbol }
41
+ its(:size) { should be_an Integer }
42
+ its(:ticker_id) { should == 456 }
43
+ its(:to_human) { should =~ /TickSize/ }
44
+ end
29
45
  end
30
46
 
31
47
  ### Helpers for placing and verifying orders
@@ -51,7 +67,7 @@ def check_status item, status
51
67
  end
52
68
 
53
69
  def order_status_should_be status, index=0
54
- msg = @received[:OrderStatus][index]
70
+ msg = @ib.received[:OrderStatus][index]
55
71
  msg.should be_an IB::Messages::Incoming::OrderStatus
56
72
  msg.order_id.should == @order_id_placed
57
73
  msg.perm_id.should be_an Integer
@@ -75,7 +91,7 @@ def order_status_should_be status, index=0
75
91
  end
76
92
 
77
93
  def open_order_should_be status, index=0
78
- msg = @received[:OpenOrder][index]
94
+ msg = @ib.received[:OpenOrder][index]
79
95
  msg.should be_an IB::Messages::Incoming::OpenOrder
80
96
  msg.order.should == @order
81
97
  msg.contract.should == @contract
@@ -84,13 +100,13 @@ def open_order_should_be status, index=0
84
100
  end
85
101
 
86
102
  def execution_should_be side, opts={}
87
- msg = @received[:ExecutionData][opts[:index] || -1]
103
+ msg = @ib.received[:ExecutionData][opts[:index] || -1]
88
104
  msg.request_id.should == (opts[:request_id] || -1)
89
105
  msg.contract.should == @contract
90
106
 
91
107
  exec = msg.execution
92
108
  exec.perm_id.should be_an Integer
93
- exec.perm_id.should == @received[:OpenOrder].last.order.perm_id if @received[:OpenOrder].last
109
+ exec.perm_id.should == @ib.received[:OpenOrder].last.order.perm_id if @ib.received?(:OpenOrder)
94
110
  exec.client_id.should == OPTS[:connection][:client_id]
95
111
  exec.order_id.should be_an Integer
96
112
  exec.order_id.should == @order.order_id if @order
@@ -98,7 +114,7 @@ def execution_should_be side, opts={}
98
114
  exec.time.should =~ /\d\d:\d\d:\d\d/
99
115
  exec.account_name.should == OPTS[:connection][:account_name]
100
116
  exec.exchange.should == 'IDEALPRO'
101
- exec.side.to_s.should == side
117
+ exec.side.should == side
102
118
  exec.shares.should == 20000
103
119
  exec.cumulative_quantity.should == 20000
104
120
  exec.price.should be > 1
@@ -106,5 +122,3 @@ def execution_should_be side, opts={}
106
122
  exec.price.should == exec.average_price
107
123
  exec.liquidation.should == 0
108
124
  end
109
-
110
-
@@ -2,15 +2,6 @@ require 'spec_helper'
2
2
  require 'thread'
3
3
  require 'stringio'
4
4
 
5
- def print_subject
6
- it 'prints out message' do
7
- p subject
8
- p subject.to_human
9
- end
10
- end
11
-
12
- alias ps print_subject
13
-
14
5
  ## Logger helpers
15
6
 
16
7
  def mock_logger
@@ -42,31 +33,16 @@ end
42
33
 
43
34
  ## Connection helpers
44
35
 
45
- def connect_and_receive *message_types
46
-
47
- # Start disconnected (we need to set up catch-all subscriber first)
48
- @ib = IB::Connection.new OPTS[:connection].merge(:connect => false,
49
- :reader => false,
50
- :logger => mock_logger)
51
-
52
- # Hash of received messages, keyed by message type
53
- @received = Hash.new { |hash, key| hash[key] = Array.new }
54
-
55
- # Catch all messages of given types and put them inside @received Hash
56
- @ib.subscribe(*message_types) { |msg| @received[msg.message_type] << msg }
57
-
58
- @ib.connect # We only connect after everything is subscribed
59
- @ib.start_reader
60
- end
61
-
62
36
  # Clear logs and message collector. Output may be silenced.
63
37
  def clean_connection
64
38
  unless OPTS[:silent]
65
- puts @received.map { |type, msg| [" #{type}:", msg.map(&:to_human)] } if @received
39
+ #puts @received.map { |type, msg| [" #{type}:", msg.map(&:to_human)] } if @received
40
+ puts @ib.received.map { |type, msg| [" #{type}:", msg.map(&:to_human)] }
66
41
  puts " Logs:", log_entries if @stdout
67
42
  end
68
43
  @stdout.string = '' if @stdout
69
- @received.clear if @received
44
+ @ib.clear_received
45
+ @received.clear if @received # In connection_spec
70
46
  end
71
47
 
72
48
  def close_connection
@@ -74,13 +50,3 @@ def close_connection
74
50
  @ib.close if @ib
75
51
  clean_connection
76
52
  end
77
-
78
- #noinspection RubyArgCount
79
- def wait_for time = 2, &condition
80
- timeout = Time.now + time
81
- sleep 0.1 until timeout < Time.now || condition && condition.call
82
- end
83
-
84
- def received? symbol, times=1
85
- @received[symbol].size >= times
86
- end
data/spec/spec_helper.rb CHANGED
@@ -13,8 +13,7 @@ RSpec.configure do |config|
13
13
  # 17:15 - 17:00 (ET) Sunday-Friday Forex 22:15 - 22:00 (UTC)
14
14
  !(t.wday > 0 && t.wday < 5 || t.wday == 5 && t.hour < 22)
15
15
  end
16
-
17
- end # :slow => true
16
+ end
18
17
  }
19
18
  # config.filter = { :focus => true }
20
19
  # config.include(UserExampleHelpers)
@@ -25,7 +24,7 @@ end
25
24
 
26
25
  # Top level metadata for test suite level hacking
27
26
  OPTS = {
28
- :silent => false, #true, # Verbosity of test outputs
27
+ :silent => true, #false, #true, # Verbosity of test outputs
29
28
  :brokertron => false, # Use mock (Brokertron) instead of paper account
30
29
  }
31
30
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: ib-ruby
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.5.21
5
+ version: 0.6.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Paul Legato
@@ -11,7 +11,7 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
 
14
- date: 2012-03-06 00:00:00 Z
14
+ date: 2012-03-14 00:00:00 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler
@@ -55,6 +55,7 @@ executables:
55
55
  - cancel_orders
56
56
  - contract_details
57
57
  - depth_of_market
58
+ - generic_data.rb
58
59
  - historic_data
59
60
  - historic_data_cli
60
61
  - list_orders
@@ -72,6 +73,7 @@ files:
72
73
  - bin/cancel_orders
73
74
  - bin/contract_details
74
75
  - bin/depth_of_market
76
+ - bin/generic_data.rb
75
77
  - bin/historic_data
76
78
  - bin/historic_data_cli
77
79
  - bin/list_orders
@@ -98,6 +100,7 @@ files:
98
100
  - lib/ib-ruby/models/contract.rb
99
101
  - lib/ib-ruby/models/execution.rb
100
102
  - lib/ib-ruby/models/model.rb
103
+ - lib/ib-ruby/models/model_properties.rb
101
104
  - lib/ib-ruby/models/order.rb
102
105
  - lib/ib-ruby/models/contract/bag.rb
103
106
  - lib/ib-ruby/models/contract/option.rb
@@ -105,6 +108,7 @@ files:
105
108
  - lib/ib-ruby/symbols/futures.rb
106
109
  - lib/ib-ruby/symbols/options.rb
107
110
  - lib/ib-ruby/symbols/stocks.rb
111
+ - spec/account_helper.rb
108
112
  - spec/integration_helper.rb
109
113
  - spec/message_helper.rb
110
114
  - spec/README.md
@@ -114,6 +118,7 @@ files:
114
118
  - spec/ib-ruby/messages/outgoing_spec.rb
115
119
  - spec/ib-ruby/models/combo_leg_spec.rb
116
120
  - spec/ib-ruby/models/contract_spec.rb
121
+ - spec/ib-ruby/models/execution_spec.rb
117
122
  - spec/ib-ruby/models/order_spec.rb
118
123
  - spec/integration/account_info_spec.rb
119
124
  - spec/integration/contract_info_spec.rb
@@ -166,6 +171,7 @@ signing_key:
166
171
  specification_version: 3
167
172
  summary: Ruby Implementation of the Interactive Brokers TWS API
168
173
  test_files:
174
+ - spec/account_helper.rb
169
175
  - spec/integration_helper.rb
170
176
  - spec/message_helper.rb
171
177
  - spec/README.md
@@ -175,6 +181,7 @@ test_files:
175
181
  - spec/ib-ruby/messages/outgoing_spec.rb
176
182
  - spec/ib-ruby/models/combo_leg_spec.rb
177
183
  - spec/ib-ruby/models/contract_spec.rb
184
+ - spec/ib-ruby/models/execution_spec.rb
178
185
  - spec/ib-ruby/models/order_spec.rb
179
186
  - spec/integration/account_info_spec.rb
180
187
  - spec/integration/contract_info_spec.rb