rails-mermaid_erd 0.2.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 70e02f24014b859b87f976e91a1ac6c7d9a2abb55b645993fcdba7280b027d03
4
- data.tar.gz: ba506228775db665a9637d11d0fdf1b8af14a3f7db80da610e54e36ec4ac77c1
3
+ metadata.gz: 8e4055c271a20a0d95b98c24eea1149feb9ff6ab9333a0fd57e4483264b61ac8
4
+ data.tar.gz: 8575c2a15370b7d9467dc32bbcf237cf26a0593748e6c0303b56e17c8960a99a
5
5
  SHA512:
6
- metadata.gz: ccb7f93e4c2b7063cfe9d3ac394a5cb05268c956986616930356bba4a703f06e1b18da281ecc29f78f102444c5b26645c0cf6c109803b39279e02da3d11c6ac5
7
- data.tar.gz: e35178ebb61084b313e1e3586732e45834b14a73d7b16af17dadfc6de8bed921f8c24ce3f58a22a6d412783efce02788c5c1b25ce8b4de0452b856e3273f6719
6
+ metadata.gz: fbeee181795d8ea1a191f39b7bb015dbfc9e8db791d9c55af8d2d752e6cd577a41e3ebb189a4fa865868e8ccc97f8c1548e76c6a21b11f2125126d881717ac14
7
+ data.tar.gz: 9e0d419707357cb622495a78424b4704a8188cacbb92927f5dd19d7a35b53a634d2948cca6bb079927eaeea6caef20ada027f389dd7a0fa0417ae499fab43e9f
@@ -0,0 +1,163 @@
1
+ require "yaml"
2
+
3
+ class RailsMermaidErd::Builder
4
+ class << self
5
+ def model_data
6
+ result = {
7
+ Models: [],
8
+ Relations: []
9
+ }
10
+
11
+ ::Rails.application.eager_load!
12
+ ::ActiveRecord::Base.descendants.sort_by(&:name).each do |defined_model|
13
+ next unless defined_model.table_exists?
14
+ next if defined_model.name.include?("HABTM_")
15
+ next if defined_model.table_name.blank?
16
+
17
+ model = {
18
+ TableName: defined_model.table_name,
19
+ ModelName: defined_model.name,
20
+ IsModelExist: true,
21
+ Columns: []
22
+ }
23
+
24
+ foreign_keys = ::ActiveRecord::Schema.foreign_keys(defined_model.table_name).map { |k| k.options[:column] }
25
+ primary_key = defined_model.primary_key
26
+ defined_model.columns.each do |column|
27
+ key = ""
28
+ if column.name == primary_key
29
+ key = "PK"
30
+ elsif foreign_keys.include?(column.name)
31
+ key = "FK"
32
+ end
33
+ model[:Columns] << {
34
+ name: column.name,
35
+ type: column.type,
36
+ key: key,
37
+ comment: column.comment
38
+ }
39
+ end
40
+
41
+ result[:Models] << model
42
+
43
+ defined_model.reflect_on_all_associations(:has_many).each do |reflection|
44
+ reflection_model_name = get_reflection_model_name(reflection)
45
+
46
+ reverse_relation = result[:Relations].find { |r|
47
+ if reflection.options[:through]
48
+ r[:RightModelName] == model[:ModelName] && r[:LeftModelName] == reflection_model_name && r[:Line] == ".."
49
+ else
50
+ r[:RightModelName] == model[:ModelName] && r[:LeftModelName] == reflection_model_name && r[:Line] == "--"
51
+ end
52
+ }
53
+ if reverse_relation
54
+ reverse_relation[:Comment] = if reflection.options[:through]
55
+ "#{reverse_relation[:Comment]}, HMT:#{reflection.name}"
56
+ else
57
+ "#{reverse_relation[:Comment]}, HM:#{reflection.name}"
58
+ end
59
+ else
60
+ result[:Relations] << {
61
+ LeftModelName: model[:ModelName],
62
+ LeftValue: reflection.options[:through] ? "}o" : "||",
63
+ Line: reflection.options[:through] ? ".." : "--",
64
+ RightModelName: reflection_model_name,
65
+ RightValue: "o{",
66
+ Comment: reflection.options[:through] ? "HMT:#{reflection.name}" : "HM:#{reflection.name}"
67
+ }
68
+ end
69
+ end
70
+
71
+ defined_model.reflect_on_all_associations(:has_and_belongs_to_many).each do |reflection|
72
+ reflection_model_name = get_reflection_model_name(reflection)
73
+
74
+ reverse_relation = result[:Relations].find { |r| r[:RightModelName] == model[:ModelName] && r[:LeftModelName] == reflection_model_name }
75
+ if reverse_relation
76
+ reverse_relation[:Comment] = "HABTM"
77
+ else
78
+ result[:Relations] << {
79
+ LeftModelName: model[:ModelName],
80
+ LeftValue: "}o",
81
+ Line: "..",
82
+ RightModelName: reflection_model_name,
83
+ RightValue: "o{",
84
+ Comment: "HABTM"
85
+ }
86
+ end
87
+ end
88
+
89
+ defined_model.reflect_on_all_associations(:belongs_to).each do |reflection|
90
+ reflection_model_name = get_reflection_model_name(reflection)
91
+
92
+ reverse_relation = result[:Relations].find { |r| r[:RightModelName] == model[:ModelName] && r[:LeftModelName] == reflection_model_name }
93
+ if reverse_relation
94
+ if (::Rails.application.config.active_record.belongs_to_required_by_default && reflection.options[:optional]) || (!::Rails.application.config.active_record.belongs_to_required_by_default && !reflection.options[:requried])
95
+ reverse_relation[:LeftValue] = "|o"
96
+ end
97
+ reverse_relation[:Comment] = "#{reverse_relation[:Comment]}, BT:#{reflection.name}"
98
+ else
99
+ right_value = if (::Rails.application.config.active_record.belongs_to_required_by_default && reflection.options[:optional]) || (!::Rails.application.config.active_record.belongs_to_required_by_default && !reflection.options[:requried])
100
+ "o|"
101
+ else
102
+ "||"
103
+ end
104
+ result[:Relations] << {
105
+ LeftModelName: model[:ModelName],
106
+ LeftValue: "}o",
107
+ Line: "--",
108
+ RightModelName: reflection_model_name,
109
+ RightValue: right_value,
110
+ Comment: "BT:#{reflection.name}"
111
+ }
112
+ end
113
+ end
114
+
115
+ defined_model.reflect_on_all_associations(:has_one).each do |reflection|
116
+ reflection_model_name = get_reflection_model_name(reflection)
117
+
118
+ reverse_relation = result[:Relations].find { |r|
119
+ if reflection.options[:through]
120
+ r[:RightModelName] == model[:ModelName] && r[:LeftModelName] == reflection_model_name && r[:Line] == ".."
121
+ else
122
+ r[:RightModelName] == model[:ModelName] && r[:LeftModelName] == reflection_model_name && r[:Line] == "--"
123
+ end
124
+ }
125
+ if reverse_relation
126
+ reverse_relation[:LeftValue] = "|o"
127
+ reverse_relation[:Comment] = if reflection.options[:through]
128
+ "#{reverse_relation[:Comment]}, HOT:#{reflection.name}"
129
+ else
130
+ "#{reverse_relation[:Comment]}, HO:#{reflection.name}"
131
+ end
132
+ else
133
+ result[:Relations] << {
134
+ LeftModelName: model[:ModelName],
135
+ LeftValue: reflection.options[:through] ? "}o" : "||",
136
+ Line: reflection.options[:through] ? ".." : "--",
137
+ RightModelName: reflection_model_name,
138
+ RightValue: "o|",
139
+ Comment: reflection.options[:through] ? "HOT:#{reflection.name}" : "HO:#{reflection.name}"
140
+ }
141
+ end
142
+ end
143
+ end
144
+
145
+ result
146
+ end
147
+
148
+ # Doc: https://guides.rubyonrails.org/association_basics.html
149
+ def get_reflection_model_name(reflection)
150
+ if reflection.options[:class_name]
151
+ reflection.options[:class_name].to_s.classify
152
+ elsif reflection.options[:through]
153
+ if reflection.options[:source]
154
+ reflection.options[:source].to_s.classify
155
+ else
156
+ reflection.class_name
157
+ end
158
+ else
159
+ reflection.class_name
160
+ end
161
+ end
162
+ end
163
+ end
@@ -1,21 +1,19 @@
1
1
  require "yaml"
