iex-ruby-client 1.0.0 → 1.2.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/.github/FUNDING.yml +1 -0
- data/.rubocop.yml +4 -1
- data/CHANGELOG.md +37 -7
- data/Dangerfile +2 -2
- data/Gemfile +2 -2
- data/README.md +159 -37
- data/iex-ruby-client.gemspec +3 -2
- data/lib/iex-ruby-client.rb +1 -0
- data/lib/iex/api.rb +3 -0
- data/lib/iex/api/client.rb +3 -0
- data/lib/iex/api/config.rb +2 -0
- data/lib/iex/cloud/connection.rb +21 -19
- data/lib/iex/cloud/request.rb +1 -1
- data/lib/iex/cloud/response.rb +1 -1
- 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 +3 -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 +14 -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/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/key_stats/invalid.yml +7 -41
- data/spec/fixtures/iex/key_stats/msft.yml +11 -43
- 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 +6 -1
- 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 +42 -29
- data/spec/iex/endpoints/quote_spec.rb +2 -0
- data/spec/iex/endpoints/ref_data_spec.rb +66 -0
- data/spec/iex/endpoints/stock_market_spec.rb +14 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/support/vcr.rb +3 -0
- metadata +41 -13
| @@ -0,0 +1,57 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            http_interactions:
         | 
| 3 | 
            +
            - request:
         | 
| 4 | 
            +
                method: get
         | 
| 5 | 
            +
                uri: https://cloud.iexapis.com/v1/ref-data/isin?isin=WRONG12345&mapped=true&token=test-iex-api-publishable-token
         | 
| 6 | 
            +
                body:
         | 
| 7 | 
            +
                  encoding: US-ASCII
         | 
| 8 | 
            +
                  string: ''
         | 
| 9 | 
            +
                headers:
         | 
| 10 | 
            +
                  Accept:
         | 
| 11 | 
            +
                  - application/json; charset=utf-8
         | 
| 12 | 
            +
                  Content-Type:
         | 
| 13 | 
            +
                  - application/json; charset=utf-8
         | 
| 14 | 
            +
                  User-Agent:
         | 
| 15 | 
            +
                  - IEX Ruby Client/1.1.3
         | 
| 16 | 
            +
                  Accept-Encoding:
         | 
| 17 | 
            +
                  - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
         | 
| 18 | 
            +
              response:
         | 
| 19 | 
            +
                status:
         | 
| 20 | 
            +
                  code: 200
         | 
| 21 | 
            +
                  message: OK
         | 
| 22 | 
            +
                headers:
         | 
| 23 | 
            +
                  Server:
         | 
| 24 | 
            +
                  - nginx
         | 
| 25 | 
            +
                  Date:
         | 
| 26 | 
            +
                  - Fri, 10 Apr 2020 15:17:34 GMT
         | 
| 27 | 
            +
                  Content-Type:
         | 
| 28 | 
            +
                  - application/json; charset=utf-8
         | 
| 29 | 
            +
                  Content-Length:
         | 
| 30 | 
            +
                  - '19'
         | 
| 31 | 
            +
                  Connection:
         | 
| 32 | 
            +
                  - keep-alive
         | 
| 33 | 
            +
                  Set-Cookie:
         | 
| 34 | 
            +
                  - ctoken=84910330e5ea4058969d0af364c32947; Max-Age=43200; Path=/; Expires=Sat,
         | 
| 35 | 
            +
                    11 Apr 2020 03:17:34 GMT
         | 
| 36 | 
            +
                  Iexcloud-Messages-Used:
         | 
| 37 | 
            +
                  - '100'
         | 
| 38 | 
            +
                  Iexcloud-Premium-Messages-Used:
         | 
| 39 | 
            +
                  - '0'
         | 
| 40 | 
            +
                  X-Content-Type-Options:
         | 
| 41 | 
            +
                  - nosniff
         | 
| 42 | 
            +
                  Strict-Transport-Security:
         | 
| 43 | 
            +
                  - max-age=15768000
         | 
| 44 | 
            +
                  Access-Control-Allow-Origin:
         | 
| 45 | 
            +
                  - "*"
         | 
| 46 | 
            +
                  Access-Control-Allow-Credentials:
         | 
| 47 | 
            +
                  - 'true'
         | 
| 48 | 
            +
                  Access-Control-Allow-Methods:
         | 
| 49 | 
            +
                  - GET, OPTIONS
         | 
| 50 | 
            +
                  Access-Control-Allow-Headers:
         | 
| 51 | 
            +
                  - Origin, X-Requested-With, Content-Type, Accept
         | 
| 52 | 
            +
                body:
         | 
| 53 | 
            +
                  encoding: UTF-8
         | 
| 54 | 
            +
                  string: '{"WRONG12345":null}'
         | 
| 55 | 
            +
                http_version: null
         | 
| 56 | 
            +
              recorded_at: Fri, 10 Apr 2020 15:17:34 GMT
         | 
| 57 | 
            +
            recorded_with: VCR 5.1.0
         | 
| @@ -0,0 +1,76 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            http_interactions:
         | 
| 3 | 
            +
            - request:
         | 
| 4 | 
            +
                method: get
         | 
| 5 | 
            +
                uri: https://cloud.iexapis.com/v1/stock/market/list/mostactive?token=test-iex-api-publishable-token
         | 
| 6 | 
            +
                body:
         | 
| 7 | 
            +
                  encoding: US-ASCII
         | 
| 8 | 
            +
                  string: ''
         | 
| 9 | 
            +
                headers:
         | 
