Class: Fog::ToHashDocument

Inherits:
Nokogiri::XML::SAX::Document
  • Object
show all
Defined in:
lib/fog/core/parser.rb

Instance Method Summary collapse

Constructor Details

#initializeToHashDocument

Returns a new instance of ToHashDocument.



51
52
53
# File 'lib/fog/core/parser.rb', line 51

def initialize
  @stack = []
end

Instance Method Details

#bodyObject



72
73
74
# File 'lib/fog/core/parser.rb', line 72

def body
  @stack.first
end

#characters(string) ⇒ Object



55
56
57
58
# File 'lib/fog/core/parser.rb', line 55

def characters(string)
  @value ||= ''
  @value << string.strip
end

#end_element(name) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
# File 'lib/fog/core/parser.rb', line 60

def end_element(name)
  last = @stack.pop
  if last.empty? && @value.empty?
    @stack.last[name.to_sym] = ''
  elsif last == {:i_nil=>"true"}
    @stack.last[name.to_sym] = nil
  elsif !@value.empty?
    @stack.last[name.to_sym] = @value
  end
  @value = ''
end

#responseObject



76
77
78
# File 'lib/fog/core/parser.rb', line 76

def response
  body
end

#start_element(name, attributes = []) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/fog/core/parser.rb', line 80

def start_element(name, attributes = [])
  @value = ''
  parsed_attributes = {}
  until attributes.empty?
    if attributes.first.is_a?(Array)
      key, value = attributes.shift
    else
      key, value = attributes.shift, attributes.shift
    end
    parsed_attributes[key.gsub(':','_').to_sym] = value
  end
  if @stack.last.is_a?(Array)
    @stack.last << {name.to_sym => parsed_attributes}
  else
    data = if @stack.empty?
      @stack.push(parsed_attributes)
      parsed_attributes
    elsif @stack.last[name.to_sym]
      unless @stack.last[name.to_sym].is_a?(Array)
        @stack.last[name.to_sym] = [@stack.last[name.to_sym]]
      end
      @stack.last[name.to_sym] << parsed_attributes
      @stack.last[name.to_sym].last
    else
      @stack.last[name.to_sym] = {}
      @stack.last[name.to_sym].merge!(parsed_attributes)
      @stack.last[name.to_sym]
    end
    @stack.push(data)
  end
end