erd 0.5.0 → 0.6.0

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.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/README.rdoc +1 -1
  3. data/app/assets/javascripts/erd/application.js +0 -2
  4. data/app/assets/javascripts/erd/erd.js.js +420 -0
  5. data/app/assets/stylesheets/erd/application.css +0 -1
  6. data/app/controllers/erd/erd_controller.rb +1 -1
  7. data/app/views/layouts/erd/application.html.erb +3 -0
  8. data/erd.gemspec +0 -2
  9. data/gemfiles/rails_edge.gemfile +2 -1
  10. data/lib/erd/version.rb +1 -1
  11. data/test/test_helper.rb +0 -1
  12. metadata +4 -49
  13. data/app/assets/javascripts/erd/erd.js.coffee +0 -345
  14. data/vendor/assets/images/erd/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  15. data/vendor/assets/images/erd/ui-bg_flat_75_ffffff_40x100.png +0 -0
  16. data/vendor/assets/images/erd/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  17. data/vendor/assets/images/erd/ui-bg_glass_65_ffffff_1x400.png +0 -0
  18. data/vendor/assets/images/erd/ui-bg_glass_75_dadada_1x400.png +0 -0
  19. data/vendor/assets/images/erd/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  20. data/vendor/assets/images/erd/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  21. data/vendor/assets/images/erd/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  22. data/vendor/assets/images/erd/ui-icons_222222_256x240.png +0 -0
  23. data/vendor/assets/images/erd/ui-icons_2e83ff_256x240.png +0 -0
  24. data/vendor/assets/images/erd/ui-icons_454545_256x240.png +0 -0
  25. data/vendor/assets/images/erd/ui-icons_888888_256x240.png +0 -0
  26. data/vendor/assets/images/erd/ui-icons_cd0a0a_256x240.png +0 -0
  27. data/vendor/assets/javascripts/jquery-ui.min.js +0 -12
  28. data/vendor/assets/stylesheets/jquery-ui.css +0 -1188
  29. data/vendor/assets/stylesheets/jquery.ui.dialog.css +0 -69
@@ -88,7 +88,7 @@ module Erd
88
88
  model_name = node_name.dup
89
89
  model_name[0] = model_name[-1] = '' if (model_name.first == '"') && (model_name.last == '"')
90
90
  model_name = model_name.sub(/^m_/, '')
91
- next if model_name == 'ActiveRecord::SchemaMigration'
91
+ next if model_name.in? ['ActiveRecord::SchemaMigration', 'ActiveRecord::InternalMetadata']
92
92
  columns = []
93
93
  if (cols_table = label_doc.search('table')[1])
94
94
  columns = cols_table.search('tr > td').map {|col| col_name, col_type = col.text.split(' '); {:name => col_name, :type => col_type}}
@@ -4,6 +4,9 @@
4
4
  <meta charset='utf-8'>
5
5
  <title>ERD - <%= Rails.application.class.parent.name %></title>
6
6
  <%= stylesheet_link_tag 'erd/application', :media => 'all' %>
7
+ <%= stylesheet_link_tag 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css', :media => 'all' %>
8
+ <%= javascript_include_tag 'https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js' %>
9
+ <%= javascript_include_tag 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js' %>
7
10
  <%= javascript_include_tag 'erd/application' %>
8
11
  <%= csrf_meta_tags %>
9
12
  </head>
@@ -23,8 +23,6 @@ Gem::Specification.new do |gem|
23
23
 
24
24
  gem.add_development_dependency 'rails', '>= 3.2'
25
25
  gem.add_development_dependency 'sass-rails'
26
- gem.add_development_dependency 'jquery-rails'
27
- gem.add_development_dependency 'coffee-rails'
28
26
  gem.add_development_dependency 'rake'
29
27
  gem.add_development_dependency 'test-unit-rails'
30
28
  gem.add_development_dependency 'capybara', '>= 2'
@@ -4,4 +4,5 @@ source 'https://rubygems.org'
4
4
 
5
5
  gemspec :path => '../'
6
6
 
7
- gem 'rails', github: 'rails/rails'
7
+ gem 'rails', git: 'https://github.com/rails/rails'
8
+ gem 'puma'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Erd
4
- VERSION = '0.5.0'
4
+ VERSION = '0.6.0'
5
5
  end
@@ -7,7 +7,6 @@ ENV['RAILS_ENV'] = 'development'
7
7
 
