iex-ruby-client 1.0.1 → 1.3.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.
- checksums.yaml +5 -5
- data/.env.sample +2 -0
- data/.github/FUNDING.yml +1 -0
- data/.rubocop.yml +4 -1
- data/.rubocop_todo.yml +0 -8
- data/CHANGELOG.md +43 -9
- data/Dangerfile +2 -2
- data/Gemfile +3 -2
- data/README.md +134 -10
- data/iex-ruby-client.gemspec +3 -2
- data/lib/iex/api.rb +6 -1
- data/lib/iex/api/client.rb +13 -2
- data/lib/iex/api/config/client.rb +52 -0
- data/lib/iex/api/config/logger.rb +35 -0
- data/lib/iex/cloud/connection.rb +22 -19
- data/lib/iex/cloud/request.rb +1 -1
- data/lib/iex/cloud/response.rb +1 -1
- data/lib/iex/endpoints/advanced_stats.rb +11 -0
- data/lib/iex/endpoints/chart.rb +5 -6
- data/lib/iex/endpoints/company.rb +1 -1
- data/lib/iex/endpoints/crypto.rb +1 -1
- data/lib/iex/endpoints/dividends.rb +1 -1
- data/lib/iex/endpoints/earnings.rb +1 -1
- data/lib/iex/endpoints/income.rb +13 -0
- data/lib/iex/endpoints/key_stats.rb +1 -1
- data/lib/iex/endpoints/largest_trades.rb +1 -1
- data/lib/iex/endpoints/logo.rb +1 -1
- data/lib/iex/endpoints/news.rb +1 -1
- data/lib/iex/endpoints/ohlc.rb +2 -2
- data/lib/iex/endpoints/price.rb +1 -1
- data/lib/iex/endpoints/quote.rb +1 -1
- data/lib/iex/endpoints/ref_data.rb +22 -0
- data/lib/iex/endpoints/sectors.rb +1 -1
- data/lib/iex/endpoints/stock_market.rb +11 -0
- data/lib/iex/resources.rb +4 -0
- data/lib/iex/resources/advanced_stats.rb +42 -0
- data/lib/iex/resources/chart.rb +9 -14
- data/lib/iex/resources/company.rb +1 -0
- data/lib/iex/resources/income.rb +36 -0
- data/lib/iex/resources/key_stats.rb +2 -2
- data/lib/iex/resources/quote.rb +15 -5
- data/lib/iex/resources/resource.rb +1 -1
- data/lib/iex/resources/symbol.rb +10 -0
- data/lib/iex/resources/symbols.rb +19 -0
- data/lib/iex/version.rb +1 -1
- data/spec/fixtures/iex/advanced_stats/invalid.yml +50 -0
- data/spec/fixtures/iex/advanced_stats/msft.yml +57 -0
- data/spec/fixtures/iex/chart/1d.yml +440 -473
- data/spec/fixtures/iex/chart/20190306.yml +440 -473
- data/spec/fixtures/iex/chart/bad_option.yml +47 -81
- data/spec/fixtures/iex/chart/chartInterval.yml +89 -122
- data/spec/fixtures/iex/chart/dynamic/1m.yml +73 -107
- data/spec/fixtures/iex/chart/invalid.yml +47 -81
- data/spec/fixtures/iex/chart/msft.yml +74 -107
- data/spec/fixtures/iex/income/invalid.yml +49 -0
- data/spec/fixtures/iex/income/msft.yml +53 -0
- data/spec/fixtures/iex/income/nsrgy.yml +55 -0
- data/spec/fixtures/iex/ref-data/isin.yml +57 -0
- data/spec/fixtures/iex/ref-data/isin_mapped.yml +57 -0
- data/spec/fixtures/iex/ref-data/symbols.yml +9002 -0
- data/spec/fixtures/iex/ref-data/wrong_isin_mapped.yml +57 -0
- data/spec/fixtures/iex/stock_market/list_mostactive.yml +76 -0
- data/spec/iex/client_spec.rb +97 -14
- data/spec/iex/config/client_spec.rb +49 -0
- data/spec/iex/config/logger_spec.rb +46 -0
- data/spec/iex/endpoints/advanced_stats_spec.rb +54 -0
- data/spec/iex/endpoints/chart_spec.rb +7 -7
- data/spec/iex/endpoints/company_spec.rb +1 -0
- data/spec/iex/endpoints/income_spec.rb +68 -0
- data/spec/iex/endpoints/key_stats_spec.rb +2 -1
- data/spec/iex/endpoints/quote_spec.rb +2 -0
- data/spec/iex/endpoints/ref_data_spec.rb +76 -0
- data/spec/iex/endpoints/stock_market_spec.rb +14 -0
- data/spec/spec_helper.rb +3 -2
- data/spec/support/vcr.rb +3 -0
- metadata +56 -16
- data/lib/iex/api/config.rb +0 -45
- data/spec/iex/config_spec.rb +0 -22
@@ -0,0 +1,52 @@
|
|
1
|
+
module IEX
|
2
|
+
module Api
|
3
|
+
module Config
|
4
|
+
module Client
|
5
|
+
ATTRIBUTES = %i[
|
6
|
+
ca_file
|
7
|
+
ca_path
|
8
|
+
endpoint
|
9
|
+
open_timeout
|
10
|
+
proxy
|
11
|
+
publishable_token
|
12
|
+
referer
|
13
|
+
secret_token
|
14
|
+
timeout
|
15
|
+
user_agent
|
16
|
+
].freeze
|
17
|
+
|
18
|
+
class << self
|
19
|
+
include Config::Logger::Accessor
|
20
|
+
|
21
|
+
attr_accessor(*ATTRIBUTES)
|
22
|
+
|
23
|
+
def reset!
|
24
|
+
self.ca_file = defined?(OpenSSL) ? OpenSSL::X509::DEFAULT_CERT_FILE : nil
|
25
|
+
self.ca_path = defined?(OpenSSL) ? OpenSSL::X509::DEFAULT_CERT_DIR : nil
|
26
|
+
self.endpoint = 'https://cloud.iexapis.com/v1'
|
27
|
+
self.publishable_token = ENV['IEX_API_PUBLISHABLE_TOKEN']
|
28
|
+
self.secret_token = ENV['IEX_API_SECRET_TOKEN']
|
29
|
+
self.user_agent = "IEX Ruby Client/#{IEX::VERSION}"
|
30
|
+
|
31
|
+
self.open_timeout = nil
|
32
|
+
self.proxy = nil
|
33
|
+
self.referer = nil
|
34
|
+
self.timeout = nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
module Accessor
|
39
|
+
def configure
|
40
|
+
block_given? ? yield(Config::Client) : Config::Client
|
41
|
+
end
|
42
|
+
|
43
|
+
def config
|
44
|
+
Config::Client
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
IEX::Api::Config::Client.reset!
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module IEX
|
2
|
+
module Api
|
3
|
+
module Config
|
4
|
+
module Logger
|
5
|
+
ATTRIBUTES = %i[
|
6
|
+
instance
|
7
|
+
options
|
8
|
+
proc
|
9
|
+
].freeze
|
10
|
+
|
11
|
+
class << self
|
12
|
+
attr_accessor(*ATTRIBUTES)
|
13
|
+
|
14
|
+
def reset!
|
15
|
+
self.instance = nil
|
16
|
+
self.options = {}
|
17
|
+
self.proc = nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
module Accessor
|
22
|
+
def logger
|
23
|
+
block_given? ? yield(Config::Logger) : Config::Logger
|
24
|
+
end
|
25
|
+
|
26
|
+
def logger=(instance)
|
27
|
+
logger.instance = instance
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
IEX::Api::Config::Logger.reset!
|
data/lib/iex/cloud/connection.rb
CHANGED
@@ -8,28 +8,31 @@ module IEX
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def connection
|
11
|
-
|
11
|
+
@connection ||= begin
|
12
|
+
options = {}
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
options[:headers] = {}
|
15
|
+
options[:headers]['Accept'] = 'application/json; charset=utf-8'
|
16
|
+
options[:headers]['Content-Type'] = 'application/json; charset=utf-8'
|
17
|
+
options[:headers]['User-Agent'] = user_agent if user_agent
|
18
|
+
options[:headers]['Referer'] = referer if referer
|
19
|
+
options[:proxy] = proxy if proxy
|
20
|
+
options[:ssl] = { ca_path: ca_path, ca_file: ca_file } if ca_path || ca_file
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
request_options = {}
|
23
|
+
request_options[:timeout] = timeout if timeout
|
24
|
+
request_options[:open_timeout] = open_timeout if open_timeout
|
25
|
+
request_options[:params_encoder] = Faraday::FlatParamsEncoder
|
26
|
+
options[:request] = request_options if request_options.any?
|
25
27
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
::Faraday::Connection.new(endpoint, options) do |connection|
|
29
|
+
connection.use ::Faraday::Request::Multipart
|
30
|
+
connection.use ::Faraday::Request::UrlEncoded
|
31
|
+
connection.use ::IEX::Cloud::Response::RaiseError
|
32
|
+
connection.use ::FaradayMiddleware::ParseJson, content_type: /\bjson$/
|
33
|
+
connection.response(:logger, logger.instance, logger.options, &logger.proc) if logger.instance
|
34
|
+
connection.adapter ::Faraday.default_adapter
|
35
|
+
end
|
33
36
|
end
|
34
37
|
end
|
35
38
|
end
|
data/lib/iex/cloud/request.rb
CHANGED
@@ -27,7 +27,7 @@ module IEX
|
|
27
27
|
request.url(path, options)
|
28
28
|
when :post, :put
|
29
29
|
request.path = path
|
30
|
-
request.body = options unless options.empty?
|
30
|
+
request.body = options.to_json unless options.empty?
|
31
31
|
end
|
32
32
|
request.options.merge!(options.delete(:request)) if options.key?(:request)
|
33
33
|
end
|
data/lib/iex/cloud/response.rb
CHANGED
@@ -5,7 +5,7 @@ module IEX
|
|
5
5
|
def on_complete(env)
|
6
6
|
case env[:status]
|
7
7
|
when 404
|
8
|
-
raise Faraday::
|
8
|
+
raise Faraday::ResourceNotFound, response_values(env)
|
9
9
|
when 403
|
10
10
|
raise IEX::Errors::PermissionDeniedError, response_values(env)
|
11
11
|
when ClientErrorStatuses
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module IEX
|
2
|
+
module Endpoints
|
3
|
+
module AdvancedStats
|
4
|
+
def advanced_stats(symbol, options = {})
|
5
|
+
IEX::Resources::AdvancedStats.new(get("stock/#{symbol}/advanced-stats", { token: publishable_token }.merge(options)))
|
6
|
+
rescue Faraday::ResourceNotFound => e
|
7
|
+
raise IEX::Errors::SymbolNotFoundError.new(symbol, e.response[:body])
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/iex/endpoints/chart.rb
CHANGED
@@ -10,14 +10,13 @@ module IEX
|
|
10
10
|
].compact.join('/')
|
11
11
|
|
12
12
|
params = {}
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
13
|
+
|
14
|
+
options&.each_pair do |k, v|
|
15
|
+
k = k.to_s.split('_').map(&:capitalize).join.sub(/^[A-Z]/, &:downcase)
|
16
|
+
params[k.to_sym] = v
|
18
17
|
end
|
19
18
|
|
20
|
-
response = get(url, params)
|
19
|
+
response = get(url, { token: publishable_token }.merge(params))
|
21
20
|
|
22
21
|
if range && range.to_s == 'dynamic'
|
23
22
|
range = response['range']
|
@@ -2,7 +2,7 @@ module IEX
|
|
2
2
|
module Endpoints
|
3
3
|
module Company
|
4
4
|
def company(symbol, options = {})
|
5
|
-
IEX::Resources::Company.new(get("stock/#{symbol}/company", options))
|
5
|
+
IEX::Resources::Company.new(get("stock/#{symbol}/company", { token: publishable_token }.merge(options)))
|
6
6
|
rescue Faraday::ResourceNotFound => e
|
7
7
|
raise IEX::Errors::SymbolNotFoundError.new(symbol, e.response[:body])
|
8
8
|
end
|
data/lib/iex/endpoints/crypto.rb
CHANGED
@@ -2,7 +2,7 @@ module IEX
|
|
2
2
|
module Endpoints
|
3
3
|
module Crypto
|
4
4
|
def crypto(symbol, options = {})
|
5
|
-
IEX::Resources::Crypto.new(get("crypto/#{symbol}/quote", options))
|
5
|
+
IEX::Resources::Crypto.new(get("crypto/#{symbol}/quote", { token: publishable_token }.merge(options)))
|
6
6
|
rescue Faraday::ResourceNotFound => e
|
7
7
|
raise IEX::Errors::SymbolNotFoundError.new(symbol, e.response[:body])
|
8
8
|
end
|
@@ -2,7 +2,7 @@ module IEX
|
|
2
2
|
module Endpoints
|
3
3
|
module Earnings
|
4
4
|
def earnings(symbol, options = {})
|
5
|
-
get("stock/#{symbol}/earnings", options)['earnings'].map do |data|
|
5
|
+
get("stock/#{symbol}/earnings", { token: publishable_token }.merge(options))['earnings'].map do |data|
|
6
6
|
IEX::Resources::Earnings.new(data)
|
7
7
|
end
|
8
8
|
rescue Faraday::ResourceNotFound => e
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module IEX
|
2
|
+
module Endpoints
|
3
|
+
module Income
|
4
|
+
def income(symbol, options = {})
|
5
|
+
(get("stock/#{symbol}/income", { token: publishable_token }.merge(options))['income'] || []).map do |data|
|
6
|
+
IEX::Resources::Income.new(data)
|
7
|
+
end
|
8
|
+
rescue Faraday::ResourceNotFound => e
|
9
|
+
raise IEX::Errors::SymbolNotFoundError.new(symbol, e.response[:body])
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -2,7 +2,7 @@ module IEX
|
|
2
2
|
module Endpoints
|
3
3
|
module KeyStats
|
4
4
|
def key_stats(symbol, options = {})
|
5
|
-
IEX::Resources::KeyStats.new(get("stock/#{symbol}/stats", options))
|
5
|
+
IEX::Resources::KeyStats.new(get("stock/#{symbol}/stats", { token: publishable_token }.merge(options)))
|
6
6
|
rescue Faraday::ResourceNotFound => e
|
7
7
|
raise IEX::Errors::SymbolNotFoundError.new(symbol, e.response[:body])
|
8
8
|
end
|
@@ -2,7 +2,7 @@ module IEX
|
|
2
2
|
module Endpoints
|
3
3
|
module LargestTrades
|
4
4
|
def largest_trades(symbol, options = {})
|
5
|
-
get("stock/#{symbol}/largest-trades", options).map do |data|
|
5
|
+
get("stock/#{symbol}/largest-trades", { token: publishable_token }.merge(options)).map do |data|
|
6
6
|
IEX::Resources::LargestTrades.new(data)
|
7
7
|
end
|
8
8
|
rescue Faraday::ResourceNotFound => e
|
data/lib/iex/endpoints/logo.rb
CHANGED
@@ -2,7 +2,7 @@ module IEX
|
|
2
2
|
module Endpoints
|
3
3
|
module Logo
|
4
4
|
def logo(symbol, options = {})
|
5
|
-
IEX::Resources::Logo.new(get("stock/#{symbol.downcase}/logo", options))
|
5
|
+
IEX::Resources::Logo.new(get("stock/#{symbol.downcase}/logo", { token: publishable_token }.merge(options)))
|
6
6
|
rescue Faraday::ResourceNotFound => e
|
7
7
|
raise IEX::Errors::SymbolNotFoundError.new(symbol, e.response[:body])
|
8
8
|
end
|
data/lib/iex/endpoints/news.rb
CHANGED
@@ -8,7 +8,7 @@ module IEX
|
|
8
8
|
'news',
|
9
9
|
range ? 'last' : nil,
|
10
10
|
range
|
11
|
-
].compact.join('/'), options).map do |data|
|
11
|
+
].compact.join('/'), { token: publishable_token }.merge(options)).map do |data|
|
12
12
|
IEX::Resources::News.new(data)
|
13
13
|
end
|
14
14
|
rescue Faraday::ResourceNotFound => e
|
data/lib/iex/endpoints/ohlc.rb
CHANGED
@@ -2,13 +2,13 @@ module IEX
|
|
2
2
|
module Endpoints
|
3
3
|
module Ohlc
|
4
4
|
def ohlc(symbol, options = {})
|
5
|
-
IEX::Resources::OHLC.new(get("stock/#{symbol}/ohlc", options))
|
5
|
+
IEX::Resources::OHLC.new(get("stock/#{symbol}/ohlc", { token: publishable_token }.merge(options)))
|
6
6
|
rescue Faraday::ResourceNotFound => e
|
7
7
|
raise IEX::Errors::SymbolNotFoundError.new(symbol, e.response[:body])
|
8
8
|
end
|
9
9
|
|
10
10
|
def market(options = {})
|
11
|
-
Hash[get('stock/market/ohlc', options).map do |k, v|
|
11
|
+
Hash[get('stock/market/ohlc', { token: publishable_token }.merge(options)).map do |k, v|
|
12
12
|
[k, IEX::Resources::OHLC.new(v)]
|
13
13
|
end]
|
14
14
|
end
|
data/lib/iex/endpoints/price.rb
CHANGED
@@ -2,7 +2,7 @@ module IEX
|
|
2
2
|
module Endpoints
|
3
3
|
module Price
|
4
4
|
def price(symbol, options = {})
|
5
|
-
get("stock/#{symbol}/price", options)
|
5
|
+
get("stock/#{symbol}/price", { token: publishable_token }.merge(options))
|
6
6
|
rescue Faraday::ResourceNotFound => e
|
7
7
|
raise IEX::Errors::SymbolNotFoundError.new(symbol, e.response[:body])
|
8
8
|
end
|
data/lib/iex/endpoints/quote.rb
CHANGED
@@ -2,7 +2,7 @@ module IEX
|
|
2
2
|
module Endpoints
|
3
3
|
module Quote
|
4
4
|
def quote(symbol, options = {})
|
5
|
-
IEX::Resources::Quote.new(get("stock/#{symbol}/quote", options))
|
5
|
+
IEX::Resources::Quote.new(get("stock/#{symbol}/quote", { token: publishable_token }.merge(options)))
|
6
6
|
rescue Faraday::ResourceNotFound => e
|
7
7
|
raise IEX::Errors::SymbolNotFoundError.new(symbol, e.response[:body])
|
8
8
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module IEX
|
2
|
+
module Endpoints
|
3
|
+
module RefData
|
4
|
+
def ref_data_isin(isins, options = {})
|
5
|
+
response = get('ref-data/isin', { token: publishable_token, isin: Array(isins).join(',') }.merge(options))
|
6
|
+
|
7
|
+
if response.is_a?(Hash) # mapped option was set
|
8
|
+
response.transform_values do |rows|
|
9
|
+
rows&.map { |row| IEX::Resources::Symbol.new(row) }
|
10
|
+
end
|
11
|
+
else
|
12
|
+
response.map { |row| IEX::Resources::Symbol.new(row) }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def ref_data_symbols(options = {})
|
17
|
+
response = get('ref-data/symbols', { token: publishable_token }.merge(options))
|
18
|
+
response.map { |row| IEX::Resources::Symbols.new(row) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -6,7 +6,7 @@ module IEX
|
|
6
6
|
'stock',
|
7
7
|
symbol,
|
8
8
|
'sector-performance'
|
9
|
-
].compact.join('/'), options).map do |data|
|
9
|
+
].compact.join('/'), { token: publishable_token }.merge(options)).map do |data|
|
10
10
|
IEX::Resources::Sectors.new(data)
|
11
11
|
end
|
12
12
|
rescue Faraday::ResourceNotFound => e
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module IEX
|
2
|
+
module Endpoints
|
3
|
+
module StockMarket
|
4
|
+
def stock_market_list(list_type, options = {})
|
5
|
+
get("stock/market/list/#{list_type}", { token: publishable_token }.merge(options)).map do |data|
|
6
|
+
IEX::Resources::Quote.new(data)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/iex/resources.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
require_relative 'resources/resource'
|
2
2
|
|
3
|
+
require_relative 'resources/advanced_stats'
|
3
4
|
require_relative 'resources/chart'
|
4
5
|
require_relative 'resources/company'
|
5
6
|
require_relative 'resources/dividends'
|
6
7
|
require_relative 'resources/earnings'
|
8
|
+
require_relative 'resources/income'
|
7
9
|
require_relative 'resources/key_stats'
|
8
10
|
require_relative 'resources/largest_trades'
|
9
11
|
require_relative 'resources/logo'
|
@@ -12,3 +14,5 @@ require_relative 'resources/ohlc'
|
|
12
14
|
require_relative 'resources/quote'
|
13
15
|
require_relative 'resources/sectors'
|
14
16
|
require_relative 'resources/crypto'
|
17
|
+
require_relative 'resources/symbol'
|
18
|
+
require_relative 'resources/symbols'
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module IEX
|
2
|
+
module Resources
|
3
|
+
class AdvancedStats < Resource
|
4
|
+
property 'total_cash', from: 'totalCash'
|
5
|
+
property 'total_cash_dollars', from: 'totalCash', with: ->(v) { Resource.to_dollar(amount: v) }
|
6
|
+
property 'current_debt', from: 'currentDebt'
|
7
|
+
property 'current_debt_dollars', from: 'currentDebt', with: ->(v) { Resource.to_dollar(amount: v) }
|
8
|
+
property 'revenue'
|
9
|
+
property 'revenue_dollars', from: 'revenue', with: ->(v) { Resource.to_dollar(amount: v) }
|
10
|
+
property 'gross_profit', from: 'grossProfit'
|
11
|
+
property 'gross_profit_dollar', from: 'grossProfit', with: ->(v) { Resource.to_dollar(amount: v) }
|
12
|
+
property 'total_revenue', from: 'totalRevenue'
|
13
|
+
property 'total_revenue_dollar', from: 'totalRevenue', with: ->(v) { Resource.to_dollar(amount: v) }
|
14
|
+
property 'ebitda', from: 'EBITDA'
|
15
|
+
property 'ebitda_dollar', from: 'EBITDA', with: ->(v) { Resource.to_dollar(amount: v) }
|
16
|
+
property 'revenue_per_share', from: 'revenuePerShare'
|
17
|
+
property 'revenue_per_share_dollars', from: 'revenuePerShare', with: ->(v) { Resource.to_dollar(amount: v) }
|
18
|
+
property 'revenue_per_employee', from: 'revenuePerEmployee'
|
19
|
+
property 'revenue_per_employee_dollar', from: 'revenuePerEmployee', with: ->(v) { Resource.to_dollar(amount: v) }
|
20
|
+
property 'debt_to_equity', from: 'debtToEquity'
|
21
|
+
property 'profit_margin', from: 'profitMargin'
|
22
|
+
property 'enterprise_value', from: 'enterpriseValue'
|
23
|
+
property 'enterprise_value_dollar', from: 'enterpriseValue', with: ->(v) { Resource.to_dollar(amount: v) }
|
24
|
+
property 'enterprise_value_to_revenue', from: 'enterpriseValueToRevenue'
|
25
|
+
property 'price_to_sales', from: 'priceToSales'
|
26
|
+
property 'price_to_sales_dollar', from: 'priceToSales', with: ->(v) { Resource.to_dollar(amount: v) }
|
27
|
+
property 'price_to_book', from: 'priceToBook'
|
28
|
+
property 'forward_pe_ratio', from: 'forwardPERatio'
|
29
|
+
property 'pe_high', from: 'peHigh'
|
30
|
+
property 'pe_low', from: 'peLow'
|
31
|
+
property 'avg_30_volume', from: 'avg30Volume'
|
32
|
+
property 'peg_ratio', from: 'pegRatio'
|
33
|
+
property 'week_52_high_date', from: 'week52highDate'
|
34
|
+
property 'week_52_low_date', from: 'week52lowDate'
|
35
|
+
property 'beta'
|
36
|
+
|
37
|
+
def initialize(data = {})
|
38
|
+
super
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/iex/resources/chart.rb
CHANGED
@@ -5,40 +5,35 @@ module IEX
|
|
5
5
|
property 'high'
|
6
6
|
property 'low'
|
7
7
|
property 'volume'
|
8
|
+
property 'open'
|
9
|
+
property 'close'
|
8
10
|
property 'label'
|
9
|
-
property 'change_over_time', from: 'changeOverTime'
|
10
11
|
property 'date', transform_with: ->(v) { Date.parse(v) }
|
11
12
|
end
|
12
13
|
|
13
14
|
class Default < Base
|
14
|
-
property '
|
15
|
-
property '
|
16
|
-
property '
|
15
|
+
property 'u_high', from: 'uHigh'
|
16
|
+
property 'u_low', from: 'uLow'
|
17
|
+
property 'u_volume', from: 'uVolume'
|
18
|
+
property 'u_open', from: 'uOpen'
|
19
|
+
property 'u_close', from: 'uClose'
|
17
20
|
property 'change'
|
18
21
|
property 'change_percent', from: 'changePercent'
|
19
22
|
property 'change_percent_s', from: 'changePercent', with: lambda { |v|
|
20
23
|
[
|
21
|
-
v
|
24
|
+
v.positive? ? '+' : '',
|
22
25
|
format('%.2f', v),
|
23
26
|
'%'
|
24
27
|
].join
|
25
28
|
} # change in percent as a String with a leading + or - sign
|
26
|
-
property '
|
29
|
+
property 'change_over_time', from: 'changeOverTime'
|
27
30
|
end
|
28
31
|
|
29
32
|
class OneDay < Base
|
30
33
|
property 'minute'
|
31
|
-
property 'market_average', from: 'marketAverage'
|
32
|
-
property 'market_notional', from: 'marketNotional'
|
33
|
-
property 'market_number_of_trades', from: 'marketNumberOfTrades'
|
34
|
-
property 'market_high', from: 'marketHigh'
|
35
|
-
property 'market_low', from: 'marketLow'
|
36
|
-
property 'market_volume', from: 'marketVolume'
|
37
|
-
property 'market_change_over_time', from: 'marketChangeOverTime'
|
38
34
|
property 'average'
|
39
35
|
property 'notional'
|
40
36
|
property 'number_of_trades', from: 'numberOfTrades'
|
41
|
-
property 'simplify_factor', from: 'simplifyFactor'
|
42
37
|
end
|
43
38
|
end
|
44
39
|
end
|