iex-ruby-client 1.3.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +21 -0
  4. data/README.md +202 -16
  5. data/RELEASING.md +3 -3
  6. data/UPGRADING.md +8 -0
  7. data/iex-ruby-client.gemspec +1 -1
  8. data/lib/iex/api/client.rb +5 -0
  9. data/lib/iex/api.rb +5 -0
  10. data/lib/iex/endpoints/balance_sheet.rb +13 -0
  11. data/lib/iex/endpoints/cash_flow.rb +13 -0
  12. data/lib/iex/endpoints/fx.rb +13 -0
  13. data/lib/iex/endpoints/historial_prices.rb +30 -0
  14. data/lib/iex/endpoints/key_stat.rb +14 -0
  15. data/lib/iex/endpoints/ref_data.rb +5 -0
  16. data/lib/iex/errors/invalid_symbols_list.rb +14 -0
  17. data/lib/iex/errors/stat_not_found_error.rb +13 -0
  18. data/lib/iex/errors.rb +3 -1
  19. data/lib/iex/resources/advanced_stats.rb +43 -1
  20. data/lib/iex/resources/balance_sheet.rb +60 -0
  21. data/lib/iex/resources/cash_flow.rb +43 -0
  22. data/lib/iex/resources/currency_rate.rb +9 -0
  23. data/lib/iex/resources/historical_prices.rb +31 -0
  24. data/lib/iex/resources/income.rb +2 -0
  25. data/lib/iex/resources/news.rb +3 -0
  26. data/lib/iex/resources/resource.rb +17 -1
  27. data/lib/iex/resources.rb +4 -0
  28. data/lib/iex/version.rb +1 -1
  29. data/lib/iex-ruby-client.rb +1 -1
  30. data/script/console +9 -0
  31. data/spec/fixtures/iex/balance_sheet/invalid.yml +50 -0
  32. data/spec/fixtures/iex/balance_sheet/msft.yml +56 -0
  33. data/spec/fixtures/iex/cash_flow/invalid.yml +50 -0
  34. data/spec/fixtures/iex/cash_flow/msft.yml +56 -0
  35. data/spec/fixtures/iex/fx/invalid.yml +83 -0
  36. data/spec/fixtures/iex/fx/latest.yml +85 -0
  37. data/spec/fixtures/iex/fx/latest_one_symbol.yml +85 -0
  38. data/spec/fixtures/iex/historical_prices/abcd.yml +56 -0
  39. data/spec/fixtures/iex/historical_prices/invalid.yml +50 -0
  40. data/spec/fixtures/iex/historical_prices/invalid_date.yml +50 -0
  41. data/spec/fixtures/iex/historical_prices/invalid_range.yml +47 -0
  42. data/spec/fixtures/iex/historical_prices/msft.yml +79 -0
  43. data/spec/fixtures/iex/historical_prices/msft_5d.yml +61 -0
  44. data/spec/fixtures/iex/historical_prices/msft_date_and_chart_by_day.yml +57 -0
  45. data/spec/fixtures/iex/historical_prices/msft_specific_date_trimmed.yml +445 -0
  46. data/spec/fixtures/iex/income/msft.yml +54 -51
  47. data/spec/fixtures/iex/key_stat/individual.yml +60 -0
  48. data/spec/fixtures/iex/key_stat/invalid_stat.yml +60 -0
  49. data/spec/fixtures/iex/key_stat/invalid_symbol.yml +50 -0
  50. data/spec/fixtures/iex/ref-data/exchange_symbols.yml +1926 -0
  51. data/spec/iex/endpoints/advanced_stats_spec.rb +56 -0
  52. data/spec/iex/endpoints/balance_sheet_spec.rb +80 -0
  53. data/spec/iex/endpoints/cash_flow_spec.rb +59 -0
  54. data/spec/iex/endpoints/fx_spec.rb +48 -0
  55. data/spec/iex/endpoints/historical_prices_spec.rb +206 -0
  56. data/spec/iex/endpoints/income_spec.rb +31 -29
  57. data/spec/iex/endpoints/key_stat_spec.rb +43 -0
  58. data/spec/iex/endpoints/news_spec.rb +3 -0
  59. data/spec/iex/endpoints/ref_data_spec.rb +44 -9
  60. data/spec/iex/resources/resource_spec.rb +36 -0
  61. metadata +68 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b8a4a5e3e694cd4af9310002178f918ed6b6802711860e29780e2bde8f494805
4
- data.tar.gz: 415aa05993daba620a4aea9a32aa52d73a8e0b3bdc39fd96296fb655703b2921
3
+ metadata.gz: 842d8fd485aebd159c318088ca1137348555a4a2106e4e4089da3e13ecc596eb
4
+ data.tar.gz: dc2046dd1efbd5c0593134fa99daf5a280f62c629c2779d785f5f34f41896c6a
5
5
  SHA512:
