Class: Engine2::TypeInfo

Inherits:
Object show all
Defined in:
lib/engine2/type_info.rb

Instance Method Summary collapse

Constructor Details

#initialize(model) ⇒ TypeInfo

Returns a new instance of TypeInfo.



6
7
8
9
# File 'lib/engine2/type_info.rb', line 6

def initialize model
    @model = model
    @info = model.type_info
end

Instance Method Details

#any_field(field) ⇒ Object



46
47
48
49
# File 'lib/engine2/type_info.rb', line 46

def any_field field
    define_field field, :any do |info|
    end
end

#blob_field(field, length) ⇒ Object



58
59
60
61
62
# File 'lib/engine2/type_info.rb', line 58

def blob_field field, length
    define_field field, :blob do |info|
        info[:length] = length
    end
end

#blob_store_field(name, name_field, mime_field) ⇒ Object



257
258
259
260
261
262
263
264
265
# File 'lib/engine2/type_info.rb', line 257

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 = 1, false_value = 0) ⇒ Object



241
242
243
244
245
246
247
248
# File 'lib/engine2/type_info.rb', line 241

def boolean field, true_value = 1, false_value = 0
    modify_field field do |info|
        info[:type] = :boolean
        info[:true_value] = true_value
        info[:false_value] = false_value
        info[:validations][:boolean] = true
    end
end

#currency(field) ⇒ Object



250
251
252
253
254
255
# File 'lib/engine2/type_info.rb', line 250

def currency field
    modify_field field do |info|
        info[:type] = :currency
        info[:validations][:currency] = true
    end
end

#date_field(field, format, model_format) ⇒ Object



70
71
72
73
74
75
76
# File 'lib/engine2/type_info.rb', line 70

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) ⇒ Object



224
225
226
227
228
229
230
231
# File 'lib/engine2/type_info.rb', line 224

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) ⇒ Object



233
234
235
236
237
238
239
# File 'lib/engine2/type_info.rb', line 233

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) ⇒ Object



86
87
88
89
90
91
92
93
94
# File 'lib/engine2/type_info.rb', line 86

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 = , model_format = "yyyyMMdd") ⇒ Object



111
112
113
114
115
116
117
118
# File 'lib/engine2/type_info.rb', line 111

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) ⇒ Object



96
97
98
99
100
101
102
103
104
# File 'lib/engine2/type_info.rb', line 96

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 = , model_format = "HHmmss", model_regexp = /^(\d{2})(\d{2})(\d{2})$/) ⇒ Object



120
121
122
123
124
125
126
127
128
# File 'lib/engine2/type_info.rb', line 120

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}}) ⇒ Object



318
319
320
321
322
323
324
325
326
# File 'lib/engine2/type_info.rb', line 318

def decode name, dinfo = {form: {scaffold: true}, search: {scaffold: true}}
    modify_field name do |info|
        raise E2Error.new("Field type of #{name} 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) ⇒ Object



130
131
132
133
134
# File 'lib/engine2/type_info.rb', line 130

def default field, value
    modify_field field do |info|
        info[:default] = value
    end
end

#define_field(field, type) {|info| ... } ⇒ Object

Yields:

  • (info)

Raises:



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 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,
        type: type,
        validations: {}
    })
    yield info
end

#depends_on(what, *on) ⇒ Object



34
35
36
37
38
# File 'lib/engine2/type_info.rb', line 34

def depends_on what, *on
    modify_field what do |info|
        (info[:depends] ||= []).concat(on)
    end
end

#dont_strip(field) ⇒ Object



155
156
157
158
159
# File 'lib/engine2/type_info.rb', line 155

def dont_strip field
    modify_field field do |info|
        info[:dont_strip] = true
    end
end

#email(field, message = ) ⇒ Object



191
192
193
194
195
196
# File 'lib/engine2/type_info.rb', line 191

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 = {}) ⇒ Object



204
205
206
207
208
209
210
211
212
213
214
215
216
# File 'lib/engine2/type_info.rb', line 204

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] ||= "#{APP_LOCATION}/store/upload"
        info[:store][:files] ||= "#{APP_LOCATION}/store/files"
        info[:transaction] = true
    end
end

#fix_decimal(field, size, scale) ⇒ Object



167
168
169
170
171
172
173
174
175
# File 'lib/engine2/type_info.rb', line 167

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) ⇒ Object

Raises:



267
268
269
270
271
272
273
274
275
276
277
278
# File 'lib/engine2/type_info.rb', line 267

def foreign_blob_store_field assoc_name, name, name_field, mime_field
    assoc = @model.association_reflections[assoc_name]
    raise E2Error.new("Association '#{assoc_name}' not found for model '#{@model}'") unless assoc
    raise E2Error.new("Association '#{assoc_name}' in model '#{@mode}' is not of type many_to_one") unless assoc[:type] == :many_to_one
    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 = ) ⇒ Object



