Sha256: 8a88ac7ab43d69f7974e545451461996b5c0ac83aab390f6d4e2ea5d32af0c22

Contents?: true

Size: 1.81 KB

Versions: 11

Compression:

Stored size: 1.81 KB

Contents

module DurationExtensions

  # builds a duration object from a string like (but probably shorter than) dd:hh:mm:ss
  # (or any other non-numeral delimiter will work)

  def self.included(base)
    base.class_eval {
      extend ClassMethods
      include InstanceMethods
    }
  end

  module ClassMethods
    def parse(timecode)
      return timecode if timecode.is_a? Numeric
      tokens = timecode.split(/\D+/).map(&:to_i).reverse
      multipliers = [:seconds, :minutes, :hours, :days]
      parts = []
      seconds = tokens.inject(0) {|total, token|
        unit = multipliers.shift
        parts << [unit, token]
        total += token.send(unit)
      }
      new(seconds, parts)
    end
  end
  
  module InstanceMethods
    def timecode
      return '00:00:00' if value == 0
      h = (value/3600).floor;
      m = ((value % 3600)/60).floor;
      s = value % 60;
      sprintf("%d:%02d:%02d", h, m, s)
    end
    alias :to_timecode :timecode
  end
end

module StringExtensions
  def duration
    ActiveSupport::Duration.parse(self).value
  end
  alias :seconds :duration
  
  def looks_like_duration?
    delimiters = Radiant::Config['race_results.delimiters'] || ':,.'
    true if self.match(/^[\d#{Regexp.escape(delimiters)}]+$/)
  end
  
  def -(other)
    if self.looks_like_duration? && other.looks_like_duration?
      (self.seconds - other.seconds).to_timecode
    end
  end
  
  def looks_like_number?
    Float(s) != nil rescue false
  end

  def ordinal
    to_i.ordinal
  end
end

module NumericExtensions
  def ordinal
    to_s + ([[nil, 'st','nd','rd'],[]][self / 10 == 1 && 1 || 0][self % 10] || 'th')
  end
  def to_timecode
    seconds.timecode
  end
  alias :timecode :to_timecode
end

ActiveSupport::Duration.send :include, DurationExtensions
String.send :include, StringExtensions
Numeric.send :include, NumericExtensions

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
radiant-race_results-extension-1.4.6 lib/duration_extensions.rb
radiant-race_results-extension-1.4.5 lib/duration_extensions.rb
radiant-race_results-extension-1.4.3 lib/duration_extensions.rb
radiant-race_results-extension-1.4.0 lib/duration_extensions.rb
radiant-race_results-extension-1.3.6 lib/duration_extensions.rb
radiant-race_results-extension-1.3.5 lib/duration_extensions.rb
radiant-race_results-extension-1.3.4 lib/duration_extensions.rb
radiant-race_results-extension-1.3.3 lib/duration_extensions.rb
radiant-race_results-extension-1.3.2 lib/duration_extensions.rb
radiant-race_results-extension-1.3.1 lib/duration_extensions.rb
radiant-race_results-extension-1.3.0 lib/duration_extensions.rb