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