218
219
220
221
222
# File 'lib/engine2/type_info.rb', line 218

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) ⇒ Object



64
65
66
67
68
# File 'lib/engine2/type_info.rb', line 64

def integer_field field
    define_field field, :integer do |info|
        info[:validations][:integer] = true
    end
end

#list_select(name, list) ⇒ Object



304
305
306
307
308
309
310
311
312
313
314
315
316
# File 'lib/engine2/type_info.rb', line 304

def list_select name, list
    modify_field name do |info|
        info[:type] = :list_select
        info[:list] = case list
            when Hash
                # list.map{|k, v| {id: k, value: v}}
                list.to_a
            else
                raise E2Error.new("type not supported for list_select modifier for field #{name}")
        end
        info[:validations][:list_select] = true
    end
end

#many_to_one_field(assoc_name) ⇒ Object

Raises:



280
281
282
283
284
285
286
287
288
289
290
# File 'lib/engine2/type_info.rb', line 280

def many_to_one_field assoc_name
    assoc = @model.association_reflections[assoc_name]
    raise E2Error.new("Association '#{assoc_name}' not found for model '#{@model}'") unless assoc
    raise E2Error.new("Association '#{assoc_name}' in model '#{@mode}' is not of type many_to_one") unless assoc[:type] == :many_to_one
    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| ... } ⇒ Object

Yields:

  • (info)

Raises:



28
29
30
31
32
# File 'lib/engine2/type_info.rb', line 28

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) ⇒ Object



40
41
42
43
44
# File 'lib/engine2/type_info.rb', line 40

def null_value field, value
    modify_field field do |info|
        info[:null_value] = value
    end
end

#optional(field) ⇒ Object



144
145
146
147
148
149
# File 'lib/engine2/type_info.rb', line 144

def optional field
    modify_field field do |info|
        info.delete(:required)
        info[:optional] = true
    end
end

#optionals(*fields) ⇒ Object



151
152
153
# File 'lib/engine2/type_info.rb', line 151

def optionals *fields
    fields.each{|f|optional f}
end

#password(field) ⇒ Object



198
199
200
201
202
# File 'lib/engine2/type_info.rb', line 198

def password field
    modify_field field do |info|
        info[:type] = :password
    end
end

#primary_key(field) ⇒ Object



161
162
163
164
165
# File 'lib/engine2/type_info.rb', line 161

def primary_key field
    modify_field field do |info|
        info[:primary_key] = true
    end
end

#required(field, message = , &blk) ⇒ Object



136
137
138
139
140
141
142
# File 'lib/engine2/type_info.rb', line 136

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) ⇒ Object



335
336
337
338
339
# File 'lib/engine2/type_info.rb', line 335

def sequence name, seq_name
    modify_field name do |info|
        info[:sequence] = seq_name
    end
end

#star_to_many_field(assoc_name) ⇒ Object

Raises:



292
293
294
295
296
297
298
299
300
301
302
# File 'lib/engine2/type_info.rb', line 292

def star_to_many_field assoc_name
    assoc = @model.association_reflections[assoc_name]
    raise E2Error.new("Association '#{assoc_name}' not found for model '#{@model}'") unless assoc
    raise E2Error.new("Association '#{assoc_name}' in model '#{@model}' is not of type *_to_many") unless [:one_to_many, :many_to_many].include?(assoc[:type])
    define_field assoc_name, :string do |info|
        info[:type] = :star_to_many_field
        info[:keys] = assoc[:keys]
        info[:assoc_name] = assoc_name
        info[:transaction] = true # ?
    end
end

#string_field(field, length) ⇒ Object



51
52
53
54
55
56
# File 'lib/engine2/type_info.rb', line 51

def string_field field, length
    define_field field, :string do |info|
        info[:length] = length
        info[:validations][:string_length] = true
    end
end

#text_field(field) ⇒ Object



106
107
108
109
# File 'lib/engine2/type_info.rb', line 106

def text_field field
    define_field field, :text do |info|
    end
end

#time_field(field, format, model_format) ⇒ Object



78
79
80
81
82
83
84
# File 'lib/engine2/type_info.rb', line 78

def time_field field, format, model_format
    define_field field, :time do |info|
        info[:format] = format
        info[:model_format] = model_format
        info[:validations][:time] = true
    end
end

#unique(field, *with) ⇒ Object

def validation field, name, opts = true

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

end



183
184
185
186
187
188
189
# File 'lib/engine2/type_info.rb', line 183

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) ⇒ Object

Raises:



328
329
330
331
332
333
# File 'lib/engine2/type_info.rb', line 328

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