Sha256: 8f34cadd8c15922c9fdf689b4e80a98180462f996032558e9ac88798f40773f7

Contents?: true

Size: 868 Bytes

Versions: 2

Compression:

Stored size: 868 Bytes

Contents

# frozen_string_literal: true

# Copied from https://github.com/Shopify/spy/blob/ac7bfb9550bfd7bafd191bc31f1bcd9dc4ce9ee6/lib/spy/duration.rb
# and edited accordingly

require 'active_support/core_ext/module'
require 'active_support/core_ext/integer'

module Duration
  DURATION_FORMAT = %r{
    \A
    (?<days>\d+d)?
    (?<hours>\d+h)?
    (?<minutes>\d+m)?
    (?<seconds>\d+s)?
    \z
  }x
  DURATION_UNITS = {
    's' => :seconds,
    'm' => :minutes,
    'h' => :hours,
    'd' => :days,
  }

  def self.parse(value)
    unless match = DURATION_FORMAT.match(value)
      raise ArgumentError, "not a duration: #{value.inspect}, "\
      "use digits followed by a unit (#{DURATION_UNITS.map { |k, v| "#{k} for #{v}" }.join(', ')})"
    end
    DURATION_UNITS.values.inject(0) do |sum, unit|
      sum + match[unit].to_i.public_send(unit)
    end.seconds
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
doggy-2.1.1 lib/doggy/duration.rb
doggy-2.1.0 lib/doggy/duration.rb