Class: Rscons::VarSet

Inherits:
Object
  • Object
show all
Defined in:
lib/rscons/varset.rb

Overview

This class represents a collection of variables which supports efficient deep cloning.

Instance Method Summary collapse

Constructor Details

#initialize(vars = {}) ⇒ VarSet

Create a VarSet.

Parameters:

  • vars (Hash) (defaults to: {})

    Optional initial variables.


8
9
10
11
12
# File 'lib/rscons/varset.rb', line 8

def initialize(vars = {})
  @my_vars = {}
  @coa_vars = []
  append(vars)
end

Instance Method Details

#[](key) ⇒ Object

Access the value of variable.

Parameters:

  • key (String, Symbol)

    The variable name.

Returns:

  • (Object)

    The variable's value.


19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/rscons/varset.rb', line 19

def [](key)
  if @my_vars.include?(key)
    @my_vars[key]
  else
    @coa_vars.each do |coa_vars|
      if coa_vars.include?(key)
        @my_vars[key] = deep_dup(coa_vars[key])
        return @my_vars[key]
      end
    end
    nil
  end
end

#[]=(key, val) ⇒ Object

Assign a value to a variable.

Parameters:

  • key (String, Symbol)

    The variable name.

  • val (Object)

    The value to set.


38
39
40
# File 'lib/rscons/varset.rb', line 38

def []=(key, val)
  @my_vars[key] = val
end

#append(values) ⇒ VarSet

Add or overwrite a set of variables.

Parameters:

  • values (VarSet, Hash)

    New set of variables.

Returns:


62
63
64
65
66
67
68
69
70
71
# File 'lib/rscons/varset.rb', line 62

def append(values)
  coa!
  if values.is_a?(VarSet)
    values.send(:coa!)
    @coa_vars = values.instance_variable_get(:@coa_vars) + @coa_vars
  else
    @my_vars = deep_dup(values)
  end
  self
end

#expand_varref(varref, lambda_args) ⇒ nil, ...

Replace “${var}” variable references in varref with the expanded variables' values, recursively.

Parameters:

  • varref (nil, String, Array, Proc)

    Value containing references to variables.

  • lambda_args (Array)

    Arguments to pass to any lambda variable values to be expanded.

Returns:

  • (nil, String, Array)

    Expanded value with “${var}” variable references replaced.


96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/rscons/varset.rb', line 96

def expand_varref(varref, lambda_args)
  if varref.is_a?(String)
    if varref =~ /^(.*)\$\{([^}]+)\}(.*)$/
      prefix, varname, suffix = $1, $2, $3
      varval = expand_varref(self[varname], lambda_args)
      if varval.is_a?(String) or varval.nil?
        expand_varref("#{prefix}#{varval}#{suffix}", lambda_args)
      elsif varval.is_a?(Array)
        varval.map {|vv| expand_varref("#{prefix}#{vv}#{suffix}", lambda_args)}.flatten
      else
        raise "I do not know how to expand a variable reference to a #{varval.class.name} (from #{varname.inspect} => #{self[varname].inspect})"
      end
    else
      varref
    end
  elsif varref.is_a?(Array)
    varref.map do |ent|
      expand_varref(ent, lambda_args)
    end.flatten
  elsif varref.is_a?(Proc)
    expand_varref(varref[*lambda_args], lambda_args)
  elsif varref.nil?
    nil
  elsif varref.is_a?(Symbol)
    varref
  else
    raise "Unknown varref type: #{varref.class} (#{varref.inspect})"
  end
end

#include?(key) ⇒ Boolean

Check if the VarSet contains a variable.

Parameters:

  • key (String, Symbol)

    The variable name.

Returns:

  • (Boolean)

    Whether the VarSet contains the variable.


47
48
49
50
51
52
53
54
55
# File 'lib/rscons/varset.rb', line 47

def include?(key)
  if @my_vars.include?(key)
    true
  else
    @coa_vars.find do |coa_vars|
      coa_vars.include?(key)
    end
  end
end

#merge(other = {}) ⇒ VarSet Also known as: clone

Create a new VarSet object based on the first merged with other.

Parameters:

  • other (VarSet, Hash) (defaults to: {})

    Other variables to add or overwrite.

Returns:

  • (VarSet)

    The newly created VarSet.


78
79
80
81
82
83
# File 'lib/rscons/varset.rb', line 78

def merge(other = {})
  coa!
  varset = self.class.new
  varset.instance_variable_set(:@coa_vars, @coa_vars.dup)
  varset.append(other)
end

#to_hHash

Return a Hash containing all variables in the VarSet.

This method is not terribly efficient. It is intended to be used only by debugging code to dump out a VarSet's variables.

Returns:

  • (Hash)

    All variables in the VarSet.

Since:

  • 1.8.0


134
135
136
137
138
139
140
141
142
143
144
# File 'lib/rscons/varset.rb', line 134

def to_h
  result = deep_dup(@my_vars)
  @coa_vars.reduce(result) do |result, coa_vars|
    coa_vars.each_pair do |key, value|
      unless result.include?(key)
        result[key] = deep_dup(value)
      end
    end
    result
  end
end