class GerbilCharts::Models::RoundTimeRange
rounded time range - Rounds the max to a nice preset
This class allows for labels at clean intervals instead of "Jan 17 2008 11:27:92"
Attributes
ldelta[R]
rdelta[R]
Public Class Methods
new(raw_range)
click to toggle source
given a raw range, we calculate a round range
Calls superclass method
GerbilCharts::Models::RawRange::new
# File lib/gerbilcharts/models/round_time_range.rb, line 18 def initialize(raw_range) super() @rdelta,@ldelta=round_delta(raw_range.delta) @rmin=raw_range.rmin # this can be rdelta or ldelta for wider or tighter #@rmax=round_max(raw_range.rmax,@rdelta) @rmax=round_max(raw_range.rmax,@ldelta) end
Public Instance Methods
each_label() { |v, format_timeval(v,rdelta)| ... }
click to toggle source
provide labels
Yields two items (value - seconds since Jan 1 1970, string label)
# File lib/gerbilcharts/models/round_time_range.rb, line 30 def each_label raise "Range not aligned with presets (call round range first)" if not @ldelta return if @ldelta == 0 v = get_label_start_time while (v<=@rmax) do yield v, format_timeval(v,@rdelta) v = v+@ldelta end end
each_tick(tpl) { |v| ... }
click to toggle source
provide ticks (per label interval) note the tpl is not used !
# File lib/gerbilcharts/models/round_time_range.rb, line 46 def each_tick(tpl) raise "Range not aligned with presets (call round range first)" if not @ldelta return if @ldelta == 0 subtick_delta = ideal_subtick_interval(@ldelta) v = get_label_start_time while (v<=@rmax) do yield v v = v+subtick_delta end end
format_min_value()
click to toggle source
format min value completely
# File lib/gerbilcharts/models/round_time_range.rb, line 63 def format_min_value t = Time.at(@rmin).getlocal return t.to_s end
Private Instance Methods
get_label_start_time()
click to toggle source
# File lib/gerbilcharts/models/round_time_range.rb, line 117 def get_label_start_time # if labeling hours, make sure you account tz weirdness like india GMT +5:30 if @ldelta >= 86400 v = Time.mktime(@rmin.year, @rmin.month, @rmin.day, 0,0,0,0) + 86400 elsif tbase = Time.mktime(@rmin.year, @rmin.month, @rmin.day,0,0,0,0) sec_inc = @rmin.tv_sec - tbase.tv_sec v = Time.at( tbase.tv_sec + @ldelta*(sec_inc/@ldelta).ceil) end return v end
ideal_subtick_interval(label_interval)
click to toggle source
ideal subticks
You dont want to do a fixed subdivision of a time interval will be ugly Eg. 10x of 2 hours will be 12 min ticks = FAIL
# File lib/gerbilcharts/models/round_time_range.rb, line 102 def ideal_subtick_interval(label_interval) case label_interval when (0..1*MINUTE); return 10 when (1*MINUTE..5*MINUTE); return 1*MINUTE when (5*MINUTE..15*MINUTE); return 3*MINUTE when (15*MINUTE..1*HOUR); return 5*MINUTE when (1*HOUR..2*HOUR); return 15*MINUTE when (2*HOUR..6*HOUR); return 30*MINUTE when (6*HOUR..12*HOUR); return 1*HOUR when (12*HOUR..1*DAY); return 3*HOUR else; return 1*DAY end end
round_delta(raw_delta)
click to toggle source
rounded delta time
# File lib/gerbilcharts/models/round_time_range.rb, line 83 def round_delta(raw_delta) last_pre=1 last_lab=1 if raw_delta > TIMEPRESETS.last[0] return raw_delta,raw_delta/10 else TIMEPRESETS.reverse_each do |pre| break if pre[0] < raw_delta last_pre=pre[0] last_lab=pre[1] end end return last_pre,last_lab end
round_max(raw, interval)
click to toggle source
round_max
(ceiling)
# File lib/gerbilcharts/models/round_time_range.rb, line 70 def round_max(raw, interval) return raw if interval == 0 ni_secs = (raw.tv_sec+interval)/interval return Time.at(interval * ni_secs.to_i) end
round_min(raw, interval)
click to toggle source
round_min
(floor)
# File lib/gerbilcharts/models/round_time_range.rb, line 77 def round_min(raw, interval) ni_secs = (raw.tv_sec-interval)/interval return Time.at(interval * ni_secs.to_i ) end