class Noteikumi::Rules

A collection of rules with various methods to load and find rules

Attributes

logger[R]

The logger @api private @return [Logger]

rules[R]

The loaded rules @return [Array<Rule>]

Public Class Methods

new(rules_dir, logger) click to toggle source

Creates a rule collection

@param rules_dir [Array<String>,String] a directory or list of directories to look for rules in @param logger [Logger] a logger to use @return Rules

# File lib/noteikumi/rules.rb, line 18
def initialize(rules_dir, logger)
  @rules = []
  @logger = logger
  @rules_dir = Array(rules_dir)
end

Public Instance Methods

<<(rule) click to toggle source

Append a rule to the collection

@param rule [Rule] @return [Rule]

# File lib/noteikumi/rules.rb, line 58
def <<(rule)
  @rules << rule
end
by_priority() click to toggle source

Return the rule ordered by priority

@return [Array<Rule>]

# File lib/noteikumi/rules.rb, line 35
def by_priority
  @rules.sort_by(&:priority)
end
count()
Alias for: size
empty?() click to toggle source

Determines if any rules are loaded

@return [Boolean]

# File lib/noteikumi/rules.rb, line 50
def empty?
  @rules.empty?
end
find_rules(directory) click to toggle source

Find all rules in a given directory

Valid rules have names ending in __rule.rb_

@param directory [String] the directory to look in @return [Array<String>] list of rule names

# File lib/noteikumi/rules.rb, line 112
def find_rules(directory)
  if File.directory?(directory)
    Dir.entries(directory).grep(/_rule.rb$/)
  else
    @logger.debug("Could not find directory %s while looking for rules" % directory)
    []
  end
end
load_rule(file) click to toggle source

Load a rule from a file

@param file [String] the file to load the rule from @return [Rule]

# File lib/noteikumi/rules.rb, line 73
def load_rule(file)
  raise("The rule %s is not readable" % file) unless File.readable?(file)

  body = File.read(file)

  clean = Object.new
  rule = clean.instance_eval(body, file, 1)

  rule.file = file
  rule.logger = @logger

  logger.debug("Loaded rule %s from %s" % [rule.name, file])

  rule
end
load_rules() click to toggle source

Load all the rules from the configured paths

@return [void]

# File lib/noteikumi/rules.rb, line 92
def load_rules
  @rules_dir.each do |directory|
    find_rules(directory).each do |rule|
      rule = load_rule(File.join(directory, rule))

      if rule_names.include?(rule.name)
        raise("Already have a rule called %s, cannot load another" % rule.name)
      end

      self << rule
    end
  end
end
rule_names() click to toggle source

Get the names of all the rules

@return [Array<String,Symbol>]

# File lib/noteikumi/rules.rb, line 65
def rule_names
  @rules.map(&:name)
end
select(&blk) click to toggle source

Use a block to select rules out of the overall set

@param blk [Proc] logic to use when selecting rules @return [Array<Rule>]

# File lib/noteikumi/rules.rb, line 28
def select(&blk)
  @rules.select(&blk)
end
size() click to toggle source

The amont of rules loaded

@return [Fixnum]

# File lib/noteikumi/rules.rb, line 42
def size
  @rules.size
end
Also aliased as: count