Sha256: a021458cf6dd89f6f2da497f23c513356a76b385316138d59fd76c4ea0eae4f2

Contents?: true

Size: 1.44 KB

Versions: 8

Compression:

Stored size: 1.44 KB

Contents

# frozen_string_literal: true

module CycloneLariat
  module Services
    class Rollback
      attr_reader :repo, :dir

      def initialize(repo:, dir:)
        @repo = repo
        @dir = dir
      end

      def call(version = nil)
        version ||= existed_migrations[-1]
        output = []

        paths_of_downgrades(version).each do |path|
          filename       = File.basename(path, '.rb')
          version, title = filename.split('_', 2)
          class_name     = title.split('_').collect(&:capitalize).join
          output << "Down - #{version} #{class_name} #{path}"
          require_relative Pathname.new(Dir.pwd) + Pathname.new(path)
          Object.const_get(class_name).new.down
          repo.remove(version)
        end

        output
      end

      def existed_migrations
        @existed_migrations ||= repo.all.map { |row| row[:version] }.sort
      end

      def paths_of_downgrades(version)
        migrations_to_downgrade = existed_migrations.select { |migration| migration >= version }

        paths = []
        migrations_to_downgrade.each do |migration|
          path = Pathname.new(Dir.pwd) + Pathname.new(dir)
          founded = Dir.glob("#{path}/#{migration}_*.rb")
          raise "Could not found migration: `#{migration}` in #{path}" if founded.empty?
          raise "Found lot of migration: `#{migration}` in #{path}"    if founded.size > 1

          paths += founded
        end

        paths
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
cyclone_lariat-1.0.0.rc8 lib/cyclone_lariat/services/rollback.rb
cyclone_lariat-1.0.0.rc7 lib/cyclone_lariat/services/rollback.rb
cyclone_lariat-1.0.0.rc6 lib/cyclone_lariat/services/rollback.rb
cyclone_lariat-1.0.0.rc5 lib/cyclone_lariat/services/rollback.rb
cyclone_lariat-1.0.0.rc4 lib/cyclone_lariat/services/rollback.rb
cyclone_lariat-1.0.0.rc3 lib/cyclone_lariat/services/rollback.rb
cyclone_lariat-1.0.0.rc2 lib/cyclone_lariat/services/rollback.rb
cyclone_lariat-1.0.0.rc1 lib/cyclone_lariat/services/rollback.rb