class Rulebow::System

Constants

RULEBOOK_GLOB

Attributes

digests[R]

Digests [Hash]

root[R]

Project’s root directory. [String]

rulesets[R]

Rulesets indexed by name. [Hash]

session[R]

Session variables. [Hash]

Public Class Methods

new(options={}) click to toggle source

Initialize new System instance.

# File lib/rulebow/system.rb, line 18
def initialize(options={})
  extend self
  extend ShellUtils

  @root   = options[:root]   || Dir.pwd
  @ignore = options[:ignore] || [] #Ignore.new

  @rulebook   = options[:rulebook]
  @state_file = options[:statefile]

  @session = OpenStruct.new

  @scripts  = []
  @rules    = []
  #@facts    = []

  @digests  = {}
  @rulesets = {}

  import(*rulebook)
end

Public Instance Methods

home() click to toggle source

Home directory.

Returns [String]

# File lib/rulebow/system.rb, line 131
def home
  @home ||= File.expand_path('~')
end
ignore(*globs) click to toggle source

Add paths to be ignored in file rules.

globs - List of file globs. [Array<String>]

Returns [Array<String>]

# File lib/rulebow/system.rb, line 108
def ignore(*globs)
  @ignore.concat(globs) unless globs.empty?
  @ignore
end
ignore!(*globs) click to toggle source

Replace globs in ignore list.

globs - List of file globs. [Array<String>]

Returns [Array<String>]

# File lib/rulebow/system.rb, line 118
def ignore!(*globs)
  @ignore.replace(globs)
  @ignore
end
import(*globs) click to toggle source

Import from another file, or glob of files, relative to project root.

TODO: Should importing be relative to the importing file?

Returns nothing.

# File lib/rulebow/system.rb, line 88
def import(*globs)
  globs.each do |glob|
    #if File.relative?(glob)
    #  dir = Dir.pwd  #session.root #File.dirname(caller[0])
    #  glob = File.join(dir, glob)
    #end
    Dir[glob].each do |file|
      next unless File.file?(file)  # add warning
      next if @scripts.include?(file)
      @scripts << file
      module_eval(File.read(file), file)
    end
  end
end
inspect() click to toggle source
# File lib/rulebow/system.rb, line 124
def inspect
  "#<Rulebow::System>"
end
rulebook() click to toggle source

Rulebook file.

# File lib/rulebow/system.rb, line 53
def rulebook
  @rulebook ||= Dir[File.join(root, RULEBOOK_GLOB)].first
end
ruleset(name_and_chain, &block) click to toggle source

Rulesets provide a separate space for rules which are only run when the ruleset name is specifically given.

Return [Ruleset]

# File lib/rulebow/system.rb, line 71
def ruleset(name_and_chain, &block)
  name, chain = parse_ruleset_name(name_and_chain)
  if @rulesets.key?(name)
    ruleset = @rulesets[name]
    ruleset.update(chain, &block)
  else
    ruleset = Ruleset.new(self, name_and_chain, &block)
    @rulesets[name] = ruleset
  end
  ruleset
end
state_file() click to toggle source

State file.

# File lib/rulebow/system.rb, line 58
def state_file
  @state_file ||= rulebook.chomp('.rb') + '.state'
end

Private Instance Methods

parse_ruleset_name(name) click to toggle source

Parse out a ruleset’s name from it’s ruleset dependencies.

Returns [Array]

# File lib/rulebow/system.rb, line 140
def parse_ruleset_name(name)
  if Hash === name
    raise ArgumentError if name.size > 1       
    list = [name.values].flatten.map{ |b| b.to_sym }
    name = name.keys.first
  else
    list = []
  end
  return name.to_sym, list
end