| 10 | 
            +
                  Accept:
         | 
| 11 | 
            +
                  - application/json; charset=utf-8
         | 
| 12 | 
            +
                  Content-Type:
         | 
| 13 | 
            +
                  - application/json; charset=utf-8
         | 
| 14 | 
            +
                  User-Agent:
         | 
| 15 | 
            +
                  - IEX Ruby Client/1.1.2
         | 
| 16 | 
            +
                  Accept-Encoding:
         | 
| 17 | 
            +
                  - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
         | 
| 18 | 
            +
              response:
         | 
| 19 | 
            +
                status:
         | 
| 20 | 
            +
                  code: 200
         | 
| 21 | 
            +
                  message: OK
         | 
| 22 | 
            +
                headers:
         | 
| 23 | 
            +
                  Server:
         | 
| 24 | 
            +
                  - nginx
         | 
| 25 | 
            +
                  Date:
         | 
| 26 | 
            +
                  - Wed, 04 Mar 2020 13:00:24 GMT
         | 
| 27 | 
            +
                  Content-Type:
         | 
| 28 | 
            +
                  - application/json; charset=utf-8
         | 
| 29 | 
            +
                  Transfer-Encoding:
         | 
| 30 | 
            +
                  - chunked
         | 
| 31 | 
            +
                  Connection:
         | 
| 32 | 
            +
                  - keep-alive
         | 
| 33 | 
            +
                  Set-Cookie:
         | 
| 34 | 
            +
                  - ctoken=82c15565434a4dada8483b258390943b; Max-Age=43200; Path=/; Expires=Thu,
         | 
| 35 | 
            +
                    05 Mar 2020 01:00:24 GMT
         | 
| 36 | 
            +
                  Iexcloud-Messages-Used:
         | 
| 37 | 
            +
                  - '20'
         | 
| 38 | 
            +
                  Iexcloud-Premium-Messages-Used:
         | 
| 39 | 
            +
                  - '0'
         | 
| 40 | 
            +
                  X-Content-Type-Options:
         | 
| 41 | 
            +
                  - nosniff
         | 
| 42 | 
            +
                  Strict-Transport-Security:
         | 
| 43 | 
            +
                  - max-age=15768000
         | 
| 44 | 
            +
                  Access-Control-Allow-Origin:
         | 
| 45 | 
            +
                  - "*"
         | 
| 46 | 
            +
                  Access-Control-Allow-Credentials:
         | 
| 47 | 
            +
                  - 'true'
         | 
| 48 | 
            +
                  Access-Control-Allow-Methods:
         | 
| 49 | 
            +
                  - GET, OPTIONS
         | 
| 50 | 
            +
                  Access-Control-Allow-Headers:
         | 
| 51 | 
            +
                  - Origin, X-Requested-With, Content-Type, Accept
         | 
| 52 | 
            +
                body:
         | 
| 53 | 
            +
                  encoding: ASCII-8BIT
         | 
| 54 | 
            +
                  string: '[{"symbol":"AMD","companyName":"Advanced Micro Devices, Inc.","primaryExchange":"NASDAQ","calculationPrice":"close","open":null,"openTime":null,"close":null,"closeTime":null,"high":null,"low":null,"latestPrice":46.75,"latestSource":"Close","latestTime":"March
         | 
| 55 | 
            +
                    3, 2020","latestUpdate":1583269200736,"latestVolume":null,"iexRealtimePrice":0,"iexRealtimeSize":0,"iexLastUpdated":0,"delayedPrice":null,"delayedPriceTime":null,"oddLotDelayedPrice":null,"oddLotDelayedPriceTime":null,"extendedPrice":null,"extendedChange":null,"extendedChangePercent":null,"extendedPriceTime":null,"previousClose":47.46,"previousVolume":102324726,"change":-0.71,"changePercent":-0.01496,"volume":null,"iexMarketPercent":null,"iexVolume":0,"avgTotalVolume":69781992,"iexBidPrice":0,"iexBidSize":0,"iexAskPrice":0,"iexAskSize":0,"marketCap":54681605000,"peRatio":152.73,"week52High":59.27,"week52Low":21.04,"ytdChange":-0.062822,"lastTradeTime":1583269200603,"isUSMarketOpen":false},{"symbol":"BAC","companyName":"Bank
         | 
| 56 | 
            +
                    of America Corp.","primaryExchange":"New York Stock Exchange","calculationPrice":"close","open":null,"openTime":null,"close":null,"closeTime":null,"high":null,"low":null,"latestPrice":27.75,"latestSource":"Close","latestTime":"March
         | 
| 57 | 
            +
                    3, 2020","latestUpdate":1583269208334,"latestVolume":null,"iexRealtimePrice":0,"iexRealtimeSize":0,"iexLastUpdated":0,"delayedPrice":null,"delayedPriceTime":null,"oddLotDelayedPrice":null,"oddLotDelayedPriceTime":null,"extendedPrice":null,"extendedChange":null,"extendedChangePercent":null,"extendedPriceTime":null,"previousClose":29.37,"previousVolume":147776301,"change":-1.62,"changePercent":-0.05516,"volume":null,"iexMarketPercent":null,"iexVolume":0,"avgTotalVolume":59385616,"iexBidPrice":0,"iexBidSize":0,"iexAskPrice":0,"iexAskSize":0,"marketCap":242216707500,"peRatio":10.03,"week52High":35.72,"week52Low":26.21,"ytdChange":-0.27654,"lastTradeTime":1583269208300,"isUSMarketOpen":false},{"symbol":"INO","companyName":"Inovio
         | 
