Class: Noteikumi::Rules

Inherits:
Object
  • Object
show all
Defined in:
lib/noteikumi/rules.rb

Overview

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(rules_dir, logger) ⇒ Object

Creates a rule collection

Parameters:

  • rules_dir (Array<String>, String)

    a directory or list of directories to look for rules in

  • logger (Logger)

    a logger to use



18
19
20
21
22
# File 'lib/noteikumi/rules.rb', line 18

def initialize(rules_dir, logger)
  @rules = []
  @logger = logger
  @rules_dir = Array(rules_dir)
end

Instance Attribute Details

#loggerLogger (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

The logger

Returns:

  • (Logger)


11
12
13
# File 'lib/noteikumi/rules.rb', line 11

def logger
  @logger
end

#rulesArray<Rule> (readonly)

The loaded rules

Returns:



6
7
8
# File 'lib/noteikumi/rules.rb', line 6

def rules
  @rules
end

Instance Method Details

#<<(rule) ⇒ Rule

Append a rule to the collection

Parameters:

Returns:



58
59
60
# File 'lib/noteikumi/rules.rb', line 58

def <<(rule)
  @rules << rule
end

#by_priorityArray<Rule>

Return the rule ordered by priority

Returns:



35
36
37
# File 'lib/noteikumi/rules.rb', line 35

def by_priority
  @rules.sort_by(&:priority)
end

#empty?Boolean

Determines if any rules are loaded

Returns:

  • (Boolean)


50
51
52
# File 'lib/noteikumi/rules.rb', line 50

def empty?
  @rules.empty?
end

#find_rules(directory) ⇒ Array<String>

Find all rules in a given directory

Valid rules have names ending in _rule.rb

Parameters:

  • directory (String)

    the directory to look in

Returns:

  • (Array<String>)

    list of rule names



112
113
114
115
116
117
118
119
# 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) ⇒ Rule

Load a rule from a file

Parameters:

  • file (String)

    the file to load the rule from

Returns:



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# 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_rulesvoid

This method returns an undefined value.

Load all the rules from the configured paths



92
93
94
95
96
97
98
99
100
101
102
103
104
# 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_namesArray<String,Symbol>

Get the names of all the rules

Returns:

  • (Array<String,Symbol>)


65
66
67
# File 'lib/noteikumi/rules.rb', line 65

def rule_names
  @rules.map(&:name)
end

#select(&blk) ⇒ Array<Rule>

Use a block to select rules out of the overall set

Parameters:

  • blk (Proc)

    logic to use when selecting rules

Returns:



28
29
30
# File 'lib/noteikumi/rules.rb', line 28

def select(&blk)
  @rules.select(&blk)
end

#sizeFixnum Also known as: count

The amont of rules loaded

Returns:

  • (Fixnum)


42
43
44
# File 'lib/noteikumi/rules.rb', line 42

def size
  @rules.size
end