Class: Periodic::Duration::Duration
- Inherits:
-
Object
- Object
- Periodic::Duration::Duration
- Defined in:
- lib/periodic/duration.rb
Instance Method Summary collapse
- #format(format = '%y:%d:%h:%m:%s', precision = nil) ⇒ Object
-
#initialize(seconds) ⇒ Duration
constructor
A new instance of Duration.
Constructor Details
#initialize(seconds) ⇒ Duration
Returns a new instance of Duration.
47 48 49 |
# File 'lib/periodic/duration.rb', line 47 def initialize(seconds) @seconds = (seconds.is_a?(Float) ? seconds.to_f : seconds) end |
Instance Method Details
#format(format = '%y:%d:%h:%m:%s', precision = nil) ⇒ Object
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/periodic/duration.rb', line 51 def format(format = '%y:%d:%h:%m:%s', precision = nil) string, nondirective_units, values, smallest_unit_directive = format, [], Hash.new, nil Periodic::Duration::Units::TIME_ORDER.reverse.each_with_index do |unit, i| if format =~ Periodic::Duration::Units::TIME[unit][:directive] values[unit] = send(unit) + nondirective_units.inject(0) { |total, u| total += (send(u) * (Periodic::Duration::Units::TIME[u][:factor] / Periodic::Duration::Units::TIME[unit][:factor])) } smallest_unit_directive = unit nondirective_units.clear else nondirective_units << unit if (send(unit) > 0) end # correct for any left over time that's is fractional for all the included units values[smallest_unit_directive] += nondirective_units.inject(0) { |total, u| total += (send(u).to_f * Periodic::Duration::Units::TIME[u][:factor] / Periodic::Duration::Units::TIME[smallest_unit_directive][:factor]) } if (!Periodic::Duration::Units::TIME_ORDER.reverse[i+1] && !nondirective_units.empty?) end values[smallest_unit_directive] = case precision when nil then (values[smallest_unit_directive] % 1 == 0) && !@seconds.is_a?(Float) ? values[smallest_unit_directive].to_i : values[smallest_unit_directive] when 0 then values[smallest_unit_directive].to_i else (values[smallest_unit_directive] * (10 ** precision)).round / (10 ** precision).to_f end return Periodic::Duration.sanitize_formatted_string(values.inject(string) { |str, data| str.sub!(Periodic::Duration::Units::TIME[data[0]][:directive], data[1].to_s) }) end |