| 58 | 
            +
                    Pharmaceuticals, Inc.","primaryExchange":"NASDAQ","calculationPrice":"close","open":null,"openTime":null,"close":null,"closeTime":null,"high":null,"low":null,"latestPrice":7.45,"latestSource":"Close","latestTime":"March
         | 
| 59 | 
            +
                    3, 2020","latestUpdate":1583269200743,"latestVolume":null,"iexRealtimePrice":0,"iexRealtimeSize":0,"iexLastUpdated":0,"delayedPrice":null,"delayedPriceTime":null,"oddLotDelayedPrice":null,"oddLotDelayedPriceTime":null,"extendedPrice":null,"extendedChange":null,"extendedChangePercent":null,"extendedPriceTime":null,"previousClose":4.39,"previousVolume":16179954,"change":3.06,"changePercent":0.69704,"volume":null,"iexMarketPercent":null,"iexVolume":0,"avgTotalVolume":18795754,"iexBidPrice":0,"iexBidSize":0,"iexAskPrice":0,"iexAskSize":0,"marketCap":755139450,"peRatio":-6.32,"week52High":7.48,"week52Low":1.92,"ytdChange":2.017912,"lastTradeTime":1583269200378,"isUSMarketOpen":false},{"symbol":"GE","companyName":"General
         | 
| 60 | 
            +
                    Electric Co.","primaryExchange":"New York Stock Exchange","calculationPrice":"close","open":null,"openTime":null,"close":null,"closeTime":null,"high":null,"low":null,"latestPrice":10.88,"latestSource":"Close","latestTime":"March
         | 
| 61 | 
            +
                    3, 2020","latestUpdate":1583269204858,"latestVolume":null,"iexRealtimePrice":0,"iexRealtimeSize":0,"iexLastUpdated":0,"delayedPrice":null,"delayedPriceTime":null,"oddLotDelayedPrice":null,"oddLotDelayedPriceTime":null,"extendedPrice":null,"extendedChange":null,"extendedChangePercent":null,"extendedPriceTime":null,"previousClose":11.21,"previousVolume":124802207,"change":-0.33,"changePercent":-0.02944,"volume":null,"iexMarketPercent":null,"iexVolume":0,"avgTotalVolume":71758664,"iexBidPrice":0,"iexBidSize":0,"iexAskPrice":0,"iexAskSize":0,"marketCap":95093702400,"peRatio":143.16,"week52High":13.26,"week52Low":7.65,"ytdChange":-0.117453,"lastTradeTime":1583269204815,"isUSMarketOpen":false},{"symbol":"F","companyName":"Ford
         | 
| 62 | 
            +
                    Motor Co.","primaryExchange":"New York Stock Exchange","calculationPrice":"close","open":null,"openTime":null,"close":null,"closeTime":null,"high":null,"low":null,"latestPrice":6.97,"latestSource":"Close","latestTime":"March
         | 
| 63 | 
            +
                    3, 2020","latestUpdate":1583269470045,"latestVolume":null,"iexRealtimePrice":0,"iexRealtimeSize":0,"iexLastUpdated":0,"delayedPrice":null,"delayedPriceTime":null,"oddLotDelayedPrice":null,"oddLotDelayedPriceTime":null,"extendedPrice":null,"extendedChange":null,"extendedChangePercent":null,"extendedPriceTime":null,"previousClose":7.2,"previousVolume":96766032,"change":-0.23,"changePercent":-0.03194,"volume":null,"iexMarketPercent":null,"iexVolume":0,"avgTotalVolume":79183546,"iexBidPrice":0,"iexBidSize":0,"iexAskPrice":0,"iexAskSize":0,"marketCap":27636398500,"peRatio":237.88,"week52High":10.56,"week52Low":6.67,"ytdChange":-0.29202500000000003,"lastTradeTime":1583269200123,"isUSMarketOpen":false},{"symbol":"AAPL","companyName":"Apple,
         | 
| 64 | 
            +
                    Inc.","primaryExchange":"NASDAQ","calculationPrice":"close","open":null,"openTime":null,"close":null,"closeTime":null,"high":null,"low":null,"latestPrice":289.32,"latestSource":"Close","latestTime":"March
         | 
| 65 | 
            +
                    3, 2020","latestUpdate":1583269200249,"latestVolume":null,"iexRealtimePrice":0,"iexRealtimeSize":0,"iexLastUpdated":0,"delayedPrice":null,"delayedPriceTime":null,"oddLotDelayedPrice":null,"oddLotDelayedPriceTime":null,"extendedPrice":null,"extendedChange":null,"extendedChangePercent":null,"extendedPriceTime":null,"previousClose":298.81,"previousVolume":85349339,"change":-9.49,"changePercent":-0.03176,"volume":null,"iexMarketPercent":null,"iexVolume":0,"avgTotalVolume":41771302,"iexBidPrice":0,"iexBidSize":0,"iexAskPrice":0,"iexAskSize":0,"marketCap":1265913873600,"peRatio":22.68,"week52High":327.85,"week52Low":169.5,"ytdChange":-0.06848399999999999,"lastTradeTime":1583269200389,"isUSMarketOpen":false},{"symbol":"MSFT","companyName":"Microsoft
         | 
| 66 | 
            +
                    Corp.","primaryExchange":"NASDAQ","calculationPrice":"close","open":null,"openTime":null,"close":null,"closeTime":null,"high":null,"low":null,"latestPrice":164.51,"latestSource":"Close","latestTime":"March
         | 
