questrade_api 0.0.4 → 1.0.0

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/README.md +2 -2
  4. data/lib/questrade_api/client.rb +9 -97
  5. data/lib/questrade_api/modules/account_call.rb +57 -0
  6. data/lib/questrade_api/modules/market_call.rb +42 -0
  7. data/lib/questrade_api/rest/account.rb +7 -7
  8. data/lib/questrade_api/rest/activity.rb +1 -1
  9. data/lib/questrade_api/rest/balance.rb +1 -1
  10. data/lib/questrade_api/rest/base.rb +2 -2
  11. data/lib/questrade_api/rest/candle.rb +1 -1
  12. data/lib/questrade_api/rest/execution.rb +1 -1
  13. data/lib/questrade_api/rest/market.rb +1 -1
  14. data/lib/questrade_api/rest/option.rb +1 -1
  15. data/lib/questrade_api/rest/order.rb +1 -1
  16. data/lib/questrade_api/rest/position.rb +1 -1
  17. data/lib/questrade_api/rest/quote.rb +2 -2
  18. data/lib/questrade_api/rest/symbol.rb +29 -5
  19. data/lib/questrade_api/rest/time.rb +6 -2
  20. data/lib/questrade_api/version.rb +1 -1
  21. data/spec/fixtures/json/symbol_01.json +51 -0
  22. data/spec/questrade_api/modules/account_call_spec.rb +70 -0
  23. data/spec/questrade_api/modules/market_call_spec.rb +68 -0
  24. data/spec/questrade_api/rest/account_spec.rb +6 -6
  25. data/spec/questrade_api/rest/activity_spec.rb +2 -2
  26. data/spec/questrade_api/rest/balance_spec.rb +2 -2
  27. data/spec/questrade_api/rest/candle_spec.rb +2 -2
  28. data/spec/questrade_api/rest/execution_spec.rb +2 -2
  29. data/spec/questrade_api/rest/market_spec.rb +2 -2
  30. data/spec/questrade_api/rest/option_spec.rb +2 -2
  31. data/spec/questrade_api/rest/order_spec.rb +2 -2
  32. data/spec/questrade_api/rest/position_spec.rb +2 -2
  33. data/spec/questrade_api/rest/quote_spec.rb +3 -3
  34. data/spec/questrade_api/rest/symbol_spec.rb +71 -6
  35. data/spec/questrade_api/rest/time_spec.rb +14 -3
  36. metadata +10 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fc55678c85117d92ad613586840f18ea4a380e47
4
- data.tar.gz: a4ca8fc7f3a6c99714f6d17cf0a18c1287879ca2
3
+ metadata.gz: 3648ccbf7f83b5173c5606b74b047e0e3c0e71d0
4
+ data.tar.gz: 8ae0d104853ccb59ae7604ba53749dde2c5bb625
5
5
  SHA512:
