railroady 1.1.0 → 1.1.1
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.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/AUTHORS.rdoc +1 -1
- data/CHANGELOG.rdoc +7 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +34 -0
- data/README.rdoc +1 -1
- data/Rakefile +12 -47
- data/bin/railroady +2 -2
- data/lib/railroady/app_diagram.rb +1 -1
- data/lib/railroady/controllers_diagram.rb +6 -3
- data/lib/railroady/models_diagram.rb +57 -17
- data/lib/railroady/options_struct.rb +6 -0
- data/lib/railroady/version.rb +1 -13
- data/railroady.gemspec +27 -0
- data/test/file_fixture/app/controllers/application_controller.rb +2 -0
- data/test/file_fixture/app/controllers/dummy1_controller.rb +0 -0
- data/test/file_fixture/app/controllers/dummy2_controller.rb +0 -0
- data/test/file_fixture/app/controllers/sub-dir/sub_dummy_controller.rb +0 -0
- data/test/file_fixture/app/models/dummy1.rb +0 -0
- data/test/file_fixture/app/models/dummy2.rb +0 -0
- data/test/file_fixture/app/models/sub-dir/sub_dummy.rb +0 -0
- data/test/lib/railroady/aasm_diagram_spec.rb +49 -0
- data/test/lib/railroady/app_diagram_spec.rb +15 -0
- data/test/lib/railroady/controllers_diagram_spec.rb +49 -0
- data/test/lib/railroady/core_ext_spec.rb +13 -0
- data/test/lib/railroady/diagram_graph_spec.rb +49 -0
- data/test/lib/railroady/models_diagram_spec.rb +49 -0
- data/test/spec_helper.rb +5 -0
- metadata +116 -21
- data/.document +0 -7
- data/VERSION.yml +0 -5
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d861e99e4da72666e52557b3dd4aae91be9c3810
|
4
|
+
data.tar.gz: 877a3dfee6e413da3f9a7b93a9e434847675e97c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 968bf68e7072cba4ab255c8b2ab1da9f880a077b5269dbc0f65abf8c1a4bf1a224345cfd278f0a51a98061381574038a68d2b1cd8c62437dbffaff8a74642b43
|
7
|
+
data.tar.gz: 78b3e11854e3394ce6db8a9c6554bf807cb356ec68dd6f0075c168b3a4e1682e188f9e25cd1f31a774aba2df1a109881418003c53d6d3ee306febcc6ba406f6d
|
data/.gitignore
ADDED
data/AUTHORS.rdoc
CHANGED
@@ -12,7 +12,7 @@ http://railroady.prestonlee.com
|
|
12
12
|
* John McCaffrey
|
13
13
|
* David Jones
|
14
14
|
* Mike Dalessio
|
15
|
-
* Preston Lee (http://prestonlee.com)
|
15
|
+
* Preston Lee (http://prestonlee.com @prestonism)
|
16
16
|
* Tim Harvey
|
17
17
|
* Atli Christiansen
|
18
18
|
* John Bintz (http://www.coswellproductions.com/)
|
data/CHANGELOG.rdoc
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
= Changes
|
2
2
|
|
3
|
+
== Version 1.1.1
|
4
|
+
|
5
|
+
- Merge in a Sinatra support.
|
6
|
+
- Merge in other pull requests.
|
7
|
+
- Switched from rspec to minitest specs.
|
8
|
+
- Removed jeweler dependency and updated to more recent bundler + gemspec format.
|
9
|
+
|
3
10
|
== Version 1.0.2
|
4
11
|
|
5
12
|
- Merged in John Bintz's patch to properly strip leading "::" prefixes from class names.
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
railroady (1.1.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
activesupport (4.0.0)
|
10
|
+
i18n (~> 0.6, >= 0.6.4)
|
11
|
+
minitest (~> 4.2)
|
12
|
+
multi_json (~> 1.3)
|
13
|
+
thread_safe (~> 0.1)
|
14
|
+
tzinfo (~> 0.3.37)
|
15
|
+
atomic (1.1.10)
|
16
|
+
i18n (0.6.4)
|
17
|
+
minitest (4.7.5)
|
18
|
+
minitest-spec-context (0.0.3)
|
19
|
+
multi_json (1.7.7)
|
20
|
+
rake (10.1.0)
|
21
|
+
thread_safe (0.1.2)
|
22
|
+
atomic
|
23
|
+
tzinfo (0.3.37)
|
24
|
+
|
25
|
+
PLATFORMS
|
26
|
+
ruby
|
27
|
+
|
28
|
+
DEPENDENCIES
|
29
|
+
activesupport
|
30
|
+
bundler
|
31
|
+
minitest
|
32
|
+
minitest-spec-context
|
33
|
+
railroady!
|
34
|
+
rake
|
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= RailRoady
|
2
2
|
|
3
|
-
RailRoady generates Rails 3 model (AcitveRecord, Mongoid, Datamapper) and controller UML diagrams as cross-platform .svg files, as well as in the DOT language.
|
3
|
+
RailRoady generates Rails 3/4 model (AcitveRecord, Mongoid, Datamapper) and controller UML diagrams as cross-platform .svg files, as well as in the DOT language.
|
4
4
|
|
5
5
|
Code is based on the original "railroad" gem, patched and maintained over the years. Lineage can be traced via GitHub.
|
6
6
|
|
data/Rakefile
CHANGED
@@ -1,47 +1,12 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
gem.description = "Ruby on Rails 3 model and controller UML class diagram generator. Originally based on the 'railroad' plugin and contributions of many others. (`sudo port install graphviz` before use!)"
|
14
|
-
gem.files = FileList["[A-Z]*", "{autotest,bin,lib,spec,tasks}/**/*", ".document"]
|
15
|
-
gem.extra_rdoc_files = FileList["*.rdoc"]
|
16
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
17
|
-
end
|
18
|
-
|
19
|
-
rescue LoadError
|
20
|
-
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
21
|
-
end
|
22
|
-
|
23
|
-
require 'rspec'
|
24
|
-
require 'rspec/core/rake_task'
|
25
|
-
RSpec::Core::RakeTask.new(:spec) do |spec|
|
26
|
-
# spec.libs << 'lib' << 'rspec'
|
27
|
-
spec.pattern = FileList['rspec/**/*_spec.rb']
|
28
|
-
end
|
29
|
-
|
30
|
-
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
31
|
-
# spec.libs << 'lib' << 'rspec'
|
32
|
-
spec.pattern = 'rspec/**/*_spec.rb'
|
33
|
-
spec.rcov = true
|
34
|
-
end
|
35
|
-
|
36
|
-
task :default => :spec
|
37
|
-
|
38
|
-
require 'rake/rdoctask'
|
39
|
-
require 'railroady/version'
|
40
|
-
Rake::RDocTask.new do |rdoc|
|
41
|
-
rdoc.rdoc_dir = 'rdoc'
|
42
|
-
rdoc.title = "railroady #{RailRoady::VERSION::STRING}"
|
43
|
-
rdoc.rdoc_files.include('README*')
|
44
|
-
rdoc.rdoc_files.include('CHANGELOG*')
|
45
|
-
rdoc.rdoc_files.include('AUTHORS*')
|
46
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
47
|
-
end
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
|
4
|
+
require 'rake/testtask'
|
5
|
+
|
6
|
+
Rake::TestTask.new do |t|
|
7
|
+
t.libs << 'lib/railroady'
|
8
|
+
t.test_files = FileList['test/lib/railroady/*_spec.rb']
|
9
|
+
t.verbose = true
|
10
|
+
end
|
11
|
+
|
12
|
+
task :default => :test
|
data/bin/railroady
CHANGED
@@ -22,7 +22,7 @@ require 'railroady'
|
|
22
22
|
APP_NAME = "railroady"
|
23
23
|
APP_HUMAN_NAME = "RailRoady"
|
24
24
|
# APP_VERSION = [RailRoady::VERSION::MAJOR, RailRoady::VERSION::MINOR, RailRoady::VERSION::PATCH]
|
25
|
-
APP_VERSION = RailRoady::VERSION
|
25
|
+
APP_VERSION = RailRoady::VERSION
|
26
26
|
COPYRIGHT = "Copyright (C) 2007-2008 Javier Smaldone, 2009 Peter Hoeg, 2010 Preston Lee"
|
27
27
|
|
28
28
|
options = OptionsStruct.new({:app_name => APP_NAME, :app_human_name => APP_HUMAN_NAME, :app_version =>APP_VERSION, :copyright =>COPYRIGHT})
|
@@ -43,7 +43,7 @@ elsif options.command == 'controllers'
|
|
43
43
|
elsif options.command == 'aasm'
|
44
44
|
diagram = AasmDiagram.new(options)
|
45
45
|
else
|
46
|
-
STDERR.print "#{APP_HUMAN_NAME} v#{
|
46
|
+
STDERR.print "#{APP_HUMAN_NAME} v#{APP_VERSION}\n" +
|
47
47
|
"Error: You must supply a command\n" +
|
48
48
|
" (try #{APP_NAME} -h)\n\n"
|
49
49
|
exit 1
|
@@ -52,7 +52,7 @@ class AppDiagram
|
|
52
52
|
STDERR.print "Loading application environment\n" if @options.verbose
|
53
53
|
begin
|
54
54
|
disable_stdout
|
55
|
-
l = File.join(Dir.pwd.to_s,
|
55
|
+
l = File.join(Dir.pwd.to_s, @options.config_file)
|
56
56
|
require l
|
57
57
|
enable_stdout
|
58
58
|
rescue LoadError
|
@@ -85,11 +85,14 @@ class ControllersDiagram < AppDiagram
|
|
85
85
|
@graph.add_node ['module', current_class.name]
|
86
86
|
end
|
87
87
|
|
88
|
-
# Generate the inheritance edge (only for ApplicationControllers)
|
89
|
-
if @options.inheritance &&
|
90
|
-
(ApplicationController.subclasses.include? current_class)
|
88
|
+
# Generate the inheritance edge (only for transitive subclasses of ApplicationControllers)
|
89
|
+
if @options.inheritance && (transitive_subclasses_of(ApplicationController).include? current_class)
|
91
90
|
@graph.add_edge ['is-a', current_class.superclass.name, current_class.name]
|
92
91
|
end
|
93
92
|
end # process_class
|
94
93
|
|
94
|
+
def transitive_subclasses_of(klass)
|
95
|
+
klass.subclasses | klass.subclasses.map {|subklass| transitive_subclasses_of(subklass)}.flatten
|
96
|
+
end
|
97
|
+
|
95
98
|
end # class ControllersDiagram
|
@@ -40,7 +40,9 @@ class ModelsDiagram < AppDiagram
|
|
40
40
|
STDERR.puts "Processing #{current_class}" if @options.verbose
|
41
41
|
|
42
42
|
generated =
|
43
|
-
if defined?(
|
43
|
+
if defined?(CouchRest::Model::Base) && current_class.new.is_a?(CouchRest::Model::Base)
|
44
|
+
process_couchrest_model(current_class)
|
45
|
+
elsif defined?(Mongoid::Document) && current_class.new.is_a?(Mongoid::Document)
|
44
46
|
process_mongoid_model(current_class)
|
45
47
|
elsif defined?(DataMapper::Resource) && current_class.new.is_a?(DataMapper::Resource)
|
46
48
|
process_datamapper_model(current_class)
|
@@ -59,7 +61,9 @@ class ModelsDiagram < AppDiagram
|
|
59
61
|
end # process_class
|
60
62
|
|
61
63
|
def include_inheritance?(current_class)
|
62
|
-
|
64
|
+
STDERR.puts current_class.superclass if @options.verbose
|
65
|
+
(defined?(ActiveRecord::Base) && current_class.superclass != ActiveRecord::Base) ||
|
66
|
+
(defined?(CouchRest::Model::Base) && current_class.superclass != CouchRest::Model::Base) ||
|
63
67
|
(current_class.superclass != Object)
|
64
68
|
end
|
65
69
|
|
@@ -82,15 +86,15 @@ class ModelsDiagram < AppDiagram
|
|
82
86
|
node_type = 'model'
|
83
87
|
|
84
88
|
# Collect model's content columns
|
85
|
-
|
89
|
+
#content_columns = current_class.content_columns
|
86
90
|
|
87
|
-
|
91
|
+
if @options.hide_magic
|
88
92
|
# From patch #13351
|
89
93
|
# http://wiki.rubyonrails.org/rails/pages/MagicFieldNames
|
90
94
|
magic_fields = [
|
91
|
-
|
92
|
-
|
93
|
-
|
95
|
+
"created_at", "created_on", "updated_at", "updated_on",
|
96
|
+
"lock_version", "type", "id", "position", "parent_id", "lft",
|
97
|
+
"rgt", "quote", "template"
|
94
98
|
]
|
95
99
|
magic_fields << current_class.table_name + "_count" if current_class.respond_to? 'table_name'
|
96
100
|
content_columns = current_class.content_columns.select {|c| ! magic_fields.include? c.name}
|
@@ -162,9 +166,6 @@ class ModelsDiagram < AppDiagram
|
|
162
166
|
true
|
163
167
|
end
|
164
168
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
169
|
def process_mongoid_model(current_class)
|
169
170
|
node_attribs = []
|
170
171
|
|
@@ -174,15 +175,15 @@ class ModelsDiagram < AppDiagram
|
|
174
175
|
node_type = 'model'
|
175
176
|
|
176
177
|
# Collect model's content columns
|
177
|
-
|
178
|
+
content_columns = current_class.fields.values.sort_by(&:name)
|
178
179
|
|
179
|
-
|
180
|
+
if @options.hide_magic
|
180
181
|
# From patch #13351
|
181
182
|
# http://wiki.rubyonrails.org/rails/pages/MagicFieldNames
|
182
183
|
magic_fields = [
|
183
|
-
|
184
|
-
|
185
|
-
|
184
|
+
"created_at", "created_on", "updated_at", "updated_on",
|
185
|
+
"lock_version", "_type", "_id", "position", "parent_id", "lft",
|
186
|
+
"rgt", "quote", "template"
|
186
187
|
]
|
187
188
|
content_columns = content_columns.select {|c| !magic_fields.include?(c.name) }
|
188
189
|
end
|
@@ -200,7 +201,7 @@ class ModelsDiagram < AppDiagram
|
|
200
201
|
associations = current_class.relations.values
|
201
202
|
|
202
203
|
if @options.inheritance && !@options.transitive &&
|
203
|
-
|
204
|
+
current_class.superclass.respond_to?(:relations)
|
204
205
|
associations -= current_class.superclass.relations.values
|
205
206
|
end
|
206
207
|
|
@@ -211,6 +212,42 @@ class ModelsDiagram < AppDiagram
|
|
211
212
|
true
|
212
213
|
end
|
213
214
|
|
215
|
+
##
|
216
|
+
# Some very basic CouchRest::Model support
|
217
|
+
#
|
218
|
+
# Field types note: the field's type is rendered only if it's explicitly
|
219
|
+
# specified in a model.
|
220
|
+
#
|
221
|
+
def process_couchrest_model(current_class)
|
222
|
+
node_attribs = []
|
223
|
+
|
224
|
+
if @options.brief
|
225
|
+
node_type = 'model-brief'
|
226
|
+
else
|
227
|
+
node_type = 'model'
|
228
|
+
|
229
|
+
# Collect model's content columns
|
230
|
+
content_columns = current_class.properties
|
231
|
+
|
232
|
+
if @options.hide_magic
|
233
|
+
magic_fields = [
|
234
|
+
"created_at", "updated_at",
|
235
|
+
"type", "_id", "_rev"
|
236
|
+
]
|
237
|
+
content_columns = content_columns.select {|c| !magic_fields.include?(c.name) }
|
238
|
+
end
|
239
|
+
|
240
|
+
content_columns.each do |a|
|
241
|
+
content_column = a.name
|
242
|
+
content_column += " :#{a.type}" unless @options.hide_types || a.type.nil?
|
243
|
+
node_attribs << content_column
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
@graph.add_node [node_type, current_class.name, node_attribs]
|
248
|
+
|
249
|
+
true
|
250
|
+
end
|
214
251
|
|
215
252
|
# Process a model association
|
216
253
|
def process_association(class_name, assoc)
|
@@ -261,7 +298,6 @@ class ModelsDiagram < AppDiagram
|
|
261
298
|
# @graph.add_edge [assoc_type, class_name, assoc.class_name, assoc_name]
|
262
299
|
@graph.add_edge [assoc_type, class_name, assoc_class_name, assoc_name]
|
263
300
|
end # process_association
|
264
|
-
end # class ModelsDiagram
|
265
301
|
|
266
302
|
# Process a DataMapper relationship
|
267
303
|
def process_datamapper_relationship(class_name, relation)
|
@@ -298,3 +334,7 @@ end # class ModelsDiagram
|
|
298
334
|
|
299
335
|
@graph.add_edge [rel_type, class_name, assoc_class_name, assoc_name ]
|
300
336
|
end
|
337
|
+
|
338
|
+
end # class ModelsDiagram
|
339
|
+
|
340
|
+
|
@@ -34,6 +34,7 @@ class OptionsStruct < OpenStruct
|
|
34
34
|
:verbose => false,
|
35
35
|
:xmi => false,
|
36
36
|
:command => '',
|
37
|
+
:config_file => 'config/environment',
|
37
38
|
:app_name => 'railroady', :app_human_name => 'Railroady', :app_version =>'', :copyright =>'' }
|
38
39
|
super(init_options.merge(args))
|
39
40
|
end # initialize
|
@@ -132,6 +133,11 @@ class OptionsStruct < OpenStruct
|
|
132
133
|
exit
|
133
134
|
end
|
134
135
|
opts.separator ""
|
136
|
+
opts.on("-c", "--config FILE", "File to load environment (defaults to config/environment)") do |c|
|
137
|
+
if c && c != ''
|
138
|
+
self.config_file = c
|
139
|
+
end
|
140
|
+
end
|
135
141
|
opts.separator "Commands (you must supply one of these):"
|
136
142
|
opts.on("-M", "--models", "Generate models diagram") do |c|
|
137
143
|
if self.command != ''
|
data/lib/railroady/version.rb
CHANGED
@@ -1,15 +1,3 @@
|
|
1
|
-
require 'yaml'
|
2
1
|
module RailRoady
|
3
|
-
|
4
|
-
f = File.join(File.dirname(__FILE__), '..', '..', 'VERSION.yml')
|
5
|
-
if File.exist?(f)
|
6
|
-
config = YAML.load(File.read(f))
|
7
|
-
MAJOR = config[:major]
|
8
|
-
MINOR = config[:minor]
|
9
|
-
PATCH = config[:patch]
|
10
|
-
else
|
11
|
-
MAJOR = MINOR = PATCH = 0
|
12
|
-
end
|
13
|
-
STRING = [MAJOR, MINOR, PATCH].join('.')
|
14
|
-
end
|
2
|
+
VERSION = '1.1.1'
|
15
3
|
end
|
data/railroady.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'railroady/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "railroady"
|
8
|
+
spec.version = RailRoady::VERSION
|
9
|
+
spec.authors = ["Preston Lee", "Tobias Crawley", "Peter Hoeg", "Javier Smaldone"]
|
10
|
+
spec.description = "Ruby on Rails 3/4 model and controller UML class diagram generator. Originally based on the 'railroad' plugin and contributions of many others. (`sudo port install graphviz` before use!)"
|
11
|
+
spec.email = ["conmotto@gmail.com", "tcrawley@gmail.com", "peter@hoeg.com", "p.hoeg@northwind.sg", "javier@smaldone.com.ar"]
|
12
|
+
spec.summary = "Ruby on Rails 3/4 model and controller UML class diagram generator."
|
13
|
+
spec.homepage = "http://github.com/preston/railroady"
|
14
|
+
spec.license = "GPLv2"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "minitest"
|
24
|
+
spec.add_development_dependency "minitest-spec-context"
|
25
|
+
spec.add_development_dependency "activesupport"
|
26
|
+
|
27
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
|
2
|
+
|
3
|
+
describe AasmDiagram do
|
4
|
+
describe 'file processing' do
|
5
|
+
|
6
|
+
it 'should select all the files under the models dir' do
|
7
|
+
ad = AasmDiagram.new
|
8
|
+
files = ad.get_files("test/file_fixture/")
|
9
|
+
files.size.must_equal 3
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should exclude a specific file' do
|
13
|
+
options = OptionsStruct.new(:exclude => ['test/file_fixture/app/models/dummy1.rb'])
|
14
|
+
ad = AasmDiagram.new(options)
|
15
|
+
files = ad.get_files("test/file_fixture/")
|
16
|
+
files.size.must_equal 2
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should exclude a glob pattern of files' do
|
20
|
+
options = OptionsStruct.new(:exclude => ['test/file_fixture/app/models/*/*.rb'])
|
21
|
+
ad = AasmDiagram.new(options)
|
22
|
+
files = ad.get_files("test/file_fixture/")
|
23
|
+
files.size.must_equal 2
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should include only specific file' do
|
27
|
+
options = OptionsStruct.new(:specify => ['test/file_fixture/app/models/sub-dir/sub_dummy.rb'])
|
28
|
+
ad = AasmDiagram.new(options)
|
29
|
+
files = ad.get_files("test/file_fixture/")
|
30
|
+
files.size.must_equal 1
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should include only specified files' do
|
34
|
+
options = OptionsStruct.new(:specify => ['test/file_fixture/app/models/{dummy1.rb,sub-dir/sub_dummy.rb}'])
|
35
|
+
ad = AasmDiagram.new(options)
|
36
|
+
files = ad.get_files("test/file_fixture/")
|
37
|
+
files.size.must_equal 2
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should include only specified files and exclude specified files' do
|
41
|
+
options = OptionsStruct.new(:specify => ['test/file_fixture/app/models/{dummy1.rb,sub-dir/sub_dummy.rb}'],
|
42
|
+
:exclude => ['test/file_fixture/app/models/sub-dir/sub_dummy.rb'])
|
43
|
+
ad = AasmDiagram.new(options)
|
44
|
+
files = ad.get_files("test/file_fixture/")
|
45
|
+
files.size.must_equal 1
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
|
2
|
+
|
3
|
+
describe AppDiagram do
|
4
|
+
describe 'file name processing' do
|
5
|
+
it 'should extract a simple name' do
|
6
|
+
ad = AppDiagram.new
|
7
|
+
name = ad.instance_eval {extract_class_name('app/models/test_this.rb')}
|
8
|
+
name.must_equal 'TestThis'
|
9
|
+
end
|
10
|
+
it 'should constantize a name' do
|
11
|
+
'String'.constantize.must_equal String
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
|
2
|
+
|
3
|
+
describe ControllersDiagram do
|
4
|
+
describe 'file processing' do
|
5
|
+
|
6
|
+
it 'should select all the files under the controllers dir' do
|
7
|
+
cd = ControllersDiagram.new
|
8
|
+
files = cd.get_files("test/file_fixture/")
|
9
|
+
files.size.must_equal 4
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should exclude a specific file' do
|
13
|
+
options = OptionsStruct.new(:exclude => ['test/file_fixture/app/controllers/dummy1_controller.rb'])
|
14
|
+
cd = ControllersDiagram.new(options)
|
15
|
+
files = cd.get_files("test/file_fixture/")
|
16
|
+
files.size.must_equal 3
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should exclude a glob pattern of files' do
|
20
|
+
options = OptionsStruct.new(:exclude => ['test/file_fixture/app/controllers/sub-dir/*.rb'])
|
21
|
+
cd = ControllersDiagram.new(options)
|
22
|
+
files = cd.get_files("test/file_fixture/")
|
23
|
+
files.size.must_equal 3
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should include only specific file' do
|
27
|
+
options = OptionsStruct.new(:specify => ['test/file_fixture/app/controllers/sub-dir/sub_dummy_controller.rb'])
|
28
|
+
cd = ControllersDiagram.new(options)
|
29
|
+
files = cd.get_files("test/file_fixture/")
|
30
|
+
files.size.must_equal 1
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should include only specified files' do
|
34
|
+
options = OptionsStruct.new(:specify => ['test/file_fixture/app/controllers/{dummy1_*.rb,sub-dir/sub_dummy_controller.rb}'])
|
35
|
+
cd = ControllersDiagram.new(options)
|
36
|
+
files = cd.get_files("test/file_fixture/")
|
37
|
+
files.size.must_equal 2
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should include only specified files and exclude specified files' do
|
41
|
+
options = OptionsStruct.new(:specify => ['test/file_fixture/app/controllers/{dummy1_*.rb,sub-dir/sub_dummy_controller.rb}'],
|
42
|
+
:exclude => ['test/file_fixture/app/controllers/sub-dir/sub_dummy_controller.rb'])
|
43
|
+
cd = ControllersDiagram.new(options)
|
44
|
+
files = cd.get_files("test/file_fixture/")
|
45
|
+
files.size.must_equal 1
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
|
2
|
+
|
3
|
+
describe String do
|
4
|
+
describe '#camelize' do
|
5
|
+
it "should upper-camelcase a lower case and underscored word" do
|
6
|
+
'lower_case_and_underscored_word'.camelize.must_equal 'LowerCaseAndUnderscoredWord'
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should lower-camelcase a lower case and underscored word when the :lower parameter is passed" do
|
10
|
+
'lower_case_and_underscored_word'.camelize(:lower).must_equal 'lowerCaseAndUnderscoredWord'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
|
2
|
+
|
3
|
+
module CustomDotMatchers
|
4
|
+
class HaveDotOptions
|
5
|
+
def initialize(expected)
|
6
|
+
@expected = expected
|
7
|
+
end
|
8
|
+
def matches?(target)
|
9
|
+
@target = target
|
10
|
+
return false unless @target =~ /\[(.*)\]/
|
11
|
+
@options = $1
|
12
|
+
@options == @expected
|
13
|
+
end
|
14
|
+
def failure_message
|
15
|
+
"expected '#{@target.strip}' to have options '[#{@expected}]'"
|
16
|
+
end
|
17
|
+
def negative_failure_message
|
18
|
+
"expected '#{@target.strip}' to not have options '[#{@expected}]'"
|
19
|
+
end
|
20
|
+
def description
|
21
|
+
"have dot options"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
def have_dot_options(expected)
|
25
|
+
HaveDotOptions.new expected
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe DiagramGraph do
|
30
|
+
include CustomDotMatchers
|
31
|
+
|
32
|
+
before do
|
33
|
+
@diagram_graph = DiagramGraph.new
|
34
|
+
end
|
35
|
+
|
36
|
+
describe ".dot_edge" do
|
37
|
+
context "has_a/belongs_to" do
|
38
|
+
it { @diagram_graph.send(:dot_edge, "one-one", "source", "target").must_include "arrowtail=odot, arrowhead=dot, dir=both" }
|
39
|
+
end
|
40
|
+
|
41
|
+
context "has_many/belongs_to" do
|
42
|
+
it { @diagram_graph.send(:dot_edge, "one-many", "source", "target").must_include "arrowtail=odot, arrowhead=crow, dir=both" }
|
43
|
+
end
|
44
|
+
|
45
|
+
context "habtm" do
|
46
|
+
it { @diagram_graph.send(:dot_edge, "many-many", "source", "target").must_include "arrowtail=crow, arrowhead=crow, dir=both" }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
|
2
|
+
|
3
|
+
describe ModelsDiagram do
|
4
|
+
describe 'file processing' do
|
5
|
+
|
6
|
+
it 'should select all the files under the models dir' do
|
7
|
+
md = ModelsDiagram.new
|
8
|
+
files = md.get_files("test/file_fixture/")
|
9
|
+
files.size.must_equal 3
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should exclude a specific file' do
|
13
|
+
options = OptionsStruct.new(:exclude => ['test/file_fixture/app/models/dummy1.rb'])
|
14
|
+
md = ModelsDiagram.new(options)
|
15
|
+
files = md.get_files("test/file_fixture/")
|
16
|
+
files.size.must_equal 2
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should exclude a glob pattern of files' do
|
20
|
+
options = OptionsStruct.new(:exclude => ['test/file_fixture/app/models/*/*.rb'])
|
21
|
+
md = ModelsDiagram.new(options)
|
22
|
+
files = md.get_files("test/file_fixture/")
|
23
|
+
files.size.must_equal 2
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should include only specific file' do
|
27
|
+
options = OptionsStruct.new(:specify => ['test/file_fixture/app/models/sub-dir/sub_dummy.rb'])
|
28
|
+
md = ModelsDiagram.new(options)
|
29
|
+
files = md.get_files("test/file_fixture/")
|
30
|
+
files.size.must_equal 1
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should include only specified files' do
|
34
|
+
options = OptionsStruct.new(:specify => ['test/file_fixture/app/models/{dummy1.rb,sub-dir/sub_dummy.rb}'])
|
35
|
+
md = ModelsDiagram.new(options)
|
36
|
+
files = md.get_files("test/file_fixture/")
|
37
|
+
files.size.must_equal 2
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should include only specified files and exclude specified files' do
|
41
|
+
options = OptionsStruct.new(:specify => ['test/file_fixture/app/models/{dummy1.rb,sub-dir/sub_dummy.rb}'],
|
42
|
+
:exclude => ['test/file_fixture/app/models/sub-dir/sub_dummy.rb'])
|
43
|
+
md = ModelsDiagram.new(options)
|
44
|
+
files = md.get_files("test/file_fixture/")
|
45
|
+
files.size.must_equal 1
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
data/test/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: railroady
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.1.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Preston Lee
|
@@ -12,9 +11,79 @@ authors:
|
|
12
11
|
autorequire:
|
13
12
|
bindir: bin
|
14
13
|
cert_chain: []
|
15
|
-
date:
|
16
|
-
dependencies:
|
17
|
-
|
14
|
+
date: 2013-07-31 00:00:00.000000000 Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: bundler
|
18
|
+
requirement: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - '>='
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '0'
|
37
|
+
type: :development
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
- !ruby/object:Gem::Dependency
|
45
|
+
name: minitest
|
46
|
+
requirement: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - '>='
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
type: :development
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: minitest-spec-context
|
60
|
+
requirement: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
type: :development
|
66
|
+
prerelease: false
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
- !ruby/object:Gem::Dependency
|
73
|
+
name: activesupport
|
74
|
+
requirement: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
type: :development
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
description: Ruby on Rails 3/4 model and controller UML class diagram generator. Originally
|
18
87
|
based on the 'railroad' plugin and contributions of many others. (`sudo port install
|
19
88
|
graphviz` before use!)
|
20
89
|
email:
|
@@ -26,19 +95,16 @@ email:
|
|
26
95
|
executables:
|
27
96
|
- railroady
|
28
97
|
extensions: []
|
29
|
-
extra_rdoc_files:
|
30
|
-
- AUTHORS.rdoc
|
31
|
-
- CHANGELOG.rdoc
|
32
|
-
- LICENSE.rdoc
|
33
|
-
- README.rdoc
|
98
|
+
extra_rdoc_files: []
|
34
99
|
files:
|
35
|
-
- .
|
100
|
+
- .gitignore
|
36
101
|
- AUTHORS.rdoc
|
37
102
|
- CHANGELOG.rdoc
|
103
|
+
- Gemfile
|
104
|
+
- Gemfile.lock
|
38
105
|
- LICENSE.rdoc
|
39
106
|
- README.rdoc
|
40
107
|
- Rakefile
|
41
|
-
- VERSION.yml
|
42
108
|
- bin/railroady
|
43
109
|
- lib/railroady.rb
|
44
110
|
- lib/railroady/aasm_diagram.rb
|
@@ -49,29 +115,58 @@ files:
|
|
49
115
|
- lib/railroady/options_struct.rb
|
50
116
|
- lib/railroady/railtie.rb
|
51
117
|
- lib/railroady/version.rb
|
118
|
+
- railroady.gemspec
|
52
119
|
- tasks/railroady.rake
|
120
|
+
- test/file_fixture/app/controllers/application_controller.rb
|
121
|
+
- test/file_fixture/app/controllers/dummy1_controller.rb
|
122
|
+
- test/file_fixture/app/controllers/dummy2_controller.rb
|
123
|
+
- test/file_fixture/app/controllers/sub-dir/sub_dummy_controller.rb
|
124
|
+
- test/file_fixture/app/models/dummy1.rb
|
125
|
+
- test/file_fixture/app/models/dummy2.rb
|
126
|
+
- test/file_fixture/app/models/sub-dir/sub_dummy.rb
|
127
|
+
- test/lib/railroady/aasm_diagram_spec.rb
|
128
|
+
- test/lib/railroady/app_diagram_spec.rb
|
129
|
+
- test/lib/railroady/controllers_diagram_spec.rb
|
130
|
+
- test/lib/railroady/core_ext_spec.rb
|
131
|
+
- test/lib/railroady/diagram_graph_spec.rb
|
132
|
+
- test/lib/railroady/models_diagram_spec.rb
|
133
|
+
- test/spec_helper.rb
|
53
134
|
homepage: http://github.com/preston/railroady
|
54
|
-
licenses:
|
135
|
+
licenses:
|
136
|
+
- GPLv2
|
137
|
+
metadata: {}
|
55
138
|
post_install_message:
|
56
139
|
rdoc_options: []
|
57
140
|
require_paths:
|
58
141
|
- lib
|
59
142
|
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
-
none: false
|
61
143
|
requirements:
|
62
|
-
- -
|
144
|
+
- - '>='
|
63
145
|
- !ruby/object:Gem::Version
|
64
146
|
version: '0'
|
65
147
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
148
|
requirements:
|
68
|
-
- -
|
149
|
+
- - '>='
|
69
150
|
- !ruby/object:Gem::Version
|
70
151
|
version: '0'
|
71
152
|
requirements: []
|
72
153
|
rubyforge_project:
|
73
|
-
rubygems_version:
|
154
|
+
rubygems_version: 2.0.3
|
74
155
|
signing_key:
|
75
|
-
specification_version:
|
76
|
-
summary: Ruby on Rails 3 model and controller UML class diagram generator.
|
77
|
-
test_files:
|
156
|
+
specification_version: 4
|
157
|
+
summary: Ruby on Rails 3/4 model and controller UML class diagram generator.
|
158
|
+
test_files:
|
159
|
+
- test/file_fixture/app/controllers/application_controller.rb
|
160
|
+
- test/file_fixture/app/controllers/dummy1_controller.rb
|
161
|
+
- test/file_fixture/app/controllers/dummy2_controller.rb
|
162
|
+
- test/file_fixture/app/controllers/sub-dir/sub_dummy_controller.rb
|
163
|
+
- test/file_fixture/app/models/dummy1.rb
|
164
|
+
- test/file_fixture/app/models/dummy2.rb
|
165
|
+
- test/file_fixture/app/models/sub-dir/sub_dummy.rb
|
166
|
+
- test/lib/railroady/aasm_diagram_spec.rb
|
167
|
+
- test/lib/railroady/app_diagram_spec.rb
|
168
|
+
- test/lib/railroady/controllers_diagram_spec.rb
|
169
|
+
- test/lib/railroady/core_ext_spec.rb
|
170
|
+
- test/lib/railroady/diagram_graph_spec.rb
|
171
|
+
- test/lib/railroady/models_diagram_spec.rb
|
172
|
+
- test/spec_helper.rb
|
data/.document
DELETED