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.
116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/build/rule.rb', line 116 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
138 139 140 |
# File 'lib/build/rule.rb', line 138 def full_name @full_name end |
#name ⇒ Object (readonly)
compile.cpp
130 131 132 |
# File 'lib/build/rule.rb', line 130 def name @name end |
#parameters ⇒ Object (readonly)
Returns the value of attribute parameters.
132 133 134 |
# File 'lib/build/rule.rb', line 132 def parameters @parameters end |
#primary_output ⇒ Object (readonly)
Returns the value of attribute primary_output.
140 141 142 |
# File 'lib/build/rule.rb', line 140 def primary_output @primary_output end |
#process_name ⇒ Object (readonly)
compile
135 136 137 |
# File 'lib/build/rule.rb', line 135 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
169 170 171 172 173 174 175 |
# File 'lib/build/rule.rb', line 169 def << parameter @parameters << parameter if parameter.output? @primary_output ||= parameter end end |
#applicable?(arguments) ⇒ Boolean
Check if this rule can process these parameters
178 179 180 181 182 183 184 185 186 |
# File 'lib/build/rule.rb', line 178 def applicable?(arguments) @parameters.each do |parameter| next if parameter.implicit? return false unless parameter.applicable?(arguments) end return true end |
#apply(&block) ⇒ Object
218 219 220 |
# File 'lib/build/rule.rb', line 218 def apply(&block) @apply = Proc.new(&block) end |
#apply!(scope, arguments) ⇒ Object
222 223 224 |
# File 'lib/build/rule.rb', line 222 def apply!(scope, arguments) scope.instance_exec(arguments, &@apply) if @apply end |
#eql?(other) ⇒ Boolean
236 237 238 |
# File 'lib/build/rule.rb', line 236 def eql?(other) other.kind_of?(self.class) and @name.eql?(other.name) and @parameters.eql?(other.parameters) end |
#files(arguments) ⇒ Object
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 |
# File 'lib/build/rule.rb', line 197 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
142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
# File 'lib/build/rule.rb', line 142 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
232 233 234 |
# File 'lib/build/rule.rb', line 232 def hash [self.class, @name, @parameters].hash end |
#input(name, options = {}, &block) ⇒ Object
157 158 159 |
# File 'lib/build/rule.rb', line 157 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.
189 190 191 192 193 194 195 |
# File 'lib/build/rule.rb', line 189 def normalize(arguments, scope) Hash[ @parameters.collect do |parameter| [parameter.name, parameter.compute(arguments, scope)] end ] end |
#output(name, options = {}, &block) ⇒ Object
165 166 167 |
# File 'lib/build/rule.rb', line 165 def output(name, = {}, &block) self << Parameter.new(:output, name, , &block) end |
#parameter(name, options = {}, &block) ⇒ Object
161 162 163 |
# File 'lib/build/rule.rb', line 161 def parameter(name, = {}, &block) self << Parameter.new(:argument, name, , &block) end |
#result(arguments) ⇒ Object
226 227 228 229 230 |
# File 'lib/build/rule.rb', line 226 def result(arguments) if @primary_output arguments[@primary_output.name] end end |
#to_s ⇒ Object
240 241 242 |
# File 'lib/build/rule.rb', line 240 def to_s "#<#{self.class} #{@name.dump}>" end |