Class: Rets::Parser::Compact

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

Defined Under Namespace

Classes: SaxParser

Constant Summary collapse

DEFAULT_DELIMITER =
"\t"
INCLUDE_NULL_FIELDS =
-1
InvalidDelimiter =
Class.new(ArgumentError)

Class Method Summary collapse

Class Method Details

.get_count(xml) ⇒ Object



87
88
89
90
91
92
93
94
# File 'lib/rets/parser/compact.rb', line 87

def self.get_count(xml)
  doc = Nokogiri.parse(xml.to_s)
  if node = doc.at("//COUNT")
    node.attr('Records').to_i
  else
    0
  end
end

.parse(columns, data, delimiter = nil) ⇒ Object

Parses a single row of RETS-COMPACT data.

Delimiter must be a regexp because String#split behaves differently when given a string pattern. (It removes leading spaces).



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/rets/parser/compact.rb', line 70

def self.parse(columns, data, delimiter = nil)
  delimiter ||= DEFAULT_DELIMITER
  delimiter = Regexp.new(Regexp.escape(delimiter))

  if delimiter == // || delimiter == /,/
    raise Rets::Parser::Compact::InvalidDelimiter, "Empty or invalid delimiter found, unable to parse."
  end

  column_names = columns.split(delimiter)
  data_values = data.split(delimiter, INCLUDE_NULL_FIELDS).map { |x| CGI.unescapeHTML(x) }

  zipped_key_values = column_names.zip(data_values).map { |k, v| [k.freeze, v.to_s] }

  hash = Hash[*zipped_key_values.flatten]
  hash.reject { |key, value| key.empty? && value.to_s.empty? }
end

.parse_document(xml) ⇒ Object



12
13
14
15
16
17
18
19
# File 'lib/rets/parser/compact.rb', line 12

def self.parse_document(xml)
  doc = SaxParser.new
  parser = Nokogiri::XML::SAX::Parser.new(doc)
  io = StringIO.new(xml.to_s)

  parser.parse(io)
  doc.results.map {|r| parse(doc.columns, r, doc.delimiter) }
end