yahoo_finance_client 0.3.1 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e0ac5c76c098d2bed0c2960381c799e4669a5e6bfac74d223c1f7dceadc650af
4
- data.tar.gz: a3738e2f466198761b923b4f3293e887a6de856e9cdcaca30fd6c473d55fd606
3
+ metadata.gz: 30839cb8e628ac9ed9d0f2b62b84c070deec2c0e34b2ebfa847e1f96ead57b66
4
+ data.tar.gz: edf5c2cfd5da659d3d133970209beab1520172609ba5ef3e62103f8632b94580
5
5
  SHA512:
6
- metadata.gz: 195bcd6094858a5df15ca67424aeddc8564c11ac2f3871608d1e6fdd6275e0622d1570158960befa9260f5d187ff6c83c7f36af3ab6144f3692d3e641bebc547
7
- data.tar.gz: 1e910b49a4b0147b87d464c34b5e9d525b48e9ec1150b56eefcf929cca3957b965fce221ac7b2c57c6f3e4fbdf5f4dae66fc133b3f0fec4a0e21f8b4f83f16ce
6
+ metadata.gz: 2a1b56270a9f16516c23aeeb68726e44597696f6decd6099feea133be43f812d2512955ad314de75423460ae45ff99ead67b649868037ec99c02c2bec9ad7f77
7
+ data.tar.gz: 45f41b601b87201eb3dfe5af834826268806ece7b4ac572e095f6489168c3e8579134a030ebad89570317922e96a5b52cd526ce87d7b644f07fa0233ce100676
data/.rubocop.yml CHANGED
@@ -11,7 +11,7 @@ Metrics/AbcSize:
11
11
  Max: 25
12
12
 
13
13
  Metrics/ClassLength:
14
- Max: 150
14
+ Max: 200
15
15
 
16
16
  Metrics/MethodLength:
17
17
  Max: 11
@@ -7,6 +7,7 @@ module YahooFinanceClient
7
7
  # This class provides methods to interact with Yahoo Finance API for stock data.
8
8
  class Stock
9
9
  QUOTE_PATH = "/v7/finance/quote"
10
+ CHART_PATH = "/v8/finance/chart"
10
11
  CACHE_TTL = 300
11
12
  MAX_RETRIES = 2
12
13
  BATCH_SIZE = 50
@@ -28,6 +29,11 @@ module YahooFinanceClient
28
29
  results
29
30
  end
30
31
 
32
+ def get_dividend_history(symbol, range: "2y")
33
+ cache_key = "div_history_#{symbol}_#{range}"
34
+ fetch_from_cache(cache_key) || fetch_and_cache_dividend_history(cache_key, symbol, range)
35
+ end
36
+
31
37
  private
32
38
 
33
39
  def partition_cached(symbols)
@@ -169,6 +175,61 @@ module YahooFinanceClient
169
175
  Time.at(value).utc.to_date
170
176
  end
171
177
 
178
+ def fetch_and_cache_dividend_history(cache_key, symbol, range)
179
+ data = fetch_dividend_history_data(symbol, range)
180
+ store_in_cache(cache_key, data) unless data.empty?
181
+ data
182
+ end
183
+
184
+ def fetch_dividend_history_data(symbol, range)
185
+ retries = 0
186
+ begin
187
+ response = make_chart_request(symbol, range)
188
+ parse_dividend_history(response)
189
+ rescue AuthenticationError
190
+ retries += 1
191
+ retry if retries <= MAX_RETRIES
192
+ []
193
+ end
194
+ end
195
+
196
+ def make_chart_request(symbol, range)
197
+ session = Session.instance
198
+ session.ensure_authenticated
199
+ url = "#{session.base_url}#{CHART_PATH}/#{symbol}?range=#{range}&interval=1mo&events=div&crumb=#{session.crumb}"
200
+ HTTParty.get(url, headers: { "User-Agent" => Session::USER_AGENT, "Cookie" => session.cookie })
201
+ end
202
+
203
+ def parse_dividend_history(response)
204
+ raise_if_auth_error(response)
205
+ return [] unless response.success?
206
+
207
+ dividends = JSON.parse(response.body).dig("chart", "result", 0, "events", "dividends")
208
+ return [] unless dividends
209
+
210
+ build_dividend_entries(dividends)
211
+ end
212
+
213
+ def raise_if_auth_error(response)
214
+ return unless auth_error?(response)
215
+
216
+ Session.instance.invalidate!
217
+ raise AuthenticationError, "Authentication failed"
218
+ end
219
+
220
+ def build_dividend_entries(dividends)
221
+ entries = dividends.values.filter_map { |entry| parse_dividend_entry(entry) }
222
+ entries.sort_by { |d| d[:date] }
223
+ end
224
+
225
+ def parse_dividend_entry(entry)
226
+ date = parse_unix_date(entry["date"])
227
+ amount = entry["amount"]
228
+ return unless date && amount&.positive?
229
+
230
+ { date: date, amount: amount.round(4) }
231
+ end
232
+
172
233
  def fetch_from_cache(key)
173
234
  cached_entry = @cache[key]
174
235
  return unless cached_entry && Time.now - cached_entry[:timestamp] < CACHE_TTL
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module YahooFinanceClient
4
- VERSION = "0.3.1"
4
+ VERSION = "0.4.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yahoo_finance_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Francesc Leveque