eprothro/cassie

View on GitHub
lib/cassie/tasks/schema/init.rake

Summary

Maintainability
Test Coverage
namespace :cassie do
  namespace :schema do

    desc "Initialize versioning schema and the keyspace for this environment"
    task :init => :init_versioning do
      opts = {}
      OptionParser.new do |args|
        args.on("-v", "--version VERSION", "Set an initial schema version representing the currenet version of the schema.") do |v|
          opts[:version] = v
        end
      end.parse!(argv)

      def raise_not_found(version)
        str   =  "Version #{version} was not found locally, can't fast-forward there.\n"
        str   += "  Did you mean one of these local versions?\n" if Cassie::Schema.local_versions
        Cassie::Schema.local_versions.reverse.each do |v|
          str += "    - #{v.to_s.ljust(10)} # #{v.description}\n"
        end
        raise str
      end

      begin
        if opts[:version]
          version = Cassie::Schema::Version.new(opts[:version])
          version = Cassie::Schema.local_versions.find{|v| version == v} || raise_not_found(version)
          versions = Cassie::Schema.local_versions.select{|v| v <= version}.sort
          puts "-- Fast-forwarding '#{Cassie.env}' schema to version #{version}"
            t0 = Time.now
            versions.each.with_index do |v, i|
              # space IDs out by 10 seconds to ensure they get written in order
              # end on 10 seconds ago in case migrations are run immediately
              time = t0 - ((versions.count - i) * 10)
              v.id = ::Cassandra::TimeUuid::Generator.new.at(time)
              v.executor = "cassie"
              Cassie::Schema.record_version(v, false)
              puts "   > Recorded version #{v}"
            end
          puts "-- done"

        end
      rescue => e
        output_error(e)
        abort
      end
    end

    Rake::Task["cassie:schema:init"].enhance do
      Rake::Task["cassie:schema:init_keyspace"].invoke
    end
  end
end