Class: ActionBlocks::BaseBuilder
- Inherits:
-
Object
- Object
- ActionBlocks::BaseBuilder
show all
- Includes:
- ActiveModel::Validations
- Defined in:
- lib/action_blocks/builders/base_builder.rb
Constant Summary
collapse
- @@delegate_classes =
Dynamically create class to delegate dsl methods to
{}
- @@array_fields =
{}
Instance Attribute Summary collapse
Class Method Summary
collapse
-
.array_fields ⇒ Object
-
.block_type(t) ⇒ Object
-
.builds(field_name, klass) ⇒ Object
-
.builds_many(field_name, entry_method, klass) ⇒ Object
-
.delegate_class ⇒ Object
-
.includes_scheme_helpers ⇒ Object
-
.references(entry_method, block_type = nil, key_proc = nil, handler: nil) ⇒ Object
references :name_field, -> (s, obj) “field-“field-#{obj“field-#{obj.id-#s”} self.referendes block_type, [entry_method], [keyFn(f,Obj)].
-
.sets(field_name) ⇒ Object
-
.sets_many(field_name, entry_method) ⇒ Object
Instance Method Summary
collapse
Constructor Details
Returns a new instance of BaseBuilder.
161
162
163
164
165
166
|
# File 'lib/action_blocks/builders/base_builder.rb', line 161
def initialize()
@dsl_delegate = self.class.delegate_class.new(self)
self.class.array_fields.each do |array_field|
self.send("#{array_field}=", [])
end
end
|
Instance Attribute Details
#dsl_delegate ⇒ Object
Returns the value of attribute dsl_delegate.
4
5
6
|
# File 'lib/action_blocks/builders/base_builder.rb', line 4
def dsl_delegate
@dsl_delegate
end
|
#id ⇒ Object
Returns the value of attribute id.
4
5
6
|
# File 'lib/action_blocks/builders/base_builder.rb', line 4
def id
@id
end
|
Class Method Details
.array_fields ⇒ Object
28
29
30
31
32
33
34
|
# File 'lib/action_blocks/builders/base_builder.rb', line 28
def self.array_fields()
key = self.to_s
if @@array_fields[key] == nil
@@array_fields[key] = []
end
@@array_fields[key]
end
|
.block_type(t) ⇒ Object
6
7
8
9
10
|
# File 'lib/action_blocks/builders/base_builder.rb', line 6
def self.block_type(t)
self.define_method("type") do
return t
end
end
|
.builds(field_name, klass) ⇒ Object
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
# File 'lib/action_blocks/builders/base_builder.rb', line 43
def self.builds(field_name, klass)
self.send(:attr_accessor, field_name)
self.delegate_class.define_method(field_name) do |*p, &block|
dsl_class = eval(klass.to_s)
n = dsl_class.new()
n.id = p.first
n.before_build(@obj, *p)
if n.is_block?
ActionBlocks.store(n)
end
ActionBlocks.add_to_validator(n)
n.dsl_delegate.instance_eval(&block) if block!=nil
n.after_build(@obj, p.first)
@obj.send("#{field_name}=", n)
end
end
|
.builds_many(field_name, entry_method, klass) ⇒ Object
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
# File 'lib/action_blocks/builders/base_builder.rb', line 132
def self.builds_many(field_name, entry_method, klass)
self.array_fields().append(field_name)
self.define_method("#{field_name}_hash") do
Hash[self.send(field_name).map do |x|
[x.id, x]
end]
end
self.send(:attr_accessor, field_name)
self.delegate_class.define_method(entry_method) do |*p, &block|
dsl_class = eval(klass.to_s)
n = dsl_class.new()
n.id = p.first
n.before_build(@obj, *p)
if n.is_block?
ActionBlocks.store(n)
end
ActionBlocks.add_to_validator(n)
n.dsl_delegate.instance_eval(&block) if block!=nil
n.after_build(@obj, p.first)
if @obj.send(field_name) == nil
@obj.send("#{field_name}=",[n])
else
@obj.send(field_name).append(n)
end
end
end
|
.delegate_class ⇒ Object
16
17
18
19
20
21
22
23
24
25
26
|
# File 'lib/action_blocks/builders/base_builder.rb', line 16
def self.delegate_class()
key = self.to_s
if @@delegate_classes[key] == nil
@@delegate_classes[key] = Class.new() do
def initialize(obj)
@obj = obj
end
end
end
@@delegate_classes[key]
end
|
.includes_scheme_helpers ⇒ Object
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
# File 'lib/action_blocks/builders/base_builder.rb', line 110
def self.includes_scheme_helpers
self.delegate_class.define_method(:_and) do |*args|
return [:and, *args]
end
self.delegate_class.define_method(:_or) do |*args|
return [:or, *args]
end
self.delegate_class.define_method(:_eq) do |left, right|
return [:eq, left, right]
end
self.delegate_class.define_method(:_user) do |field|
return [:user, field]
end
self.delegate_class.define_method(:_not_eq) do |left, right|
return [:not_eq, left, right]
end
end
|
.references(entry_method, block_type = nil, key_proc = nil, handler: nil) ⇒ Object
references :name_field, -> (s, obj) “field-“field-#{obj“field-#{obj.id-#s”} self.referendes block_type, [entry_method], [keyFn(f,Obj)]
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
# File 'lib/action_blocks/builders/base_builder.rb', line 70
def self.references(entry_method, block_type=nil, key_proc=nil, handler: nil)
block_type = block_type || entry_method
self.send(:attr_accessor, "#{entry_method}_key")
if handler
self.delegate_class.define_method(entry_method) do |*p|
handler.call(@obj, *p)
end
else
self.delegate_class.define_method(entry_method) do |*p|
reference_key = "#{entry_method}_key"
if key_proc
k = key_proc.call(p.first, @obj)
else
k = "#{block_type}-#{p.first}"
end
@obj.send("#{entry_method}_key=", k)
end
end
self.define_method(entry_method) do
k = send("#{entry_method}_key")
if k
return ActionBlocks.find(k)
else
return nil
end
end
self.validate "#{entry_method}_reference_is_valid".to_sym
self.define_method("#{entry_method}_reference_is_valid") do
reference_key = send("#{entry_method}_key")
if reference_key
if !ActionBlocks.find(reference_key)
errors.add(entry_method.to_sym, "Reference #{reference_key} doesn't match any block in store.")
end
end
end
end
|
.sets(field_name) ⇒ Object
36
37
38
39
40
41
|
# File 'lib/action_blocks/builders/base_builder.rb', line 36
def self.sets(field_name)
self.send(:attr_accessor, field_name)
self.delegate_class.define_method(field_name) do |value|
@obj.send("#{field_name}=", value)
end
end
|
.sets_many(field_name, entry_method) ⇒ Object
60
61
62
63
64
65
66
|
# File 'lib/action_blocks/builders/base_builder.rb', line 60
def self.sets_many(field_name, entry_method)
self.array_fields().append(field_name)
self.send(:attr_accessor, field_name)
self.delegate_class.define_method(entry_method) do |*p, &block|
@obj.send(field_name).append(p.first)
end
end
|
Instance Method Details
#after_build(parent, *p) ⇒ Object
187
188
|
# File 'lib/action_blocks/builders/base_builder.rb', line 187
def after_build(parent, *p)
end
|
#after_load ⇒ Object
190
191
|
# File 'lib/action_blocks/builders/base_builder.rb', line 190
def after_load()
end
|
#before_build(parent, *p) ⇒ Object
184
185
|
# File 'lib/action_blocks/builders/base_builder.rb', line 184
def before_build(parent, *p)
end
|
#evaluate(&block) ⇒ Object
180
181
182
|
# File 'lib/action_blocks/builders/base_builder.rb', line 180
def evaluate(&block)
@dsl_delegate.instance_eval(&block)
end
|
#freeze ⇒ Object
Valid the object when freeze is called so the object
199
200
201
202
|
# File 'lib/action_blocks/builders/base_builder.rb', line 199
def freeze
self.valid?
super
end
|
#is_block? ⇒ Boolean
193
194
195
|
# File 'lib/action_blocks/builders/base_builder.rb', line 193
def is_block?
false
end
|
#key ⇒ Object
168
169
170
171
172
173
174
|
# File 'lib/action_blocks/builders/base_builder.rb', line 168
def key
if(is_block?)
"#{type}-#{@id}"
else
@id
end
end
|
#ui_reference ⇒ Object
176
177
178
|
# File 'lib/action_blocks/builders/base_builder.rb', line 176
def ui_reference()
key()
end
|
#valid?(context = nil) ⇒ Boolean
Runs all the specified validations and returns true if no errors were added otherwise false. Context can optionally be supplied to define which callbacks to test against (the context is defined on the validations using :on).
207
208
209
210
211
212
213
214
215
216
217
|
# File 'lib/action_blocks/builders/base_builder.rb', line 207
def valid?(context = nil)
unless self.frozen?
current_context, self.validation_context = validation_context, context
errors.clear
@valid = run_validations!
else
@valid
end
ensure
self.validation_context = current_context unless self.frozen?
end
|