lib/chronic/repeaters/repeater_month_name.rb



class Chronic::RepeaterMonthName < Chronic::Repeater #:nodoc:
  MONTH_SECONDS = 2_592_000 # 30 * 24 * 60 * 60

  def initialize(type)
    super
    @current_month_begin = nil
  end

  def next(pointer)
    super

    if !@current_month_begin
      target_month = symbol_to_number(@type)
      case pointer
      when :future
        if @now.month < target_month
          @current_month_begin = Time.construct(@now.year, target_month)
        elsif @now.month > target_month
          @current_month_begin = Time.construct(@now.year + 1, target_month)
        end
      when :none
        if @now.month <= target_month
          @current_month_begin = Time.construct(@now.year, target_month)
        elsif @now.month > target_month
          @current_month_begin = Time.construct(@now.year + 1, target_month)
        end
      when :past
        if @now.month > target_month
          @current_month_begin = Time.construct(@now.year, target_month)
        elsif @now.month < target_month
          @current_month_begin = Time.construct(@now.year - 1, target_month)
        end
      end
      @current_month_begin || raise("Current month should be set by now")
    else
      case pointer
      when :future
        @current_month_begin = Time.construct(@current_month_begin.year + 1, @current_month_begin.month)
      when :past
        @current_month_begin = Time.construct(@current_month_begin.year - 1, @current_month_begin.month)
      end
    end

    cur_month_year = @current_month_begin.year
    cur_month_month = @current_month_begin.month

    if cur_month_month == 12
      next_month_year = cur_month_year + 1
      next_month_month = 1
    else
      next_month_year = cur_month_year
      next_month_month = cur_month_month + 1
    end

    Chronic::Span.new(@current_month_begin, Time.construct(next_month_year, next_month_month))
  end

  def this(pointer = :future)
    super

    case pointer
    when :past
      self.next(pointer)
    when :future, :none
      self.next(:none)
    end
  end

  def width
    MONTH_SECONDS
  end

  def index
    symbol_to_number(@type)
  end

  def to_s
    super << '-monthname-' << @type.to_s
  end

  private

  def symbol_to_number(sym)
    lookup = {:january => 1,
              :february => 2,
              :march => 3,
              :april => 4,
              :may => 5,
              :june => 6,
              :july => 7,
              :august => 8,
              :september => 9,
              :october => 10,
              :november => 11,
              :december => 12}
    lookup[sym] || raise("Invalid symbol specified")
  end
end