Class: BindingDumper::Dumpers::ObjectDumper

Inherits:
Abstract
  • Object
show all
Defined in:
lib/binding_dumper/dumpers/object_dumper.rb

Overview

Class responsible for converting objects to marshalable Hash

Examples:

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

Instance Attribute Summary

Attributes inherited from Abstract

#dumped_ids

Instance Method Summary collapse

Methods inherited from Abstract

#initialize

Constructor Details

This class inherits a constructor from BindingDumper::Dumpers::Abstract

Instance Method Details

#can_convert?true, false

Returns true if ObjectDumper can convert passed abstract_object

Returns:

  • (true, false)


18
19
20
# File 'lib/binding_dumper/dumpers/object_dumper.rb', line 18

def can_convert?
  true
end

#can_deconvert?true, false

Returns true if ObjectDumper can deconvert passed abstract_object

Returns:

  • (true, false)


26
27
28
29
30
31
32
33
# 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

#convertHash

Converts passed abstract_object to marshalable Hash

Returns:

  • (Hash)


39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# 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

#deconvertObject

Deconverts passed abstract_object back to the original state

Returns:

  • (Object)


67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# 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