8
8
  # load Rails first
9
9
  require 'rails'
10
- require 'jquery-rails'
11
10
  require 'erd'
12
11
  require 'fake_app/fake_app'
13
12
  require 'test/unit/rails/test_help'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: erd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Akira Matsuda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-12 00:00:00.000000000 Z
11
+ date: 2019-01-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails-erd
@@ -66,34 +66,6 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: jquery-rails
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: coffee-rails
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
69
  - !ruby/object:Gem::Dependency
98
70
  name: rake
99
71
  requirement: !ruby/object:Gem::Requirement
@@ -192,7 +164,7 @@ files:
192
164
  - README.rdoc
193
165
  - Rakefile
194
166
  - app/assets/javascripts/erd/application.js
195
- - app/assets/javascripts/erd/erd.js.coffee
167
+ - app/assets/javascripts/erd/erd.js.js
196
168
  - app/assets/stylesheets/erd/application.css
197
169
  - app/assets/stylesheets/erd/erd.css.scss
198
170
  - app/controllers/erd/application_controller.rb
@@ -235,23 +207,7 @@ files:
235
207
  - vendor/assets/images/erd/background.png
236
208
  - vendor/assets/images/erd/cancel.png
237
209
  - vendor/assets/images/erd/close.png
238
- - vendor/assets/images/erd/ui-bg_flat_0_aaaaaa_40x100.png
239
- - vendor/assets/images/erd/ui-bg_flat_75_ffffff_40x100.png
240
- - vendor/assets/images/erd/ui-bg_glass_55_fbf9ee_1x400.png
241
- - vendor/assets/images/erd/ui-bg_glass_65_ffffff_1x400.png
242
- - vendor/assets/images/erd/ui-bg_glass_75_dadada_1x400.png
243
- - vendor/assets/images/erd/ui-bg_glass_75_e6e6e6_1x400.png
244
- - vendor/assets/images/erd/ui-bg_glass_95_fef1ec_1x400.png
245
- - vendor/assets/images/erd/ui-bg_highlight-soft_75_cccccc_1x100.png
246
- - vendor/assets/images/erd/ui-icons_222222_256x240.png
247
- - vendor/assets/images/erd/ui-icons_2e83ff_256x240.png
248
- - vendor/assets/images/erd/ui-icons_454545_256x240.png
249
- - vendor/assets/images/erd/ui-icons_888888_256x240.png
250
- - vendor/assets/images/erd/ui-icons_cd0a0a_256x240.png
251
- - vendor/assets/javascripts/jquery-ui.min.js
252
210
  - vendor/assets/javascripts/raphael-min.js
253
- - vendor/assets/stylesheets/jquery-ui.css
254
- - vendor/assets/stylesheets/jquery.ui.dialog.css
255
211
  homepage: https://github.com/amatsuda/erd
256
212
  licenses:
257
213
  - MIT
@@ -271,8 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
271
227
  - !ruby/object:Gem::Version
272
228
  version: '0'
273
229
  requirements: []
274
- rubyforge_project:
275
- rubygems_version: 2.7.6
230
+ rubygems_version: 3.0.1
276
231
  signing_key:
277
232
  specification_version: 4
278
233
  summary: erd engine on Rails
