#-- # Copyright (C) 2006 Dimitrij Denissenko # Please read LICENSE document for more information. #++ class TimeInterval attr_reader :in_seconds UNITS = %w{year month week day hour minute} def initialize(interval_in_seconds) @in_seconds = interval_in_seconds end def self.match(seconds, count_range) diff = nil UNITS.reverse.each do |u| max_seconds_per_unit = in_seconds(count_range.last, u) if max_seconds_per_unit > seconds count_range.each do |c| seconds_per_unit = in_seconds(c, u) if seconds_per_unit > seconds return [c-1, Inflector.pluralize(u)] end end end end return [60, 'years'] end def self.in_seconds(count, unit) eval("#{count}." + Inflector.pluralize(unit)) end def humanize c = count.round.abs u = c > 1 ? units : unit count > 0 ? "in #{c} #{u}" : "#{c} #{u} ago" end def count to_a[0] end def unit to_a[1] end def units Inflector.pluralize(unit) end def to_a UNITS.each do |u| seconds_per_unit = eval("1." + Inflector.pluralize(u)) return [(in_seconds.to_f / seconds_per_unit), u] if in_seconds.abs > seconds_per_unit end return [1, 'minute'] end end