erd 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -14,4 +14,4 @@ rdoc
14
14
  spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
- tmp
17
+ spec/fake_app/tmp/*.*
data/Rakefile CHANGED
@@ -1,2 +1,10 @@
1
1
  #!/usr/bin/env rake
2
- require "bundler/gem_tasks"
2
+ require 'bundler/gem_tasks'
3
+
4
+ require 'rspec/core'
5
+ require 'rspec/core/rake_task'
6
+
7
+ task :noop do; end
8
+ task :default => :spec
9
+
10
+ RSpec::Core::RakeTask.new(:spec => :noop)
@@ -1,8 +1,20 @@
1
1
  class ERD
2
2
  constructor: (@name, @elem, @edges) ->
3
- @paper = Raphael(name, @elem.css('width'), @elem.css('height'))
3
+ svg_width = @elem.data('svg_width')
4
+ svg_height = @elem.data('svg_height')
5
+ if (svg_width > @elem.width())
6
+ size = @elem.width() / svg_width
7
+ $('#erd > .model').each ->
8
+ left = parseFloat $(this).css('left')
9
+ top = parseFloat $(this).css('top')
10
+ $(this).css({left: left * size, top: top * size})
11
+ @paper = Raphael(name, @elem.width(), svg_height)
4
12
  @setup_handlers()
5
- @connect_arrows()
13
+ models = @elem.find('.model')
14
+ @models = {}
15
+ for model in models
16
+ @models[$(model).data('model_name')] = model
17
+ @connect_arrows(@edges)
6
18
 
7
19
  upsert_change: (action, model, column, from, to) ->
8
20
  rows = ($(tr).find('td') for tr in $('#changes > tbody > tr'))
@@ -28,14 +40,16 @@ class ERD
28
40
  [left, width, top, height] = [parseFloat(div.css('left')), parseFloat(div.css('width')), parseFloat(div.css('top')), parseFloat(div.css('height'))]
29
41
  {left: left, right: left + width, top: top, bottom: top + height, center: {x: (left + left + width) / 2, y: (top + top + height) / 2}, vertex: {}}
30
42
 
31
- connect_arrows: ->
32
- $.each @edges, (i, edge) =>
33
- @connect_arrow $("##{edge.from}"), $("##{edge.to}")
43
+ connect_arrows: (edges) =>
44
+ $.each edges, (i, edge) =>
45
+ @connect_arrow edge, $(@models[edge.from]), $(@models[edge.to])
34
46
 
35
- connect_arrow: (from_elem, to_elem) ->
47
+ connect_arrow: (edge, from_elem, to_elem) ->
36
48
  #TODO handle self referential associations
37
49
  return if from_elem.attr('id') == to_elem.attr('id')
38
50
 
51
+ edge.path.remove() if edge.path?
52
+
39
53
  from = @positions(from_elem)
40
54
  to = @positions(to_elem)
41
55
  #FIXME terrible code
@@ -64,7 +78,7 @@ class ERD
64
78
  else
65
79
  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)}"
66
80
 
67
- @paper.path(path).attr({'stroke-width': 2, opacity: 0.5, 'arrow-end': 'classic-wide-long'})
81
+ edge.path = @paper.path(path).attr({'stroke-width': 2, opacity: 0.5, 'arrow-end': 'classic-wide-long'})
68
82
 
69
83
  setup_handlers: ->
70
84
  @setup_click_handlers()
@@ -74,21 +88,14 @@ class ERD
74
88
  handle_drag: (ev, ui) =>
75
89
  target = $(ev.target)
76
90
  target.addClass('noclick')
77
- model = target.data('model_name')
91
+ model_name = target.data('model_name')
78
92
  from = target.data('original_position')
79
93
  to = [target.css('left').replace(/px$/, ''), target.css('top').replace(/px$/, '')].join()
80
- @upsert_change 'move', model, '', '', to
81
- @paper.clear()
82
- @connect_arrows(@edges)
94
+ @upsert_change 'move', model_name, '', '', to
95
+ @connect_arrows(@edges.filter((e)-> e.from == model_name || e.to == model_name))
83
96
 
84
97
  setup_click_handlers: ->
85
- text_elems = [
86
- 'div.model_name_text',
87
- 'span.column_name_text',
88
- 'span.column_type_text'
89
- ].join()
90
-
91
- $(text_elems).on 'click', @handle_text_elem_click
98
+ $('div.model_name_text, span.column_name_text, span.column_type_text').on 'click', @handle_text_elem_click
92
99
  $('div.model a.add_column').on 'click', @handle_add_column_click
93
100
  $('div.model a.close').on 'click', @handle_remove_model_click
94
101
 
@@ -237,12 +244,12 @@ class ERD
237
244
 
238
245
  return unless confirm('remove this table?')
239
246
 
240
- [model_id, model_name] = [parent.attr('id'), parent.data('model_name')]
247
+ model_name = parent.data('model_name')
241
248
  upsert_change 'remove_model', model_name, '', '', ''
242
249
  parent.hide()
243
250
 
244
251
  $.each @edges, (i, edge) =>
245
- @edges.splice i, 1 if (edge.from == model_id) || (edge.to == model_id)
252
+ @edges.splice i, 1 if (edge.from == model_name) || (edge.to == model_name)
246
253
  @paper.clear()
247
254
  @connect_arrows(@edges)
248
255
 
@@ -1,44 +1,45 @@
1
- * {
1
+ html, body, p, ul, ol, dl, p, li, dt, dd, form {
2
2
  margin: 0;
3
3
  padding: 0;
4
4
  }
5
5
 
6
- body div {
7
- text-align: left;
8
- margin: 0 auto;
9
- }
10
-
11
6
  li {
12
7
  list-style-type: none;
13
8
  }
14
9
 
15
-
16
- label, input { display:block; }
17
- input.text { margin-bottom:0px; width:95%; padding: 0; }
18
- fieldset { padding:0; border:0; margin-top:25px; }
19
- .ui-button { outline: 0; margin:0; padding: .4em 1em .5em; text-decoration:none; cursor:pointer; position: relative; text-align: center; }
20
- .ui-dialog .ui-state-highlight, .ui-dialog .ui-state-error { padding: 0; }
21
-
22
- .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
23
-
10
+ #erd_box {
11
+ display: -webkit-box;
12
+ display: -moz-box;
13
+ display: box;
14
+ }
24
15
  #erd_container {
25
- float: left;
16
+ -webkit-box-flex: 1;
17
+ -moz-box-flex: 1;
18
+ box-flex: 1;
19
+ }
20
+ @mixin table-header {
21
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0.88, #aaa), color-stop(0.00, #eee));
22
+ background: -webkit-linear-gradient(top, #eee 0%, #aaa 88%);
23
+ background: -moz-linear-gradient(top, #eee 0%, #aaa 88%);
24
+ background: -o-linear-gradient(top, #eee 0%, #aaa 88%);
25
+ background: -ms-linear-gradient(top, #eee 0%, #aaa 88%);
26
+ background: linear-gradient(to bottom, #eee 0%, #aaa 88%);
27
+ font-weight: normal;
26
28
  }
27
29
 
28
30
  #migration {
29
- position: relative;
30
- float: right;
31
- z-index: 999;
32
31
 
33
32
  table {
34
33
  td {
35
34
  font-size: small;
36
35
  }
36
+ th {
37
+ @include table-header;
38
+ }
37
39
  }
38
40
  }
39
41
 
40
42
  #erd {
41
- position: absolute;
42
43
 
43
44
  form {
44
45
  * {
@@ -53,7 +54,23 @@ fieldset { padding:0; border:0; margin-top:25px; }
53
54
  cursor: move;
54
55
 
55
56
  a.close {
56
- position:absolute; top:-1px; right:-1px; z-index:5; vertical-align:middle; line-height: 0.5; font-family:Arial, sans-serif; text-decoration:none; font-weight:normal; background-color:#c22; border:2px solid #999; color:#555; display:block; width:10px; height:10px; text-align:center; -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; -moz-box-shadow: 0 0 1px 1px #666;-webkit-box-shadow: 0 0 1px 1px #666;box-shadow: 0 0 1px 1px #666;
57
+ position:absolute;
58
+ top:-6px;
59
+ right:-6px;
60
+ z-index:5;
61
+ vertical-align:middle;
62
+ line-height: 13px;
63
+ font-family:Arial, sans-serif;
64
+ text-decoration:none;
65
+ font-weight:normal;
66
+ background-color:#eee;
67
+ border:1px solid #500;
68
+ color:#500;
69
+ display:block;
70
+ width:16px;
71
+ height:16px;
72
+ text-align:center;
73
+ border-radius: 8px;
57
74
  }
58
75
  div.add_column_box {
59
76
  text-align: center;
@@ -70,6 +87,7 @@ fieldset { padding:0; border:0; margin-top:25px; }
70
87
  margin: 1px 5px 0 5px auto;
71
88
  div.model_name_text {
72
89
  text-align: center;
90
+ @include table-header;
73
91
  }
74
92
  }
75
93
  div.model_name > div.model_name_text:hover {
@@ -132,3 +150,4 @@ table, th, td {
132
150
  border: 1px #000 solid;
133
151
  border-collapse: collapse;
134
152
  }
153
+
@@ -1,11 +1,8 @@
1
- require 'rails/generators'
2
1
  require 'nokogiri'
3
2
  require 'rails_erd/diagram/graphviz'
4
3
  require 'erd/application_controller'
5
4
 
6
5
  module Erd
7
- class MigrationError < StandardError; end
8
-
9
6
  class ErdController < ::Erd::ApplicationController
10
7
  def index
11
8
  Rails.application.eager_load!
@@ -19,18 +16,7 @@ module Erd
19
16
  end
20
17
  @erd = render_plain plain, positions
21
18
 
22
- migrated_versions = ActiveRecord::Base.connection.select_values("SELECT version FROM #{ActiveRecord::Migrator.schema_migrations_table_name}").map {|v| '%.3d' % v}
23
- @migrations = []
24
- ActiveRecord::Migrator.migrations_paths.each do |path|
25
- Dir.foreach(Rails.root.join(path)) do |file|
26
- if (version_and_name = /^(\d{3,})_(.+)\.rb$/.match(file))
27
- status = migrated_versions.delete(version_and_name[1]) ? 'up' : 'down'
28
- @migrations << {status: status, version: version_and_name[1], name: version_and_name[2]}
29
- end
30
- end
31
- end
32
- @migrations += migrated_versions.map {|v| {status: 'up', version: v, name: '*** NO FILE ***'}}
33
- @migrations.sort_by! {|m| m[:version]}
19
+ @migrations = Erd::Migrator.status
34
20
  end
35
21
 
36
22
  def update
@@ -39,29 +25,23 @@ module Erd
39
25
  changes.each do |row|
40
26
  begin
41
27
  action, model, column, from, to = row['action'], row['model'].tableize, row['column'], row['from'], row['to']
42
- before_migration_files = Dir.glob Rails.root.join('db', 'migrate', '*.rb')
43
28
  case action
44
29
  when 'remove_model'
45
- execute_generate_migration "drop_#{model}"
46
- generated_migration_file = (Dir.glob(Rails.root.join('db', 'migrate', '*.rb')) - before_migration_files).first
30
+ generated_migration_file = Erd::Migrator.execute_generate_migration "drop_#{model}"
47
31
  gsub_file generated_migration_file, /def up.* end/m, "def change\n drop_table :#{model}\n end"
48
32
  when 'rename_model'
49
33
  from, to = from.tableize, to.tableize
50
- execute_generate_migration "rename_#{from}_to_#{to}"
51
- generated_migration_file = (Dir.glob(Rails.root.join('db', 'migrate', '*.rb')) - before_migration_files).first
34
+ generated_migration_file = Erd::Migrator.execute_generate_migration "rename_#{from}_to_#{to}"
52
35
  gsub_file generated_migration_file, /def up.* end/m, "def change\n rename_table :#{from}, :#{to}\n end"
53
36
  when 'add_column'
54
37
  name_and_type = column.scan(/(.*)\((.*?)\)/).first
55
38
  name, type = name_and_type[0], name_and_type[1]
56
- execute_generate_migration "add_#{name}_to_#{model}", ["#{name}:#{type}"]
57
- generated_migration_file = (Dir.glob(Rails.root.join('db', 'migrate', '*.rb')) - before_migration_files).first
39
+ Erd::Migrator.execute_generate_migration "add_#{name}_to_#{model}", ["#{name}:#{type}"]
58
40
  when 'rename_column'
59
- execute_generate_migration "rename_#{model}_#{from}_to_#{to}"
60
- generated_migration_file = (Dir.glob(Rails.root.join('db', 'migrate', '*.rb')) - before_migration_files).first
41
+ generated_migration_file = Erd::Migrator.execute_generate_migration "rename_#{model}_#{from}_to_#{to}"
61
42
  gsub_file generated_migration_file, /def up.* end/m, "def change\n rename_column :#{model}, :#{from}, :#{to}\n end"
62
43
  when 'alter_column'
63
- execute_generate_migration "change_#{model}_#{column}_type_to_#{to}"
64
- generated_migration_file = (Dir.glob(Rails.root.join('db', 'migrate', '*.rb')) - before_migration_files).first
44
+ generated_migration_file = Erd::Migrator.execute_generate_migration "change_#{model}_#{column}_type_to_#{to}"
65
45
  gsub_file generated_migration_file, /def up.* end/m, "def change\n change_column :#{model}, :#{column}, :#{to}\n end"
66
46
  when 'move'
67
47
  json_file = Rails.root.join('tmp', 'erd_positions.json')
@@ -80,7 +60,7 @@ module Erd
80
60
  end
81
61
 
82
62
  def migrate
83
- run_migrations :up => params[:up], :down => params[:down]
63
+ Erd::Migrator.run_migrations :up => params[:up], :down => params[:down]
84
64
  redirect_to erd.root_path
85
65
  end
86
66
 
@@ -91,51 +71,20 @@ module Erd
91
71
  # node name x y width height label style shape color fillcolor
92
72
  models = plain.scan(/^node ([^ ]+) ([0-9\.]+) ([0-9\.]+) ([0-9\.]+) ([0-9\.]+) <\{?(<((?!^\}?>).)*)^\}?> [^ ]+ [^ ]+ [^ ]+ [^ ]+\n/m).map {|node_name, x, y, width, height, label|
93
73
  label_doc = Nokogiri::HTML::DocumentFragment.parse(label)
94
- model_name = label_doc.search('table')[0].search('tr > td').first.text
74
+ model_name = node_name.sub(/^m_/, '')
95
75
  next if model_name == 'ActiveRecord::SchemaMigration'
96
76
  columns = []
97
77
  if (cols_table = label_doc.search('table')[1])
98
78
  columns = cols_table.search('tr > td').map {|col| col_name, col_type = col.text.split(' '); {:name => col_name, :type => col_type}}
99
79
  end
100
80
  custom_x, custom_y = positions[model_name.tableize].try(:split, ',')
101
- {:model => model_name, :name => node_name, :x => (custom_x || BigDecimal(x) * ratio), :y => (custom_y || BigDecimal(y) * ratio), :width => BigDecimal(width) * ratio, :height => height, :columns => columns}
81
+ {:model => model_name, :x => (custom_x || BigDecimal(x) * ratio), :y => (custom_y || BigDecimal(y) * ratio), :width => BigDecimal(width) * ratio, :height => height, :columns => columns}
102
82
  }.compact
103
83
  # edge tail head n x1 y1 .. xn yn [label xl yl] style color
104
- edges = plain.scan(/^edge ([^ ]+)+ ([^ ]+)/).map {|from, to| {:from => from, :to => to}}
84
+ edges = plain.scan(/^edge ([^ ]+)+ ([^ ]+)/).map {|from, to| {:from => from.sub(/^m_/, ''), :to => to.sub(/^m_/, '')}}
105
85
  render_to_string 'erd/erd/erd', :layout => nil, :locals => {:width => BigDecimal(svg_width) * ratio, :height => BigDecimal(svg_height) * ratio, :models => models, :edges => edges}
106
86
  end
107
87
 
108
- def execute_generate_migration(name, options = nil)
109
- overwriting_argv([name, options]) do
110
- Rails::Generators.configure! Rails.application.config.generators
111
- result = Rails::Generators.invoke 'migration', [name, options], :behavior => :invoke, :destination_root => Rails.root
112
- raise ::Erd::MigrationError, "#{name}#{"(#{options})" if options}" unless result
113
- end
114
- end
115
-
116
- # `rake db:migrate`
117
- def run_migrations(migrations)
118
- migrations.each do |direction, versions|
119
- versions.each do |version|
120
- ActiveRecord::Migrator.run(direction, ActiveRecord::Migrator.migrations_path, version.to_i)
121
- end if versions
122
- end
123
- if ActiveRecord::Base.schema_format == :ruby
124
- File.open(ENV['SCHEMA'] || "#{Rails.root}/db/schema.rb", 'w') do |file|
125
- ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
126
- end
127
- end
128
- end
129
-
130
- # a dirty workaround to make rspec-rails run
131
- def overwriting_argv(value, &block)
132
- original_argv = ARGV
133
- Object.const_set :ARGV, value
134
- block.call
135
- ensure
136
- Object.const_set :ARGV, original_argv
137
- end
138
-
139
88
  def gsub_file(path, flag, *args, &block)
140
89
  path = File.expand_path path, Rails.root
141
90
 
@@ -1,4 +1,4 @@
1
- <div id="<%= model[:name] %>" class="model" style="top: <%= model[:y] %>px; left: <%= model[:x] %>px;" data-model_name="<%= model[:model] %>">
1
+ <div id="erd-<%= model[:model] %>" class="model" style="top: <%= model[:y] %>px; left: <%= model[:x] %>px;" data-model_name="<%= model[:model] %>">
2
2
  <a href="#!" class="close"> x </a>
3
3
  <div class="model_name">
4
4
  <div class="model_name_text"><%= model[:model] %></div>
@@ -1,6 +1,4 @@
1
- <div id="erd" style="border: 1px solid black; width: <%= width %>pt; height: <%= height %>pt;">
1
+ <div id="erd" data-svg_width="<%= width %>" data-svg_height="<%= height %>">
2
2
  <%= render :partial => 'erd/erd/model', :collection => models -%>
3
- <svg width="<%= width %>pt" height="<%= height %>pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
4
- </svg>
5
3
  <script>window.raw_edges = <%= edges.to_json.html_safe %>;</script>
6
4
  </div>
@@ -1,4 +1,4 @@
1
- <div>
1
+ <div id="erd_box">
2
2
  <div id="erd_container">
3
3
  <%=raw @erd %>
4
4
  </div>
@@ -1,6 +1,7 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
+ <meta charset='utf-8'>
4
5
  <title>ERD - <%= Rails.application.class.parent.name %></title>
5
6
  <%= stylesheet_link_tag 'erd/application', :media => 'all' %>
6
7
  <%= javascript_include_tag 'erd/application' %>
@@ -18,8 +18,8 @@ Gem::Specification.new do |gem|
18
18
  gem.add_runtime_dependency 'rails-erd', ['>= 0.4.5']
19
19
  gem.add_runtime_dependency 'nokogiri'
20
20
 
21
- gem.add_development_dependency 'ruby-debug19'
22
- gem.add_development_dependency 'combustion', '~> 0.3.1'
23
21
  gem.add_development_dependency 'rspec-rails'
22
+ gem.add_development_dependency 'capybara'
23
+ gem.add_development_dependency 'rr'
24
24
  gem.add_development_dependency 'sqlite3'
25
25
  end
@@ -0,0 +1,60 @@
1
+ require 'rails/generators'
2
+
3
+ module Erd
4
+ class MigrationError < StandardError; end
5
+
6
+ class Migrator
7
+ class << self
8
+ def status
9
+ migrated_versions = ActiveRecord::Base.connection.select_values("SELECT version FROM #{ActiveRecord::Migrator.schema_migrations_table_name}").map {|v| '%.3d' % v}
10
+ migrations = []
11
+ ActiveRecord::Migrator.migrations_paths.each do |path|
12
+ Dir.foreach(Rails.root.join(path)) do |file|
13
+ if (version_and_name = /^(\d{3,})_(.+)\.rb$/.match(file))
14
+ status = migrated_versions.delete(version_and_name[1]) ? 'up' : 'down'
15
+ migrations << {:status => status, :version => version_and_name[1], :name => version_and_name[2]}
16
+ end
17
+ end
18
+ end
19
+ migrations += migrated_versions.map {|v| {:status => 'up', :version => v, :name => '*** NO FILE ***'}}
20
+ migrations.sort_by {|m| m[:version]}
21
+ end
22
+
23
+ # `rake db:migrate`
24
+ def run_migrations(migrations)
25
+ migrations.each do |direction, versions|
26
+ versions.each do |version|
27
+ ActiveRecord::Migrator.run(direction, ActiveRecord::Migrator.migrations_path, version.to_i)
28
+ end if versions
29
+ end
30
+ if ActiveRecord::Base.schema_format == :ruby
31
+ File.open(ENV['SCHEMA'] || "#{Rails.root}/db/schema.rb", 'w') do |file|
32
+ ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
33
+ end
34
+ end
35
+ #TODO unload migraion classes
36
+ end
37
+
38
+ # runs `rails g migration [name]`
39
+ # @return generated migration filename
40
+ def execute_generate_migration(name, options = nil)
41
+ overwriting_argv([name, options]) do
42
+ Rails::Generators.configure! Rails.application.config.generators
43
+ result = Rails::Generators.invoke 'migration', [name, options], :behavior => :invoke, :destination_root => Rails.root
44
+ raise ::Erd::MigrationError, "#{name}#{"(#{options})" if options}" unless result
45
+ result.last.last
46
+ end
47
+ end
48
+
49
+ private
50
+ # a dirty workaround to make rspec-rails run
51
+ def overwriting_argv(value, &block)
52
+ original_argv = ARGV
53
+ Object.const_set :ARGV, value
54
+ block.call
55
+ ensure
56
+ Object.const_set :ARGV, original_argv
57
+ end
58
+ end
59
+ end
60
+ end
@@ -1,7 +1,10 @@
1
1
  require 'rails'
2
2
  require 'erd/engine'
3
3
 
4
+
4
5
  module Erd
6
+ autoload :Migrator, 'erd/migrator'
7
+
5
8
  class Railtie < ::Rails::Railtie #:nodoc:
6
9
  initializer 'erd' do |app|
7
10
  ActiveSupport.on_load(:after_initialize) do
@@ -1,3 +1,3 @@
1
1
  module Erd
2
- VERSION = '0.1.2'
2
+ VERSION = '0.1.3'
3
3
  end
@@ -0,0 +1,9 @@
1
+ class CreateAuthors < ActiveRecord::Migration
2
+ def change
3
+ create_table :authors do |t|
4
+ t.string :name
5
+
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ class CreateBooks < ActiveRecord::Migration
2
+ def change
3
+ create_table :books do |t|
4
+ t.references :author
5
+ t.string :title
6
+
7
+ t.timestamps
8
+ end
9
+ add_index :books, :author_id
10
+ end
11
+ end
@@ -0,0 +1,30 @@
1
+ require 'active_record'
2
+ require 'action_controller/railtie'
3
+
4
+ # config
5
+ ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
6
+
7
+ module ErdApp
8
+ class Application < Rails::Application
9
+ # Rais.root
10
+ config.root = File.dirname(__FILE__)
11
+
12
+ config.secret_token = 'fall to your knees and repent if you please'
13
+ config.session_store :cookie_store, :key => '_myapp_session'
14
+ config.active_support.deprecation = :log
15
+
16
+ config.app_generators.orm :active_record, :migration => true, :timestamps => true
17
+ end
18
+ end
19
+ ErdApp::Application.initialize!
20
+
21
+ # models
22
+ class Author < ActiveRecord::Base
23
+ has_many :books
24
+ end
25
+ class Book < ActiveRecord::Base
26
+ belongs_to :author
27
+ end
28
+
29
+ # helpers
30
+ module ApplicationHelper; end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe Erd::Migrator do
4
+ subject { Erd::Migrator }
5
+ after do
6
+ Dir.glob(Rails.root.join('db/migrate/*.rb')).each do |f|
7
+ FileUtils.rm f unless File.basename(f).in? %w(20120428022519_create_authors.rb 20120428022535_create_books.rb)
8
+ end
9
+ end
10
+ describe '.status' do
11
+ context 'when all migrations are up' do
12
+ its(:status) { should == [{:status => 'up', :version => '20120428022519', :name => 'create_authors'}, {:status => 'up', :version => '20120428022535', :name => 'create_books'}] }
13
+ end
14
+
15
+ context 'when one is undone' do
16
+ before do
17
+ FileUtils.touch Rails.root.join('db/migrate/20999999999999_create_foobars.rb')
18
+ end
19
+ its(:status) { should == [{:status => 'up', :version => '20120428022519', :name => 'create_authors'}, {:status => 'up', :version => '20120428022535', :name => 'create_books'}, {:status => 'down', :version => '20999999999999', :name => 'create_foobars'}] }
20
+ end
21
+ end
22
+
23
+ describe '.run_migrations' do
24
+ before do
25
+ FileUtils.touch Rails.root.join('db/migrate/20999999999999_create_foobars.rb')
26
+ mock(ActiveRecord::Migrator).run(:up, 'db/migrate', 20999999999999)
27
+ mock(ActiveRecord::SchemaDumper).dump(ActiveRecord::Base.connection, anything)
28
+ end
29
+ specify do
30
+ subject.run_migrations(:up => ['20999999999999'])
31
+ end
32
+ end
33
+
34
+ describe '.execute_generate_migration' do
35
+ before do
36
+ stub.proxy(Time).now {|t| stub(t).utc { Time.new 2012, 5, 12, 13, 26 } }
37
+ end
38
+ specify do
39
+ subject.execute_generate_migration('create_foobars').should eq Rails.root.join('db/migrate', '20120512132600_create_foobars.rb').to_s
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'erd#index' do
4
+ scenario 'with author and book model' do
5
+ visit '/erd'
6
+ page.should have_content 'Author'
7
+ page.should have_content 'name'
8
+ page.should have_content 'Book'
9
+ page.should have_content 'title'
10
+ end
11
+ end
@@ -1,12 +1,19 @@
1
- require 'rubygems'
2
- require 'bundler'
3
-
4
- Bundler.require :default, :development
5
-
6
- Combustion.initialize!
7
-
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ # load Rails first
4
+ require 'rails'
5
+ require 'erd'
6
+ # needs to load the app before loading rspec/rails => capybara
7
+ require 'fake_app/fake_app'
8
8
  require 'rspec/rails'
9
+ # Requires supporting files with custom matchers and macros, etc,
10
+ # in ./support/ and its subdirectories.
11
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
9
12
 
10
13
  RSpec.configure do |config|
11
- config.use_transactional_fixtures = true
14
+ config.mock_with :rr
15
+ config.before :all do
16
+ ActiveRecord::Migration.verbose = false
17
+ ActiveRecord::Migrator.migrate(ActiveRecord::Migrator.migrations_paths.map {|p| Rails.root.join p}, nil)
18
+ end
12
19
  end
metadata CHANGED
@@ -1,89 +1,118 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: erd
3
- version: !ruby/object:Gem::Version
4
- version: 0.1.2
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
5
  prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 3
10
+ version: 0.1.3
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Akira Matsuda
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2012-05-02 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2012-05-22 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
15
21
  name: rails-erd
16
- requirement: &70212334462400 !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
17
24
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 5
29
+ segments:
30
+ - 0
31
+ - 4
32
+ - 5
21
33
  version: 0.4.5
22
34
  type: :runtime
23
- prerelease: false
24
- version_requirements: *70212334462400
25
- - !ruby/object:Gem::Dependency
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
26
37
  name: nokogiri
27
- requirement: &70212334461440 !ruby/object:Gem::Requirement
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
28
40
  none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '0'
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 3
45
+ segments:
46
+ - 0
47
+ version: "0"
33
48
  type: :runtime
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: rspec-rails
34
52
  prerelease: false
35
- version_requirements: *70212334461440
36
- - !ruby/object:Gem::Dependency
37
- name: ruby-debug19
38
- requirement: &70212334460620 !ruby/object:Gem::Requirement
53
+ requirement: &id003 !ruby/object:Gem::Requirement
39
54
  none: false
40
- requirements:
41
- - - ! '>='
42
- - !ruby/object:Gem::Version
43
- version: '0'
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ hash: 3
59
+ segments:
60
+ - 0
61
+ version: "0"
44
62
  type: :development
63
+ version_requirements: *id003
64
+ - !ruby/object:Gem::Dependency
65
+ name: capybara
45
66
  prerelease: false
46
- version_requirements: *70212334460620
47
- - !ruby/object:Gem::Dependency
48
- name: combustion
49
- requirement: &70212334459800 !ruby/object:Gem::Requirement
67
+ requirement: &id004 !ruby/object:Gem::Requirement
50
68
  none: false
51
- requirements:
52
- - - ~>
53
- - !ruby/object:Gem::Version
54
- version: 0.3.1
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ hash: 3
73
+ segments:
74
+ - 0
75
+ version: "0"
55
76
  type: :development
77
+ version_requirements: *id004
78
+ - !ruby/object:Gem::Dependency
79
+ name: rr
56
80
  prerelease: false
57
- version_requirements: *70212334459800
58
- - !ruby/object:Gem::Dependency
59
- name: rspec-rails
60
- requirement: &70212334459100 !ruby/object:Gem::Requirement
81
+ requirement: &id005 !ruby/object:Gem::Requirement
61
82
  none: false
62
- requirements:
63
- - - ! '>='
64
- - !ruby/object:Gem::Version
65
- version: '0'
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ hash: 3
87
+ segments:
88
+ - 0
89
+ version: "0"
66
90
  type: :development
67
- prerelease: false
68
- version_requirements: *70212334459100
69
- - !ruby/object:Gem::Dependency
91
+ version_requirements: *id005
92
+ - !ruby/object:Gem::Dependency
70
93
  name: sqlite3
71
- requirement: &70212334458260 !ruby/object:Gem::Requirement
94
+ prerelease: false
95
+ requirement: &id006 !ruby/object:Gem::Requirement
72
96
  none: false
73
- requirements:
74
- - - ! '>='
75
- - !ruby/object:Gem::Version
76
- version: '0'
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ hash: 3
101
+ segments:
102
+ - 0
103
+ version: "0"
77
104
  type: :development
78
- prerelease: false
79
- version_requirements: *70212334458260
105
+ version_requirements: *id006
80
106
  description: erd engine on Rails
81
- email:
107
+ email:
82
108
  - ronnie@dio.jp
83
109
  executables: []
110
+
84
111
  extensions: []
112
+
85
113
  extra_rdoc_files: []
86
- files:
114
+
115
+ files:
87
116
  - .gitignore
88
117
  - Gemfile
89
118
  - MIT-LICENSE
@@ -105,51 +134,59 @@ files:
105
134
  - erd.gemspec
106
135
  - lib/erd.rb
107
136
  - lib/erd/engine.rb
137
+ - lib/erd/migrator.rb
108
138
  - lib/erd/railtie.rb
109
139
  - lib/erd/version.rb
110
- - spec/controllers/erd_controller_spec.rb
111
- - spec/internal/app/models/post.rb
112
- - spec/internal/app/models/user.rb
113
- - spec/internal/config/database.yml
114
- - spec/internal/config/routes.rb
115
- - spec/internal/db/combustion_test.sqlite
116
- - spec/internal/db/schema.rb
117
- - spec/internal/log/.gitignore
118
- - spec/internal/public/favicon.ico
140
+ - spec/fake_app/db/migrate/20120428022519_create_authors.rb
141
+ - spec/fake_app/db/migrate/20120428022535_create_books.rb
142
+ - spec/fake_app/db/schema.rb
143
+ - spec/fake_app/fake_app.rb
144
+ - spec/fake_app/log/.gitignore
145
+ - spec/fake_app/tmp/.gitkeep
146
+ - spec/lib/migrator_spec.rb
147
+ - spec/requests/erd_spec.rb
119
148
  - spec/spec_helper.rb
120
149
  - vendor/assets/javascripts/raphael-min.js
121
150
  homepage: https://github.com/amatsuda/erd
122
151
  licenses: []
152
+
123
153
  post_install_message:
124
154
  rdoc_options: []
125
- require_paths:
155
+
156
+ require_paths:
126
157
  - lib
127
- required_ruby_version: !ruby/object:Gem::Requirement
158
+ required_ruby_version: !ruby/object:Gem::Requirement
128
159
  none: false
129
- requirements:
130
- - - ! '>='
131
- - !ruby/object:Gem::Version
132
- version: '0'
133
- required_rubygems_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ hash: 3
164
+ segments:
165
+ - 0
166
+ version: "0"
167
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
168
  none: false
135
- requirements:
136
- - - ! '>='
137
- - !ruby/object:Gem::Version
138
- version: '0'
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ hash: 3
173
+ segments:
174
+ - 0
175
+ version: "0"
139
176
  requirements: []
177
+
140
178
  rubyforge_project:
141
- rubygems_version: 1.8.16
179
+ rubygems_version: 1.8.10
142
180
  signing_key:
143
181
  specification_version: 3
144
182
  summary: erd engine on Rails
145
- test_files:
146
- - spec/controllers/erd_controller_spec.rb
147
- - spec/internal/app/models/post.rb
148
- - spec/internal/app/models/user.rb
149
- - spec/internal/config/database.yml
150
- - spec/internal/config/routes.rb
151
- - spec/internal/db/combustion_test.sqlite
152
- - spec/internal/db/schema.rb
153
- - spec/internal/log/.gitignore
154
- - spec/internal/public/favicon.ico
183
+ test_files:
184
+ - spec/fake_app/db/migrate/20120428022519_create_authors.rb
185
+ - spec/fake_app/db/migrate/20120428022535_create_books.rb
186
+ - spec/fake_app/db/schema.rb
187
+ - spec/fake_app/fake_app.rb
188
+ - spec/fake_app/log/.gitignore
189
+ - spec/fake_app/tmp/.gitkeep
190
+ - spec/lib/migrator_spec.rb
191
+ - spec/requests/erd_spec.rb
155
192
  - spec/spec_helper.rb
@@ -1,10 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Erd::ErdController do
4
- it 'should GET :index' do
5
- get :index
6
-
7
- response.should render_template('index')
8
- end
9
- end
10
-
@@ -1,3 +0,0 @@
1
- class Post < ActiveRecord::Base
2
- belongs_to :user
3
- end
@@ -1,3 +0,0 @@
1
- class User < ActiveRecord::Base
2
- has_many :posts
3
- end
@@ -1,3 +0,0 @@
1
- test:
2
- adapter: sqlite3
3
- database: db/combustion_test.sqlite
@@ -1,3 +0,0 @@
1
- Rails.application.routes.draw do
2
- #
3
- end
@@ -1,15 +0,0 @@
1
- ActiveRecord::Schema.define do
2
- create_table "posts", :force => true do |t|
3
- t.string "title"
4
- t.text "content"
5
- t.integer "user_id"
6
- t.datetime "created_at", :null => false
7
- t.datetime "updated_at", :null => false
8
- end
9
-
10
- create_table "users", :force => true do |t|
11
- t.string "name"
12
- t.datetime "created_at", :null => false
13
- t.datetime "updated_at", :null => false
14
- end
15
- end