Rails Overview With Rdoc Parser
Ever want a quick overview of a rails project you’re working on? I did and here’s what I did.
It’s been awhile since I wrote here, having been busy with my usual tagging ideas. Since last time I wrote, I’ve released two public pieces of rails-related code! : a patch for nested sets as well as my first gem. All shameless plugs aside, I came here to share some old code I revived and a practical use I found for it. The code is here.
My goal awhile back was to be able to quickly understand any ruby code given to me. To put myself on that path I did two things: learn to debug Ruby thoroughly with Kernel::set_trace_func and parse ruby files. I wanted to parse ruby files so I could get a quick overview of a file’s classes and their methods. I looked at ParseTree and then rdoc’s parser. Of the two, rdoc seemed to be a little higher level and so the core method looks like:
def rdoc_parse_file(file)
class_hash = {}
content = File.open(file, "r") {|f| f.read}
capital_p = RDoc::ParserFactory.parser_for(RDoc::TopLevel.new(file),file,content,Options.instance,RDoc::Stats.new)
capital_p.scan
rclasses = RDoc::TopLevel.all_classes_and_modules
rclasses.each {|rc| index_class(rc,class_hash) }
RDoc::TopLevel::reset
class_hash
end
That little bit opens a file, scans it with rdoc and then saves the methods by class with the recursive function index_class(). If you look at the full version you’ll probably laugh at how small index_class() is.
Since writing rdoc_parse_file(), I’ve been taking apart and writing rails apps. So I recently combined the two. Overview.rb is a script you can drop into you rails script directory to provide a handy outline of the classes and methods by directory under app/. I use it for note taking when dealing with a new rails app.
A sample output of the snippets rails app :
controllers
UserController:
- show
PostsController:
- create
- destroy
- edit
- index
- show
- update
TagController:
- show
ApplicationController:
- admin_or_post_owner
- check_if_visitor_allowed
- get_page_number
- get_related_posts
- get_tag_info
- get_user_info
- is_ticketed
- redirect_back
- store_locations
LoginController:
- account
- create
- login
- logout
- new
- update
CommentsController:
- create
helpers
TagsHelper: []
LoginHelper: []
UserHelper: []
PostsHelper: []
CommentsHelper: []
ApplicationHelper:
- niceify_html
- niceify_html_for_rss
- page_title
- rounded_box_bottom
- rounded_box_top
- tag_link
models
Comment: []
User:
- authenticate
- change_password
- crypt_password
- find_with_count
- "isAdmin?"
- "isAdmin?"
- sha1
Tag:
- find_all_with_count
- find_all_with_count_for_tags
- find_all_with_count_for_user
- find_by_name_with_count
Post:
- find_related_posts
- pagetitle
- tagsspaced
- tagsspaced=
Enjoy. And let me know if you tweak this script in a cool way.
Reddit