2
2
 
3
- module RailsMermaidErd
4
- class Configuration
5
- attr_accessor :result_path
3
+ class RailsMermaidErd::Configuration
4
+ attr_accessor :result_path
6
5
 
7
- def initialize
8
- config = {
9
- result_path: "mermaid_erd/index.html"
10
- }
6
+ def initialize
7
+ config = {
8
+ result_path: "mermaid_erd/index.html"
9
+ }
11
10
 
12
- config_file = Rails.root.join("config/mermaid_erd.yml")
13
- if File.exist?(config_file)
14
- custom_config = YAML.load(config_file.read).symbolize_keys
15
- config = config.merge(custom_config)
16
- end
17
-
18
- @result_path = config[:result_path]
11
+ config_file = Rails.root.join("config/mermaid_erd.yml")
12
+ if File.exist?(config_file)
13
+ custom_config = YAML.load(config_file.read).symbolize_keys
14
+ config = config.merge(custom_config)
19
15
  end
16
+
17
+ @result_path = config[:result_path]
20
18
  end
21
19
  end
@@ -1,3 +1,3 @@
1
1
  module RailsMermaidErd
2
- VERSION = "0.2.0"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -4,6 +4,7 @@ require "rake"
4
4
  require "rake/dsl_definition"
5
5
  require_relative "rails-mermaid_erd/version"
