class Bricolage::Variables
Public Class Methods
define() { |vars| ... }
click to toggle source
# File lib/bricolage/variables.rb, line 14 def Variables.define new.tap {|vars| yield vars } end
new()
click to toggle source
# File lib/bricolage/variables.rb, line 20 def initialize @vars = {} end
union(*vars_list)
click to toggle source
# File lib/bricolage/variables.rb, line 6 def Variables.union(*vars_list) new.tap {|result| vars_list.each do |vars| result.update vars end } end
Public Instance Methods
[](name)
click to toggle source
# File lib/bricolage/variables.rb, line 36 def [](name) var = @vars[name] or raise ParameterError, "no such variable: #{name}" var.value end
[]=(name, value)
click to toggle source
# File lib/bricolage/variables.rb, line 46 def []=(name, value) add Variable.new(name, value) end
add(var)
click to toggle source
# File lib/bricolage/variables.rb, line 54 def add(var) @vars[var.name] = var end
each_variable(&block)
click to toggle source
# File lib/bricolage/variables.rb, line 32 def each_variable(&block) @vars.each_value(&block) end
get_force(name)
click to toggle source
# File lib/bricolage/variables.rb, line 41 def get_force(name) var = @vars[name] var ? var.value : nil end
inspect()
click to toggle source
# File lib/bricolage/variables.rb, line 24 def inspect "\#<#{self.class} #{@vars.inspect}>" end
keys()
click to toggle source
# File lib/bricolage/variables.rb, line 50 def keys @vars.keys end
resolve()
click to toggle source
resolve self recursively
# File lib/bricolage/variables.rb, line 65 def resolve ResolvedVariables.define {|resolved| @vars.each_value do |var| resolved.add do_expand_variable(var, resolved, {}) end } end
resolve_with(resolved)
click to toggle source
# File lib/bricolage/variables.rb, line 98 def resolve_with(resolved) raise "[BUG] unresolved variables given" unless resolved.resolved? ResolvedVariables.define {|result| each_variable do |var| if var.resolved? result.add var else val = resolved.expand(var.value.to_s) result.add ResolvedVariable.new(var.name, val) end end } end
resolved?()
click to toggle source
# File lib/bricolage/variables.rb, line 28 def resolved? false end
update(vars)
click to toggle source
# File lib/bricolage/variables.rb, line 58 def update(vars) vars.each_variable do |var| add var end end
Private Instance Methods
do_expand_variable(var, resolved, seen)
click to toggle source
# File lib/bricolage/variables.rb, line 73 def do_expand_variable(var, resolved, seen) if seen[var.name] cycle = (seen.keys + [var.name]).join(', ') raise ParameterError, "recursive variable reference: #{var.name} (#{cycle})" end seen[var.name] = true if var.resolved? var else value = Variable.expand_string(var.value.to_s) {|name| if resolved.bound?(name) resolved[name] elsif var2 = @vars[name] res_var2 = do_expand_variable(var2, resolved, seen) resolved.add res_var2 res_var2.value else raise ParameterError, "undefined variable in parameter #{var.name}: $#{name}" end } ResolvedVariable.new(var.name, value) end end