Class: Bed::Flex::Builder

Inherits:
Object show all
Defined in:
lib/bed/flex/builder.rb

Instance Method Summary collapse

Constructor Details

#initialize(*args, **kwargs, &blk) ⇒ Builder

Returns a new instance of Builder.



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/bed/flex/builder.rb', line 4

def initialize(*args, **kwargs, &blk)
  @whitelisted_attributes = []
  @attributes = {}
  @locked = false
  @converged = false
  result = if block_given?
             block = blk
             if block.arity.zero?
               instance_eval(&block)
             else
               yield self
             end
           end

  converge(result) if should_converge?(result)
  @locked = true
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object (private)



102
103
104
105
106
107
108
109
110
111
# File 'lib/bed/flex/builder.rb', line 102

def method_missing(name, *args, &block)
  return super if !@whitelisted_attributes.empty? && !@whitelisted_attributes.include?(name)

  if name.end_with?('=')
    attribute_name = name.to_s.chomp('=').to_sym
    set_attribute(attribute_name, args.first)
  else
    get_or_set_attribute(name, *args, &block)
  end
end

Instance Method Details

#[]=(name, value) ⇒ Object

def to_ary

[to_h]

end



75
76
77
# File 'lib/bed/flex/builder.rb', line 75

def []=(name, value)
  set_attribute(name, value)
end

#converge(value) ⇒ Object



22
23
24
25
# File 'lib/bed/flex/builder.rb', line 22

def converge(value)
  @converged = true
  @attributes[:_converged] = value
end

#deep_dupObject



39
40
41
42
43
44
45
# File 'lib/bed/flex/builder.rb', line 39

def deep_dup
  self.class.new.tap do |new_builder|
    @attributes.each do |key, value|
      new_builder.send(:"#{key}=", value.is_a?(Builder) ? value.deep_dup : value.dup)
    end
  end
end

#get(path) ⇒ Object



27
28
29
# File 'lib/bed/flex/builder.rb', line 27

def get(path)
  path.to_s.split('.').inject(self) { |obj_self, attr| obj_self.public_send(attr) }
end

#inspectObject



63
64
65
66
67
68
69
70
# File 'lib/bed/flex/builder.rb', line 63

def inspect
  case @attributes
  in {} then '{}'
  in { _converged: value } then value
  else
    old_inspect
  end
end

#old_inspectObject



61
# File 'lib/bed/flex/builder.rb', line 61

alias_method :old_inspect, :inspect

#pretty_print(pp) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/bed/flex/builder.rb', line 47

def pretty_print(pp)
  pp.object_address_group(self) do
    pp.seplist(@attributes, -> { pp.text ',' }) do |k, v|
      pp.breakable
      pp.group(1) do
        pp.text k.to_s
        pp.text ':'
        pp.breakable
        pp.pp v
      end
    end
  end
end

#to_hObject Also known as: to_s



31
32
33
34
# File 'lib/bed/flex/builder.rb', line 31

def to_h
  return @attributes[:_converged] if @converged
  @attributes.transform_values { |v| v.is_a?(Builder) ? v.to_h : v }
end