class Engine2::TypeInfo

Public Class Methods

new(model) click to toggle source
# File lib/engine2/type_info.rb, line 6
def initialize model
    @model = model
    @info = model.type_info
end

Public Instance Methods

any_field(field) click to toggle source
# File lib/engine2/type_info.rb, line 47
def any_field field
    define_field field, :any do |info|
    end
end
blob_field(field, length) click to toggle source
# File lib/engine2/type_info.rb, line 59
def blob_field field, length
    define_field field, :blob do |info|
        info[:length] = length
    end
end
blob_store_field(name, name_field, mime_field) click to toggle source
# File lib/engine2/type_info.rb, line 277
def blob_store_field name, name_field, mime_field
    optional name
    define_field :"#{name}_blob", :blob_store do |info|
        info[:bytes_field] = name
        info[:name_field] = name_field
        info[:mime_field] = mime_field
        info[:transaction] = true
    end
end
boolean(field, true_value = true, false_value = false) click to toggle source
# File lib/engine2/type_info.rb, line 76
def boolean field, true_value = true, false_value = false
    modify_field field do |info|
        info[:type] = :boolean
        info[:true_value] = true_value
        info[:false_value] = false_value
        info[:validations][:boolean] = true
    end
end
boolean_field(field) click to toggle source
# File lib/engine2/type_info.rb, line 71
def boolean_field field
    define_field field, :boolean do |info|
    end
end
currency(field, symbol = LOCS[:currency_symbol]) click to toggle source
# File lib/engine2/type_info.rb, line 269
def currency field, symbol = LOCS[:currency_symbol]
    modify_field field do |info|
        info[:type] = :currency
        info[:symbol] = symbol
        info[:validations][:currency] = true
    end
end
date_field(field, format, model_format) click to toggle source
# File lib/engine2/type_info.rb, line 85
def date_field field, format, model_format
    define_field field, :date do |info|
        info[:format] = format
        info[:model_format] = model_format
        info[:validations][:date] = true
    end
end
date_range(from, to) click to toggle source
# File lib/engine2/type_info.rb, line 252
def date_range from, to
    depends_on(from, to)
    modify_field from do |info|
        # info[:type] = :date_range
        info[:other_date] = to
        info[:validations][:date_range] = true
    end
end
date_time(date, time) click to toggle source
# File lib/engine2/type_info.rb, line 261
def date_time date, time
    depends_on(date, time)
    modify_field date do |info|
        info[:other_time] = time
        info[:validations][:date_time] = true
    end
end
datetime_field(field, date_format, time_format, date_model_format, time_model_format) click to toggle source
# File lib/engine2/type_info.rb, line 108
def datetime_field field, date_format, time_format, date_model_format, time_model_format
    define_field field, :datetime do |info|
        info[:date_format] = date_format
        info[:time_format] = time_format
        info[:date_model_format] = date_model_format
        info[:time_model_format] = time_model_format
        info[:validations][:datetime] = true
    end
end
decimal_date(field, format = LOCS[:default_date_format], model_format = "yyyyMMdd") click to toggle source
# File lib/engine2/type_info.rb, line 133
def decimal_date field, format = LOCS[:default_date_format], model_format = "yyyyMMdd"
    modify_field field do |info|
        info[:type] = :decimal_date
        info[:format] = format
        info[:model_format] = model_format
        info[:validations][:decimal_date] = true
    end
