Peeky

Peeky is a Ruby GEM for peaking into ruby classes and extracting meta

As a Ruby Developer, I should be able to Reverse engineer classes and methods, so that I can document and understand them

Usage

Sample Classes

The usage examples listed below will work with these sample classes

Simple example

module Sample
  class SimpleClass
    attr_accessor :read_write

    def position_and_optional(aaa, bbb = 1)
    end
  end
end

Complex example

module Sample
  class ComplexClass
    attr_accessor :a_read_write1, :a_read_write2
    attr_reader   :b_reader, :b_another_reader
    attr_writer   :c_writer, :c_another_writer

    def do_something_method
    end

    def looks_like_an_attr_reader
      @looks_like_an_attr_reader ||= 5
    end

    def method_01(aaa); end

    def method_02(aaa, bbb = 1); end

    def method_03(aaa, bbb = 1, ccc = 2); end

    def method_04(*aaa); end

    def method_05(aaa, bbb = 1, *ccc); end

    def method_06(**aaa); end

    def method_07(aaa, *bbb, **ccc); end

    def method_08(aaa, *bbb, **ccc, &ddd); end

    def method_09(aaa:); end

    def method_10(aaa:, bbb: 1); end

    def questionable?; end

    def destructive!; end

    def method_with_every_type_of_paramater(aaa, bbb = 1, *ccc, ddd:, eee: 1, **fff, &ggg); end

    # Check that methods are sorted
    def alpha_sort2;                                        end
    def alpha_sort1;                                        end
  end
end

Build Class Information

Use build_class_info to extract meta data from a ruby class

Build ClassInfo

By default information is lazy loaded only when accessed

class_info = api.build_class_info(Sample::SimpleClass.new)

puts class_info
Sample::SimpleClass

Build ClassInfo - pre-loaded

Pre-load will ensure that methods and parameters are loaded straight away.

class_info = api.build_class_info(Sample::ComplexClass.new, lazy: false)

puts class_info
Sample::ComplexClass

Render Class

Render a class using a pre-defined class renderer that can be referenced by key

Render class interface using class_info

Render a basic class interface in compact format “One line per method”.

Note: Modules are not yet supported in Peeky

class_info = api.build_class_info(Sample::SimpleClass.new)

puts api.render_class(:class_interface, class_info: class_info)

Render class interface using an instance of the intended class

puts api.render_class(:class_interface, instance: Sample::SimpleClass.new)

Render Class Examples

Here a list of example renderers for the complex class

Class interface

Render simple class using class_interface renderer

puts api.render_class(:class_interface, instance: Sample::SimpleClass.new)
class ComplexClass
  attr_accessor :a_read_write1
  attr_accessor :a_read_write2

  attr_reader :b_another_reader
  attr_reader :b_reader
  attr_reader :looks_like_an_attr_reader

  attr_writer :c_another_writer
  attr_writer :c_writer

  def alpha_sort1;                                                                end
  def alpha_sort2;                                                                end
  def destructive!;                                                               end
  def do_something_method;                                                        end
  def method_01(aaa);                                                             end
  def method_02(aaa, bbb = nil);                                                  end
  def method_03(aaa, bbb = nil, ccc = nil);                                       end
  def method_04(*aaa);                                                            end
  def method_05(aaa, bbb = nil, *ccc);                                            end
  def method_06(**aaa);                                                           end
  def method_07(aaa, *bbb, **ccc);                                                end
  def method_08(aaa, *bbb, **ccc, &ddd);                                          end
  def method_09(aaa:);                                                            end
  def method_10(aaa:, bbb: nil);                                                  end
  def method_with_every_type_of_paramater(aaa, bbb = nil, *ccc, ddd:, eee: nil, **fff, &ggg);end
  def questionable?;                                                              end
end

Class interface - YARD

Render complex class using class_interface_yard renderer

