Class: Build::Rulebook
- Inherits:
-
Object
- Object
- Build::Rulebook
- Defined in:
- lib/build/rulebook.rb
Overview
Represents a collection of rules, organized by process name for fast lookup.
Instance Attribute Summary collapse
-
#rules ⇒ Object
readonly
Returns the value of attribute rules.
Class Method Summary collapse
-
.for(environment) ⇒ Object
Build a rulebook from all rule definitions in the given environment.
Instance Method Summary collapse
-
#<<(rule) ⇒ Object
Add a rule to this rulebook.
-
#[](name) ⇒ Object
Look up a rule by its full name.
-
#initialize(name = nil) ⇒ Rulebook
constructor
Initialize the rulebook.
-
#with(superclass, **state) ⇒ Object
Generate a task subclass with methods for all rules in this rulebook.
Constructor Details
#initialize(name = nil) ⇒ Rulebook
Initialize the rulebook.
13 14 15 16 17 |
# File 'lib/build/rulebook.rb', line 13 def initialize(name = nil) @name = name @rules = {} @processes = {} end |
Instance Attribute Details
#rules ⇒ Object (readonly)
Returns the value of attribute rules.
19 20 21 |
# File 'lib/build/rulebook.rb', line 19 def rules @rules end |
Class Method Details
.for(environment) ⇒ Object
Build a rulebook from all rule definitions in the given environment.
84 85 86 87 88 89 90 91 92 |
# File 'lib/build/rulebook.rb', line 84 def self.for(environment) rulebook = self.new(environment.name) environment.defined.each do |name, define| rulebook << define.klass.build(name, &define.block) end return rulebook end |
Instance Method Details
#<<(rule) ⇒ Object
Add a rule to this rulebook.
23 24 25 26 27 28 29 |
# File 'lib/build/rulebook.rb', line 23 def << rule @rules[rule.name] = rule # A cache for fast process/file-type lookup: processes = @processes[rule.process_name] ||= [] processes << rule end |
#[](name) ⇒ Object
Look up a rule by its full name.
34 35 36 |
# File 'lib/build/rulebook.rb', line 34 def [] name @rules[name] end |
#with(superclass, **state) ⇒ Object
Generate a task subclass with methods for all rules in this rulebook.
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/build/rulebook.rb', line 42 def with(superclass, **state) task_class = Class.new(superclass) # name = @name # task_class.send(:define_method, :to_s) do # "name" # end # Define methods for all processes, e.g. task_class#compile @processes.each do |key, rules| # Define general rules, which use rule applicability for disambiguation: task_class.send(:define_method, key) do |arguments, &block| rule = rules.find{|rule| rule.applicable? arguments} if rule invoke_rule(rule, arguments, &block) else raise NoApplicableRule.new(key, arguments) end end end # Define methods for all rules, e.g. task_class#compile_cpp @rules.each do |key, rule| task_class.send(:define_method, rule.full_name) do |arguments, &block| invoke_rule(rule, arguments, &block) end end # Typically, this defines methods like #environment and #target which can be accessed in the build rule. state.each do |key, value| task_class.send(:define_method, key) do value end end return task_class end |