Sha256: 1ed8d09360ecf85fd7979bce5d67e157752c3239a9f9cbf41f2616a80edbc5a4

Contents?: true

Size: 1.13 KB

Versions: 7

Compression:

Stored size: 1.13 KB

Contents

module Zhong
  class Every
    class FailedToParse < StandardError; end

    EVERY_KEYWORDS = {
      minute: 1.minute,
      hour: 1.hour,
      day: 1.day,
      week: 1.week,
      month: 1.month,
      year: 1.year,
      decade: 10.years
    }.freeze

    def initialize(period)
      @period = period

      raise "`every` must be >= 1 second" unless valid?
    end

    def to_s
      EVERY_KEYWORDS.to_a.reverse.each do |friendly, period|
        next unless @period % period == 0

        rem = @period / period

        return "#{rem} #{friendly}" if rem == 1
        return "#{rem} #{friendly}s"
      end

      "#{@period.to_i} second#{@period.to_i == 1 ? '' : 's'}"
    end

    private def valid?
      @period.to_f >= 1
    end

    def next_at(last = Time.now)
      last + @period
    end

    def self.parse(every)
      case every
      when Numeric, ActiveSupport::Duration
        new(every)
      when String, Symbol
        key = every.downcase.to_sym

        raise FailedToParse, every unless EVERY_KEYWORDS.key?(key)

        new(EVERY_KEYWORDS[key])
      else
        raise FailedToParse, every
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
zhong-0.2.2 lib/zhong/every.rb
zhong-0.2.1 lib/zhong/every.rb
zhong-0.2.0 lib/zhong/every.rb
zhong-0.1.9 lib/zhong/every.rb
zhong-0.1.8 lib/zhong/every.rb
zhong-0.1.7 lib/zhong/every.rb
zhong-0.1.6 lib/zhong/every.rb