puts api.render_class(:class_interface_yard, instance: Sample::ComplexClass.new)
class ComplexClass
  # A read write1
  attr_accessor :a_read_write1

  # A read write2
  attr_accessor :a_read_write2

  # B another reader
  attr_reader :b_another_reader

  # B reader
  attr_reader :b_reader

  # Looks like an attr reader
  attr_reader :looks_like_an_attr_reader

  # C another writer
  attr_writer :c_another_writer

  # C writer
  attr_writer :c_writer

  # Alpha sort1
  def alpha_sort1
  end

  # Alpha sort2
  def alpha_sort2
  end

  # Destructive!
  def destructive!
  end

  # Do something method
  def do_something_method
  end

  # Method 01
  #
  # @param aaa [String] aaa (required)
  def method_01(aaa)
  end

  # Method 02
  #
  # @param aaa [String] aaa (required)
  # @param bbb [String] bbb (optional)
  def method_02(aaa, bbb = nil)
  end

  # Method 03
  #
  # @param aaa [String] aaa (required)
  # @param bbb [String] bbb (optional)
  # @param ccc [String] ccc (optional)
  def method_03(aaa, bbb = nil, ccc = nil)
  end

  # Method 04
  #
  # @param aaa [Array<Object>] *aaa - list of aaa
  def method_04(*aaa)
  end

  # Method 05
  #
  # @param aaa [String] aaa (required)
  # @param bbb [String] bbb (optional)
  # @param ccc [Array<Object>] *ccc - list of ccc
  def method_05(aaa, bbb = nil, *ccc)
  end

  # Method 06
  #
  # @param aaa [<key: value>...] **aaa - list of key/values
  def method_06(**aaa)
  end

  # Method 07
  #
  # @param aaa [String] aaa (required)
  # @param bbb [Array<Object>] *bbb - list of bbb
  # @param ccc [<key: value>...] **ccc - list of key/values
  def method_07(aaa, *bbb, **ccc)
  end

  # Method 08
  #
  # @param aaa [String] aaa (required)
  # @param bbb [Array<Object>] *bbb - list of bbb
  # @param ccc [<key: value>...] **ccc - list of key/values
  # @param ddd [Block] &ddd
  def method_08(aaa, *bbb, **ccc, &ddd)
  end

  # Method 09
  #
  # @param aaa [String] aaa: <value for aaa> (required)
  def method_09(aaa:)
  end

  # Method 10
  #
  # @param aaa [String] aaa: <value for aaa> (required)
  # @param bbb [String] bbb: <value for bbb> (optional)
  def method_10(aaa:, bbb: nil)
  end

  # Method with every type of paramater
  #
  # @param aaa [String] aaa (required)
  # @param bbb [String] bbb (optional)
  # @param ccc [Array<Object>] *ccc - list of ccc
  # @param ddd [String] ddd: <value for ddd> (required)
  # @param eee [String] eee: <value for eee> (optional)
  # @param fff [<key: value>...] **fff - list of key/values
  # @param ggg [Block] &ggg
  def method_with_every_type_of_paramater(aaa, bbb = nil, *ccc, ddd:, eee: nil, **fff, &ggg)
  end

  # Questionable?
  #
  # @return [Boolean] true when questionable?
  def questionable?
  end
end

Debug class info

Render debug information on complex class

puts api.render_class(:class_debug, instance: Sample::ComplexClass.new)
----------------------------------------------------------------------
class name                    : ComplexClass
module name                   : Sample
class full name               : Sample::ComplexClass

-- Attributes --------------------------------------------------------
attr_accessor                 : a_read_write1
attr_accessor                 : a_read_write2
attr_reader                   : b_another_reader
attr_reader                   : b_reader
attr_reader                   : looks_like_an_attr_reader
attr_writer                   : c_another_writer
attr_writer                   : c_writer

-- Public Methods ----------------------------------------------------
alpha_sort1::
name                 param format         type
----------------------------------------------------------------------

alpha_sort2::
name                 param format         type
----------------------------------------------------------------------

destructive!::
name                 param format         type
----------------------------------------------------------------------

do_something_method::
name                 param format         type
----------------------------------------------------------------------

method_01::
name                 param format         type
----------------------------------------------------------------------
aaa                  aaa                  param_required

method_02::
name                 param format         type
----------------------------------------------------------------------
aaa                  aaa                  param_required
bbb                  bbb = nil            param_optional

method_03::
name                 param format         type
----------------------------------------------------------------------
aaa                  aaa                  param_required
bbb                  bbb = nil            param_optional
ccc                  ccc = nil            param_optional

method_04::
name                 param format         type
----------------------------------------------------------------------
aaa                  *aaa                 splat

method_05::
name                 param format         type
----------------------------------------------------------------------
aaa                  aaa                  param_required
bbb                  bbb = nil            param_optional
ccc                  *ccc                 splat

method_06::
name                 param format         type
----------------------------------------------------------------------
aaa                  **aaa                double_splat

method_07::
name                 param format         type
----------------------------------------------------------------------
aaa                  aaa                  param_required
bbb                  *bbb                 splat
ccc                  **ccc                double_splat

method_08::
name                 param format         type
----------------------------------------------------------------------
aaa                  aaa                  param_required
bbb                  *bbb                 splat
ccc                  **ccc                double_splat
ddd                  &ddd                 block

method_09::
name                 param format         type
----------------------------------------------------------------------
aaa                  aaa:                 key_required

method_10::
name                 param format         type
----------------------------------------------------------------------
aaa                  aaa:                 key_required
bbb                  bbb: nil             key_optional

method_with_every_type_of_paramater::
name                 param format         type
----------------------------------------------------------------------
aaa                  aaa                  param_required
bbb                  bbb = nil            param_optional
ccc                  *ccc                 splat
ddd                  ddd:                 key_required
eee                  eee: nil             key_optional
fff                  **fff                double_splat
ggg                  &ggg                 block

questionable?::
name                 param format         type
----------------------------------------------------------------------