erd 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  = Erd
2
2
 
3
- A Rails engine for drawing your app's ER diagram
3
+ A Rails engine for drawing your app's ER diagram and operating migrations
4
4
 
5
5
 
6
6
  == Requirements
@@ -30,15 +30,11 @@ Browse at your http://localhost:3000/erd
30
30
 
31
31
  * You can drag and arrange the positions of each model
32
32
 
33
- * You can add column
33
+ * You can operate DB schema manipulations such as `add column`, `rename column`, `alter column`, and `drop table`
34
34
 
35
- * You can rename column
35
+ * Then, Erd generates migration files on the server
36
36
 
37
- * You can alter column type
38
-
39
- * You can drop table
40
-
41
- * Finally, Erd generates migration files on the server (you need to run `rake db:migrate` by hand)
37
+ * And you can run each migration on your browser
42
38
 
43
39
 
44
40
  == TODO
@@ -1,11 +1,11 @@
1
1
  * {
2
- margin: 0;
3
- padding: 0;
2
+ margin: 0;
3
+ padding: 0;
4
4
  }
5
5
 
6
6
  body div {
7
- text-align: left;
8
- margin: 0 auto;
7
+ text-align: left;
8
+ margin: 0 auto;
9
9
  }
10
10
 
11
11
  li {
@@ -29,6 +29,12 @@ fieldset { padding:0; border:0; margin-top:25px; }
29
29
  position: relative;
30
30
  float: right;
31
31
  z-index: 999;
32
+
33
+ table {
34
+ td {
35
+ font-size: small;
36
+ }
37
+ }
32
38
  }
33
39
 
34
40
  #erd {
@@ -113,12 +119,9 @@ fieldset { padding:0; border:0; margin-top:25px; }
113
119
  }
114
120
 
115
121
 
116
- #generated {
117
- border: 1px #000 solid;
118
- }
119
-
120
- #changes {
121
- display: none;
122
+ #failed {
123
+ border: 2px #f00 solid;
124
+ padding: 2px;
122
125
  }
123
126
 
124
127
  #model_name_changes, #column_name_changes {
@@ -19,11 +19,24 @@ module Erd
19
19
  {}
20
20
  end
21
21
  @erd = render_plain plain, positions
22
+
23
+ migrated_versions = ActiveRecord::Base.connection.select_values("SELECT version FROM #{ActiveRecord::Migrator.schema_migrations_table_name}").map {|v| '%.3d' % v}
24
+ @migrations = []
25
+ ActiveRecord::Migrator.migrations_paths.each do |path|
26
+ Dir.foreach(path) do |file|
27
+ if (version_and_name = /^(\d{3,})_(.+)\.rb$/.match(file))
28
+ status = migrated_versions.delete(version_and_name[1]) ? 'up' : 'down'
29
+ @migrations << {status: status, version: version_and_name[1], name: version_and_name[2]}
30
+ end
31
+ end
32
+ end
33
+ @migrations += migrated_versions.map {|v| {status: 'up', version: v, name: '*** NO FILE ***'}}
34
+ @migrations.sort_by! {|m| m[:version]}
22
35
  end
23
36
 
24
37
  def update
25
38
  changes = ActiveSupport::JSON.decode(params[:changes])
26
- generated_migrations, failed_migrations = [], []
39
+ failed_migrations = []
27
40
  changes.each do |row|
28
41
  begin
29
42
  action, model, column, from, to = row['action'], row['model'].tableize, row['column'], row['from'], row['to']
@@ -33,35 +46,29 @@ module Erd
33
46
  execute_generate_migration "drop_#{model}"
34
47
  generated_migration_file = (Dir.glob(Rails.root.join('db', 'migrate', '*.rb')) - before_migration_files).first
35
48
  gsub_file generated_migration_file, /def up.* end/m, "def change\n drop_table :#{model}\n end"
36
- generated_migrations << File.basename(generated_migration_file)
37
49
  when 'rename_model'
38
50
  from, to = from.tableize, to.tableize
39
51
  execute_generate_migration "rename_#{from}_to_#{to}"
40
52
  generated_migration_file = (Dir.glob(Rails.root.join('db', 'migrate', '*.rb')) - before_migration_files).first
41
53
  gsub_file generated_migration_file, /def up.* end/m, "def change\n rename_table :#{from}, :#{to}\n end"
42
- generated_migrations << File.basename(generated_migration_file)
43
54
  when 'add_column'
44
55
  name_and_type = column.scan(/(.*)\((.*?)\)/).first
45
56
  name, type = name_and_type[0], name_and_type[1]
46
57
  execute_generate_migration "add_#{name}_to_#{model}", ["#{name}:#{type}"]
47
58
  generated_migration_file = (Dir.glob(Rails.root.join('db', 'migrate', '*.rb')) - before_migration_files).first
48
- generated_migrations << File.basename(generated_migration_file)
49
59
  when 'rename_column'
50
60
  execute_generate_migration "rename_#{model}_#{from}_to_#{to}"
51
61
  generated_migration_file = (Dir.glob(Rails.root.join('db', 'migrate', '*.rb')) - before_migration_files).first
52
62
  gsub_file generated_migration_file, /def up.* end/m, "def change\n rename_column :#{model}, :#{from}, :#{to}\n end"
53
- generated_migrations << File.basename(generated_migration_file)
54
63
  when 'alter_column'