| 67 | 
            +
                    3, 2020","latestUpdate":1583269200720,"latestVolume":null,"iexRealtimePrice":0,"iexRealtimeSize":0,"iexLastUpdated":0,"delayedPrice":null,"delayedPriceTime":null,"oddLotDelayedPrice":null,"oddLotDelayedPriceTime":null,"extendedPrice":null,"extendedChange":null,"extendedChangePercent":null,"extendedPriceTime":null,"previousClose":172.79,"previousVolume":71030810,"change":-8.28,"changePercent":-0.04792,"volume":null,"iexMarketPercent":null,"iexVolume":0,"avgTotalVolume":43623452,"iexBidPrice":0,"iexBidSize":0,"iexAskPrice":0,"iexAskSize":0,"marketCap":1251271285500,"peRatio":28.37,"week52High":190.7,"week52Low":108.8,"ytdChange":-0.023700999999999996,"lastTradeTime":1583269200282,"isUSMarketOpen":false},{"symbol":"T","companyName":"AT&T,
         | 
| 68 | 
            +
                    Inc.","primaryExchange":"New York Stock Exchange","calculationPrice":"close","open":null,"openTime":null,"close":null,"closeTime":null,"high":null,"low":null,"latestPrice":36.3,"latestSource":"Close","latestTime":"March
         | 
| 69 | 
            +
                    3, 2020","latestUpdate":1583269431180,"latestVolume":null,"iexRealtimePrice":0,"iexRealtimeSize":0,"iexLastUpdated":0,"delayedPrice":null,"delayedPriceTime":null,"oddLotDelayedPrice":null,"oddLotDelayedPriceTime":null,"extendedPrice":null,"extendedChange":null,"extendedChangePercent":null,"extendedPriceTime":null,"previousClose":37.18,"previousVolume":68432790,"change":-0.88,"changePercent":-0.02367,"volume":null,"iexMarketPercent":null,"iexVolume":0,"avgTotalVolume":39604055,"iexBidPrice":0,"iexBidSize":0,"iexAskPrice":0,"iexAskSize":0,"marketCap":260375544000,"peRatio":19.09,"week52High":39.7,"week52Low":29.67,"ytdChange":-0.089548,"lastTradeTime":1583269199998,"isUSMarketOpen":false},{"symbol":"XOM","companyName":"Exxon
         | 
| 70 | 
            +
                    Mobil Corp.","primaryExchange":"New York Stock Exchange","calculationPrice":"close","open":null,"openTime":null,"close":null,"closeTime":null,"high":null,"low":null,"latestPrice":51.3,"latestSource":"Close","latestTime":"March
         | 
| 71 | 
            +
                    3, 2020","latestUpdate":1583269428549,"latestVolume":null,"iexRealtimePrice":0,"iexRealtimeSize":0,"iexLastUpdated":0,"delayedPrice":null,"delayedPriceTime":null,"oddLotDelayedPrice":null,"oddLotDelayedPriceTime":null,"extendedPrice":null,"extendedChange":null,"extendedChangePercent":null,"extendedPriceTime":null,"previousClose":53.88,"previousVolume":38127634,"change":-2.58,"changePercent":-0.04788,"volume":null,"iexMarketPercent":null,"iexVolume":0,"avgTotalVolume":24981447,"iexBidPrice":0,"iexBidSize":0,"iexAskPrice":0,"iexAskSize":0,"marketCap":217111347000,"peRatio":15.29,"week52High":83.49,"week52Low":48.01,"ytdChange":-0.324326,"lastTradeTime":1583269199431,"isUSMarketOpen":false},{"symbol":"INTC","companyName":"Intel
         | 
| 72 | 
            +
                    Corp.","primaryExchange":"NASDAQ","calculationPrice":"close","open":null,"openTime":null,"close":null,"closeTime":null,"high":null,"low":null,"latestPrice":55.97,"latestSource":"Close","latestTime":"March
         | 
| 73 | 
            +
                    3, 2020","latestUpdate":1583269200750,"latestVolume":null,"iexRealtimePrice":0,"iexRealtimeSize":0,"iexLastUpdated":0,"delayedPrice":null,"delayedPriceTime":null,"oddLotDelayedPrice":null,"oddLotDelayedPriceTime":null,"extendedPrice":null,"extendedChange":null,"extendedChangePercent":null,"extendedPriceTime":null,"previousClose":58.18,"previousVolume":43140304,"change":-2.21,"changePercent":-0.03799,"volume":null,"iexMarketPercent":null,"iexVolume":0,"avgTotalVolume":28110407,"iexBidPrice":0,"iexBidSize":0,"iexAskPrice":0,"iexAskSize":0,"marketCap":239383690000,"peRatio":11.7,"week52High":69.29,"week52Low":42.86,"ytdChange":-0.118036,"lastTradeTime":1583269200602,"isUSMarketOpen":false}]'
         | 
| 74 | 
            +
                http_version: null
         | 
| 75 | 
            +
              recorded_at: Wed, 04 Mar 2020 13:00:24 GMT
         | 
| 76 | 
            +
            recorded_with: VCR 5.1.0
         | 
    
        data/spec/iex/client_spec.rb
    CHANGED
    
    | @@ -17,6 +17,11 @@ describe IEX::Api::Client do | |
| 17 17 | 
             
                    expect(client.user_agent).to eq IEX::Api::Config.user_agent
         | 
| 18 18 | 
             
                    expect(client.user_agent).to include IEX::VERSION
         | 
| 19 19 | 
             
                  end
         | 
