Sha256: b28edfcb303fbe3df4ecbb21d823d2955beaaac5330a9b4624a343d0ce8f4f5d

Contents?: true

Size: 1.16 KB

Versions: 1

Compression:

Stored size: 1.16 KB

Contents

module Chrono
  module Fields
    class Base
      attr_reader :source

      def initialize(source)
        @source = source
      end

      def to_a
        if has_multiple_elements?
          fields.map(&:to_a).flatten.uniq.sort
        else
          lower.step(upper, step).to_a.sort
        end
      end

      private

      def range
        raise NotImplementedError
      end

      def interpolated
        source.gsub("*", "#{range.first}-#{range.last}")
      end

      def lower
        @lower ||= match_data[1].to_i
      end

      def upper
        if match_data[2]
          match_data[2].to_i
        else
          lower
        end
      end

      def step
        if match_data[3]
          match_data[3].to_i
        else
          1
        end
      end

      def pattern
        %r<\A(\d+)(?:-(\d+))?(?:/(\d+))?\z>
      end

      def match_data
        @match_data ||= interpolated.match(pattern)
      end

      def elements
        @elements ||= source.split(",")
      end

      def has_multiple_elements?
        elements.size >= 2
      end

      def fields
        elements.map {|element| self.class.new(element) }
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
chrono-0.0.1 lib/chrono/fields/base.rb