moduleLookoutclassPeriodCollectionclassPeriodattr_reader:param,:label,:rangedefinitialize(param:,label:,range:)@param=param@label=label@range=rangeendenddefself.load_defaultinstance=new{realtime: {label: "Realtime",range: ->{[1.minute.ago]},},day: {label: "Day",range: ->{[Time.current.beginning_of_day,Time.current]},},'7d':{label: "7 Days",range: ->{[7.days.ago,Time.current]},},'30d':{label: "30 Days",range: ->{[30.days.ago,Time.current]},},mtd: {label: "Month-to-date",range: ->{[Time.current.beginning_of_month,Time.current]},},lastmonth: {label: "Last month",range: ->{[1.month.ago.beginning_of_month,1.month.ago.end_of_month]},},ytd: {label: "This year",range: ->{[Time.current.beginning_of_year,Time.current]},},'12mo':{label: "12 months",range: ->{[12.months.ago.to_datetime,Time.current]},},all: {label: "All-time",range: ->{[Date.new(2004,8,1).to_datetime,Time.current]},},}.eachdo|param,options|instance.add(param,options[:label],options[:range])endinstance.default=:'30d'instanceendattr_reader:default,:maxdefinitialize@periods={}@default=nil@max=nilenddefadd(param,label,range_proc)raiseArgumentError,"range must be a proc, or respond to .call"unlessrange_proc.respond_to?(:call)raiseArgumentError,"range.call must return a range or an array"unlessrange_proc.call.is_a?(Range)||range_proc.call.is_a?(Array)@periods[param.to_sym]=Period.new(param: param,label: label,range: range_proc)enddefdelete(param)@periods.delete(param.to_sym)enddefreset@periods={}@default=nilenddefeach(&block)@periods.each(&block)enddeffind(value)@periods[value.try(:to_sym)]enddefall@periodsenddefdefault=(val)@default=val.to_symenddefmax=(amount)@max=amountenddeffor(value)ifvalue.nil?period=@periods[@default]elseperiod=(@periods[value.to_sym]||@periods[@default])endifperiodperiod.range.callelsenilendendendend