class Backburner::DataObject

Constants

TIME_REGEXP

Public Class Methods

new(h={}) click to toggle source
Calls superclass method
# File lib/backburner/data_object.rb, line 11
def initialize h={}, args={recurse_over_arrays: true}
  super
end

Public Instance Methods

empty?() click to toggle source
# File lib/backburner/data_object.rb, line 52
def empty?
  @table.empty?
end
new_ostruct_member(name) click to toggle source
# File lib/backburner/data_object.rb, line 15
def new_ostruct_member(name)
  name = name.to_sym
  unless self.respond_to?(name)
    class << self; self; end.class_eval do
      define_method(name) do
        v = @table[name]
        if v.is_a?(Hash)
          @sub_elements[name] ||= self.class.new(v, :recurse_over_arrays => @recurse_over_arrays)
        elsif v.is_a?(Array) and @recurse_over_arrays
          @sub_elements[name] ||= recurse_over_array v
        elsif v.is_a?(String)
          case v
            when /^\d+$/ then v.to_i
            when /^\d+\.\d+$/ then v.to_f
            when TIME_REGEXP then parse_time(v)
            when /^Yes$/i then true
            when /^No$/i then false
            else v
          end
        else
          v
        end
      end
      define_method("#{name}=") { |x| modifiable[name] = x }
      define_method("#{name}_as_a_hash") { @table[name] }
    end
  end
  name
end
parse_time(time_string) click to toggle source
# File lib/backburner/data_object.rb, line 45
def parse_time(time_string)
  res = time_string.scan TIME_REGEXP
  time = Time.parse res[0][0]
  time += res[0][1].to_i*60*60
  time
end
to_xml() click to toggle source
# File lib/backburner/data_object.rb, line 72
def to_xml
  builder = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
    xml.send @table.keys.first.to_s.camelize
  end
  document = builder.doc
  root_element = document.children[0]
  xml = xml_dig root_element, @table.values.first, document
  document.to_xml + "\n"
end

Private Instance Methods

dig(hash, name) click to toggle source
# File lib/backburner/data_object.rb, line 84
def dig hash, name
  hash.each do |key, value|
    return value if name.to_s == key.to_s
    if value.kind_of?(Hash)
      result = dig value, name
      return result if result
    end
  end
  nil
end
xml_dig(element, data, document) click to toggle source
# File lib/backburner/data_object.rb, line 95
def xml_dig element, data, document
  children = []
  if data.kind_of?(Hash)
    data.each do |key, value|
      if key.to_s =~ /^@(.+)/
        element[$1]=value
      else
        child= Nokogiri::XML::Element.new(key.to_s.camelize, document)
        xml_dig(child, value, document)
        children << child
      end
    end
  elsif data.kind_of?(String)
    children << data
  elsif data.kind_of?(Numeric)
    children << data.to_s
  end

  children.each do |child|
    element.add_child child
  end
  element
end