class Determinator::Explainer

Constants

MESSAGES

Attributes

enabled[RW]
logs[R]

Public Class Methods

new() click to toggle source
# File lib/determinator/explainer.rb, line 8
def initialize
  @logs  = []
  @enabled = false
end

Public Instance Methods

explain() { || ... } click to toggle source
# File lib/determinator/explainer.rb, line 13
def explain
  @enabled = true
  { outcome: yield, explanation: @logs }
ensure
  @logs = []
  @enabled = false
end
log(type, args = {}) { |: nil| ... } click to toggle source
# File lib/determinator/explainer.rb, line 21
def log(type, args = {})
  result = block_given? ? yield : nil

  return result unless @enabled

  result.tap do |r|
    add(type, r, args)
  end
end

Private Instance Methods

add(type, result, args = {}) click to toggle source
# File lib/determinator/explainer.rb, line 33
def add(type, result, args = {})
  template = MESSAGES[type].fetch(result.to_s) { MESSAGES[type][:default] }
  return unless template

  args = convert_hash(
    args.merge(result: result)
      .transform_values { |v| v.respond_to?(:to_explain_params) ? v.to_explain_params : v }
  )

  @logs << template.dup.tap do |m|
    m[:title] = format(m[:title], args)
    m[:subtitle] = format(m[:subtitle], args) if m[:subtitle]
  end
  true
end
convert_hash(hsh, path = "") click to toggle source
# File lib/determinator/explainer.rb, line 49
def convert_hash(hsh, path = "")
  hsh.each_with_object({}) do |(k, v), ret|
    key = "#{path}#{k}"

    if v.is_a?(Hash)
      ret.merge! convert_hash(v, "#{key}.")
    else
      ret[key.to_sym] = v
    end
  end
end