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, Symbol, TrueClass, FalseClass)

    Value containing references to variables.

  • lambda_args (Array)

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

Returns:

  • (nil, String, Array, Symbol, TrueClass, FalseClass)

    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
125
126
127
128
# 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
  elsif varref.is_a?(TrueClass)
    varref
  elsif varref.is_a?(FalseClass)
    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

#inspectString

Return a String representing the VarSet.

Returns:

  • (String)

    Representation of the VarSet.



153
154
155
# File 'lib/rscons/varset.rb', line 153

def inspect
  to_h.inspect
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



138
139
140
141
142
143
144
145
146
147
148
# File 'lib/rscons/varset.rb', line 138

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

#values_at(*keys) ⇒ Array

Return an array containing the values associated with the given keys.

Parameters:

  • keys (Array<String, Symbol>)

    Keys to look up in the VarSet.

Returns:

  • (Array)

    An array containing the values associated with the given keys.



164
165
166
167
168
# File 'lib/rscons/varset.rb', line 164

def values_at(*keys)
  keys.map do |key|
    self[key]
  end
end