ib-ruby 0.5.21 → 0.6.1

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.
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