From 282e20e70256d737f2f80112ad294c051297c3a9 Mon Sep 17 00:00:00 2001 From: Zach Gollwitzer Date: Thu, 10 Oct 2024 17:46:22 -0400 Subject: [PATCH 1/2] Handle market holidays during holding sync --- Gemfile | 1 + Gemfile.lock | 2 ++ app/models/gapfiller.rb | 6 +++++- app/models/security/price/provided.rb | 12 +++++++----- config/initializers/holidays.rb | 3 +++ config/market_holiday_overrides.yml | 8 ++++++++ 6 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 config/initializers/holidays.rb create mode 100644 config/market_holiday_overrides.yml diff --git a/Gemfile b/Gemfile index 9c97c3e9..cdb9fca0 100644 --- a/Gemfile +++ b/Gemfile @@ -48,6 +48,7 @@ gem "csv" gem "redcarpet" gem "stripe" gem "intercom-rails" +gem "holidays" group :development, :test do gem "debug", platforms: %i[mri windows] diff --git a/Gemfile.lock b/Gemfile.lock index 81a4b742..155b548a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -183,6 +183,7 @@ GEM thor (>= 1.0.0) hashdiff (1.1.1) highline (3.0.1) + holidays (8.8.0) hotwire-livereload (1.4.1) actioncable (>= 6.0.0) listen (>= 3.0.0) @@ -486,6 +487,7 @@ DEPENDENCIES faraday-multipart faraday-retry good_job + holidays hotwire-livereload i18n-tasks image_processing (>= 1.2) diff --git a/app/models/gapfiller.rb b/app/models/gapfiller.rb index a7870c1b..16413f21 100644 --- a/app/models/gapfiller.rb +++ b/app/models/gapfiller.rb @@ -32,7 +32,11 @@ class Gapfiller attr_reader :date_range, :cache def should_gapfill?(date, record) - date.on_weekend? && record.nil? + (date.on_weekend? || holiday?(date)) && record.nil? + end + + def holiday?(date) + Holidays.on(date, :federalreserve, :market_overrides).any? end def create_gapfilled_record(prev_record, date) diff --git a/app/models/security/price/provided.rb b/app/models/security/price/provided.rb index 1523cba8..599f19ff 100644 --- a/app/models/security/price/provided.rb +++ b/app/models/security/price/provided.rb @@ -38,13 +38,15 @@ module Security::Price::Provided if response.success? response.prices.map do |price| - new_price = Security::Price.new \ + new_price = Security::Price.find_or_initialize_by( ticker: ticker, - date: price[:date], - price: price[:price], - currency: price[:currency] + date: price[:date] + ) do |p| + p.price = price[:price] + p.currency = price[:currency] + end - new_price.save! if cache + new_price.save! if cache && new_price.new_record? new_price end else diff --git a/config/initializers/holidays.rb b/config/initializers/holidays.rb new file mode 100644 index 00000000..f03a8cb7 --- /dev/null +++ b/config/initializers/holidays.rb @@ -0,0 +1,3 @@ +Holidays.load_custom( + Rails.root.join("config", "market_holiday_overrides.yml") +) diff --git a/config/market_holiday_overrides.yml b/config/market_holiday_overrides.yml new file mode 100644 index 00000000..c5e54766 --- /dev/null +++ b/config/market_holiday_overrides.yml @@ -0,0 +1,8 @@ +# Market Holiday Overrides (for those not covered by the :federalreserve region) +months: + 3: + - name: Good Friday + regions: [market_overrides] + mday: 29 + year_ranges: + limited: [2024] -- 2.53.0 From 8479a2f39f20ee29d044018ce50717dd29bda2c4 Mon Sep 17 00:00:00 2001 From: Zach Gollwitzer Date: Thu, 10 Oct 2024 17:57:11 -0400 Subject: [PATCH 2/2] Use informal holidays instead of custom override --- app/models/gapfiller.rb | 2 +- config/initializers/holidays.rb | 3 --- config/market_holiday_overrides.yml | 8 -------- 3 files changed, 1 insertion(+), 12 deletions(-) delete mode 100644 config/initializers/holidays.rb delete mode 100644 config/market_holiday_overrides.yml diff --git a/app/models/gapfiller.rb b/app/models/gapfiller.rb index 16413f21..ba8a57f4 100644 --- a/app/models/gapfiller.rb +++ b/app/models/gapfiller.rb @@ -36,7 +36,7 @@ class Gapfiller end def holiday?(date) - Holidays.on(date, :federalreserve, :market_overrides).any? + Holidays.on(date, :federalreserve, :us, :informal).any? end def create_gapfilled_record(prev_record, date) diff --git a/config/initializers/holidays.rb b/config/initializers/holidays.rb deleted file mode 100644 index f03a8cb7..00000000 --- a/config/initializers/holidays.rb +++ /dev/null @@ -1,3 +0,0 @@ -Holidays.load_custom( - Rails.root.join("config", "market_holiday_overrides.yml") -) diff --git a/config/market_holiday_overrides.yml b/config/market_holiday_overrides.yml deleted file mode 100644 index c5e54766..00000000 --- a/config/market_holiday_overrides.yml +++ /dev/null @@ -1,8 +0,0 @@ -# Market Holiday Overrides (for those not covered by the :federalreserve region) -months: - 3: - - name: Good Friday - regions: [market_overrides] - mday: 29 - year_ranges: - limited: [2024] -- 2.53.0