6
- metadata.gz: 43680c128f3354b4f64f485c51ddfed0f94c9a3f25b6be1c16f93a7a3a97534a0e1fa990a85394d92c1aca220410ceea1a9e9f0d061abce8c7e697ef91a022e3
7
- data.tar.gz: 3f497b0bdcc8b295b1f370d3185e6768fea91cbafdde5acdf637d8a16b918d0e5fc229eb5bb702eca8d5848388b5803e797cf8c21feb156c895f3c8e1d5d2dd8
6
+ metadata.gz: 543f9a5bea937226e974b430654c53d4fab1f4cbb79d025784888f6a4924aeb2c59bcceb2214257a78544274c217f555594cc100a9820dae2b8f90d72ef9b1ae
7
+ data.tar.gz: 205d65bf85cfd152e4cddb8f6344658cea65a12201aceba42a43a52a524efcbf02e9695ddfa543c99b5fc90f402b096e490fe6341697fbb07e7de5a5a7961c72
data/.gitignore CHANGED
@@ -4,3 +4,4 @@ Gemfile.lock
4
4
  .DS_Store
5
5
  .bundle
6
6
  .idea
7
+ .irbrc
data/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ ### 1.6.0 (2021/10/17)
2
+ * [#110](https://github.com/dblock/iex-ruby-client/pull/110): Drop `money_helper` dependency and utilize `money` gem directly - [@agrberg](https://github.com/agrberg).
3
+
4
+ ### 1.5.0 (2021/08/15)
5
+ * [#105](https://github.com/dblock/iex-ruby-client/pull/105): Added support for fetching latest foreign exchange rates - [@mathu97](https://github.com/mathu97).
6
+ * [#106](https://github.com/dblock/iex-ruby-client/pull/106): Added support for fetching a single key stat with `key_stat(symbol, stat)` endpoint - [@agrberg](https://github.com/agrberg).
7
+ * [#107](https://github.com/dblock/iex-ruby-client/pull/107): Added `./script/console` for ease of local development - [@agrberg](https://github.com/agrberg).
8
+
9
+ ### 1.4.1 (2021/05/15)
10
+ * [#103](https://github.com/dblock/iex-ruby-client/pull/103): Added support for fetching symbols for an exchange - [@mathu97](https://github.com/mathu97).
11
+ * [#99](https://github.com/dblock/iex-ruby-client/pull/99): Added `image` and `paywalled` to news - [@reddavis](https://github.com/reddavis).
12
+ * [#100](https://github.com/dblock/iex-ruby-client/pull/100): Added `language` to news - [@reddavis](https://github.com/reddavis).
13
+
14
+ ### 1.4.0 (2020/11/19)
15
+ * [#90](https://github.com/dblock/iex-ruby-client/pull/90): Added documentation for advanced stats and removed `avg_30_Volume` from advanced stats since it is found in key stats - [@tylerhaugen-stanley](https://github.com/tylerhaugen-stanley).
16
+ * [#91](https://github.com/dblock/iex-ruby-client/pull/91): Added support for Balance Sheet API endpoint - [@tylerhaugen-stanley](https://github.com/tylerhaugen-stanley).
17
+ * [#92](https://github.com/dblock/iex-ruby-client/pull/92): Added support for Cash Flow Statements API endpoint - [@tylerhaugen-stanley](https://github.com/tylerhaugen-stanley).
18
+ * [#93](https://github.com/dblock/iex-ruby-client/pull/93): Added `fiscal_date` and `currency` to income statements - [@tylerhaugen-stanley](https://github.com/tylerhaugen-stanley).
19
+ * [#94](https://github.com/dblock/iex-ruby-client/pull/94): Added `historical_prices` API endpoint - [@tylerhaugen-stanley](https://github.com/tylerhaugen-stanley).
20
+ * [#95](https://github.com/dblock/iex-ruby-client/pull/95): Added all KeyStat properties to AdvancedStats since they are already returned in the API call - [@tylerhaugen-stanley](https://github.com/tylerhaugen-stanley).
21
+
1
22
  ### 1.3.0 (2020/10/31)
2
23
 
3
24
  * [#82](https://github.com/dblock/iex-ruby-client/pull/82): Added `config.referer` to set HTTP `Referer` header. This enables IEX's "Manage domains" domain locking for tokens - [@agrberg](https://github.com/agrberg).
data/README.md CHANGED
@@ -15,19 +15,25 @@ A Ruby client for the [The IEX Cloud API](https://iexcloud.io/docs/api/).
15
15
  - [Get a Quote](#get-a-quote)
16
16
  - [Get a OHLC (Open, High, Low, Close) price](#get-a-ohlc-open-high-low-close-price)
17
17
  - [Get a Market OHLC (Open, High, Low, Close) prices](#get-a-market-ohlc-open-high-low-close-prices)
18
+ - [Get Historical Prices](#get-historical-prices)
18
19
  - [Get Company Information](#get-company-information)
19
20
  - [Get a Company Logo](#get-a-company-logo)
20
21
  - [Get Recent News](#get-recent-news)
21
22
  - [Get Chart](#get-chart)
22
23
  - [Get Key Stats](#get-key-stats)
24
+ - [Get Advanced Stats](#get-advanced-stats)
23
25
  - [Get Dividends](#get-dividends)
24
26
  - [Get Earnings](#get-earnings)
25
27
  - [Get Income Statement](#get-income-statement)
28
+ - [Get Balance Sheet](#get-balance-sheet)
29
+ - [Get Cash Flow Statement](#get-cash-flow-statement)
26
30
  - [Get Sector Performance](#get-sector-performance)
27
31
  - [Get Largest Trades](#get-largest-trades)
28
32
  - [Get a Quote for Crypto Currencies](#get-a-quote-for-crypto-currencies)
29
33
  - [ISIN Mapping](#isin-mapping)
30
34
  - [Get Symbols](#get-symbols)
35
+ - [Get Symbols for an Exchange](#get-symbols-for-an-exchange)
36
+ - [Get Latest Foreign Exchange Rates](#get-latest-foreign-exchange-rates)
31
37
  - [Get List](#get-list)
32
38
  - [Other Requests](#other-requests)
33
39
  - [Configuration](#configuration)
@@ -130,6 +136,60 @@ market['SPY'].high #
130
136
  market['SPY'].low #
131
137
  ```
132
138
 
139
+ ### Get Historical Prices
140
+
141
+ Fetches a list of historical prices.
142
+
143
+ There are currently a few limitations of this endpoint compared to the official IEX one.
144
+
145
+ Options for `range` include:
146
+ `max, ytd, 5y, 2y, 1y, 6m, 3m, 1m, 5d, date`
147
+
148
+ NOTE: If you use the `date` value for the `range` parameter:
149
+
150
+ - The options _must_ include a date entry, `{date: ...}`
151
+ - The date value _must_ be either a Date object, or a string formatted as `YYYYMMDD`. Anything else will result in an `IEX::Errors::ClientError`.
152
+ - The options _must_ include `chartByDay: 'true'` or an `ArgumentError` will be raised.
153
+ - See below for examples.
154
+
155
+ `Query params` supported include:
156
+ `chartByDay`
157
+
158
+ This is a complicated endpoint as there is a lot of granularity over the time period of data returned. See below for a variety of ways to request data, NOTE: this is _NOT_ as exhaustive list.
159
+
160
+ ```ruby
161
+ historical_prices = client.historical_prices('MSFT') # One month of data
162
+ historical_prices = client.historical_prices('MSFT', {range: 'max'}) # All data up to 15 years
163
+ historical_prices = client.historical_prices('MSFT', {range: 'ytd'}) # Year to date data
164
+ historical_prices = client.historical_prices('MSFT', {range: '5y'}) # 5 years of data
165
+ historical_prices = client.historical_prices('MSFT', {range: '6m'}) # 6 months of data
166
+ historical_prices = client.historical_prices('MSFT', {range: '5d'}) # 5 days of data
167
+ historical_prices = client.historical_prices('MSFT', {range: 'date', date: '20200930', chartByDay: 'true'}) # One day of data
168
+ historical_prices = client.historical_prices('MSFT', {range: 'date', date: Date.parse('2020-09-30'), chartByDay: 'true'}) # One day of data
169
+ ...
170
+ ```
171
+
172
+ Once you have the data over the preferred time period, you can access the following fields
173
+
174
+ ```ruby
175
+ historical_prices = client.historical_prices('MSFT') # One month of data
176
+
177
+ historical_price = historical_prices.first
178
+ historical_price.date # 2020-10-07
179
+ historical_price.open #207.06
180
+ historical_price.open_dollar # '$207.06'
181
+ historical_price.close # 209.83
182
+ historical_price.close_dollar # '$209.83'
183
+ historical_price.high # 210.11
184
+ historical_price.high_dollar # '$210.11'
185
+ historical_price.low # 206.72
186
+ historical_price.low_dollar # '$206.72'
187
+ historical_price.volume # 25681054
188
+ ...
189
+ ```
190
+
191
+ There are a lot of options here so I would recommend viewing the official IEX documentation [#historical-prices](https://iexcloud.io/docs/api/#historical-prices) or [historical_prices.rb](lib/iex/resources/historical_prices.rb) for returned fields.
192
+
133
193
  ### Get Company Information
134
194
 
135
195
  Fetches company information for a symbol.
@@ -263,8 +323,58 @@ key_stats.pe_ratio # 29.47
263
323
  key_stats.beta # 1.4135449089973444
264
324
  ```
265
325
 
326
+ You can also fetch a single stat for a symbol. **Note** that IEX uses `lowerCamelCase` for the names of the stats.
327
+
328
+ ```ruby
329
+ client.key_stat('VTI', 'dividendYield') # 0.01271760965303361
330
+ ```
331
+
266
332
  See [#key-stats](https://iexcloud.io/docs/api/#key-stats) for detailed documentation or [key_stats.rb](lib/iex/resources/key_stats.rb) for returned fields.
267
333
 
334
+ ### Get Advanced Stats
335
+
336
+ Fetches company's advanced stats for a symbol, this will include all key stats as well.
337
+
338
+ ```ruby
339
+ advanced_stats = client.advanced_stats('MSFT')
340
+
341
+ advanced_stats.total_cash # 66301000000
342
+ advanced_stats.total_cash_dollars # "$66,301,000,000"
343
+ advanced_stats.current_debt # 20748000000
344
+ advanced_stats.current_debt_dollars # "$2,074,8000,000"
345
+ advanced_stats.revenue # 265809000000
346
+ advanced_stats.revenue_dollars # "$265,809,000,000"
347
+ advanced_stats.gross_profit # 101983000000
348
+ advanced_stats.gross_profit_dollar # "$101,983,000,000"
349
+ advanced_stats.total_revenue # 265809000000
350
+ advanced_stats.total_revenue_dollar # "$265,809,000,000"
351
+ advanced_stats.ebitda # 80342000000
352
+ advanced_stats.ebitda_dollar # "$80,342,000,000"
353
+ advanced_stats.revenue_per_share # 0.02
354
+ advanced_stats.revenue_per_share_dollar # "$0.02"
355
+ advanced_stats.revenue_per_employee # 2013704.55
356
+ advanced_stats.revenue_per_employee_dollar # "$2,013,704.55"
357
+ advanced_stats.debt_to_equity # 1.07
358
+ advanced_stats.profit_margin # 22.396157
359
+ advanced_stats.enterprise_value # 1022460690000
360
+ advanced_stats.enterprise_value_dollar # "$1,022,460,690,000"
361
+ advanced_stats.enterprise_value_to_revenue # 3.85
362
+ advanced_stats.price_to_sales # 3.49
363
+ advanced_stats.price_to_sales_dollar # "$3.49"
364
+ advanced_stats.price_to_book # 8.805916432564608
365
+ advanced_stats.forward_pe_ratio # 18.14
366
+ advanced_stats.pe_high # 22.61
367
+ advanced_stats.pe_low # 11.98
368
+ advanced_stats.peg_ratio # 2.19
369
+ advanced_stats.week_52_high_date # "2019-11-19"
370
+ advanced_stats.week_52_low_date # "2019-01-03
371
+ advanced_stats.beta # 1.4661365583766115
372
+ advanced_stats.put_call_ratio # 0.6780362005229779
373
+ ...
374
+ ```
375
+
376
+ See [#advanced-stats](https://iexcloud.io/docs/api/#advanced-stats) for detailed documentation or [advanced_stats.rb](lib/iex/resources/advanced_stats.rb) for returned fields.
377
+
268
378
  ### Get Dividends
269
379
 
270
380
  Fetches dividends for a symbol.
@@ -304,12 +414,16 @@ See [#earnings](https://iexcloud.io/docs/api/#earnings) for detailed documentati
304
414
 
305
415
  ### Get Income Statement
306
416
 
307
- Fetches income statement for a symbol.
417
+ Fetches income statements for a symbol.
308
418
 
309
419
  ```ruby
310
- income = client.income('MSFT')
420
+ income_statements = client.income('MSFT')
311
421
 
422
+ # Multiple income statements are returned with 1 API call.
423
+ income = income_statements.first
312
424
  income.report_date # '2019-03-31'
425
+ income.fiscal_date # '2019-03-31'
426
+ income.currency # 'USD'
313
427
  income.total_revenue # 30_505_000_000
314
428
  income.total_revenue_dollar # '$30,505,000,000'
315
429
  income.cost_of_revenue # 10_170_000_000
@@ -321,6 +435,48 @@ income.gross_profit_dollar # '$20,335,000,000'
321
435
 
322
436
  See [#income-statement](https://iexcloud.io/docs/api/#income-statement) for detailed documentation or [income.rb](lib/iex/resources/income.rb) for returned fields.
323
437
 
438
+ ### Get Balance Sheet
439
+
440
+ Fetches balance sheets for a symbol.
441
+
442
+ ```ruby
443
+ balance_sheets = client.balance_sheet('MSFT')
444
+
445
+ # Multiple balance sheets are returned with 1 API call.
446
+ balance_sheet = balance_sheets.first
447
+ balance_sheet.report_date # '2017-03-31'
448
+ balance_sheet.fiscal_date # '2017-03-31'
449
+ balance_sheet.currency # 'USD'
450
+ balance_sheet.current_cash # 25_913_000_000
451
+ balance_sheet.current_cash_dollar # '$25,913,000,000'
452
+ balance_sheet.short_term_investments # 40_388_000_000
453
+ balance_sheet.short_term_investments_dollar # '$40,388,000,000'
454
+ ...
455
+ ```
456
+
457
+ See [#balance-sheet](https://iexcloud.io/docs/api/#balance-sheet) for detailed documentation or [balance_sheet.rb](lib/iex/resources/balance_sheet.rb) for returned fields.
458
+
459
+ ### Get Cash Flow Statement
460
+
461
+ Fetches cash flow statements for a symbol.
462
+
463
+ ```ruby
464
+ cash_flow_statements = client.cash_flow('MSFT')
465
+
466
+ # Multiple cash flow statements are returned with 1 API call.
467
+ cash_flow = cash_flow_statements.first
468
+ cash_flow.report_date # '2018-09-30'
469
+ cash_flow.fiscal_date # '2018-09-30'
470
+ cash_flow.currency # 'USD'
471
+ cash_flow.net_income # 14_125_000_000
472
+ cash_flow.net_income_dollar # '$14,125,000,000'
473
+ cash_flow.depreciation # 2_754_000_000
474
+ cash_flow.depreciation_dollar # '$2,754,000,000'
475
+ ...
476
+ ```
477
+
478
+ See [#cash-flow](https://iexcloud.io/docs/api/#cash-flow) for detailed documentation or [cash_flow.rb](lib/iex/resources/cash_flow.rb) for returned fields.
479
+
324
480
  ### Get Sector Performance
325
481
 
326
482
  Fetches latest sector's performance.
@@ -396,7 +552,6 @@ The API also lets you convert multiple ISINs to IEX Cloud symbols.
396
552
  symbols = client.ref_data_isin(['US0378331005', 'US0378331006'])
397
553
  ```
398
554
 
399
-
400
555
  You can use `mapped: true` option to receive symbols grouped by their ISINs.
401
556
 
402
557
  ```ruby
@@ -407,7 +562,7 @@ See [#ISIN Mapping](https://iexcloud.io/docs/api/#isin-mapping) for detailed doc
407
562
 
408
563
  ### Get Symbols
409
564
 
410
- Returns an array of symbols
565
+ Returns an array of symbols.
411
566
 
412
567
  ```ruby
413
568
  symbols = client.ref_data_symbols()
@@ -421,6 +576,37 @@ symbol.symbol # A
421
576
 
422
577
  See [#symbols](https://iexcloud.io/docs/api/#symbols) for detailed documentation or [symbols.rb](lib/iex/resources/symbols.rb) for returned fields.
423
578
 
579
+ ### Get Symbols for an Exchange
580
+
581
+ Returns an array of symbols for a given exchange.
582
+
583
+ ```ruby
584
+ symbols = client.ref_data_symbols_for_exchange('TSX')
585
+
586
+ symbol = symbols.first
587
+ symbol.exchange # TSX
588
+ symbol.iex_id # IEX_4656374258322D52
589
+ symbol.region # CA
590
+ symbol.symbol # A-CV
591
+ ```
592
+
593
+ See [#international-symbols](https://iexcloud.io/docs/api/#international-symbols) for returned fields.
594
+
595
+ ### Get Latest Foreign Exchange Rates
596
+
597
+ Returns an array of foreign exchange rates for a given list of symbols.
598
+
599
+ ```ruby
600
+ rates = client.fx_latest(['USDCAD', 'USDGBP', 'USDJPY'])
601
+
602
+ rate = rates.first
603
+ rate.symbol # USDCAD
604
+ rate.rate # 1.25674
605
+ rate.timestamp # <Date: 2021-07-23 ((2459419j,0s,0n),+0s,2299161j)>
606
+ ```
607
+
608
+ See [#latest-currency-rates](https://iexcloud.io/docs/api/#latest-currency-rates) for returned fields.
609
+
424
610
  ### Get List
425
611
 
426
612
  Returns an array of quotes for the top 10 symbols in a specified list.
@@ -460,18 +646,18 @@ client = IEX::Api::Client.new(
460
646
 
461
647
  The following settings are supported.
462
648
 
463
- setting | description
464
- --------------------|------------
465
- user_agent | User-agent, defaults to _IEX Ruby Client/version_.
466
- proxy | Optional HTTP proxy.
467
- ca_path | Optional SSL certificates path.
468
- ca_file | Optional SSL certificates file.
469
- logger | Optional `Logger` instance or logger configuration to log HTTP requests.
470
- timeout | Optional open/read timeout in seconds.
471
- open_timeout | Optional connection open timeout in seconds.
472
- publishable_token | IEX Cloud API publishable token.
473
- endpoint | Defaults to `https://cloud.iexapis.com/v1`.
474
- referer | Optional string for HTTP `Referer` header, enables token domain management.
649
+ | setting | description |
650
+ | ----------------- | --------------------------------------------------------------------------- |
651
+ | user_agent | User-agent, defaults to _IEX Ruby Client/version_. |
652
+ | proxy | Optional HTTP proxy. |
653
+ | ca_path | Optional SSL certificates path. |
654
+ | ca_file | Optional SSL certificates file. |
655
+ | logger | Optional `Logger` instance or logger configuration to log HTTP requests. |
656
+ | timeout | Optional open/read timeout in seconds. |
657
+ | open_timeout | Optional connection open timeout in seconds. |
658
+ | publishable_token | IEX Cloud API publishable token. |
659
+ | endpoint | Defaults to `https://cloud.iexapis.com/v1`. |
660
+ | referer | Optional string for HTTP `Referer` header, enables token domain management. |
475
661
 
476
662
  ### Logging
477
663
 
data/RELEASING.md CHANGED
@@ -11,15 +11,15 @@ bundle install
11
11
  rake
12
12
  ```
13
13
 
14
- Check that the last build succeeded in [Travis CI](https://travis-ci.org/dblock/iex-ruby-client) for all supported platforms.
14
+ Check that the last build succeeded in [Travis CI](https://travis-ci.com/github/dblock/iex-ruby-client) for all supported platforms.
15
15
 
16
16
  Change "Next" in [CHANGELOG.md](CHANGELOG.md) to the current date.
17
17
 
18
18
  ```
19
- ### 0.2.2 (7/10/2015)
19
+ ### 0.2.2 (2015/10/07)
20
20
  ```
21
21
 
22
- Remove the line with "Your contribution here.", since there will be no more contributions to this release.
22
+ Remove the line with "* Your contribution here.", since there will be no more contributions to this release.
23
23
 
24
24
  Commit your changes.
25
25
 
data/UPGRADING.md CHANGED
@@ -1,6 +1,14 @@
1
1
  Upgrading iex-ruby-client
2
2
  =========================
3
3
 
4
+ ### Upgrading to >= 1.6.0
5
+
6
+ [#110](https://github.com/dblock/iex-ruby-client/pull/110) drops the dependency on `money_helper` in favor of using the `money` library directly.
7
+
8
+ Previously the `money_helper` library set `Money.locale_backend = :currency` globally. The default is `I18n` which looks up the thousands separator and decimal marker. Depending on your project you may need to set this value if you use `Money#format` without the `thousands_separator` or `decimal_mark` options. You are less likely to require this in a Rails project.
9
+
10
+ This represents a change in the `money` library's method of handling defaults and is similar to the deprecation warning the library provides until you set `Money.rounding_mode=`.
11
+
4
12
  ### Upgrading to >= 1.0.0
5
13
 
6
14
  On June 1, 2019, IEX API has been sunset for all non-IEX data. IEX Cloud, a non-Exchange platform, continues to provide access to third-party data sources and requires a token. When upgrading to 1.0.0, create an account and get a `publishable token` from [IEX Cloud Console](https://iexcloud.io).
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.add_dependency 'faraday', '>= 0.17'
20
20
  s.add_dependency 'faraday_middleware'
21
21
  s.add_dependency 'hashie'
22
- s.add_dependency 'money_helper'
22
+ s.add_dependency 'money', '~> 6.0'
23
23
  s.add_development_dependency 'rake', '~> 10'
24
24
  s.add_development_dependency 'rspec'
25
25
  s.add_development_dependency 'rubocop', '0.72.0'
@@ -5,12 +5,17 @@ module IEX
5
5
 
6
6
  class Client
7
7
  include Endpoints::AdvancedStats
8
+ include Endpoints::BalanceSheet
9
+ include Endpoints::CashFlow
8
10
  include Endpoints::Chart
9
11
  include Endpoints::Company
10
12
  include Endpoints::Crypto
11
13
  include Endpoints::Dividends
12
14
  include Endpoints::Earnings
15
+ include Endpoints::FX
16
+ include Endpoints::HistoricalPrices
13
17
  include Endpoints::Income
18
+ include Endpoints::KeyStat
14
19
  include Endpoints::KeyStats
15
20
  include Endpoints::LargestTrades
16
21
  include Endpoints::Logo
data/lib/iex/api.rb CHANGED
@@ -1,11 +1,16 @@
1
1
  require_relative 'endpoints/advanced_stats'
2
+ require_relative 'endpoints/balance_sheet'
3
+ require_relative 'endpoints/cash_flow'
2
4
  require_relative 'endpoints/chart'
3
5
  require_relative 'endpoints/company'
4
6
  require_relative 'endpoints/dividends'
5
7
  require_relative 'endpoints/earnings'
8
+ require_relative 'endpoints/fx'
9
+ require_relative 'endpoints/historial_prices'
6
10
  require_relative 'endpoints/income'
7
11
  require_relative 'endpoints/largest_trades'
8
12
  require_relative 'endpoints/logo'
13
+ require_relative 'endpoints/key_stat'
9
14
  require_relative 'endpoints/key_stats'
10
15
  require_relative 'endpoints/news'
11
16
  require_relative 'endpoints/ohlc'
@@ -0,0 +1,13 @@
1
+ module IEX
2
+ module Endpoints
3
+ module BalanceSheet
4
+ def balance_sheet(symbol, options = {})
5
+ (get("stock/#{symbol}/balance-sheet", { token: publishable_token }.merge(options))['balancesheet'] || []).map do |data|
6
+ IEX::Resources::BalanceSheet.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
@@ -0,0 +1,13 @@
1
+ module IEX
2
+ module Endpoints
3
+ module CashFlow
4
+ def cash_flow(symbol, options = {})
5
+ (get("stock/#{symbol}/cash-flow", { token: publishable_token }.merge(options))['cashflow'] || []).map do |data|
6
+ IEX::Resources::CashFlow.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
@@ -0,0 +1,13 @@
1
+ module IEX
2
+ module Endpoints
3
+ module FX
4
+ def fx_latest(symbols, options = {})
5
+ symbols = Array(symbols)
6
+ response = get('fx/latest', { token: publishable_token, symbols: symbols.join(',') }.merge(options))
7
+ response.map { |row| IEX::Resources::CurrencyRate.new(row) }
8
+ rescue Faraday::ResourceNotFound => e
9
+ raise IEX::Errors::InvalidSymbolsList.new(symbols, e.response[:body])
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,30 @@
1
+ module IEX
2
+ module Endpoints
3
+ module HistoricalPrices
4
+ def historical_prices(symbol, options = {})
5
+ if options[:range] == 'date'
6
+ raise ArgumentError unless options[:date]
7
+ raise ArgumentError unless options[:chartByDay]
8
+ end
9
+
10
+ options = options.dup
11
+ # Historical prices IEX endpoint expects dates passed in a specific format - YYYYMMDD
12
+ options[:date] = options[:date].strftime('%Y%m%d') if options[:date].is_a?(Date)
13
+
14
+ path = "stock/#{symbol}/chart"
15
+ path += "/#{options[:range]}" if options.key?(:range)
16
+ path += "/#{options[:date]}" if options[:range] == 'date'
17
+
18
+ # We only want options to include query params at this point, remove :range and :date
19
+ options.delete(:range)
20
+ options.delete(:date)
21
+
22
+ (get(path, { token: publishable_token }.merge(options)) || []).map do |data|
23
+ IEX::Resources::HistorialPrices.new(data)
24
+ end
25
+ rescue Faraday::ResourceNotFound => e
26
+ raise IEX::Errors::SymbolNotFoundError.new(symbol, e.response[:body])
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,14 @@
1
+ module IEX
2
+ module Endpoints
3
+ module KeyStat
4
+ def key_stat(symbol, stat, options = {})
5
+ result = get("stock/#{symbol}/stats/#{stat}", { token: publishable_token }.merge(options))
6
+ raise IEX::Errors::StatNotFoundError.new(stat, result) if result.is_a?(Hash)
7
+
8
+ result
9
+ rescue Faraday::ResourceNotFound => e
10
+ raise IEX::Errors::SymbolNotFoundError.new(symbol, e.response[:body])
11
+ end
12
+ end
13
+ end
14
+ end
@@ -17,6 +17,11 @@ module IEX
17
17
  response = get('ref-data/symbols', { token: publishable_token }.merge(options))
18
18
  response.map { |row| IEX::Resources::Symbols.new(row) }
19
19
  end
20
+
21
+ def ref_data_symbols_for_exchange(exchange, options = {})
22
+ response = get("ref-data/exchange/#{exchange}/symbols", { token: publishable_token }.merge(options))
23
+ response.map { |row| IEX::Resources::Symbols.new(row) }
24
+ end
20
25
  end
21
26
  end
22
27
  end
@@ -0,0 +1,14 @@
1
+ module IEX
2
+ module Errors
3
+ class InvalidSymbolsList < StandardError
4
+ attr_reader :symbols
5
+ attr_reader :response
6
+
7
+ def initialize(symbols, response)
8
+ @response = response
9
+ @symbols = symbols
10
+ super "Invalid symbol list: #{symbols.join(',')}"
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ module IEX
2
+ module Errors
3
+ class StatNotFoundError < StandardError
4
+ attr_reader :response, :stat
5
+
6
+ def initialize(stat, response)
7
+ @response = response
8
+ @stat = stat
9
+ super "Stat #{stat} Not Found"
10
+ end
11
+ end
12
+ end
13
+ end
data/lib/iex/errors.rb CHANGED
@@ -1,3 +1,5 @@
1
- require_relative 'errors/symbol_not_found_error'
2
1
  require_relative 'errors/client_error'
2
+ require_relative 'errors/invalid_symbols_list'
3
3
  require_relative 'errors/permission_denied_error'
4
+ require_relative 'errors/stat_not_found_error'
5
+ require_relative 'errors/symbol_not_found_error'
@@ -28,11 +28,53 @@ module IEX
28
28
  property 'forward_pe_ratio', from: 'forwardPERatio'
29
29
  property 'pe_high', from: 'peHigh'
30
30
  property 'pe_low', from: 'peLow'
31
- property 'avg_30_volume', from: 'avg30Volume'
32
31
  property 'peg_ratio', from: 'pegRatio'
33
32
  property 'week_52_high_date', from: 'week52highDate'
34
33
  property 'week_52_low_date', from: 'week52lowDate'
35
34
  property 'beta'
35
+ property 'put_call_ratio', from: 'putCallRatio'
36
+ property 'company_name', from: 'companyName'
37
+ property 'market_cap', from: 'marketcap'
38
+ property 'market_cap_dollar', from: 'marketcap', with: ->(v) { Resource.to_dollar(amount: v) }
39
+ property 'week_52_high', from: 'week52high'
40
+ property 'week_52_high_dollar', from: 'week52high', with: ->(v) { Resource.to_dollar(amount: v, ignore_cents: false) }
41
+ property 'week_52_low', from: 'week52low'
42
+ property 'week_52_low_dollar', from: 'week52low', with: ->(v) { Resource.to_dollar(amount: v, ignore_cents: false) }
43
+ property 'week_52_change', from: 'week52change'
44
+ property 'week_52_change_dollar', from: 'week52change', with: ->(v) { Resource.to_dollar(amount: v, ignore_cents: false) }
45
+ property 'dividend_yield', from: 'dividendYield'
46
+ property 'ex_dividend_date', from: 'exDividendDate'
47
+ property 'shares_outstanding', from: 'sharesOutstanding'
48
+ property 'float'
49
+ property 'ttm_eps', from: 'ttmEPS'
50
+ property 'day_200_moving_avg', from: 'day200MovingAvg'
51
+ property 'day_50_moving_avg', from: 'day50MovingAvg'
52
+ property 'year_5_change_percent', from: 'year5ChangePercent'
53
+ property 'year_5_change_percent_s', from: 'year5ChangePercent', with: ->(v) { Resource.float_to_percentage(v) }
54
+ property 'year_2_change_percent', from: 'year2ChangePercent'
55
+ property 'year_2_change_percent_s', from: 'year2ChangePercent', with: ->(v) { Resource.float_to_percentage(v) }
56
+ property 'year_1_change_percent', from: 'year1ChangePercent'
57
+ property 'year_1_change_percent_s', from: 'year1ChangePercent', with: ->(v) { Resource.float_to_percentage(v) }
58
+ property 'ytd_change_percent', from: 'ytdChangePercent'
59
+ property 'ytd_change_percent_s', from: 'ytdChangePercent', with: ->(v) { Resource.float_to_percentage(v) }
60
+ property 'month_6_change_percent', from: 'month6ChangePercent'
61
+ property 'month_6_change_percent_s', from: 'month6ChangePercent', with: ->(v) { Resource.float_to_percentage(v) }
62
+ property 'month_3_change_percent', from: 'month3ChangePercent'
63
+ property 'month_3_change_percent_s', from: 'month3ChangePercent', with: ->(v) { Resource.float_to_percentage(v) }
64
+ property 'month_1_change_percent', from: 'month1ChangePercent'
65
+ property 'month_1_change_percent_s', from: 'month1ChangePercent', with: ->(v) { Resource.float_to_percentage(v) }
66
+ property 'day_5_change_percent', from: 'day5ChangePercent'
67
+ property 'day_5_change_percent_s', from: 'day5ChangePercent', with: ->(v) { Resource.float_to_percentage(v) }
68
+ property 'employees'
69
+ property 'avg_10_volume', from: 'avg10Volume'
70
+ property 'avg_30_volume', from: 'avg30Volume'
71
+ property 'ttm_dividend_rate', from: 'ttmDividendRate'
72
+ property 'max_change_percent', from: 'maxChangePercent'
73
+ property 'day_30_change_percent', from: 'day30ChangePercent'
74
+ property 'day_30_change_percent_s', from: 'day30ChangePercent', with: ->(v) { Resource.float_to_percentage(v) }
75
+ property 'next_dividend_date', from: 'nextDividendDate'
76
+ property 'next_earnings_date', from: 'nextEarningsDate'
77
+ property 'pe_ratio', from: 'peRatio'
36
78
 
37
79
  def initialize(data = {})
38
80
  super