Project

looksee

Low commit activity in last 3 years
No release in over a year
Supercharged method introspection in IRB.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies
 Project Readme

Looksee Build Status Gem Version

A tool for illustrating the ancestry and method lookup path of objects. Handy for exploring unfamiliar codebases.

How

Install me:

gem install looksee

Pop this in your .irbrc:

require 'looksee'

Now each object has a method ls, which shows you all its methods.

irb> [].ls
=> BasicObject
  !   __id__    initialize     method_missing            singleton_method_undefined
  !=  __send__  instance_eval  singleton_method_added
  ==  equal?    instance_exec  singleton_method_removed
Kernel
  !~                       enum_for                    kind_of?                  respond_to_missing?
  <=>                      eql?                        lambda                    select
  ===                      eval                        load                      send
  =~                       exec                        local_variables           set_trace_func
  Array                    exit                        loop                      singleton_class
  Complex                  exit!                       method                    singleton_method
  Float                    extend                      methods                   singleton_methods
  Hash                     fail                        nil?                      sleep
  Integer                  fork                        object_id                 spawn
  Rational                 format                      open                      sprintf
  String                   freeze                      p                         srand
  __callee__               frozen?                     print                     syscall
  __dir__                  gem                         printf                    system
  __method__               gem_original_require        private_methods           taint
  `                        gets                        proc                      tainted?
  abort                    global_variables            protected_methods         tap
  at_exit                  hash                        public_method             test
  autoload                 initialize_clone            public_methods            throw
  autoload?                initialize_copy             public_send               to_enum
  binding                  initialize_dup              putc                      to_s
  block_given?             inspect                     puts                      trace_var
  caller                   instance_of?                raise                     trap
  caller_locations         instance_variable_defined?  rand                      trust
  catch                    instance_variable_get       readline                  untaint
  class                    instance_variable_set       readlines                 untrace_var
  clone                    instance_variables          remove_instance_variable  untrust
  define_singleton_method  is_a?                       require                   untrusted?
  display                  iterator?                   require_relative          warn
  dup                      itself                      respond_to?
Looksee::ObjectMixin
  ls
Object
  DelegateClass  default_src_encoding  irb_binding
Enumerable
  all?            detect            entries     group_by  min        reject        take
  any?            drop              find        include?  min_by     reverse_each  take_while
  chunk           drop_while        find_all    inject    minmax     select        to_a
  chunk_while     each_cons         find_index  lazy      minmax_by  slice_after   to_h
  collect         each_entry        first       map       none?      slice_before  to_set
  collect_concat  each_slice        flat_map    max       one?       slice_when    zip
  count           each_with_index   grep        max_by    partition  sort
  cycle           each_with_object  grep_v      member?   reduce     sort_by
Array
  &              collect!     eql?             keep_if               reverse       sort!
  *              combination  fetch            last                  reverse!      sort_by!
  +              compact      fill             length                reverse_each  take
  -              compact!     find_index       map                   rindex        take_while
  <<             concat       first            map!                  rotate        to_a
  <=>            count        flatten          pack                  rotate!       to_ary
  ==             cycle        flatten!         permutation           sample        to_h
  []             delete       frozen?          pop                   select        to_s
  []=            delete_at    hash             product               select!       transpose
  any?           delete_if    include?         push                  shift         uniq
  assoc          dig          index            rassoc                shuffle       uniq!
  at             drop         initialize       reject                shuffle!      unshift
  bsearch        drop_while   initialize_copy  reject!               size          values_at
  bsearch_index  each         insert           repeated_combination  slice         zip
  clear          each_index   inspect          repeated_permutation  slice!        |
  collect        empty?       join             replace               sort

Methods are colored according to whether they're public, protected, private, undefined (using Module#undef_method), or overridden.

(Undefined methods are not shown on MRI 2.3 due to interpreter limitations.)

You can hide, say, private methods like this:

irb> [].ls :noprivate

Or filter the list by Regexp:

irb> [].ls /^to_/
 => BasicObject
Kernel
  to_enum  to_s
Looksee::ObjectMixin
Object
  to_yaml  to_yaml_properties  to_yaml_style
Enumerable
  to_a  to_set
Array
  to_a  to_ary  to_s  to_yaml

Proxy objects

Objects that delegate everything via method_missing to some other object can be tricky, because they will delegate ls itself. To view such objects, you can always do:

Looksee[object]

This will also work for BasicObject instances that don't have an ls method. Object#ls is simply a wrapper around Looksee.[].

To the source!

If you want to know more about any of those methods, Looksee can take you straight to the source in your editor:

[].ls.edit :to_set

By default, this uses vi; customize it like this:

# %f = file, %l = line number
Looksee.editor = "mate -l%l %f"

ls in your way?

If you have a library that for some reason can't handle an ls method existing on Object, you may rename it like this:

Looksee.rename :_ls

Quick Reference

We've got one:

Looksee.help

Enjoy!

Troubleshooting

ANSI Escapes

If your pager is not configured, you may see ugly output like this:

ESC[1;37mArrayESC[0m
ESC[1;32m&ESC[0m ESC[1;32mcompact!ESC[0m ESC[1;32minclude?ESC[0m
ESC[1;32mrassocESC[0m ESC[1;32mto_aESC[0m

The most common pager is less, which you can configure by setting an environment variable like this in your shell configuration (usually ~/.bashrc):

export LESS=-R

Contributing

  • Bug reports
  • Source
  • Patches: Fork on Github, send pull request.
    • Include tests where practical.
    • Leave the version alone, or bump it in a separate commit.

Copyright

Copyright (c) George Ogata. See LICENSE for details.