class Delayed::PsychExt::ToRuby

Public Class Methods

create() click to toggle source
# File lib/delayed/psych_ext.rb, line 25
def self.create
  new
end

Public Instance Methods

resolve_class(klass_name) click to toggle source
Calls superclass method
# File lib/delayed/psych_ext.rb, line 81
def resolve_class(klass_name)
  return nil if !klass_name || klass_name.empty?
  klass_name.constantize
rescue
  super
end
visit_Psych_Nodes_Mapping(object) click to toggle source
Calls superclass method
# File lib/delayed/psych_ext.rb, line 30
def visit_Psych_Nodes_Mapping(object) # rubocop:disable CyclomaticComplexity, MethodName, PerceivedComplexity
  return revive(Psych.load_tags[object.tag], object) if Psych.load_tags[object.tag]

  case object.tag
  when %r{^!ruby/object}
    result = super
    if defined?(ActiveRecord::Base) && result.is_a?(ActiveRecord::Base)
      klass = result.class
      id = result[klass.primary_key]
      begin
        klass.find(id)
      rescue ActiveRecord::RecordNotFound => error # rubocop:disable BlockNesting
        raise Delayed::DeserializationError, "ActiveRecord::RecordNotFound, class: #{klass}, primary key: #{id} (#{error.message})"
      end
    else
      result
    end
  when %r{^!ruby/ActiveRecord:(.+)$}
    klass = resolve_class(Regexp.last_match[1])
    payload = Hash[*object.children.map { |c| accept c }]
    id = payload['attributes'][klass.primary_key]
    id = id.value if defined?(ActiveRecord::Attribute) && id.is_a?(ActiveRecord::Attribute)
    begin
      klass.unscoped.find(id)
    rescue ActiveRecord::RecordNotFound => error
      raise Delayed::DeserializationError, "ActiveRecord::RecordNotFound, class: #{klass}, primary key: #{id} (#{error.message})"
    end
  when %r{^!ruby/Mongoid:(.+)$}
    klass = resolve_class(Regexp.last_match[1])
    payload = Hash[*object.children.map { |c| accept c }]
    id = payload['attributes']['_id']
    begin
      klass.find(id)
    rescue Mongoid::Errors::DocumentNotFound => error
      raise Delayed::DeserializationError, "Mongoid::Errors::DocumentNotFound, class: #{klass}, primary key: #{id} (#{error.message})"
    end
  when %r{^!ruby/DataMapper:(.+)$}
    klass = resolve_class(Regexp.last_match[1])
    payload = Hash[*object.children.map { |c| accept c }]
    begin
      primary_keys = klass.properties.select(&:key?)
      key_names = primary_keys.map { |p| p.name.to_s }
      klass.get!(*key_names.map { |k| payload['attributes'][k] })
    rescue DataMapper::ObjectNotFoundError => error
      raise Delayed::DeserializationError, "DataMapper::ObjectNotFoundError, class: #{klass} (#{error.message})"
    end
  else
    super
  end
end