class Filemaker::Metadata::Field

Attributes

data_type[R]

@return [String] one of 'text', 'number', 'date', 'time', 'timestamp', or 'container'

field_type[R]

@return [String] one of 'normal', 'calculation', or 'summary'

global[R]

@return [Boolean] whether it is a global field

name[R]

@return [String] name of the field

repeats[R]

@return [Integer] how many times the <data> repeats

required[R]

@return [Boolean] indicates if field is required or not

Public Class Methods

new(definition, resultset) click to toggle source
# File lib/filemaker/metadata/field.rb, line 26
def initialize(definition, resultset)
  @name       = definition['name']
  @data_type  = definition['result']
  @field_type = definition['type']
  @repeats    = definition['max-repeat'].to_i
  @global     = convert_to_boolean(definition['global'])
  @required   = convert_to_boolean(definition['not-empty'])
  @resultset  = resultset
end

Public Instance Methods

raw_cast(value) click to toggle source

Raw XML data `inner_text` into Ruby native object as best we can based on its built-in metadata's data_type

# File lib/filemaker/metadata/field.rb, line 43
def raw_cast(value)
  value = value.to_s.strip
  return nil if value.empty?

  case data_type
  when 'number'
    BigDecimal(remove_decimal_mark(value))
  when 'date'
    # date_format likely will be '%m/%d/%Y', but if we got '19/8/2014',
    # then `strptime` will raise invalid date error
    # Sometimes we can get '27/11 /1981' also :(
    begin
      Date.strptime(value, @resultset.date_format)
    rescue StandardError
      # We could be getting back these date:
      # '17.12.95', '19/05/99', '27/11 /1981'
      # '1959-07-03' will be beyond us, so consider returning exact value
      value = value.gsub(/-|\./, '/')
      split = value.split('/').map(&:strip)
      split[2] = "19#{split[2]}" if split[2].size == 2
      value = split.join('/')

      Date.strptime(
        Date.parse(value)
          .strftime(@resultset.date_format), @resultset.date_format
      )
    end
  when 'time'
    DateTime.strptime("1/1/-4712 #{value}", @resultset.timestamp_format)
  when 'timestamp'
    DateTime.strptime(value, @resultset.timestamp_format)
  when 'container'
    # container may return value that include URI scheme already
    return URI.parse(value) if value.start_with?('http')
    URI.parse("#{@resultset.server.url}#{value}")
  else
    value
  end
rescue StandardError => e
  warn "Could not coerce #{name}: #{value} due to #{e.message}"
  value
end
remove_decimal_mark(value) click to toggle source

Remove dollar sign also

# File lib/filemaker/metadata/field.rb, line 37
def remove_decimal_mark(value)
  value.delete('$,')
end

Private Instance Methods

convert_to_boolean(value) click to toggle source

'yes' != 'no' => true 'no' != 'no' => false

# File lib/filemaker/metadata/field.rb, line 90
def convert_to_boolean(value)
  value != 'no'
end