Sha256: 1a8f98b71a2c6cbb2a31d256c366c54208da0804e06acb4abe3207c39e0c7d2c

Contents?: true

Size: 1.67 KB

Versions: 1

Compression:

Stored size: 1.67 KB

Contents

# frozen_string_literal: true

require 'rom/sql/migration/recorder'

module ROM
  module SQL
    module Migration
      # @api private
      class Writer
        MIGRATION_BEGIN = "ROM::SQL.migration do\n  change do"
        MIGRATION_END = "\n  end\nend\n"

        attr_reader :yield_migration

        def initialize(&block)
          @yield_migration = block
        end

        def migration
          recorder = Recorder.new
          yield(recorder)
          yield_migration.(create_migration(recorder.operations))
        end

        def create_migration(ops)
          out = MIGRATION_BEGIN.dup
          write(ops, out, "\n    ")
          out << MIGRATION_END

          [migration_name(ops[0]), out]
        end

        def write(operations, buffer, indent)
          operations.each do |operation|
            op, args, nested = operation
            buffer << indent << op.to_s << ' '
            write_arguments(buffer, args)

            next if nested.empty?

            buffer << ' do'
            write(nested, buffer, "#{indent}  ")
            buffer << indent << 'end'
          end
        end

        def write_arguments(buffer, args)
          if args.last.is_a?(::Hash)
            args, options = args[0...-1], args.last
          else
            options = EMPTY_HASH
          end

          buffer << args.map(&:inspect).join(', ')
          options.each do |key, value|
            buffer << ', ' << key.to_s << ': ' << value.inspect
          end
        end

        def migration_name(op)
          create_or_alter, args = op
          table_name = args[0]

          "#{create_or_alter.to_s.sub("_table", "")}_#{table_name}"
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rom-sql-3.7.0 lib/rom/sql/migration/writer.rb