Sha256: 006f827b998023f9f6f2c45bdf97c0a04f7bae6f657a4834380ff15d25ad670a

Contents?: true

Size: 1.11 KB

Versions: 6

Compression:

Stored size: 1.11 KB

Contents

# frozen_string_literal: true

module Montrose
  module Rule
    class NthDayOfMonth
      include Montrose::Rule

      def self.apply_options?(opts)
        (opts[:every] == :month || opts[:month]) && opts[:day].is_a?(Hash)
      end

      def self.apply_options(opts)
        opts[:day]
      end

      # Initializes rule
      #
      # @param [Hash] days - valid days of week to month occurrence pairs
      #
      def initialize(days)
        @days = days
      end

      def include?(time)
        @days.key?(time.wday) && nth_day?(time)
      end

      private

      def nth_day?(time)
        expected_occurrences = @days[time.wday]
        nth_day = NthDayMatcher.new(time.wday, MonthDay.new(time))
        expected_occurrences.any? { |n| nth_day.matches?(n) }
      end

      class MonthDay
        def initialize(time)
          @time = time
        end

        def nth_day
          @time.mday
        end

        def first_wday
          @time.beginning_of_month.wday
        end

        def total_days
          ::Montrose::Utils.days_in_month(@time.month, @time.year)
        end
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
montrose-0.18.0 lib/montrose/rule/nth_day_of_month.rb
montrose-0.17.0 lib/montrose/rule/nth_day_of_month.rb
montrose-0.16.0 lib/montrose/rule/nth_day_of_month.rb
montrose-0.15.0 lib/montrose/rule/nth_day_of_month.rb
montrose-0.14.0 lib/montrose/rule/nth_day_of_month.rb
montrose-0.13.0 lib/montrose/rule/nth_day_of_month.rb