Class: Engine2::TypeInfo
Instance Method Summary collapse
- #any_field(field) ⇒ Object
- #blob_field(field, length) ⇒ Object
- #blob_store_field(name, name_field, mime_field) ⇒ Object
- #boolean(field, true_value = 1, false_value = 0) ⇒ Object
- #currency(field) ⇒ Object
- #date_field(field, format, model_format) ⇒ Object
- #date_range(from, to) ⇒ Object
- #date_time(date, time) ⇒ Object
- #datetime_field(field, date_format, time_format, date_model_format, time_model_format) ⇒ Object
- #decimal_date(field, format = , model_format = "yyyyMMdd") ⇒ Object
- #decimal_field(field, size, scale) ⇒ Object
- #decimal_time(field, format = , model_format = "HHmmss", model_regexp = /^(\d{2})(\d{2})(\d{2})$/) ⇒ Object
- #decode(name, dinfo = {form: {scaffold: true}, search: {scaffold: true}}) ⇒ Object
- #default(field, value) ⇒ Object
- #define_field(field, type) {|info| ... } ⇒ Object
- #depends_on(what, *on) ⇒ Object
- #dont_strip(field) ⇒ Object
- #email(field, message = ) ⇒ Object
- #file_store_field(field, multiple = true, table = :files, store = {}) ⇒ Object
- #fix_decimal(field, size, scale) ⇒ Object
- #foreign_blob_store_field(assoc_name, name, name_field, mime_field) ⇒ Object
- #format(field, pattern, message = ) ⇒ Object
-
#initialize(model) ⇒ TypeInfo
constructor
A new instance of TypeInfo.
- #integer_field(field) ⇒ Object
- #list_select(name, list) ⇒ Object
- #many_to_one_field(assoc_name) ⇒ Object
- #modify_field(field) {|info| ... } ⇒ Object
- #null_value(field, value) ⇒ Object
- #optional(field) ⇒ Object
- #optionals(*fields) ⇒ Object
- #password(field) ⇒ Object
- #primary_key(field) ⇒ Object
- #required(field, message = , &blk) ⇒ Object
- #sequence(name, seq_name) ⇒ Object
- #star_to_many_field(assoc_name) ⇒ Object
- #string_field(field, length) ⇒ Object
- #text_field(field) ⇒ Object
- #time_field(field, format, model_format) ⇒ Object
-
#unique(field, *with) ⇒ Object
def validation field, name, opts = true modify_field field do |info| info[name] = opts end end.
- #validate(name, validation_name = nil, &blk) ⇒ Object
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
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, = LOCS[:invalid_email_format] modify_field field do |info| info[:type] = :email end format field, /\w+\@\w+\.\w+/, 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
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, = LOCS[:invalid_format] modify_field field do |info| info[:validations][:format] = {pattern: pattern, 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
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
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, = 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: } 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
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
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 |