lib/railroad/models_diagram.rb in railroad-0.4.1 vs lib/railroad/models_diagram.rb in railroad-0.5.0

- old
+ new

@@ -1,28 +1,30 @@ # RailRoad - RoR diagrams generator # http://railroad.rubyforge.org # -# Copyright 2007 - Javier Smaldone (http://www.smaldone.com.ar) +# Copyright 2007-2008 - Javier Smaldone (http://www.smaldone.com.ar) # See COPYING for more details require 'railroad/app_diagram' # RailRoad models diagram class ModelsDiagram < AppDiagram def initialize(options) - options.exclude.map! {|e| "app/models/" + e} + #options.exclude.map! {|e| "app/models/" + e} super options @graph.diagram_type = 'Models' # Processed habtm associations @habtm = [] end # Process model files def generate STDERR.print "Generating models diagram\n" if @options.verbose - files = Dir.glob("app/models/**/*.rb") - @options.exclude + files = Dir.glob("app/models/**/*.rb") + files += Dir.glob("vendor/plugins/**/app/models/*.rb") if @options.plugins_models + files -= @options.exclude files.each do |f| process_class extract_class_name(f).constantize end end @@ -30,11 +32,13 @@ # Load model classes def load_classes begin disable_stdout - files = Dir.glob("app/models/**/*.rb") - @options.exclude + files = Dir.glob("app/models/**/*.rb") + files += Dir.glob("vendor/plugins/**/app/models/*.rb") if @options.plugins_models + files -= @options.exclude files.each {|m| require m } enable_stdout rescue LoadError enable_stdout print_error "model classes" @@ -46,20 +50,40 @@ def process_class(current_class) STDERR.print "\tProcessing #{current_class}\n" if @options.verbose generated = false - + # Is current_clas derived from ActiveRecord::Base? if current_class.respond_to?'reflect_on_all_associations' + + node_attribs = [] if @options.brief || current_class.abstract_class? node_type = 'model-brief' else node_type = 'model' + # Collect model's content columns - current_class.content_columns.each do |a| + + content_columns = current_class.content_columns + + if @options.hide_magic + # From patch #13351 + # http://wiki.rubyonrails.org/rails/pages/MagicFieldNames + magic_fields = [ + "created_at", "created_on", "updated_at", "updated_on", + "lock_version", "type", "id", "position", "parent_id", "lft", + "rgt", "quote", "template" + ] + magic_fields << current_class.table_name + "_count" if current_class.respond_to? 'table_name' + content_columns = current_class.content_columns.select {|c| ! magic_fields.include? c.name} + else + content_columns = current_class.content_columns + end + + content_columns.each do |a| content_column = a.name content_column += ' :' + a.type.to_s unless @options.hide_types node_attribs << content_column end end @@ -102,11 +126,15 @@ # Skip "belongs_to" associations return if assoc.macro.to_s == 'belongs_to' # Only non standard association names needs a label - if assoc.class_name == assoc.name.to_s.singularize.camelize + + # from patch #12384 + # if assoc.class_name == assoc.name.to_s.singularize.camelize + assoc_class_name = (assoc.class_name.respond_to? 'underscore') ? assoc.class_name.underscore.singularize.camelize : assoc.class_name + if assoc_class_name == assoc.name.to_s.singularize.camelize assoc_name = '' else assoc_name = assoc.name.to_s end @@ -117,9 +145,11 @@ else # habtm or has_many, :through return if @habtm.include? [assoc.class_name, class_name, assoc_name] assoc_type = 'many-many' @habtm << [class_name, assoc.class_name, assoc_name] end - @graph.add_edge [assoc_type, class_name, assoc.class_name, assoc_name] + # from patch #12384 + # @graph.add_edge [assoc_type, class_name, assoc.class_name, assoc_name] + @graph.add_edge [assoc_type, class_name, assoc_class_name, assoc_name] end # process_association end # class ModelsDiagram