Class: Filemaker::Metadata::Field

Inherits:
Object
  • Object
show all
Defined in:
lib/filemaker/metadata/field.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(definition, resultset) ⇒ Field

Returns a new instance of Field.



26
27
28
29
30
31
32
33
34
# 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

Instance Attribute Details

#data_typeString (readonly)

‘timestamp’, or ‘container’

Returns:

  • (String)

    one of ‘text’, ‘number’, ‘date’, ‘time’,



12
13
14
# File 'lib/filemaker/metadata/field.rb', line 12

def data_type
  @data_type
end

#field_typeString (readonly)

Returns one of ‘normal’, ‘calculation’, or ‘summary’.

Returns:

  • (String)

    one of ‘normal’, ‘calculation’, or ‘summary’



15
16
17
# File 'lib/filemaker/metadata/field.rb', line 15

def field_type
  @field_type
end

#globalBoolean (readonly)

Returns whether it is a global field.

Returns:

  • (Boolean)

    whether it is a global field



24
25
26
# File 'lib/filemaker/metadata/field.rb', line 24

def global
  @global
end

#nameString (readonly)

Returns name of the field.

Returns:

  • (String)

    name of the field



8
9
10
# File 'lib/filemaker/metadata/field.rb', line 8

def name
  @name
end

#repeatsInteger (readonly)

Returns how many times the <data> repeats.

Returns:

  • (Integer)

    how many times the <data> repeats



18
19
20
# File 'lib/filemaker/metadata/field.rb', line 18

def repeats
  @repeats
end

#requiredBoolean (readonly)

Returns indicates if field is required or not.

Returns:

  • (Boolean)

    indicates if field is required or not



21
22
23
# File 'lib/filemaker/metadata/field.rb', line 21

def required
  @required
end

Instance Method Details

#raw_cast(value) ⇒ Object

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



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# 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) ⇒ Object

Remove dollar sign also



37
38
39
# File 'lib/filemaker/metadata/field.rb', line 37

def remove_decimal_mark(value)
  value.delete('$,')
end