Sha256: b3b4b6b11df9877406b4e06b9f5f5eed07da57e17ca04369c8972468407491d1

Contents?: true

Size: 1.33 KB

Versions: 1

Compression:

Stored size: 1.33 KB

Contents

module Patterns
  class Ruleset
    class EmptyRuleset < StandardError; end

    class << self
      attr_accessor :rule_names
    end

    def self.rules
      (rule_names || []).map do |rule_name|
        rule_name.to_s.classify.constantize
      end
    end

    def self.add_rule(rule_name)
      self.rule_names ||= []
      self.rule_names << rule_name.to_sym
      self
    end

    def initialize(subject = nil)
      raise EmptyRuleset if self.class.rules.empty?

      @rules = self.class.rules.map { |rule| rule.new(subject) }
    end

    def satisfied?(force: false)
      rules.all? do |rule|
        rule.satisfied? ||
          rule.not_applicable? ||
          (force && rule.forceable?)
      end
    end

    def not_satisfied?
      !satisfied?
    end

    def applicable?
      !not_applicable?
    end

    def not_applicable?
      rules.all?(&:not_applicable?)
    end

    def forceable?
      rules.all? do |rule|
        rule.forceable? ||
          rule.not_applicable? ||
          rule.satisfied?
      end
    end

    def each(&block)
      return enum_for(:each) unless block_given?

      rules.each do |rule_or_ruleset|
        if rule_or_ruleset.is_a?(Ruleset)
          rule_or_ruleset.each(&block)
        else
          yield rule_or_ruleset
        end
      end
    end

    private

    attr_reader :rules
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rails-patterns-0.10.0 lib/patterns/ruleset.rb