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

Class Method Details

.active(date, tz:, precision:) ⇒ Object

Raises:

  • (TypeError)


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

Raises:

  • (TypeError)


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