Class: Nugrant::Bag

Inherits:
Object
  • Object
show all
Defined in:
lib/nugrant/bag.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(elements = nil) ⇒ Bag

Returns a new instance of Bag.



5
6
7
8
9
10
11
# File 'lib/nugrant/bag.rb', line 5

def initialize(elements = nil)
  if elements.kind_of?(Bag)
    @__elements = elements
  end

  __recompute(elements)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object



17
18
19
# File 'lib/nugrant/bag.rb', line 17

def method_missing(method, *args, &block)
  return __fetch(method)
end

Instance Attribute Details

#__elementsObject (readonly)

Returns the value of attribute __elements.



3
4
5
# File 'lib/nugrant/bag.rb', line 3

def __elements
  @__elements
end

Instance Method Details

#[](key) ⇒ Object



13
14
15
# File 'lib/nugrant/bag.rb', line 13

def [](key)
  return __fetch(key)
end

#__fetch(key) ⇒ Object



92
93
94
95
96
97
98
# File 'lib/nugrant/bag.rb', line 92

def __fetch(key)
  if not has?(key)
    raise KeyError, "Undefined parameter '#{key}'"
  end

  return @__elements[key.to_sym]
end

#__merge!(elements) ⇒ Object

This method always perform a deep merge and will deep merge array scalar values only. This means that we do not merge within array themselves.



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/nugrant/bag.rb', line 34

def __merge!(elements)
  bag = elements.kind_of?(Bag) ? elements : Bag.new(elements)
  return if bag.empty?()

  bag.each do |key, value|
    if has?(key)
      current = @__elements[key]
      if current.kind_of?(Bag) and value.kind_of?(Bag)
        current.__merge!(value)
      elsif current.kind_of?(Array) and value.kind_of?(Array)
        @__elements[key] = current | value
      elsif value != nil
        @__elements[key] = value
      end

      next
    end

    @__elements[key] = value
  end
end

#__recompute(hash = nil) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/nugrant/bag.rb', line 77

def __recompute(hash = nil)
  @__elements = {}
  return if hash == nil or not hash.kind_of?(Hash)

  hash.each do |key, value|
    if not value.kind_of?(Hash)
      @__elements[key.to_sym] = value
      next
    end

    # It is a hash, transform it into a bag
    @__elements[key.to_sym] = Bag.new(value)
  end
end

#__to_hash(options = {}) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/nugrant/bag.rb', line 62

def __to_hash(options = {})
  return {} if empty?()

  string_key = options[:string_key]

  hash = {}
  each do |key, value|
    key = key.to_s() if string_key

    hash[key] = value.kind_of?(Bag) ? value.__to_hash(:string_key => string_key) : value
  end

  return hash
end

#eachObject



56
57
58
59
60
# File 'lib/nugrant/bag.rb', line 56

def each()
  @__elements.each do |key, value|
    yield key, value
  end
end

#empty?Boolean

Returns:

  • (Boolean)


25
26
27
# File 'lib/nugrant/bag.rb', line 25

def empty?()
  @__elements.size() <= 0
end

#has?(key) ⇒ Boolean

Returns:

  • (Boolean)


21
22
23
# File 'lib/nugrant/bag.rb', line 21

def has?(key)
  return @__elements.has_key?(key.to_sym)
end