|  | module DryRunnable
  def dry_run!
    readonly!
    class << self
      prepend Sandbox
    end
    log = StringIO.new
    @dry_run_logger = Logger.new(log)
    @dry_run_results = {
      events: [],
    }
    begin
      raise "#{short_type} does not support dry-run" unless can_dry_run?
      check
    rescue => e
      error "Exception during dry-run. #{e.message}: #{e.backtrace.join("\n")}"
    end
    @dry_run_results.update(
      memory: memory,
      log: log.string,
    )
  end
  def dry_run?
    is_a? Sandbox
  end
  module Sandbox
    attr_accessor :results
    def logger
      @dry_run_logger
    end
    def save
      valid?
    end
    def save!
      save or raise ActiveRecord::RecordNotSaved
    end
    def log(message, options = {})
      case options[:level] || 3
      when 0..2
        sev = Logger::DEBUG
      when 3
        sev = Logger::INFO
      else
        sev = Logger::ERROR
      end
      logger.log(sev, message)
    end
    def create_event(event_hash)
      if can_create_events?
        @dry_run_results[:events] << event_hash[:payload]
        events.build({ user: user, expires_at: new_event_expiration_date }.merge(event_hash))
      else
        error "This Agent cannot create events!"
      end
    end
  end
end
 |