milestone_helper.rb (46 lines of code) (raw):
class MilestoneHelper
class << self
def milestones
@milestones ||= [
{ start_date: monday_before(third_thursday(2024, 9)), name: "17.5" },
{ start_date: monday_before(third_thursday(2024, 10)), name: "17.6" },
{ start_date: monday_before(third_thursday(2024, 11)), name: "17.7" },
{ start_date: monday_before(third_thursday(2024, 12)), name: "17.8" },
{ start_date: monday_before(third_thursday(2025, 1)), name: "17.9" },
{ start_date: monday_before(third_thursday(2025, 2)), name: "17.10" },
{ start_date: monday_before(third_thursday(2025, 3)), name: "17.11" },
{ start_date: monday_before(third_thursday(2025, 4)), name: "18.0" },
{ start_date: monday_before(third_thursday(2025, 5)), name: "18.1" },
{ start_date: monday_before(third_thursday(2025, 6)), name: "18.2" },
{ start_date: monday_before(third_thursday(2025, 7)), name: "18.3" },
{ start_date: monday_before(third_thursday(2025, 8)), name: "18.4" },
{ start_date: monday_before(third_thursday(2025, 9)), name: "18.5" },
{ start_date: monday_before(third_thursday(2025, 10)), name: "18.6" },
{ start_date: monday_before(third_thursday(2025, 11)), name: "18.7" },
{ start_date: monday_before(third_thursday(2025, 12)), name: "18.8" },
{ start_date: monday_before(third_thursday(2026, 1)), name: "18.9" },
{ start_date: monday_before(third_thursday(2026, 2)), name: "18.10" },
{ start_date: monday_before(third_thursday(2026, 3)), name: "18.11" }
]
@milestones
end
def previous_milestone(root_day = Date.today)
previous = milestones.reverse.find { |milestone| milestone[:start_date] <= root_day }
previous ? previous[:name] : "X.X"
end
def upcoming_milestone(root_day = Date.today)
upcoming = milestones.find { |milestone| milestone[:start_date] > root_day }
upcoming ? upcoming[:name] : "X.X"
end
# calculate the date of the third thursday of a given month
def third_thursday(year, month)
date = Date.new(year, month, 1)
date += 1 until date.thursday?
date += 14
date
end
# calculate the monday before a given date
def monday_before(date)
date -= 1 until date.monday?
date
end
end
end