Class: Fog::ToHashDocument

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

Instance Method Summary (collapse)

Constructor Details

- (ToHashDocument) initialize



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

def initialize
  @stack = []
end

Instance Method Details

- (Object) body



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

def body
  @stack.first
end

- (Object) characters(string)



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

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

- (Object) end_element(name)



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

- (Object) response



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

def response
  body
end

- (Object) start_element(name, attributes = [])



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