class Duration

Author: Stefano Harding <riddopic@gmail.com> License: Apache License, Version 2.0 Copyright: © 2014-2015 Stefano Harding

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Constants

DAY
HOUR
MINUTE
SECOND
SEGMENTS
WEEK
YEAR

Public Class Methods

[](seconds, *segments) click to toggle source
# File lib/garcon/core_ext/duration.rb, line 32
def self.[](seconds, *segments)
  new(seconds, *segments)
end
new(seconds=0, *segments) click to toggle source
# File lib/garcon/core_ext/duration.rb, line 36
def initialize(seconds=0, *segments)
  @seconds = seconds.to_i
  reset_segments(*segments)
end

Public Instance Methods

*(other) click to toggle source
# File lib/garcon/core_ext/duration.rb, line 135
def *(other)
  self.class.new(@seconds * other.to_i, segments)
end
+(other) click to toggle source
# File lib/garcon/core_ext/duration.rb, line 127
def +(other)
  self.class.new(@seconds + other.to_i, segments)
end
+@() click to toggle source
# File lib/garcon/core_ext/duration.rb, line 188
def +@
  self.class.new(+@seconds)
end
-(other) click to toggle source
# File lib/garcon/core_ext/duration.rb, line 131
def -(other)
  self.class.new(@seconds - other.to_i, segments)
end
-@() click to toggle source
# File lib/garcon/core_ext/duration.rb, line 184
def -@
  self.class.new(-@seconds)
end
/(other) click to toggle source
# File lib/garcon/core_ext/duration.rb, line 139
def /(other)
  self.class.new(@seconds / other.to_i, segments)
end
<=>(other) click to toggle source
# File lib/garcon/core_ext/duration.rb, line 114
def <=>(other)
  @seconds <=> other.to_i
end
==(other) click to toggle source
# File lib/garcon/core_ext/duration.rb, line 106
def ==(other)
  if Duration === other
    other.seconds == seconds
  else
    other == seconds
  end
end
after(time) click to toggle source
# File lib/garcon/core_ext/duration.rb, line 196
def after(time)
  @seconds.after(time)
end
before(time) click to toggle source
# File lib/garcon/core_ext/duration.rb, line 192
def before(time)
  @seconds.before(time)
end
days() click to toggle source
# File lib/garcon/core_ext/duration.rb, line 120
def days    ; to_h[:days]    ; end
hours() click to toggle source
# File lib/garcon/core_ext/duration.rb, line 121
def hours   ; to_h[:hours]   ; end
inspect() click to toggle source
# File lib/garcon/core_ext/duration.rb, line 65
def inspect
  h = to_h
  segments.reverse.collect do |l|
    "#{h[l.to_sym]} #{l}"
  end.join(' ')
end
minutes() click to toggle source
# File lib/garcon/core_ext/duration.rb, line 122
def minutes ; to_h[:minutes] ; end
reset_segments(*segments) click to toggle source
# File lib/garcon/core_ext/duration.rb, line 43
def reset_segments(*segments)
  case segments.size
  when 0
    @segments = [:days, :hours, :minutes, :seconds]
  when 1
    case segments = segments[0]
    when Array
      @segments = segments.collect { |p| (p.to_s.downcase.chomp('s') + 's').to_sym }
      raise ArgumentError unless @segments.all? { |s| SEGMENTS.include?(s) }
    else
      f = SEGMENTS.index(segments)
      @segments = SEGMENTS[f..0]
    end
  when 2
    f = SEGMENTS.index(segments[0])
    t = SEGMENTS.index(segments[1])
    @segments = SEGMENTS[f..t]
  else
    raise ArgumentError
  end
end
seconds() click to toggle source
# File lib/garcon/core_ext/duration.rb, line 123
def seconds ; to_h[:seconds] ; end
segmented(*segments) click to toggle source
# File lib/garcon/core_ext/duration.rb, line 143
def segmented(*segments)
  self.class.new(@seconds, segments)
end
segments() click to toggle source
# File lib/garcon/core_ext/duration.rb, line 41
def segments; @segments; end
strftime(fmt) click to toggle source

Format duration.

Identifiers

%w -- Number of weeks
%d -- Number of days
%h -- Number of hours
%m -- Number of minutes
%s -- Number of seconds
%t -- Total number of seconds
%x -- Duration#to_s
%% -- Literal `%' character

Example

d = Duration.new(:weeks => 10, :days => 7)
=> #<Duration: 11 weeks>
d.strftime("It's been %w weeks!")
=> "It's been 11 weeks!"
# File lib/garcon/core_ext/duration.rb, line 167
def strftime(fmt)
  h = to_h
  hx = {
   'y' => h[:years]  ,
   'w' => h[:weeks]  ,
   'd' => h[:days]   ,
   'h' => h[:hours]  ,
   'm' => h[:minutes],
   's' => h[:seconds],
   't' => total,
   'x' => to_s
  }
  fmt.gsub(/%?%(w|d|h|m|s|t|x)/) do |match|
    hx[match[1..1]]
  end.gsub('%%', '%')
end
to_a() click to toggle source
# File lib/garcon/core_ext/duration.rb, line 77
def to_a
  a, s = [], @seconds
  a[5], s = *s.divmod(YEAR)   if @segments.include?(:years)
  a[4], s = *s.divmod(WEEK)   if @segments.include?(:weeks)
  a[3], s = *s.divmod(DAY)    if @segments.include?(:days)
  a[2], s = *s.divmod(HOUR)   if @segments.include?(:hours)
  a[1], s = *s.divmod(MINUTE) if @segments.include?(:minutes)
  a[0], s = *s.divmod(SECOND) if @segments.include?(:seconds)
  a.compact.reverse
end
to_f() click to toggle source
# File lib/garcon/core_ext/duration.rb, line 73
def to_f ; @seconds.to_f ; end
to_h() click to toggle source
# File lib/garcon/core_ext/duration.rb, line 88
def to_h
  h, s = {}, @seconds
  h[:years],   s = *s.divmod(YEAR)   if @segments.include?(:years)
  h[:weeks],   s = *s.divmod(WEEK)   if @segments.include?(:weeks)
  h[:days],    s = *s.divmod(DAY)    if @segments.include?(:days)
  h[:hours],   s = *s.divmod(HOUR)   if @segments.include?(:hours)
  h[:minutes], s = *s.divmod(MINUTE) if @segments.include?(:minutes)
  h[:seconds], s = *s.divmod(SECOND) if @segments.include?(:seconds)
  h
end
to_i() click to toggle source
# File lib/garcon/core_ext/duration.rb, line 72
def to_i ; @seconds.to_i ; end
to_s() click to toggle source
# File lib/garcon/core_ext/duration.rb, line 99
def to_s
  h = to_h
  segments.reverse.collect do |l|
    "#{h[l.to_sym]} #{l}"
  end.join(' ')
end
total() click to toggle source
# File lib/garcon/core_ext/duration.rb, line 125
def total ; seconds ; end
weeks() click to toggle source
# File lib/garcon/core_ext/duration.rb, line 119
def weeks   ; to_h[:weeks]   ; end
years() click to toggle source
# File lib/garcon/core_ext/duration.rb, line 118
def years   ; to_h[:years]   ; end