Module: Sekki24::ZassetsuCalendar
- Defined in:
- lib/sekki24/zassetsu_calendar.rb
Constant Summary collapse
- NAMES =
{ winter_doyo: ["冬土用", "ふゆどよう"], setsubun: ["節分", "せつぶん"], spring_higan: ["春彼岸", "はるひがん"], spring_shanichi: ["春社日", "はるしゃにち"], spring_doyo: ["春土用", "はるどよう"], hachijuhachiya: ["八十八夜", "はちじゅうはちや"], nyubai: ["入梅", "にゅうばい"], hangesho: ["半夏生", "はんげしょう"], summer_doyo: ["夏土用", "なつどよう"], nihyakutoka: ["二百十日", "にひゃくとおか"], nihyakuhatsuka: ["二百二十日", "にひゃくはつか"], autumn_higan: ["秋彼岸", "あきひがん"], autumn_shanichi: ["秋社日", "あきしゃにち"], autumn_doyo: ["秋土用", "あきどよう"] }.transform_values(&:freeze).freeze
- SOLAR_EVENTS =
{ winter_doyo: 297, spring_doyo: 27, nyubai: 80, hangesho: 100, summer_doyo: 117, autumn_doyo: 207 }.freeze
Class Method Summary collapse
- .active(date, tz:, precision:) ⇒ Object
- .clear_cache! ⇒ Object
- .fetch(year, key, tz:, precision:) ⇒ Object
- .on(date, tz:, precision:) ⇒ Object
- .year(year, tz:, precision:) ⇒ Object
Class Method Details
.active(date, tz:, precision:) ⇒ Object
64 65 66 67 68 69 |
# File 'lib/sekki24/zassetsu_calendar.rb', line 64 def active(date, tz:, precision:) raise TypeError, "expected Date or Time, got #{date.class}" unless date.is_a?(Date) || date.is_a?(Time) local_date = date.is_a?(Time) ? TimeScale.localize(date, tz).to_date : date year(local_date.year, tz: tz, precision: precision).select { |entry| entry.include?(local_date) }.freeze end |
.clear_cache! ⇒ Object
71 72 73 |
# File 'lib/sekki24/zassetsu_calendar.rb', line 71 def clear_cache! @cache_mutex.synchronize { @year_cache.clear } end |
.fetch(year, key, tz:, precision:) ⇒ Object
49 50 51 52 53 54 55 56 |
# File 'lib/sekki24/zassetsu_calendar.rb', line 49 def fetch(year, key, tz:, precision:) normalized = key.to_sym raise ArgumentError, "unknown zassetsu: #{key.inspect}" unless NAMES.key?(normalized) self.year(year, tz: tz, precision: precision).find { |entry| entry.key == normalized } rescue NoMethodError raise ArgumentError, "unknown zassetsu: #{key.inspect}" end |
.on(date, tz:, precision:) ⇒ Object
58 59 60 61 62 |
# File 'lib/sekki24/zassetsu_calendar.rb', line 58 def on(date, tz:, precision:) raise TypeError, "expected Date, got #{date.class}" unless date.is_a?(Date) year(date.year, tz: tz, precision: precision).select { |entry| entry.date == date }.freeze end |
.year(year, tz:, precision:) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/sekki24/zassetsu_calendar.rb', line 37 def year(year, tz:, precision:) calendar_year = validate_year(year) mode = normalize_precision(precision) solar = Solar.model(mode) cache_key = [calendar_year, TimeScale.timezone_key(tz), mode].freeze cached = @cache_mutex.synchronize { @year_cache[cache_key] } return cached if cached calculated = calculate_year(calendar_year, tz, mode, solar).sort.freeze @cache_mutex.synchronize { @year_cache[cache_key] ||= calculated } end |