@@ -1,345 +0,0 @@
1
- class ERD
2
- constructor: (@name, @elem, @edges) ->
3
- @paper = Raphael(@name, @elem.data('svg_width'), @elem.data('svg_height'))
4
- @setup_handlers()
5
- models = @elem.find('.model')
6
- @models = {}
7
- for model in models
8
- @models[$(model).data('model_name')] = model
9
- @connect_arrows(@edges)
10
-
11
- upsert_change: (action, model, column, from, to) ->
12
- rows = ($(tr).find('td') for tr in $('#changes > tbody > tr'))
13
- existing = null
14
- $(rows).each (i, row) ->
15
- existing = row if (action == $(row[0]).html()) && (model == $(row[1]).html()) && (column == $(row[2]).html())
16
- if existing == null
17
- $('#changes > tbody').append("""
18
- <tr>
19
- <td data-name="action">#{action}</td>
20
- <td data-name="model">#{model}</td>
21
- <td data-name="column">#{column}</td>
22
- <td data-name="from">#{from}</td>
23
- <td data-name="to">#{to}</td>
24
- </tr>
25
- """)
26
- else
27
- $(existing[3]).text(from)
28
- $(existing[4]).text(to)
29
- $('#changes').show()
30
-
31
- positions: (div) ->
32
- [left, width, top, height] = [parseFloat(div.css('left')), parseFloat(div.css('width')), parseFloat(div.css('top')), parseFloat(div.css('height'))]
33
- {left: left, right: left + width, top: top, bottom: top + height, center: {x: (left + left + width) / 2, y: (top + top + height) / 2}, vertex: {}}
34
-
35
- connect_arrows: (edges) =>
36
- $.each edges, (i, edge) =>
37
- @connect_arrow edge, $(@models[edge.from]), $(@models[edge.to])
38
-
39
- connect_arrow: (edge, from_elem, to_elem) ->
40
- #TODO handle self referential associations
41
- return if from_elem.attr('id') == to_elem.attr('id')
42
-
43
- edge.path.remove() if edge.path?
44
-
45
- from = @positions(from_elem)
46
- to = @positions(to_elem)
47
- #FIXME terrible code
48
- a = (to.center.y - from.center.y) / (to.center.x - from.center.x)
49
- b = from.center.y - from.center.x * a
50
-
51
- x2y = (x) -> ( a * x + b )
52
- y2x = (y) -> ( (y - b) / a )
53
-
54
- if from.center.x > to.center.x
55
- [from.vertex.x, from.vertex.y] = [from.left, x2y(from.left)]
56
- [to.vertex.x, to.vertex.y] = [to.right, x2y(to.right)]
57
- else
58
- [from.vertex.x, from.vertex.y] = [from.right, x2y(from.right)]
59
- [to.vertex.x, to.vertex.y] = [to.left, x2y(to.left)]
60
- for rect in [from, to]
61
- if rect.vertex.y < rect.top
62
- [rect.vertex.x, rect.vertex.y, rect.vertex.direction] = [y2x(rect.top), rect.top, 'v']
63
- else if rect.vertex.y > rect.bottom
64
- [rect.vertex.x, rect.vertex.y, rect.vertex.direction] = [y2x(rect.bottom), rect.bottom, 'v']
65
- else
66
- from.vertex.direction = 'h'
67
-
68
- if from.vertex.direction == 'h'
69
- path = "M#{Math.floor(from.vertex.x)} #{Math.floor(from.vertex.y)}H#{Math.floor((from.vertex.x + to.vertex.x) / 2)} V#{Math.floor(to.vertex.y)} H#{Math.floor(to.vertex.x)}"
70
- else
71
- path = "M#{Math.floor(from.vertex.x)} #{Math.floor(from.vertex.y)}V#{Math.floor((from.vertex.y + to.vertex.y) / 2)} H#{Math.floor(to.vertex.x)} V#{Math.floor(to.vertex.y)}"
72
-
73
- edge.path = @paper.path(path).attr({'stroke-width': 2, opacity: 0.5, 'arrow-end': 'classic-wide-long'})
74
-
75
- setup_handlers: ->
76
- @setup_click_handlers()
77
- @setup_submit_handlers()
78
- @setup_migration_event_handlers()
79
- $('div.model').draggable(drag: @handle_drag)
80
-
81
- handle_drag: (ev, ui) =>
82
- target = $(ev.target)
83
- target.addClass('noclick')
84
- model_name = target.data('model_name')
85
- from = target.data('original_position')
86
- to = [target.css('left').replace(/px$/, ''), target.css('top').replace(/px$/, '')].join()
87
- @upsert_change 'move', model_name, '', '', to
88
- @connect_arrows(@edges.filter((e)-> e.from == model_name || e.to == model_name))
89
-
90
- setup_click_handlers: ->
91
- $('div.model_name_text, span.column_name_text, span.column_type_text').on 'click', @handle_text_elem_click
92
- $('div.model a.add_column').on 'click', @handle_add_column_click
93
- $('div.model a.cancel').on 'click', @handle_cancel_click
94
- $('div.model a.close').on 'click', @handle_remove_model_click
95
- $('#new_model_add_column').on 'click', @handle_new_model_add_column_click
96
- $('div.model a.cancel').on 'click', @handle_cancel_click
97
- $('div#open_migration').on 'click', @handle_open_migration_click
98
- $('div#close_migration').on 'click', @handle_close_migration_click
99
-
100
- setup_submit_handlers: ->
101
- $('form.rename_model_form').on 'submit', @handle_rename_model
102
- $('form.rename_column_form').on 'submit', @handle_rename_column
103
- $('form.alter_column_form').on 'submit', @handle_change_column_type
104
- $('form.add_column_form').on 'submit', @handle_add_column
105
- $('#changes_form').on 'submit', @handle_save
106
-
107
- setup_migration_event_handlers: ->
108
- $('#migration_status tr input').on 'click', ->
109
- $(this).parents('tr').toggleClass('active')
110
- $('#migration_status thead td button').on 'click', (ev) ->
111
- ev.preventDefault()
112
- $('#migration_status').toggleClass('show_all_migrations')
113
-
114
- handle_save: (ev) =>
115
- changes = $('#changes > tbody > tr').map(->
116
- change = {}
117
- $(this).find('td').each ->
118
- name = $(this).data('name')
119
- value = $(this).html()
120
- change[name] = value
121
- change
122
- ).toArray()
123
- $('#changes_form').find('input[name=changes]').val(JSON.stringify(changes))
124
-
125
- handle_add_column: (ev) =>
126
- ev.preventDefault()
127
- target = $(ev.target)
128
- name = target.find('input[name=name]').val()
129
- return if name == ''
130
-
131
- model = target.find('input[name=model]').val()
132
- type = target.find('input[name=type]').val()
133
- @upsert_change 'add_column', model, "#{name}(#{type})", '', ''
134
-
135
- name_span = $("<span/>", class: 'column_name_text')
136
- .append(name)
137
-
138
- type_span = $("<span/>", class: 'column_type_text unsaved')
139
- .append(type)
140
-
141
- li_node = $("<li/>", class: 'column unsaved').append(name_span).append("&nbsp;").append(type_span)
142
-
143
- target.hide()
144
- .parent()
145
- .siblings('.columns')
146
- .find('ul').append(li_node).end()
147
- .end()
148
- .find('a.add_column').show()
149
-
150
- handle_change_column_type: (ev) =>
151
- ev.preventDefault()
152
- target = $(ev.target)
153
- to = target.find('input[name=to]').val()
154
- return if to == ''
155
-
156
- model = target.find('input[name=model]').val()
157
- column = target.find('input[name=column]').val()
158
- type = target.find('input[name=type]').val()
159
- if to != type
160
- @upsert_change 'alter_column', model, column, type, to
161
-
162
- target.hide()
163
- .siblings('.column_type_text').text(to).show().addClass('unsaved')
164
- .parents('.column').addClass('unsaved')
165
-
166
- handle_rename_column: (ev) =>
167
- ev.preventDefault()
168
- target = $(ev.target)
169
- to = target.find('input[name=to]').val()
170
- return if to == ''
171
-
172
- model = target.find('input[name=model]').val()
173
- column = target.find('input[name=column]').val()
174
- if to != column
175
- @upsert_change 'rename_column', model, column, column, to
176
-
177
- target.hide()
178
- .siblings('.column_name_text').text(to).show()
179
- .parents('.column').addClass('unsaved')
180
-
181
- handle_rename_model: (ev) =>
182
- ev.preventDefault()
183
- target = $(ev.target)
184
- to = target.find('input[name=to]').val()
185
- return if to == ''
186
-
187
- model = target.find('input[name=model]').val()
188
- if to != model
189
- @upsert_change 'rename_model', model, '', model, to
190
-
191
- target.hide()
192
- .siblings('.model_name_text').text(to).show().addClass('unsaved')
193
-
194
- handle_add_column_click: (ev) =>
195
- ev.preventDefault()
196
- target = $(ev.currentTarget)
197
-
198
- m = target.parents('div.model')
199
- if m.hasClass('noclick')
200
- m.removeClass('noclick')
201
- return false
202
-
203
- target.hide()
204
- .next('form').show()
205
- .find('a.cancel').show().end()
206
- .find('input[name=type]').val('string').end()
207
- .find('input[name=name]').val('').focus()
208
-
209
- handle_cancel_click: (ev) =>
210
- ev.preventDefault()
211
- target = $(ev.currentTarget)
212
-
213
- m = target.parents('div.model')
214
- if m.hasClass('noclick')
215
- m.removeClass('noclick')
216
- return false
217
-
218
- target.hide()
219
- .parent('form').hide()
220
- .prev('a.add_column, span, div').show()
221
-
222
-
223
- handle_text_elem_click: (ev) =>
224
- target = $(ev.currentTarget)
225
- text = target.text()
226
-
227
- m = target.parents('div.model')
228
- if m.hasClass('noclick')
229
- m.removeClass('noclick')
230
- return false
231
-
232
- target.hide()
233
- .next('form').show()
234
- .find('a.cancel').show().end()
235
- .find('input[name=to]').val(text).focus()
236
-
237
- handle_remove_model_click: (ev) =>
238
- ev.preventDefault()
239
-
240
- target = $(ev.target)
241
- parent = target.parent()
242
-
243
- m = target.parents('div.model')
244
- if m.hasClass('noclick')
245
- m.removeClass('noclick')
246
- return false
247
-
248
- return unless confirm('remove this table?')
249
-
250
- model_name = m.data('model_name')
251
- window.erd.upsert_change 'remove_model', model_name, '', '', ''
252
- parent.hide()
253
-
254
- $.each @edges, (i, edge) =>
255
- @edges.splice i, 1 if (edge.from == model_name) || (edge.to == model_name)
256
- @paper.clear()
257
- @connect_arrows(@edges)
258
-
259
- handle_new_model_add_column_click: (ev) =>
260
- ev.preventDefault()
261
- target = $(ev.currentTarget)
262
-
263
- target.parent().siblings('table').append('<tr><td><input type="text" /></td><td class="separator">:</td><td><input type="text" value="string" /></td></tr>').find('tr:last > td > input:first').focus()
264
-
265
-
266
- handle_open_migration_click: (ev) =>
267
- ev.preventDefault()
268
-
269
- target = $(ev.currentTarget)
270
- text = target.text()
271
-
272
- m = target.parents('div.model')
273
- if m.hasClass('noclick')
274
- m.removeClass('noclick')
275
- return false
276
-
277
- target.hide()
278
- .next('div').show()
279
- .find('#close_migration').show()
280
-
281
-
282
- handle_close_migration_click: (ev) =>
283
- ev.preventDefault()
284
-
285
- target = $(ev.currentTarget)
286
- text = target.text()
287
-
288
- m = target.parents('div.model')
289
- if m.hasClass('noclick')
290
- m.removeClass('noclick')
291
- return false
292
-
293
- target.hide()
294
- .parent().hide()
295
- .prev('div').show()
296
-
297
- $ ->
298
- window.erd = new ERD('erd', $('#erd'), window.raw_edges)
299
-
300
- $('#erd').css('height', window.innerHeight)
301
- $(window).on 'resize', ->
302
- $('#erd').css('height', window.innerHeight)
303
-
304
- $("#open_migration").click ->
305
- $('#close_migration, #open_create_model_dialog').css('right', $('#migration').width() + ($(this).width() / 2) - 5)
306
-
307
- $("#close_migration").click ->
308
- $('#open_create_model_dialog').css('right', 15)
309
-
310
- $('#open_up').click ->
311
- $('#migration_status .up').addClass('open')
312
- $('#migration_status .down').removeClass('open')
313
-
314
- $('#open_down').click ->
315
- $('#migration_status .down').addClass('open')
316
- $('#migration_status .up').removeClass('open')
317
-
318
- $('#close_all').click ->
319
- $('#migration_status tr').removeClass('open')
320
-
321
- $('#create_model_form').dialog
322
- autoOpen: false,
323
- height: 450,
324
- width: 450,
325
- modal: true,
326
- buttons:
327
- 'Create Model': ->
328
- model = $('#new_model_name').val()
329
- columns = ''
330
- $('#create_model_table > tbody > tr').each (i, row) ->
331
- [name, type] = ($(v).val() for v in $(row).find('input'))
332
- columns += "#{name}#{if type then ":#{type}" else ''} " if name
333
- window.erd.upsert_change 'create_model', model, columns, '', ''
334
- $(this).find('table > tbody > tr').each (i, row) ->
335
- row.remove() if i >= 1
336
- $(this).find('input').val('')
337
- $(this).find('input[name=new_model_column_type_1]').val('string')
338
-
339
- $(this).dialog('close')
340
- Cancel: ->
341
- $(this).dialog('close')
342
-
343
- $('#open_create_model_dialog').click (ev) ->
344
- ev.preventDefault()
345
- $('#create_model_form').dialog('open')