Class: Rulebow::System

Inherits:
Module
  • Object
show all
Defined in:
lib/rulebow/system.rb

Constant Summary collapse

RULEBOOK_GLOB =
"{,.,_}{R,r}ulebook{,.rb}"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ System

Initialize new System instance.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 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

Instance Attribute Details

#digestsHash (readonly)

Digests [Hash]

Returns:

  • (Hash)


47
48
49
# File 'lib/rulebow/system.rb', line 47

def digests
  @digests
end

#rootString (readonly)

Project’s root directory. [String]

Returns:

  • (String)


41
42
43
# File 'lib/rulebow/system.rb', line 41

def root
  @root
end

#rulesetsHash (readonly)

Rulesets indexed by name. [Hash]

Returns:

  • (Hash)


50
51
52
# File 'lib/rulebow/system.rb', line 50

def rulesets
  @rulesets
end

#sessionHash (readonly)

Session variables. [Hash]

Returns:

  • (Hash)


44
45
46
# File 'lib/rulebow/system.rb', line 44

def session
  @session
end

Instance Method Details

#homeString

Home directory.

Returns:

  • (String)

    Returns



131
132
133
# File 'lib/rulebow/system.rb', line 131

def home
  @home ||= File.expand_path('~')
end

#ignore(*globs) ⇒ Array<String>

Add paths to be ignored in file rules.

Parameters:

  • globs

    List of file globs. [Array<String>]

Returns:

  • (Array<String>)

    Returns



108
109
110
111
# File 'lib/rulebow/system.rb', line 108

def ignore(*globs)
  @ignore.concat(globs) unless globs.empty?
  @ignore
end

#ignore!(*globs) ⇒ Array<String>

Replace globs in ignore list.

Parameters:

  • globs

    List of file globs. [Array<String>]

Returns:

  • (Array<String>)

    Returns



118
119
120
121
# File 'lib/rulebow/system.rb', line 118

def ignore!(*globs)
  @ignore.replace(globs)
  @ignore
end

#import(*globs) ⇒ void

TODO:

Should importing be relative to the importing file?

This method returns an undefined value.

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



88
89
90
91
92
93
94
95
96
97
98
99
100
101
# 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

#inspectObject



124
125
126
# File 'lib/rulebow/system.rb', line 124

def inspect
  "#<Rulebow::System>"
end

#parse_ruleset_name(name) ⇒ Array (private)

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

Returns:



140
141
142
143
144
145
146
147
148
149
# 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

#rulebookObject

Rulebook file.



53
54
55
# File 'lib/rulebow/system.rb', line 53

def rulebook
  @rulebook ||= Dir[File.join(root, RULEBOOK_GLOB)].first
end

#ruleset(name_and_chain, &block) ⇒ Ruleset

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

Returns:



71
72
73
74
75
76
77
78
79
80
81
# 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_fileObject

State file.



58
59
60
# File 'lib/rulebow/system.rb', line 58

def state_file
  @state_file ||= rulebook.chomp('.rb') + '.state'
end