6
6
  require_relative "rails-mermaid_erd/configuration"
7
+ require_relative "rails-mermaid_erd/builder"
7
8
 
8
9
  module RailsMermaidErd
9
10
  extend Rake::DSL
@@ -16,184 +17,7 @@ module RailsMermaidErd
16
17
 
17
18
  desc "Generate Mermaid ERD."
18
19
  task mermaid_erd: :environment do
19
- result = {
20
- Models: [],
21
- Relations: []
22
- }
23
-
24
- ::Rails.application.eager_load!
25
- ::ActiveRecord::Base.descendants.each do |defined_model|
26
- next unless defined_model.table_exists?
27
- model = {
28
- TableName: defined_model.table_name,
29
- ModelName: defined_model.name,
30
- IsModelExist: true,
31
- Columns: []
32
- }
33
-
34
- next if defined_model.table_name.blank?
35
-
36
- foreign_keys = ::ActiveRecord::Schema.foreign_keys(defined_model.table_name).map { |k| k.options[:column] }
37
- primary_key = defined_model.primary_key
38
-
39
- defined_model.columns.each do |column|
40
- key = ""
41
- if column.name == primary_key
42
- key = "PK"
43
- elsif foreign_keys.include?(column.name)
44
- key = "FK"
45
- end
46
- model[:Columns] << {
47
- name: column.name,
48
- type: column.type,
49
- key: key,
50
- comment: column.comment
51
- }
52
- end
53
-
54
- result[:Models] << model
55
-
56
- next unless model[:IsModelExist]
57
-
58
- defined_model.reflect_on_all_associations(:has_many).each do |h|
59
- if h.options[:through]
60
- next
61
- end
62
- if h.options[:class_name]
63
- reverse_relation = result[:Relations].find { |r| r[:RightModelName] == model[:ModelName] && r[:LeftModelName] == h.options[:class_name] }
64
- if reverse_relation
65
- reverse_relation[:Comment] = if reverse_relation[:Comment] == ""
66
- "has_many #{h.name}"
67
- else
68
- "#{reverse_relation[:Comment]} : has_many #{h.name}"
69
- end
70
- else
71
- result[:Relations] << {
72
- LeftModelName: model[:ModelName],
73
- LeftValue: "||",
74
- RightModelName: h.name.to_s.classify,
75
- RightValue: "o{",
76
- Comment: "has_many #{h.name}"
77
- }
78
- end
79
- else
80
- reverse_relation = result[:Relations].find { |r| r[:RightModelName] == model[:ModelName] && r[:LeftModelName] == h.name.to_s.classify }
81
- if reverse_relation
82
- else
83
- result[:Relations] << {
84
- LeftModelName: model[:ModelName],
85
- LeftValue: "||",
86
- RightModelName: h.name.to_s.classify,
87
- RightValue: "o{",
88
- Comment: ""
89
- }
90
- end
91
- end
92
- end
93
-
94
- defined_model.reflect_on_all_associations(:belongs_to).each do |h|
95
- if h.options[:class_name]
96
- reverse_relation = result[:Relations].find { |r| r[:RightModelName] == model[:ModelName] && r[:LeftModelName] == h.options[:class_name] }
97
-
98
- if reverse_relation
99
- if (::Rails.application.config.active_record.belongs_to_required_by_default && h.options[:optional]) || (!::Rails.application.config.active_record.belongs_to_required_by_default && !h.options[:requried])
100
- reverse_relation[:LeftValue] = "|o"
101
- end
102
- reverse_relation[:Comment] = if reverse_relation[:Comment] == ""
103
- "belongs_to #{h.name}"
104
- else
105
- "#{reverse_relation[:Comment]} : belongs_to #{h.name}"
106
- end
107
- else
108
- result[:Relations] << if (::Rails.application.config.active_record.belongs_to_required_by_default && h.options[:optional]) || (!::Rails.application.config.active_record.belongs_to_required_by_default && !h.options[:requried])
109
- {
110
- LeftModelName: model[:ModelName],
111
- LeftValue: "}o",
112
- RightModelName: h.options[:class_name],
113
- RightValue: "o|",
114
- Comment: "belongs_to #{h.name}"
115
- }
116
- else
117
- {
118
- LeftModelName: model[:ModelName],
119
- LeftValue: "}o",
120
- RightModelName: h.options[:class_name],
121
- RightValue: "||",
122
- Comment: "belongs_to #{h.name}"
123
- }
124
- end
125
- end
126
- else
127
- reverse_relation = result[:Relations].find { |r| r[:RightModelName] == model[:ModelName] && r[:LeftModelName] == h.name.to_s.classify }
128
-
129
- if reverse_relation
130
- if (::Rails.application.config.active_record.belongs_to_required_by_default && h.options[:optional]) || (!::Rails.application.config.active_record.belongs_to_required_by_default && !h.options[:requried])
131
- reverse_relation[:LeftValue] = "|o"
132
- end
133
- else
134
- result[:Relations] << if (::Rails.application.config.active_record.belongs_to_required_by_default && h.options[:optional]) || (!::Rails.application.config.active_record.belongs_to_required_by_default && !h.options[:requried])
135
- {
136
- LeftModelName: model[:ModelName],
137
- LeftValue: "}o",
138
- RightModelName: h.name.to_s.classify,
139
- RightValue: "o|",
140
- Comment: ""
141
- }
142
- else
143
- {
144
- LeftModelName: model[:ModelName],
145
- LeftValue: "}o",
146
- RightModelName: h.name.to_s.classify,
147
- RightValue: "||",
148
- Comment: ""
149
- }
150
- end
151
- end
152
- end
153
- end
154
-
155
- defined_model.reflect_on_all_associations(:has_one).each do |h|
156
- if h.options[:class_name]
157
- reverse_relation = result[:Relations].find { |r| r[:RightModelName] == model[:ModelName] && r[:LeftModelName] == h.options[:class_name] }
158
- if reverse_relation
159
- reverse_relation[:LeftValue] = "|o"
160
- reverse_relation[:Comment] = if reverse_relation[:Comment] == ""
161
- "has_one #{h.name}"
162
- else
163
- "#{reverse_relation[:Comment]} : has_one #{h.name}"
164
- end
165
-
166
- if h.options[:through]
167
- next
168
- end
169
- else
170
- result[:Relations] << {
171
- LeftModelName: model[:ModelName],
172
- LeftValue: "||",
173
- RightModelName: h.options[:class_name],
174
- RightValue: "o|",
175
- Comment: "has_one #{h.name}"
176
- }
177
- end
178
- else
179
- reverse_relation = result[:Relations].find { |r| r[:RightModelName] == model[:ModelName] && r[:LeftModelName] == h.name.to_s.classify }
180
- if reverse_relation
181
- reverse_relation[:LeftValue] = "|o"
182
- if h.options[:through]
183
- next
184
- end
185
- else
186
- result[:Relations] << {
187
- LeftModelName: model[:ModelName],
188
- LeftValue: "||",
189
- RightModelName: h.name.to_s.classify,
190
- RightValue: "o|",
191
- Comment: "has_one #{h.name}"
192
- }
193
- end
194
- end
195
- end
196
- end
20
+ result = RailsMermaidErd::Builder.model_data
197
21
 
