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