moduleChronicclassRepeaterDayPortion<Repeater#:nodoc:PORTIONS={:am=>0..(12*60*60-1),:pm=>(12*60*60)..(24*60*60-1),:morning=>(6*60*60)..(12*60*60),# 6am-12am,:afternoon=>(13*60*60)..(17*60*60),# 1pm-5pm,:evening=>(17*60*60)..(20*60*60),# 5pm-8pm,:night=>(20*60*60)..(24*60*60),# 8pm-12pm}definitialize(type,options={})super@current_span=niliftype.kind_of?Integer@range=(@type*60*60)..((@type+12)*60*60)else@range=PORTIONS[type]@range||raise("Invalid type '#{type}' for RepeaterDayPortion")end@range||raise("Range should have been set by now")enddefnext(pointer)superunless@current_spannow_seconds=@now-Chronic.construct(@now.year,@now.month,@now.day)ifnow_seconds<@range.begincasepointerwhen:futurerange_start=Chronic.construct(@now.year,@now.month,@now.day)+@range.beginwhen:pastrange_start=Chronic.construct(@now.year,@now.month,@now.day-1)+@range.beginendelsifnow_seconds>@range.endcasepointerwhen:futurerange_start=Chronic.construct(@now.year,@now.month,@now.day+1)+@range.beginwhen:pastrange_start=Chronic.construct(@now.year,@now.month,@now.day)+@range.beginendelsecasepointerwhen:futurerange_start=Chronic.construct(@now.year,@now.month,@now.day+1)+@range.beginwhen:pastrange_start=Chronic.construct(@now.year,@now.month,@now.day-1)+@range.beginendendoffset=(@range.end-@range.begin)range_end=construct_date_from_reference_and_offset(range_start,offset)@current_span=Span.new(range_start,range_end)elsedays_to_shift_window=casepointerwhen:future1when:past-1endnew_begin=Chronic.construct(@current_span.begin.year,@current_span.begin.month,@current_span.begin.day+days_to_shift_window,@current_span.begin.hour,@current_span.begin.min,@current_span.begin.sec)new_end=Chronic.construct(@current_span.end.year,@current_span.end.month,@current_span.end.day+days_to_shift_window,@current_span.end.hour,@current_span.end.min,@current_span.end.sec)@current_span=Span.new(new_begin,new_end)endenddefthis(context=:future)superrange_start=Chronic.construct(@now.year,@now.month,@now.day)+@range.beginrange_end=construct_date_from_reference_and_offset(range_start)@current_span=Span.new(range_start,range_end)enddefoffset(span,amount,pointer)@now=span.beginportion_span=self.next(pointer)direction=pointer==:future?1:-1portion_span+(direction*(amount-1)*RepeaterDay::DAY_SECONDS)enddefwidth@range||raise("Range has not been set")return@current_span.widthif@current_spanif@type.kind_of?Integerreturn(12*60*60)else@range.end-@range.beginendenddefto_ssuper<<'-dayportion-'<<@type.to_sendprivatedefconstruct_date_from_reference_and_offset(reference,offset=nil)elapsed_seconds_for_range=offset||(@range.end-@range.begin)second_hand=((elapsed_seconds_for_range-(12*60)))%60minute_hand=(elapsed_seconds_for_range-second_hand)/(60)%60hour_hand=(elapsed_seconds_for_range-minute_hand-second_hand)/(60*60)+reference.hour%24Chronic.construct(reference.year,reference.month,reference.day,hour_hand,minute_hand,second_hand)endendend