class Noteikumi::Rules
A collection of rules with various methods to load and find rules
Attributes
The logger @api private @return [Logger]
The loaded rules @return [Array<Rule>]
Public Class Methods
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
Append a rule to the collection
@param rule [Rule] @return [Rule]
# File lib/noteikumi/rules.rb, line 58 def <<(rule) @rules << rule end
Return the rule ordered by priority
@return [Array<Rule>]
# File lib/noteikumi/rules.rb, line 35 def by_priority @rules.sort_by(&:priority) end
Determines if any rules are loaded
@return [Boolean]
# File lib/noteikumi/rules.rb, line 50 def empty? @rules.empty? end
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 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 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
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
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
The amont of rules loaded
@return [Fixnum]
# File lib/noteikumi/rules.rb, line 42 def size @rules.size end