Class: OXML::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/oxml/parser.rb

Constant Summary collapse

EMPTY_STR =
''
TRUE_STR =
'true'
FALSE_STR =
'false'
DATE_TIME =
/^-?\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?$/.freeze
DATE =
/^-?\d{4}-\d{2}-\d{2}(?:Z|[+-]\d{2}:?\d{2})?$/.freeze
TIME =
/^\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?$/.freeze

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Parser

Returns a new instance of Parser.



12
13
14
15
16
17
18
19
20
21
22
# File 'lib/oxml/parser.rb', line 12

def initialize(options = {})
  @memo = {}
  @arr = []
  @map = {}
  @name = nil
  @last_attr = nil
  @strip_namespaces = options.fetch(:strip_namespaces, false)
  @delete_namespace_attributes = options.fetch(:delete_namespace_attributes, false)
  @advanced_typecasting = options.fetch(:advanced_typecasting, false)
  @skip_soap_elements = options.fetch(:skip_soap_elements, false)
end

Instance Method Details

#attr(name, str) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
# File 'lib/oxml/parser.rb', line 30

def attr(name, str)
  @last_attr = "#{name}:#{str}"
  return if @delete_namespace_attributes

  return if name == :version
  return if name == :encoding

  start_element("@#{name}")
  text(str)
  end_element(name)
end

#attrs_doneObject



58
59
60
61
62
63
# File 'lib/oxml/parser.rb', line 58

def attrs_done
  if @last_attr =~ /nil:true/
    @last_attr = nil
    @arr.last[@name] = nil
  end
end

#end_element(_name) ⇒ Object



65
66
67
# File 'lib/oxml/parser.rb', line 65

def end_element(_name)
  @memo = @arr.pop
end

#start_element(name) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/oxml/parser.rb', line 42

def start_element(name)
  name = name.to_s
  @arr.push(@memo)

  if @strip_namespaces && name.start_with?('@')
    @name = name.to_sym
  elsif @strip_namespaces
    @name = @map[name] ||= Utils.snakecase(name).split(':').last.to_sym
  else
    @name = @map[name] ||= Utils.snakecase(name).to_sym
  end

  @memo = {}
  text(@memo)
end

#text(value) ⇒ Object



69
70
71
72
73
74
75
76
77
78
# File 'lib/oxml/parser.rb', line 69

def text(value)
  if @arr.last[@name].is_a?(Array)
    @arr.last[@name].pop unless value == @memo
    @arr.last[@name] << cast(value)
  elsif @arr.last[@name] && value == @memo
    @arr.last[@name] = [@arr.last[@name], value]
  else
    @arr.last[@name] = cast(value)
  end
end

#to_hObject



24
25
26
27
28
# File 'lib/oxml/parser.rb', line 24

def to_h
  return @memo.to_h unless @skip_soap_elements

  @memo.to_h.values.first&.values&.last
end