Class: Sql::Migrations::Rails::Railtie

Inherits:
Rails::Railtie
  • Object
show all
Defined in:
lib/sql/migrations/rails/railtie.rb

Instance Method Summary collapse

Instance Method Details

#delete_extra_migrations!Object



43
44
45
# File 'lib/sql/migrations/rails/railtie.rb', line 43

def delete_extra_migrations!
  tmp_migrations_path.children.select { |x| sql_migrations.keys.exclude?(x.basename('.rb')) }.each(&:delete)
end

#generate_tmp_migrations!Object



47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/sql/migrations/rails/railtie.rb', line 47

def generate_tmp_migrations!
  template = File.read(File.join(File.dirname(__FILE__), 'templates/migration.rb.tt'))
  modified_sql_migrations.each do |name, paths|
    erb_hash = {
      migration_class_name: name.to_s.split('_', 2).second.camelize,
      up_migration: paths.find { |x| x.to_s.end_with?('.up.sql') },
      down_migration: paths.find { |x| x.to_s.end_with?('.down.sql') }
    }

    erb_result = ERB.new(template, nil, '-').result_with_hash(erb_hash)
    Pathname(tmp_migrations_path.join("#{name}.rb")).write(erb_result)
  end
end

#last_updateObject

Data about the previous files state This is needed for rebuild only modified temporary migrations



19
20
21
22
23
24
# File 'lib/sql/migrations/rails/railtie.rb', line 19

def last_update
  @last_update ||= begin
    file = ::Rails.root.join(Sql::Migrations::Rails::LAST_UPDATE_FILE).tap { |x| x.dirname.mkpath }
    file.file? ? JSON.parse(file.read).transform_keys(&:to_sym) : { timestamp: '0', files: {} }
  end
end

#modified_sql_migrationsObject



35
36
37
38
39
40
41
# File 'lib/sql/migrations/rails/railtie.rb', line 35

def modified_sql_migrations
  @modified_sql_migrations ||= sql_migrations.select do |name, paths|
    last_update[:files][name.to_s] != paths.map { |x| x.to_s.split('.')[-2] } ||
      paths.map { |x| [x.mtime, x.ctime] }.flatten.map(&:utc)
           .max.strftime('%Y%m%d%H%M%S') > last_update[:timestamp]
  end
end

#sql_migrationsObject



30
31
32
33
# File 'lib/sql/migrations/rails/railtie.rb', line 30

def sql_migrations
  @sql_migrations ||= ::Rails.root.join('db/migrate').glob('*.{up,down}.sql')
                             .group_by { |x| x.basename('.up.sql').basename('.down.sql') }
end

#tmp_migrations_pathObject



26
27
28
# File 'lib/sql/migrations/rails/railtie.rb', line 26

def tmp_migrations_path
  @tmp_migrations_path ||= ::Rails.root.join(Sql::Migrations::Rails::TMP_MIGRATIONS_FOLDER).tap(&:mkpath)
end

#update_data_file!Object



61
62
63
64
65
66
67
68
# File 'lib/sql/migrations/rails/railtie.rb', line 61

def update_data_file!
  data = {
    timestamp: Time.now.utc.strftime('%Y%m%d%H%M%S'),
    files: sql_migrations.transform_values { |x1| x1.map { |x2| x2.to_s.split('.')[-2] } }
  }.to_json

  ::Rails.root.join(Sql::Migrations::Rails::LAST_UPDATE_FILE).write(data)
end

#update_rails_migration_paths!Object



70
71
72
# File 'lib/sql/migrations/rails/railtie.rb', line 70

def update_rails_migration_paths!
  ::Rails.application.config.paths['db/migrate'] << Sql::Migrations::Rails::TMP_MIGRATIONS_FOLDER
end