tradier 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. data/.yardopts +8 -0
  2. data/LICENSE.md +20 -0
  3. data/README.md +114 -0
  4. data/Rakefile +19 -0
  5. data/lib/tradier.rb +31 -0
  6. data/lib/tradier/account.rb +30 -0
  7. data/lib/tradier/api/accounts.rb +122 -0
  8. data/lib/tradier/api/markets.rb +113 -0
  9. data/lib/tradier/api/orders.rb +84 -0
  10. data/lib/tradier/api/utils.rb +47 -0
  11. data/lib/tradier/api/utils/account.rb +15 -0
  12. data/lib/tradier/api/utils/balance.rb +15 -0
  13. data/lib/tradier/api/utils/base.rb +46 -0
  14. data/lib/tradier/api/utils/event.rb +15 -0
  15. data/lib/tradier/api/utils/expiration.rb +19 -0
  16. data/lib/tradier/api/utils/gainloss.rb +15 -0
  17. data/lib/tradier/api/utils/history.rb +15 -0
  18. data/lib/tradier/api/utils/option_quote.rb +15 -0
  19. data/lib/tradier/api/utils/order.rb +15 -0
  20. data/lib/tradier/api/utils/position.rb +15 -0
  21. data/lib/tradier/api/utils/quote.rb +15 -0
  22. data/lib/tradier/api/utils/strike.rb +15 -0
  23. data/lib/tradier/api/utils/timesales.rb +15 -0
  24. data/lib/tradier/api/utils/watchlist.rb +15 -0
  25. data/lib/tradier/api/watchlists.rb +139 -0
  26. data/lib/tradier/balance.rb +17 -0
  27. data/lib/tradier/base.rb +76 -0
  28. data/lib/tradier/calendar.rb +23 -0
  29. data/lib/tradier/client.rb +89 -0
  30. data/lib/tradier/clock.rb +21 -0
  31. data/lib/tradier/configurable.rb +76 -0
  32. data/lib/tradier/core_ext/enumerable.rb +9 -0
  33. data/lib/tradier/default.rb +75 -0
  34. data/lib/tradier/error.rb +34 -0
  35. data/lib/tradier/error/bad_gateway.rb +11 -0
  36. data/lib/tradier/error/bad_request.rb +10 -0
  37. data/lib/tradier/error/client_error.rb +28 -0
  38. data/lib/tradier/error/configuration_error.rb +6 -0
  39. data/lib/tradier/error/decode_error.rb +9 -0
  40. data/lib/tradier/error/forbidden.rb +10 -0
  41. data/lib/tradier/error/gateway_timeout.rb +11 -0
  42. data/lib/tradier/error/internal_server_error.rb +11 -0
  43. data/lib/tradier/error/not_acceptable.rb +10 -0
  44. data/lib/tradier/error/not_found.rb +10 -0
  45. data/lib/tradier/error/raise_error.rb +31 -0
  46. data/lib/tradier/error/server_error.rb +28 -0
  47. data/lib/tradier/error/service_unavailable.rb +11 -0
  48. data/lib/tradier/error/too_many_requests.rb +12 -0
  49. data/lib/tradier/error/unauthorized.rb +10 -0
  50. data/lib/tradier/error/unprocessable_entity.rb +10 -0
  51. data/lib/tradier/event.rb +8 -0
  52. data/lib/tradier/history.rb +20 -0
  53. data/lib/tradier/option_quote.rb +37 -0
  54. data/lib/tradier/order.rb +14 -0
  55. data/lib/tradier/position.rb +7 -0
  56. data/lib/tradier/profile.rb +14 -0
  57. data/lib/tradier/quote.rb +12 -0
  58. data/lib/tradier/response/parse_json.rb +25 -0
  59. data/lib/tradier/response/raise_error.rb +31 -0
  60. data/lib/tradier/symbol.rb +147 -0
  61. data/lib/tradier/timesales.rb +11 -0
  62. data/lib/tradier/version.rb +3 -0
  63. data/lib/tradier/watchlist.rb +16 -0
  64. data/lib/tradier/watchlist_item.rb +17 -0
  65. data/spec/fixtures/account_balances.json +28 -0
  66. data/spec/fixtures/account_gainloss.json +18 -0
  67. data/spec/fixtures/account_history.json +96 -0
  68. data/spec/fixtures/account_orders.json +833 -0
  69. data/spec/fixtures/account_positions.json +22 -0
  70. data/spec/fixtures/calendar.json +400 -0
  71. data/spec/fixtures/chain.json +2972 -0
  72. data/spec/fixtures/clock.json +10 -0
  73. data/spec/fixtures/expirations.json +18 -0
  74. data/spec/fixtures/history.json +2086 -0
  75. data/spec/fixtures/option_quote.json +14 -0
  76. data/spec/fixtures/option_quotes.json +26 -0
  77. data/spec/fixtures/order.json +1 -0
  78. data/spec/fixtures/order_with_warnings.json +17 -0
  79. data/spec/fixtures/placed_order.json +6 -0
  80. data/spec/fixtures/quote.json +45 -0
  81. data/spec/fixtures/quotes.json +88 -0
  82. data/spec/fixtures/session.json +6 -0
  83. data/spec/fixtures/strikes.json +173 -0
  84. data/spec/fixtures/timesales.json +2956 -0
  85. data/spec/fixtures/user_balances.json +118 -0
  86. data/spec/fixtures/user_gainloss.json +6775 -0
  87. data/spec/fixtures/user_history.json +101 -0
  88. data/spec/fixtures/user_orders.json +57 -0
  89. data/spec/fixtures/user_positions.json +50 -0
  90. data/spec/fixtures/user_profile.json +103 -0
  91. data/spec/fixtures/watchlist.json +30 -0
  92. data/spec/fixtures/watchlist_item.json +6 -0
  93. data/spec/fixtures/watchlists.json +18 -0
  94. data/spec/spec_helper.rb +64 -0
  95. data/spec/tradier/account_spec.rb +76 -0
  96. data/spec/tradier/api/accounts_spec.rb +195 -0
  97. data/spec/tradier/api/markets_spec.rb +219 -0
  98. data/spec/tradier/api/orders_spec.rb +94 -0
  99. data/spec/tradier/api/utils/expiration_spec.rb +8 -0
  100. data/spec/tradier/api/watchlists_spec.rb +164 -0
  101. data/spec/tradier/balance_spec.rb +4 -0
  102. data/spec/tradier/base_spec.rb +11 -0
  103. data/spec/tradier/calendar_spec.rb +27 -0
  104. data/spec/tradier/client_spec.rb +125 -0
  105. data/spec/tradier/clock_spec.rb +73 -0
  106. data/spec/tradier/error/client_error_spec.rb +22 -0
  107. data/spec/tradier/error/server_error_spec.rb +22 -0
  108. data/spec/tradier/error_spec.rb +26 -0
  109. data/spec/tradier/option_quote_spec.rb +61 -0
  110. data/spec/tradier/order_spec.rb +43 -0
  111. data/spec/tradier/position_spec.rb +4 -0
  112. data/spec/tradier/profile_spec.rb +28 -0
  113. data/spec/tradier/quote_spec.rb +29 -0
  114. data/spec/tradier/symbol_spec.rb +54 -0
  115. data/spec/tradier/watchlist_item_spec.rb +48 -0
  116. data/spec/tradier/watchlist_spec.rb +35 -0
  117. data/spec/tradier_spec.rb +105 -0
  118. data/tradier.gemspec +30 -0
  119. metadata +302 -0
