Class: RecursiveOpenStruct

Inherits:
OpenStruct show all
Defined in:
lib/rails_config/ext/recursive_ostruct.rb

Instance Method Summary collapse

Methods inherited from OpenStruct

#[], #[]=

Instance Method Details

#debug_inspect(indent_level = 0, recursion_limit = 12) ⇒ Object



33
34
35
# File 'lib/rails_config/ext/recursive_ostruct.rb', line 33

def debug_inspect(indent_level = 0, recursion_limit = 12)
  display_recursive_open_struct(@table, indent_level, recursion_limit)
end

#display_recursive_open_struct(ostrct_or_hash, indent_level, recursion_limit) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/rails_config/ext/recursive_ostruct.rb', line 37

def display_recursive_open_struct(ostrct_or_hash, indent_level, recursion_limit)
  if recursion_limit <= 0 then
    # protection against recursive structure (like in the tests)
    puts '  '*indent_level + '(recursion limit reached)'
  else
    #puts ostrct_or_hash.inspect
    if ostrct_or_hash.is_a?(RecursiveOpenStruct) then
      ostrct_or_hash = ostrct_or_hash.marshal_dump
    end
    # We'll display the key values like this :    key =  value
    # to align display, we look for the maximum key length of the data that will be displayed
    # (everything except hashes)
    data_indent = ostrct_or_hash.reject { |k, v| v.is_a?(RecursiveOpenStruct) || v.is_a?(Hash) }.max { |a, b| a[0].to_s.length <=> b[0].to_s.length }[0].length
    # puts "max length = #{data_indent}"

    ostrct_or_hash.each do |key, value|
      if (value.is_a?(RecursiveOpenStruct) || value.is_a?(Hash)) then
        puts '  '*indent_level + key.to_s + '.'
        display_recursive_open_struct(value, indent_level + 1, recursion_limit - 1)
      else
        puts '  '*indent_level + key.to_s + ' '*(data_indent - key.to_s.length) + ' = ' + value.inspect
      end
    end
  end

  true
end

#get_by_namespace(namespace) ⇒ Object



25
26
27
28
29
30
31
# File 'lib/rails_config/ext/recursive_ostruct.rb', line 25

def get_by_namespace(namespace)
  result=self
  namespace.split(':').map(&:to_sym).each do |name|
    result=result.send(:[], name)
  end
  result
end

#new_ostruct_member(name) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/rails_config/ext/recursive_ostruct.rb', line 5

def new_ostruct_member(name)
  name = name.to_sym
  unless self.respond_to?(name)
    class << self;
      self;
    end.class_eval do
      define_method(name) {
        v = @table[name]
        v.is_a?(Hash) ? RecursiveOpenStruct.new(v) : v
      }
      define_method("#{name}=") { |x| modifiable[name] = x }
      define_method("#{name}_as_hash") { @table[name].with_indifferent_access }
      define_method("#{name}_as_array") { @table[name].to_a }
      define_method("as_hash") { @table.with_indifferent_access }
      define_method("as_array") { @table.to_a }
    end
  end
  name
end