Class: Convergence::Dumper

Inherits:
Object
  • Object
show all
Defined in:
lib/convergence/dumper.rb

Defined Under Namespace

Classes: MysqlSchemaDumper, PostgresSchemaDumper, SqliteSchemaDumper

Constant Summary collapse

RAILS_TYPE_MAPPING =

Convergence's DSL type names follow MySQL terminology; map them to the closest ActiveRecord migration column type.

{
  tinyint: :integer,
  smallint: :integer,
  mediumint: :integer,
  int: :integer,
  bigint: :bigint,
  float: :float,
  double: :float,
  decimal: :decimal,
  char: :string,
  varchar: :string,
  tinyblob: :binary,
  blob: :binary,
  mediumblob: :binary,
  longblob: :binary,
  tinytext: :text,
  text: :text,
  mediumtext: :text,
  longtext: :text,
  date: :date,
  time: :time,
  datetime: :datetime,
  timestamp: :datetime,
  year: :integer,
  json: :json,
  # ActiveRecord has no native enum/set column type; fall back to string.
  enum: :string,
  set: :string
}.freeze
RAILS_UNSUPPORTED_COLUMN_OPTIONS =

Options that only make sense for convergence's own SQL generators, with no equivalent in an ActiveRecord migration's create_table DSL.

%i[character_set collate extra after values].freeze

Instance Method Summary collapse

Instance Method Details

#dump_dsl(tables) ⇒ Object



37
38
39
40
41
# File 'lib/convergence/dumper.rb', line 37

def dump_dsl(tables)
  tables.map do |_, table|
    dump_table_dsl(table)
  end.join("\n\n")
end

#dump_rails_migration(tables, class_name, rails_version: '7.0') ⇒ Object



62
63
64
65
66
67
68
69
# File 'lib/convergence/dumper.rb', line 62

def dump_rails_migration(tables, class_name, rails_version: '7.0')
  dsl = "class #{class_name} < ActiveRecord::Migration[#{rails_version}]\n"
  dsl += "  def change\n"
  dsl += tables.map { |_, table| dump_table_rails_migration(table) }.join("\n\n")
  dsl += "\n  end\n"
  dsl += 'end'
  dsl
end

#dump_table_dsl(table) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/convergence/dumper.rb', line 43

def dump_table_dsl(table)
  table_argument = [table.table_name.to_sym.inspect]
  table_argument << table.table_options.map { |k, v| key_value_text(k, v) }
  dsl = "create_table #{table_argument.flatten.join(', ')} do |t|\n"
  dsl += "  #{table.columns.map { |_, column| dump_column(column) }.join("\n  ")}"
  dsl += "\n" if !table.indexes.empty? || !table.foreign_keys.empty?
  dsl += "\n"
  unless table.indexes.empty?
    dsl += "  #{table.indexes.map { |_, index| dump_index(index) }.join("\n  ")}"
    dsl += "\n"
  end
  unless table.foreign_keys.empty?
    dsl += "  #{table.foreign_keys.map { |_, key| dump_foreign_key(key) }.join("\n  ")}"
    dsl += "\n"
  end
  dsl += 'end'
  dsl
end

#dump_table_rails_migration(table) ⇒ Object



71
72
73
74
75
76
77
78
79
80
# File 'lib/convergence/dumper.rb', line 71

def dump_table_rails_migration(table)
  table_argument = [table.table_name.to_sym.inspect]
  dsl = "    create_table #{table_argument.join(', ')} do |t|\n"
  body_lines = rails_column_lines(table.columns)
  body_lines += table.indexes.map { |_, index| dump_rails_index(index) }
  body_lines += table.foreign_keys.map { |_, key| dump_rails_foreign_key(key) }
  dsl += body_lines.map { |line| "      #{line}" }.join("\n")
  dsl += "\n    end"
  dsl
end