rails-erd 0.4.0 → 0.4.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.
- data/CHANGES.rdoc +5 -0
- data/Gemfile.lock +1 -1
- data/VERSION +1 -1
- data/lib/rails_erd/domain/relationship.rb +3 -3
- data/lib/rails_erd/tasks.rake +7 -8
- data/rails-erd.gemspec +2 -2
- data/test/test_helper.rb +10 -8
- data/test/unit/domain_test.rb +12 -0
- data/test/unit/rake_task_test.rb +36 -0
- data/test/unit/relationship_test.rb +11 -2
- metadata +3 -3
data/CHANGES.rdoc
CHANGED
data/Gemfile.lock
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.1
|
@@ -30,7 +30,7 @@ module RailsERD
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def association_target(association)
|
33
|
-
association.class_name
|
33
|
+
association.options[:polymorphic] ? association.class_name : association.klass.name
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -58,8 +58,8 @@ module RailsERD
|
|
58
58
|
else
|
59
59
|
# Many-to-many associations don't have a clearly defined direction.
|
60
60
|
# We sort by name and use the first model as the source.
|
61
|
-
source = associations.first
|
62
|
-
associations.partition { |association| association.active_record
|
61
|
+
source = associations.map(&:active_record).sort_by(&:name).first
|
62
|
+
associations.partition { |association| association.active_record != source }
|
63
63
|
end
|
64
64
|
|
65
65
|
assoc = @forward_associations.first || @reverse_associations.first
|
data/lib/rails_erd/tasks.rake
CHANGED
@@ -15,18 +15,17 @@ namespace :erd do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
task :load_models do
|
18
|
-
say "Loading
|
19
|
-
|
18
|
+
say "Loading application environment..."
|
20
19
|
Rake::Task[:environment].invoke
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
20
|
+
|
21
|
+
say "Loading code in search of Active Record models..."
|
22
|
+
Rails.application.eager_load!
|
23
|
+
|
24
|
+
raise "Active Record was not loaded." unless defined? ActiveRecord
|
26
25
|
end
|
27
26
|
|
28
27
|
task :generate => [:options, :load_models] do
|
29
|
-
say "Generating Entity-Relationship Diagram..."
|
28
|
+
say "Generating Entity-Relationship Diagram for #{ActiveRecord::Base.descendants.length} models..."
|
30
29
|
|
31
30
|
require "rails_erd/diagram/graphviz"
|
32
31
|
file = RailsERD::Diagram::Graphviz.create
|
data/rails-erd.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rails-erd}
|
8
|
-
s.version = "0.4.
|
8
|
+
s.version = "0.4.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Rolf Timmermans"]
|
12
|
-
s.date = %q{2010-10-
|
12
|
+
s.date = %q{2010-10-14}
|
13
13
|
s.description = %q{Automatically generate an entity-relationship diagram (ERD) for your Rails models.}
|
14
14
|
s.email = %q{r.timmermans@voormedia.com}
|
15
15
|
s.extra_rdoc_files = [
|
data/test/test_helper.rb
CHANGED
@@ -109,14 +109,16 @@ class ActiveSupport::TestCase
|
|
109
109
|
private
|
110
110
|
|
111
111
|
def reset_domain
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
ActiveRecord::Base.connection.
|
112
|
+
if defined? ActiveRecord
|
113
|
+
ActiveRecord::Base.descendants.each do |model|
|
114
|
+
Object.send :remove_const, model.name.to_sym
|
115
|
+
end
|
116
|
+
ActiveRecord::Base.connection.tables.each do |table|
|
117
|
+
ActiveRecord::Base.connection.drop_table table
|
118
|
+
end
|
119
|
+
ActiveRecord::Base.direct_descendants.clear
|
120
|
+
Arel::Relation.send :class_variable_set, :@@connection_tables_primary_keys, {}
|
121
|
+
ActiveSupport::Dependencies::Reference.clear!
|
117
122
|
end
|
118
|
-
ActiveRecord::Base.direct_descendants.clear
|
119
|
-
Arel::Relation.send :class_variable_set, :@@connection_tables_primary_keys, {}
|
120
|
-
ActiveSupport::Dependencies::Reference.clear!
|
121
123
|
end
|
122
124
|
end
|
data/test/unit/domain_test.rb
CHANGED
@@ -127,6 +127,18 @@ class DomainTest < ActiveSupport::TestCase
|
|
127
127
|
assert_equal [Domain::Relationship] * 2, Domain.generate.relationships.collect(&:class)
|
128
128
|
end
|
129
129
|
|
130
|
+
test "relationships should use model name first in alphabet as source for many to many relationships" do
|
131
|
+
create_table "many_more", :many_id => :integer, :more_id => :integer
|
132
|
+
create_model "Many" do
|
133
|
+
has_and_belongs_to_many :more
|
134
|
+
end
|
135
|
+
create_model "More" do
|
136
|
+
has_and_belongs_to_many :many
|
137
|
+
end
|
138
|
+
relationship = Domain.generate.relationships.first
|
139
|
+
assert_equal ["Many", "More"], [relationship.source.name, relationship.destination.name]
|
140
|
+
end
|
141
|
+
|
130
142
|
# Specialization processing ================================================
|
131
143
|
test "specializations should return empty array for empty domain" do
|
132
144
|
assert_equal [], Domain.generate.specializations
|
data/test/unit/rake_task_test.rb
CHANGED
@@ -29,6 +29,42 @@ class RakeTaskTest < ActiveSupport::TestCase
|
|
29
29
|
assert !File.exists?("ERD.dot")
|
30
30
|
end
|
31
31
|
|
32
|
+
test "generate task should eager load application environment" do
|
33
|
+
eager_loaded, environment_loaded = nil
|
34
|
+
Object::Quux = Module.new
|
35
|
+
Object::Quux::Application = Class.new
|
36
|
+
Object::Rails = Struct.new(:application).new(Object::Quux::Application.new)
|
37
|
+
Rails.application.class_eval do
|
38
|
+
define_method :eager_load! do
|
39
|
+
eager_loaded = true
|
40
|
+
end
|
41
|
+
end
|
42
|
+
Rake::Task.define_task :environment do
|
43
|
+
environment_loaded = true
|
44
|
+
end
|
45
|
+
create_simple_domain
|
46
|
+
Rake::Task["erd:generate"].invoke
|
47
|
+
assert_equal [true, true], [eager_loaded, environment_loaded]
|
48
|
+
end
|
49
|
+
|
50
|
+
test "generate task should complain if active record is not loaded" do
|
51
|
+
Object::Quux = Module.new
|
52
|
+
Object::Quux::Application = Class.new
|
53
|
+
Object::Rails = Struct.new(:application).new(Object::Quux::Application.new)
|
54
|
+
Rails.application.class_eval do
|
55
|
+
define_method :eager_load! do end
|
56
|
+
end
|
57
|
+
Rake::Task.define_task :environment
|
58
|
+
Object.send :remove_const, :ActiveRecord
|
59
|
+
message = nil
|
60
|
+
begin
|
61
|
+
Rake::Task["erd:generate"].invoke
|
62
|
+
rescue => e
|
63
|
+
message = e.message
|
64
|
+
end
|
65
|
+
assert_equal "Active Record was not loaded.", message
|
66
|
+
end
|
67
|
+
|
32
68
|
# Option processing ========================================================
|
33
69
|
test "options task should ignore unknown command line options" do
|
34
70
|
ENV["unknownoption"] = "value"
|
@@ -34,6 +34,15 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
34
34
|
assert_equal [domain.entity_by_name("Foo")], domain.relationships.map(&:destination)
|
35
35
|
end
|
36
36
|
|
37
|
+
test "destination should return relationship destination if specified with absolute module path" do
|
38
|
+
create_model "Foo", :bar => :references
|
39
|
+
create_model "Bar" do
|
40
|
+
has_many :foos, :class_name => "::Foo"
|
41
|
+
end
|
42
|
+
domain = Domain.generate
|
43
|
+
assert_equal [domain.entity_by_name("Foo")], domain.relationships.map(&:destination)
|
44
|
+
end
|
45
|
+
|
37
46
|
# Relationship properties ==================================================
|
38
47
|
test "mutual should return false for one way relationship" do
|
39
48
|
create_model "Foo", :bar => :references do
|
@@ -261,7 +270,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
261
270
|
More.class_eval do
|
262
271
|
validates_length_of :many, :maximum => 29, :minimum => 7
|
263
272
|
end
|
264
|
-
assert_equal [Domain::Relationship::Cardinality.new(
|
273
|
+
assert_equal [Domain::Relationship::Cardinality.new(7..29, 3..18)], domain_cardinalities
|
265
274
|
end
|
266
275
|
|
267
276
|
test "cardinality should be n-m to n-m for limited many to many associations with multiple validations" do
|
@@ -278,7 +287,7 @@ class RelationshipTest < ActiveSupport::TestCase
|
|
278
287
|
validates_length_of :many, :minimum => 9
|
279
288
|
validates_length_of :many, :maximum => 17
|
280
289
|
end
|
281
|
-
assert_equal [Domain::Relationship::Cardinality.new(
|
290
|
+
assert_equal [Domain::Relationship::Cardinality.new(9..17, 3..20)], domain_cardinalities
|
282
291
|
end
|
283
292
|
|
284
293
|
# Cardinality for non-mutual relationships =================================
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 4
|
8
|
-
-
|
9
|
-
version: 0.4.
|
8
|
+
- 1
|
9
|
+
version: 0.4.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Rolf Timmermans
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-10-
|
17
|
+
date: 2010-10-14 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|