198
22
  version = VERSION
199
23
  app_name = ::Rails.application.class.try(:parent_name) || ::Rails.application.class.try(:module_parent_name)
@@ -422,7 +422,7 @@
422
422
  });
423
423
 
424
424
  filteredData.value.Relations.forEach(relation => {
425
- lines.push(` ${relation.LeftModelName.replace(/:/g, '-')} ${relation.LeftValue}--${relation.RightValue} ${relation.RightModelName.replace(/:/g, '-')} : "${relation.Comment}"`)
425
+ lines.push(` ${relation.LeftModelName.replace(/:/g, '-')} ${relation.LeftValue}${relation.Line}${relation.RightValue} ${relation.RightModelName.replace(/:/g, '-')} : "${relation.Comment}"`)
426
426
  });
427
427
 
428
428
  return lines.join("\n")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-mermaid_erd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - 肥溜め
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-10-10 00:00:00.000000000 Z
12
+ date: 2022-10-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -53,6 +53,20 @@ dependencies:
53
53
  - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: simplecov
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
56
70
  - !ruby/object:Gem::Dependency
57
71
  name: standard
58
72
  requirement: !ruby/object:Gem::Requirement
@@ -92,6 +106,7 @@ files:
92
106
  - Rakefile
93
107
  - lib/assets/logo.svg
94
108
  - lib/rails-mermaid_erd.rb
109
+ - lib/rails-mermaid_erd/builder.rb
95
110
  - lib/rails-mermaid_erd/configuration.rb
96
111
  - lib/rails-mermaid_erd/version.rb
97
112
  - lib/templates/index.html.erb