class Rulebow::Runner

Runner is the main class which controls execution.

Constants

RULEBOOK_GLOB

Public Class Methods

new(options={}) click to toggle source

Initialize new Runner instance.

Returns nothing.

# File lib/rulebow/runner.rb, line 12
def initialize(options={})
  self.ignore = options[:ignore]

  self.trial  = options[:trial]
  self.fresh  = options[:fresh]
  self.watch  = options[:watch]

  if options[:system]
    @system = options[:system]
    @root   = @system.root
  else
    locate_root
    @system = System.new(:root=>root)
  end
end

Public Instance Methods

fresh=(boolean) click to toggle source

Set whether to nullify digest and make a fresh run.

Returns [Boolean]

# File lib/rulebow/runner.rb, line 108
def fresh=(boolean)
  @fresh = !! boolean
end
fresh?() click to toggle source

Nullify digest and make a fresh run?

Returns [Boolean]

# File lib/rulebow/runner.rb, line 101
def fresh?
  @fresh
end
home() click to toggle source

Home directory.

Returns [String]

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

File globs to ignore.

Returns [Ignore] instance.

# File lib/rulebow/runner.rb, line 169
def ignore
  @ignore ||= []
end
ignore=(list) click to toggle source

Set ignore.

# File lib/rulebow/runner.rb, line 174
def ignore=(list)
  @ignore = list.to_a.flatten
end
locate_root() click to toggle source

Locate project root. This method ascends up the file system starting as the current working directory looking for a ‘Rulebook` file. When found, the directory in which it is found is returned as the root.

# File lib/rulebow/runner.rb, line 38
def locate_root
  d = Dir.pwd
  while d != home && d != '/'
    f = Dir.glob(File.join(d, RULEBOOK_GLOB)).first
    if f
      @root = d
      break
    end
    d = File.dirname(d)
  end
  raise(RootError, "cannot locate project root") unless @root
  @root
end
root() click to toggle source

Project’s root directory.

Returns [String]

# File lib/rulebow/runner.rb, line 31
def root
  @root
end
rules() click to toggle source

List of rules from the system.

Returns [Array<Rule>]

# File lib/rulebow/runner.rb, line 181
def rules
  system.rules
end
rulesets() click to toggle source
# File lib/rulebow/runner.rb, line 155
def rulesets
  system.rulesets
end
run(name) click to toggle source

Run rules.

Returns nothing.

# File lib/rulebow/runner.rb, line 188
def run(name)
  name = (name || :default).to_sym

  if watch
    autorun(name)
  else
    monorun(name)
  end
end
system() click to toggle source

Instance of {Rulebow::System}.

Returns [System]

# File lib/rulebow/runner.rb, line 141
def system
  @system #||= System.new(script)
end
trial=(bool) click to toggle source

Set trial run mode.

Arguments

bool - Flag for trial mode. [Boolean]

Returns ‘bool` flag. [Boolean]

# File lib/rulebow/runner.rb, line 127
def trial=(bool)
  @trial = !!bool
end
trial?() click to toggle source

Is this trial-run only?

TODO: Trial mode is not implemented yet!

Returns [Boolean]

# File lib/rulebow/runner.rb, line 117
def trial?
  @trial
end
watch() click to toggle source

Watch period, default is every 5 minutes.

Returns [Fixnum]

# File lib/rulebow/runner.rb, line 77
def watch
  @watch
end
watch=(seconds) click to toggle source

Set watch seconds. Minimum watch time is 1 second. Setting watch before calling run creates a simple loop. It can eat up CPU cycles so use it wisely. A watch time of 4 seconds is a good time period. If you are patient go for 15 seconds or more.

Returns [Fixnum,nil]

# File lib/rulebow/runner.rb, line 88
def watch=(seconds)
  if seconds
    seconds = seconds.to_i
    seconds = 1 if seconds < 1
    @watch = seconds
  else
    @watch = nil 
  end
end

Private Instance Methods

autorun(name) click to toggle source

Run rules periodically.

Returns nothing.

# File lib/rulebow/runner.rb, line 213
def autorun(name)
  Dir.chdir(root) do
    fresh_digest(name) if fresh?

    trap("INT") { puts "\nBows down."; exit }

    puts "    (        RULEBOW "
    puts "     \\       (pid #{Process.pid})"
    puts "      )      "
    puts " ##--------> "
    puts "      )      "
    puts "     /       "
    puts "    (        "

    loop do
      run_ruleset(name)
      sleep(watch)
    end
  end
end
build_chain(ruleset, chain=[]) click to toggle source
# File lib/rulebow/runner.rb, line 326
def build_chain(ruleset, chain=[])
  ruleset.chain.each do |name|
    verify_ruleset!(name)
    build_chain(rulesets[name], chain)
  end
  chain << ruleset
  return chain
end
digest() click to toggle source

Instance of Digest for this system.

# File lib/rulebow/runner.rb, line 290
def digest
  @digest ||= Digest.new(system)
end
fresh_digest(name) click to toggle source

Start with a clean slate by removing the digest.

Returns nothing.

# File lib/rulebow/runner.rb, line 297
def fresh_digest(name)
  if name
    chain = ruleset_chain(name)
    chain.each do |n|
      digest.remove(n)
    end
  else
    digest.clear_all
  end
end
monorun(name) click to toggle source

Run rules once.

Returns nothing.

# File lib/rulebow/runner.rb, line 203
def monorun(name)
  Dir.chdir(root) do
    fresh_digest(name) if fresh?
    run_ruleset(name)
  end
end
ruleset_chain(name) click to toggle source

Get ruleset instance for a given command.

# File lib/rulebow/runner.rb, line 318
def ruleset_chain(name)
  ruleset = verify_ruleset!(name)
  chain = []
  build_chain(ruleset, chain)
  chain.uniq
end
run_all() click to toggle source

Run all rulesets.

# File lib/rulebow/runner.rb, line 249
def run_all
  run_rules(system)
  digest.clear
  digest.save
end
run_rules(ruleset) click to toggle source

Run set of rules.

Returns nothing.

# File lib/rulebow/runner.rb, line 283
def run_rules(ruleset)
  ruleset.rules.each do |rule|
    rule.apply(digest[ruleset])
  end
end
run_ruleset(name) click to toggle source

Run a specific ruleruleset.

name - Nmae of ruleset. [String].

Returns nothing.

# File lib/rulebow/runner.rb, line 239
def run_ruleset(name)
  rulesets = ruleset_chain(name)
  rulesets.each do |ruleset|
    run_rules(ruleset)
    digest.save(ruleset)
  end
end
save_digests(*rulesets) click to toggle source

Save digests for given rulesets.

Returns nothing.

# File lib/rulebow/runner.rb, line 311
def save_digests(*rulesets)
  rulesets.each do |name|
    digest.save(name)
  end
end
verify_ruleset!(name) click to toggle source
# File lib/rulebow/runner.rb, line 336
def verify_ruleset!(name)
  name = name.to_sym
  unless rulesets.key?(name)
    raise(ArgumentError, "unknown ruleset name -- #{name}")
  end
  rulesets[name]
end