module H::Fields
Helpers
to use in ModalFields hooks to automatically generate _h declarations Examples of use
ModalFields.hook do decimal do |model, declaration| H::Fields.declare_numeric_field model, declaration end float do |model, declaration| H::Fields.declare_numeric_field model, declaration end integer do |model, declaration| H::Fields.declare_integer_field model, declaration end end ModalFields.hook do all_fields do |model, declaration| H::Fields.declare_auto_units_field model, declaration end end ModalFields.hook do all_fields do |model, declaration| H::Fields.declare_auto_field_with_units model, declaration end end
Public Class Methods
declare_auto_field_with_units(model, declaration)
click to toggle source
# File lib/h/fields.rb, line 138 def declare_auto_field_with_units(model, declaration) case declaration.type when :date declare_date_field model, declaration when :time declare_time_field model, declaration when :datetime declare_datetime_field model, declaration when :boolean declare_boolean_field model, declaration else declare_auto_units_field model, declaration end end
declare_auto_field_without_units(model, declaration)
click to toggle source
# File lib/h/fields.rb, line 153 def declare_auto_field_without_units(model, declaration) case declaration.type when :date declare_date_field model, declaration when :time declare_time_field model, declaration when :datetime declare_datetime_field model, declaration when :boolean declare_boolean_field model, declaration when :integer declare_integer_field model, declaration when :float, :decimal declare_numeric_field model, declaration end end
declare_auto_units_field(model, declaration)
click to toggle source
This is handy to be used in all_fields to make any field with a :units parameter or a valid units suffix a units_h field (and make other numberic fields _h too); If a field with a suffix corresponding to valid units should not be a measure, a :units=>nil parameter should be added.
# File lib/h/fields.rb, line 117 def declare_auto_units_field(model, declaration) if declaration.type==:float || declaration.type==:decimal || declaration.type==:integer units = declaration.attributes[:units] unless declaration.attributes.has_key?(:units) units = declaration.name.to_s.split('_').last end if units && units.to_s=='dms' declare_dms_field model, declaration elsif units && H::Units.valid?(units) declare_units_field model, declaration, units else raise ArgumentError, "Invalid units #{declaration.attributes[:units]} in declaration of #{model.name}" if declaration.attributes[:units] if declaration.type==:integer declare_integer_field model, declaration else declare_numeric_field model, declaration end end end end
declare_boolean_field(model, declaration)
click to toggle source
# File lib/h/fields.rb, line 83 def declare_boolean_field(model, declaration) model.logical_h declaration.name end
declare_date_field(model, declaration)
click to toggle source
# File lib/h/fields.rb, line 71 def declare_date_field(model, declaration) model.date_h declaration.name end
declare_datetime_field(model, declaration)
click to toggle source
# File lib/h/fields.rb, line 79 def declare_datetime_field(model, declaration) model.datetime_h declaration.name end
declare_dms_field(model, declaration)
click to toggle source
# File lib/h/fields.rb, line 87 def declare_dms_field(model, declaration) options = declaration.attributes.slice(:precision, :longitude, :latitude) if precision = declaration.attributes[:h_precision] options[:precision] = precision end declaration.remove_attributes! :h_precision, :longitude, :latitude model.dms_h declaration.name, options end
declare_integer_field(model, declaration)
click to toggle source
Integers can also be assigned a precision and presented as generic numbers
# File lib/h/fields.rb, line 49 def declare_integer_field(model, declaration) precision = declaration.attributes[:h_precision] || declaration.attributes[:precision] || 0 declaration.remove_attributes! :h_precision, :precision if precision==0 model.integer_h declaration.name else model.number_h declaration.name, :precision=>precision end end
declare_latitude_field(model, declaration)
click to toggle source
# File lib/h/fields.rb, line 105 def declare_latitude_field(model, declaration) options = declaration.attributes.slice(:precision).merge(:latitude=>true) if precision = declaration.attributes[:h_precision] options[:precision] = precision end declaration.remove_attributes! :h_precision model.dms_h declaration.name, options end
declare_longitude_field(model, declaration)
click to toggle source
# File lib/h/fields.rb, line 96 def declare_longitude_field(model, declaration) options = declaration.attributes.slice(:precision).merge(:longitude=>true) if precision = declaration.attributes[:h_precision] options[:precision] = precision end declaration.remove_attributes! :h_precision model.dms_h declaration.name, options end
declare_numeric_field(model, declaration)
click to toggle source
For numeric types, a display precision different from the stored precision can be selected with the :h_precision attribute:
# File lib/h/fields.rb, line 39 def declare_numeric_field(model, declaration) options = declaration.attributes.slice(:precision) if precision = declaration.attributes[:h_precision] options[:precision] = precision end declaration.remove_attributes! :h_precision model.number_h declaration.name, options end
declare_time_field(model, declaration)
click to toggle source
# File lib/h/fields.rb, line 75 def declare_time_field(model, declaration) model.time_h declaration.name end
declare_units_field(model, declaration, suffix_units=nil)
click to toggle source
# File lib/h/fields.rb, line 59 def declare_units_field(model, declaration, suffix_units=nil) options = declaration.attributes.slice(:precision, :units) options[:units] ||= suffix_units if precision = declaration.attributes[:h_precision] options[:precision] = precision end options[:precision] ||= {'m'=>1, 'mm'=>0, 'cm'=>0, 'km'=>3}[options[:units]] # TODO AppSettings declaration.remove_attributes! :h_precision, :units # declaration.replace!(:type=>:float) model.units_h declaration.name, options[:units], options end