class BindingDumper::Dumpers::ObjectDumper

Class responsible for converting objects to marshalable Hash

@example

o = Object.new
dump = BindingDumper::Dumpers::Array.new(o).convert
# => { marshalable: :hash }
BindingDumper::Dumpers::Array.new(dump).deconvert
# => o

Public Instance Methods

can_convert?() click to toggle source

Returns true if ObjectDumper can convert passed abstract_object

@return [true, false]

# File lib/binding_dumper/dumpers/object_dumper.rb, line 18
def can_convert?
  true
end
can_deconvert?() click to toggle source

Returns true if ObjectDumper can deconvert passed abstract_object

@return [true, false]

# File lib/binding_dumper/dumpers/object_dumper.rb, line 26
def can_deconvert?
  abstract_object.is_a?(Hash) &&
    (
      abstract_object.has_key?(:_klass) ||
      abstract_object.has_key?(:_object) ||
      abstract_object.has_key?(:_old_object_id)
    )
end
convert() click to toggle source

Converts passed abstract_object to marshalable Hash

@return [Hash]

# File lib/binding_dumper/dumpers/object_dumper.rb, line 39
def convert
  unless should_convert?
    return { _existing_object_id: object.object_id }
  end

  if can_be_fully_dumped?(object)
    {
      _object: object
    }
  elsif undumpable?(object)
    {
      _klass: object.class,
      _undumpable: true
    }
  else
    dumped_ids << object.object_id
    {
      _klass: object.class,
      _ivars: converted_ivars(dumped_ids),
      _old_object_id: object.object_id
    }
  end
end
deconvert() { |result| ... } click to toggle source

Deconverts passed abstract_object back to the original state

@return [Object]

# File lib/binding_dumper/dumpers/object_dumper.rb, line 67
def deconvert
  if object.has_key?(:_object)
    object[:_object]
  else
    klass = object[:_klass]
    result = klass.allocate
    return result if object[:_undumpable]

    yield result

    object[:_ivars].each do |ivar_name, converted_ivar|
      ivar = UniversalDumper.deconvert(converted_ivar)
      result.instance_variable_set(ivar_name, ivar)
    end

    if result.respond_to?(:restored_from_binding)
      result.restored_from_binding
    end

    result
  end
end

Private Instance Methods

converted_ivars(dumped_ids = []) click to toggle source

Returns converted mapping of instance variables like

{ instance variable name => instance variable value }

@return [Hash]

# File lib/binding_dumper/dumpers/object_dumper.rb, line 97
def converted_ivars(dumped_ids = [])
  converted = object.instance_variables.map do |ivar_name|
    ivar = object.instance_variable_get(ivar_name)
    conveted_ivar = UniversalDumper.convert(ivar, dumped_ids)
    [ivar_name, conveted_ivar]
  end.reject(&:empty?)
  Hash[converted]
end