class BindingDumper::Dumpers::ClassDumper

Class responsible for converting classes to marshalable Hash

@example

class MyClass
  @a = 1
  @@b = 2
end
dump = BindingDumper::Dumpers::ClassDumper.new(MyClass).convert
# => { marshalable: :hash }
BindingDumper::Dumpers::ClassDumper.new(MyClass).deconvert
# => MyClass

Public Instance Methods

can_convert?() click to toggle source

Returns true if ClassDumper can convert passed abstract_object

@return [true, false]

# File lib/binding_dumper/dumpers/class_dumper.rb, line 21
def can_convert?
  klass.is_a?(Class)
end
can_deconvert?() click to toggle source

Returns true if ClassDumper can deconvert passed abstract_object

@return [true, false]

# File lib/binding_dumper/dumpers/class_dumper.rb, line 29
def can_deconvert?
  abstract_object.is_a?(Hash) &&
    (abstract_object.has_key?(:_cvars) || abstract_object.has_key?(:_anonymous))
end
convert() click to toggle source

Converts passed abstract_object to marshalable Hash

@return [Hash]

# File lib/binding_dumper/dumpers/class_dumper.rb, line 38
def convert
  return unless should_convert?
  dumped_ids << klass.object_id

  if klass.name
    {
      _klass: klass,
      _ivars: converted_ivars(dumped_ids),
      _cvars: converted_cvars(dumped_ids)
    }
  else
    {
      _anonymous: true
    }
  end

end
deconvert() click to toggle source

Deconverts passed abstract_object back to the original state

@return [Class]

# File lib/binding_dumper/dumpers/class_dumper.rb, line 60
def deconvert
  return Class.new if abstract_object[:_anonymous]
  klass, converted_ivars, converted_cvars = abstract_object[:_klass], abstract_object[:_ivars], abstract_object[:_cvars]

  converted_ivars.each do |ivar_name, converted_ivar|
    ivar = UniversalDumper.deconvert(converted_ivar)
    klass.instance_variable_set(ivar_name, ivar)
  end

  converted_cvars.each do |cvar_name, converted_cvar|
    cvar = UniversalDumper.deconvert(converted_cvar)
    klass.class_variable_set(cvar_name, cvar)
  end

  klass
end

Private Instance Methods

converted_cvars(dumped_ids = []) click to toggle source

Returns converted mapping of class variables like

{ class variable name => class variable vakue }

@return [Hash]

# File lib/binding_dumper/dumpers/class_dumper.rb, line 98
def converted_cvars(dumped_ids = [])
  converted = klass.class_variables.map do |cvar_name|
    ivar = klass.class_variable_get(cvar_name)
    if dumped_ids.include?(ivar.object_id)
      []
    else
      conveted_ivar = UniversalDumper.convert(ivar, dumped_ids)
      [cvar_name, conveted_ivar]
    end
  end
  Hash[converted]
end
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/class_dumper.rb, line 84
def converted_ivars(dumped_ids = [])
  converted = klass.instance_variables.map do |ivar_name|
    ivar = klass.instance_variable_get(ivar_name)
    conveted_ivar = UniversalDumper.convert(ivar, dumped_ids)
    [ivar_name, conveted_ivar]
  end
  Hash[converted]
end