From f7809e973f5d211ef8cd98ad9a3d9a85b605da2e Mon Sep 17 00:00:00 2001 From: Crawford Wynnes Date: Tue, 2 Aug 2011 17:45:30 +0100 Subject: [PATCH 1/5] vim temp files --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 088af20..1d8084a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ pkg/* +.swp +*.swp From bead9f1b88bfb5dc2731046c7fb16ccee0702244 Mon Sep 17 00:00:00 2001 From: Crawford Wynnes Date: Tue, 2 Aug 2011 17:48:08 +0100 Subject: [PATCH 2/5] Created file with spec to fix bug in removing indexes that had multiple columns --- lib/db_migrate_merge.rb | 26 ++++++++++++++++++++++ spec/db_migrate_merge_spec.rb | 42 +++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 lib/db_migrate_merge.rb create mode 100644 spec/db_migrate_merge_spec.rb diff --git a/lib/db_migrate_merge.rb b/lib/db_migrate_merge.rb new file mode 100644 index 0000000..a086008 --- /dev/null +++ b/lib/db_migrate_merge.rb @@ -0,0 +1,26 @@ +class DbMigrateMerge + def self.generate_down_indexes lines + indexes = lines.collect do |line| + multiple_columns_regex = /add_index "(.*)", \[([^\]]+)\], :name => "(.*)"/ + single_columns_regex = /add_index "(.*)", (.*), :name => "(.*)"/ + + if line =~ multiple_columns_regex + table_name = $1 + column_names = $2 + index_name = $3 + "remove_index :#{table_name}, [#{column_names}], :name => :#{index_name}" + + elsif line =~ single_columns_regex + table_name = $1 + column_name = $2 + index_name = $3 + "remove_index :#{table_name}, #{column_name}, :name => :#{index_name}" + + end + end + + indexes.compact.reverse.join("\n ") + end + + +end diff --git a/spec/db_migrate_merge_spec.rb b/spec/db_migrate_merge_spec.rb new file mode 100644 index 0000000..5c7a786 --- /dev/null +++ b/spec/db_migrate_merge_spec.rb @@ -0,0 +1,42 @@ +current_directory = File.join File.dirname(__FILE__) +require File.join(current_directory, '../lib/db_migrate_merge') + +describe DbMigrateMerge do + describe "#remove_index" do + it "handles indexes with only one column name" do + + line1 = <<-eof +add_index "versions", "versioned_id", :name => "index_versions_on_versioned_type_and_versioned_id" + eof + + line2 = <<-eof + "add_index "audited", "transaction", :name => "index_audited_on_transaction" +eof + + expected_line_1 = <<-eof +remove_index :audited, "transaction", :name => :index_audited_on_transaction +eof + +expected_line_2 = <<-eof + remove_index :versions, "versioned_id", :name => :index_versions_on_versioned_type_and_versioned_id +eof + + expected = [expected_line_1,expected_line_2].join()[0..-2] + DbMigrateMerge.generate_down_indexes([line1,line2]).should == expected + + end + + + it "handles indexes with an array of column names" do + line = <<-eof +add_index "versions", ["versioned_type", "versioned_id"], :name => "index_versions_on_versioned_type_and_versioned_id" +eof + +expected = <<-ex +remove_index :versions, ["versioned_type", "versioned_id"], :name => :index_versions_on_versioned_type_and_versioned_id +ex + DbMigrateMerge.generate_down_indexes([line]).should == expected[0..-2] + end + end + +end From 27c9f2448d633ee43689351d4ee7c27a728d1905 Mon Sep 17 00:00:00 2001 From: Crawford Wynnes Date: Wed, 3 Aug 2011 11:37:31 +0100 Subject: [PATCH 3/5] Fixed specs - now works for more possible scenarios --- lib/db_migrate_merge.rb | 28 ++++++------ spec/db_migrate_merge_spec.rb | 82 ++++++++++++++++++++++++++++------- 2 files changed, 81 insertions(+), 29 deletions(-) diff --git a/lib/db_migrate_merge.rb b/lib/db_migrate_merge.rb index a086008..1ad1885 100644 --- a/lib/db_migrate_merge.rb +++ b/lib/db_migrate_merge.rb @@ -1,26 +1,28 @@ class DbMigrateMerge def self.generate_down_indexes lines indexes = lines.collect do |line| - multiple_columns_regex = /add_index "(.*)", \[([^\]]+)\], :name => "(.*)"/ - single_columns_regex = /add_index "(.*)", (.*), :name => "(.*)"/ + columns_regex = /add_index "[^"]+", ?(?::column ?=> ?)?(\[[^\]]+\]|"[^"]+")/ - if line =~ multiple_columns_regex - table_name = $1 - column_names = $2 - index_name = $3 - "remove_index :#{table_name}, [#{column_names}], :name => :#{index_name}" + index_regex = /add_index "[^"]+", ?(?::name ?=> ?)?"([^"]+)"/ + table_regex = /add_index "([^"]+)"/ - elsif line =~ single_columns_regex + if line =~ table_regex table_name = $1 - column_name = $2 - index_name = $3 - "remove_index :#{table_name}, #{column_name}, :name => :#{index_name}" - + columns = line =~ columns_regex + if columns + if $1.index "[" + "remove_index :#{table_name}, :column => #{$1}" + else + "remove_index :#{table_name}, :column => [#{$1}]" + end + elsif line =~ index_regex + "remove_index :#{table_name}, :name => \"#{$1}\"" + end end + end indexes.compact.reverse.join("\n ") end - end diff --git a/spec/db_migrate_merge_spec.rb b/spec/db_migrate_merge_spec.rb index 5c7a786..e868a97 100644 --- a/spec/db_migrate_merge_spec.rb +++ b/spec/db_migrate_merge_spec.rb @@ -3,39 +3,89 @@ describe DbMigrateMerge do describe "#remove_index" do - it "handles indexes with only one column name" do + #___________________ + it "handles indexes with just a column name" do + line = <<-eof +add_index "versions", "versioned_type" +eof + + expected = <<-ex +remove_index :versions, :column => ["versioned_type"] +ex + + DbMigrateMerge.generate_down_indexes([line]).should == expected[0..-2] + end + + - line1 = <<-eof -add_index "versions", "versioned_id", :name => "index_versions_on_versioned_type_and_versioned_id" - eof - line2 = <<-eof - "add_index "audited", "transaction", :name => "index_audited_on_transaction" -eof - expected_line_1 = <<-eof -remove_index :audited, "transaction", :name => :index_audited_on_transaction + #___________________ + it "handles indexes with only one column name and an index name" do + + line = <<-eof +add_index "audited", "transaction", :name => "index_audited_on_transaction" eof -expected_line_2 = <<-eof - remove_index :versions, "versioned_id", :name => :index_versions_on_versioned_type_and_versioned_id + expected_line = <<-eof +remove_index :audited, :column => ["transaction"] eof - expected = [expected_line_1,expected_line_2].join()[0..-2] - DbMigrateMerge.generate_down_indexes([line1,line2]).should == expected + expected = [expected_line].join()[0..-2] + DbMigrateMerge.generate_down_indexes([line]).should == expected end - it "handles indexes with an array of column names" do + #___________________ + it "works with an array of column names and an index name" do line = <<-eof add_index "versions", ["versioned_type", "versioned_id"], :name => "index_versions_on_versioned_type_and_versioned_id" eof -expected = <<-ex -remove_index :versions, ["versioned_type", "versioned_id"], :name => :index_versions_on_versioned_type_and_versioned_id + expected = <<-ex +remove_index :versions, :column => ["versioned_type", "versioned_id"] +ex + DbMigrateMerge.generate_down_indexes([line]).should == expected[0..-2] + end + + it "handles indexes with a column name with the :column => hash rocket syntax" do + line = <<-eof +add_index "versions", :column => ["versioned_type", "versioned_id"], :name => "index_versions_on_versioned_type_and_versioned_id" +eof + + expected = <<-ex +remove_index :versions, :column => ["versioned_type", "versioned_id"] +ex + + DbMigrateMerge.generate_down_indexes([line]).should == expected[0..-2] + + line = <<-eof +add_index "versions", :column => ["versioned_type"], :name => "index_versions_on_versioned_type" +eof + + expected = <<-ex +remove_index :versions, :column => ["versioned_type"] +ex + + DbMigrateMerge.generate_down_indexes([line]).should == expected[0..-2] + + + end + + + + it "handles indexes with a column name with the :column => hash rocket syntax" do + line = <<-eof +add_index "versions", :name => "index_versions_on_versioned_type_and_versioned_id" +eof + + expected = <<-ex +remove_index :versions, :name => "index_versions_on_versioned_type_and_versioned_id" ex + DbMigrateMerge.generate_down_indexes([line]).should == expected[0..-2] + end end From 25e034a2ab0662361f18fab41feebf62daaaa7d5 Mon Sep 17 00:00:00 2001 From: Crawford Wynnes Date: Wed, 3 Aug 2011 11:54:35 +0100 Subject: [PATCH 4/5] Fixed indentation issue --- lib/db_migrate_merge.rb | 10 +++++++--- spec/db_migrate_merge_spec.rb | 12 ++++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/db_migrate_merge.rb b/lib/db_migrate_merge.rb index 1ad1885..2c530a5 100644 --- a/lib/db_migrate_merge.rb +++ b/lib/db_migrate_merge.rb @@ -8,15 +8,19 @@ def self.generate_down_indexes lines if line =~ table_regex table_name = $1 + remove = " remove_index :#{table_name}," + columns = line =~ columns_regex if columns if $1.index "[" - "remove_index :#{table_name}, :column => #{$1}" + "#{remove} :column => #{$1}" else - "remove_index :#{table_name}, :column => [#{$1}]" + "#{remove} :column => [#{$1}]" end elsif line =~ index_regex - "remove_index :#{table_name}, :name => \"#{$1}\"" + "#{remove} :name => \"#{$1}\"" + else + raise Exception.new "Expected to find an index name or column names in the db/schema.rb file but none were found:\n #{line}" end end diff --git a/spec/db_migrate_merge_spec.rb b/spec/db_migrate_merge_spec.rb index e868a97..4769dc4 100644 --- a/spec/db_migrate_merge_spec.rb +++ b/spec/db_migrate_merge_spec.rb @@ -10,7 +10,7 @@ eof expected = <<-ex -remove_index :versions, :column => ["versioned_type"] + remove_index :versions, :column => ["versioned_type"] ex DbMigrateMerge.generate_down_indexes([line]).should == expected[0..-2] @@ -28,7 +28,7 @@ eof expected_line = <<-eof -remove_index :audited, :column => ["transaction"] + remove_index :audited, :column => ["transaction"] eof expected = [expected_line].join()[0..-2] @@ -44,7 +44,7 @@ eof expected = <<-ex -remove_index :versions, :column => ["versioned_type", "versioned_id"] + remove_index :versions, :column => ["versioned_type", "versioned_id"] ex DbMigrateMerge.generate_down_indexes([line]).should == expected[0..-2] end @@ -55,7 +55,7 @@ eof expected = <<-ex -remove_index :versions, :column => ["versioned_type", "versioned_id"] + remove_index :versions, :column => ["versioned_type", "versioned_id"] ex DbMigrateMerge.generate_down_indexes([line]).should == expected[0..-2] @@ -65,7 +65,7 @@ eof expected = <<-ex -remove_index :versions, :column => ["versioned_type"] + remove_index :versions, :column => ["versioned_type"] ex DbMigrateMerge.generate_down_indexes([line]).should == expected[0..-2] @@ -81,7 +81,7 @@ eof expected = <<-ex -remove_index :versions, :name => "index_versions_on_versioned_type_and_versioned_id" + remove_index :versions, :name => "index_versions_on_versioned_type_and_versioned_id" ex DbMigrateMerge.generate_down_indexes([line]).should == expected[0..-2] From 15a05b26c86407c3b029eaf2ceb49d229e40521c Mon Sep 17 00:00:00 2001 From: Crawford Wynnes Date: Wed, 3 Aug 2011 12:04:25 +0100 Subject: [PATCH 5/5] sorted out whitespace issue --- lib/db_migrate_merge.rb | 4 +-- lib/tasks/db_migrate_merge.rake | 47 +++++++++++++++++---------------- spec/db_migrate_merge_spec.rb | 12 ++++----- 3 files changed, 32 insertions(+), 31 deletions(-) diff --git a/lib/db_migrate_merge.rb b/lib/db_migrate_merge.rb index 2c530a5..b6e64d9 100644 --- a/lib/db_migrate_merge.rb +++ b/lib/db_migrate_merge.rb @@ -8,7 +8,7 @@ def self.generate_down_indexes lines if line =~ table_regex table_name = $1 - remove = " remove_index :#{table_name}," + remove = "remove_index :#{table_name}," columns = line =~ columns_regex if columns @@ -26,7 +26,7 @@ def self.generate_down_indexes lines end - indexes.compact.reverse.join("\n ") + indexes.compact.reverse end end diff --git a/lib/tasks/db_migrate_merge.rake b/lib/tasks/db_migrate_merge.rake index 592b256..6dc78c1 100644 --- a/lib/tasks/db_migrate_merge.rake +++ b/lib/tasks/db_migrate_merge.rake @@ -1,49 +1,50 @@ require 'fileutils' namespace :db do - + namespace :migrate do - + desc "Uses schema.rb to build a new base migration with the timestamp of the current migration. Other migrations are moved to a backup folder." - task :compact => [:abort_if_pending_migrations, :environment] do - + task :compact => [:abort_if_pending_migrations, :environment] do + file = File.read("#{RAILS_ROOT}/db/schema.rb") - + main_content_regex = /ActiveRecord::Schema.define\(:version => (.*)\) do(.*)^end/m main_content_regex.match file create_part = $2 # the second group holds what I want. - - lines = file.split("\n") - - index_regex = /add_index "(.*)", (.*):name => "(.*)"/ + + lines = file.split("\n") + table_regex = /create_table (.*),(.*)/ - + + index_regex = /add_index "(.*)", \[(.*)\], :name => "(.*)"/ + tables = lines.collect{|line| " drop_table #{$1}" if line =~ table_regex } - indexes = lines.collect{|line| " remove_index :#{$1}, :name => :#{$3}" if line =~ index_regex} - + # hack to correct spacing so it "looks pretty" create_part.gsub!("\n", "\n ") - + # reverse the order so the indexes get taken out in the opposite order # they were added. Also add two spaces to the start of each line drop_tables = tables.compact.reverse.join("\n ") - drop_indexes = indexes.compact.reverse.join("\n ") - + drop_indexes = DbMigrateMerge.generate_down_indexes lines + drop_indexes = drop_indexes.join("\n ") + new_migration = %Q{# Migration created #{Time.now.to_s} by lazy_developer class InitialMigration < ActiveRecord::Migration def self.up #{create_part} end - + def self.down - #{drop_indexes} - + #{drop_indexes} + #{drop_tables} end end } version = ActiveRecord::Migrator.current_version backups = RAILS_ROOT+"/db/migrate_#{version}" - + svn=File.exist?(RAILS_ROOT+"/db/migrate/.svn") if svn `svn mkdir #{backups}` @@ -55,7 +56,7 @@ end FileUtils.mv(RAILS_ROOT+"/db/migrate", backups) FileUtils.mkdir(RAILS_ROOT+"/db/migrate") end - + new_file = RAILS_ROOT+"/db/migrate/#{version}_initial_migration.rb" File.open(new_file, "w") do |f| @@ -63,11 +64,11 @@ end end `svn add #{new_file}` if svn - + puts "Created #{new_file}." puts "Previous migrations are in #{backups}" end - + end - + end diff --git a/spec/db_migrate_merge_spec.rb b/spec/db_migrate_merge_spec.rb index 4769dc4..e868a97 100644 --- a/spec/db_migrate_merge_spec.rb +++ b/spec/db_migrate_merge_spec.rb @@ -10,7 +10,7 @@ eof expected = <<-ex - remove_index :versions, :column => ["versioned_type"] +remove_index :versions, :column => ["versioned_type"] ex DbMigrateMerge.generate_down_indexes([line]).should == expected[0..-2] @@ -28,7 +28,7 @@ eof expected_line = <<-eof - remove_index :audited, :column => ["transaction"] +remove_index :audited, :column => ["transaction"] eof expected = [expected_line].join()[0..-2] @@ -44,7 +44,7 @@ eof expected = <<-ex - remove_index :versions, :column => ["versioned_type", "versioned_id"] +remove_index :versions, :column => ["versioned_type", "versioned_id"] ex DbMigrateMerge.generate_down_indexes([line]).should == expected[0..-2] end @@ -55,7 +55,7 @@ eof expected = <<-ex - remove_index :versions, :column => ["versioned_type", "versioned_id"] +remove_index :versions, :column => ["versioned_type", "versioned_id"] ex DbMigrateMerge.generate_down_indexes([line]).should == expected[0..-2] @@ -65,7 +65,7 @@ eof expected = <<-ex - remove_index :versions, :column => ["versioned_type"] +remove_index :versions, :column => ["versioned_type"] ex DbMigrateMerge.generate_down_indexes([line]).should == expected[0..-2] @@ -81,7 +81,7 @@ eof expected = <<-ex - remove_index :versions, :name => "index_versions_on_versioned_type_and_versioned_id" +remove_index :versions, :name => "index_versions_on_versioned_type_and_versioned_id" ex DbMigrateMerge.generate_down_indexes([line]).should == expected[0..-2]