2024-02-22 11:35:06 -05:00
|
|
|
class Period
|
2024-08-23 10:06:24 -04:00
|
|
|
attr_reader :name, :date_range
|
2024-02-22 11:35:06 -05:00
|
|
|
|
2024-08-23 10:06:24 -04:00
|
|
|
def self.find_by_name(name)
|
|
|
|
INDEX[name]
|
|
|
|
end
|
2024-02-22 11:35:06 -05:00
|
|
|
|
2024-08-23 10:06:24 -04:00
|
|
|
def self.names
|
|
|
|
INDEX.keys.sort
|
|
|
|
end
|
2024-02-22 11:35:06 -05:00
|
|
|
|
2024-08-23 10:06:24 -04:00
|
|
|
def initialize(name: "custom", date_range:)
|
|
|
|
@name = name
|
|
|
|
@date_range = date_range
|
|
|
|
end
|
2024-02-22 11:35:06 -05:00
|
|
|
|
2024-08-23 10:06:24 -04:00
|
|
|
def extend_backward(duration)
|
|
|
|
Period.new(name: name + "_extended", date_range: (date_range.first - duration)..date_range.last)
|
|
|
|
end
|
2024-04-24 13:34:50 +01:00
|
|
|
|
2024-08-23 10:06:24 -04:00
|
|
|
BUILTIN = [
|
|
|
|
new(name: "all", date_range: nil..Date.current),
|
|
|
|
new(name: "last_7_days", date_range: 7.days.ago.to_date..Date.current),
|
|
|
|
new(name: "last_30_days", date_range: 30.days.ago.to_date..Date.current),
|
|
|
|
new(name: "last_365_days", date_range: 365.days.ago.to_date..Date.current)
|
|
|
|
]
|
2024-02-22 11:35:06 -05:00
|
|
|
|
2024-08-23 10:06:24 -04:00
|
|
|
INDEX = BUILTIN.index_by(&:name)
|
2024-03-06 09:56:59 -05:00
|
|
|
|
2024-08-23 10:06:24 -04:00
|
|
|
BUILTIN.each do |period|
|
|
|
|
define_singleton_method(period.name) do
|
|
|
|
period
|
2024-03-06 09:56:59 -05:00
|
|
|
end
|
2024-08-23 10:06:24 -04:00
|
|
|
end
|
2024-02-22 11:35:06 -05:00
|
|
|
end
|