55
64
  execute_generate_migration "change_#{model}_#{column}_type_to_#{to}"
56
65
  generated_migration_file = (Dir.glob(Rails.root.join('db', 'migrate', '*.rb')) - before_migration_files).first
57
66
  gsub_file generated_migration_file, /def up.* end/m, "def change\n change_column :#{model}, :#{column}, :#{to}\n end"
58
- generated_migrations << File.basename(generated_migration_file)
59
67
  when 'move'
60
68
  json_file = Rails.root.join('tmp', 'erd_positions.json')
61
69
  positions = json_file.exist? ? ActiveSupport::JSON.decode(json_file.read) : {}
62
70
  positions[model] = to
63
71
  json_file.open('w') {|f| f.write positions.to_json}
64
- generated_migrations << 'saved entity positions'
65
72
  else
66
73
  raise "unexpected action: #{action}"
67
74
  end
@@ -70,7 +77,12 @@ module Erd
70
77
  end
71
78
  end
72
79
 
73
- redirect_to erd.root_path, :flash => {:generated_migrations => generated_migrations, :failed_migrations => failed_migrations}
80
+ redirect_to erd.root_path, :flash => {:failed_migrations => failed_migrations}
81
+ end
82
+
83
+ def migrate
84
+ run_migrations :up => params[:up], :down => params[:down]
85
+ redirect_to erd.root_path
74
86
  end
75
87
 
76
88
  private
@@ -103,10 +115,14 @@ module Erd
103
115
  end
104
116
 
105
117
  # `rake db:migrate`
106
- def migrate
107
- ActiveRecord::Migrator.migrate(ActiveRecord::Migrator.migrations_path, ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
118
+ def run_migrations(migrations)
119
+ migrations.each do |direction, versions|
120
+ versions.each do |version|
121
+ ActiveRecord::Migrator.run(direction, ActiveRecord::Migrator.migrations_path, version.to_i)
122
+ end if versions
123
+ end
108
124
  if ActiveRecord::Base.schema_format == :ruby
109
- File.open(ENV['SCHEMA'] || "#{Rails.root}/db/schema.rb", "w") do |file|
125
+ File.open(ENV['SCHEMA'] || "#{Rails.root}/db/schema.rb", 'w') do |file|
110
126
  ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
111
127
  end
112
128
  end
@@ -4,18 +4,8 @@
4
4
  </div>
5
5
 
6
6
  <div id="migration">
7
- <%- if flash[:generated_migrations].present? -%>
8
- <div id="generated">
9
- generated migrations (please run rake db:migrate)
10
- <ul>
11
- <%- flash[:generated_migrations].each do |m| -%>
12
- <li><%= m %></li>
13
- <%- end -%>
14
- </ul>
15
- </div>
16
- <%- end -%>
17
7
  <%- if flash[:failed_migrations].present? -%>
18
- <div id="generated">
8
+ <div id="failed">
19
9
  failed migrations
20
10
  <ul>
21
11
  <%- flash[:failed_migrations].each do |m| -%>
@@ -25,6 +15,7 @@
25
15
  </div>
26
16
  <%- end -%>
27
17
  <table id="changes">
18
+ <caption>schema changes</caption>
28
19
  <thead><tr><th>action</th><th>model</th><th>column</th><th>from</th><th>to</th></tr></thead>
29
20
  <tbody></tbody>
30
21
  </table>
@@ -32,5 +23,17 @@
32
23
  <%= hidden_field_tag 'changes' %>
33
24
  <%= submit_tag 'save changes' %>
34
25
  <% end %>
26
+ <%= form_tag '/erd/migrate', :method => :put do %>
27
+ <table>
28
+ <caption>migration status</caption>
29
+ <thead><tr><th>status</th><th>version</th><th>name</th></tr></thead>
30
+ <tbody>
31
+ <%- @migrations.each do |m| -%>
32
+ <tr><td><label><%= check_box_tag (m[:status] == 'up' ? 'down[]' : 'up[]'), m[:version] %><%= m[:status] %></label></td><td><%= m[:version] %></td><td><%= m[:name] %></td></tr>
33
+ <%- end -%>
34
+ </tbody>
35
+ </table>
36
+ <%= submit_tag 'run migrations' %>
37
+ <% end %>
35
38
  </div>
36
39
  </div>
@@ -1,5 +1,6 @@
1
1
  Erd::Engine.routes.draw do
2
2
  get '/' => 'erd#index'
3
3
  put '/' => 'erd#update'
4
+ put '/migrate' => 'erd#migrate', :as => 'migrate'
4
5
  root :to => 'erd#index'
5
6
  end
@@ -1,3 +1,3 @@
1
1
  module Erd
2
- VERSION = '0.0.2'
2
+ VERSION = '0.1.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: erd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-27 00:00:00.000000000 Z
12
+ date: 2012-04-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails-erd
16
- requirement: &70212407699740 !ruby/object:Gem::Requirement
16
+ requirement: &70264677495520 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.4.5
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70212407699740
24
+ version_requirements: *70264677495520
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: nokogiri
27
- requirement: &70212407698520 !ruby/object:Gem::Requirement
27
+ requirement: &70264677495100 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70212407698520
35
+ version_requirements: *70264677495100
36
36
  description: erd engine on Rails
37
37
  email:
38
38
  - ronnie@dio.jp