| 20 | 
            +
                  it 'caches the Faraday connection to allow persistent adapters' do
         | 
| 21 | 
            +
                    first = client.send(:connection)
         | 
| 22 | 
            +
                    second = client.send(:connection)
         | 
| 23 | 
            +
                    expect(first).to equal second
         | 
| 24 | 
            +
                  end
         | 
| 20 25 | 
             
                  (IEX::Api::Config::ATTRIBUTES - [:logger]).each do |key|
         | 
| 21 26 | 
             
                    it "sets #{key}" do
         | 
| 22 27 | 
             
                      expect(client.send(key)).to eq IEX::Api::Config.send(key)
         | 
| @@ -130,7 +135,7 @@ describe IEX::Api::Client do | |
| 130 135 | 
             
                  let(:client) { described_class.new }
         | 
| 131 136 | 
             
                  it 'results in an API key error', vcr: { cassette_name: 'client/access_denied' } do
         | 
| 132 137 | 
             
                    expect do
         | 
| 133 | 
            -
                      client.get '/stock/msft/quote'
         | 
| 138 | 
            +
                      client.get '/stock/msft/quote', token: client.publishable_token
         | 
| 134 139 | 
             
                    end.to raise_error IEX::Errors::PermissionDeniedError, /The API key provided is not valid./
         | 
| 135 140 | 
             
                  end
         | 
| 136 141 | 
             
                end
         | 
| @@ -12,11 +12,11 @@ describe IEX::Resources::Chart do | |
| 12 12 | 
             
                it 'retrieves a default chart' do
         | 
| 13 13 | 
             
                  expect(subject.count).to eq 23
         | 
| 14 14 | 
             
                  expect(first).to be_a IEX::Resources::Chart::Default
         | 
| 15 | 
            -
                  expect(first.label).to eq ' | 
| 15 | 
            +
                  expect(first.label).to eq 'Jul 10'
         | 
| 16 16 | 
             
                  expect(first.change_percent_s).to eq '0.00%'
         | 
| 17 | 
            -
                  expect(first.close).to eq  | 
