Class: Build::Rule
- Inherits:
-
Object
- Object
- Build::Rule
- Defined in:
- lib/build/rule.rb
Overview
A rule is a function with a specific set of input and output parameters, which can match against a given set of specific arguments. For example, there might be several rules for compiling, but the specific rules depend on the language being compiled.
Defined Under Namespace
Classes: Parameter
Instance Attribute Summary collapse
-
#full_name ⇒ Object
readonly
compile_cpp.
-
#name ⇒ Object
readonly
compile.cpp.
-
#parameters ⇒ Object
readonly
Returns the value of attribute parameters.
-
#primary_output ⇒ Object
readonly
Returns the value of attribute primary_output.
-
#process_name ⇒ Object
readonly
compile.
Class Method Summary collapse
Instance Method Summary collapse
- #<<(parameter) ⇒ Object
-
#applicable?(arguments) ⇒ Boolean
Check if this rule can process these parameters.
- #apply(&block) ⇒ Object
- #apply!(scope, arguments) ⇒ Object
- #eql?(other) ⇒ Boolean
- #files(arguments) ⇒ Object
- #freeze ⇒ Object
- #hash ⇒ Object
-
#initialize(process_name, type) ⇒ Rule
constructor
A new instance of Rule.
- #input(name, options = {}, &block) ⇒ Object
-
#normalize(arguments, scope) ⇒ Object
The scope is the context in which the dynamic rule computation is done, usually an instance of Task.
- #output(name, options = {}, &block) ⇒ Object
- #parameter(name, options = {}, &block) ⇒ Object
- #result(arguments) ⇒ Object
- #to_s ⇒ Object
Constructor Details
#initialize(process_name, type) ⇒ Rule
Returns a new instance of Rule.
114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/build/rule.rb', line 114 def initialize(process_name, type) @name = process_name + "." + type @full_name = @name.gsub(/[^\w]/, '_') @process_name = process_name.gsub('-', '_').to_sym @type = type @apply = nil @parameters = [] @primary_output = nil end |
Instance Attribute Details
#full_name ⇒ Object (readonly)
compile_cpp
136 137 138 |
# File 'lib/build/rule.rb', line 136 def full_name @full_name end |
#name ⇒ Object (readonly)
compile.cpp
128 129 130 |
# File 'lib/build/rule.rb', line 128 def name @name end |
#parameters ⇒ Object (readonly)
Returns the value of attribute parameters.
130 131 132 |
# File 'lib/build/rule.rb', line 130 def parameters @parameters end |
#primary_output ⇒ Object (readonly)
Returns the value of attribute primary_output.
138 139 140 |
# File 'lib/build/rule.rb', line 138 def primary_output @primary_output end |
#process_name ⇒ Object (readonly)
compile
133 134 135 |
# File 'lib/build/rule.rb', line 133 def process_name @process_name end |
Class Method Details
.build(name, &block) ⇒ Object
24 25 26 27 28 29 30 |
# File 'lib/build/rule.rb', line 24 def self.build(name, &block) rule = self.new(*name.split('.', 2)) rule.instance_eval(&block) return rule.freeze end |
Instance Method Details
#<<(parameter) ⇒ Object
167 168 169 170 171 172 173 |
# File 'lib/build/rule.rb', line 167 def << parameter @parameters << parameter if parameter.output? @primary_output ||= parameter end end |
#applicable?(arguments) ⇒ Boolean
Check if this rule can process these parameters
176 177 178 179 180 181 182 183 184 |
# File 'lib/build/rule.rb', line 176 def applicable?(arguments) @parameters.each do |parameter| next if parameter.implicit? return false unless parameter.applicable?(arguments) end return true end |
#apply(&block) ⇒ Object
216 217 218 |
# File 'lib/build/rule.rb', line 216 def apply(&block) @apply = Proc.new(&block) end |
#apply!(scope, arguments) ⇒ Object
220 221 222 |
# File 'lib/build/rule.rb', line 220 def apply!(scope, arguments) scope.instance_exec(arguments, &@apply) if @apply end |
#eql?(other) ⇒ Boolean
234 235 236 |
# File 'lib/build/rule.rb', line 234 def eql?(other) other.kind_of?(self.class) and @name.eql?(other.name) and @parameters.eql?(other.parameters) end |
#files(arguments) ⇒ Object
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 |
# File 'lib/build/rule.rb', line 195 def files(arguments) input_files = [] output_files = [] @parameters.each do |parameter| # This could probably be improved a bit, we are assuming all parameters are file based: value = arguments[parameter.name] next unless value case parameter.direction when :input input_files << value when :output output_files << value end end return Build::Files::Composite.new(input_files), Build::Files::Composite.new(output_files) end |
#freeze ⇒ Object
140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/build/rule.rb', line 140 def freeze return self if frozen? @name.freeze @full_name.freeze @process_name.freeze @type.freeze @apply.freeze @parameters.freeze @primary_output.freeze super end |
#hash ⇒ Object
230 231 232 |
# File 'lib/build/rule.rb', line 230 def hash [self.class, @name, @parameters].hash end |
#input(name, options = {}, &block) ⇒ Object
155 156 157 |
# File 'lib/build/rule.rb', line 155 def input(name, = {}, &block) self << Parameter.new(:input, name, , &block) end |
#normalize(arguments, scope) ⇒ Object
The scope is the context in which the dynamic rule computation is done, usually an instance of Task.
187 188 189 190 191 192 193 |
# File 'lib/build/rule.rb', line 187 def normalize(arguments, scope) Hash[ @parameters.collect do |parameter| [parameter.name, parameter.compute(arguments, scope)] end ] end |
#output(name, options = {}, &block) ⇒ Object
163 164 165 |
# File 'lib/build/rule.rb', line 163 def output(name, = {}, &block) self << Parameter.new(:output, name, , &block) end |
#parameter(name, options = {}, &block) ⇒ Object
159 160 161 |
# File 'lib/build/rule.rb', line 159 def parameter(name, = {}, &block) self << Parameter.new(:argument, name, , &block) end |
#result(arguments) ⇒ Object
224 225 226 227 228 |
# File 'lib/build/rule.rb', line 224 def result(arguments) if @primary_output arguments[@primary_output.name] end end |
#to_s ⇒ Object
238 239 240 |
# File 'lib/build/rule.rb', line 238 def to_s "#<#{self.class} #{@name.dump}>" end |