iex-ruby-client 1.0.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +5 -5
  2. data/.env.sample +2 -0
  3. data/.github/FUNDING.yml +1 -0
  4. data/.rubocop.yml +4 -1
  5. data/.rubocop_todo.yml +0 -8
  6. data/CHANGELOG.md +43 -9
  7. data/Dangerfile +2 -2
  8. data/Gemfile +3 -2
  9. data/README.md +134 -10
  10. data/iex-ruby-client.gemspec +3 -2
  11. data/lib/iex/api.rb +6 -1
  12. data/lib/iex/api/client.rb +13 -2
  13. data/lib/iex/api/config/client.rb +52 -0
  14. data/lib/iex/api/config/logger.rb +35 -0
  15. data/lib/iex/cloud/connection.rb +22 -19
  16. data/lib/iex/cloud/request.rb +1 -1
  17. data/lib/iex/cloud/response.rb +1 -1
  18. data/lib/iex/endpoints/advanced_stats.rb +11 -0
  19. data/lib/iex/endpoints/chart.rb +5 -6
  20. data/lib/iex/endpoints/company.rb +1 -1
  21. data/lib/iex/endpoints/crypto.rb +1 -1
  22. data/lib/iex/endpoints/dividends.rb +1 -1
  23. data/lib/iex/endpoints/earnings.rb +1 -1
  24. data/lib/iex/endpoints/income.rb +13 -0
  25. data/lib/iex/endpoints/key_stats.rb +1 -1
  26. data/lib/iex/endpoints/largest_trades.rb +1 -1
  27. data/lib/iex/endpoints/logo.rb +1 -1
  28. data/lib/iex/endpoints/news.rb +1 -1
  29. data/lib/iex/endpoints/ohlc.rb +2 -2
  30. data/lib/iex/endpoints/price.rb +1 -1
  31. data/lib/iex/endpoints/quote.rb +1 -1
  32. data/lib/iex/endpoints/ref_data.rb +22 -0
  33. data/lib/iex/endpoints/sectors.rb +1 -1
  34. data/lib/iex/endpoints/stock_market.rb +11 -0
  35. data/lib/iex/resources.rb +4 -0
  36. data/lib/iex/resources/advanced_stats.rb +42 -0
  37. data/lib/iex/resources/chart.rb +9 -14
  38. data/lib/iex/resources/company.rb +1 -0
  39. data/lib/iex/resources/income.rb +36 -0
  40. data/lib/iex/resources/key_stats.rb +2 -2
  41. data/lib/iex/resources/quote.rb +15 -5
  42. data/lib/iex/resources/resource.rb +1 -1
  43. data/lib/iex/resources/symbol.rb +10 -0
  44. data/lib/iex/resources/symbols.rb +19 -0
  45. data/lib/iex/version.rb +1 -1
  46. data/spec/fixtures/iex/advanced_stats/invalid.yml +50 -0
  47. data/spec/fixtures/iex/advanced_stats/msft.yml +57 -0
  48. data/spec/fixtures/iex/chart/1d.yml +440 -473
  49. data/spec/fixtures/iex/chart/20190306.yml +440 -473
  50. data/spec/fixtures/iex/chart/bad_option.yml +47 -81
  51. data/spec/fixtures/iex/chart/chartInterval.yml +89 -122
  52. data/spec/fixtures/iex/chart/dynamic/1m.yml +73 -107
  53. data/spec/fixtures/iex/chart/invalid.yml +47 -81
  54. data/spec/fixtures/iex/chart/msft.yml +74 -107
  55. data/spec/fixtures/iex/income/invalid.yml +49 -0
  56. data/spec/fixtures/iex/income/msft.yml +53 -0
  57. data/spec/fixtures/iex/income/nsrgy.yml +55 -0
  58. data/spec/fixtures/iex/ref-data/isin.yml +57 -0
  59. data/spec/fixtures/iex/ref-data/isin_mapped.yml +57 -0
  60. data/spec/fixtures/iex/ref-data/symbols.yml +9002 -0
  61. data/spec/fixtures/iex/ref-data/wrong_isin_mapped.yml +57 -0
  62. data/spec/fixtures/iex/stock_market/list_mostactive.yml +76 -0
  63. data/spec/iex/client_spec.rb +97 -14
  64. data/spec/iex/config/client_spec.rb +49 -0
  65. data/spec/iex/config/logger_spec.rb +46 -0
  66. data/spec/iex/endpoints/advanced_stats_spec.rb +54 -0
  67. data/spec/iex/endpoints/chart_spec.rb +7 -7
  68. data/spec/iex/endpoints/company_spec.rb +1 -0
  69. data/spec/iex/endpoints/income_spec.rb +68 -0
  70. data/spec/iex/endpoints/key_stats_spec.rb +2 -1
  71. data/spec/iex/endpoints/quote_spec.rb +2 -0
  72. data/spec/iex/endpoints/ref_data_spec.rb +76 -0
  73. data/spec/iex/endpoints/stock_market_spec.rb +14 -0
  74. data/spec/spec_helper.rb +3 -2
  75. data/spec/support/vcr.rb +3 -0
  76. metadata +56 -16
  77. data/lib/iex/api/config.rb +0 -45
  78. 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!
@@ -8,28 +8,31 @@ module IEX
8
8
  end
9
9
 
10
10
  def connection
11
- options = {}
11
+ @connection ||= begin
12
+ options = {}
12
13
 
13
- options[:headers] = {}
14
- options[:headers]['Accept'] = 'application/json; charset=utf-8'
15
- options[:headers]['User-Agent'] = user_agent if user_agent
16
- options[:proxy] = proxy if proxy
17
- options[:ssl] = { ca_path: ca_path, ca_file: ca_file } if ca_path || ca_file
18
- options[:params] = { token: publishable_token } if publishable_token
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
- request_options = {}
21
- request_options[:timeout] = timeout if timeout
22
- request_options[:open_timeout] = open_timeout if open_timeout
23
- request_options[:params_encoder] = Faraday::FlatParamsEncoder
24
- options[:request] = request_options if request_options.any?
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
- ::Faraday::Connection.new(endpoint, options) do |connection|
27
- connection.use ::Faraday::Request::Multipart
28
- connection.use ::Faraday::Request::UrlEncoded
29
- connection.use ::IEX::Cloud::Response::RaiseError
30
- connection.use ::FaradayMiddleware::ParseJson, content_type: /\bjson$/
31
- connection.response :logger, logger if logger
32
- connection.adapter ::Faraday.default_adapter
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
@@ -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
@@ -5,7 +5,7 @@ module IEX
5
5
  def on_complete(env)
6
6
  case env[:status]
7
7
  when 404
8
- raise Faraday::Error::ResourceNotFound, response_values(env)
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
@@ -10,14 +10,13 @@ module IEX
10
10
  ].compact.join('/')
11
11
 
12
12
  params = {}
13
- if options
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
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
@@ -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
@@ -7,7 +7,7 @@ module IEX
7
7
  symbol,
8
8
  'dividends',
9
9
  range
10
- ].compact.join('/'), options).map do |data|
10
+ ].compact.join('/'), { token: publishable_token }.merge(options)).map do |data|
11
11
  IEX::Resources::Dividends.new(data)
12
12
  end
13
13
  rescue Faraday::ResourceNotFound => e
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 'open'
15
- property 'close'
16
- property 'unadjusted_volume', from: 'unadjustedVolume'
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 > 0 ? '+' : '',
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 'vwap'
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