rails-erd 1.5.0 → 1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +15 -9
- data/lib/generators/erd/templates/auto_generate_diagram.rake +1 -1
- data/lib/rails_erd.rb +10 -0
- data/lib/rails_erd/cli.rb +9 -1
- data/lib/rails_erd/diagram.rb +5 -6
- data/lib/rails_erd/diagram/graphviz.rb +5 -1
- data/lib/rails_erd/diagram/templates/node.html.erb +2 -2
- data/lib/rails_erd/diagram/templates/node.record.erb +2 -2
- data/lib/rails_erd/domain/entity.rb +1 -1
- data/lib/rails_erd/tasks.rake +15 -1
- data/lib/rails_erd/version.rb +1 -1
- data/test/test_helper.rb +56 -2
- data/test/unit/attribute_test.rb +8 -8
- data/test/unit/domain_test.rb +4 -4
- data/test/unit/entity_test.rb +26 -0
- data/test/unit/graphviz_test.rb +22 -12
- data/test/unit/rake_task_test.rb +3 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 908b423dba1519fc2769f64ec4d9cb80ec81e9e2
|
4
|
+
data.tar.gz: c360f615b7ab66d757aaadfa79cef2877a756008
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b0195f4c8f8c9119bfeb00a8fd6ae929d4ac1023509f06bccd20316aaba51a907d080ea2f720866231168252092f139b727d705452029739a0548bef2bb1d09
|
7
|
+
data.tar.gz: 6c64ed31acdda5d1b3983641f4c02f5d434ab562930e8905a1ca5e5a4d8ade1aa0721f1e50de06cbd1e2161e099e08e87a0710ba2e71c7e9f51d97f6c3b36c57
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@ Rails ERD - Generate Entity-Relationship Diagrams for Rails applications
|
|
2
2
|
========================================================================
|
3
3
|
[![Build Status](https://travis-ci.org/voormedia/rails-erd.svg?branch=master)](https://travis-ci.org/voormedia/rails-erd) [![Code Climate](https://codeclimate.com/github/voormedia/rails-erd/badges/gpa.svg)](https://codeclimate.com/github/voormedia/rails-erd)
|
4
4
|
|
5
|
-
[Rails ERD](
|
5
|
+
[Rails ERD](https://voormedia.github.io/rails-erd/) is a gem that allows you to easily generate a diagram based on your application's Active Record models. The diagram gives an overview of how your models are related. Having a diagram that describes your models is perfect documentation for your application.
|
6
6
|
|
7
7
|
The second goal of Rails ERD is to provide you with a tool to inspect your application's domain model. If you don't like the default output, it is very easy to use the API to build your own diagrams.
|
8
8
|
|
@@ -14,23 +14,23 @@ Preview
|
|
14
14
|
|
15
15
|
Here's an example entity-relationship diagram that was generated by Rails ERD:
|
16
16
|
|
17
|
-
![Entity-Relationship Diagram](
|
17
|
+
![Entity-Relationship Diagram](https://voormedia.github.io/rails-erd/images/entity-relationship-diagram.png)
|
18
18
|
|
19
|
-
Browse the [gallery](
|
19
|
+
Browse the [gallery](https://voormedia.github.io/rails-erd/gallery.html) for more example diagrams.
|
20
20
|
|
21
21
|
|
22
22
|
Requirements
|
23
23
|
---------------
|
24
24
|
|
25
25
|
* Ruby 1.9.3+
|
26
|
-
* ActiveRecord 3.x
|
26
|
+
* ActiveRecord 3.x - 5.0.x
|
27
27
|
|
28
28
|
Getting started
|
29
29
|
---------------
|
30
30
|
|
31
|
-
See the [installation instructions](
|
31
|
+
See the [installation instructions](https://voormedia.github.io/rails-erd/install.html) for a complete description of how to install Rails ERD. Here's a summary:
|
32
32
|
|
33
|
-
* Install Graphviz 2.22+ ([how?](
|
33
|
+
* Install Graphviz 2.22+ ([how?](https://voormedia.github.io/rails-erd/install.html))
|
34
34
|
|
35
35
|
* Add <tt>gem "rails-erd"</tt> to your application's Gemfile
|
36
36
|
|
@@ -39,9 +39,9 @@ See the [installation instructions](http://voormedia.github.io/rails-erd/install
|
|
39
39
|
### Configuration
|
40
40
|
|
41
41
|
|
42
|
-
Rails ERD has the ability to be configured via the command line or through the use of a YAML file with configuration options set. It will look for this file first at `~/.erdconfig` and then `./.erdconfig` (which will override any settings in `~/.erdconfig`). The format of the file is as follows (shown here with the default settings used if no `.erdconfig` is found). More information on [customization options](
|
42
|
+
Rails ERD has the ability to be configured via the command line or through the use of a YAML file with configuration options set. It will look for this file first at `~/.erdconfig` and then `./.erdconfig` (which will override any settings in `~/.erdconfig`). The format of the file is as follows (shown here with the default settings used if no `.erdconfig` is found). More information on [customization options](https://voormedia.github.io/rails-erd/customise.html) can be found in Rails ERD's project documentation.
|
43
43
|
|
44
|
-
```
|
44
|
+
```yaml
|
45
45
|
attributes:
|
46
46
|
- content
|
47
47
|
- foreign_key
|
@@ -63,13 +63,19 @@ only: null
|
|
63
63
|
only_recursion_depth: null
|
64
64
|
prepend_primary: false
|
65
65
|
cluster: false
|
66
|
+
splines: spline
|
66
67
|
```
|
67
68
|
|
69
|
+
Auto generation
|
70
|
+
---------------
|
71
|
+
|
72
|
+
* Run <tt>rails generate erd:install</tt>
|
73
|
+
* Run <tt>rails db:migrate</tt>, then the diagram is generated
|
68
74
|
|
69
75
|
Learn more
|
70
76
|
----------
|
71
77
|
|
72
|
-
More information can be found on [Rails ERD's project homepage](
|
78
|
+
More information can be found on [Rails ERD's project homepage](https://voormedia.github.io/rails-erd/).
|
73
79
|
|
74
80
|
If you wish to extend or customise Rails ERD, take a look at the [API documentation](http://rubydoc.info/github/voormedia/rails-erd/frames).
|
75
81
|
|
data/lib/rails_erd.rb
CHANGED
@@ -56,6 +56,16 @@ module RailsERD
|
|
56
56
|
:cluster, false,
|
57
57
|
]
|
58
58
|
end
|
59
|
+
|
60
|
+
def loaded_tasks=(val); @loaded_tasks = val; end
|
61
|
+
def loaded_tasks; return @loaded_tasks; end
|
62
|
+
|
63
|
+
def load_tasks
|
64
|
+
return if(self.loaded_tasks)
|
65
|
+
self.loaded_tasks = true
|
66
|
+
|
67
|
+
Dir[File.join(File.dirname(__FILE__), 'tasks', '**/*.rake')].each { |rake| load rake }
|
68
|
+
end
|
59
69
|
end
|
60
70
|
|
61
71
|
module Inspectable # @private :nodoc:
|
data/lib/rails_erd/cli.rb
CHANGED
@@ -74,6 +74,11 @@ Choice.options do
|
|
74
74
|
desc "Display models in subgraphs based on their namespace."
|
75
75
|
end
|
76
76
|
|
77
|
+
option :splines do
|
78
|
+
long "--splines=SPLINE_TYPE"
|
79
|
+
desc "Control how edges are represented. See http://www.graphviz.org/doc/info/attrs.html#d:splines for values."
|
80
|
+
end
|
81
|
+
|
77
82
|
separator ""
|
78
83
|
separator "Output options:"
|
79
84
|
|
@@ -166,7 +171,10 @@ module RailsERD
|
|
166
171
|
puts "Please create a file in '#{environment_path}' that loads your application environment."
|
167
172
|
raise
|
168
173
|
end
|
169
|
-
|
174
|
+
if defined? Rails
|
175
|
+
Rails.application.eager_load!
|
176
|
+
Rails.application.config.eager_load_namespaces.each(&:eager_load!)
|
177
|
+
end
|
170
178
|
rescue TypeError
|
171
179
|
end
|
172
180
|
|
data/lib/rails_erd/diagram.rb
CHANGED
@@ -7,7 +7,7 @@ module RailsERD
|
|
7
7
|
# and (optionally) +save+.
|
8
8
|
#
|
9
9
|
# As an example, a diagram class that generates code that can be used with
|
10
|
-
# yUML (
|
10
|
+
# yUML (https://yuml.me) can be as simple as:
|
11
11
|
#
|
12
12
|
# require "rails_erd/diagram"
|
13
13
|
#
|
@@ -124,13 +124,12 @@ module RailsERD
|
|
124
124
|
# internally by Diagram#create.
|
125
125
|
def generate
|
126
126
|
instance_eval(&callbacks[:setup])
|
127
|
-
|
128
127
|
if options.only_recursion_depth.present?
|
129
128
|
depth = options.only_recursion_depth.to_i
|
130
|
-
options
|
131
|
-
options
|
129
|
+
options[:only].dup.each do |class_name|
|
130
|
+
options[:only]+= recurse_into_relationships(@domain.entity_by_name(class_name), depth)
|
132
131
|
end
|
133
|
-
options
|
132
|
+
options[:only].uniq!
|
134
133
|
end
|
135
134
|
|
136
135
|
filtered_entities.each do |entity|
|
@@ -179,7 +178,7 @@ module RailsERD
|
|
179
178
|
def filtered_entities
|
180
179
|
@domain.entities.reject { |entity|
|
181
180
|
options.exclude.present? && entity.model && [options.exclude].flatten.map(&:to_sym).include?(entity.name.to_sym) or
|
182
|
-
options
|
181
|
+
options[:only].present? && entity.model && ![options[:only]].flatten.map(&:to_sym).include?(entity.name.to_sym) or
|
183
182
|
!options.inheritance && entity.specialized? or
|
184
183
|
!options.polymorphism && entity.generalized? or
|
185
184
|
!options.disconnected && entity.disconnected?
|
@@ -62,7 +62,8 @@ module RailsERD
|
|
62
62
|
concentrate: true,
|
63
63
|
labelloc: :t,
|
64
64
|
fontsize: 13,
|
65
|
-
fontname: FONTS[:bold]
|
65
|
+
fontname: FONTS[:bold],
|
66
|
+
splines: 'spline'
|
66
67
|
}
|
67
68
|
|
68
69
|
# Default node attributes.
|
@@ -188,6 +189,9 @@ module RailsERD
|
|
188
189
|
# Title of the graph itself.
|
189
190
|
graph[:label] = "#{title}\\n\\n" if title
|
190
191
|
|
192
|
+
# Style of splines
|
193
|
+
graph[:splines] = options.splines unless options.splines.nil?
|
194
|
+
|
191
195
|
# Setup notation options.
|
192
196
|
extend self.class.const_get(options.notation.to_s.capitalize.to_sym)
|
193
197
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<% if options.orientation == :
|
1
|
+
<% if options.orientation == :horizontal %>{<% end %>
|
2
2
|
<table border="0" align="center" cellspacing="0.5" cellpadding="0" width="<%= NODE_WIDTH + 4 %>">
|
3
3
|
<tr><td align="center" valign="bottom" width="<%= NODE_WIDTH %>"><font face="<%= FONTS[:bold] %>" point-size="11"><%= entity.name %></font></td></tr>
|
4
4
|
</table>
|
@@ -11,4 +11,4 @@
|
|
11
11
|
</table>
|
12
12
|
<% else %>
|
13
13
|
<% end %>
|
14
|
-
<% if options.orientation == :
|
14
|
+
<% if options.orientation == :horizontal %>}<% end %>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<% if options.orientation == :
|
1
|
+
<% if options.orientation == :horizontal %>{<% end %><%= entity.name %><% if attributes.any? %>
|
2
2
|
|<% attributes.each do |attribute| %><%=
|
3
3
|
attribute %> (<%= attribute.type_description %>)
|
4
|
-
<% end %><% end %><% if options.orientation == :
|
4
|
+
<% end %><% end %><% if options.orientation == :horizontal %>}<% end %>
|
data/lib/rails_erd/tasks.rake
CHANGED
@@ -1,8 +1,18 @@
|
|
1
|
+
require 'graphviz/utils'
|
2
|
+
|
1
3
|
def say(message)
|
2
4
|
puts message unless Rake.application.options.silent
|
3
5
|
end
|
4
6
|
|
5
7
|
namespace :erd do
|
8
|
+
task :check_dependencies do
|
9
|
+
include GraphViz::Utils
|
10
|
+
unless find_executable("dot", nil)
|
11
|
+
raise "Unable to find GraphViz's \"dot\" executable. Please " \
|
12
|
+
"visit https://voormedia.github.io/rails-erd/install.html for installation instructions."
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
6
16
|
task :options do
|
7
17
|
(RailsERD.options.keys.map(&:to_s) & ENV.keys).each do |option|
|
8
18
|
RailsERD.options[option.to_sym] = case ENV[option]
|
@@ -21,6 +31,10 @@ namespace :erd do
|
|
21
31
|
say "Loading code in search of Active Record models..."
|
22
32
|
begin
|
23
33
|
Rails.application.eager_load!
|
34
|
+
|
35
|
+
if Rails.application.respond_to?(:config) && !Rails.application.config.nil?
|
36
|
+
Rails.application.config.eager_load_namespaces.each(&:eager_load!)
|
37
|
+
end
|
24
38
|
rescue Exception => err
|
25
39
|
if Rake.application.options.trace
|
26
40
|
raise
|
@@ -34,7 +48,7 @@ namespace :erd do
|
|
34
48
|
raise "Active Record was not loaded." unless defined? ActiveRecord
|
35
49
|
end
|
36
50
|
|
37
|
-
task :generate => [:options, :load_models] do
|
51
|
+
task :generate => [:check_dependencies, :options, :load_models] do
|
38
52
|
say "Generating Entity-Relationship Diagram for #{ActiveRecord::Base.descendants.length} models..."
|
39
53
|
|
40
54
|
require "rails_erd/diagram/graphviz"
|
data/lib/rails_erd/version.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -48,6 +48,29 @@ class ActiveSupport::TestCase
|
|
48
48
|
ActiveRecord::Base.clear_cache!
|
49
49
|
end
|
50
50
|
|
51
|
+
def create_module_model(full_name,*args,&block)
|
52
|
+
superklass = args.first.kind_of?(Class) ? args.shift : ActiveRecord::Base
|
53
|
+
|
54
|
+
names = full_name.split('::')
|
55
|
+
|
56
|
+
parent_module = names[0..-1].inject(Object) do |parent,child|
|
57
|
+
parent = parent.const_set(child.to_sym, Module.new)
|
58
|
+
end
|
59
|
+
|
60
|
+
parent_module ||= Object
|
61
|
+
name = names.last
|
62
|
+
|
63
|
+
columns = args.first || {}
|
64
|
+
klass = parent_module.const_set name.to_sym, Class.new(superklass)
|
65
|
+
konstant = parent_module.const_get(name.to_sym)
|
66
|
+
|
67
|
+
if superklass == ActiveRecord::Base || superklass.abstract_class?
|
68
|
+
create_table konstant.table_name, columns, konstant.primary_key rescue nil
|
69
|
+
end
|
70
|
+
klass.class_eval(&block) if block_given?
|
71
|
+
konstant
|
72
|
+
end
|
73
|
+
|
51
74
|
def create_model(name, *args, &block)
|
52
75
|
superklass = args.first.kind_of?(Class) ? args.shift : ActiveRecord::Base
|
53
76
|
columns = args.first || {}
|
@@ -143,14 +166,37 @@ class ActiveSupport::TestCase
|
|
143
166
|
RailsERD.options = RailsERD.default_options.merge(Config.load)
|
144
167
|
end
|
145
168
|
|
169
|
+
def name_to_object_symbol_pairs(name)
|
170
|
+
parts = name.to_s.split('::')
|
171
|
+
|
172
|
+
return [] if parts.first == '' || parts.count == 0
|
173
|
+
|
174
|
+
parts[1..-1].inject([[Object, parts.first.to_sym]]) do |pairs,string|
|
175
|
+
last_parent, last_child = pairs.last
|
176
|
+
|
177
|
+
break pairs unless last_parent.const_defined?(last_child)
|
178
|
+
|
179
|
+
next_parent = last_parent.const_get(last_child)
|
180
|
+
next_child = string.to_sym
|
181
|
+
pairs << [next_parent, next_child]
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def remove_fully_qualified_constant(name)
|
186
|
+
pairs = name_to_object_symbol_pairs(name)
|
187
|
+
pairs.reverse.each do |parent, child|
|
188
|
+
parent.send(:remove_const,child) if parent.const_defined?(child)
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
146
192
|
def reset_domain
|
147
193
|
if defined? ActiveRecord
|
148
194
|
ActiveRecord::Base.descendants.each do |model|
|
149
195
|
next if model.name == "ActiveRecord::InternalMetadata"
|
150
196
|
model.reset_column_information
|
151
|
-
|
197
|
+
remove_fully_qualified_constant(model.name)
|
152
198
|
end
|
153
|
-
|
199
|
+
tables_and_views.each do |table|
|
154
200
|
ActiveRecord::Base.connection.drop_table table
|
155
201
|
end
|
156
202
|
ActiveRecord::Base.direct_descendants.clear
|
@@ -158,4 +204,12 @@ class ActiveSupport::TestCase
|
|
158
204
|
ActiveRecord::Base.clear_cache!
|
159
205
|
end
|
160
206
|
end
|
207
|
+
|
208
|
+
def tables_and_views
|
209
|
+
if ActiveRecord::VERSION::MAJOR >= 5
|
210
|
+
ActiveRecord::Base.connection.data_sources
|
211
|
+
else
|
212
|
+
ActiveRecord::Base.connection.tables
|
213
|
+
end
|
214
|
+
end
|
161
215
|
end
|
data/test/unit/attribute_test.rb
CHANGED
@@ -224,14 +224,14 @@ class AttributeTest < ActiveSupport::TestCase
|
|
224
224
|
test "limit should return nil if there is no limit" do
|
225
225
|
create_model "Foo"
|
226
226
|
add_column :foos, :my_txt, :text
|
227
|
-
|
227
|
+
assert_nil create_attribute(Foo, "my_txt").limit
|
228
228
|
end
|
229
229
|
|
230
230
|
test "limit should return nil if equal to standard database limit" do
|
231
231
|
with_native_limit :string, 456 do
|
232
232
|
create_model "Foo"
|
233
233
|
add_column :foos, :my_str, :string, :limit => 456
|
234
|
-
|
234
|
+
assert_nil create_attribute(Foo, "my_str").limit
|
235
235
|
end
|
236
236
|
end
|
237
237
|
|
@@ -252,7 +252,7 @@ class AttributeTest < ActiveSupport::TestCase
|
|
252
252
|
test "limit should return nil for decimal columns if equal to standard database limit" do
|
253
253
|
create_model "Foo"
|
254
254
|
add_column :foos, :num, :decimal
|
255
|
-
|
255
|
+
assert_nil create_attribute(Foo, "num").limit
|
256
256
|
end
|
257
257
|
|
258
258
|
test "limit should return nil if type is unsupported by rails" do
|
@@ -262,7 +262,7 @@ class AttributeTest < ActiveSupport::TestCase
|
|
262
262
|
add_column "foos", "a", "REAL"
|
263
263
|
end
|
264
264
|
end
|
265
|
-
|
265
|
+
assert_nil create_attribute(Foo, "a").limit
|
266
266
|
end
|
267
267
|
|
268
268
|
test "limit should return nil for oddball column types that misuse the limit attribute" do
|
@@ -274,7 +274,7 @@ class AttributeTest < ActiveSupport::TestCase
|
|
274
274
|
{ :srid => 4326, :type => "point", :geographic => true }
|
275
275
|
end
|
276
276
|
end
|
277
|
-
|
277
|
+
assert_nil attribute.limit
|
278
278
|
end
|
279
279
|
|
280
280
|
test "scale should return scale for decimal columns if nonstandard" do
|
@@ -286,7 +286,7 @@ class AttributeTest < ActiveSupport::TestCase
|
|
286
286
|
test "scale should return nil for decimal columns if equal to standard database limit" do
|
287
287
|
create_model "Foo"
|
288
288
|
add_column :foos, :num, :decimal
|
289
|
-
|
289
|
+
assert_nil create_attribute(Foo, "num").scale
|
290
290
|
end
|
291
291
|
|
292
292
|
test "scale should return zero for decimal columns if left to default setting when specifying precision" do
|
@@ -302,7 +302,7 @@ class AttributeTest < ActiveSupport::TestCase
|
|
302
302
|
add_column "foos", "a", "REAL"
|
303
303
|
end
|
304
304
|
end
|
305
|
-
|
305
|
+
assert_nil create_attribute(Foo, "a").scale
|
306
306
|
end
|
307
307
|
|
308
308
|
test "scale should return nil for oddball column types that misuse the scale attribute" do
|
@@ -313,6 +313,6 @@ class AttributeTest < ActiveSupport::TestCase
|
|
313
313
|
1..5
|
314
314
|
end
|
315
315
|
end
|
316
|
-
|
316
|
+
assert_nil attribute.scale
|
317
317
|
end
|
318
318
|
end
|
data/test/unit/domain_test.rb
CHANGED
@@ -225,7 +225,7 @@ class DomainTest < ActiveSupport::TestCase
|
|
225
225
|
output = collect_stdout do
|
226
226
|
Domain.generate.relationships
|
227
227
|
end
|
228
|
-
assert_match
|
228
|
+
assert_match(/Ignoring invalid association :flabs on Foo/, output)
|
229
229
|
end
|
230
230
|
|
231
231
|
test "relationships should output a warning when an association to model outside domain is encountered" do
|
@@ -236,7 +236,7 @@ class DomainTest < ActiveSupport::TestCase
|
|
236
236
|
output = collect_stdout do
|
237
237
|
Domain.new([Foo]).relationships
|
238
238
|
end
|
239
|
-
assert_match
|
239
|
+
assert_match(/model Bar exists, but is not included in domain/, output)
|
240
240
|
end
|
241
241
|
|
242
242
|
test "relationships should output a warning when an association to a non existent generalization is encountered" do
|
@@ -249,7 +249,7 @@ class DomainTest < ActiveSupport::TestCase
|
|
249
249
|
output = collect_stdout do
|
250
250
|
Domain.generate.relationships
|
251
251
|
end
|
252
|
-
assert_match
|
252
|
+
assert_match(/polymorphic interface FooBar does not exist/, output)
|
253
253
|
end
|
254
254
|
|
255
255
|
test "relationships should not warn when a bad association is encountered if warnings are disabled" do
|
@@ -273,6 +273,6 @@ class DomainTest < ActiveSupport::TestCase
|
|
273
273
|
output = collect_stdout do
|
274
274
|
Domain.generate.entities
|
275
275
|
end
|
276
|
-
assert_match
|
276
|
+
assert_match(/Ignoring invalid model Foo \(table foos does not exist\)/, output)
|
277
277
|
end
|
278
278
|
end
|
data/test/unit/entity_test.rb
CHANGED
@@ -249,4 +249,30 @@ class EntityTest < ActiveSupport::TestCase
|
|
249
249
|
assert_equal [domain.entity_by_name("Galleon"), domain.entity_by_name("Stronghold")],
|
250
250
|
domain.entity_by_name("Defensible").children
|
251
251
|
end
|
252
|
+
|
253
|
+
# Namespace ===================================================================
|
254
|
+
test "namespace should return nil for models outside modules" do
|
255
|
+
create_module_model "Plane"
|
256
|
+
assert_nil create_entity(Plane).namespace
|
257
|
+
end
|
258
|
+
|
259
|
+
test "namespace should return the module name for single-module models" do
|
260
|
+
create_module_model "Saw::Plane"
|
261
|
+
assert_equal "Saw", create_entity(Saw::Plane).namespace
|
262
|
+
end
|
263
|
+
|
264
|
+
test "namespace should return the module path if more than one module" do
|
265
|
+
create_module_model "Augur::Chisel::Saw::Plane"
|
266
|
+
assert_equal "Augur::Chisel::Saw", create_entity(Augur::Chisel::Saw::Plane).namespace
|
267
|
+
end
|
268
|
+
|
269
|
+
test "namespace defaults to nil" do
|
270
|
+
create_model "Foo"
|
271
|
+
assert_nil create_entity(Foo).namespace
|
272
|
+
end
|
273
|
+
|
274
|
+
test "namespace returns appropriate modules" do
|
275
|
+
entity = Domain::Entity.new(Domain.new, "Foo::Bar::Qux")
|
276
|
+
assert_equal "Foo::Bar", entity.namespace
|
277
|
+
end
|
252
278
|
end
|
data/test/unit/graphviz_test.rb
CHANGED
@@ -149,7 +149,7 @@ class GraphvizTest < ActiveSupport::TestCase
|
|
149
149
|
rescue => e
|
150
150
|
message = e.message
|
151
151
|
end
|
152
|
-
assert_match
|
152
|
+
assert_match(/No entities found/, message)
|
153
153
|
end
|
154
154
|
|
155
155
|
test "create should abort and complain if output directory does not exist" do
|
@@ -162,7 +162,7 @@ class GraphvizTest < ActiveSupport::TestCase
|
|
162
162
|
message = e.message
|
163
163
|
end
|
164
164
|
|
165
|
-
assert_match
|
165
|
+
assert_match(/Output directory 'does_not_exist' does not exist/, message)
|
166
166
|
end
|
167
167
|
|
168
168
|
test "create should not fail when reserved words are used as node names" do
|
@@ -186,6 +186,16 @@ class GraphvizTest < ActiveSupport::TestCase
|
|
186
186
|
assert_equal '"Domain model\n\n"', diagram.graph.graph[:label].to_s
|
187
187
|
end
|
188
188
|
|
189
|
+
test "generate should add default value for splines attribute" do
|
190
|
+
create_simple_domain
|
191
|
+
assert_equal '"spline"', diagram.graph.graph[:splines].to_s
|
192
|
+
end
|
193
|
+
|
194
|
+
test "generate should add set value for splines attribute" do
|
195
|
+
create_simple_domain
|
196
|
+
assert_equal '"ortho"', diagram(splines: 'ortho').graph.graph[:splines].to_s
|
197
|
+
end
|
198
|
+
|
189
199
|
test "generate should add title with application name to graph" do
|
190
200
|
begin
|
191
201
|
Object::Quux = Module.new
|
@@ -228,7 +238,7 @@ class GraphvizTest < ActiveSupport::TestCase
|
|
228
238
|
belongs_to :bar
|
229
239
|
end
|
230
240
|
create_model "Bar"
|
231
|
-
assert_equal %Q("Bar"), find_dot_node(diagram, "m_Bar")[:label].to_gv
|
241
|
+
assert_equal %Q("{Bar}"), find_dot_node(diagram, "m_Bar")[:label].to_gv
|
232
242
|
end
|
233
243
|
|
234
244
|
test "generate should add attributes to entity html labels" do
|
@@ -246,7 +256,7 @@ class GraphvizTest < ActiveSupport::TestCase
|
|
246
256
|
belongs_to :bar
|
247
257
|
end
|
248
258
|
create_model "Bar", :column => :string, :column_two => :boolean
|
249
|
-
assert_equal %Q("Bar|column (string)\\ncolumn_two (boolean)\\n"), find_dot_node(diagram, "m_Bar")[:label].to_gv
|
259
|
+
assert_equal %Q("{Bar|column (string)\\ncolumn_two (boolean)\\n}"), find_dot_node(diagram, "m_Bar")[:label].to_gv
|
250
260
|
end
|
251
261
|
|
252
262
|
test "generate should not add any attributes to entity labels if attributes is set to false" do
|
@@ -257,40 +267,40 @@ class GraphvizTest < ActiveSupport::TestCase
|
|
257
267
|
assert_no_match %r{contents}, find_dot_node(diagram(:attributes => false), "m_Jar")[:label].to_gv
|
258
268
|
end
|
259
269
|
|
260
|
-
test "node html labels should have direction reversing braces for
|
270
|
+
test "node html labels should have direction reversing braces for horizontal orientation" do
|
261
271
|
RailsERD.options.markup = true
|
262
272
|
create_model "Book", :author => :references do
|
263
273
|
belongs_to :author
|
264
274
|
end
|
265
275
|
create_model "Author", :name => :string
|
266
|
-
assert_match %r(\A<\{\s*<.*\|.*>\s*\}>\Z)m, find_dot_node(diagram(:orientation => :
|
276
|
+
assert_match %r(\A<\{\s*<.*\|.*>\s*\}>\Z)m, find_dot_node(diagram(:orientation => :horizontal), "m_Author")[:label].to_gv
|
267
277
|
end
|
268
278
|
|
269
|
-
test "node html labels should not have direction reversing braces for
|
279
|
+
test "node html labels should not have direction reversing braces for vertical orientation" do
|
270
280
|
RailsERD.options.markup = true
|
271
281
|
create_model "Book", :author => :references do
|
272
282
|
belongs_to :author
|
273
283
|
end
|
274
284
|
create_model "Author", :name => :string
|
275
|
-
assert_match %r(\A<\s*<.*\|.*>\s*>\Z)m, find_dot_node(diagram(:orientation => :
|
285
|
+
assert_match %r(\A<\s*<.*\|.*>\s*>\Z)m, find_dot_node(diagram(:orientation => :vertical), "m_Author")[:label].to_gv
|
276
286
|
end
|
277
287
|
|
278
|
-
test "node record labels should have direction reversing braces for
|
288
|
+
test "node record labels should have direction reversing braces for horizontal orientation" do
|
279
289
|
RailsERD.options.markup = false
|
280
290
|
create_model "Book", :author => :references do
|
281
291
|
belongs_to :author
|
282
292
|
end
|
283
293
|
create_model "Author", :name => :string
|
284
|
-
assert_match %r(\A"\{\w
|
294
|
+
assert_match %r(\A"\{\w+\|.*\}"\Z)m, find_dot_node(diagram(:orientation => :horizontal), "m_Author")[:label].to_gv
|
285
295
|
end
|
286
296
|
|
287
|
-
test "node record labels should not have direction reversing braces for
|
297
|
+
test "node record labels should not have direction reversing braces for vertical orientation" do
|
288
298
|
RailsERD.options.markup = false
|
289
299
|
create_model "Book", :author => :references do
|
290
300
|
belongs_to :author
|
291
301
|
end
|
292
302
|
create_model "Author", :name => :string
|
293
|
-
assert_match %r(\A"\w
|
303
|
+
assert_match %r(\A"\w+\|.*"\Z)m, find_dot_node(diagram(:orientation => :vertical), "m_Author")[:label].to_gv
|
294
304
|
end
|
295
305
|
|
296
306
|
test "generate should create edge for each relationship" do
|
data/test/unit/rake_task_test.rb
CHANGED
@@ -20,6 +20,7 @@ class RakeTaskTest < ActiveSupport::TestCase
|
|
20
20
|
Object::Quux = Module.new
|
21
21
|
Object::Quux::Application = Class.new
|
22
22
|
Object::Rails = Struct.new(:application).new(Object::Quux::Application.new)
|
23
|
+
|
23
24
|
Rails.class_eval do
|
24
25
|
define_method :backtrace_cleaner do
|
25
26
|
ActiveSupport::BacktraceCleaner.new.tap do |cleaner|
|
@@ -100,12 +101,13 @@ class RakeTaskTest < ActiveSupport::TestCase
|
|
100
101
|
rescue => e
|
101
102
|
message = e.message
|
102
103
|
end
|
103
|
-
assert_match
|
104
|
+
assert_match(/#{Regexp.escape(<<-MSG.strip).gsub("xxx", ".*?")}/, message
|
104
105
|
Loading models failed!
|
105
106
|
Error occurred while loading application: FooBar (RuntimeError)
|
106
107
|
test/unit/rake_task_test.rb:#{l1}:in `xxx'
|
107
108
|
test/unit/rake_task_test.rb:#{l2}:in `xxx'
|
108
109
|
MSG
|
110
|
+
)
|
109
111
|
end
|
110
112
|
|
111
113
|
test "generate task should reraise if application could not be loaded and trace option is enabled" do
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-erd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rolf Timmermans
|
8
|
+
- Kerri Miller
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2017-05-15 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: activerecord
|
@@ -70,6 +71,7 @@ description: Automatically generate an entity-relationship diagram (ERD) for you
|
|
70
71
|
Rails models.
|
71
72
|
email:
|
72
73
|
- r.timmermans@voormedia.com
|
74
|
+
- kerrizor@kerrizor.com
|
73
75
|
executables:
|
74
76
|
- erd
|
75
77
|
extensions: []
|
@@ -133,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
135
|
version: '0'
|
134
136
|
requirements: []
|
135
137
|
rubyforge_project:
|
136
|
-
rubygems_version: 2.
|
138
|
+
rubygems_version: 2.6.10
|
137
139
|
signing_key:
|
138
140
|
specification_version: 4
|
139
141
|
summary: Entity-relationship diagram for your Rails models.
|
@@ -152,4 +154,3 @@ test_files:
|
|
152
154
|
- test/unit/rake_task_test.rb
|
153
155
|
- test/unit/relationship_test.rb
|
154
156
|
- test/unit/specialization_test.rb
|
155
|
-
has_rdoc:
|