class MTIF::Post

Constants

CSV_KEYS
DATE_FORMAT
FIELD_SEPARATOR
MULTILINE_KEYS
MULTIVALUE_KEYS
POST_SEPARATOR
SINGLE_VALUE_KEYS
VALID_KEYS

Attributes

data[RW]
source[RW]

Public Class Methods

new(content) click to toggle source
# File lib/mtif/posts.rb, line 44
def initialize(content)
  @source = content
  @data = {}

  MULTIVALUE_KEYS.each do |key|
    @data[key] = []
  end

  parse_source
end

Public Instance Methods

multiline_multivalue_keys() click to toggle source
# File lib/mtif/posts.rb, line 40
def multiline_multivalue_keys
  MULTILINE_KEYS & MULTIVALUE_KEYS
end
multiline_single_value_keys() click to toggle source
# File lib/mtif/posts.rb, line 36
def multiline_single_value_keys
  MULTILINE_KEYS & SINGLE_VALUE_KEYS
end
single_line_multivalue_keys() click to toggle source
# File lib/mtif/posts.rb, line 32
def single_line_multivalue_keys
  MULTIVALUE_KEYS - MULTILINE_KEYS
end
single_line_single_value_keys() click to toggle source
# File lib/mtif/posts.rb, line 28
def single_line_single_value_keys
  SINGLE_VALUE_KEYS - MULTILINE_KEYS
end
to_mtif() click to toggle source
# File lib/mtif/posts.rb, line 55
def to_mtif
  result = []
  single_line_single_value_keys.each do |key|
    value = self.send(key)
    next if value.nil? || (value.respond_to?(:empty) && value.empty?)

    result << "#{mtif_key(key)}: #{mtif_value(value)}"
  end

  single_line_multivalue_keys.each do |key|
    values = self.send(key)
    next if values.nil? || (values.respond_to?(:empty) && values.empty?)

    if CSV_KEYS.include?(key)
      values = [
        values.map{|v|
          v.include?("\s") ? "\"#{v}\"" : v
        }.join(',')
      ]
    end

    values.each do |value|
      result << "#{mtif_key(key)}: #{mtif_value(value)}"
    end
  end

  multiline_single_value_keys.each do |key|
    value = self.send(key)
    next if value.nil? || (value.respond_to?(:empty) && value.empty?)

    result << FIELD_SEPARATOR
    result << "#{mtif_key(key)}:\n#{mtif_value(value)}"
  end

  multiline_multivalue_keys.each do |key|
    values = self.send(key)
    next if values.nil? || (values.respond_to?(:empty) && values.empty?)

    values.each do |value|
      result << FIELD_SEPARATOR
      result << "#{mtif_key(key)}:\n#{mtif_value(value)}"
    end
  end


  result << FIELD_SEPARATOR unless result.last == FIELD_SEPARATOR #close the final field
  result << POST_SEPARATOR # close the post
  result.join("\n") + "\n"
end
valid_key?(key) click to toggle source
# File lib/mtif/posts.rb, line 24
def valid_key?(key)
  valid_keys.include?(key.to_sym)
end
valid_keys() click to toggle source
# File lib/mtif/posts.rb, line 20
def valid_keys
  VALID_KEYS
end

Private Instance Methods

convert_to_native_type(raw_value) click to toggle source
# File lib/mtif/posts.rb, line 138
def convert_to_native_type(raw_value)
  case raw_value
  when /^\d+$/
    raw_value.to_i
  when /^\d{2}\/\d{2}\/\d{4} \d{2}:\d{2}:\d{2} [AP]M/
    Time.strptime(raw_value, DATE_FORMAT)
  else
    raw_value
  end
end
method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/mtif/posts.rb, line 106
def method_missing(method, *args, &block)
  key = method.to_s.chomp('=').to_sym

  if valid_key?(key)
    if key == method
      data[key]
    else
      data[key] = args.first
    end
  else
    super
  end
end
mtif_key(key) click to toggle source
# File lib/mtif/posts.rb, line 130
def mtif_key(key)
  key.to_s.tr('_', ' ').upcase
end
mtif_key_to_key(raw_key) click to toggle source
# File lib/mtif/posts.rb, line 126
def mtif_key_to_key(raw_key)
  raw_key.strip.downcase.tr(' ','_').to_sym unless raw_key.nil?
end
mtif_value(value) click to toggle source
# File lib/mtif/posts.rb, line 134
def mtif_value(value)
  value.kind_of?(Time) ? value.strftime(DATE_FORMAT) : value
end
parse_source() click to toggle source
# File lib/mtif/posts.rb, line 166
def parse_source
  source.slice_before(/^#{FIELD_SEPARATOR}/).each do |lines|
    if lines.first =~ /^#{FIELD_SEPARATOR}/ && lines.size > 1
      # Multiline data
      store_data(lines.shift(2).last.chomp(":\n"), lines.join.strip)
    elsif lines.first =~ /^[A-Z ]+: /
      # Single-line data
      lines.each do |line|
        unless line.strip.empty?
          key, value = line.strip.split(": ", 2)
          store_data(key, value)
        end
      end
    end
  end
end
respond_to_missing?(method, include_all) click to toggle source
Calls superclass method
# File lib/mtif/posts.rb, line 120
def respond_to_missing?(method, include_all)
  key = method.to_s.chomp('=').to_sym

  valid_key?(key) || super
end
store_data(raw_key, raw_value) click to toggle source
# File lib/mtif/posts.rb, line 149
def store_data(raw_key, raw_value)
  key = mtif_key_to_key(raw_key)
  value = convert_to_native_type(raw_value)

  if MULTIVALUE_KEYS.include?(key)
    if CSV_KEYS.include?(key)
      value.split(',').each do |v|
        self.data[key] << v.gsub(/^\"|\"$/, '') unless v.empty?
      end
    else
      self.data[key] << value unless value.empty?
    end
  else
    self.data[key] = value
  end
end