module PiiSafeSchema::MigrationGenerator

Public Class Methods

generate_migrations(pii_columns) click to toggle source
# File lib/pii_safe_schema/migration_generator.rb, line 4
def generate_migrations(pii_columns)
  pii_columns.group_by(&:table).map do |table, columns|
    generate_migration_for(table, columns)
  end
end

Private Class Methods

generate_migration_for(table, columns) click to toggle source

rubocop:disable Metrics/AbcSize

# File lib/pii_safe_schema/migration_generator.rb, line 13
def generate_migration_for(table, columns)
  generator = ActiveRecord::Generators::MigrationGenerator.new(
    ["change_comments_in_#{table}"],
  )
  generated_lines = generate_migration_lines(table, columns)
  migration_file = generator.create_migration_file
  file_lines = File.open(migration_file, 'r').read.split("\n")
  change_line = file_lines.find_index { |i| /def change/.match(i) }
  new_contents = file_lines[0..change_line] + generated_lines + file_lines[change_line + 1..]

  File.open(migration_file, 'w') do |f|
    f.write(new_contents.join("\n"))
    f.write("\n")
  end
  migration_file
end
generate_migration_lines(table, columns) click to toggle source

rubocop:enable Metrics/AbcSize

# File lib/pii_safe_schema/migration_generator.rb, line 31
def generate_migration_lines(table, columns)
  migration_lines = columns.map do |c|
    "#{' ' * (safety_assured? ? 6 : 4)}"\
    "change_column :#{table}, :#{c.column.name}, :#{c.column.type}, "\
    "comment: \'#{c.suggestion.to_json}\'"\
  end
  wrap_in_safety_assured(migration_lines)
end
safety_assured?() click to toggle source
# File lib/pii_safe_schema/migration_generator.rb, line 46
def safety_assured?
  defined?(StrongMigrations)
end
wrap_in_safety_assured(migration_lines) click to toggle source
# File lib/pii_safe_schema/migration_generator.rb, line 40
def wrap_in_safety_assured(migration_lines)
  return migration_lines unless safety_assured?

  ["#{' ' * 4}safety_assured do", *migration_lines, "#{' ' * 4}end"]
end