rename_refactor.rb revision 16a4eb93976aff20c5748661e46e75dbe9bc9c27
817N/Arequire 'active_support' "gsub(/\\<#{old_word}\\>/,\"#{new_word}\")", "gsub(/\\<#{pluralize(old_word)}\\>/,\"#{pluralize(new_word)}\")", "gsub(/\\<#{camelize(old_word)}\\>/,\"#{camelize(new_word)}\")", "gsub(/\\<#{camelize(pluralize(old_word))}\\>/,"\ "\"#{camelize(pluralize(new_word))}\")", command = "#{awk} '{#{commands.join(';')};print}' #{file} #{tmp_file}" /(?<=_|\b)(#{old_word}|#{pluralize(old_word)})/) do |match| out = `find #{loc} -iname "*.#{filetype}" #{other_filetype_options}` options << "-o -iname \"*.#{filetype}\" " system('bundle exec rake db:migrate:clean') DROP FUNCTION #{m[:signature]}; drop_new_function = <<-DROP_FUNCTION DROP FUNCTION #{new_signature}; create_old_function = <<-CREATE_FUNCTION CREATE OR REPLACE FUNCTION #{m[:signature]} #{m[:header]} AS #{m[:name]} #{m[:name]} language #{m[:language]}; create_new_function = <<-CREATE_FUNCTION CREATE OR REPLACE FUNCTION #{new_signature} #{new_header} AS #{m[:name]} #{new_name} language #{m[:language]}; push(:up, "execute <<-SQL\n#{drop_old_function} SQL\n") push(:up, "execute <<-SQL\n#{create_new_function} SQL\n") push(:down, "execute <<-SQL\n#{drop_new_function} SQL\n") push(:down, "execute <<-SQL\n#{create_old_function} SQL\n") def rename_table(sql_statement) if sql_statement =~ /^\s*CREATE TABLE (\S+)/ if new_name = translate(old_name) push(:up, "rename_table '#{old_name}', '#{new_name}'") push(:down, "rename_table '#{new_name}', '#{old_name}'") def rename_columns(sql_statement) if sql_statement =~ /^\s*CREATE TABLE (\S+)/ sql_statement.lines[1..-2].each do |column_line| if column_line =~ /^\s+(\S+)\s+/ if new_column_name = translate(column_name) push(:up, "rename_column '#{table_name}', "\ "'#{column_name}', '#{new_column_name}'") push(:down, "rename_column '#{table_name}', "\ "'#{new_column_name}', '#{column_name}'") def rebuild_index(sql_statement) if m = sql_statement.match(/^\s*CREATE\ (?<unique>UNIQUE\ )?INDEX \ (?<index_name>\S+)\ ON\ (?<table_name>\S+) \ \((?<columns_list>([^,\s]+,\ )*(\S+))\)/x) old_index_name = m['index_name'] new_index_name = translate(old_index_name) index_name = new_index_name || old_index_name old_table_name = m['table_name'] new_table_name = translate(old_table_name) table_name = new_table_name || old_table_name old_columns = m['columns_list'].split(', ') new_columns = old_columns.map { |c| translate(c) } old_column_names = old_columns.map { |c| "'#{c}'" }.join(', ') column_names = old_columns.map { |c| "'#{translate(c) || c}'" }. if [new_index_name, new_table_name, *new_columns].any? # At this point, the index is already on the new table, push(:up, "remove_index '#{table_name}', name: '#{old_index_name}'") push(:down, "add_index '#{old_table_name}', [#{old_column_names}], "\ "unique: #{unique}, name: '#{old_index_name}'") push(:up, "add_index '#{table_name}', [#{column_names}], "\ "unique: #{unique}, name: '#{index_name}'") push(:down, "remove_index '#{old_table_name}', name: '#{index_name}'") def rename_primary_keys(sql_statement) if m = sql_statement.match(/ALTER\ TABLE\ ONLY\ (?<table>\S+)\s* ADD\ CONSTRAINT\ (?<name>\S+)\s+PRIMARY\ KEY/x) table = translate(m[:table]) || m[:table] new_name = translate(m[:name]) push(:up, "execute \"ALTER TABLE ONLY #{table} "\ "RENAME CONSTRAINT #{m[:name]} TO #{new_name};\"") push(:down, "execute \"ALTER TABLE ONLY #{table} "\ "RENAME CONSTRAINT #{new_name} TO #{m[:name]};\"") def rebuild_foreign_keys(sql_statement) if m = sql_statement.match(/ALTER\ TABLE\ ONLY\ (?<table>\S+)\s* ADD\ CONSTRAINT\ (?<name>\S+)\s+ FOREIGN\ KEY\ \((?<key>\S+)\)\s+ REFERENCES\ (?<ref>\S+\(\S+\))(?<ondelete>[^\n]*)/x) table = translate(m[:table]) || m[:table] new_name = translate(m[:name]) || m[:name] new_key = translate(m[:key]) || m[:key] new_ref = translate(m[:ref]) || m[:ref] translated = [m[:name], m[:key], m[:ref]].map { |t| translate(t) } push(:up, "execute \"ALTER TABLE ONLY #{table} "\ "DROP CONSTRAINT #{m[:name]};\"") push(:up, "execute \"ALTER TABLE ONLY #{table} "\ "ADD CONSTRAINT #{new_name} FOREIGN KEY (#{new_key}) "\ "REFERENCES #{new_ref}#{m[:ondelete]}\"") push(:down, "execute \"ALTER TABLE ONLY #{table} "\ "DROP CONSTRAINT #{new_name};\"") push(:down, "execute \"ALTER TABLE ONLY #{table} "\ "ADD CONSTRAINT #{m[:name]} FOREIGN KEY (#{m[:key]}) "\ "REFERENCES #{m[:ref]}#{m[:ondelete]}\"") migration_filepath.open('w') do |f| f << "class RenameViaScript < ActiveRecord::Migration\n" migration_commands.group_by { |c| c.first }.each do |method, commands| commands.each do |(_, command)| REPLACE_WORDS.each do |old_name, new_name| if result.match /#{old_name}/ result.gsub!($&, new_name) if result.match /#{pluralize(old_name)}/ result.gsub!($&, pluralize(new_name)) if result.match /#{camelize(old_name)}/ result.gsub!($&, camelize(new_name)) if result.match /#{camelize(pluralize(old_name))}/ result.gsub!($&, camelize(pluralize(new_name))) return result if result != name migration_commands << args "#{Time.now.utc.strftime("%Y%m%d%H%M%S")}_rename_via_script.rb") class FactoryFilesRenameProvider attr_accessor :verbose, :dry_run DIR = Pathname.new(File.join('test', 'factories')) def initialize(verbose: false, dry_run: true) files_list.each do |filename| Dir.entries(DIR).select { |e| !%w(. ..).include?(e) } def rename_file(filename) puts "#{DIR.join(filename)} --> #{DIR.join(new_name(filename))}" FileUtils.mv(DIR.join(filename), DIR.join(new_name(filename))) parts = filename.split('.') basename = "#{parts.first}_factory" [basename, *parts[1..-1]].join('.') # Run the script from Rails.root (assuming this file is in script/) Dir.chdir(File.join(File.dirname(__FILE__), '..')) do RenameRefactor::MigrationProvider.new(verbose: false, dry_run: false).run RenameRefactor::RenameRefactorProvider.new(verbose: true, dry_run: false).run RenameRefactor::FactoryFilesRenameProvider.new(verbose: false, dry_run: false).run