rails-erd-d3 0.0.12 → 0.0.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rails_erd_d3.rb +164 -164
- data/rails-erd-d3.gemspec +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e07338bbac0f646951bf6f14f7b4d9d2a4dee8c1
|
4
|
+
data.tar.gz: efe46195b3ec4e8fecd73f704a7ef1194b3c3388
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e7feb8b0498280ea803f1e1e468de41acbbfb9e940e120cb2f0570c503105603d0b04cecc008eb635c92b1b19024d756116208aca972c28261f0b8545a8c095
|
7
|
+
data.tar.gz: 0cc61d77cc74c3afcec681aa91db623a091995fdb246b9410decfb10b29de13e458ba786938935faa0d8824caf09dbd06a395ea21b317a6048ab23833a9f9894
|
data/lib/rails_erd_d3.rb
CHANGED
@@ -29,12 +29,10 @@ class RailsErdD3
|
|
29
29
|
nodes = []
|
30
30
|
links = []
|
31
31
|
@@models.each do |model|
|
32
|
-
|
33
|
-
|
34
|
-
nodes << { label: name, r: 30 }
|
32
|
+
nodes << { label: model.name.capitalize, r: 30 }
|
35
33
|
model.reflections.keys.each do |key|
|
36
34
|
links << {
|
37
|
-
source: models_list[
|
35
|
+
source: models_list[model.model_name.plural.capitalize],
|
38
36
|
target: models_list[key.pluralize.capitalize]
|
39
37
|
}
|
40
38
|
end
|
@@ -48,176 +46,179 @@ class RailsErdD3
|
|
48
46
|
Rails.application.eager_load!
|
49
47
|
|
50
48
|
file = File.new("erd.html", "w")
|
51
|
-
file.
|
52
|
-
<!DOCTYPE HTML>
|
53
|
-
<html>
|
54
|
-
#{get_head}
|
55
|
-
<body>
|
56
|
-
#{get_nav}
|
57
|
-
<div id='erd'>
|
58
|
-
</div>
|
59
|
-
#{get_d3}
|
60
|
-
#{get_modals}
|
61
|
-
</body>
|
62
|
-
</html>
|
63
|
-
|
49
|
+
file.write(
|
50
|
+
"<!DOCTYPE HTML>"\
|
51
|
+
"<html>"\
|
52
|
+
"#{get_head}"\
|
53
|
+
"<body>"\
|
54
|
+
"#{get_nav}"\
|
55
|
+
"<div id='erd'>"\
|
56
|
+
"</div>"\
|
57
|
+
"#{get_d3}"\
|
58
|
+
"#{get_modals}"\
|
59
|
+
"</body>"\
|
60
|
+
"</html>"
|
61
|
+
)
|
64
62
|
file.close
|
65
63
|
|
66
|
-
|
64
|
+
"File erd.html was successfully created!"
|
67
65
|
end
|
68
66
|
|
69
67
|
private
|
70
68
|
|
71
69
|
def self.get_head
|
72
|
-
"
|
73
|
-
|
74
|
-
<
|
75
|
-
<
|
76
|
-
<script
|
77
|
-
<script src='https://
|
78
|
-
<
|
79
|
-
|
80
|
-
</head>
|
81
|
-
"
|
70
|
+
"<head>"\
|
71
|
+
"<title>ERD</title>"\
|
72
|
+
"<meta charset='utf-8'>"\
|
73
|
+
"<script src='https://code.jquery.com/jquery-3.1.1.min.js' integrity='sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=' crossorigin='anonymous'></script>"\
|
74
|
+
"<script src='https://cdnjs.cloudflare.com/ajax/libs/d3/4.3.0/d3.min.js'></script>"\
|
75
|
+
"<script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js' integrity='sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa' crossorigin='anonymous'></script>"\
|
76
|
+
"<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css' integrity='sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u' crossorigin='anonymous'>"\
|
77
|
+
"</head>"
|
82
78
|
end
|
83
79
|
|
84
80
|
def self.get_nav
|
85
|
-
"
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
81
|
+
"<nav class='navbar navbar-default' style='background-color: #337ab7;'>"
|
82
|
+
"<div class='container'>"\
|
83
|
+
"<div class='navbar-header'>"\
|
84
|
+
"<div class='navbar-brand'>"\
|
85
|
+
"<a href='https://github.com/RomanKrasavtsev/rails-erd-d3' target='_blank' style='color: white;'>"\
|
86
|
+
"Rails-ERD-D3"\
|
87
|
+
"</a>"\
|
88
|
+
"</div>"\
|
89
|
+
"</div>"\
|
90
|
+
"<div class='collapse navbar-collapse'>"\
|
91
|
+
"<ul class='nav navbar-nav navbar-right'>"\
|
92
|
+
"<li>"\
|
93
|
+
"<a href='https://github.com/romankrasavtsev' target='_blank' style='color: white;'>"\
|
94
|
+
"© 2016 Roman Krasavtsev"\
|
95
|
+
"</a>"\
|
96
|
+
"</li>"\
|
97
|
+
"</ul>"\
|
98
|
+
"</div>"\
|
99
|
+
"</div>"\
|
100
|
+
"</nav>"
|
98
101
|
end
|
99
102
|
|
100
103
|
def self.get_d3
|
101
|
-
"
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
104
|
+
"<script>
|
105
|
+
var data = #{get_data};
|
106
|
+
|
107
|
+
var width = window.innerWidth
|
108
|
+
|| document.documentElement.clientWidth
|
109
|
+
|| document.body.clientWidth;
|
110
|
+
var height = window.innerHeight
|
111
|
+
|| document.documentElement.clientHeight
|
112
|
+
|| document.body.clientHeight;
|
113
|
+
|
114
|
+
var colorScale = d3.scaleOrdinal(d3.schemeCategory20);
|
115
|
+
|
116
|
+
var svg = d3.select('#erd').append('svg')
|
117
|
+
.attr('height', height)
|
118
|
+
.attr('width', width)
|
119
|
+
.style('background', 'white');
|
120
|
+
|
121
|
+
var simulation = d3.forceSimulation()
|
122
|
+
.force('link', d3.forceLink().id(function(d) { return d.index }))
|
123
|
+
.force('collide',d3.forceCollide( function(d){return d.r + 20 }).iterations(30) )
|
124
|
+
.force('charge', d3.forceManyBody())
|
125
|
+
.force('center', d3.forceCenter(width / 2, height / 2))
|
126
|
+
.force('y', d3.forceY(0))
|
127
|
+
.force('x', d3.forceX(0));
|
128
|
+
|
129
|
+
var link = svg.append('g')
|
130
|
+
.classed('links', true)
|
131
|
+
.selectAll('line')
|
132
|
+
.data(data.links)
|
133
|
+
.enter()
|
134
|
+
.append('line')
|
135
|
+
.attr('stroke', 'black');
|
136
|
+
|
137
|
+
var node = svg.selectAll('.node')
|
138
|
+
.data(data.nodes)
|
139
|
+
.enter()
|
140
|
+
.append('g')
|
141
|
+
.classed('node', true)
|
142
|
+
.style('cursor', 'pointer')
|
143
|
+
.attr('data-toggle', 'modal')
|
144
|
+
.attr('data-target', function(d, i){ return '#' + data.nodes[i].label })
|
145
|
+
.call(d3.drag()
|
146
|
+
.on('start', dragstarted)
|
147
|
+
.on('drag', dragged)
|
148
|
+
.on('end', dragended));
|
149
|
+
|
150
|
+
node.append('circle')
|
151
|
+
.classed('circle', true)
|
152
|
+
.attr('r', function(d){ return d.r })
|
153
|
+
.attr('fill', function(d, i){ return colorScale(i) });
|
154
|
+
|
155
|
+
node.append('text')
|
156
|
+
.classed('text', true)
|
157
|
+
.text(function(d) {
|
158
|
+
return d.label;
|
159
|
+
});
|
160
|
+
|
161
|
+
var ticked = function() {
|
162
|
+
link
|
163
|
+
.attr('x1', function(d) { return d.source.x; })
|
164
|
+
.attr('y1', function(d) { return d.source.y; })
|
165
|
+
.attr('x2', function(d) { return d.target.x; })
|
166
|
+
.attr('y2', function(d) { return d.target.y; });
|
167
|
+
|
168
|
+
node
|
169
|
+
.attr('transform', function(d) {
|
170
|
+
return 'translate(' + [d.x, d.y] + ')';
|
157
171
|
});
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
function dragged(d) {
|
185
|
-
d.fx = d3.event.x;
|
186
|
-
d.fy = d3.event.y;
|
187
|
-
}
|
188
|
-
|
189
|
-
function dragended(d) {
|
190
|
-
if (!d3.event.active) simulation.alphaTarget(0);
|
191
|
-
d.fx = null;
|
192
|
-
d.fy = null;
|
193
|
-
}
|
194
|
-
</script>
|
195
|
-
"
|
172
|
+
}
|
173
|
+
|
174
|
+
simulation.nodes(data.nodes)
|
175
|
+
.on('tick', ticked);
|
176
|
+
|
177
|
+
simulation.force('link')
|
178
|
+
.links(data.links);
|
179
|
+
|
180
|
+
function dragstarted(d) {
|
181
|
+
if (!d3.event.active) simulation.alphaTarget(0.3).restart();
|
182
|
+
d.fx = d.x;
|
183
|
+
d.fy = d.y;
|
184
|
+
}
|
185
|
+
|
186
|
+
function dragged(d) {
|
187
|
+
d.fx = d3.event.x;
|
188
|
+
d.fy = d3.event.y;
|
189
|
+
}
|
190
|
+
|
191
|
+
function dragended(d) {
|
192
|
+
if (!d3.event.active) simulation.alphaTarget(0);
|
193
|
+
d.fx = null;
|
194
|
+
d.fy = null;
|
195
|
+
}
|
196
|
+
</script>
|
197
|
+
"
|
196
198
|
end
|
197
199
|
|
198
200
|
def self.get_modals
|
199
201
|
modals = ""
|
200
202
|
@@models.each do |model|
|
201
203
|
name = model.model_name.plural.capitalize
|
202
|
-
modals += "
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
<tbody>"
|
204
|
+
modals += "<div class='modal fade' id='#{name}' tabindex='-1' role='dialog'>"\
|
205
|
+
"<div class='modal-dialog' role='document'>"\
|
206
|
+
"<div class='modal-content'>"\
|
207
|
+
"<div class='modal-header'>"\
|
208
|
+
"<button type='button' class='close' data-dismiss='modal' aria-label='Close'><span aria-hidden='true'>×</span></button>"\
|
209
|
+
"<h4 class='modal-title'>#{name}</h4>"\
|
210
|
+
"</div>"\
|
211
|
+
"<div class='modal-body'>"\
|
212
|
+
"<table class='table table-hover'>"\
|
213
|
+
"<thead>"\
|
214
|
+
"<tr>"\
|
215
|
+
"<th>#</th>"\
|
216
|
+
"<th>name</th>"\
|
217
|
+
"<th>macro</th>"\
|
218
|
+
"<th>foreign_key</th>"\
|
219
|
+
"</tr>"\
|
220
|
+
"</thead>"\
|
221
|
+
"<tbody>"
|
221
222
|
|
222
223
|
model.reflections.each_with_index do |r, index|
|
223
224
|
name = r[0]
|
@@ -229,16 +230,15 @@ class RailsErdD3
|
|
229
230
|
"</tr>"
|
230
231
|
end
|
231
232
|
|
232
|
-
modals += "
|
233
|
-
</
|
234
|
-
</
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
</div>
|
239
|
-
</div>
|
240
|
-
</div>
|
241
|
-
</div>"
|
233
|
+
modals += "</tbody>"
|
234
|
+
"</table>"\
|
235
|
+
"</div>"\
|
236
|
+
"<div class='modal-footer'>"\
|
237
|
+
"<button type='button' class='btn btn-default' data-dismiss='modal'>Close</button>"\
|
238
|
+
"</div>"\
|
239
|
+
"</div>"\
|
240
|
+
"</div>"\
|
241
|
+
"</div>"
|
242
242
|
end
|
243
243
|
|
244
244
|
modals
|
data/rails-erd-d3.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |spec|
|
|
6
6
|
spec.name = "rails-erd-d3"
|
7
7
|
spec.authors = ["Roman Krasavtsev"]
|
8
8
|
spec.email = ["mr.krasavtsev@gmail.com"]
|
9
|
-
spec.version = "0.0.
|
9
|
+
spec.version = "0.0.13"
|
10
10
|
spec.summary = "Entity–relationship diagram with D3.js for Rails application"
|
11
11
|
spec.description = "This gem creates entity–relationship diagram with D3.js for your Rails application"
|
12
12
|
spec.homepage = "https://github.com/RomanKrasavtsev/rails-erd-d3"
|