class Rulebow::Runner
Runner
is the main class which controls execution.
Constants
- RULEBOOK_GLOB
Public Class Methods
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
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
Nullify digest and make a fresh run?
Returns [Boolean]
# File lib/rulebow/runner.rb, line 101 def fresh? @fresh end
Home directory.
Returns [String]
# File lib/rulebow/runner.rb, line 60 def home @home ||= File.expand_path('~') end
File globs to ignore.
Returns [Ignore] instance.
# File lib/rulebow/runner.rb, line 169 def ignore @ignore ||= [] end
Set ignore.
# File lib/rulebow/runner.rb, line 174 def ignore=(list) @ignore = list.to_a.flatten end
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
Project’s root directory.
Returns [String]
# File lib/rulebow/runner.rb, line 31 def root @root end
List of rules from the system.
Returns [Array<Rule>]
# File lib/rulebow/runner.rb, line 181 def rules system.rules end
# File lib/rulebow/runner.rb, line 155 def rulesets system.rulesets end
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
Instance of {Rulebow::System}.
Returns [System]
# File lib/rulebow/runner.rb, line 141 def system @system #||= System.new(script) end
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
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 period, default is every 5 minutes.
Returns [Fixnum]
# File lib/rulebow/runner.rb, line 77 def watch @watch end
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
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
# 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
Instance of Digest
for this system.
# File lib/rulebow/runner.rb, line 290 def digest @digest ||= Digest.new(system) end
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
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
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 rulesets.
# File lib/rulebow/runner.rb, line 249 def run_all run_rules(system) digest.clear digest.save end
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 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 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
# 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