iex-ruby-client 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +11 -17
- data/CHANGELOG.md +4 -0
- data/README.md +88 -2
- data/iex-ruby-client.gemspec +1 -0
- data/lib/iex-ruby-client.rb +1 -0
- data/lib/iex/api.rb +1 -0
- data/lib/iex/api/key_stats.rb +13 -0
- data/lib/iex/resources.rb +1 -0
- data/lib/iex/resources/base.rb +14 -0
- data/lib/iex/resources/key_stats.rb +81 -0
- data/lib/iex/version.rb +1 -1
- data/spec/fixtures/iex/key_stats/invalid.yml +65 -0
- data/spec/fixtures/iex/key_stats/msft.yml +68 -0
- data/spec/iex/resources/base_spec.rb +48 -0
- data/spec/iex/resources/key_stats_spec.rb +93 -0
- metadata +26 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31f82e417e023dae4b43a116a26c363f998452ee
|
4
|
+
data.tar.gz: f567de4892dbc778d9c4a285269d9fb2bfc2a204
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8682c270ea7b9fb8a19deb4b6423252bcbd4b8fd1bdfb5b1805b28d94866309a126bbccea0c70b6c1b58e00e216e2315509f982bac3c20f701a1e5882a1d50a5
|
7
|
+
data.tar.gz: ea4d46ac096195a920681dc104a1822d97544c97a1089b2a386030f76e284147b6581e64fb87a20742c0f75695d1ec2a27749159240c907fe5e57f6f3701c19c
|
data/.rubocop_todo.yml
CHANGED
@@ -1,28 +1,28 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on 2018-
|
3
|
+
# on 2018-08-05 20:08:18 -0400 using RuboCop version 0.51.0.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
8
|
|
9
|
-
# Offense count:
|
10
|
-
Metrics/AbcSize:
|
11
|
-
Max: 16
|
12
|
-
|
13
|
-
# Offense count: 5
|
9
|
+
# Offense count: 9
|
14
10
|
# Configuration parameters: CountComments, ExcludedMethods.
|
15
|
-
# ExcludedMethods: refine
|
16
11
|
Metrics/BlockLength:
|
17
|
-
Max:
|
12
|
+
Max: 85
|
13
|
+
|
14
|
+
# Offense count: 64
|
15
|
+
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
16
|
+
# URISchemes: http, https
|
17
|
+
Metrics/LineLength:
|
18
|
+
Max: 221
|
18
19
|
|
19
20
|
# Offense count: 1
|
20
21
|
# Configuration parameters: CountComments.
|
21
22
|
Metrics/MethodLength:
|
22
|
-
Max:
|
23
|
+
Max: 15
|
23
24
|
|
24
25
|
# Offense count: 1
|
25
|
-
# Configuration parameters: AllowedChars.
|
26
26
|
Style/AsciiComments:
|
27
27
|
Exclude:
|
28
28
|
- 'lib/iex/resources/quote.rb'
|
@@ -33,12 +33,6 @@ Style/DateTime:
|
|
33
33
|
- 'lib/iex/resources/news.rb'
|
34
34
|
- 'spec/iex/resources/news_spec.rb'
|
35
35
|
|
36
|
-
# Offense count:
|
36
|
+
# Offense count: 26
|
37
37
|
Style/Documentation:
|
38
38
|
Enabled: false
|
39
|
-
|
40
|
-
# Offense count: 43
|
41
|
-
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
42
|
-
# URISchemes: http, https
|
43
|
-
Metrics/LineLength:
|
44
|
-
Max: 221
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
### 0.4.1 (2018/08/07)
|
2
|
+
|
3
|
+
* [#18](https://github.com/dblock/iex-ruby-client/pull/18): Added `IEX::Resources::KeyStats` - [@rodolfobandeira](https://github.com/rodolfobandeira).
|
4
|
+
|
1
5
|
### 0.4.0 (2018/07/29)
|
2
6
|
|
3
7
|
* [#9](https://github.com/dblock/iex-ruby-client/pull/9): Added `IEX::Errors::ClientError` - [@rodolfobandeira](https://github.com/rodolfobandeira).
|
data/README.md
CHANGED
@@ -16,6 +16,20 @@ gem 'iex-ruby-client'
|
|
16
16
|
|
17
17
|
Run `bundle install`.
|
18
18
|
|
19
|
+
|
20
|
+
## Methods Available:
|
21
|
+
|
22
|
+
- [Get a Single Price](#get-a-single-price)
|
23
|
+
- [Get a Quote](#get-a-quote)
|
24
|
+
- [Get a OHLC (Open, High, Low, Close) price](#get-a-ohlc-open-high-low-close-price)
|
25
|
+
- [Get a Market OHLC (Open, High, Low, Close) prices](#get-a-market-ohlc-open-high-low-close-prices)
|
26
|
+
- [Get Company Information](#get-company-information)
|
27
|
+
- [Get Company Logo](#get-company-logo)
|
28
|
+
- [Get Recent News](#get-recent-news)
|
29
|
+
- [Get Chart](#get-chat)
|
30
|
+
- [Get Key Stats](#get-key-stats)
|
31
|
+
|
32
|
+
|
19
33
|
## Usage
|
20
34
|
|
21
35
|
### Get a Single Price
|
@@ -83,7 +97,7 @@ company.company_name # 'Microsoft Corporation'
|
|
83
97
|
|
84
98
|
See [#company](https://iextrading.com/developer/docs/#company) for detailed documentation or [company.rb](lib/iex/resources/company.rb) for returned fields.
|
85
99
|
|
86
|
-
### Get Company Logo
|
100
|
+
### Get a Company Logo
|
87
101
|
|
88
102
|
Fetches company logo for a symbol.
|
89
103
|
|
@@ -150,7 +164,79 @@ IEX::Resources::Chart.get('MSFT', Date.new(2018, 3, 26))
|
|
150
164
|
IEX::Resources::Chart.get('MSFT', '1d', chart_interval: 10)
|
151
165
|
```
|
152
166
|
|
153
|
-
|
167
|
+
### Get Key Stats
|
168
|
+
|
169
|
+
Fetches company's key stats for a symbol.
|
170
|
+
|
171
|
+
```ruby
|
172
|
+
key_stats = IEX::Resources::KeyStats.get('MSFT')
|
173
|
+
|
174
|
+
key_stats.symbol # MSFT
|
175
|
+
key_stats.market_cap # 825814890000
|
176
|
+
key_stats.market_cap_dollars # '$825,814,890,000'
|
177
|
+
key_stats.beta # 1.261768
|
178
|
+
key_stats.week_52_high # 111.15
|
179
|
+
key_stats.week_52_high_dollar # '$111.15'
|
180
|
+
key_stats.week_52_low # 71.28
|
181
|
+
key_stats.week_52_low_dollar # '$71.28'
|
182
|
+
key_stats.week_52_change_dollar # '$51.77'
|
183
|
+
key_stats.short_interest # 47158592
|
184
|
+
key_stats.short_date # '2018-07-13'
|
185
|
+
key_stats.dividend_rate # 1.68
|
186
|
+
key_stats.dividend_yield # 1.5617738
|
187
|
+
key_stats.ex_dividend_date # '2018-08-15 00:00:00.0'
|
188
|
+
key_stats.latest_eps # 2.11
|
189
|
+
key_stats.latest_eps_date # '2018-06-30'
|
190
|
+
key_stats.shares_outstanding # 7677000000
|
191
|
+
key_stats.float # 7217387757
|
192
|
+
key_stats.return_on_equity # 20.82
|
193
|
+
key_stats.consensus_eps # 0.86
|
194
|
+
key_stats.number_of_estimates # 14
|
195
|
+
key_stats.eps_surprise_dollar # nil
|
196
|
+
key_stats.eps_surprise_percent # 11.6279
|
197
|
+
key_stats.eps_surprise_percent_s # '+1162.79%'
|
198
|
+
key_stats.ebitda # 23558000000
|
199
|
+
key_stats.revenue_dollar # '$53,456,000,000'
|
200
|
+
key_stats.gross_profit # 34114000000
|
201
|
+
key_stats.gross_profit_dollar # '$34,114,000,000'
|
202
|
+
key_stats.cash_dollar # '$281,251,000,000'
|
203
|
+
key_stats.ttm_eps # 3.51
|
204
|
+
key_stats.revenue_per_share # 7
|
205
|
+
key_stats.revenue_per_employee # 431097
|
206
|
+
key_stats.pe_ratio_high # 0
|
207
|
+
key_stats.pe_ratio_low # 0
|
208
|
+
key_stats.return_on_assets # 6.46
|
209
|
+
key_stats.return_on_capital # nil
|
210
|
+
key_stats.profit_margin # 15.1
|
211
|
+
key_stats.price_to_sales # 7.393182
|
212
|
+
key_stats.price_to_sales_dollar # '$7.39'
|
213
|
+
key_stats.price_to_book # 10.73
|
214
|
+
key_stats.price_to_book_dollar # '$10.73'
|
215
|
+
key_stats.day_200_moving_avg # 91.99065
|
216
|
+
key_stats.day_50_moving_avg # 102.2528
|
217
|
+
key_stats.institution_percent # 75.1
|
218
|
+
key_stats.institution_percent_s # '+7510.00%'
|
219
|
+
key_stats.insider_percent # nil
|
220
|
+
key_stats.insider_percent_s # nil
|
221
|
+
key_stats.short_ratio # 1.7330703
|
222
|
+
key_stats.year_5_change_percent # 2.85141424991049
|
223
|
+
key_stats.year_5_change_percent_s # '+285.14%'
|
224
|
+
key_stats.year_2_change_percent # 0.9732002824884664
|
225
|
+
key_stats.year_2_change_percent_s # '+97.32%'
|
226
|
+
key_stats.year_1_change_percent # 0.5200287133805482
|
227
|
+
key_stats.year_1_change_percent_s # '+52.00%'
|
228
|
+
key_stats.ytd_change_percent # 0.2628699562098638
|
229
|
+
key_stats.month_6_change_percent # 0.23345097958275707
|
230
|
+
key_stats.month_6_change_percent_s # '+23.35%'
|
231
|
+
key_stats.month_3_change_percent # 0.14846686026648437
|
232
|
+
key_stats.month_3_change_percent_s # '+14.85%'
|
233
|
+
key_stats.month_1_change_percent # 0.08601716304896513
|
234
|
+
key_stats.month_1_change_percent_s # '+8.60%'
|
235
|
+
key_stats.day_5_change_percent # -0.0010215453194652084
|
236
|
+
key_stats.day_5_change_percent_s # '-0.10%'
|
237
|
+
```
|
238
|
+
See [#key-stats](https://iextrading.com/developer/docs/#key-stats) for detailed documentation or [key_stats.rb](lib/iex/resources/key_stats.rb) for returned fields.
|
239
|
+
|
154
240
|
|
155
241
|
## Errors
|
156
242
|
|
data/iex-ruby-client.gemspec
CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.add_dependency 'faraday', '>= 0.9'
|
19
19
|
s.add_dependency 'faraday_middleware'
|
20
20
|
s.add_dependency 'hashie'
|
21
|
+
s.add_dependency 'money_helper'
|
21
22
|
s.add_development_dependency 'rake', '~> 10'
|
22
23
|
s.add_development_dependency 'rspec'
|
23
24
|
s.add_development_dependency 'rubocop', '0.51.0'
|
data/lib/iex-ruby-client.rb
CHANGED
data/lib/iex/api.rb
CHANGED
data/lib/iex/resources.rb
CHANGED
data/lib/iex/resources/base.rb
CHANGED
@@ -8,6 +8,20 @@ module IEX
|
|
8
8
|
rescue Faraday::ClientError => e
|
9
9
|
raise IEX::Errors::ClientError, e.response
|
10
10
|
end
|
11
|
+
|
12
|
+
def self.float_to_percentage(float_number)
|
13
|
+
return unless float_number.is_a? Numeric
|
14
|
+
return '+0.00%' if float_number.zero?
|
15
|
+
[
|
16
|
+
float_number > 0 ? '+' : '',
|
17
|
+
format('%.2f', float_number * 100),
|
18
|
+
'%'
|
19
|
+
].join
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.to_dollar(amount:, ignore_cents: true)
|
23
|
+
MoneyHelper.money_to_text(amount, 'USD', nil, no_cents: ignore_cents)
|
24
|
+
end
|
11
25
|
end
|
12
26
|
end
|
13
27
|
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module IEX
|
2
|
+
module Resources
|
3
|
+
class KeyStats < Resource
|
4
|
+
property 'company_name', from: 'companyName'
|
5
|
+
property 'market_cap', from: 'marketcap'
|
6
|
+
property 'market_cap_dollars', from: 'marketcap', with: ->(v) { Base.to_dollar(amount: v) }
|
7
|
+
property 'beta'
|
8
|
+
property 'week_52_high', from: 'week52high'
|
9
|
+
property 'week_52_high_dollar', from: 'week52high', with: ->(v) { Base.to_dollar(amount: v, ignore_cents: false) }
|
10
|
+
property 'week_52_low', from: 'week52low'
|
11
|
+
property 'week_52_low_dollar', from: 'week52low', with: ->(v) { Base.to_dollar(amount: v, ignore_cents: false) }
|
12
|
+
property 'week_52_change'
|
13
|
+
property 'week_52_change_dollar', from: 'week52change', with: ->(v) { Base.to_dollar(amount: v, ignore_cents: false) }
|
14
|
+
property 'short_interest', from: 'shortInterest'
|
15
|
+
property 'short_date', from: 'shortDate'
|
16
|
+
property 'dividend_rate', from: 'dividendRate'
|
17
|
+
property 'dividend_yield', from: 'dividendYield'
|
18
|
+
property 'ex_dividend_date', from: 'exDividendDate'
|
19
|
+
property 'latest_eps', from: 'latestEPS'
|
20
|
+
property 'latest_eps_date', from: 'latestEPSDate'
|
21
|
+
property 'shares_outstanding', from: 'sharesOutstanding'
|
22
|
+
property 'float'
|
23
|
+
property 'return_on_equity', from: 'returnOnEquity'
|
24
|
+
property 'consensus_eps', from: 'consensusEPS'
|
25
|
+
property 'number_of_estimates', from: 'numberOfEstimates'
|
26
|
+
property 'symbol'
|
27
|
+
property 'ebitda', from: 'EBITDA'
|
28
|
+
property 'revenue'
|
29
|
+
property 'revenue_dollar', from: 'revenue', with: ->(v) { Base.to_dollar(amount: v) }
|
30
|
+
property 'gross_profit', from: 'grossProfit'
|
31
|
+
property 'gross_profit_dollar', from: 'grossProfit', with: ->(v) { Base.to_dollar(amount: v) }
|
32
|
+
property 'cash'
|
33
|
+
property 'cash_dollar', from: 'cash', with: ->(v) { Base.to_dollar(amount: v) }
|
34
|
+
property 'dept'
|
35
|
+
property 'dept_dollar', from: 'dept', with: ->(v) { Base.to_dollar(amount: v) }
|
36
|
+
property 'ttm_eps', from: 'ttmEPS'
|
37
|
+
property 'revenue_per_share', from: 'revenuePerShare'
|
38
|
+
property 'revenue_per_employee', from: 'revenuePerEmployee'
|
39
|
+
property 'pe_ratio_high', from: 'peRatioHigh'
|
40
|
+
property 'pe_ratio_low', from: 'peRatioLow'
|
41
|
+
property 'eps_surprise_dollar', from: 'EPSSurpriseDollar'
|
42
|
+
property 'eps_surprise_percent', from: 'EPSSurprisePercent'
|
43
|
+
property 'eps_surprise_percent_s', from: 'EPSSurprisePercent', with: ->(v) { Base.float_to_percentage(v) }
|
44
|
+
property 'return_on_assets', from: 'returnOnAssets'
|
45
|
+
property 'return_on_capital', from: 'returnOnCapital'
|
46
|
+
property 'profit_margin', from: 'profitMargin'
|
47
|
+
property 'price_to_sales', from: 'priceToSales'
|
48
|
+
property 'price_to_book', from: 'priceToBook'
|
49
|
+
property 'price_to_sales_dollar', from: 'priceToSales', with: ->(v) { Base.to_dollar(amount: v, ignore_cents: false) }
|
50
|
+
property 'price_to_book_dollar', from: 'priceToBook', with: ->(v) { Base.to_dollar(amount: v, ignore_cents: false) }
|
51
|
+
property 'day_200_moving_avg', from: 'day200MovingAvg'
|
52
|
+
property 'day_50_moving_avg', from: 'day50MovingAvg'
|
53
|
+
property 'institution_percent', from: 'institutionPercent'
|
54
|
+
property 'institution_percent_s', from: 'institutionPercent', with: ->(v) { Base.float_to_percentage(v) }
|
55
|
+
property 'insider_percent', from: 'insiderPercent'
|
56
|
+
property 'insider_percent_s', from: 'insiderPercent', with: ->(v) { Base.float_to_percentage(v) }
|
57
|
+
property 'short_ratio', from: 'shortRatio'
|
58
|
+
property 'year_5_change_percent', from: 'year5ChangePercent'
|
59
|
+
property 'year_5_change_percent_s', from: 'year5ChangePercent', with: ->(v) { Base.float_to_percentage(v) }
|
60
|
+
property 'year_2_change_percent', from: 'year2ChangePercent'
|
61
|
+
property 'year_2_change_percent_s', from: 'year2ChangePercent', with: ->(v) { Base.float_to_percentage(v) }
|
62
|
+
property 'year_1_change_percent', from: 'year1ChangePercent'
|
63
|
+
property 'year_1_change_percent_s', from: 'year1ChangePercent', with: ->(v) { Base.float_to_percentage(v) }
|
64
|
+
property 'ytd_change_percent', from: 'ytdChangePercent'
|
65
|
+
property 'month_6_change_percent', from: 'month6ChangePercent'
|
66
|
+
property 'month_6_change_percent_s', from: 'month6ChangePercent', with: ->(v) { Base.float_to_percentage(v) }
|
67
|
+
property 'month_3_change_percent', from: 'month3ChangePercent'
|
68
|
+
property 'month_3_change_percent_s', from: 'month3ChangePercent', with: ->(v) { Base.float_to_percentage(v) }
|
69
|
+
property 'month_1_change_percent', from: 'month1ChangePercent'
|
70
|
+
property 'month_1_change_percent_s', from: 'month1ChangePercent', with: ->(v) { Base.float_to_percentage(v) }
|
71
|
+
property 'day_5_change_percent', from: 'day5ChangePercent'
|
72
|
+
property 'day_5_change_percent_s', from: 'day5ChangePercent', with: ->(v) { Base.float_to_percentage(v) }
|
73
|
+
|
74
|
+
def self.get(symbol)
|
75
|
+
new IEX::Api::KeyStats.get(symbol)
|
76
|
+
rescue Faraday::ResourceNotFound => e
|
77
|
+
raise IEX::Errors::SymbolNotFoundError.new(symbol, e.response[:body])
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/lib/iex/version.rb
CHANGED
@@ -0,0 +1,65 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.iextrading.com/1.0/stock/INVALID/stats
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.15.2
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- "*/*"
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 404
|
19
|
+
message: Not Found
|
20
|
+
headers:
|
21
|
+
Server:
|
22
|
+
- nginx
|
23
|
+
Date:
|
24
|
+
- Fri, 03 Aug 2018 23:45:27 GMT
|
25
|
+
Content-Type:
|
26
|
+
- text/html; charset=utf-8
|
27
|
+
Transfer-Encoding:
|
28
|
+
- chunked
|
29
|
+
Connection:
|
30
|
+
- keep-alive
|
31
|
+
Set-Cookie:
|
32
|
+
- ctoken=f749efd72bd44615ae05dbd800720ac3; Domain=.iextrading.com; Path=/; Expires=Sat,
|
33
|
+
04 Aug 2018 11:45:27 GMT; Secure
|
34
|
+
Content-Security-Policy:
|
35
|
+
- default-src 'self'; child-src 'none'; object-src 'none'; style-src 'self'
|
36
|
+
'unsafe-inline'; font-src data:; frame-src 'self'; connect-src 'self' https://auth.iextrading.com
|
37
|
+
https://api.iextrading.com https://api.iextrading.com wss://iextrading.com
|
38
|
+
wss://tops.iextrading.com wss://api.iextrading.com wss://iextrading.com; script-src
|
39
|
+
'self' 'unsafe-inline' 'unsafe-eval';
|
40
|
+
X-Content-Security-Policy:
|
41
|
+
- default-src 'self'; child-src 'none'; object-src 'none'; style-src 'self'
|
42
|
+
'unsafe-inline'; font-src data:; frame-src 'self'; connect-src 'self' https://auth.iextrading.com
|
43
|
+
https://api.iextrading.com https://api.iextrading.com wss://iextrading.com
|
44
|
+
wss://tops.iextrading.com wss://api.iextrading.com wss://iextrading.com; script-src
|
45
|
+
'self' 'unsafe-inline' 'unsafe-eval';
|
46
|
+
Frame-Options:
|
47
|
+
- SAMEORIGIN
|
48
|
+
X-Frame-Options:
|
49
|
+
- SAMEORIGIN
|
50
|
+
Strict-Transport-Security:
|
51
|
+
- max-age=15768000
|
52
|
+
Access-Control-Allow-Origin:
|
53
|
+
- "*"
|
54
|
+
Access-Control-Allow-Credentials:
|
55
|
+
- 'true'
|
56
|
+
Access-Control-Allow-Methods:
|
57
|
+
- GET, OPTIONS
|
58
|
+
Access-Control-Allow-Headers:
|
59
|
+
- Origin, X-Requested-With, Content-Type, Accept
|
60
|
+
body:
|
61
|
+
encoding: ASCII-8BIT
|
62
|
+
string: Unknown symbol
|
63
|
+
http_version:
|
64
|
+
recorded_at: Fri, 03 Aug 2018 23:45:27 GMT
|
65
|
+
recorded_with: VCR 4.0.0
|
@@ -0,0 +1,68 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.iextrading.com/1.0/stock/MSFT/stats
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.15.2
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- "*/*"
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Server:
|
22
|
+
- nginx
|
23
|
+
Date:
|
24
|
+
- Fri, 03 Aug 2018 23:45:26 GMT
|
25
|
+
Content-Type:
|
26
|
+
- application/json; charset=utf-8
|
27
|
+
Content-Length:
|
28
|
+
- '1311'
|
29
|
+
Connection:
|
30
|
+
- keep-alive
|
31
|
+
Set-Cookie:
|
32
|
+
- ctoken=743c58ee68264c2c8adc8b1713024ad6; Domain=.iextrading.com; Path=/; Expires=Sat,
|
33
|
+
04 Aug 2018 11:45:26 GMT; Secure
|
34
|
+
Content-Security-Policy:
|
35
|
+
- default-src 'self'; child-src 'none'; object-src 'none'; style-src 'self'
|
36
|
+
'unsafe-inline'; font-src data:; frame-src 'self'; connect-src 'self' https://auth.iextrading.com
|
37
|
+
https://api.iextrading.com https://api.iextrading.com wss://iextrading.com
|
38
|
+
wss://tops.iextrading.com wss://api.iextrading.com wss://iextrading.com; script-src
|
39
|
+
'self' 'unsafe-inline' 'unsafe-eval';
|
40
|
+
X-Content-Security-Policy:
|
41
|
+
- default-src 'self'; child-src 'none'; object-src 'none'; style-src 'self'
|
42
|
+
'unsafe-inline'; font-src data:; frame-src 'self'; connect-src 'self' https://auth.iextrading.com
|
43
|
+
https://api.iextrading.com https://api.iextrading.com wss://iextrading.com
|
44
|
+
wss://tops.iextrading.com wss://api.iextrading.com wss://iextrading.com; script-src
|
45
|
+
'self' 'unsafe-inline' 'unsafe-eval';
|
46
|
+
Frame-Options:
|
47
|
+
- SAMEORIGIN
|
48
|
+
X-Frame-Options:
|
49
|
+
- SAMEORIGIN
|
50
|
+
X-Content-Type-Options:
|
51
|
+
- nosniff
|
52
|
+
Strict-Transport-Security:
|
53
|
+
- max-age=15768000
|
54
|
+
Access-Control-Allow-Origin:
|
55
|
+
- "*"
|
56
|
+
Access-Control-Allow-Credentials:
|
57
|
+
- 'true'
|
58
|
+
Access-Control-Allow-Methods:
|
59
|
+
- GET, OPTIONS
|
60
|
+
Access-Control-Allow-Headers:
|
61
|
+
- Origin, X-Requested-With, Content-Type, Accept
|
62
|
+
body:
|
63
|
+
encoding: UTF-8
|
64
|
+
string: '{"companyName":"Microsoft Corporation","marketcap":825814890000,"beta":1.261768,"week52high":111.15,"week52low":71.28,"week52change":51.7715,"shortInterest":47158592,"shortDate":"2018-07-13","dividendRate":1.68,"dividendYield":1.5617738,"exDividendDate":"2018-08-15
|
65
|
+
00:00:00.0","latestEPS":2.11,"latestEPSDate":"2018-06-30","sharesOutstanding":7677000000,"float":7217387757,"returnOnEquity":20.82,"consensusEPS":0.86,"numberOfEstimates":14,"EPSSurpriseDollar":null,"EPSSurprisePercent":11.6279,"symbol":"MSFT","EBITDA":23558000000,"revenue":53456000000,"grossProfit":34114000000,"cash":281251000000,"debt":180503000000,"ttmEPS":3.51,"revenuePerShare":7,"revenuePerEmployee":431097,"peRatioHigh":0,"peRatioLow":0,"returnOnAssets":6.46,"returnOnCapital":null,"profitMargin":15.1,"priceToSales":7.393182,"priceToBook":10.73,"day200MovingAvg":91.99065,"day50MovingAvg":102.2528,"institutionPercent":75.1,"insiderPercent":null,"shortRatio":1.7330703,"year5ChangePercent":2.85141424991049,"year2ChangePercent":0.9732002824884664,"year1ChangePercent":0.5200287133805482,"ytdChangePercent":0.2628699562098638,"month6ChangePercent":0.23345097958275707,"month3ChangePercent":0.14846686026648437,"month1ChangePercent":0.08601716304896513,"day5ChangePercent":-0.0010215453194652084,"day30ChangePercent":0.06357524223848124}'
|
66
|
+
http_version:
|
67
|
+
recorded_at: Fri, 03 Aug 2018 23:45:26 GMT
|
68
|
+
recorded_with: VCR 4.0.0
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe IEX::Resources::Base do
|
4
|
+
context 'float number to percent (Positive)' do
|
5
|
+
subject do
|
6
|
+
IEX::Resources::Base.float_to_percentage(0.09123)
|
7
|
+
end
|
8
|
+
it 'converts to percentage' do
|
9
|
+
expect(subject).to eq '+9.12%'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'float number to percent (Negative)' do
|
14
|
+
subject do
|
15
|
+
IEX::Resources::Base.float_to_percentage(-0.09123)
|
16
|
+
end
|
17
|
+
it 'converts to percentage' do
|
18
|
+
expect(subject).to eq '-9.12%'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'float number to percent (nil)' do
|
23
|
+
subject do
|
24
|
+
IEX::Resources::Base.float_to_percentage(nil)
|
25
|
+
end
|
26
|
+
it 'nil argument does not convert' do
|
27
|
+
expect(subject).to eq nil
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'float number to percent (0)' do
|
32
|
+
subject do
|
33
|
+
IEX::Resources::Base.float_to_percentage(0)
|
34
|
+
end
|
35
|
+
it 'Zero converts to +0.00%' do
|
36
|
+
expect(subject).to eq '+0.00%'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'Unformatted money amount to dollar' do
|
41
|
+
subject do
|
42
|
+
IEX::Resources::Base.to_dollar(amount: 123_391)
|
43
|
+
end
|
44
|
+
it 'converts to dollar' do
|
45
|
+
expect(subject).to eq '$123,391'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe IEX::Resources::KeyStats do
|
4
|
+
context 'general information', vcr: { cassette_name: 'key_stats/msft' } do
|
5
|
+
subject do
|
6
|
+
IEX::Resources::KeyStats.get('MSFT')
|
7
|
+
end
|
8
|
+
it 'retrieves a keyStats' do
|
9
|
+
expect(subject.symbol).to eq 'MSFT'
|
10
|
+
expect(subject.company_name).to eq 'Microsoft Corporation'
|
11
|
+
expect(subject.market_cap).to eq 825_814_890_000
|
12
|
+
expect(subject.market_cap_dollars).to eq '$825,814,890,000'
|
13
|
+
expect(subject.beta).to eq 1.261768
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'weekly stats' do
|
17
|
+
expect(subject.week_52_high).to eq 111.15
|
18
|
+
expect(subject.week_52_high_dollar).to eq '$111.15'
|
19
|
+
expect(subject.week_52_low).to eq 71.28
|
20
|
+
expect(subject.week_52_low_dollar).to eq '$71.28'
|
21
|
+
expect(subject.week_52_change_dollar).to eq '$51.77'
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'general stats' do
|
25
|
+
expect(subject.short_interest).to eq 47_158_592
|
26
|
+
expect(subject.short_date).to eq '2018-07-13'
|
27
|
+
expect(subject.dividend_rate).to eq 1.68
|
28
|
+
expect(subject.dividend_yield).to eq 1.5617738
|
29
|
+
expect(subject.ex_dividend_date).to eq '2018-08-15 00:00:00.0'
|
30
|
+
expect(subject.latest_eps).to eq 2.11
|
31
|
+
expect(subject.latest_eps_date).to eq '2018-06-30'
|
32
|
+
expect(subject.shares_outstanding).to eq 7_677_000_000
|
33
|
+
expect(subject.float).to eq 7_217_387_757
|
34
|
+
expect(subject.return_on_equity).to eq 20.82
|
35
|
+
expect(subject.consensus_eps).to eq 0.86
|
36
|
+
expect(subject.number_of_estimates).to eq 14
|
37
|
+
expect(subject.eps_surprise_dollar).to eq nil
|
38
|
+
expect(subject.eps_surprise_percent).to eq 11.6279
|
39
|
+
expect(subject.eps_surprise_percent_s).to eq '+1162.79%'
|
40
|
+
expect(subject.ebitda).to eq 23_558_000_000
|
41
|
+
expect(subject.revenue_dollar).to eq '$53,456,000,000'
|
42
|
+
expect(subject.gross_profit).to eq 34_114_000_000
|
43
|
+
expect(subject.gross_profit_dollar).to eq '$34,114,000,000'
|
44
|
+
expect(subject.cash_dollar).to eq '$281,251,000,000'
|
45
|
+
expect(subject.ttm_eps).to eq 3.51
|
46
|
+
expect(subject.revenue_per_share).to eq 7
|
47
|
+
expect(subject.revenue_per_employee).to eq 431_097
|
48
|
+
expect(subject.pe_ratio_high).to eq 0
|
49
|
+
expect(subject.pe_ratio_low).to eq 0
|
50
|
+
expect(subject.return_on_assets).to eq 6.46
|
51
|
+
expect(subject.return_on_capital).to eq nil
|
52
|
+
expect(subject.profit_margin).to eq 15.1
|
53
|
+
expect(subject.price_to_sales).to eq 7.393182
|
54
|
+
expect(subject.price_to_sales_dollar).to eq '$7.39'
|
55
|
+
expect(subject.price_to_book).to eq 10.73
|
56
|
+
expect(subject.price_to_book_dollar).to eq '$10.73'
|
57
|
+
expect(subject.day_200_moving_avg).to eq 91.99065
|
58
|
+
expect(subject.day_50_moving_avg).to eq 102.2528
|
59
|
+
expect(subject.institution_percent).to eq 75.1
|
60
|
+
expect(subject.institution_percent_s).to eq '+7510.00%'
|
61
|
+
expect(subject.insider_percent).to eq nil
|
62
|
+
expect(subject.insider_percent_s).to eq nil
|
63
|
+
expect(subject.short_ratio).to eq 1.7330703
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'changes stats' do
|
67
|
+
expect(subject.year_5_change_percent).to be 2.85141424991049
|
68
|
+
expect(subject.year_5_change_percent_s).to eq '+285.14%'
|
69
|
+
expect(subject.year_2_change_percent).to eq 0.9732002824884664
|
70
|
+
expect(subject.year_2_change_percent_s).to eq '+97.32%'
|
71
|
+
expect(subject.year_1_change_percent).to eq 0.5200287133805482
|
72
|
+
expect(subject.year_1_change_percent_s).to eq '+52.00%'
|
73
|
+
expect(subject.ytd_change_percent).to eq 0.2628699562098638
|
74
|
+
expect(subject.month_6_change_percent).to eq 0.23345097958275707
|
75
|
+
expect(subject.month_6_change_percent_s).to eq '+23.35%'
|
76
|
+
expect(subject.month_3_change_percent).to eq 0.14846686026648437
|
77
|
+
expect(subject.month_3_change_percent_s).to eq '+14.85%'
|
78
|
+
expect(subject.month_1_change_percent).to eq 0.08601716304896513
|
79
|
+
expect(subject.month_1_change_percent_s).to eq '+8.60%'
|
80
|
+
expect(subject.day_5_change_percent).to eq 0.0010215453194652084 * -1
|
81
|
+
expect(subject.day_5_change_percent_s).to eq '-0.10%'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'invalid symbol', vcr: { cassette_name: 'key_stats/invalid' } do
|
86
|
+
subject do
|
87
|
+
IEX::Resources::KeyStats.get('INVALID')
|
88
|
+
end
|
89
|
+
it 'fails with SymbolNotFoundError' do
|
90
|
+
expect { subject }.to raise_error IEX::Errors::SymbolNotFoundError, 'Symbol INVALID Not Found'
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iex-ruby-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Doubrovkine
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-08-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: money_helper
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rake
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -146,6 +160,7 @@ files:
|
|
146
160
|
- lib/iex/api.rb
|
147
161
|
- lib/iex/api/chart.rb
|
148
162
|
- lib/iex/api/company.rb
|
163
|
+
- lib/iex/api/key_stats.rb
|
149
164
|
- lib/iex/api/logo.rb
|
150
165
|
- lib/iex/api/news.rb
|
151
166
|
- lib/iex/api/ohlc.rb
|
@@ -161,6 +176,7 @@ files:
|
|
161
176
|
- lib/iex/resources/chart/default.rb
|
162
177
|
- lib/iex/resources/chart/one_day.rb
|
163
178
|
- lib/iex/resources/company.rb
|
179
|
+
- lib/iex/resources/key_stats.rb
|
164
180
|
- lib/iex/resources/logo.rb
|
165
181
|
- lib/iex/resources/news.rb
|
166
182
|
- lib/iex/resources/ohlc.rb
|
@@ -179,6 +195,8 @@ files:
|
|
179
195
|
- spec/fixtures/iex/chart/msft.yml
|
180
196
|
- spec/fixtures/iex/company/invalid.yml
|
181
197
|
- spec/fixtures/iex/company/msft.yml
|
198
|
+
- spec/fixtures/iex/key_stats/invalid.yml
|
199
|
+
- spec/fixtures/iex/key_stats/msft.yml
|
182
200
|
- spec/fixtures/iex/logo/msft.yml
|
183
201
|
- spec/fixtures/iex/news/invalid.yml
|
184
202
|
- spec/fixtures/iex/news/market.yml
|
@@ -190,8 +208,10 @@ files:
|
|
190
208
|
- spec/fixtures/iex/price/msft.yml
|
191
209
|
- spec/fixtures/iex/quote/invalid.yml
|
192
210
|
- spec/fixtures/iex/quote/msft.yml
|
211
|
+
- spec/iex/resources/base_spec.rb
|
193
212
|
- spec/iex/resources/chart_spec.rb
|
194
213
|
- spec/iex/resources/company_spec.rb
|
214
|
+
- spec/iex/resources/key_stats_spec.rb
|
195
215
|
- spec/iex/resources/logo_spec.rb
|
196
216
|
- spec/iex/resources/news_spec.rb
|
197
217
|
- spec/iex/resources/ohlc_spec.rb
|
@@ -234,6 +254,8 @@ test_files:
|
|
234
254
|
- spec/fixtures/iex/chart/msft.yml
|
235
255
|
- spec/fixtures/iex/company/invalid.yml
|
236
256
|
- spec/fixtures/iex/company/msft.yml
|
257
|
+
- spec/fixtures/iex/key_stats/invalid.yml
|
258
|
+
- spec/fixtures/iex/key_stats/msft.yml
|
237
259
|
- spec/fixtures/iex/logo/msft.yml
|
238
260
|
- spec/fixtures/iex/news/invalid.yml
|
239
261
|
- spec/fixtures/iex/news/market.yml
|
@@ -245,8 +267,10 @@ test_files:
|
|
245
267
|
- spec/fixtures/iex/price/msft.yml
|
246
268
|
- spec/fixtures/iex/quote/invalid.yml
|
247
269
|
- spec/fixtures/iex/quote/msft.yml
|
270
|
+
- spec/iex/resources/base_spec.rb
|
248
271
|
- spec/iex/resources/chart_spec.rb
|
249
272
|
- spec/iex/resources/company_spec.rb
|
273
|
+
- spec/iex/resources/key_stats_spec.rb
|
250
274
|
- spec/iex/resources/logo_spec.rb
|
251
275
|
- spec/iex/resources/news_spec.rb
|
252
276
|
- spec/iex/resources/ohlc_spec.rb
|