@@ -0,0 +1,101 @@
1
+ {
2
+ "accounts": {
3
+ "account": {
4
+ "history": {
5
+ "event": [
6
+ {
7
+ "acct_no": 0,
8
+ "amount": 0,
9
+ "date": "2013-06-13T06:20:06.110Z",
10
+ "description": "null",
11
+ "event_type": "null",
12
+ "meta": "null",
13
+ "symbol": "null"
14
+ },
15
+ {
16
+ "acct_no": 0,
17
+ "amount": 0,
18
+ "date": "2013-06-14T06:20:05.133Z",
19
+ "description": "null",
20
+ "event_type": "null",
21
+ "meta": "null",
22
+ "symbol": "null"
23
+ },
24
+ {
25
+ "acct_no": 0,
26
+ "amount": 0,
27
+ "date": "2013-06-14T06:20:05.727Z",
28
+ "description": "null",
29
+ "event_type": "null",
30
+ "meta": "null",
31
+ "symbol": "null"
32
+ },
33
+ {
34
+ "acct_no": 0,
35
+ "amount": 0,
36
+ "date": "2013-06-14T06:20:06.147Z",
37
+ "description": "null",
38
+ "event_type": "null",
39
+ "meta": "null",
40
+ "symbol": "null"
41
+ },
42
+ {
43
+ "acct_no": 0,
44
+ "amount": 0,
45
+ "date": "2013-06-14T06:20:06.320Z",
46
+ "description": "null",
47
+ "event_type": "null",
48
+ "meta": "null",
49
+ "symbol": "null"
50
+ },
51
+ {
52
+ "acct_no": 0,
53
+ "amount": 0,
54
+ "date": "2013-06-15T06:20:03.843Z",
55
+ "description": "null",
56
+ "event_type": "null",
57
+ "meta": "null",
58
+ "symbol": "null"
59
+ },
60
+ {
61
+ "acct_no": 0,
62
+ "amount": 0,
63
+ "date": "2013-06-15T06:20:04.593Z",
64
+ "description": "null",
65
+ "event_type": "null",
66
+ "meta": "null",
67
+ "symbol": "null"
68
+ },
69
+ {
70
+ "acct_no": 0,
71
+ "amount": 0,
72
+ "date": "2013-06-15T06:20:05.310Z",
73
+ "description": "null",
74
+ "event_type": "null",
75
+ "meta": "null",
76
+ "symbol": "null"
77
+ },
78
+ {
79
+ "acct_no": 0,
80
+ "amount": 0,
81
+ "date": "2013-06-15T06:20:05.590Z",
82
+ "description": "null",
83
+ "event_type": "null",
84
+ "meta": "null",
85
+ "symbol": "null"
86
+ },
87
+ {
88
+ "acct_no": 0,
89
+ "amount": 0,
90
+ "date": "2013-06-16T06:20:04.967Z",
91
+ "description": "null",
92
+ "event_type": "null",
93
+ "meta": "null",
94
+ "symbol": "null"
95
+ }
96
+ ]
97
+ },
98
+ "account_number": 15970260
99
+ }
100
+ }
101
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "accounts": {
3
+ "account": {
4
+ "account_number": 10026165,
5
+ "orders": {
6
+ "order": [
7
+ {
8
+ "account_id": 0,
9
+ "exec_inst": 0,
10
+ "exec_status": "Filled",
11
+ "extended_hours": false,
12
+ "id": 0,
13
+ "num_legs": 0,
14
+ "option_type": "Undefined",
15
+ "order_id": 952,
16
+ "parent_id": 0,
17
+ "price": 0.0,
18
+ "quantity": 2.0,
19
+ "request_date": "2013-06-06T15:24:50.333Z",
20
+ "response_date": "2013-06-06T15:24:50.410Z",
21
+ "side": "Buy",
22
+ "status": "Filled",
23
+ "symbol": "AAPL",
24
+ "time_in_force": "Day",
25
+ "trailing_limit_type": 0,
26
+ "trailing_stop_type": 0,
27
+ "type": "Market",
28
+ "userId": 1005
29
+ },
30
+ {
31
+ "account_id": 0,
32
+ "exec_inst": 0,
33
+ "exec_status": "Filled",
34
+ "extended_hours": false,
35
+ "id": 0,
36
+ "num_legs": 0,
37
+ "option_type": "Undefined",
38
+ "order_id": 953,
39
+ "parent_id": 0,
40
+ "price": 0.0,
41
+ "quantity": 2.0,
42
+ "request_date": "2013-06-06T15:29:27.973Z",
43
+ "response_date": "2013-06-06T15:29:28.003Z",
44
+ "side": "Buy",
45
+ "status": "Filled",
46
+ "symbol": "AAPL",
47
+ "time_in_force": "Day",
48
+ "trailing_limit_type": 0,
49
+ "trailing_stop_type": 0,
50
+ "type": "Market",
51
+ "userId": 1005
52
+ }
53
+ ]
54
+ }
55
+ }
56
+ }
57
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "accounts": {
3
+ "account": [
4
+ {
5
+ "account_number": 64394603,
6
+ "positions": "null"
7
+ },
8
+ {
9
+ "account_number": 64394610,
10
+ "positions": {
11
+ "position": [
12
+ {
13
+ "cost_basis": 9847.3500000000004,
14
+ "date_acquired": "2013-08-12T20:09:01.437Z",
15
+ "description": "null",
16
+ "id": 507,
17
+ "quantity": 21.0,
18
+ "symbol": "AAPL"
19
+ },
20
+ {
21
+ "cost_basis": -2.0,
22
+ "date_acquired": "2013-08-13T18:37:49.927Z",
23
+ "description": "null",
24
+ "id": 513,
25
+ "quantity": -1.0,
26
+ "symbol": "DELL140118C00015000"
27
+ }
28
+ ]
29
+ }
30
+ },
31
+ {
32
+ "account_number": 64394613,
33
+ "positions": {
34
+ "position": {
35
+ "cost_basis": 49700.0,
36
+ "date_acquired": "2013-07-29T16:21:56.167Z",
37
+ "description": "null",
38
+ "id": 477,
39
+ "quantity": 10.0,
40
+ "symbol": "AAPL131019C00400000"
41
+ }
42
+ }
43
+ },
44
+ {
45
+ "account_number": 37733449,
46
+ "positions": "null"
47
+ }
48
+ ]
49
+ }
50
+ }
@@ -0,0 +1,103 @@
1
+ {
2
+ "profile": {
3
+ "account": [
4
+ {
5
+ "account_number": 10026165,
6
+ "id": 8,
7
+ "status": 0,
8
+ "type": "Margin"
9
+ },
10
+ {
11
+ "account_number": 15970260,
12
+ "id": 10,
13
+ "status": 0,
14
+ "type": "Margin"
15
+ },
16
+ {
17
+ "account_number": 10060892,
18
+ "id": 12,
19
+ "status": 0,
20
+ "type": "Margin"
21
+ },
22
+ {
23
+ "account_number": 64394601,
24
+ "id": 22,
25
+ "status": 0,
26
+ "type": "Margin"
27
+ },
28
+ {
29
+ "account_number": 64394602,
30
+ "id": 24,
31
+ "status": 0,
32
+ "type": "Margin"
33
+ },
34
+ {
35
+ "account_number": 64394603,
36
+ "id": 26,
37
+ "status": 0,
38
+ "type": "Margin"
39
+ },
40
+ {
41
+ "account_number": 64394604,
42
+ "id": 28,
43
+ "status": 0,
44
+ "type": "Margin"
45
+ },
46
+ {
47
+ "account_number": 64394605,
48
+ "id": 30,
49
+ "status": 0,
50
+ "type": "Margin"
51
+ },
52
+ {
53
+ "account_number": 64394606,
54
+ "id": 32,
55
+ "status": 0,
56
+ "type": "Margin"
57
+ },
58
+ {
59
+ "account_number": 64394607,
60
+ "id": 34,
61
+ "status": 0,
62
+ "type": "Margin"
63
+ },
64
+ {
65
+ "account_number": 64394608,
66
+ "id": 36,
67
+ "status": 0,
68
+ "type": "Margin"
69
+ },
70
+ {
71
+ "account_number": 64394609,
72
+ "id": 38,
73
+ "status": 0,
74
+ "type": "Margin"
75
+ },
76
+ {
77
+ "account_number": 64394610,
78
+ "id": 40,
79
+ "status": 0,
80
+ "type": "Margin"
81
+ },
82
+ {
83
+ "account_number": 64394611,
84
+ "id": 42,
85
+ "status": 0,
86
+ "type": "Margin"
87
+ },
88
+ {
89
+ "account_number": 64394612,
90
+ "id": 44,
91
+ "status": 0,
92
+ "type": "Margin"
93
+ },
94
+ {
95
+ "account_number": 64394613,
96
+ "id": 46,
97
+ "status": 0,
98
+ "type": "Margin"
99
+ }
100
+ ],
101
+ "name": "test-ebenes"
102
+ }
103
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "watchlist": {
3
+ "id": "default",
4
+ "items": {
5
+ "item": [
6
+ {
7
+ "purchase-price": 0.0,
8
+ "symbol": "aapl"
9
+ },
10
+ {
11
+ "purchase-price": 0.0,
12
+ "symbol": "msft"
13
+ },
14
+ {
15
+ "purchase-price": 0.0,
16
+ "symbol": "goog"
17
+ },
18
+ {
19
+ "purchase-price": 0.0,
20
+ "symbol": "skul"
21
+ },
22
+ {
23
+ "purchase-price": 0.0,
24
+ "symbol": "nflx"
25
+ }
26
+ ]
27
+ },
28
+ "name": "Default"
29
+ }
30
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "item": {
3
+ "purchase-price": 0.0,
4
+ "symbol": "msft"
5
+ }
6
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "watchlists": {
3
+ "watchlist": [
4
+ {
5
+ "id": "default",
6
+ "name": "Default"
7
+ },
8
+ {
9
+ "id": "my-watchlist",
10
+ "name": "my_watchlist"
11
+ },
12
+ {
13
+ "id": "test-watchlist",
14
+ "name": "test-watchlist"
15
+ }
16
+ ]
17
+ }
18
+ }
@@ -0,0 +1,64 @@
1
+ # encoding: utf-8
2
+
3
+ require 'simplecov'
4
+ require 'coveralls'
5
+
6
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
7
+ SimpleCov::Formatter::HTMLFormatter,
8
+ Coveralls::SimpleCov::Formatter
9
+ ]
10
+ SimpleCov.start do
11
+ add_group 'Tradier', 'lib/tradier'
12
+ add_group 'Specs', 'spec'
13
+ add_filter '.bundle'
14
+ end
15
+
16
+ require 'tradier'
17
+ require 'rspec'
18
+ require 'webmock/rspec'
19
+
20
+ RSpec.configure do |config|
21
+ config.expect_with :rspec do |c|
22
+ c.syntax = :expect
23
+ end
24
+ end
25
+
26
+ def a_delete(path)
27
+ a_request(:delete, Tradier::Default::ENDPOINT + path)
28
+ end
29
+
30
+ def a_get(path)
31
+ a_request(:get, Tradier::Default::ENDPOINT + path)
32
+ end
33
+
34
+ def a_post(path)
35
+ a_request(:post, Tradier::Default::ENDPOINT + path)
36
+ end
37
+
38
+ def a_put(path)
39
+ a_request(:put, Tradier::Default::ENDPOINT + path)
40
+ end
41
+
42
+ def stub_delete(path)
43
+ stub_request(:delete, Tradier::Default::ENDPOINT + path)
44
+ end
45
+
46
+ def stub_get(path)
47
+ stub_request(:get, Tradier::Default::ENDPOINT + path)
48
+ end
49
+
50
+ def stub_post(path)
51
+ stub_request(:post, Tradier::Default::ENDPOINT + path)
52
+ end
53
+
54
+ def stub_put(path)
55
+ stub_request(:put, Tradier::Default::ENDPOINT + path)
56
+ end
57
+
58
+ def fixture_path
59
+ File.expand_path("../fixtures", __FILE__)
60
+ end
61
+
62
+ def fixture(file)
63
+ File.read(File.join(fixture_path,file))
64
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe Tradier::Account do
4
+
5
+ describe "#account_number" do
6
+ it "returns the account_number when set" do
7
+ account = Tradier::Account.new(:account_number => '20130704')
8
+ expect(account.account_number).to eq('20130704')
9
+ end
10
+ it "returns nil when account_number is not set" do
11
+ account = Tradier::Account.new({})
12
+ expect(account.account_number).to be_nil
13
+ end
14
+ end
15
+
16
+ describe "#type" do
17
+ it "returns the type when set" do
18
+ account = Tradier::Account.new(:type => 'Margin')
19
+ expect(account.type).to eq('Margin')
20
+ end
21
+ it "returns nil when type is not set" do
22
+ account = Tradier::Account.new({})
23
+ expect(account.type).to be_nil
24
+ end
25
+ end
26
+
27
+ describe '#margin?' do
28
+ it 'returns true when account type is margin' do
29
+ account = Tradier::Account.new(:type => 'Margin')
30
+ expect(account.margin?).to be_true
31
+ end
32
+ end
33
+
34
+ describe '#cash?' do
35
+ it 'returns true when account type is cash' do
36
+ account = Tradier::Account.new(:type => 'Cash')
37
+ expect(account.cash?).to be_true
38
+ end
39
+ end
40
+
41
+ describe '#positions' do
42
+ it 'returns an array' do
43
+ account = Tradier::Account.new(:positions => { :position => [{ :symbol => 'foo' }]})
44
+ expect(account.positions).to be_an Array
45
+ end
46
+
47
+ it 'returns an a collection of Tradier::Position' do
48
+ account = Tradier::Account.new(:positions => { :position => [{ :symbol => 'foo' }]})
49
+ expect(account.positions.first).to be_a Tradier::Position
50
+ end
51
+ end
52
+
53
+ describe '#orders' do
54
+ it 'returns an array of orders' do
55
+ account = Tradier::Account.new(:orders => { :order => [{ :id => '123' }]})
56
+ expect(account.orders).to be_an Array
57
+ end
58
+
59
+ it 'returns a collection of Tradier::Order' do
60
+ account = Tradier::Account.new(:orders => { :order => [{ :id => '123' }]})
61
+ expect(account.orders.first).to be_a Tradier::Order
62
+ end
63
+ end
64
+
65
+ describe '#gainloss' do
66
+ it 'returns an array of closed positions' do
67
+ pending
68
+ end
69
+ end
70
+
71
+ describe '#history' do
72
+ it 'returns an array of history' do
73
+ pending
74
+ end
75
+ end
76
+ end