| 18 | 
            -
                  expect(first.date).to eq Date.new(2019,  | 
| 19 | 
            -
                  expect(last.label).to eq ' | 
| 17 | 
            +
                  expect(first.close).to eq 137.85
         | 
| 18 | 
            +
                  expect(first.date).to eq Date.new(2019, 7, 10)
         | 
| 19 | 
            +
                  expect(last.label).to eq 'Aug 9'
         | 
| 20 20 | 
             
                end
         | 
| 21 21 | 
             
              end
         | 
| 22 22 |  | 
| @@ -30,8 +30,8 @@ describe IEX::Resources::Chart do | |
| 30 30 | 
             
                  expect(subject.count).to eq 390
         | 
| 31 31 | 
             
                  expect(first).to be_a IEX::Resources::Chart::OneDay
         | 
| 32 32 | 
             
                  expect(first.label).to eq '09:30 AM'
         | 
| 33 | 
            -
                  expect(first.high).to eq  | 
| 34 | 
            -
                  expect(first.low).to eq  | 
| 33 | 
            +
                  expect(first.high).to eq 138.72
         | 
| 34 | 
            +
                  expect(first.low).to eq 138.5
         | 
| 35 35 | 
             
                  expect(first.minute).to eq '09:30'
         | 
| 36 36 | 
             
                end
         | 
| 37 37 | 
             
              end
         | 
| @@ -67,7 +67,7 @@ describe IEX::Resources::Chart do | |
| 67 67 | 
             
                it 'retrieves a 1m chart from' do
         | 
| 68 68 | 
             
                  expect(subject.count).to eq 23
         | 
| 69 69 | 
             
                  expect(first).to be_a IEX::Resources::Chart::Default
         | 
| 70 | 
            -
                  expect(first.date).to eq Date.new(2019,  | 
| 70 | 
            +
                  expect(first.date).to eq Date.new(2019, 7, 10)
         | 
| 71 71 | 
             
                end
         | 
| 72 72 | 
             
              end
         | 
| 73 73 |  | 
| @@ -19,6 +19,7 @@ describe IEX::Resources::Company do | |
| 19 19 | 
             
                  expect(subject.sector).to eq 'Technology Services'
         | 
| 20 20 | 
             
                  expect(subject.employees).to eq 131_000
         | 
| 21 21 | 
             
                  expect(subject.security_name).to eq 'Microsoft Corporation'
         | 
| 22 | 
            +
                  expect(subject.tags).to eq ['Technology Services', 'Packaged Software']
         | 
| 22 23 | 
             
                end
         | 
| 23 24 | 
             
              end
         | 
| 24 25 | 
             
              context 'invalid symbol', vcr: { cassette_name: 'company/invalid' } do
         | 
| @@ -0,0 +1,68 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'spec_helper'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            describe IEX::Resources::Income do
         | 
| 6 | 
            +
              include_context 'client'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              context 'known symbol' do
         | 
| 9 | 
            +
                context 'with defaults', vcr: { cassette_name: 'income/msft' } do
         | 
| 10 | 
            +
                  subject do
         | 
| 11 | 
            +
                    client.income('MSFT')
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
                  let(:income) { subject.first }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  it 'retrieves income statement' do
         | 
| 16 | 
            +
                    expect(subject.size).to eq 1
         | 
| 17 | 
            +
                    expect(income.report_date).to eq '2019-03-31'
         | 
| 18 | 
            +
                    expect(income.total_revenue).to eq 30_505_000_000
         | 
| 19 | 
            +
                    expect(income.total_revenue_dollar).to eq '$30,505,000,000'
         | 
| 20 | 
            +
                    expect(income.cost_of_revenue).to eq 10_170_000_000
         | 
| 21 | 
            +
                    expect(income.cost_of_revenue_dollar).to eq '$10,170,000,000'
         | 
| 22 | 
            +
                    expect(income.gross_profit).to eq 20_335_000_000
         | 
| 23 | 
            +
                    expect(income.gross_profit_dollar).to eq '$20,335,000,000'
         | 
| 24 | 
            +
                    expect(income.research_and_development).to eq 4_316_000_000
         | 
| 25 | 
            +
                    expect(income.research_and_development_dollar).to eq '$4,316,000,000'
         | 
| 26 | 
            +
                    expect(income.selling_general_and_admin).to eq 5_744_000_000
         | 
| 27 | 
            +
                    expect(income.selling_general_and_admin_dollar).to eq '$5,744,000,000'
         | 
| 28 | 
            +
                    expect(income.operating_expense).to eq 20_230_000_000
         | 
| 29 | 
            +
                    expect(income.operating_expense_dollar).to eq '$20,230,000,000'
         | 
| 30 | 
            +
                    expect(income.operating_income).to eq 10_275_000_000
         | 
| 31 | 
            +
                    expect(income.operating_income_dollar).to eq '$10,275,000,000'
         | 
| 32 | 
            +
                    expect(income.other_income_expense_net).to eq 211_000_000
         | 
| 33 | 
            +
                    expect(income.other_income_expense_net_dollar).to eq '$211,000,000'
         | 
| 34 | 
            +
                    expect(income.ebit_dollar).to eq '$10,275,000,000'
         | 
| 35 | 
            +
                    expect(income.ebit).to eq 10_275_000_000
         | 
| 36 | 
            +
                    expect(income.interest_income).to eq 671_000_000
         | 
| 37 | 
            +
                    expect(income.interest_income_dollar).to eq '$671,000,000'
         | 
| 38 | 
            +
                    expect(income.pretax_income).to eq 10_486_000_000
         | 
| 39 | 
            +
                    expect(income.pretax_income_dollar).to eq '$10,486,000,000'
         | 
| 40 | 
            +
                    expect(income.income_tax).to eq 1_677_000_000
         | 
| 41 | 
            +
                    expect(income.income_tax_dollar).to eq '$1,677,000,000'
         | 
| 42 | 
            +
                    expect(income.minority_interest).to eq 0
         | 
| 43 | 
            +
                    expect(income.net_income).to eq 8_809_000_000
         | 
| 44 | 
            +
                    expect(income.net_income_dollar).to eq '$8,809,000,000'
         | 
| 45 | 
            +
                    expect(income.net_income_basic).to eq 8_809_000_000
         | 
| 46 | 
            +
                    expect(income.net_income_basic_dollar).to eq '$8,809,000,000'
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
              context 'no result', vcr: { cassette_name: 'income/nsrgy' } do
         | 
| 52 | 
            +
                subject do
         | 
| 53 | 
            +
                  client.income('nsrgy')
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
                it 'returns empty array' do
         | 
| 56 | 
            +
                  expect(subject).to eq []
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
              context 'invalid symbol', vcr: { cassette_name: 'income/invalid' } do
         | 
| 61 | 
            +
                subject do
         | 
| 62 | 
            +
                  client.income('INVALID')
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
                it 'fails with SymbolNotFoundError' do
         | 
| 65 | 
            +
                  expect { subject }.to raise_error IEX::Errors::SymbolNotFoundError, 'Symbol INVALID Not Found'
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
              end
         | 
| 68 | 
            +
            end
         | 
| @@ -9,44 +9,57 @@ describe IEX::Resources::KeyStats do | |
| 9 9 | 
             
                end
         | 
| 10 10 | 
             
                it 'retrieves a keyStats' do
         | 
| 11 11 | 
             
                  expect(subject.company_name).to eq 'Microsoft Corp.'
         | 
| 12 | 
            -
                  expect(subject.market_cap).to eq  | 
| 13 | 
            -
                  expect(subject. | 
| 12 | 
            +
                  expect(subject.market_cap).to eq 990_869_169_557
         | 
| 13 | 
            +
                  expect(subject.market_cap_dollar).to eq '$990,869,169,557'
         | 
| 14 | 
            +
                  expect(subject.employees).to eq 133_074
         | 
| 14 15 | 
             
                end
         | 
| 15 16 |  | 
| 16 17 | 
             
                it 'weekly stats' do
         | 
| 17 | 
            -
                  expect(subject.week_52_high).to eq  | 
| 18 | 
            -
                  expect(subject.week_52_high_dollar).to eq '$ | 
| 19 | 
            -
                  expect(subject.week_52_low).to eq  | 
| 20 | 
            -
                  expect(subject.week_52_low_dollar).to eq '$ | 
| 21 | 
            -
                  expect(subject. | 
| 18 | 
            +
                  expect(subject.week_52_high).to eq 136.04
         | 
| 19 | 
            +
                  expect(subject.week_52_high_dollar).to eq '$136.04'
         | 
| 20 | 
            +
                  expect(subject.week_52_low).to eq 95.92
         | 
| 21 | 
            +
                  expect(subject.week_52_low_dollar).to eq '$95.92'
         | 
| 22 | 
            +
                  expect(subject.week_52_change).to eq 0.371641
         | 
| 23 | 
            +
                  expect(subject.week_52_change_dollar).to eq '$0.37'
         | 
| 22 24 | 
             
                end
         | 
| 23 25 |  | 
| 24 26 | 
             
                it 'general stats' do
         | 
| 25 | 
            -
                  expect(subject. | 
| 26 | 
            -
                  expect(subject. | 
| 27 | 
            -
                  expect(subject. | 
| 28 | 
            -
                  expect(subject. | 
| 29 | 
            -
                  expect(subject. | 
| 30 | 
            -
                  expect(subject. | 
| 31 | 
            -
                  expect(subject. | 
| 27 | 
            +
                  expect(subject.ttm_dividend_rate).to eq 1.8
         | 
| 28 | 
            +
                  expect(subject.dividend_yield).to eq 0.014087248841960684
         | 
| 29 | 
            +
                  expect(subject.ex_dividend_date).to eq '2019-05-24'
         | 
| 30 | 
            +
                  expect(subject.shares_outstanding).to eq 7_849_945_172
         | 
| 31 | 
            +
                  expect(subject.float).to eq 7_694_414_092
         | 
| 32 | 
            +
                  expect(subject.ttm_eps).to eq 4.66
         | 
| 33 | 
            +
                  expect(subject.next_dividend_date).to eq '2019-05-21'
         | 
| 34 | 
            +
                  expect(subject.next_earnings_date).to eq '2019-07-29'
         | 
| 35 | 
            +
                  expect(subject.pe_ratio).to eq 29.47
         | 
| 36 | 
            +
                  expect(subject.beta).to eq 1.4135449089973444
         | 
| 37 | 
            +
                  expect(subject.day_200_moving_avg).to eq 112.43
         | 
| 38 | 
            +
                  expect(subject.day_50_moving_avg).to eq 121
         | 
| 32 39 | 
             
                end
         | 
| 33 40 |  | 
| 34 41 | 
             
                it 'changes stats' do
         | 
| 35 | 
            -
                  expect(subject. | 
| 36 | 
            -
                  expect(subject. | 
| 37 | 
            -
                  expect(subject. | 
| 38 | 
            -
                  expect(subject. | 
| 39 | 
            -
                  expect(subject. | 
| 40 | 
            -
                  expect(subject. | 
| 41 | 
            -
                  expect(subject. | 
| 42 | 
            -
                  expect(subject. | 
| 43 | 
            -
                  expect(subject. | 
| 44 | 
            -
                  expect(subject. | 
| 45 | 
            -
                  expect(subject. | 
| 46 | 
            -
                  expect(subject. | 
| 47 | 
            -
                  expect(subject. | 
| 48 | 
            -
                  expect(subject. | 
| 49 | 
            -
                  expect(subject. | 
| 42 | 
            +
                  expect(subject.avg_10_volume).to be 25_160_156.2
         | 
| 43 | 
            +
                  expect(subject.avg_30_volume).to be 23_123_700.13
         | 
| 44 | 
            +
                  expect(subject.max_change_percent).to eq 4.355607
         | 
| 45 | 
            +
                  expect(subject.year_5_change_percent).to be 2.32987
         | 
| 46 | 
            +
                  expect(subject.year_5_change_percent_s).to eq '+232.99%'
         | 
| 47 | 
            +
                  expect(subject.year_2_change_percent).to eq 0.84983
         | 
| 48 | 
            +
                  expect(subject.year_2_change_percent_s).to eq '+84.98%'
         | 
| 49 | 
            +
                  expect(subject.year_1_change_percent).to eq 0.383503
         | 
| 50 | 
            +
                  expect(subject.year_1_change_percent_s).to eq '+38.35%'
         | 
| 51 | 
            +
                  expect(subject.ytd_change_percent).to eq 0.270151
         | 
| 52 | 
            +
                  expect(subject.ytd_change_percent_s).to eq '+27.02%'
         | 
| 53 | 
            +
                  expect(subject.month_6_change_percent).to eq 0.208977
         | 
| 54 | 
            +
                  expect(subject.month_6_change_percent_s).to eq '+20.90%'
         | 
| 55 | 
            +
                  expect(subject.month_3_change_percent).to eq 0.212188
         | 
| 56 | 
            +
                  expect(subject.month_3_change_percent_s).to eq '+21.22%'
         | 
| 57 | 
            +
                  expect(subject.month_1_change_percent).to eq 0.076335
         | 
| 58 | 
            +
                  expect(subject.month_1_change_percent_s).to eq '+7.63%'
         | 
| 59 | 
            +
                  expect(subject.day_5_change_percent).to eq(-0.010013)
         | 
| 60 | 
            +
                  expect(subject.day_5_change_percent_s).to eq '-1.00%'
         | 
| 61 | 
            +
                  expect(subject.day_30_change_percent).to eq 0.089589
         | 
| 62 | 
            +
                  expect(subject.day_30_change_percent_s).to eq '+8.96%'
         | 
| 50 63 | 
             
                end
         | 
| 51 64 | 
             
              end
         | 
| 52 65 |  | 
| @@ -18,6 +18,8 @@ describe IEX::Resources::Quote do | |
| 18 18 | 
             
                  expect(subject.week_52_low).to eq 87.73
         | 
| 19 19 | 
             
                  expect(subject.change_percent).to eq(-0.00508)
         | 
| 20 20 | 
             
                  expect(subject.change_percent_s).to eq '-0.51%'
         | 
| 21 | 
            +
                  expect(subject.extended_change_percent).to eq(-0.00008)
         | 
| 22 | 
            +
                  expect(subject.extended_change_percent_s).to eq '-0.01%'
         | 
| 21 23 | 
             
                end
         | 
| 22 24 | 
             
                it 'coerces times' do
         | 
| 23 25 | 
             
                  expect(subject.latest_update).to eq 1_554_408_000_193
         | 
| @@ -0,0 +1,66 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe IEX::Api::Client do
         | 
| 4 | 
            +
              include_context 'client'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              describe '#ref_data_isin', vcr: { cassette_name: 'ref-data/isin' } do
         | 
| 7 | 
            +
                context 'without options' do
         | 
| 8 | 
            +
                  subject { client.ref_data_isin(['US0378331005']) }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  it 'converts ISIN to IEX Cloud symbols' do
         | 
| 11 | 
            +
                    expect(subject.count).to eq(2)
         | 
| 12 | 
            +
                    expect(subject.first).to eq('exchange' => 'NAS', 'iex_id' => 'IEX_4D48333344362D52', 'region' => 'US', 'symbol' => 'AAPL')
         | 
| 13 | 
            +
                    expect(subject.last).to eq('exchange' => 'ETR', 'iex_id' => 'IEX_464D46474C312D52', 'region' => 'DE', 'symbol' => 'APC-GY')
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                context 'with mapped option', vcr: { cassette_name: 'ref-data/isin_mapped' } do
         | 
| 18 | 
            +
                  subject { client.ref_data_isin(%w[US0378331005 US5949181045], mapped: true) }
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  it 'converts ISINs to IEX Cloud symbols mapped by ISIN' do
         | 
| 21 | 
            +
                    expect(subject.keys).to contain_exactly('US0378331005', 'US5949181045')
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                    expect(subject['US0378331005'].first).to eq('exchange' => 'NAS', 'iex_id' => 'IEX_4D48333344362D52', 'region' => 'US', 'symbol' => 'AAPL')
         | 
| 24 | 
            +
                    expect(subject['US0378331005'].last).to eq('exchange' => 'ETR', 'iex_id' => 'IEX_464D46474C312D52', 'region' => 'DE', 'symbol' => 'APC-GY')
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    expect(subject['US5949181045'][0]).to eq('exchange' => 'NAS', 'iex_id' => 'IEX_5038523343322D52', 'region' => 'US', 'symbol' => 'MSFT')
         | 
| 27 | 
            +
                    expect(subject['US5949181045'][1]).to eq('exchange' => 'ETR', 'iex_id' => 'IEX_4C42583859482D52', 'region' => 'DE', 'symbol' => 'MSF-GY')
         | 
| 28 | 
            +
                    expect(subject['US5949181045'][2]).to eq('exchange' => 'BRU', 'iex_id' => 'IEX_5833345950432D52', 'region' => 'BE', 'symbol' => 'MSF-BB')
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  context 'with wrong ISIN', vcr: { cassette_name: 'ref-data/wrong_isin_mapped' } do
         | 
| 32 | 
            +
                    subject { client.ref_data_isin(%w[WRONG12345], mapped: true) }
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    it 'returns nil value for given ISIN' do
         | 
| 35 | 
            +
                      expect(subject).to eq('WRONG12345' => nil)
         | 
| 36 | 
            +
                    end
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              describe '#ref_data_symbols', vcr: { cassette_name: 'ref-data/symbols' } do
         | 
| 42 | 
            +
                subject { client.ref_data_symbols }
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                it 'retrieves all symbols' do
         | 
| 45 | 
            +
                  expect(subject.count).to eq 8808
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                context 'first symbol' do
         | 
| 49 | 
            +
                  subject { client.ref_data_symbols.first }
         | 
| 50 | 
            +
                  it 'retrieves a symbol data' do
         | 
| 51 | 
            +
                    expect(subject.symbol).to eq 'A'
         | 
| 52 | 
            +
                    expect(subject.exchange).to eq 'NYS'
         | 
| 53 | 
            +
                    expect(subject.name).to eq 'Agilent Technologies Inc.'
         | 
| 54 | 
            +
                    expect(subject.date).to eq Date.parse('2020-04-30')
         | 
| 55 | 
            +
                    expect(subject.enabled).to eq true
         | 
| 56 | 
            +
                    expect(subject.enabled?).to eq true
         | 
| 57 | 
            +
                    expect(subject.type).to eq 'cs'
         | 
| 58 | 
            +
                    expect(subject.region).to eq 'US'
         | 
| 59 | 
            +
                    expect(subject.currency).to eq 'USD'
         | 
| 60 | 
            +
                    expect(subject.iex_id).to eq 'IEX_46574843354B2D52'
         | 
| 61 | 
            +
                    expect(subject.figi).to eq 'BBG000C2V3D6'
         | 
| 62 | 
            +
                    expect(subject.cik).to eq '1090872'
         | 
| 63 | 
            +
                  end
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
              end
         | 
| 66 | 
            +
            end
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe IEX::Endpoints::StockMarket do
         | 
| 4 | 
            +
              include_context 'client'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              describe '#stock_market_list', vcr: { cassette_name: 'stock_market/list_mostactive' } do
         | 
| 7 | 
            +
                subject { client.stock_market_list(:mostactive) }
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                it 'retrieves a list of quotes' do
         | 
| 10 | 
            +
                  expect(subject).to all(be_a(IEX::Resources::Quote))
         | 
| 11 | 
            +
                  expect(subject.map(&:symbol)).to match_array(%w[AAPL AMD BAC F GE INO INTC MSFT T XOM])
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
            end
         |