kreynolds/cassandra-cql

View on GitHub
Rakefile

Summary

Maintainability
Test Coverage
require 'bundler'
Bundler::GemHelper.install_tasks

require 'rake'
require 'rspec/core'
require 'rspec/core/rake_task'

CassandraBinaries = {
  '0.8' => 'http://archive.apache.org/dist/cassandra/0.8.9/apache-cassandra-0.8.9-bin.tar.gz',
  '1.0' => 'http://archive.apache.org/dist/cassandra/1.0.9/apache-cassandra-1.0.9-bin.tar.gz',
  '1.1' => 'http://archive.apache.org/dist/cassandra/1.1.9/apache-cassandra-1.1.9-bin.tar.gz',
  '1.2' => 'http://archive.apache.org/dist/cassandra/1.2.5/apache-cassandra-1.2.5-bin.tar.gz'
}

CASSANDRA_VERSION = ENV['CASSANDRA_VERSION'] || '1.0'
CASSANDRA_HOME = ENV['CASSANDRA_HOME'] || File.dirname(__FILE__) + '/tmp'
CASSANDRA_PIDFILE = ENV['CASSANDRA_PIDFILE'] || "#{CASSANDRA_HOME}/cassandra.pid"

RSpec::Core::RakeTask.new(:spec) do |spec|
  spec.pattern = FileList['spec/**/*_spec.rb']
end

RSpec::Core::RakeTask.new(:rcov) do |spec|
  spec.pattern = FileList['spec/**/*_spec.rb']
  spec.rcov = true
  spec.rcov_opts = "--exclude 'spec/*'"
end

desc "Download Cassandra and run specs against it"
task :spec_with_server do
  Rake::Task["cassandra:clean"].invoke
  Rake::Task["cassandra:start"].invoke
  error = nil
  begin
    Rake::Task["spec"].invoke
  rescue
    error = $!
  end
  Rake::Task["cassandra:stop"].invoke
  raise $! if $!
end

task :default => :spec

def setup_cassandra_version(version = CASSANDRA_VERSION)
  FileUtils.mkdir_p CASSANDRA_HOME

  destination_directory = File.join(CASSANDRA_HOME, 'cassandra-' + CASSANDRA_VERSION)

  unless File.exists?(File.join(destination_directory, 'bin','cassandra'))
    download_source       = CassandraBinaries[CASSANDRA_VERSION]
    download_destination  = File.join(CASSANDRA_HOME, File.basename(download_source))
    untar_directory       = File.join(CASSANDRA_HOME,  File.basename(download_source,'-bin.tar.gz'))

    puts "downloading cassandra"
    sh "curl -L -o #{download_destination} #{download_source}"

    sh "tar xzf #{download_destination} -C #{CASSANDRA_HOME}"
    sh "mv #{untar_directory} #{destination_directory}"
  end
end

def setup_environment
  env = ""
  if !ENV["CASSANDRA_INCLUDE"]
    env << "CASSANDRA_INCLUDE=#{File.expand_path(Dir.pwd)}/spec/conf/#{CASSANDRA_VERSION}/cassandra.in.sh "
    env << "CASSANDRA_HOME=#{CASSANDRA_HOME}/cassandra-#{CASSANDRA_VERSION} "
    env << "CASSANDRA_CONF=#{File.expand_path(Dir.pwd)}/spec/conf/#{CASSANDRA_VERSION}"
  else
    env << "CASSANDRA_INCLUDE=#{ENV['CASSANDRA_INCLUDE']} "
    env << "CASSANDRA_HOME=#{ENV['CASSANDRA_HOME']} "
    env << "CASSANDRA_CONF=#{ENV['CASSANDRA_CONF']}"
  end

  env
end

def running?(pid_file = nil)
  pid_file ||= CASSANDRA_PIDFILE

  if File.exists?(pid_file)
    pid = File.new(pid_file).read.to_i
    begin
      Process.kill(0, pid)
      return true
    rescue
      File.delete(pid_file)
    end
  end

  false
end

def listening?(host, port)
  TCPSocket.new(host, port).close
  true
rescue Errno::ECONNREFUSED => e
  false
end

namespace :cassandra do
  desc "Start Cassandra"
  task :start, [:daemonize] => :java do |t, args|
    args.with_defaults(:daemonize => true)

    setup_cassandra_version
    env = setup_environment

    Dir.chdir(File.join(CASSANDRA_HOME, "cassandra-#{CASSANDRA_VERSION}")) do
      sh("env #{env} bin/cassandra #{'-f' unless args.daemonize} -p #{CASSANDRA_PIDFILE}")
    end

    if args.daemonize
      end_time = Time.now + 30
      host = '127.0.0.1'
      port = 9160

      until Time.now >= end_time || listening?(host, port)
        puts "waiting for 127.0.0.1:9160"
        sleep 0.1
      end

      unless listening?(host, port)
        raise "timed out waiting for cassandra to start"
      end
    end
  end

  desc "Stop Cassandra"
  task :stop => :java do
    setup_cassandra_version
    env = setup_environment
    sh("kill $(cat #{CASSANDRA_PIDFILE})")
  end

  desc "Delete all data files in #{CASSANDRA_HOME}"
  task :clean do
    sh("rm -rf #{File.join(CASSANDRA_HOME, "cassandra-#{CASSANDRA_VERSION}", 'data')}")
  end

end

desc "Start Cassandra"
task :cassandra => :java do
  begin
    Rake::Task["cassandra:start"].invoke(false)
  rescue RuntimeError => e
    raise e unless e.message =~ /Command failed with status \(130\)/ # handle keyboard interupt errors
  end
end

desc "Run the Cassandra CLI"
task :cli do
  Dir.chdir(File.join(CASSANDRA_HOME, "cassandra-#{CASSANDRA_VERSION}")) do
    sh("bin/cassandra-cli -host localhost -port 9160")
  end
end

desc "Check Java version"
task :java do
  is_java16 = `java -version 2>&1`.split("\n").first =~ /java version "1.6/

  if ['0.6', '0.7'].include?(CASSANDRA_VERSION) && !java16
    puts "You need to configure your environment for Java 1.6."
    puts "If you're on OS X, just export the following environment variables:"
    puts '  JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home"'
    puts '  PATH="/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/bin:$PATH"'
    exit(1)
  end
end

require 'yard'
YARD::Rake::YardocTask.new