class RuleBox::Facade

Attributes

_current_method[R]
bucket[R]
data[R]
errors[R]
executed[R]
model[R]
show_steps[RW]
status[R]
steps[R]

Public Class Methods

new(**dependencies) click to toggle source
# File lib/rule_box/facade.rb, line 7
def initialize(**dependencies)
  errors = []
  settings.dependencies.each do |key, block|
    begin
      if dependencies.key? key
        value = dependencies[key]
        block&.call(value, errors)
      else
        errors << "missing keyword: #{key}"
      end
    rescue StandardError => e
      errors << e.message
    end
  end

  raise errors.join("\n") unless errors.empty?

  dependencies.each { |key, value| keys["current_#{key}".to_sym] = value }
  @executed = false
  @show_steps = settings.show_steps
end

Private Class Methods

clear_configuration() click to toggle source
# File lib/rule_box/facade.rb, line 169
def clear_configuration
  @settings = Settings.new
end
configure() { |settings| ... } click to toggle source
# File lib/rule_box/facade.rb, line 165
def configure
  yield(settings) if block_given?
end
settings() click to toggle source
# File lib/rule_box/facade.rb, line 173
def settings
  @settings ||= Settings.new
end

Public Instance Methods

_current_class() click to toggle source
# File lib/rule_box/facade.rb, line 45
def _current_class
  @_current_class ||=
    if model.nil?
      nil
    elsif model.is_a?(Class) || model.is_a?(Module)
      model
    elsif model.is_a?(Symbol) || model.is_a?(String)
      Object.const_get RuleBox::Util.camelize(model.to_s)
    else
      Object.const_get model.class.name
    end
end
as_json(**options) click to toggle source
# File lib/rule_box/facade.rb, line 71
def as_json(**options)
  options.key?(:root) ? { self.class.name.to_sym => attributes } : attributes
end
attributes() click to toggle source
# File lib/rule_box/facade.rb, line 58
def attributes
  attrs = {}
  %i[model status data bucket executed errors steps _current_method].each do |key|
    value = send key
    attrs[key] = value
  end
  attrs
end
delete(model, **args) click to toggle source
# File lib/rule_box/facade.rb, line 41
def delete(model, **args)
  execute(:delete, model, args)
end
insert(model, **args) click to toggle source
# File lib/rule_box/facade.rb, line 29
def insert(model, **args)
  execute(:insert, model, args)
end
select(model, **args) click to toggle source
# File lib/rule_box/facade.rb, line 33
def select(model, **args)
  execute(:select, model, args)
end
to_json(**args) click to toggle source
# File lib/rule_box/facade.rb, line 67
def to_json(**args)
  JSON.generate(as_json(args), args)
end
to_s() click to toggle source
# File lib/rule_box/facade.rb, line 75
def to_s
  as_json(root: true).to_s
end
update(model, **args) click to toggle source
# File lib/rule_box/facade.rb, line 37
def update(model, **args)
  execute(:update, model, args)
end

Private Instance Methods

add_step(value) click to toggle source
# File lib/rule_box/facade.rb, line 145
def add_step(value)
  new_value = "[#{DateTime.now.strftime('%FT%T.%L%:z')}] #{value}"
  puts new_value if show_steps || settings.show_steps
  steps << new_value
end
execute(method, model, **args) click to toggle source
# File lib/rule_box/facade.rb, line 96
def execute(method, model, **args)
  raise 'Process already executed' if @executed

  @executed = true
  @status = :green
  @bucket = RuleBox::Hash.new
  args.each { |key, value| bucket[key] = value }
  pre_process(method, model)
end
keys() click to toggle source
# File lib/rule_box/facade.rb, line 159
def keys
  @keys ||= {}
end
marshal_dump() click to toggle source
# File lib/rule_box/facade.rb, line 151
def marshal_dump
  instance_variables.map { |name| [name, instance_variable_get(name)] }.to_h
end
marshal_load(variables) click to toggle source
# File lib/rule_box/facade.rb, line 155
def marshal_load(variables)
  variables.each { |key, value| instance_variable_set(key, value) }
end
method_missing(method, *parameters) click to toggle source
Calls superclass method
# File lib/rule_box/facade.rb, line 81
def method_missing(method, *parameters)
  super if parameters.empty?
  super if method.to_s.end_with? '='

  model = parameters[0]
  args = parameters[1] || {}
  execute(method, model, args)
end
pre_process(method, model) click to toggle source
# File lib/rule_box/facade.rb, line 106
def pre_process(method, model)
  @model = model
  @_current_method = method
  class_name = _current_class
  @errors = []
  @steps = []

  add_step "{ method: #{method}, model: #{class_name}, args: #{bucket} }"
  strategies = class_name.strategies(method)&.map { |strategy| strategy.new(self) }
  unless strategies
    raise "class [#{class_name}] without mapped rules to [#{method}]'"
  end

  process(strategies)
end
process(strategies) click to toggle source
# File lib/rule_box/facade.rb, line 122
def process(strategies)
  add_step "amount of rules #{strategies.count}"

  strategies.each do |strategy|
    add_step "executing of rule: #{strategy.class.name}."
    strategy.process

    break if status == :red
  end
rescue Exception => e
  errors << settings.default_error_message
  @status = :red
  block = settings.resolve
  block.call(e, RuleBox::Proxy.new(self)) if block.is_a? Proc
ensure
  add_step 'finalized the process on the facade.'
  return self
end
respond_to_missing?(method, _include_private = false) click to toggle source
Calls superclass method
# File lib/rule_box/facade.rb, line 90
def respond_to_missing?(method, _include_private = false)
  return false if @executed || method.to_s.end_with?('=')

  super
end
settings() click to toggle source
# File lib/rule_box/facade.rb, line 141
def settings
  RuleBox::Facade.settings
end