Thursday, September 11, 2008

make dot file for ruby classes


   1  #!/usr/local/bin/ruby

   2  # encoding: utf-8

   3  ruby_classes = [ BasicObject, Object, Kernel, Module, Class, String, Array, Hash, Numeric, Integer, Fixnum, Float, Bignum, Range,

   4  Regexp]#, MatchData, Struct, Struct::Tms, Symbol, IO, File, File::Stat, Dir, Time, Proc, Method, UnboundMethod, Binding, Encoding, Exception, Thread, ThreadGroup, Fiber, Mutex, Process::Status, TrueClass, FalseClass, NilClass ]

   5  #Enumerator, Complex, Rational,

   6  #ruby_modules = %w(Comparable Enumerable Errno FileTest GC Marshal Math ObjectSpace Process Process::GID Process::Sys Process::UID Signal)

   7  

   8  class_output = ""

   9  mod_output = ""

  10  

  11  ruby_classes.each do |klass|

  12    begin

  13      superklass = klass.superclass

  14      mods = klass.included_modules.delete_if{ |m| m == Kernel unless klass == Object }

  15      meths = klass.instance_methods(false).join(",").gsub(/(([\w?!=\+\-\>@]+\,){3})/,'\1\n').gsub(/[<>|]/){ |m| '\\' +}

  16  

  17      class_output << %Q{  #{klass} [label="#{klass}\\nclass|#{meths}"]\n} << %Q{  #{superklass} -> #{klass}\n}

  18      

  19      mods.each do |m|

  20        mod_output << %Q{  #{m} -> #{klass}[color=red]\n}

  21      end

  22    rescue Exception => e

  23    end

  24  end

  25  class_output.gsub!(/\s(\w+)::(\w+)/,'\1\2')

  26  mod_output.gsub!(/\s(\w+)::(\w+)/,'\1\2')

  27  

  28  File.open("/Users/keyes/Desktop/ruby_class.dot", "w+") do |f|

  29    f.puts <<-"DOT"

  30    digraph RubyClass {

  31      rankdir=TB

  32      node[shape=Mrecord, height=1.2, width=2, style=bold]

  33      #{class_output}

  34      node[shape=record, style=filled]

  35      #{mod_output}

  36    }

  37    DOT

  38  end

No comments: