lib/railroad in railroad-0.3.1 vs lib/railroad in railroad-0.3.2

- old
+ new

@@ -14,19 +14,21 @@ # (at your option) any later version. # APP_NAME = "railroad" APP_HUMAN_NAME = "RailRoad" -APP_VERSION = [0,3,1] +APP_VERSION = [0,3,2] COPYRIGHT = "Copyright (C) 2007 Javier Smaldone" +# Command line options parser class OptionsParser require 'optparse' require 'ostruct' + # Parse arguments from command line def self.parse(args) options = OpenStruct.new options.all = false @@ -99,19 +101,19 @@ end opts.separator "" opts.separator "Commands (you must supply one of these):" opts.on("-M", "--models", "Generate models diagram") do |c| if options.command == 'controllers' - $stderr.print "Error: Can't generate models AND controllers diagram\n\n" + STDERR.print "Error: Can't generate models AND controllers diagram\n\n" exit 1 else options.command = 'models' end end opts.on("-C", "--controllers", "Generate controllers diagram") do |c| if options.command == 'models' - $stderr.print "Error: Can't generate models AND controllers diagram\n\n" + STDERR.print "Error: Can't generate models AND controllers diagram\n\n" exit 1 else options.command = 'controllers' end end @@ -137,17 +139,18 @@ end # self.parse private def self.option_error(msg, opts) - $stderr.print "Error: #{msg}\n\n #{opts}\n" + STDERR.print "Error: #{msg}\n\n #{opts}\n" exit 1 end end # class OptionsParser +# Root class for RailRoad diagrams class AppDiagram def initialize(options) @options = options load_environment @@ -158,37 +161,54 @@ # Quotes a class name def node(name) '"' + name + '"' end + # Prevents Rails application from writing to STDOUT + def disable_stdout + @old_stdout = STDOUT.dup + STDOUT.reopen( PLATFORM =~ /mswin/ ? "NUL" : "/dev/null" ) + end + + # Restore STDOUT + def enable_stdout + STDOUT.reopen(@old_stdout) + end + + # Print diagram label def print_info(type) print "\t_diagram_info [shape=\"plaintext\", label=\"Diagram: #{type}\\l" + "Date: #{Time.now.strftime "%b %d %Y - %H:%M"}\\l" + "Migration version: #{ActiveRecord::Migrator.current_version}\\l" + "Generated by #{APP_HUMAN_NAME} #{APP_VERSION.join('.')}\\l\""+ ", fontsize=14]\n" end + # Print error when loading application classes def print_error(type) STDERR.print "Error loading #{type}.\n (Are you running " + "#{APP_NAME} on the aplication's root directory?)\n\n" end # Load Rails application's environment def load_environment begin + disable_stdout require "config/environment" + enable_stdout rescue LoadError + enable_stdout print_error "app environment" raise end end end # class AppDiagram +# RailRoad models diagram class ModelsDiagram < AppDiagram # Generate models diagram def generate @@ -216,12 +236,15 @@ private # Load model classes def load_classes begin + disable_stdout Dir.glob("app/models/**/*.rb") {|m| require m } + enable_stdout rescue LoadError + enable_stdout print_error "model classes" raise end end # load_classes @@ -314,10 +337,11 @@ end # process_association end # class ModelsDiagram +# RailRoad controllers diagram class ControllersDiagram < AppDiagram # Generate controllers diagram def generate @@ -351,23 +375,27 @@ private # Load controller classes def load_classes begin + disable_stdout # ApplicationController must be loaded first require "app/controllers/application.rb" Dir.glob("app/controllers/**/*_controller.rb") do |c| require c end + enable_stdout rescue LoadError + enable_stdout print_error "controller classes" raise end end # load_classes # Proccess controller class def process_class(current_class) + # Print the node if @options.brief print "\t#{node(current_class.name)}\n" elsif current_class.is_a? Class print "\t#{node(current_class.name)} " + @@ -409,25 +437,25 @@ if options.command == 'models' diagram = ModelsDiagram.new options elsif options.command == 'controllers' diagram = ControllersDiagram.new options else - $stderr.print "Error: You must supply a command\n" + - " (try #{APP_NAME} -h)\n\n" + STDERR.print "Error: You must supply a command\n" + + " (try #{APP_NAME} -h)\n\n" exit 1 end if options.output - old_stdout = $stdout + old_stdout = STDOUT.dup begin - $stdout = File.open(options.output, "w") + STDOUT.reopen(options.output) rescue - $stderr.print "Error: Cannot write to #{options.output}\n\n" + STDERR.print "Error: Cannot write to #{options.output}\n\n" exit 2 end end diagram.generate -if options.out - $stdout = old_stdout +if options.output + STDOUT.reopen(old_stdout) end