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

jruby_is_seriously_borked() click to toggle source

defined? is triggering something really messed up in jruby causing both the if AND else clauses to execute, however if the check is run here, everything is fine

# File lib/delayed/psych_ext.rb, line 84
def jruby_is_seriously_borked
  defined?(ActiveRecord::Base)
end
resolve_class(klass_name) click to toggle source
Calls superclass method
# File lib/delayed/psych_ext.rb, line 88
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 jruby_is_seriously_borked && result.is_a?(ActiveRecord::Base)
      klass = result.class
      id = result[klass.primary_key]
      begin
        klass.unscoped.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