railroad 0.3.4 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +10 -0
- data/README +30 -1
- data/bin/railroad +1 -1
- data/lib/railroad/controllers_diagram.rb +6 -3
- data/lib/railroad/diagram_graph.rb +3 -1
- data/lib/railroad/models_diagram.rb +15 -4
- data/lib/railroad/options_struct.rb +16 -2
- data/rake.gemspec +1 -1
- metadata +2 -2
data/ChangeLog
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
Version 0.4.0 (apr 25 2007)
|
2
|
+
- Draw inheritance edges in reverse way
|
3
|
+
(from superclass to subclass, with an arrow in the tail)
|
4
|
+
This improves how 'dot' renders the graph
|
5
|
+
- By default, don't draw transitive inherited associations
|
6
|
+
- Added --transitive flag to draw transitive inherited associations
|
7
|
+
- Added --exclude flag for ommiting classes (this may help to produce
|
8
|
+
diagrams for applications with broken classes)
|
9
|
+
|
10
|
+
|
1
11
|
Version 0.3.4 (apr 12 2007)
|
2
12
|
- Add support for model abstract classes.
|
3
13
|
(don't try to get content columns, bug #10033)
|
data/README
CHANGED
@@ -18,6 +18,9 @@ controller diagrams are best processed using neato.
|
|
18
18
|
Common options:
|
19
19
|
-b, --brief Generate compact diagram
|
20
20
|
(no attributes nor methods)
|
21
|
+
-e, --exclude file1[,fileN] Exclude files
|
22
|
+
(relative path to 'app/models/' or
|
23
|
+
'app/controllers/')
|
21
24
|
-i, --inheritance Include inheritance relations
|
22
25
|
-l, --label Add a label with diagram information
|
23
26
|
(type, date, migration, version)
|
@@ -31,6 +34,8 @@ Models diagram options:
|
|
31
34
|
--hide-types Hide attributes type
|
32
35
|
-j, --join Concentrate edges
|
33
36
|
-m, --modules Include modules
|
37
|
+
-t, --transitive Include transitive associations
|
38
|
+
(through inheritance)
|
34
39
|
|
35
40
|
Controllers diagram options:
|
36
41
|
--hide-public Hide public methods
|
@@ -82,12 +87,36 @@ the following:
|
|
82
87
|
Important: There is a bug in Graphviz tools when generating SVG files that
|
83
88
|
cause a text overflow. You can solve this problem editing (with a text
|
84
89
|
editor, not a graphical SVG editor) the file and replacing around line 12
|
85
|
-
"font-size:14.00;" by "font-size:11.00;"
|
90
|
+
"font-size:14.00;" by "font-size:11.00;", or by issuing the following command
|
91
|
+
(see "man sed"):
|
92
|
+
|
93
|
+
sed -i 's/font-size:14.00/font-size:11.00/g' file.svg
|
86
94
|
|
87
95
|
Note: For viewing and editing SVG there is an excellent opensource tool
|
88
96
|
called Inkscape (similar to Adobe Illustrator. For DOT processing you can
|
89
97
|
also use Omnigraffle (on Mac OS X).
|
90
98
|
|
99
|
+
= RailRoad as a rake task
|
100
|
+
|
101
|
+
(Thanks to Thomas Ritz, http://www.galaxy-ritz.de ,for the code.)
|
102
|
+
|
103
|
+
In your Rails application, put the following rake tasks into 'lib/task/diagrams.rake':
|
104
|
+
|
105
|
+
namespace :doc do
|
106
|
+
namespace :diagram do
|
107
|
+
task :models do
|
108
|
+
sh "railroad -i -l -a -m -M | dot -Tsvg | sed 's/font-size:14.00/font-size:11.00/g' > doc/models.svg"
|
109
|
+
end
|
110
|
+
|
111
|
+
task :controllers do
|
112
|
+
sh "railroad -i -l -C | neato -Tsvg | sed 's/font-size:14.00/font-size:11.00/g' > doc/controllers.svg"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
task :diagrams => %w(diagram:models diagram:controllers)
|
117
|
+
end
|
118
|
+
|
119
|
+
Then, 'rake doc:diagrams' produces 'doc/models.svg' and 'doc/controllers.svg'.
|
91
120
|
|
92
121
|
= Requirements
|
93
122
|
|
data/bin/railroad
CHANGED
@@ -10,6 +10,7 @@ require 'railroad/app_diagram'
|
|
10
10
|
class ControllersDiagram < AppDiagram
|
11
11
|
|
12
12
|
def initialize(options)
|
13
|
+
options.exclude.map! {|e| e = "app/controllers/" + e}
|
13
14
|
super options
|
14
15
|
@graph.diagram_type = 'Controllers'
|
15
16
|
end
|
@@ -18,7 +19,7 @@ class ControllersDiagram < AppDiagram
|
|
18
19
|
def generate
|
19
20
|
STDERR.print "Generating controllers diagram\n" if @options.verbose
|
20
21
|
|
21
|
-
files = Dir.glob("app/controllers/**/*_controller.rb")
|
22
|
+
files = Dir.glob("app/controllers/**/*_controller.rb") - @options.exclude
|
22
23
|
files << 'app/controllers/application.rb'
|
23
24
|
files.each do |f|
|
24
25
|
class_name = extract_class_name(f)
|
@@ -36,7 +37,8 @@ class ControllersDiagram < AppDiagram
|
|
36
37
|
disable_stdout
|
37
38
|
# ApplicationController must be loaded first
|
38
39
|
require "app/controllers/application.rb"
|
39
|
-
Dir.glob("app/controllers/**/*_controller.rb")
|
40
|
+
files = Dir.glob("app/controllers/**/*_controller.rb") - @options.exclude
|
41
|
+
files.each {|c| require c }
|
40
42
|
enable_stdout
|
41
43
|
rescue LoadError
|
42
44
|
enable_stdout
|
@@ -74,7 +76,8 @@ class ControllersDiagram < AppDiagram
|
|
74
76
|
# Generate the inheritance edge (only for ApplicationControllers)
|
75
77
|
if @options.inheritance &&
|
76
78
|
(ApplicationController.subclasses.include? current_class.name)
|
77
|
-
|
79
|
+
# REVERSE INHERITANCE (CHECK)
|
80
|
+
@graph.add_edge ['is-a', current_class.superclass.name, current_class.name]
|
78
81
|
end
|
79
82
|
end # process_class
|
80
83
|
|
@@ -106,7 +106,9 @@ class DiagramGraph
|
|
106
106
|
when 'many-many'
|
107
107
|
options += 'taillabel="n", headlabel="n", arrowtail="normal"'
|
108
108
|
when 'is-a'
|
109
|
-
|
109
|
+
# REVERSE INHERITANCE (CHECK)
|
110
|
+
# options += 'arrowhead="onormal"'
|
111
|
+
options += 'arrowhead="none", arrowtail="onormal"'
|
110
112
|
end
|
111
113
|
return "\t#{quote(from)} -> #{quote(to)} [#{options}]\n"
|
112
114
|
end # dot_edge
|
@@ -10,6 +10,7 @@ require 'railroad/app_diagram'
|
|
10
10
|
class ModelsDiagram < AppDiagram
|
11
11
|
|
12
12
|
def initialize(options)
|
13
|
+
options.exclude.map! {|e| e = "app/models/" + e}
|
13
14
|
super options
|
14
15
|
@graph.diagram_type = 'Models'
|
15
16
|
# Processed habtm associations
|
@@ -19,7 +20,7 @@ class ModelsDiagram < AppDiagram
|
|
19
20
|
# Process model files
|
20
21
|
def generate
|
21
22
|
STDERR.print "Generating models diagram\n" if @options.verbose
|
22
|
-
files = Dir.glob("app/models/**/*.rb")
|
23
|
+
files = Dir.glob("app/models/**/*.rb") - @options.exclude
|
23
24
|
files.each do |f|
|
24
25
|
process_class extract_class_name(f).constantize
|
25
26
|
end
|
@@ -31,7 +32,8 @@ class ModelsDiagram < AppDiagram
|
|
31
32
|
def load_classes
|
32
33
|
begin
|
33
34
|
disable_stdout
|
34
|
-
Dir.glob("app/models/**/*.rb")
|
35
|
+
files = Dir.glob("app/models/**/*.rb") - @options.exclude
|
36
|
+
files.each {|m| require m }
|
35
37
|
enable_stdout
|
36
38
|
rescue LoadError
|
37
39
|
enable_stdout
|
@@ -64,7 +66,15 @@ class ModelsDiagram < AppDiagram
|
|
64
66
|
@graph.add_node [node_type, current_class.name, node_attribs]
|
65
67
|
generated = true
|
66
68
|
# Process class associations
|
67
|
-
current_class.reflect_on_all_associations
|
69
|
+
associations = current_class.reflect_on_all_associations
|
70
|
+
if @options.inheritance && ! @options.transitive
|
71
|
+
superclass_associations = current_class.superclass.reflect_on_all_associations
|
72
|
+
|
73
|
+
associations = associations.select{|a| ! superclass_associations.include? a}
|
74
|
+
# This doesn't works!
|
75
|
+
# associations -= current_class.superclass.reflect_on_all_associations
|
76
|
+
end
|
77
|
+
associations.each do |a|
|
68
78
|
process_association current_class.name, a
|
69
79
|
end
|
70
80
|
elsif @options.all && (current_class.is_a? Class)
|
@@ -80,7 +90,8 @@ class ModelsDiagram < AppDiagram
|
|
80
90
|
if @options.inheritance && generated &&
|
81
91
|
(current_class.superclass != ActiveRecord::Base) &&
|
82
92
|
(current_class.superclass != Object)
|
83
|
-
|
93
|
+
# REVERSE INHERITANCE (CHECK)
|
94
|
+
@graph.add_edge ['is-a', current_class.superclass.name, current_class.name]
|
84
95
|
end
|
85
96
|
|
86
97
|
end # process_class
|
@@ -14,6 +14,7 @@ class OptionsStruct < OpenStruct
|
|
14
14
|
def initialize
|
15
15
|
init_options = { :all => false,
|
16
16
|
:brief => false,
|
17
|
+
:exclude => [],
|
17
18
|
:inheritance => false,
|
18
19
|
:join => false,
|
19
20
|
:label => false,
|
@@ -22,7 +23,9 @@ class OptionsStruct < OpenStruct
|
|
22
23
|
:hide_public => false,
|
23
24
|
:hide_protected => false,
|
24
25
|
:hide_private => false,
|
26
|
+
:transitive => false,
|
25
27
|
:verbose => false,
|
28
|
+
# :xmi => false,
|
26
29
|
:command => '' }
|
27
30
|
super(init_options)
|
28
31
|
end # initialize
|
@@ -36,6 +39,10 @@ class OptionsStruct < OpenStruct
|
|
36
39
|
" (no attributes nor methods)") do |b|
|
37
40
|
self.brief = b
|
38
41
|
end
|
42
|
+
opts.on("-e", "--exclude file1[,fileN]", Array, "Exclude files",
|
43
|
+
" (relative path to 'app/models/' or", " 'app/controllers/')") do |list|
|
44
|
+
self.exclude = list
|
45
|
+
end
|
39
46
|
opts.on("-i", "--inheritance", "Include inheritance relations") do |i|
|
40
47
|
self.inheritance = i
|
41
48
|
end
|
@@ -50,6 +57,11 @@ class OptionsStruct < OpenStruct
|
|
50
57
|
" (produce messages to STDOUT)") do |v|
|
51
58
|
self.verbose = v
|
52
59
|
end
|
60
|
+
# TODO: Add XMI output.
|
61
|
+
# opts.on("-x", "--xmi", "Produce XMI instead of DOT",
|
62
|
+
# " (for UML tools)") do |x|
|
63
|
+
# self.xmi = x
|
64
|
+
# end
|
53
65
|
opts.separator ""
|
54
66
|
opts.separator "Models diagram options:"
|
55
67
|
opts.on("-a", "--all", "Include all models",
|
@@ -65,6 +77,10 @@ class OptionsStruct < OpenStruct
|
|
65
77
|
opts.on("-m", "--modules", "Include modules") do |m|
|
66
78
|
self.modules = m
|
67
79
|
end
|
80
|
+
opts.on("-t", "--transitive", "Include transitive associations",
|
81
|
+
"(through inheritance)") do |t|
|
82
|
+
self.transitive = t
|
83
|
+
end
|
68
84
|
opts.separator ""
|
69
85
|
opts.separator "Controllers diagram options:"
|
70
86
|
opts.on("--hide-public", "Hide public methods") do |h|
|
@@ -123,8 +139,6 @@ class OptionsStruct < OpenStruct
|
|
123
139
|
option_error "Invalid argument"
|
124
140
|
rescue OptionParser::MissingArgument
|
125
141
|
option_error "Missing argument"
|
126
|
-
rescue
|
127
|
-
option_error "Unknown error"
|
128
142
|
end
|
129
143
|
end # parse
|
130
144
|
|
data/rake.gemspec
CHANGED
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: railroad
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2007-04-
|
6
|
+
version: 0.4.0
|
7
|
+
date: 2007-04-25 00:00:00 -03:00
|
8
8
|
summary: A DOT diagram generator for Ruby on Rail applications
|
9
9
|
require_paths:
|
10
10
|
- lib
|