module ArchiveMigration
Constants
- COLORS
- VERSION
Public Instance Methods
archive()
click to toggle source
# File lib/archive_migration.rb, line 24 def archive tell(:creating_archive_folder) FileUtils::mkdir_p './db/archive' tell(:moving_files) version_list = archive_by_year tell(:generating_migration) data = IO.read('./db/schema.rb') File.write("./db/migrate/#{version_list.max}_from_previous_version.rb", "class FromPreviousVersion < ActiveRecord::Migration\n\tdef change\n" + data[data.index('do')+3..data.rindex('end')-1] + "\tend\nend\n") delete_by_version_list(version_list) if ask(:delete_from_schema_table) create_version_list(version_list) end
archive_by_year()
click to toggle source
# File lib/archive_migration.rb, line 64 def archive_by_year dir = './db/migrate' files = Dir.foreach(dir).select { |x| File.file?("#{dir}/#{x}") && !x.include?("from_previous_version") } version_list = [] files.each do |file| version_list << file.split('_').first end years = get_years(version_list) years.each do |year| FileUtils::mkdir_p "./db/archive/#{year}" end Dir.glob('./db/migrate/*.rb').each do |file| file_version = file.split('/').last.split('_').first if file.split('/').last.include?("from_previous_version") FileUtils.rm file else FileUtils.mv file, "./db/archive/#{file_version[0..3]}" end end return version_list end
create_version_list(version_list)
click to toggle source
# File lib/archive_migration.rb, line 39 def create_version_list(version_list) version_list_file = File.open("./db/archive/version_list.txt", "a") version_list.sort.each do |version| line = version + ',' version_list_file.write(line) end end
delete_by_version_list(version_list)
click to toggle source
# File lib/archive_migration.rb, line 47 def delete_by_version_list(version_list) dir = './db/archive/version_list.txt' if version_list.any? deleting_list = version_list.clone if File.exist?(dir) list = IO.read(dir) deleting_list << list.split(/[\s,']/).max end delete_from_schema_table(deleting_list) else if File.exist?(dir) list = IO.read(dir) delete_from_schema_table(list.split(/[\s,']/)) end end end
recover()
click to toggle source
# File lib/archive_migration.rb, line 89 def recover dir = './db/archive/version_list.txt' if File.exist?(dir) list = IO.read(dir) insert_into_schema_table(list.split(/[\s,']/)) end end
run_all_migrations()
click to toggle source
# File lib/archive_migration.rb, line 103 def run_all_migrations tell(:running_migrations) system('bundle exec rake db:migrate') end
start()
click to toggle source
# File lib/archive_migration.rb, line 13 def start if ask(:have_run_all_migrations) archive else if ask(:run_all_migrations) run_all_migrations archive end end end
tell(key, options = {})
click to toggle source
# File lib/archive_migration.rb, line 97 def tell(key, options = {}) message = messages.fetch(key.to_s) message = colorize(message) print(message, options) end
Private Instance Methods
ask(*args)
click to toggle source
# File lib/archive_migration.rb, line 218 def ask(*args) tell(*args) $stdin.gets[0].downcase == 'y' end
ask_selection(*args, databases)
click to toggle source
# File lib/archive_migration.rb, line 223 def ask_selection(*args, databases) tell(*args, databases) selection = $stdin.gets while !databases.include?(selection.strip) tell(:wrong_inputs) tell(*args, databases) selection = $stdin.gets end return selection.strip end
colorize(message)
click to toggle source
# File lib/archive_migration.rb, line 241 def colorize(message) message.gsub(/\:(\w+)\<([^>]+)\>/) { |_| "\033[#{ COLORS[$1] }m#{ $2 }\033[039m" } end
delete_from_schema_table(deleting_list)
click to toggle source
# File lib/archive_migration.rb, line 155 def delete_from_schema_table(deleting_list) begin tell(:connecting_mysql) client = Mysql2::Client.new(:host => "127.0.0.1", :username => "root") databases = get_databases(client) default_database = get_default_database if default_database.any? && databases.include?(default_database["database"]) print("Default Database: " + default_database["database"]) if ask(:connecting_database) client.select_db(default_database["database"]) else selection = ask_selection(:selection, databases).strip client.select_db(selection) end else selection = ask_selection(:selection, databases).strip client.select_db(selection) end tell(:cleaning) rs = client.query("SELECT version FROM schema_migrations") exist_versions = rs.map { |v| v['version'] } deleting_list.each do |version| if exist_versions.include?(version) && !version.nil? && version != deleting_list.max client.query("DELETE FROM schema_migrations where version = #{version}") end end rescue Mysql2::Error => e puts e.errno puts e.error ensure client.close if client end end
get_databases(conn)
click to toggle source
# File lib/archive_migration.rb, line 198 def get_databases(conn) rows = [] rs = conn.query("show databases") rs.each do |x| rows<<x["Database"] if !x.nil? end return rows end
get_default_database()
click to toggle source
# File lib/archive_migration.rb, line 112 def get_default_database dir = './config/sample_database.yml' dir2 = './config/database.yml' if File.exist?(dir) database_hash = YAML.load_file(dir) elsif File.exist?(dir2) database_hash = YAML.load_file(dir2) end return database_hash ? database_hash["development"] : nil end
get_years(version_list)
click to toggle source
# File lib/archive_migration.rb, line 190 def get_years(version_list) years = Set.new version_list.each do |version| years << version[0..3] end return years end
insert_into_schema_table(inserting_list)
click to toggle source
# File lib/archive_migration.rb, line 123 def insert_into_schema_table(inserting_list) begin tell(:connecting_mysql) client = Mysql2::Client.new(:host => "127.0.0.1", :username => "root") databases = get_databases(client) default_database = get_default_database if default_database.any? && databases.include?(default_database["database"]) print("Default Database: " + default_database["database"]) if ask(:connecting_database) client.select_db(default_database["database"]) else selection = ask_selection(:selection, databases).strip client.select_db(selection) end else selection = ask_selection(:selection, databases).strip client.select_db(selection) end inserting_list.each do |version| if !version.nil? && version != inserting_list.max client.query("INSERT INTO schema_migrations(version) VALUES (#{version})") end end rescue Mysql2::Error => e puts e.errno puts e.error ensure client.close if client end end
messages()
click to toggle source
# File lib/archive_migration.rb, line 235 def messages require 'yaml' path = File.join(File.dirname(__FILE__), 'archive_migration/messages.yml') @messages = YAML.load(File.open(path)) end
print(message, options = {})
click to toggle source
# File lib/archive_migration.rb, line 208 def print(message, options = {}) if options.empty? puts message % options else puts message puts options end puts '' end