Class: ActionBlocks::BaseBuilder

Inherits:
Object
  • Object
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

Instance Method Summary collapse

Constructor Details

#initializeBaseBuilder

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_delegateObject

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

#idObject

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_fieldsObject



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_classObject



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_helpersObject



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_loadObject



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

#freezeObject

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

Returns:

  • (Boolean)


193
194
195
# File 'lib/action_blocks/builders/base_builder.rb', line 193

def is_block?
  false
end

#keyObject



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_referenceObject



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).

Returns:

  • (Boolean)


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