end
decimal_field(field, size, scale) click to toggle source
# File lib/engine2/type_info.rb, line 118
def decimal_field field, size, scale
    define_field field, :decimal do |info|
        info[:validations][:decimal] = {
            scale: scale,
            size: size,
            regexp: (scale && size) ? /^\d{,#{size - scale}}(?:\.\d{,#{scale}})?$/ : nil
        }
    end
end
decimal_time(field, format = LOCS[:default_time_format], model_format = "HHmmss", model_regexp = /^(\d{2})(\d{2})(\d{2})$/) click to toggle source
# File lib/engine2/type_info.rb, line 142
def decimal_time field, format = LOCS[:default_time_format], model_format = "HHmmss", model_regexp = /^(\d{2})(\d{2})(\d{2})$/
    modify_field field do |info|
        info[:type] = :decimal_time
        info[:format] = format
        info[:model_format] = model_format
        info[:model_regexp] = model_regexp
        info[:validations][:decimal_time] = true
    end
end
decode(name, dinfo = {form: {scaffold: true}, search: {scaffold: true}}) click to toggle source
# File lib/engine2/type_info.rb, line 350
def decode name, dinfo = {form: {scaffold: true}, search: {scaffold: true}}
    modify_field name do |info|
        raise E2Error.new("Field type of '#{name}' in model '#{@model}' needs to be 'many_to_one'") unless info[:type] == :many_to_one
        dec = info[:decode] ||= {}
        dec[:search].clear if dinfo[:search] && dec[:search]
        dec[:form].clear if dinfo[:form] && dec[:form]
        info[:decode].rmerge!(dinfo)
    end
end
default(field, value) click to toggle source
# File lib/engine2/type_info.rb, line 152
def default field, value
    modify_field field do |info|
        info[:default] = value
    end
end
define_field(field, type) { |info| ... } click to toggle source
# File lib/engine2/type_info.rb, line 11
def define_field field, type
    info = @info[field]
    raise E2Error.new("Field '#{field}' already defined in model '#{@model}'") if info && info[:type]

    unless info
        @info[field] = info = {dummy: true}
        @model.dummies << field
    end

    info.merge!({
        name: field,
        otype: type,
        type: type,
        validations: {}
    })
    yield info
end
depends_on(what, *on) click to toggle source
# File lib/engine2/type_info.rb, line 35
def depends_on what, *on
    modify_field what do |info|
        (info[:depends] ||= []).concat(on)
    end
end
dont_strip(field) click to toggle source
# File lib/engine2/type_info.rb, line 177
def dont_strip field
    modify_field field do |info|
        info[:dont_strip] = true
    end
end
email(field, message = LOCS[:invalid_email_format]) click to toggle source
# File lib/engine2/type_info.rb, line 213
def email field, message = LOCS[:invalid_email_format]
    modify_field field do |info|
        info[:type] = :email
    end
    format field, /\w+\@\w+\.\w+/, message
end
file_store_field(field, multiple = true, table = :files, store = {}) click to toggle source
# File lib/engine2/type_info.rb, line 226
def file_store_field field, multiple = true, table = :files, store = {}
    # string_field field, 1000
    any_field field
    modify_field field do |info|
        info[:type] = :file_store
        info[:multiple] = multiple
        info[:table] = table
        info[:store] = store
        info[:store][:upload] ||= "#{Engine2::SETTINGS[:path]}/store/upload"
        info[:store][:files] ||= "#{Engine2::SETTINGS[:path]}/store/files"
        info[:transaction] = true
    end
end
fix_decimal(field, size, scale) click to toggle source
# File lib/engine2/type_info.rb, line 189
def fix_decimal field, size, scale
    modify_field field do |info|
        info[:validations][:decimal] = {
            scale: scale,
            size: size,
            regexp: /^\d{,#{size - scale}}(?:\.\d{,#{scale}})?$/
        }
    end
end
foreign_blob_store_field(assoc_name, name, name_field, mime_field) click to toggle source
# File lib/engine2/type_info.rb, line 287
def foreign_blob_store_field assoc_name, name, name_field, mime_field
    assoc = @model.many_to_one_associations[assoc_name]
    raise E2Error.new("'many_to_one' association '#{assoc_name}' not found for model '#{@model}'") unless assoc
    define_field :"#{assoc[:key]}_blob", :foreign_blob_store do |info|
        info[:assoc_name] = assoc_name
        info[:bytes_field] = name
        info[:name_field] = name_field
        info[:mime_field] = mime_field
        info[:transaction] = true
    end
end
format(field, pattern, message = LOCS[:invalid_format]) click to toggle source
# File lib/engine2/type_info.rb, line 240
def format field, pattern, message = LOCS[:invalid_format]
    modify_field field do |info|
        info[:validations][:format] = {pattern: pattern, message: message}
    end
end
integer_field(field) click to toggle source
# File lib/engine2/type_info.rb, line 65
def integer_field field
    define_field field, :integer do |info|
        info[:validations][:integer] = true
    end
end
length(field, len) click to toggle source
# File lib/engine2/type_info.rb, line 246
def length field, len
    modify_field field do |info|
        info[:length] = len
    end
end
list_select(name, options) click to toggle source
# File lib/engine2/type_info.rb, line 326
def list_select name, options
    modify_field name do |info|
        info[:type] = :list_select
        values = options[:values]

        if options[:multiselect]
            info[:multiselect] = true
            case info[:otype]
            when :string
                info[:separator] = options[:separator] || ';'
                info[:validations].delete(:string_length)
            when :integer
                info[:validations].delete(:integer)
            end
            info[:max_length] = options[:max_length] || 3
            info[:max_length_html] = options[:max_length_html] || LOCS[:list_select_selected]
        end

        raise E2Error.new("type '#{values.class}' not supported for list_select modifier for field #{name}") unless values.is_a?(Hash)
        info[:values] = values.to_a
        info[:validations][:list_select] = true unless values.empty?
    end
end
list_select_bits(values) click to toggle source
# File lib/engine2/type_info.rb, line 322
def list_select_bits values
    values.each_with_index.map{|a, i|[1 << i, a]}.to_h
end
many_to_one_field(assoc_name) click to toggle source
# File lib/engine2/type_info.rb, line 299
def many_to_one_field assoc_name
    assoc = @model.many_to_one_associations[assoc_name]
    raise E2Error.new("'many_to_one' association '#{assoc_name}' not found for model '#{@model}'") unless assoc
    keys = assoc[:keys]
    modify_field keys.first do |info|
        info[:type] = :many_to_one
        info[:keys] = keys
        info[:assoc_name] = assoc_name
    end
end
modify_field(field) { |info| ... } click to toggle source
# File lib/engine2/type_info.rb, line 29
def modify_field field
    info = @info[field]
    raise E2Error.new("No field '#{field}' defined for model '#{@model}'") unless info
    yield info
end
null_value(field, value) click to toggle source
# File lib/engine2/type_info.rb, line 41
def null_value field, value
    modify_field field do |info|
        info[:null_value] = value
    end
end
optional(field) click to toggle source
# File lib/engine2/type_info.rb, line 166
def optional field
    modify_field field do |info|
        info.delete(:required)
        info[:optional] = true
    end
end
optionals(*fields) click to toggle source
# File lib/engine2/type_info.rb, line 173
def optionals *fields
    fields.each{|f|optional f}
end
password(field) click to toggle source
# File lib/engine2/type_info.rb, line 220
def password field
    modify_field field do |info|
        info[:type] = :password
    end
end
primary_key(field) click to toggle source
# File lib/engine2/type_info.rb, line 183
def primary_key field
    modify_field field do |info|
        info[:primary_key] = true
    end
end
required(field, message = LOCS[:field_required], &blk) click to toggle source
# File lib/engine2/type_info.rb, line 158
def required field, message = LOCS[:field_required], &blk
    modify_field field do |info|
        raise E2Error.new("Required condition already provided for field #{field} in model #{@model}") if blk && info[:required] && info[:required][:if]
        info[:required] = {message: message}
        info[:required][:if] = blk if blk
    end
end
sequence(name, seq_name) click to toggle source
# File lib/engine2/type_info.rb, line 367
def sequence name, seq_name
    modify_field name do |info|
        info[:sequence] = seq_name
    end
end
star_to_many_field(assoc_name, schemes = Schemes::STMF_LINK) click to toggle source
# File lib/engine2/type_info.rb, line 310
def star_to_many_field assoc_name, schemes = Schemes::STMF_LINK
    assoc = @model.one_to_many_associations[assoc_name] || @model.many_to_many_associations[assoc_name]
    raise E2Error.new("'*_to_many' association '#{assoc_name}' not found for model '#{@model}'") unless assoc
    define_field assoc_name, :string do |info|
        info[:type] = :star_to_many_field
        info[:schemes] = schemes
        info[:keys] = assoc[:keys]
        info[:assoc_name] = assoc_name
        info[:transaction] = true
    end
end
string_field(field, length) click to toggle source
# File lib/engine2/type_info.rb, line 52
def string_field field, length
    define_field field, :string do |info|
        info[:length] = length
        info[:validations][:string_length] = true
    end
end
text_field(field) click to toggle source
# File lib/engine2/type_info.rb, line 128
def text_field field
    define_field field, :text do |info|
    end
end
time(field, format, model_format) click to toggle source
# File lib/engine2/type_info.rb, line 99
def time field, format, model_format
    modify_field field do |info|
        info[:type] = :time
        info[:format] = format
        info[:model_format] = model_format
        info[:validations][:time] = true
    end
end
time_field(field, format, model_format) click to toggle source
# File lib/engine2/type_info.rb, line 93
def time_field field, format, model_format
    define_field field, :time do |info|
    end
    time field, format, model_format
end
unique(field, *with) click to toggle source

def validation field, name, opts = true

modify_field field do |info|
    info[:validations][name] = opts
end

end

# File lib/engine2/type_info.rb, line 205
def unique field, *with
    depends_on(field, *with)
    modify_field field do |info|
        info[:transaction] = true
        info[:validations][:unique] = {with: with}
    end
end
validate(name, validation_name = nil, &blk) click to toggle source
# File lib/engine2/type_info.rb, line 360
def validate name, validation_name = nil, &blk
    raise E2Error.new("Local validation '#{validation_name}' in model '#{@model}' conflicts with builtin validation") if validation_name && Validations[validation_name]
    modify_field name do |info|
        info[:validations][validation_name || :"#{@model.table_name}_#{name}_#{info[:validations].size}"] = {lambda: blk}
    end
end