6
- metadata.gz: 5f627f715a2b4ad662954cd32ba0e6ffbfa5f7ea8678087fa32549244f8268ae22217d0fd914dd0bf52d0d3ba0a72d1a3f6a661968b64e49008a20e4f67a2c27
7
- data.tar.gz: 41d579f99b870df5b496ac94dfe7127d5e72a4424e93eeb18a98c80cf582fb7046f90bbda10bfd55fdbc11bd1356acc9c11a18dbcdfbe9ce0926e587e2b6285a
6
+ metadata.gz: e8153c221b4f6e8250bfe1e0aa6c83fda5432e702c38cafb398b22dd610a437b397dc759755638c4d33cb92931a18cb4b3284b8995cec581f07b13350eb9bdd3
7
+ data.tar.gz: c59f4a154528e5d44d56ce8bc93c6cad553454327f3ebd4ec072aedb343ec8068d1db04260aa3102a86c2e54656018f8e22e978d9dbc823223d4546d3371768d
@@ -0,0 +1,4 @@
1
+ # Changelog
2
+
3
+ ## 1.0.0
4
+ * Initial version. Disregard the previous versions
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  [![Build Status](https://travis-ci.org/brunomeira/questrade_api.svg?branch=master)](https://travis-ci.org/brunomeira/questrade_api)
2
2
  [![Code Climate](https://codeclimate.com/github/brunomeira/questrade_api/badges/gpa.svg)](https://codeclimate.com/github/brunomeira/questrade_api)
3
3
 
4
- # QuestradeApi
4
+ # The Questrade Ruby Api Gem
5
5
 
6
6
  A Ruby interface to use the [Questrade API](http://www.questrade.com/api).
7
7
 
@@ -53,7 +53,7 @@ client.search_symbols(prefix: 'BMO')
53
53
  # In case you already have a valid access token and its respective URL, you can use the QuestradeApi::REST objects. Example:
54
54
  # authorization can be any object that responds to url and access_token
55
55
  authorization = QuestradeApi::Authorization.new(access_token: 'access_token', api_server: 'url')
56
- accounts = QuestradeApi::REST::Account.all(accounts)
56
+ accounts = QuestradeApi::REST::Account.fetch(accounts)
57
57
  ```
58
58
  For more advanced options, check out our [documentation](http://www.rubydoc.info/gems/questrade_api/0.0.4).
59
59
 
@@ -1,119 +1,31 @@
1
1
  require 'questrade_api/authorization'
2
- require 'questrade_api/rest/time'
3
- require 'questrade_api/rest/account'
4
- require 'questrade_api/rest/balance'
5
- require 'questrade_api/rest/position'
6
- require 'questrade_api/rest/execution'
7
- require 'questrade_api/rest/activity'
8
- require 'questrade_api/rest/order'
9
2
 
10
- require 'questrade_api/rest/market'
11
- require 'questrade_api/rest/symbol'
12
- require 'questrade_api/rest/quote'
13
- require 'questrade_api/rest/candle'
14
- require 'questrade_api/rest/option'
3
+ require 'questrade_api/modules/account_call'
4
+ require 'questrade_api/modules/market_call'
15
5
 
16
6
  module QuestradeApi
17
7
  # @author Bruno Meira <goesmeira@gmail.com>
18
8
  class Client
19
- attr_reader :authorization
9
+ include QuestradeApi::AccountCall
10
+ include QuestradeApi::MarketCall
11
+
12
+ attr_accessor :authorization
20
13
 
21
14
  # @see QuestradeApi::Client#initialize for more details
22
15
  def initialize(params = {}, mode = :practice)
23
- @authorization = QuestradeApi::Authorization.new(params, mode)
16
+ self.authorization = QuestradeApi::Authorization.new(params, mode)
24
17
  refresh_token if refresh_token?
25
18
  end
26
19
 
27
20
  # Fetches a new access_token. (see QuestradeApi::Authorization#refresh_token)
28
21
  def refresh_token
29
- @authorization.refresh_token
30
- end
31
-
32
- # Fetch current server time.
33
- #
34
- # @return [DateTime] if no issues to call /time endpoint occurs.
35
- # @return [nil] if current server time cannot be fetched.
36
- def time
37
- time = QuestradeApi::REST::Time.new(@authorization)
38
- time.get
39
-
40
- time.data && time.data.time
41
- end
42
-
43
- # Fetch all accounts associated with user.
44
- #
45
- # @return [Array<QuestradeApi::REST::Account>]
46
- def accounts
47
- QuestradeApi::REST::Account.all(@authorization).accounts
48
- end
49
-
50
- # Fetch all positions associated with account.
51
- #
52
- # @param account_id [String] to which positions will be fetched.
53
- #
54
- # @return [Array<QuestradeApi::REST::Position>]
55
- def positions(account_id)
56
- QuestradeApi::REST::Position.all(@authorization, account_id).positions
57
- end
58
-
59
- # Fetch all balances associated with account.
60
- #
61
- # @param account_id [String] to which balances will be fetched.
62
- #
63
- # @return [OpenStruct(per_currency_balances)]
64
- def balances(account_id)
65
- QuestradeApi::REST::Balance.all(@authorization, account_id)
66
- end
67
-
68
- def executions(account_id, params = {})
69
- QuestradeApi::REST::Execution.all(@authorization, account_id, params)
70
- end
71
-
72
- def activities(account_id, params = {})
73
- QuestradeApi::REST::Activity.all(@authorization, account_id, params)
74
- end
75
-
76
- def orders(account_id, params = {})
77
- QuestradeApi::REST::Activity.all(@authorization, account_id, params)
78
- end
79
-
80
- def markets
81
- QuestradeApi::REST::Market.all(@authorization)
82
- end
83
-
84
- def symbols(params)
85
- QuestradeApi::REST::Symbol.all(@authorization, params)
86
- end
87
-
88
- def search_symbols(params)
89
- QuestradeApi::REST::Symbol.search(@authorization, params)
90
- end
91
-
92
- def quotes(ids)
93
- QuestradeApi::REST::Quote.all(@authorization, ids)
94
- end
95
-
96
- def quote(id)
97
- quote =
98
- QuestradeApi::REST::Quote.new(authorization: @authorization, id: id)
99
-
100
- quote.get
101
-
102
- quote
103
- end
104
-
105
- def candles(symbol_id, params)
106
- QuestradeApi::REST::Candle.all(@authorization, symbol_id, params)
107
- end
108
-
109
- def symbol_options(symbol_id)
110
- QuestradeApi::REST::Option.all(@authorization, symbol_id)
22
+ authorization.refresh_token
111
23
  end
112
24
 
113
25
  private
114
26
 
115
27
  def refresh_token?
116
- data = @authorization.data
28
+ data = authorization.data
117
29
  data.refresh_token && !data.api_server && !data.access_token
118
30
  end
119
31
  end
@@ -0,0 +1,57 @@
1
+ require 'questrade_api/rest/time'
2
+ require 'questrade_api/rest/account'
3
+ require 'questrade_api/rest/balance'
4
+ require 'questrade_api/rest/position'
5
+ require 'questrade_api/rest/execution'
6
+ require 'questrade_api/rest/activity'
7
+ require 'questrade_api/rest/order'
8
+
9
+ module QuestradeApi
10
+ module AccountCall
11
+ # Fetch current server time.
12
+ #
13
+ # @return [DateTime] if no issues to call /time endpoint occurs.
14
+ # @return [Faraday::Response] if current server time cannot be fetched.
15
+ def time
16
+ time = QuestradeApi::REST::Time.new(authorization)
17
+ time.fetch
18
+ end
19
+
20
+ # Fetch all accounts associated with user.
21
+ #
22
+ # @return [Array<QuestradeApi::REST::Account>]
23
+ def accounts
24
+ QuestradeApi::REST::Account.fetch(authorization)
25
+ end
26
+
27
+ # Fetch all positions associated with account.
28
+ #
29
+ # @param account_id [String] to which positions will be fetched.
30
+ #
31
+ # @return [OpenStruct(accounts: Array<QuestradeApi::REST::Position>)]
32
+ def positions(account_id)
33
+ QuestradeApi::REST::Position.fetch(authorization, account_id)
34
+ end
35
+
36
+ # Fetch all balances associated with account.
37
+ #
38
+ # @param account_id [String] to which balances will be fetched.
39
+ #
40
+ # @return [OpenStruct(per_currency_balances)]
41
+ def balances(account_id)
42
+ QuestradeApi::REST::Balance.fetch(authorization, account_id)
43
+ end
44
+
45
+ def executions(account_id, params = {})
46
+ QuestradeApi::REST::Execution.fetch(authorization, account_id, params)
47
+ end
48
+
49
+ def activities(account_id, params = {})
50
+ QuestradeApi::REST::Activity.fetch(authorization, account_id, params)
51
+ end
52
+
53
+ def orders(account_id, params = {})
54
+ QuestradeApi::REST::Order.fetch(authorization, account_id, params)
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,42 @@
1
+ require 'questrade_api/rest/market'
2
+ require 'questrade_api/rest/symbol'
3
+ require 'questrade_api/rest/quote'
4
+ require 'questrade_api/rest/candle'
5
+ require 'questrade_api/rest/option'
6
+
7
+ module QuestradeApi
8
+ module MarketCall
9
+ def markets
10
+ QuestradeApi::REST::Market.fetch(authorization)
11
+ end
12
+
13
+ def symbols(params)
14
+ QuestradeApi::REST::Symbol.fetch(authorization, params)
15
+ end
16
+
17
+ def search_symbols(params)
18
+ QuestradeApi::REST::Symbol.search(authorization, params)
19
+ end
20
+
21
+ def quotes(ids)
22
+ QuestradeApi::REST::Quote.fetch(authorization, ids)
23
+ end
24
+
25
+ def quote(id)
26
+ quote =
27
+ QuestradeApi::REST::Quote.new(authorization: authorization, id: id)
28
+
29
+ quote.fetch
30
+
31
+ quote
32
+ end
33
+
34
+ def candles(symbol_id, params)
35
+ QuestradeApi::REST::Candle.fetch(authorization, symbol_id, params)
36
+ end
37
+
38
+ def symbol_options(symbol_id)
39
+ QuestradeApi::REST::Option.fetch(authorization, symbol_id)
40
+ end
41
+ end
42
+ end
@@ -25,34 +25,34 @@ module QuestradeApi
25
25
  #
26
26
  # Fetch activities associated with account.
27
27
  #
28
- # @param see QuestradeApi::REST::Activity.all
28
+ # @param see QuestradeApi::REST::Activity.fetch
29
29
  #
30
30
  # @return [OpenStruct(executions: [QuestradeApi::REST::Activity)]
31
31
  def activities(params)
32
- QuestradeApi::REST::Activity.all(authorization, id, params)
32
+ QuestradeApi::REST::Activity.fetch(authorization, id, params)
33
33
  end
34
34
 
35
35
  # Fetch executions associated with account.
36
36
  #
37
- # @param see QuestradeApi::REST::Execution.all
37
+ # @param see QuestradeApi::REST::Execution.fetch
38
38
  #
39
39
  # @return [OpenStruct(executions: [QuestradeApi::REST::Execution)]
40
40
  def executions(params)
41
- QuestradeApi::REST::Execution.all(authorization, id, params)
41
+ QuestradeApi::REST::Execution.fetch(authorization, id, params)
42
42
  end
43
43
 
44
44
  # Fetch balances associated with account.
45
45
  #
46
46
  # @return [OpenStruct(per_currency_balances)]
47
47
  def balances
48
- QuestradeApi::REST::Balance.all(authorization, id)
48
+ QuestradeApi::REST::Balance.fetch(authorization, id)
49
49
  end
50
50
 
51
51
  # Fetch positions associated with account.
52
52
  #
53
53
  # @return [OpenStruct(positions: [QuestradeApi::REST::Position])]
54
54
  def positions
55
- QuestradeApi::REST::Position.all(authorization, id)
55
+ QuestradeApi::REST::Position.fetch(authorization, id)
56
56
  end
57
57
 
58
58
  # Fetch accounts for specific authorized user.
@@ -62,7 +62,7 @@ module QuestradeApi
62
62
  #
63
63
  # @return [OpenStruct(accounts: [QuestradeApi::REST::Account])] if call to server is successful
64
64
  # @return [Faraday::Response] if call to server is not successful
65
- def self.all(authorization)
65
+ def self.fetch(authorization)
66
66
  response = super(access_token: authorization.access_token,
67
67
  endpoint: endpoint,
68
68
  url: authorization.url)
@@ -21,7 +21,7 @@ module QuestradeApi
21
21
  # @param params [Hash] with the range of dates the activities will be fetched
22
22
  # @option params [String] :startTime The start time. ex: '2011-02-16T00:00:00.000000-05:00'
23
23
  # @option params [String] :endTime The end time. ex: '2011-02-16T00:00:00.000000-05:00'
24
- def self.all(authorization, account_number, params)
24
+ def self.fetch(authorization, account_number, params)
25
25
  response = super(access_token: authorization.access_token,
26
26
  endpoint: endpoint(account_number),
27
27
  url: authorization.url,
@@ -20,7 +20,7 @@ module QuestradeApi
20
20
  # @param account_number [String] with the account the activities will be fetched
21
21
  # @return [OpenStruct(per_currency_balances, combined_balances, sod_per_currency_balances, sod_combined_balances)] If call succeeds. Each method returns an array of QuestradeApi::REST::Balance
22
22
  # @return [Faraday::Response] if call fails.
23
- def self.all(authorization, account_number)
23
+ def self.fetch(authorization, account_number)
24
24
  response = super(access_token: authorization.access_token,
25
25
  endpoint: endpoint(account_number),
26
26
  url: authorization.url)
@@ -56,7 +56,7 @@ module QuestradeApi
56
56
  @raw_body = JSON.parse(response.body)
57
57
  end
58
58
 
59
- def get(params = {})
59
+ def fetch(params = {})
60
60
  response = @connection.get do |req|
61
61
  req.path = params[:endpoint] || self.class.endpoint
62
62
 
@@ -71,7 +71,7 @@ module QuestradeApi
71
71
  end
72
72
 
73
73
  class << self
74
- def all(params = {})
74
+ def fetch(params = {})
75
75
  connection = connection(params)
76
76
 
77
77
  connection.get do |req|
@@ -8,7 +8,7 @@ module QuestradeApi
8
8
  build_data(params[:data]) if @raw_body
9
9
  end
10
10
 
11
- def self.all(authorization, symbol_id, params)
11
+ def self.fetch(authorization, symbol_id, params)
12
12
  response = super(access_token: authorization.access_token,
13
13
  endpoint: endpoint(symbol_id),
14
14
  url: authorization.url,
@@ -21,7 +21,7 @@ module QuestradeApi
21
21
  # @param params [Hash] with the range of dates the activities will be fetched
22
22
  # @option params [String] :startTime The start time. ex: '2011-02-16T00:00:00.000000-05:00'
23
23
  # @option params [String] :endTime The end time. ex: '2011-02-16T00:00:00.000000-05:00'
24
- def self.all(authorization, account_number, params)
24
+ def self.fetch(authorization, account_number, params)
25
25
 
26
26
  response = super(access_token: authorization.access_token,
27
27
  endpoint: endpoint(account_number),
@@ -8,7 +8,7 @@ module QuestradeApi
8
8
  build_data(params[:data]) if @raw_body
9
9
  end
10
10
 
11
- def self.all(authorization)
11
+ def self.fetch(authorization)
12
12
  response = super(access_token: authorization.access_token,
13
13
  endpoint: endpoint,
14
14
  url: authorization.url)
@@ -8,7 +8,7 @@ module QuestradeApi
8
8
  build_data(params[:data]) if @raw_body
9
9
  end
10
10
 
11
- def self.all(authorization, symbol_id)
11
+ def self.fetch(authorization, symbol_id)
12
12
  response = super(access_token: authorization.access_token,
13
13
  endpoint: endpoint(symbol_id),
14
14
  url: authorization.url)
@@ -15,7 +15,7 @@ module QuestradeApi
15
15
  build_data(params[:data]) if @raw_body
16
16
  end
17
17
 
18
- def self.all(authorization, account_number, params)
18
+ def self.fetch(authorization, account_number, params)
19
19
 
20
20
  response = super(access_token: authorization.access_token,
21
21
  endpoint: endpoint(account_number),
@@ -12,7 +12,7 @@ module QuestradeApi
12
12
  build_data(params[:data]) if @raw_body
13
13
  end
14
14
 
15
- def self.all(authorization, account_number)
15
+ def self.fetch(authorization, account_number)
16
16
  response = super(access_token: authorization.access_token,
17
17
  endpoint: endpoint(account_number),
18
18
  url: authorization.url)
@@ -13,7 +13,7 @@ module QuestradeApi
13
13
  build_data(params[:data]) if @raw_body
14
14
  end
15
15
 
16
- def get
16
+ def fetch
17
17
  response = super(endpoint: endpoint)
18
18
 
19
19
  if response.status == 200
@@ -23,7 +23,7 @@ module QuestradeApi
23
23
  response
24
24
  end
25
25
 
26
- def self.all(authorization, ids)
26
+ def self.fetch(authorization, ids)
27
27
  response = super(access_token: authorization.access_token,
28
28
  endpoint: endpoint,
29
29
  url: authorization.url,
@@ -14,15 +14,29 @@ module QuestradeApi
14
14
  build_data(params[:data]) if @raw_body
15
15
  end
16
16
 
17
+ def fetch
18
+ response = super(endpoint: endpoint)
19
+
20
+ if response.status == 200
21
+ parse_symbols(response.body)
22
+ end
23
+
24
+ response
25
+ end
26
+
27
+ def endpoint
28
+ self.class.endpoint + "#{id}"
29
+ end
30
+
17
31
  def self.endpoint(extra = '')
18
32
  "#{BASE_ENDPOINT}/symbols/#{extra}"
19
33
  end
20
34
 
21
35
  def self.search(authorization, params = {})
22
- response = superclass.all(access_token: authorization.access_token,
23
- endpoint: endpoint('search'),
24
- url: authorization.url,
25
- params: params)
36
+ response = superclass.fetch(access_token: authorization.access_token,
37
+ endpoint: endpoint('search'),
38
+ url: authorization.url,
39
+ params: params)
26
40
 
27
41
  if response.status == 200
28
42
  result = OpenStruct.new(symbols: [])
@@ -33,7 +47,7 @@ module QuestradeApi
33
47
  response
34
48
  end
35
49
 
36
- def self.all(authorization, params = {})
50
+ def self.fetch(authorization, params = {})
37
51
  params[:ids] = params[:ids].join(',') if params[:ids]
38
52
  params[:names] = params[:names].join(',') if params[:names]
39
53
 
@@ -73,6 +87,16 @@ module QuestradeApi
73
87
  end
74
88
 
75
89
  private_class_method :parse_symbols
90
+
91
+ private
92
+
93
+ def parse_symbols(body)
94
+ raw = JSON.parse(body)
95
+
96
+ raw['symbols'].each do |symbol|
97
+ build_data(symbol)
98
+ end
99
+ end
76
100
  end
77
101
  end
78
102
  end
@@ -10,10 +10,14 @@ module QuestradeApi
10
10
  super(authorization)
11
11
  end
12
12
 
13
- def get
13
+ def fetch
14
14
  response = super
15
15
 
16
- build_data(raw_body) if raw_body
16
+ if raw_body
17
+ build_data(raw_body)
18
+ data.time = DateTime.parse(data.time)
19
+ response = data.time
20
+ end
17
21
 
18
22
  response
19
23
  end
@@ -1,3 +1,3 @@
1
1
  module QuestradeApi
2
- VERSION = '0.0.4'.freeze
2
+ VERSION = '1.0.0'.freeze
3
3
  end
@@ -0,0 +1,51 @@
1
+ {
2
+ "symbols": [
3
+ {
4
+ "symbol": "AAPL",
5
+ "symbolId": 8049,
6
+ "prevDayClosePrice": 102.5,
7
+ "highPrice52": 102.9,
8
+ "lowPrice52": 63.89,
9
+ "averageVol3Months": 43769680,
10
+ "averageVol20Days": 12860370,
11
+ "outstandingShares": 5987867000,
12
+ "eps": 6.2,
13
+ "pe": 16.54,
14
+ "dividend": 0.47,
15
+ "yield": 1.84,
16
+ "exDate": "2014-08-07T00:00:00.000000-04:00",
17
+ "marketCap": 613756367500,
18
+ "tradeUnit": 1,
19
+ "optionType": null,
20
+ "optionDurationType": null,
21
+ "optionRoot": "",
22
+ "optionContractDeliverables": {
23
+ "underlyings": [],
24
+ "cashInLieu": 0
25
+ },
26
+ "optionExerciseType": null,
27
+ "listingExchange": "NASDAQ",
28
+ "description": "APPLE INC",
29
+ "securityType": "Stock",
30
+ "optionExpiryDate": null,
31
+ "dividendDate": "2014-08-14T00:00:00.000000-04:00",
32
+ "optionStrikePrice": null,
33
+ "isTradable": true,
34
+ "isQuotable": true,
35
+ "hasOptions": true,
36
+ "minTicks": [
37
+ {
38
+ "pivot": 0,
39
+ "minTick": 0.0001
40
+ },
41
+ {
42
+ "pivot": 1,
43
+ "minTick": 0.01
44
+ }
45
+ ],
46
+ "industrySector": "BasicMaterials",
47
+ "industryGroup": "Steel",
48
+ "industrySubGroup": "Steel"
49
+ }
50
+ ]
51
+ }
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ require 'questrade_api/modules/account_call'
4
+
5
+ describe QuestradeApi::AccountCall do
6
+ class DummyClass
7
+ attr_accessor :authorization
8
+
9
+ def initialize(authorization)
10
+ @authorization = authorization
11
+ end
12
+ end
13
+
14
+ let(:authorization) do
15
+ OpenStruct.new(access_token: '123', url: 'test')
16
+ end
17
+
18
+ subject { DummyClass.new(authorization).extend(QuestradeApi::AccountCall) }
19
+
20
+ context '.time' do
21
+ it 'calls proper endpoint' do
22
+ time = DateTime.now
23
+ expect_any_instance_of(QuestradeApi::REST::Time).to receive(:fetch).and_return(time)
24
+
25
+ expect(subject.time).to be(time)
26
+ end
27
+ end
28
+
29
+ context '.accounts' do
30
+ it 'calls proper endpoint' do
31
+ expect(QuestradeApi::REST::Account).to receive(:fetch).and_return([])
32
+ expect(subject.accounts).to eq([])
33
+ end
34
+ end
35
+
36
+ context '.positions' do
37
+ it 'calls proper endpoint' do
38
+ expect(QuestradeApi::REST::Position).to receive(:fetch).and_return([])
39
+ expect(subject.positions('1')).to eq([])
40
+ end
41
+ end
42
+
43
+ context '.balances' do
44
+ it 'calls proper endpoint' do
45
+ expect(QuestradeApi::REST::Balance).to receive(:fetch).and_return([])
46
+ expect(subject.balances('1')).to eq([])
47
+ end
48
+ end
49
+
50
+ context '.executions' do
51
+ it 'calls proper endpoint' do
52
+ expect(QuestradeApi::REST::Execution).to receive(:fetch).and_return([])
53
+ expect(subject.executions('1')).to eq([])
54
+ end
55
+ end
56
+
57
+ context '.activities' do
58
+ it 'calls proper endpoint' do
59
+ expect(QuestradeApi::REST::Activity).to receive(:fetch).and_return([])
60
+ expect(subject.activities('1')).to eq([])
61
+ end
62
+ end
63
+
64
+ context '.orders' do
65
+ it 'calls proper endpoint' do
66
+ expect(QuestradeApi::REST::Order).to receive(:fetch).and_return([])
67
+ expect(subject.orders('1')).to eq([])
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ require 'questrade_api/modules/market_call'
4
+
5
+ describe QuestradeApi::MarketCall do
6
+ class DummyClass
7
+ attr_accessor :authorization
8
+
9
+ def initialize(authorization)
10
+ @authorization = authorization
11
+ end
12
+ end
13
+
14
+ let(:authorization) do
15
+ OpenStruct.new(access_token: '123', url: 'test')
16
+ end
17
+
18
+ subject { DummyClass.new(authorization).extend(QuestradeApi::MarketCall) }
19
+
20
+ context '.markets' do
21
+ it 'calls proper endpoint' do
22
+ expect(QuestradeApi::REST::Market).to receive(:fetch).and_return([])
23
+ expect(subject.markets).to eq([])
24
+ end
25
+ end
26
+
27
+ context '.symbols' do
28
+ it 'calls proper endpoint' do
29
+ expect(QuestradeApi::REST::Symbol).to receive(:fetch).and_return([])
30
+ expect(subject.symbols('')).to eq([])
31
+ end
32
+ end
33
+
34
+ context '.search_symbols' do
35
+ it 'calls proper endpoint' do
36
+ expect(QuestradeApi::REST::Symbol).to receive(:search).and_return([])
37
+ expect(subject.search_symbols('')).to eq([])
38
+ end
39
+ end
40
+
41
+ context '.quotes' do
42
+ it 'calls proper endpoint' do
43
+ expect(QuestradeApi::REST::Quote).to receive(:fetch).and_return([])
44
+ expect(subject.quotes([123])).to eq([])
45
+ end
46
+ end
47
+
48
+ context '.quote' do
49
+ it 'calls proper endpoint' do
50
+ expect_any_instance_of(QuestradeApi::REST::Quote).to receive(:fetch).and_return([])
51
+ expect(subject.quote(1)).to be_a(QuestradeApi::REST::Quote)
52
+ end
53
+ end
54
+
55
+ context '.candles' do
56
+ it 'calls proper endpoint' do
57
+ expect(QuestradeApi::REST::Candle).to receive(:fetch).and_return([])
58
+ expect(subject.candles('', '12')).to eq([])
59
+ end
60
+ end
61
+
62
+ context '.symbol_options' do
63
+ it 'calls proper endpoint' do
64
+ expect(QuestradeApi::REST::Market).to receive(:fetch).and_return([])
65
+ expect(subject.markets).to eq([])
66
+ end
67
+ end
68
+ end
@@ -15,7 +15,7 @@ describe QuestradeApi::REST::Account do
15
15
 
16
16
  it 'returns a list of activities' do
17
17
  expect(QuestradeApi::REST::Activity)
18
- .to(receive(:all).with(authorization, id, {}))
18
+ .to(receive(:fetch).with(authorization, id, {}))
19
19
  .once
20
20
 
21
21
  subject.activities({})
@@ -23,7 +23,7 @@ describe QuestradeApi::REST::Account do
23
23
 
24
24
  it 'returns a list of executions' do
25
25
  expect(QuestradeApi::REST::Execution)
26
- .to(receive(:all).with(authorization, id, {}))
26
+ .to(receive(:fetch).with(authorization, id, {}))
27
27
  .once
28
28
 
29
29
  subject.executions({})
@@ -31,7 +31,7 @@ describe QuestradeApi::REST::Account do
31
31
 
32
32
  it 'returns a list of positions' do
33
33
  expect(QuestradeApi::REST::Position)
34
- .to(receive(:all).with(authorization, id))
34
+ .to(receive(:fetch).with(authorization, id))
35
35
  .once
36
36
 
37
37
  subject.positions
@@ -39,21 +39,21 @@ describe QuestradeApi::REST::Account do
39
39
 
40
40
  it 'returns a list of balances' do
41
41
  expect(QuestradeApi::REST::Balance)
42
- .to(receive(:all).with(authorization, id))
42
+ .to(receive(:fetch).with(authorization, id))
43
43
  .once
44
44
 
45
45
  subject.balances
46
46
  end
47
47
  end
48
48
 
49
- context '.all' do
49
+ context '.fetch' do
50
50
  it "returns an object that contains a list of all user's accounts" do
51
51
  full_url = url + QuestradeApi::REST::Account.endpoint
52
52
  stub_request(:get, full_url).to_return(status: 200,
53
53
  body: json_string('accounts.json'),
54
54
  headers: {})
55
55
 
56
- response = QuestradeApi::REST::Account.all(authorization)
56
+ response = QuestradeApi::REST::Account.fetch(authorization)
57
57
 
58
58
  expect(response.accounts.size).to be(2)
59
59
 
@@ -10,7 +10,7 @@ describe QuestradeApi::REST::Activity do
10
10
  let(:url) { 'http://test.com'}
11
11
  let(:authorization) { OpenStruct.new(access_token: access_token, url: url) }
12
12
 
13
- context '.all' do
13
+ context '.fetch' do
14
14
  it "returns an object that contains a list of all user's activities for the specific period" do
15
15
  start_time = '2011-02-16T00:00:00.000000-05:00'
16
16
  end_time = '2011-02-16T00:00:00.000000-05:00'
@@ -19,7 +19,7 @@ describe QuestradeApi::REST::Activity do
19
19
  url + QuestradeApi::REST::Activity.endpoint(account_id) + "?#{params}"
20
20
  stub_request(:get, full_url).to_return(status: 200, body: json_string('activities.json'))
21
21
 
22
- response = QuestradeApi::REST::Activity.all(authorization, account_id,
22
+ response = QuestradeApi::REST::Activity.fetch(authorization, account_id,
23
23
  { startTime: start_time,
24
24
  endTime: end_time })
25
25
 
@@ -10,13 +10,13 @@ describe QuestradeApi::REST::Balance do
10
10
  let(:url) { 'http://test.com'}
11
11
  let(:authorization) { OpenStruct.new(access_token: access_token, url: url) }
12
12
 
13
- context '.all' do
13
+ context '.fetch' do
14
14
  it "returns an object that contains a list of all user's balances" do
15
15
  full_url =
16
16
  url + QuestradeApi::REST::Balance.endpoint(account_id)
17
17
  stub_request(:get, full_url).to_return(status: 200, body: json_string('balances.json'))
18
18
 
19
- response = QuestradeApi::REST::Balance.all(authorization, account_id)
19
+ response = QuestradeApi::REST::Balance.fetch(authorization, account_id)
20
20
 
21
21
  expect(response.per_currency_balances.size).to be(2)
22
22
  expect(response.combined_balances.size).to be(1)
@@ -8,7 +8,7 @@ describe QuestradeApi::REST::Candle do
8
8
  let(:url) { 'http://test.com'}
9
9
  let(:authorization) { OpenStruct.new(access_token: access_token, url: url) }
10
10
 
11
- context '.all' do
11
+ context '.fetch' do
12
12
  it 'fetches candle for an specific symbol' do
13
13
  start_time = '2014-10-01T00:00:00-05:00'
14
14
  end_time = '2014-10-01T00:00:00-05:00'
@@ -22,7 +22,7 @@ describe QuestradeApi::REST::Candle do
22
22
  interval: interval
23
23
  }
24
24
 
25
- response = QuestradeApi::REST::Candle.all(authorization, 1010, params)
25
+ response = QuestradeApi::REST::Candle.fetch(authorization, 1010, params)
26
26
 
27
27
  expect(response.candles.size).to be(1)
28
28
 
@@ -10,7 +10,7 @@ describe QuestradeApi::REST::Execution do
10
10
  let(:url) { 'http://test.com'}
11
11
  let(:authorization) { OpenStruct.new(access_token: access_token, url: url) }
12
12
 
13
- context '.all' do
13
+ context '.fetch' do
14
14
  it "returns an object that contains a list of all user's executions for the specific period" do
15
15
  start_time = '2014-03-31T13:38:29-04:00'
16
16
  end_time = '2014-03-31T13:38:29-04:00'
@@ -19,7 +19,7 @@ describe QuestradeApi::REST::Execution do
19
19
  url + QuestradeApi::REST::Execution.endpoint(account_id) + "?#{params}"
20
20
  stub_request(:get, full_url).to_return(status: 200, body: json_string('executions.json'))
21
21
 
22
- response = QuestradeApi::REST::Execution.all(authorization, account_id,
22
+ response = QuestradeApi::REST::Execution.fetch(authorization, account_id,
23
23
  startTime: start_time,
24
24
  endTime: end_time)
25
25
 
@@ -10,13 +10,13 @@ describe QuestradeApi::REST::Market do
10
10
  let(:url) { 'http://test.com'}
11
11
  let(:authorization) { OpenStruct.new(access_token: access_token, url: url) }
12
12
 
13
- context '.all' do
13
+ context '.fetch' do
14
14
  it "returns an object that contains a list of all supported" do
15
15
  full_url = url + QuestradeApi::REST::Market.endpoint
16
16
 
17
17
  stub_request(:get, full_url).to_return(status: 200, body: json_string('markets.json'))
18
18
 
19
- response = QuestradeApi::REST::Market.all(authorization)
19
+ response = QuestradeApi::REST::Market.fetch(authorization)
20
20
 
21
21
  expect(response.markets.size).to be(1)
22
22
 
@@ -8,12 +8,12 @@ describe QuestradeApi::REST::Option do
8
8
  let(:url) { 'http://test.com'}
9
9
  let(:authorization) { OpenStruct.new(access_token: access_token, url: url) }
10
10
 
11
- context '.all' do
11
+ context '.fetch' do
12
12
  it 'fetches option chain for an specific symbol' do
13
13
  stub_request(:get, 'http://test.com/v1/symbol/9291/options')
14
14
  .to_return(status: 200, body: json_string('options.json'))
15
15
 
16
- response = QuestradeApi::REST::Option.all(authorization, 9291)
16
+ response = QuestradeApi::REST::Option.fetch(authorization, 9291)
17
17
 
18
18
  expect(response.options.size).to be(1)
19
19
 
@@ -10,7 +10,7 @@ describe QuestradeApi::REST::Order do
10
10
  let(:url) { 'http://test.com'}
11
11
  let(:authorization) { OpenStruct.new(access_token: access_token, url: url) }
12
12
 
13
- context '.all' do
13
+ context '.fetch' do
14
14
  it "returns an object that contains a list of all user's orders" do
15
15
  time = '2014-03-31T13:38:29-04:00'
16
16
  params = "startTime=#{time}&endTime=#{time}&stateFilter=All"
@@ -19,7 +19,7 @@ describe QuestradeApi::REST::Order do
19
19
 
20
20
  stub_request(:get, full_url).to_return(status: 200, body: json_string('orders.json'))
21
21
 
22
- response = QuestradeApi::REST::Order.all(authorization, account_id,
22
+ response = QuestradeApi::REST::Order.fetch(authorization, account_id,
23
23
  startTime: time, endTime: time, stateFilter: 'All')
24
24
 
25
25
  expect(response.orders.size).to be(1)
@@ -10,13 +10,13 @@ describe QuestradeApi::REST::Position do
10
10
  let(:url) { 'http://test.com'}
11
11
  let(:authorization) { OpenStruct.new(access_token: access_token, url: url) }
12
12
 
13
- context '.all' do
13
+ context '.fetch' do
14
14
  it "returns an object that contains a list of all user's positions" do
15
15
  full_url = url + QuestradeApi::REST::Position.endpoint(account_id)
16
16
 
17
17
  stub_request(:get, full_url).to_return(status: 200, body: json_string('positions.json'))
18
18
 
19
- response = QuestradeApi::REST::Position.all(authorization, account_id)
19
+ response = QuestradeApi::REST::Position.fetch(authorization, account_id)
20
20
 
21
21
  expect(response.positions.size).to be(1)
22
22
 
@@ -27,7 +27,7 @@ describe QuestradeApi::REST::Quote do
27
27
 
28
28
  expect(subject.data).to be_nil
29
29
 
30
- subject.get
30
+ subject.fetch
31
31
 
32
32
  expect(subject.data.to_h).to eq(
33
33
  symbol: "THI.TO",
@@ -52,12 +52,12 @@ describe QuestradeApi::REST::Quote do
52
52
  end
53
53
  end
54
54
 
55
- context '.all' do
55
+ context '.fetch' do
56
56
  it 'fetches quote for an specific symbol' do
57
57
  stub_request(:get, 'http://test.com/v1/markets/quotes?ids=12,11')
58
58
  .to_return(status: 200, body: json_string('quotes.json'))
59
59
 
60
- response = QuestradeApi::REST::Quote.all(authorization, [12, 11])
60
+ response = QuestradeApi::REST::Quote.fetch(authorization, [12, 11])
61
61
 
62
62
  expect(response.quotes.size).to be(1)
63
63
 
@@ -10,8 +10,73 @@ describe QuestradeApi::REST::Symbol do
10
10
  let(:url) { 'http://test.com'}
11
11
  let(:authorization) { OpenStruct.new(access_token: access_token, url: url) }
12
12
 
13
- context '#get' do
14
-
13
+ context '#fetch' do
14
+ subject { QuestradeApi::REST::Symbol.new(authorization, id: 10) }
15
+
16
+ it 'fetches symbol data' do
17
+ stub_request(:get, "http://test.com/v1/symbols/10")
18
+ .to_return(status: 200, body: json_string('symbol_01.json'))
19
+
20
+
21
+ expect(subject.data).to be_nil
22
+ subject.fetch
23
+ expect(subject.data.to_h).to eq(
24
+ symbol: 'AAPL',
25
+ symbol_id: 8049,
26
+ prev_day_close_price: 102.5,
27
+ high_price52: 102.9,
28
+ low_price52: 63.89,
29
+ average_vol3_months: 43769680,
30
+ average_vol20_days: 12860370,
31
+ outstanding_shares: 5987867000,
32
+ eps: 6.2,
33
+ pe: 16.54,
34
+ dividend: 0.47,
35
+ yield: 1.84,
36
+ ex_date: "2014-08-07T00:00:00.000000-04:00",
37
+ market_cap: 613756367500,
38
+ trade_unit: 1,
39
+ option_type: nil,
40
+ option_duration_type: nil,
41
+ option_root: "",
42
+ option_contract_deliverables: {
43
+ 'underlyings' => [],
44
+ 'cashInLieu' => 0
45
+ },
46
+ option_exercise_type: nil,
47
+ listing_exchange: "NASDAQ",
48
+ description: "APPLE INC",
49
+ security_type: "Stock",
50
+ option_expiry_date: nil,
51
+ dividend_date: "2014-08-14T00:00:00.000000-04:00",
52
+ option_strike_price: nil,
53
+ is_tradable: true,
54
+ is_quotable: true,
55
+ has_options: true,
56
+ min_ticks: [
57
+ {
58
+ 'pivot' => 0,
59
+ 'minTick' => 0.0001
60
+ },
61
+ {
62
+ 'pivot' => 1,
63
+ 'minTick' => 0.01
64
+ }
65
+ ],
66
+ industry_sector: "BasicMaterials",
67
+ industry_group: "Steel",
68
+ industry_sub_group: "Steel")
69
+ end
70
+
71
+ end
72
+
73
+ context '#endpoint' do
74
+ subject { QuestradeApi::REST::Symbol.new(authorization, id: 10) }
75
+
76
+ it 'calls endpoint' do
77
+ url = "/v1/symbols/10"
78
+ expect(subject.endpoint).to eq(url)
79
+ end
15
80
  end
16
81
 
17
82
  context '.search' do
@@ -68,14 +133,14 @@ describe QuestradeApi::REST::Symbol do
68
133
  end
69
134
  end
70
135
 
71
- context '.all' do
136
+ context '.fetch' do
72
137
  let(:ids) { [8049, 8050] }
73
138
  let(:names) { ['AAPL', 'GOOGL'] }
74
139
 
75
140
  it 'calls endpoint passing a list of ids' do
76
141
  stub_request(:get, "http://test.com/v1/symbols/?ids=8049,8050")
77
142
  .to_return(status: 200, body: '{}').times(1)
78
- response = QuestradeApi::REST::Symbol.all(authorization, ids: ids)
143
+ response = QuestradeApi::REST::Symbol.fetch(authorization, ids: ids)
79
144
 
80
145
  expect(response.symbols.size).to be(0)
81
146
  end
@@ -83,7 +148,7 @@ describe QuestradeApi::REST::Symbol do
83
148
  it 'calls endpoint passing a list of names' do
84
149
  stub_request(:get, "http://test.com/v1/symbols/?names=AAPL,GOOGL")
85
150
  .to_return(status: 200, body: '{}')
86
- response = QuestradeApi::REST::Symbol.all(authorization, names: names)
151
+ response = QuestradeApi::REST::Symbol.fetch(authorization, names: names)
87
152
 
88
153
  expect(response.symbols.size).to be(0)
89
154
  end
@@ -92,7 +157,7 @@ describe QuestradeApi::REST::Symbol do
92
157
  stub_request(:get, "http://test.com/v1/symbols/")
93
158
  .to_return(status: 200, body: json_string('symbols.json'))
94
159
 
95
- response = QuestradeApi::REST::Symbol.all(authorization)
160
+ response = QuestradeApi::REST::Symbol.fetch(authorization)
96
161
 
97
162
  expect(response.symbols.size).to be(1)
98
163
 
@@ -11,7 +11,7 @@ describe QuestradeApi::REST::Time do
11
11
 
12
12
  subject { QuestradeApi::REST::Time.new(authorization) }
13
13
 
14
- context '#get' do
14
+ context '#fetch' do
15
15
  let(:url) { 'http://test.com/v1/time' }
16
16
 
17
17
  it 'calls the proper endpoint with proper data' do
@@ -19,10 +19,21 @@ describe QuestradeApi::REST::Time do
19
19
 
20
20
  stub_request(:get, url).to_return(status: 200,
21
21
  body: json_string('time.json'))
22
- subject.get
22
+ subject.fetch
23
+
24
+ expected_return = DateTime.parse('2017-01-24T12:14:42.730000-04:00')
23
25
 
24
26
  expect(subject.data).to_not be_nil
25
- expect(subject.data.time).to eq('2017-01-24T12:14:42.730000-04:00')
27
+ expect(subject.data.time).to eq(expected_return)
28
+ end
29
+
30
+ it 'returns time' do
31
+ stub_request(:get, url).to_return(status: 200,
32
+ body: json_string('time.json'))
33
+ result = subject.fetch
34
+
35
+ expected_return = DateTime.parse('2017-01-24T12:14:42.730000-04:00')
36
+ expect(result).to eq(expected_return)
26
37
  end
27
38
  end
28
39
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: questrade_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bruno Meira
@@ -77,6 +77,7 @@ files:
77
77
  - ".rspec"
78
78
  - ".travis.yml"
79
79
  - ".yardopts"
80
+ - CHANGELOG.md
80
81
  - Gemfile
81
82
  - Guardfile
82
83
  - LICENSE
@@ -85,6 +86,8 @@ files:
85
86
  - lib/questrade_api.rb
86
87
  - lib/questrade_api/authorization.rb
87
88
  - lib/questrade_api/client.rb
89
+ - lib/questrade_api/modules/account_call.rb
90
+ - lib/questrade_api/modules/market_call.rb
88
91
  - lib/questrade_api/modules/util.rb
89
92
  - lib/questrade_api/rest/account.rb
90
93
  - lib/questrade_api/rest/activity.rb
@@ -112,11 +115,14 @@ files:
112
115
  - spec/fixtures/json/positions.json
113
116
  - spec/fixtures/json/quote_01.json
114
117
  - spec/fixtures/json/quotes.json
118
+ - spec/fixtures/json/symbol_01.json
115
119
  - spec/fixtures/json/symbols.json
116
120
  - spec/fixtures/json/symbols_search.json
117
121
  - spec/fixtures/json/time.json
118
122
  - spec/questrade_api/authorization_spec.rb
119
123
  - spec/questrade_api/client_spec.rb
124
+ - spec/questrade_api/modules/account_call_spec.rb
125
+ - spec/questrade_api/modules/market_call_spec.rb
120
126
  - spec/questrade_api/rest/account_spec.rb
121
127
  - spec/questrade_api/rest/activity_spec.rb
122
128
  - spec/questrade_api/rest/balance_spec.rb
@@ -167,11 +173,14 @@ test_files:
167
173
  - spec/fixtures/json/positions.json
168
174
  - spec/fixtures/json/quote_01.json
169
175
  - spec/fixtures/json/quotes.json
176
+ - spec/fixtures/json/symbol_01.json
170
177
  - spec/fixtures/json/symbols.json
171
178
  - spec/fixtures/json/symbols_search.json
172
179
  - spec/fixtures/json/time.json
173
180
  - spec/questrade_api/authorization_spec.rb
174
181
  - spec/questrade_api/client_spec.rb
182
+ - spec/questrade_api/modules/account_call_spec.rb
183
+ - spec/questrade_api/modules/market_call_spec.rb
175
184
  - spec/questrade_api/rest/account_spec.rb
176
185
  - spec/questrade_api/rest/activity_spec.rb
177
186
  - spec/questrade_api/rest/balance_spec.rb